THE RETURN OF ITEM STATUS (#22986)
* THE RETURN OF ITEM STATUS Item status is now inline with the hands again. You can now see item status for both hands at once. If you have more than 2 hands, the last active hand of that side is displayed in the respective item status. The item status for the active hand is also highlighted. Item status has been given a new look so it looks unique and matches every UI theme. * Shrink item status to 125px This is going to require fixing the existing controls. Do that later. * New bullet item status rendering sex * Make gun item status look just a little bit nicer. Avoid only one or two bullets ending up on a single row of an item status. * Delete Eris theme files * More improvements Fixed the fact that left/right were flipped around when assigning status panel locations. Involved renaming all the UI textures. Redid how content margins are set from the theme. Less complex and cleaner now. Made the item name always left-aligned, just looks better since other UI elements don't adapt anyways. * Compact down item status text Now it fits 3 lines of text on one line. Yay. This is achieved by compacting RichTextLabels by reducing their line height and giving them a negative bottom margin. * Add item status sprites for Ashen theme. * Add status control to show beaker/bucket/jug solution/transfer volumes Also PollingItemStatusControl I'll be using that more. * Fix welder item status, clean up welder code The item status control implementation was ancient and bad. That's why it was buggy. Removed all the complex dated networking stuff for welders, we just sync the solution contents now anyways so none of that is needed anymore. This moves a buncha stuff to shared and just removes code. Cleanup. The code was doing some really dumb stuff. * Spray bottles show contents in item status. * cowtools * Fix plasmafire and clockwork themes. Actual git gaslighting wtf. --------- Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
@@ -0,0 +1,22 @@
|
|||||||
|
using Content.Client.Chemistry.EntitySystems;
|
||||||
|
using Content.Client.Chemistry.UI;
|
||||||
|
|
||||||
|
namespace Content.Client.Chemistry.Components;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Exposes a solution container's contents via a basic item status control.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Shows the solution volume, max volume, and transfer amount.
|
||||||
|
/// </remarks>
|
||||||
|
/// <seealso cref="SolutionItemStatusSystem"/>
|
||||||
|
/// <seealso cref="SolutionStatusControl"/>
|
||||||
|
[RegisterComponent]
|
||||||
|
public sealed partial class SolutionItemStatusComponent : Component
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The ID of the solution that will be shown on the item status control.
|
||||||
|
/// </summary>
|
||||||
|
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
public string Solution = "default";
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
using Content.Client.Chemistry.Components;
|
||||||
|
using Content.Client.Chemistry.UI;
|
||||||
|
using Content.Client.Items;
|
||||||
|
using Content.Shared.Chemistry.EntitySystems;
|
||||||
|
|
||||||
|
namespace Content.Client.Chemistry.EntitySystems;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Wires up item status logic for <see cref="SolutionItemStatusComponent"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <seealso cref="SolutionStatusControl"/>
|
||||||
|
public sealed class SolutionItemStatusSystem : EntitySystem
|
||||||
|
{
|
||||||
|
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!;
|
||||||
|
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
base.Initialize();
|
||||||
|
Subs.ItemStatus<SolutionItemStatusComponent>(
|
||||||
|
entity => new SolutionStatusControl(entity, EntityManager, _solutionContainerSystem));
|
||||||
|
}
|
||||||
|
}
|
||||||
59
Content.Client/Chemistry/UI/SolutionStatusControl.cs
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
using Content.Client.Chemistry.Components;
|
||||||
|
using Content.Client.Chemistry.EntitySystems;
|
||||||
|
using Content.Client.Items.UI;
|
||||||
|
using Content.Client.Message;
|
||||||
|
using Content.Client.Stylesheets;
|
||||||
|
using Content.Shared.Chemistry.Components;
|
||||||
|
using Content.Shared.Chemistry.EntitySystems;
|
||||||
|
using Content.Shared.FixedPoint;
|
||||||
|
using Robust.Client.UserInterface.Controls;
|
||||||
|
|
||||||
|
namespace Content.Client.Chemistry.UI;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Displays basic solution information for <see cref="SolutionItemStatusComponent"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <seealso cref="SolutionItemStatusSystem"/>
|
||||||
|
public sealed class SolutionStatusControl : PollingItemStatusControl<SolutionStatusControl.Data>
|
||||||
|
{
|
||||||
|
private readonly Entity<SolutionItemStatusComponent> _parent;
|
||||||
|
private readonly IEntityManager _entityManager;
|
||||||
|
private readonly SharedSolutionContainerSystem _solutionContainers;
|
||||||
|
private readonly RichTextLabel _label;
|
||||||
|
|
||||||
|
public SolutionStatusControl(
|
||||||
|
Entity<SolutionItemStatusComponent> parent,
|
||||||
|
IEntityManager entityManager,
|
||||||
|
SharedSolutionContainerSystem solutionContainers)
|
||||||
|
{
|
||||||
|
_parent = parent;
|
||||||
|
_entityManager = entityManager;
|
||||||
|
_solutionContainers = solutionContainers;
|
||||||
|
_label = new RichTextLabel { StyleClasses = { StyleNano.StyleClassItemStatus } };
|
||||||
|
AddChild(_label);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override Data PollData()
|
||||||
|
{
|
||||||
|
if (!_solutionContainers.TryGetSolution(_parent.Owner, _parent.Comp.Solution, out _, out var solution))
|
||||||
|
return default;
|
||||||
|
|
||||||
|
FixedPoint2? transferAmount = null;
|
||||||
|
if (_entityManager.TryGetComponent(_parent.Owner, out SolutionTransferComponent? transfer))
|
||||||
|
transferAmount = transfer.TransferAmount;
|
||||||
|
|
||||||
|
return new Data(solution.Volume, solution.MaxVolume, transferAmount);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Update(in Data data)
|
||||||
|
{
|
||||||
|
var markup = Loc.GetString("solution-status-volume",
|
||||||
|
("currentVolume", data.Volume),
|
||||||
|
("maxVolume", data.MaxVolume));
|
||||||
|
if (data.TransferVolume is { } transferVolume)
|
||||||
|
markup += "\n" + Loc.GetString("solution-status-transfer", ("volume", transferVolume));
|
||||||
|
_label.SetMarkup(markup);
|
||||||
|
}
|
||||||
|
|
||||||
|
public readonly record struct Data(FixedPoint2 Volume, FixedPoint2 MaxVolume, FixedPoint2? TransferVolume);
|
||||||
|
}
|
||||||
28
Content.Client/Items/UI/PollingItemStatusControl.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
using Robust.Client.UserInterface;
|
||||||
|
using Robust.Shared.Timing;
|
||||||
|
|
||||||
|
namespace Content.Client.Items.UI;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A base for item status controls that poll data every frame. Avoids UI updates if data didn't change.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TData">The full status control data that is polled every frame.</typeparam>
|
||||||
|
public abstract class PollingItemStatusControl<TData> : Control where TData : struct, IEquatable<TData>
|
||||||
|
{
|
||||||
|
private TData _lastData;
|
||||||
|
|
||||||
|
protected override void FrameUpdate(FrameEventArgs args)
|
||||||
|
{
|
||||||
|
base.FrameUpdate(args);
|
||||||
|
|
||||||
|
var newData = PollData();
|
||||||
|
if (newData.Equals(_lastData))
|
||||||
|
return;
|
||||||
|
|
||||||
|
_lastData = newData;
|
||||||
|
Update(newData);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract TData PollData();
|
||||||
|
protected abstract void Update(in TData data);
|
||||||
|
}
|
||||||
@@ -1234,6 +1234,11 @@ namespace Content.Client.Stylesheets
|
|||||||
new StyleProperty("font", notoSans10),
|
new StyleProperty("font", notoSans10),
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
Element<RichTextLabel>()
|
||||||
|
.Class(StyleClassItemStatus)
|
||||||
|
.Prop(nameof(RichTextLabel.LineHeightScale), 0.7f)
|
||||||
|
.Prop(nameof(Control.Margin), new Thickness(0, 0, 0, -6)),
|
||||||
|
|
||||||
// Slider
|
// Slider
|
||||||
new StyleRule(SelectorElement.Type(typeof(Slider)), new []
|
new StyleRule(SelectorElement.Type(typeof(Slider)), new []
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ namespace Content.Client.Tools
|
|||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
|
|
||||||
Subs.ItemStatus<WelderComponent>(ent => new WelderStatusControl(ent));
|
Subs.ItemStatus<WelderComponent>(ent => new WelderStatusControl(ent, EntityManager, this));
|
||||||
Subs.ItemStatus<MultipleToolComponent>(ent => new MultipleToolStatusControl(ent));
|
Subs.ItemStatus<MultipleToolComponent>(ent => new MultipleToolStatusControl(ent));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,55 +1,45 @@
|
|||||||
|
using Content.Client.Items.UI;
|
||||||
using Content.Client.Message;
|
using Content.Client.Message;
|
||||||
using Content.Client.Stylesheets;
|
using Content.Client.Stylesheets;
|
||||||
|
using Content.Shared.FixedPoint;
|
||||||
using Content.Shared.Tools.Components;
|
using Content.Shared.Tools.Components;
|
||||||
using Robust.Client.UserInterface;
|
using Content.Shared.Tools.Systems;
|
||||||
using Robust.Client.UserInterface.Controls;
|
using Robust.Client.UserInterface.Controls;
|
||||||
using Robust.Shared.Timing;
|
|
||||||
|
|
||||||
namespace Content.Client.Tools.UI;
|
namespace Content.Client.Tools.UI;
|
||||||
|
|
||||||
public sealed class WelderStatusControl : Control
|
public sealed class WelderStatusControl : PollingItemStatusControl<WelderStatusControl.Data>
|
||||||
{
|
{
|
||||||
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
|
||||||
|
|
||||||
private readonly ToolSystem _tool;
|
|
||||||
|
|
||||||
private readonly Entity<WelderComponent> _parent;
|
private readonly Entity<WelderComponent> _parent;
|
||||||
|
private readonly IEntityManager _entityManager;
|
||||||
|
private readonly SharedToolSystem _toolSystem;
|
||||||
private readonly RichTextLabel _label;
|
private readonly RichTextLabel _label;
|
||||||
|
|
||||||
public WelderStatusControl(Entity<WelderComponent> parent)
|
public WelderStatusControl(Entity<WelderComponent> parent, IEntityManager entityManager, SharedToolSystem toolSystem)
|
||||||
{
|
{
|
||||||
IoCManager.InjectDependencies(this);
|
|
||||||
|
|
||||||
_parent = parent;
|
_parent = parent;
|
||||||
var entMan = IoCManager.Resolve<IEntityManager>();
|
_entityManager = entityManager;
|
||||||
_tool = entMan.System<ToolSystem>();
|
_toolSystem = toolSystem;
|
||||||
|
|
||||||
_label = new RichTextLabel { StyleClasses = { StyleNano.StyleClassItemStatus } };
|
_label = new RichTextLabel { StyleClasses = { StyleNano.StyleClassItemStatus } };
|
||||||
AddChild(_label);
|
AddChild(_label);
|
||||||
|
|
||||||
UpdateDraw();
|
UpdateDraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
protected override Data PollData()
|
||||||
protected override void FrameUpdate(FrameEventArgs args)
|
|
||||||
{
|
{
|
||||||
base.FrameUpdate(args);
|
var (fuel, capacity) = _toolSystem.GetWelderFuelAndCapacity(_parent, _parent.Comp);
|
||||||
|
return new Data(fuel, capacity, _parent.Comp.Enabled);
|
||||||
Update();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update()
|
protected override void Update(in Data data)
|
||||||
{
|
{
|
||||||
if (!_gameTiming.IsFirstTimePredicted)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var (fuel, fuelCap) = _tool.GetWelderFuelAndCapacity(_parent, _parent);
|
|
||||||
var lit = _parent.Comp.Enabled;
|
|
||||||
|
|
||||||
_label.SetMarkup(Loc.GetString("welder-component-on-examine-detailed-message",
|
_label.SetMarkup(Loc.GetString("welder-component-on-examine-detailed-message",
|
||||||
("colorName", fuel < fuelCap / 4f ? "darkorange" : "orange"),
|
("colorName", data.Fuel < data.FuelCapacity / 4f ? "darkorange" : "orange"),
|
||||||
("fuelLeft", Math.Round(fuel.Float(), 1)),
|
("fuelLeft", data.Fuel),
|
||||||
("fuelCapacity", fuelCap),
|
("fuelCapacity", data.FuelCapacity),
|
||||||
("status", Loc.GetString(lit ? "welder-component-on-examine-welder-lit-message" : "welder-component-on-examine-welder-not-lit-message"))));
|
("status", Loc.GetString(data.Lit ? "welder-component-on-examine-welder-lit-message" : "welder-component-on-examine-welder-not-lit-message"))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public record struct Data(FixedPoint2 Fuel, FixedPoint2 FuelCapacity, bool Lit);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,15 @@ public sealed class HandsUIController : UIController, IOnStateEntered<GameplaySt
|
|||||||
private readonly Dictionary<string, HandButton> _handLookup = new();
|
private readonly Dictionary<string, HandButton> _handLookup = new();
|
||||||
private HandsComponent? _playerHandsComponent;
|
private HandsComponent? _playerHandsComponent;
|
||||||
private HandButton? _activeHand = null;
|
private HandButton? _activeHand = null;
|
||||||
|
|
||||||
|
// We only have two item status controls (left and right hand),
|
||||||
|
// but we may have more than two hands.
|
||||||
|
// We handle this by having the item status be the *last active* hand of that side.
|
||||||
|
// These variables store which that is.
|
||||||
|
// ("middle" hands are hardcoded as right, whatever)
|
||||||
|
private HandButton? _statusHandLeft;
|
||||||
|
private HandButton? _statusHandRight;
|
||||||
|
|
||||||
private int _backupSuffix = 0; //this is used when autogenerating container names if they don't have names
|
private int _backupSuffix = 0; //this is used when autogenerating container names if they don't have names
|
||||||
|
|
||||||
private HotbarGui? HandsGui => UIManager.GetActiveUIWidgetOrNull<HotbarGui>();
|
private HotbarGui? HandsGui => UIManager.GetActiveUIWidgetOrNull<HotbarGui>();
|
||||||
@@ -180,8 +189,7 @@ public sealed class HandsUIController : UIController, IOnStateEntered<GameplaySt
|
|||||||
hand.Blocked = false;
|
hand.Blocked = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_playerHandsComponent?.ActiveHand?.Name == name)
|
UpdateHandStatus(hand, entity);
|
||||||
HandsGui?.UpdatePanelEntity(entity);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnItemRemoved(string name, EntityUid entity)
|
private void OnItemRemoved(string name, EntityUid entity)
|
||||||
@@ -191,8 +199,7 @@ public sealed class HandsUIController : UIController, IOnStateEntered<GameplaySt
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
hand.SetEntity(null);
|
hand.SetEntity(null);
|
||||||
if (_playerHandsComponent?.ActiveHand?.Name == name)
|
UpdateHandStatus(hand, null);
|
||||||
HandsGui?.UpdatePanelEntity(null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private HandsContainer GetFirstAvailableContainer()
|
private HandsContainer GetFirstAvailableContainer()
|
||||||
@@ -232,7 +239,6 @@ public sealed class HandsUIController : UIController, IOnStateEntered<GameplaySt
|
|||||||
if (_activeHand != null)
|
if (_activeHand != null)
|
||||||
_activeHand.Highlight = false;
|
_activeHand.Highlight = false;
|
||||||
|
|
||||||
HandsGui?.UpdatePanelEntity(null);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -250,7 +256,19 @@ public sealed class HandsUIController : UIController, IOnStateEntered<GameplaySt
|
|||||||
_player.LocalSession?.AttachedEntity is { } playerEntity &&
|
_player.LocalSession?.AttachedEntity is { } playerEntity &&
|
||||||
_handsSystem.TryGetHand(playerEntity, handName, out var hand, _playerHandsComponent))
|
_handsSystem.TryGetHand(playerEntity, handName, out var hand, _playerHandsComponent))
|
||||||
{
|
{
|
||||||
HandsGui.UpdatePanelEntity(hand.HeldEntity);
|
if (hand.Location == HandLocation.Left)
|
||||||
|
{
|
||||||
|
_statusHandLeft = handControl;
|
||||||
|
HandsGui.UpdatePanelEntityLeft(hand.HeldEntity);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Middle or right
|
||||||
|
_statusHandRight = handControl;
|
||||||
|
HandsGui.UpdatePanelEntityRight(hand.HeldEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
HandsGui.SetHighlightHand(hand.Location);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,6 +296,14 @@ public sealed class HandsUIController : UIController, IOnStateEntered<GameplaySt
|
|||||||
GetFirstAvailableContainer().AddButton(button);
|
GetFirstAvailableContainer().AddButton(button);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we don't have a status for this hand type yet, set it.
|
||||||
|
// This means we have status filled by default in most scenarios,
|
||||||
|
// otherwise the user'd need to switch hands to "activate" the hands the first time.
|
||||||
|
if (location == HandLocation.Left)
|
||||||
|
_statusHandLeft ??= button;
|
||||||
|
else
|
||||||
|
_statusHandRight ??= button;
|
||||||
|
|
||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -336,6 +362,11 @@ public sealed class HandsUIController : UIController, IOnStateEntered<GameplaySt
|
|||||||
handContainer.RemoveButton(handButton);
|
handContainer.RemoveButton(handButton);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_statusHandLeft == handButton)
|
||||||
|
_statusHandLeft = null;
|
||||||
|
if (_statusHandRight == handButton)
|
||||||
|
_statusHandRight = null;
|
||||||
|
|
||||||
_handLookup.Remove(handName);
|
_handLookup.Remove(handName);
|
||||||
handButton.Dispose();
|
handButton.Dispose();
|
||||||
return true;
|
return true;
|
||||||
@@ -407,4 +438,13 @@ public sealed class HandsUIController : UIController, IOnStateEntered<GameplaySt
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void UpdateHandStatus(HandButton hand, EntityUid? entity)
|
||||||
|
{
|
||||||
|
if (hand == _statusHandLeft)
|
||||||
|
HandsGui?.UpdatePanelEntityLeft(entity);
|
||||||
|
|
||||||
|
if (hand == _statusHandRight)
|
||||||
|
HandsGui?.UpdatePanelEntityRight(entity);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ public sealed class HotbarUIController : UIController
|
|||||||
ReloadHotbar();
|
ReloadHotbar();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Setup(HandsContainer handsContainer, ItemStatusPanel handStatus, StorageContainer storageContainer)
|
public void Setup(HandsContainer handsContainer, StorageContainer storageContainer)
|
||||||
{
|
{
|
||||||
_inventory = UIManager.GetUIController<InventoryUIController>();
|
_inventory = UIManager.GetUIController<InventoryUIController>();
|
||||||
_hands = UIManager.GetUIController<HandsUIController>();
|
_hands = UIManager.GetUIController<HandsUIController>();
|
||||||
|
|||||||
@@ -10,12 +10,6 @@
|
|||||||
Orientation="Vertical"
|
Orientation="Vertical"
|
||||||
HorizontalAlignment="Center">
|
HorizontalAlignment="Center">
|
||||||
<BoxContainer Orientation="Vertical">
|
<BoxContainer Orientation="Vertical">
|
||||||
<Control HorizontalAlignment="Center">
|
|
||||||
<inventory:ItemStatusPanel
|
|
||||||
Name="StatusPanel"
|
|
||||||
Visible="False"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
/>
|
|
||||||
<BoxContainer Name="StorageContainer"
|
<BoxContainer Name="StorageContainer"
|
||||||
Access="Public"
|
Access="Public"
|
||||||
HorizontalAlignment="Center"
|
HorizontalAlignment="Center"
|
||||||
@@ -24,7 +18,6 @@
|
|||||||
Name="StoragePanel"
|
Name="StoragePanel"
|
||||||
Visible="False"/>
|
Visible="False"/>
|
||||||
</BoxContainer>
|
</BoxContainer>
|
||||||
</Control>
|
|
||||||
<BoxContainer Orientation="Horizontal" Name="Hotbar" HorizontalAlignment="Center">
|
<BoxContainer Orientation="Horizontal" Name="Hotbar" HorizontalAlignment="Center">
|
||||||
<inventory:ItemSlotButtonContainer
|
<inventory:ItemSlotButtonContainer
|
||||||
Name="SecondHotbar"
|
Name="SecondHotbar"
|
||||||
@@ -35,13 +28,22 @@
|
|||||||
ExpandBackwards="True"
|
ExpandBackwards="True"
|
||||||
Columns="6"
|
Columns="6"
|
||||||
HorizontalExpand="False"/>
|
HorizontalExpand="False"/>
|
||||||
|
<inventory:ItemStatusPanel
|
||||||
|
Name="StatusPanelRight"
|
||||||
|
HorizontalAlignment="Center" Margin="0 0 -2 2"
|
||||||
|
SetWidth="125"
|
||||||
|
MaxHeight="60"/>
|
||||||
<hands:HandsContainer
|
<hands:HandsContainer
|
||||||
Name="HandContainer"
|
Name="HandContainer"
|
||||||
Access="Public"
|
Access="Public"
|
||||||
HorizontalAlignment="Center"
|
HorizontalAlignment="Center"
|
||||||
HorizontalExpand="False"
|
HorizontalExpand="False"
|
||||||
ColumnLimit="6"
|
ColumnLimit="6"/>
|
||||||
Margin="4 0 4 0"/>
|
<inventory:ItemStatusPanel
|
||||||
|
Name="StatusPanelLeft"
|
||||||
|
HorizontalAlignment="Center" Margin="-2 0 0 2"
|
||||||
|
SetWidth="125"
|
||||||
|
MaxHeight="60"/>
|
||||||
<inventory:ItemSlotButtonContainer
|
<inventory:ItemSlotButtonContainer
|
||||||
Name="MainHotbar"
|
Name="MainHotbar"
|
||||||
SlotGroup="MainHotbar"
|
SlotGroup="MainHotbar"
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Robust.Client.AutoGenerated;
|
using Content.Shared.Hands.Components;
|
||||||
|
using Robust.Client.AutoGenerated;
|
||||||
using Robust.Client.UserInterface.Controls;
|
using Robust.Client.UserInterface.Controls;
|
||||||
using Robust.Client.UserInterface.XAML;
|
using Robust.Client.UserInterface.XAML;
|
||||||
|
|
||||||
@@ -10,22 +11,27 @@ public sealed partial class HotbarGui : UIWidget
|
|||||||
public HotbarGui()
|
public HotbarGui()
|
||||||
{
|
{
|
||||||
RobustXamlLoader.Load(this);
|
RobustXamlLoader.Load(this);
|
||||||
StatusPanel.Update(null);
|
StatusPanelRight.SetSide(HandLocation.Right);
|
||||||
|
StatusPanelLeft.SetSide(HandLocation.Left);
|
||||||
var hotbarController = UserInterfaceManager.GetUIController<HotbarUIController>();
|
var hotbarController = UserInterfaceManager.GetUIController<HotbarUIController>();
|
||||||
|
|
||||||
hotbarController.Setup(HandContainer, StatusPanel, StoragePanel);
|
hotbarController.Setup(HandContainer, StoragePanel);
|
||||||
LayoutContainer.SetGrowVertical(this, LayoutContainer.GrowDirection.Begin);
|
LayoutContainer.SetGrowVertical(this, LayoutContainer.GrowDirection.Begin);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdatePanelEntity(EntityUid? entity)
|
public void UpdatePanelEntityLeft(EntityUid? entity)
|
||||||
{
|
{
|
||||||
StatusPanel.Update(entity);
|
StatusPanelLeft.Update(entity);
|
||||||
if (entity == null)
|
|
||||||
{
|
|
||||||
StatusPanel.Visible = false;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
StatusPanel.Visible = true;
|
public void UpdatePanelEntityRight(EntityUid? entity)
|
||||||
|
{
|
||||||
|
StatusPanelRight.Update(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetHighlightHand(HandLocation? hand)
|
||||||
|
{
|
||||||
|
StatusPanelLeft.UpdateHighlight(hand is HandLocation.Left);
|
||||||
|
StatusPanelRight.UpdateHighlight(hand is HandLocation.Middle or HandLocation.Right);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,22 +3,26 @@
|
|||||||
xmlns:controls="clr-namespace:Content.Client.UserInterface.Systems.Inventory.Controls"
|
xmlns:controls="clr-namespace:Content.Client.UserInterface.Systems.Inventory.Controls"
|
||||||
xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
|
xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
|
||||||
VerticalAlignment="Bottom"
|
VerticalAlignment="Bottom"
|
||||||
HorizontalAlignment="Center"
|
HorizontalAlignment="Center">
|
||||||
MinSize="150 0">
|
<Control Name="VisWrapper" Visible="False">
|
||||||
<PanelContainer
|
<PanelContainer Name="Panel">
|
||||||
Name="Panel"
|
|
||||||
ModulateSelfOverride="#FFFFFFE6"
|
|
||||||
HorizontalExpand="True">
|
|
||||||
<PanelContainer.PanelOverride>
|
<PanelContainer.PanelOverride>
|
||||||
<graphics:StyleBoxTexture
|
<graphics:StyleBoxTexture
|
||||||
ContentMarginLeftOverride="6"
|
PatchMarginBottom="4"
|
||||||
ContentMarginRightOverride="6"
|
PatchMarginTop="6"
|
||||||
ContentMarginTopOverride="4"
|
TextureScale="2 2"
|
||||||
ContentMarginBottomOverride="4" />
|
Mode="Tile"/>
|
||||||
</PanelContainer.PanelOverride>
|
</PanelContainer.PanelOverride>
|
||||||
<BoxContainer Orientation="Vertical" SeparationOverride="0">
|
|
||||||
<BoxContainer Name="StatusContents" Orientation="Vertical"/>
|
|
||||||
<Label Name="ItemNameLabel" StyleClasses="ItemStatus"/>
|
|
||||||
</BoxContainer>
|
|
||||||
</PanelContainer>
|
</PanelContainer>
|
||||||
|
<PanelContainer Name="HighlightPanel">
|
||||||
|
<PanelContainer.PanelOverride>
|
||||||
|
<graphics:StyleBoxTexture PatchMarginBottom="4" PatchMarginTop="6" TextureScale="2 2">
|
||||||
|
</graphics:StyleBoxTexture>
|
||||||
|
</PanelContainer.PanelOverride>
|
||||||
|
</PanelContainer>
|
||||||
|
<BoxContainer Name="Contents" Orientation="Vertical" Margin="0 6 0 4">
|
||||||
|
<BoxContainer Name="StatusContents" Orientation="Vertical" />
|
||||||
|
<Label Name="ItemNameLabel" ClipText="True" StyleClasses="ItemStatus" Align="Left" />
|
||||||
|
</BoxContainer>
|
||||||
|
</Control>
|
||||||
</controls:ItemStatusPanel>
|
</controls:ItemStatusPanel>
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System.Numerics;
|
||||||
using Content.Client.Items;
|
using Content.Client.Items;
|
||||||
using Content.Client.Resources;
|
using Content.Client.Resources;
|
||||||
using Content.Shared.Hands.Components;
|
using Content.Shared.Hands.Components;
|
||||||
@@ -5,6 +6,7 @@ using Content.Shared.IdentityManagement;
|
|||||||
using Content.Shared.Inventory.VirtualItem;
|
using Content.Shared.Inventory.VirtualItem;
|
||||||
using Robust.Client.AutoGenerated;
|
using Robust.Client.AutoGenerated;
|
||||||
using Robust.Client.Graphics;
|
using Robust.Client.Graphics;
|
||||||
|
using Robust.Client.UserInterface;
|
||||||
using Robust.Client.UserInterface.Controls;
|
using Robust.Client.UserInterface.Controls;
|
||||||
using Robust.Client.UserInterface.XAML;
|
using Robust.Client.UserInterface.XAML;
|
||||||
using Robust.Shared.Timing;
|
using Robust.Shared.Timing;
|
||||||
@@ -14,12 +16,15 @@ using static Content.Client.IoC.StaticIoC;
|
|||||||
namespace Content.Client.UserInterface.Systems.Inventory.Controls;
|
namespace Content.Client.UserInterface.Systems.Inventory.Controls;
|
||||||
|
|
||||||
[GenerateTypedNameReferences]
|
[GenerateTypedNameReferences]
|
||||||
public sealed partial class ItemStatusPanel : BoxContainer
|
public sealed partial class ItemStatusPanel : Control
|
||||||
{
|
{
|
||||||
[Dependency] private readonly IEntityManager _entityManager = default!;
|
[Dependency] private readonly IEntityManager _entityManager = default!;
|
||||||
|
|
||||||
[ViewVariables] private EntityUid? _entity;
|
[ViewVariables] private EntityUid? _entity;
|
||||||
|
|
||||||
|
// Tracked so we can re-run SetSide() if the theme changes.
|
||||||
|
private HandLocation _side;
|
||||||
|
|
||||||
public ItemStatusPanel()
|
public ItemStatusPanel()
|
||||||
{
|
{
|
||||||
RobustXamlLoader.Load(this);
|
RobustXamlLoader.Load(this);
|
||||||
@@ -30,41 +35,65 @@ public sealed partial class ItemStatusPanel : BoxContainer
|
|||||||
|
|
||||||
public void SetSide(HandLocation location)
|
public void SetSide(HandLocation location)
|
||||||
{
|
{
|
||||||
string texture;
|
// AN IMPORTANT REMINDER ABOUT THIS CODE:
|
||||||
|
// In the UI, the RIGHT hand is on the LEFT on the screen.
|
||||||
|
// So that a character facing DOWN matches the hand positions.
|
||||||
|
|
||||||
|
Texture? texture;
|
||||||
|
Texture? textureHighlight;
|
||||||
StyleBox.Margin cutOut;
|
StyleBox.Margin cutOut;
|
||||||
StyleBox.Margin flat;
|
StyleBox.Margin flat;
|
||||||
Label.AlignMode textAlign;
|
Thickness contentMargin;
|
||||||
|
|
||||||
switch (location)
|
switch (location)
|
||||||
{
|
{
|
||||||
case HandLocation.Left:
|
case HandLocation.Right:
|
||||||
texture = "/Textures/Interface/Nano/item_status_right.svg.96dpi.png";
|
texture = Theme.ResolveTexture("item_status_right");
|
||||||
cutOut = StyleBox.Margin.Left | StyleBox.Margin.Top;
|
textureHighlight = Theme.ResolveTexture("item_status_right_highlight");
|
||||||
flat = StyleBox.Margin.Right | StyleBox.Margin.Bottom;
|
cutOut = StyleBox.Margin.Left;
|
||||||
textAlign = Label.AlignMode.Right;
|
flat = StyleBox.Margin.Right;
|
||||||
|
contentMargin = MarginFromThemeColor("_itemstatus_content_margin_right");
|
||||||
break;
|
break;
|
||||||
case HandLocation.Middle:
|
case HandLocation.Middle:
|
||||||
texture = "/Textures/Interface/Nano/item_status_middle.svg.96dpi.png";
|
case HandLocation.Left:
|
||||||
cutOut = StyleBox.Margin.Right | StyleBox.Margin.Top;
|
texture = Theme.ResolveTexture("item_status_left");
|
||||||
flat = StyleBox.Margin.Left | StyleBox.Margin.Bottom;
|
textureHighlight = Theme.ResolveTexture("item_status_left_highlight");
|
||||||
textAlign = Label.AlignMode.Left;
|
cutOut = StyleBox.Margin.Right;
|
||||||
break;
|
flat = StyleBox.Margin.Left;
|
||||||
case HandLocation.Right:
|
contentMargin = MarginFromThemeColor("_itemstatus_content_margin_left");
|
||||||
texture = "/Textures/Interface/Nano/item_status_left.svg.96dpi.png";
|
|
||||||
cutOut = StyleBox.Margin.Right | StyleBox.Margin.Top;
|
|
||||||
flat = StyleBox.Margin.Left | StyleBox.Margin.Bottom;
|
|
||||||
textAlign = Label.AlignMode.Left;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new ArgumentOutOfRangeException(nameof(location), location, null);
|
throw new ArgumentOutOfRangeException(nameof(location), location, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
var panel = (StyleBoxTexture) Panel.PanelOverride!;
|
Contents.Margin = contentMargin;
|
||||||
panel.Texture = ResC.GetTexture(texture);
|
|
||||||
panel.SetPatchMargin(flat, 2);
|
|
||||||
panel.SetPatchMargin(cutOut, 13);
|
|
||||||
|
|
||||||
ItemNameLabel.Align = textAlign;
|
var panel = (StyleBoxTexture) Panel.PanelOverride!;
|
||||||
|
panel.Texture = texture;
|
||||||
|
panel.SetPatchMargin(flat, 4);
|
||||||
|
panel.SetPatchMargin(cutOut, 7);
|
||||||
|
|
||||||
|
var panelHighlight = (StyleBoxTexture) HighlightPanel.PanelOverride!;
|
||||||
|
panelHighlight.Texture = textureHighlight;
|
||||||
|
panelHighlight.SetPatchMargin(flat, 4);
|
||||||
|
panelHighlight.SetPatchMargin(cutOut, 7);
|
||||||
|
|
||||||
|
_side = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Thickness MarginFromThemeColor(string itemName)
|
||||||
|
{
|
||||||
|
// This is the worst thing I've ever programmed
|
||||||
|
// (can you tell I'm a graphics programmer?)
|
||||||
|
// (the margin needs to change depending on the UI theme, so we use a fake color entry to store the value)
|
||||||
|
|
||||||
|
var color = Theme.ResolveColorOrSpecified(itemName);
|
||||||
|
return new Thickness(color.RByte, color.GByte, color.BByte, color.AByte);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnThemeUpdated()
|
||||||
|
{
|
||||||
|
SetSide(_side);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void FrameUpdate(FrameEventArgs args)
|
protected override void FrameUpdate(FrameEventArgs args)
|
||||||
@@ -79,7 +108,7 @@ public sealed partial class ItemStatusPanel : BoxContainer
|
|||||||
{
|
{
|
||||||
ClearOldStatus();
|
ClearOldStatus();
|
||||||
_entity = null;
|
_entity = null;
|
||||||
Panel.Visible = false;
|
VisWrapper.Visible = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,7 +120,12 @@ public sealed partial class ItemStatusPanel : BoxContainer
|
|||||||
UpdateItemName();
|
UpdateItemName();
|
||||||
}
|
}
|
||||||
|
|
||||||
Panel.Visible = true;
|
VisWrapper.Visible = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateHighlight(bool highlight)
|
||||||
|
{
|
||||||
|
HighlightPanel.Visible = highlight;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateItemName()
|
private void UpdateItemName()
|
||||||
|
|||||||
178
Content.Client/Weapons/Ranged/ItemStatus/BulletRender.cs
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
using System.Numerics;
|
||||||
|
using Content.Client.Resources;
|
||||||
|
using Robust.Client.Graphics;
|
||||||
|
using Robust.Client.ResourceManagement;
|
||||||
|
using Robust.Client.UserInterface;
|
||||||
|
|
||||||
|
namespace Content.Client.Weapons.Ranged.ItemStatus;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Renders one or more rows of bullets for item status.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This is a custom control to allow complex responsive layout logic.
|
||||||
|
/// </remarks>
|
||||||
|
public sealed class BulletRender : Control
|
||||||
|
{
|
||||||
|
private static readonly Color ColorA = Color.FromHex("#b68f0e");
|
||||||
|
private static readonly Color ColorB = Color.FromHex("#d7df60");
|
||||||
|
private static readonly Color ColorGoneA = Color.FromHex("#000000");
|
||||||
|
private static readonly Color ColorGoneB = Color.FromHex("#222222");
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Try to ensure there's at least this many bullets on one row.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// For example, if there are two rows and the second row has only two bullets,
|
||||||
|
/// we "steal" some bullets from the row below it to make it look nicer.
|
||||||
|
/// </remarks>
|
||||||
|
public const int MinCountPerRow = 7;
|
||||||
|
|
||||||
|
public const int BulletHeight = 12;
|
||||||
|
public const int BulletSeparationNormal = 3;
|
||||||
|
public const int BulletSeparationTiny = 2;
|
||||||
|
public const int BulletWidthNormal = 5;
|
||||||
|
public const int BulletWidthTiny = 2;
|
||||||
|
public const int VerticalSeparation = 2;
|
||||||
|
|
||||||
|
private readonly Texture _bulletTiny;
|
||||||
|
private readonly Texture _bulletNormal;
|
||||||
|
|
||||||
|
private int _capacity;
|
||||||
|
private BulletType _type = BulletType.Normal;
|
||||||
|
|
||||||
|
public int Rows { get; set; } = 2;
|
||||||
|
public int Count { get; set; }
|
||||||
|
|
||||||
|
public int Capacity
|
||||||
|
{
|
||||||
|
get => _capacity;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_capacity = value;
|
||||||
|
InvalidateMeasure();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public BulletType Type
|
||||||
|
{
|
||||||
|
get => _type;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_type = value;
|
||||||
|
InvalidateMeasure();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public BulletRender()
|
||||||
|
{
|
||||||
|
var resC = IoCManager.Resolve<IResourceCache>();
|
||||||
|
_bulletTiny = resC.GetTexture("/Textures/Interface/ItemStatus/Bullets/tiny.png");
|
||||||
|
_bulletNormal = resC.GetTexture("/Textures/Interface/ItemStatus/Bullets/normal.png");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override Vector2 MeasureOverride(Vector2 availableSize)
|
||||||
|
{
|
||||||
|
var countPerRow = Math.Min(Capacity, CountPerRow(availableSize.X));
|
||||||
|
|
||||||
|
var rows = Math.Min((int) MathF.Ceiling(Capacity / (float) countPerRow), Rows);
|
||||||
|
|
||||||
|
var height = BulletHeight * rows + (BulletSeparationNormal * rows - 1);
|
||||||
|
var width = RowWidth(countPerRow);
|
||||||
|
|
||||||
|
return new Vector2(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Draw(DrawingHandleScreen handle)
|
||||||
|
{
|
||||||
|
// Scale rendering in this control by UIScale.
|
||||||
|
var currentTransform = handle.GetTransform();
|
||||||
|
handle.SetTransform(Matrix3.CreateScale(new Vector2(UIScale)) * currentTransform);
|
||||||
|
|
||||||
|
var countPerRow = CountPerRow(Size.X);
|
||||||
|
|
||||||
|
var (separation, _) = BulletParams();
|
||||||
|
var texture = Type == BulletType.Normal ? _bulletNormal : _bulletTiny;
|
||||||
|
|
||||||
|
var pos = new Vector2();
|
||||||
|
|
||||||
|
var altColor = false;
|
||||||
|
|
||||||
|
var spent = Capacity - Count;
|
||||||
|
|
||||||
|
var bulletsDone = 0;
|
||||||
|
|
||||||
|
// Draw by rows, bottom to top.
|
||||||
|
for (var row = 0; row < Rows; row++)
|
||||||
|
{
|
||||||
|
altColor = false;
|
||||||
|
|
||||||
|
var thisRowCount = Math.Min(countPerRow, Capacity - bulletsDone);
|
||||||
|
if (thisRowCount <= 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Handle MinCountPerRow
|
||||||
|
// We only do this if:
|
||||||
|
// 1. The next row would have less than MinCountPerRow bullets.
|
||||||
|
// 2. The next row is actually visible (we aren't the last row).
|
||||||
|
// 3. MinCountPerRow is actually smaller than the count per row (avoid degenerate cases).
|
||||||
|
var nextRowCount = Capacity - bulletsDone - thisRowCount;
|
||||||
|
if (nextRowCount < MinCountPerRow && row != Rows - 1 && MinCountPerRow < countPerRow)
|
||||||
|
thisRowCount -= MinCountPerRow - nextRowCount;
|
||||||
|
|
||||||
|
// Account for row width to right-align.
|
||||||
|
var rowWidth = RowWidth(thisRowCount);
|
||||||
|
pos.X += Size.X - rowWidth;
|
||||||
|
|
||||||
|
// Draw row left to right (so overlapping works)
|
||||||
|
for (var bullet = 0; bullet < thisRowCount; bullet++)
|
||||||
|
{
|
||||||
|
var absIdx = Capacity - bulletsDone - thisRowCount + bullet;
|
||||||
|
Color color;
|
||||||
|
if (absIdx >= spent)
|
||||||
|
color = altColor ? ColorA : ColorB;
|
||||||
|
else
|
||||||
|
color = altColor ? ColorGoneA : ColorGoneB;
|
||||||
|
|
||||||
|
var renderPos = pos;
|
||||||
|
renderPos.Y = Size.Y - renderPos.Y - BulletHeight;
|
||||||
|
handle.DrawTexture(texture, renderPos, color);
|
||||||
|
pos.X += separation;
|
||||||
|
altColor ^= true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bulletsDone += thisRowCount;
|
||||||
|
pos.X = 0;
|
||||||
|
pos.Y += BulletHeight + VerticalSeparation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int CountPerRow(float width)
|
||||||
|
{
|
||||||
|
var (separation, bulletWidth) = BulletParams();
|
||||||
|
return (int) ((width - bulletWidth + separation) / separation);
|
||||||
|
}
|
||||||
|
|
||||||
|
private (int separation, int width) BulletParams()
|
||||||
|
{
|
||||||
|
return Type switch
|
||||||
|
{
|
||||||
|
BulletType.Normal => (BulletSeparationNormal, BulletWidthNormal),
|
||||||
|
BulletType.Tiny => (BulletSeparationTiny, BulletWidthTiny),
|
||||||
|
_ => throw new ArgumentOutOfRangeException()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private int RowWidth(int count)
|
||||||
|
{
|
||||||
|
var (separation, bulletWidth) = BulletParams();
|
||||||
|
|
||||||
|
return (count - 1) * separation + bulletWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum BulletType
|
||||||
|
{
|
||||||
|
Normal,
|
||||||
|
Tiny
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,11 +4,11 @@ using Content.Client.Items;
|
|||||||
using Content.Client.Resources;
|
using Content.Client.Resources;
|
||||||
using Content.Client.Stylesheets;
|
using Content.Client.Stylesheets;
|
||||||
using Content.Client.Weapons.Ranged.Components;
|
using Content.Client.Weapons.Ranged.Components;
|
||||||
|
using Content.Client.Weapons.Ranged.ItemStatus;
|
||||||
using Robust.Client.Animations;
|
using Robust.Client.Animations;
|
||||||
using Robust.Client.Graphics;
|
using Robust.Client.Graphics;
|
||||||
using Robust.Client.UserInterface;
|
using Robust.Client.UserInterface;
|
||||||
using Robust.Client.UserInterface.Controls;
|
using Robust.Client.UserInterface.Controls;
|
||||||
using Robust.Shared.Graphics;
|
|
||||||
|
|
||||||
namespace Content.Client.Weapons.Ranged.Systems;
|
namespace Content.Client.Weapons.Ranged.Systems;
|
||||||
|
|
||||||
@@ -91,116 +91,26 @@ public sealed partial class GunSystem
|
|||||||
|
|
||||||
private sealed class DefaultStatusControl : Control
|
private sealed class DefaultStatusControl : Control
|
||||||
{
|
{
|
||||||
private readonly BoxContainer _bulletsListTop;
|
private readonly BulletRender _bulletRender;
|
||||||
private readonly BoxContainer _bulletsListBottom;
|
|
||||||
|
|
||||||
public DefaultStatusControl()
|
public DefaultStatusControl()
|
||||||
{
|
{
|
||||||
MinHeight = 15;
|
MinHeight = 15;
|
||||||
HorizontalExpand = true;
|
HorizontalExpand = true;
|
||||||
VerticalAlignment = Control.VAlignment.Center;
|
VerticalAlignment = VAlignment.Center;
|
||||||
AddChild(new BoxContainer
|
AddChild(_bulletRender = new BulletRender
|
||||||
{
|
{
|
||||||
Orientation = BoxContainer.LayoutOrientation.Vertical,
|
HorizontalAlignment = HAlignment.Right,
|
||||||
HorizontalExpand = true,
|
VerticalAlignment = VAlignment.Bottom
|
||||||
VerticalAlignment = VAlignment.Center,
|
|
||||||
SeparationOverride = 0,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
(_bulletsListTop = new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = BoxContainer.LayoutOrientation.Horizontal,
|
|
||||||
SeparationOverride = 0
|
|
||||||
}),
|
|
||||||
new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = BoxContainer.LayoutOrientation.Horizontal,
|
|
||||||
HorizontalExpand = true,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
new Control
|
|
||||||
{
|
|
||||||
HorizontalExpand = true,
|
|
||||||
Children =
|
|
||||||
{
|
|
||||||
(_bulletsListBottom = new BoxContainer
|
|
||||||
{
|
|
||||||
Orientation = BoxContainer.LayoutOrientation.Horizontal,
|
|
||||||
VerticalAlignment = VAlignment.Center,
|
|
||||||
SeparationOverride = 0
|
|
||||||
}),
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(int count, int capacity)
|
public void Update(int count, int capacity)
|
||||||
{
|
{
|
||||||
_bulletsListTop.RemoveAllChildren();
|
_bulletRender.Count = count;
|
||||||
_bulletsListBottom.RemoveAllChildren();
|
_bulletRender.Capacity = capacity;
|
||||||
|
|
||||||
string texturePath;
|
_bulletRender.Type = capacity > 50 ? BulletRender.BulletType.Tiny : BulletRender.BulletType.Normal;
|
||||||
if (capacity <= 20)
|
|
||||||
{
|
|
||||||
texturePath = "/Textures/Interface/ItemStatus/Bullets/normal.png";
|
|
||||||
}
|
|
||||||
else if (capacity <= 30)
|
|
||||||
{
|
|
||||||
texturePath = "/Textures/Interface/ItemStatus/Bullets/small.png";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
texturePath = "/Textures/Interface/ItemStatus/Bullets/tiny.png";
|
|
||||||
}
|
|
||||||
|
|
||||||
var texture = StaticIoC.ResC.GetTexture(texturePath);
|
|
||||||
|
|
||||||
const int tinyMaxRow = 60;
|
|
||||||
|
|
||||||
if (capacity > tinyMaxRow)
|
|
||||||
{
|
|
||||||
FillBulletRow(_bulletsListBottom, Math.Min(tinyMaxRow, count), tinyMaxRow, texture);
|
|
||||||
FillBulletRow(_bulletsListTop, Math.Max(0, count - tinyMaxRow), capacity - tinyMaxRow, texture);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FillBulletRow(_bulletsListBottom, count, capacity, texture);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void FillBulletRow(Control container, int count, int capacity, Texture texture)
|
|
||||||
{
|
|
||||||
var colorA = Color.FromHex("#b68f0e");
|
|
||||||
var colorB = Color.FromHex("#d7df60");
|
|
||||||
var colorGoneA = Color.FromHex("#000000");
|
|
||||||
var colorGoneB = Color.FromHex("#222222");
|
|
||||||
|
|
||||||
var altColor = false;
|
|
||||||
|
|
||||||
for (var i = count; i < capacity; i++)
|
|
||||||
{
|
|
||||||
container.AddChild(new TextureRect
|
|
||||||
{
|
|
||||||
Texture = texture,
|
|
||||||
ModulateSelfOverride = altColor ? colorGoneA : colorGoneB
|
|
||||||
});
|
|
||||||
|
|
||||||
altColor ^= true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
container.AddChild(new TextureRect
|
|
||||||
{
|
|
||||||
Texture = texture,
|
|
||||||
ModulateSelfOverride = altColor ? colorA : colorB
|
|
||||||
});
|
|
||||||
|
|
||||||
altColor ^= true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -291,7 +201,7 @@ public sealed partial class GunSystem
|
|||||||
|
|
||||||
private sealed class ChamberMagazineStatusControl : Control
|
private sealed class ChamberMagazineStatusControl : Control
|
||||||
{
|
{
|
||||||
private readonly BoxContainer _bulletsList;
|
private readonly BulletRender _bulletRender;
|
||||||
private readonly TextureRect _chamberedBullet;
|
private readonly TextureRect _chamberedBullet;
|
||||||
private readonly Label _noMagazineLabel;
|
private readonly Label _noMagazineLabel;
|
||||||
private readonly Label _ammoCount;
|
private readonly Label _ammoCount;
|
||||||
@@ -308,23 +218,16 @@ public sealed partial class GunSystem
|
|||||||
HorizontalExpand = true,
|
HorizontalExpand = true,
|
||||||
Children =
|
Children =
|
||||||
{
|
{
|
||||||
(_chamberedBullet = new TextureRect
|
|
||||||
{
|
|
||||||
Texture = StaticIoC.ResC.GetTexture("/Textures/Interface/ItemStatus/Bullets/chambered_rotated.png"),
|
|
||||||
VerticalAlignment = VAlignment.Center,
|
|
||||||
HorizontalAlignment = HAlignment.Right,
|
|
||||||
}),
|
|
||||||
new Control() { MinSize = new Vector2(5,0) },
|
|
||||||
new Control
|
new Control
|
||||||
{
|
{
|
||||||
HorizontalExpand = true,
|
HorizontalExpand = true,
|
||||||
|
Margin = new Thickness(0, 0, 5, 0),
|
||||||
Children =
|
Children =
|
||||||
{
|
{
|
||||||
(_bulletsList = new BoxContainer
|
(_bulletRender = new BulletRender
|
||||||
{
|
{
|
||||||
Orientation = BoxContainer.LayoutOrientation.Horizontal,
|
HorizontalAlignment = HAlignment.Right,
|
||||||
VerticalAlignment = VAlignment.Center,
|
VerticalAlignment = VAlignment.Bottom
|
||||||
SeparationOverride = 0
|
|
||||||
}),
|
}),
|
||||||
(_noMagazineLabel = new Label
|
(_noMagazineLabel = new Label
|
||||||
{
|
{
|
||||||
@@ -333,12 +236,25 @@ public sealed partial class GunSystem
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
new Control() { MinSize = new Vector2(5,0) },
|
new BoxContainer
|
||||||
|
{
|
||||||
|
Orientation = BoxContainer.LayoutOrientation.Vertical,
|
||||||
|
VerticalAlignment = VAlignment.Bottom,
|
||||||
|
Margin = new Thickness(0, 0, 0, 2),
|
||||||
|
Children =
|
||||||
|
{
|
||||||
(_ammoCount = new Label
|
(_ammoCount = new Label
|
||||||
{
|
{
|
||||||
StyleClasses = {StyleNano.StyleClassItemStatus},
|
StyleClasses = {StyleNano.StyleClassItemStatus},
|
||||||
HorizontalAlignment = HAlignment.Right,
|
HorizontalAlignment = HAlignment.Right,
|
||||||
}),
|
}),
|
||||||
|
(_chamberedBullet = new TextureRect
|
||||||
|
{
|
||||||
|
Texture = StaticIoC.ResC.GetTexture("/Textures/Interface/ItemStatus/Bullets/chambered.png"),
|
||||||
|
HorizontalAlignment = HAlignment.Left,
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -348,61 +264,24 @@ public sealed partial class GunSystem
|
|||||||
_chamberedBullet.ModulateSelfOverride =
|
_chamberedBullet.ModulateSelfOverride =
|
||||||
chambered ? Color.FromHex("#d7df60") : Color.Black;
|
chambered ? Color.FromHex("#d7df60") : Color.Black;
|
||||||
|
|
||||||
_bulletsList.RemoveAllChildren();
|
|
||||||
|
|
||||||
if (!magazine)
|
if (!magazine)
|
||||||
{
|
{
|
||||||
|
_bulletRender.Visible = false;
|
||||||
_noMagazineLabel.Visible = true;
|
_noMagazineLabel.Visible = true;
|
||||||
_ammoCount.Visible = false;
|
_ammoCount.Visible = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_bulletRender.Visible = true;
|
||||||
_noMagazineLabel.Visible = false;
|
_noMagazineLabel.Visible = false;
|
||||||
_ammoCount.Visible = true;
|
_ammoCount.Visible = true;
|
||||||
|
|
||||||
var texturePath = "/Textures/Interface/ItemStatus/Bullets/normal.png";
|
_bulletRender.Count = count;
|
||||||
var texture = StaticIoC.ResC.GetTexture(texturePath);
|
_bulletRender.Capacity = capacity;
|
||||||
|
|
||||||
|
_bulletRender.Type = capacity > 50 ? BulletRender.BulletType.Tiny : BulletRender.BulletType.Normal;
|
||||||
|
|
||||||
_ammoCount.Text = $"x{count:00}";
|
_ammoCount.Text = $"x{count:00}";
|
||||||
capacity = Math.Min(capacity, 20);
|
|
||||||
FillBulletRow(_bulletsList, count, capacity, texture);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void FillBulletRow(Control container, int count, int capacity, Texture texture)
|
|
||||||
{
|
|
||||||
var colorA = Color.FromHex("#b68f0e");
|
|
||||||
var colorB = Color.FromHex("#d7df60");
|
|
||||||
var colorGoneA = Color.FromHex("#000000");
|
|
||||||
var colorGoneB = Color.FromHex("#222222");
|
|
||||||
|
|
||||||
var altColor = false;
|
|
||||||
|
|
||||||
// Draw the empty ones
|
|
||||||
for (var i = count; i < capacity; i++)
|
|
||||||
{
|
|
||||||
container.AddChild(new TextureRect
|
|
||||||
{
|
|
||||||
Texture = texture,
|
|
||||||
ModulateSelfOverride = altColor ? colorGoneA : colorGoneB,
|
|
||||||
Stretch = TextureRect.StretchMode.KeepCentered
|
|
||||||
});
|
|
||||||
|
|
||||||
altColor ^= true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw the full ones, but limit the count to the capacity
|
|
||||||
count = Math.Min(count, capacity);
|
|
||||||
for (var i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
container.AddChild(new TextureRect
|
|
||||||
{
|
|
||||||
Texture = texture,
|
|
||||||
ModulateSelfOverride = altColor ? colorA : colorB,
|
|
||||||
Stretch = TextureRect.StretchMode.KeepCentered
|
|
||||||
});
|
|
||||||
|
|
||||||
altColor ^= true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PlayAlarmAnimation(Animation animation)
|
public void PlayAlarmAnimation(Animation animation)
|
||||||
|
|||||||
@@ -28,7 +28,6 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="Objectives\Interfaces\" />
|
<Folder Include="Objectives\Interfaces\" />
|
||||||
<Folder Include="Tools\Systems\" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="..\RobustToolbox\MSBuild\Robust.Properties.targets" />
|
<Import Project="..\RobustToolbox\MSBuild\Robust.Properties.targets" />
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -14,12 +14,13 @@ namespace Content.Server.Entry
|
|||||||
"Icon",
|
"Icon",
|
||||||
"HandheldGPS",
|
"HandheldGPS",
|
||||||
"CableVisualizer",
|
"CableVisualizer",
|
||||||
|
"SolutionItemStatus",
|
||||||
"UIFragment",
|
"UIFragment",
|
||||||
"PdaBorderColor",
|
"PdaBorderColor",
|
||||||
"InventorySlots",
|
"InventorySlots",
|
||||||
"LightFade",
|
"LightFade",
|
||||||
"HolidayRsiSwap",
|
"HolidayRsiSwap",
|
||||||
"OptionsVisualizer",
|
"OptionsVisualizer"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,10 +45,10 @@ public sealed class ToolSystem : SharedToolSystem
|
|||||||
if (welder.WelderTimer < welder.WelderUpdateTimer)
|
if (welder.WelderTimer < welder.WelderUpdateTimer)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!SolutionContainerSystem.ResolveSolution((uid, solutionContainer), welder.FuelSolutionName, ref welder.FuelSolution, out var solution))
|
if (!SolutionContainerSystem.TryGetSolution((uid, solutionContainer), welder.FuelSolutionName, out var solutionComp, out var solution))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
SolutionContainerSystem.RemoveReagent(welder.FuelSolution.Value, welder.FuelReagent, welder.FuelConsumption * welder.WelderTimer);
|
SolutionContainerSystem.RemoveReagent(solutionComp.Value, welder.FuelReagent, welder.FuelConsumption * welder.WelderTimer);
|
||||||
|
|
||||||
if (solution.GetTotalPrototypeQuantity(welder.FuelReagent) <= FixedPoint2.Zero)
|
if (solution.GetTotalPrototypeQuantity(welder.FuelReagent) <= FixedPoint2.Zero)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -23,12 +23,6 @@ public sealed partial class WelderComponent : Component
|
|||||||
[DataField]
|
[DataField]
|
||||||
public string FuelSolutionName = "Welder";
|
public string FuelSolutionName = "Welder";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Solution on the entity that contains the fuel.
|
|
||||||
/// </summary>
|
|
||||||
[ViewVariables(VVAccess.ReadWrite)]
|
|
||||||
public Entity<SolutionComponent>? FuelSolution;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Reagent that will be used as fuel for welding.
|
/// Reagent that will be used as fuel for welding.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -24,10 +24,10 @@ public abstract partial class SharedToolSystem
|
|||||||
|
|
||||||
public virtual void TurnOn(Entity<WelderComponent> entity, EntityUid? user)
|
public virtual void TurnOn(Entity<WelderComponent> entity, EntityUid? user)
|
||||||
{
|
{
|
||||||
if (!SolutionContainerSystem.ResolveSolution(entity.Owner, entity.Comp.FuelSolutionName, ref entity.Comp.FuelSolution))
|
if (!SolutionContainerSystem.TryGetSolution(entity.Owner, entity.Comp.FuelSolutionName, out var solutionComp, out _))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SolutionContainerSystem.RemoveReagent(entity.Comp.FuelSolution.Value, entity.Comp.FuelReagent, entity.Comp.FuelLitCost);
|
SolutionContainerSystem.RemoveReagent(solutionComp.Value, entity.Comp.FuelReagent, entity.Comp.FuelLitCost);
|
||||||
AdminLogger.Add(LogType.InteractActivate, LogImpact.Low,
|
AdminLogger.Add(LogType.InteractActivate, LogImpact.Low,
|
||||||
$"{ToPrettyString(user):user} toggled {ToPrettyString(entity.Owner):welder} on");
|
$"{ToPrettyString(user):user} toggled {ToPrettyString(entity.Owner):welder} on");
|
||||||
|
|
||||||
@@ -45,9 +45,17 @@ public abstract partial class SharedToolSystem
|
|||||||
|
|
||||||
public (FixedPoint2 fuel, FixedPoint2 capacity) GetWelderFuelAndCapacity(EntityUid uid, WelderComponent? welder = null, SolutionContainerManagerComponent? solutionContainer = null)
|
public (FixedPoint2 fuel, FixedPoint2 capacity) GetWelderFuelAndCapacity(EntityUid uid, WelderComponent? welder = null, SolutionContainerManagerComponent? solutionContainer = null)
|
||||||
{
|
{
|
||||||
if (!Resolve(uid, ref welder, ref solutionContainer)
|
if (!Resolve(uid, ref welder, ref solutionContainer))
|
||||||
|| !SolutionContainerSystem.ResolveSolution((uid, solutionContainer), welder.FuelSolutionName, ref welder.FuelSolution, out var fuelSolution))
|
return default;
|
||||||
return (FixedPoint2.Zero, FixedPoint2.Zero);
|
|
||||||
|
if (!SolutionContainer.TryGetSolution(
|
||||||
|
(uid, solutionContainer),
|
||||||
|
welder.FuelSolutionName,
|
||||||
|
out _,
|
||||||
|
out var fuelSolution))
|
||||||
|
{
|
||||||
|
return default;
|
||||||
|
}
|
||||||
|
|
||||||
return (fuelSolution.GetTotalPrototypeQuantity(welder.FuelReagent), fuelSolution.MaxVolume);
|
return (fuelSolution.GetTotalPrototypeQuantity(welder.FuelReagent), fuelSolution.MaxVolume);
|
||||||
}
|
}
|
||||||
@@ -89,13 +97,13 @@ public abstract partial class SharedToolSystem
|
|||||||
if (TryComp(target, out ReagentTankComponent? tank)
|
if (TryComp(target, out ReagentTankComponent? tank)
|
||||||
&& tank.TankType == ReagentTankType.Fuel
|
&& tank.TankType == ReagentTankType.Fuel
|
||||||
&& SolutionContainerSystem.TryGetDrainableSolution(target, out var targetSoln, out var targetSolution)
|
&& SolutionContainerSystem.TryGetDrainableSolution(target, out var targetSoln, out var targetSolution)
|
||||||
&& SolutionContainerSystem.ResolveSolution(entity.Owner, entity.Comp.FuelSolutionName, ref entity.Comp.FuelSolution, out var welderSolution))
|
&& SolutionContainerSystem.TryGetSolution(entity.Owner, entity.Comp.FuelSolutionName, out var solutionComp, out var welderSolution))
|
||||||
{
|
{
|
||||||
var trans = FixedPoint2.Min(welderSolution.AvailableVolume, targetSolution.Volume);
|
var trans = FixedPoint2.Min(welderSolution.AvailableVolume, targetSolution.Volume);
|
||||||
if (trans > 0)
|
if (trans > 0)
|
||||||
{
|
{
|
||||||
var drained = SolutionContainerSystem.Drain(target, targetSoln.Value, trans);
|
var drained = SolutionContainerSystem.Drain(target, targetSoln.Value, trans);
|
||||||
SolutionContainerSystem.TryAddSolution(entity.Comp.FuelSolution.Value, drained);
|
SolutionContainerSystem.TryAddSolution(solutionComp.Value, drained);
|
||||||
_audioSystem.PlayPredicted(entity.Comp.WelderRefill, entity, user: args.User);
|
_audioSystem.PlayPredicted(entity.Comp.WelderRefill, entity, user: args.User);
|
||||||
_popup.PopupClient(Loc.GetString("welder-component-after-interact-refueled-message"), entity, args.User);
|
_popup.PopupClient(Loc.GetString("welder-component-after-interact-refueled-message"), entity, args.User);
|
||||||
}
|
}
|
||||||
@@ -153,7 +161,7 @@ public abstract partial class SharedToolSystem
|
|||||||
|
|
||||||
private void OnActivateAttempt(Entity<WelderComponent> entity, ref ItemToggleActivateAttemptEvent args)
|
private void OnActivateAttempt(Entity<WelderComponent> entity, ref ItemToggleActivateAttemptEvent args)
|
||||||
{
|
{
|
||||||
if (!SolutionContainerSystem.ResolveSolution(entity.Owner, entity.Comp.FuelSolutionName, ref entity.Comp.FuelSolution, out var solution))
|
if (!SolutionContainerSystem.TryGetSolution(entity.Owner, entity.Comp.FuelSolutionName, out _, out var solution))
|
||||||
{
|
{
|
||||||
args.Cancelled = true;
|
args.Cancelled = true;
|
||||||
args.Popup = Loc.GetString("welder-component-no-fuel-message");
|
args.Popup = Loc.GetString("welder-component-no-fuel-message");
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ public abstract partial class SharedToolSystem : EntitySystem
|
|||||||
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
|
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
|
||||||
[Dependency] private readonly TileSystem _tiles = default!;
|
[Dependency] private readonly TileSystem _tiles = default!;
|
||||||
[Dependency] private readonly TurfSystem _turfs = default!;
|
[Dependency] private readonly TurfSystem _turfs = default!;
|
||||||
|
[Dependency] protected readonly SharedSolutionContainerSystem SolutionContainer = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
solution-status-volume = Volume: [color=white]{$currentVolume}/{$maxVolume}u[/color]
|
||||||
|
solution-status-transfer = Transfer: [color=white]{$volume}u[/color]
|
||||||
@@ -4,7 +4,8 @@ welder-component-no-fuel-message = The welder has no fuel left!
|
|||||||
welder-component-no-fuel-in-tank = The {$owner} is empty.
|
welder-component-no-fuel-in-tank = The {$owner} is empty.
|
||||||
welder-component-on-examine-welder-lit-message = [color=orange]Lit[/color]
|
welder-component-on-examine-welder-lit-message = [color=orange]Lit[/color]
|
||||||
welder-component-on-examine-welder-not-lit-message = Not lit
|
welder-component-on-examine-welder-not-lit-message = Not lit
|
||||||
welder-component-on-examine-detailed-message = Fuel: [color={$colorName}]{$fuelLeft}/{$fuelCapacity}[/color]. {$status}
|
welder-component-on-examine-detailed-message = Fuel: [color={$colorName}]{$fuelLeft}/{$fuelCapacity}[/color]
|
||||||
|
{$status}
|
||||||
welder-component-suicide-lit-others-message = {$victim} welds their every orifice closed! It looks like they are trying to commit suicide!
|
welder-component-suicide-lit-others-message = {$victim} welds their every orifice closed! It looks like they are trying to commit suicide!
|
||||||
welder-component-suicide-lit-message = You weld your every orifice closed!
|
welder-component-suicide-lit-message = You weld your every orifice closed!
|
||||||
welder-component-suicide-unlit-others-message = {$victim} bashes themselves with the unlit welding torch!
|
welder-component-suicide-unlit-others-message = {$victim} bashes themselves with the unlit welding torch!
|
||||||
|
|||||||
@@ -24,6 +24,8 @@
|
|||||||
solution: spray
|
solution: spray
|
||||||
- type: SolutionTransfer
|
- type: SolutionTransfer
|
||||||
canChangeTransferAmount: true
|
canChangeTransferAmount: true
|
||||||
|
- type: SolutionItemStatus
|
||||||
|
solution: spray
|
||||||
- type: UseDelay
|
- type: UseDelay
|
||||||
- type: Spray
|
- type: Spray
|
||||||
transferAmount: 10
|
transferAmount: 10
|
||||||
|
|||||||
@@ -32,6 +32,8 @@
|
|||||||
solution: beaker
|
solution: beaker
|
||||||
- type: SolutionTransfer
|
- type: SolutionTransfer
|
||||||
canChangeTransferAmount: true
|
canChangeTransferAmount: true
|
||||||
|
- type: SolutionItemStatus
|
||||||
|
solution: beaker
|
||||||
- type: UserInterface
|
- type: UserInterface
|
||||||
interfaces:
|
interfaces:
|
||||||
- key: enum.TransferAmountUiKey.Key
|
- key: enum.TransferAmountUiKey.Key
|
||||||
|
|||||||
@@ -41,6 +41,8 @@
|
|||||||
solution: beaker
|
solution: beaker
|
||||||
- type: SolutionTransfer
|
- type: SolutionTransfer
|
||||||
canChangeTransferAmount: true
|
canChangeTransferAmount: true
|
||||||
|
- type: SolutionItemStatus
|
||||||
|
solution: beaker
|
||||||
- type: UserInterface
|
- type: UserInterface
|
||||||
interfaces:
|
interfaces:
|
||||||
- key: enum.TransferAmountUiKey.Key
|
- key: enum.TransferAmountUiKey.Key
|
||||||
|
|||||||
@@ -51,6 +51,8 @@
|
|||||||
solution: bucket
|
solution: bucket
|
||||||
- type: DrainableSolution
|
- type: DrainableSolution
|
||||||
solution: bucket
|
solution: bucket
|
||||||
|
- type: SolutionItemStatus
|
||||||
|
solution: bucket
|
||||||
- type: Appearance
|
- type: Appearance
|
||||||
- type: SolutionContainerVisuals
|
- type: SolutionContainerVisuals
|
||||||
maxFillLevels: 3
|
maxFillLevels: 3
|
||||||
|
|||||||
@@ -12,6 +12,8 @@
|
|||||||
concerningOrangeFore: "#A5762F"
|
concerningOrangeFore: "#A5762F"
|
||||||
dangerousRedFore: "#BB3232"
|
dangerousRedFore: "#BB3232"
|
||||||
disabledFore: "#5A5A5A"
|
disabledFore: "#5A5A5A"
|
||||||
|
_itemstatus_content_margin_right: "#06060404"
|
||||||
|
_itemstatus_content_margin_left: "#04060604"
|
||||||
- type: uiTheme
|
- type: uiTheme
|
||||||
id: SS14PlasmafireTheme
|
id: SS14PlasmafireTheme
|
||||||
path: /Textures/Interface/Plasmafire/
|
path: /Textures/Interface/Plasmafire/
|
||||||
@@ -26,6 +28,8 @@
|
|||||||
concerningOrangeFore: "#FFF5EE"
|
concerningOrangeFore: "#FFF5EE"
|
||||||
dangerousRedFore: "#FFF5EE"
|
dangerousRedFore: "#FFF5EE"
|
||||||
disabledFore: "#FFF5EE"
|
disabledFore: "#FFF5EE"
|
||||||
|
_itemstatus_content_margin_right: "#06060404"
|
||||||
|
_itemstatus_content_margin_left: "#04060604"
|
||||||
- type: uiTheme
|
- type: uiTheme
|
||||||
id: SS14SlimecoreTheme
|
id: SS14SlimecoreTheme
|
||||||
path: /Textures/Interface/Slimecore/
|
path: /Textures/Interface/Slimecore/
|
||||||
@@ -40,6 +44,8 @@
|
|||||||
concerningOrangeFore: "#FFF5EE"
|
concerningOrangeFore: "#FFF5EE"
|
||||||
dangerousRedFore: "#FFF5EE"
|
dangerousRedFore: "#FFF5EE"
|
||||||
disabledFore: "#FFF5EE"
|
disabledFore: "#FFF5EE"
|
||||||
|
_itemstatus_content_margin_right: "#06060404"
|
||||||
|
_itemstatus_content_margin_left: "#04060604"
|
||||||
- type: uiTheme
|
- type: uiTheme
|
||||||
id: SS14ClockworkTheme
|
id: SS14ClockworkTheme
|
||||||
path: /Textures/Interface/Clockwork/
|
path: /Textures/Interface/Clockwork/
|
||||||
@@ -54,6 +60,8 @@
|
|||||||
concerningOrangeFore: "#FFF5EE"
|
concerningOrangeFore: "#FFF5EE"
|
||||||
dangerousRedFore: "#FFF5EE"
|
dangerousRedFore: "#FFF5EE"
|
||||||
disabledFore: "#FFF5EE"
|
disabledFore: "#FFF5EE"
|
||||||
|
_itemstatus_content_margin_right: "#06060404"
|
||||||
|
_itemstatus_content_margin_left: "#04060604"
|
||||||
- type: uiTheme
|
- type: uiTheme
|
||||||
id: SS14RetroTheme
|
id: SS14RetroTheme
|
||||||
path: /Textures/Interface/Retro/
|
path: /Textures/Interface/Retro/
|
||||||
@@ -68,6 +76,8 @@
|
|||||||
concerningOrangeFore: "#FFF5EE"
|
concerningOrangeFore: "#FFF5EE"
|
||||||
dangerousRedFore: "#FFF5EE"
|
dangerousRedFore: "#FFF5EE"
|
||||||
disabledFore: "#FFF5EE"
|
disabledFore: "#FFF5EE"
|
||||||
|
_itemstatus_content_margin_right: "#06060404"
|
||||||
|
_itemstatus_content_margin_left: "#04060604"
|
||||||
- type: uiTheme
|
- type: uiTheme
|
||||||
id: SS14MinimalistTheme
|
id: SS14MinimalistTheme
|
||||||
path: /Textures/Interface/Minimalist/
|
path: /Textures/Interface/Minimalist/
|
||||||
@@ -82,6 +92,8 @@
|
|||||||
concerningOrangeFore: "#A5762F"
|
concerningOrangeFore: "#A5762F"
|
||||||
dangerousRedFore: "#BB3232"
|
dangerousRedFore: "#BB3232"
|
||||||
disabledFore: "#5A5A5A"
|
disabledFore: "#5A5A5A"
|
||||||
|
_itemstatus_content_margin_right: "#06060604"
|
||||||
|
_itemstatus_content_margin_left: "#06060604"
|
||||||
- type: uiTheme
|
- type: uiTheme
|
||||||
id: SS14AshenTheme
|
id: SS14AshenTheme
|
||||||
path: /Textures/Interface/Ashen/
|
path: /Textures/Interface/Ashen/
|
||||||
@@ -96,3 +108,5 @@
|
|||||||
concerningOrangeFore: "#FFF5EE"
|
concerningOrangeFore: "#FFF5EE"
|
||||||
dangerousRedFore: "#FFF5EE"
|
dangerousRedFore: "#FFF5EE"
|
||||||
disabledFore: "#FFF5EE"
|
disabledFore: "#FFF5EE"
|
||||||
|
_itemstatus_content_margin_right: "#06060604"
|
||||||
|
_itemstatus_content_margin_left: "#06060604"
|
||||||
|
|||||||
BIN
Resources/Textures/Interface/Ashen/item_status_left.png
Normal file
|
After Width: | Height: | Size: 255 B |
|
After Width: | Height: | Size: 195 B |
BIN
Resources/Textures/Interface/Ashen/item_status_right.png
Normal file
|
After Width: | Height: | Size: 246 B |
|
After Width: | Height: | Size: 189 B |
BIN
Resources/Textures/Interface/Clockwork/item_status_left.png
Normal file
|
After Width: | Height: | Size: 371 B |
|
After Width: | Height: | Size: 307 B |
BIN
Resources/Textures/Interface/Clockwork/item_status_right.png
Normal file
|
After Width: | Height: | Size: 389 B |
|
After Width: | Height: | Size: 326 B |
BIN
Resources/Textures/Interface/Default/item_status_left.png
Normal file
|
After Width: | Height: | Size: 264 B |
|
After Width: | Height: | Size: 251 B |
BIN
Resources/Textures/Interface/Default/item_status_right.png
Normal file
|
After Width: | Height: | Size: 258 B |
|
After Width: | Height: | Size: 237 B |
BIN
Resources/Textures/Interface/Minimalist/item_status_left.png
Normal file
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 277 B |
BIN
Resources/Textures/Interface/Minimalist/item_status_right.png
Normal file
|
After Width: | Height: | Size: 198 B |
|
After Width: | Height: | Size: 249 B |
@@ -1,100 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="17.700001"
|
|
||||||
height="17.700001"
|
|
||||||
viewBox="0 0 4.6831256 4.6831253"
|
|
||||||
version="1.1"
|
|
||||||
id="svg8"
|
|
||||||
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
|
|
||||||
sodipodi:docname="item_status_left.svg"
|
|
||||||
inkscape:export-filename="C:\ss14\space-station-14\Resources\Textures\Interface\Nano\item_status_left.svg.96dpi.png"
|
|
||||||
inkscape:export-xdpi="96"
|
|
||||||
inkscape:export-ydpi="96">
|
|
||||||
<defs
|
|
||||||
id="defs2" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="45.254834"
|
|
||||||
inkscape:cx="2.2968017"
|
|
||||||
inkscape:cy="9.7979333"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:pagecheckerboard="true"
|
|
||||||
units="px"
|
|
||||||
showguides="true"
|
|
||||||
inkscape:window-width="2560"
|
|
||||||
inkscape:window-height="1377"
|
|
||||||
inkscape:window-x="1912"
|
|
||||||
inkscape:window-y="-8"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:guide-bbox="true"
|
|
||||||
inkscape:snap-intersection-paths="true"
|
|
||||||
inkscape:snap-bbox="true"
|
|
||||||
inkscape:snap-page="true"
|
|
||||||
inkscape:document-rotation="0"
|
|
||||||
fit-margin-top="0"
|
|
||||||
fit-margin-left="0"
|
|
||||||
fit-margin-right="0"
|
|
||||||
fit-margin-bottom="0">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid817"
|
|
||||||
originx="0.44979165"
|
|
||||||
originy="1.5931808" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
|
||||||
id="metadata5">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
transform="translate(-26.372785,-208.49171)">
|
|
||||||
<path
|
|
||||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#474747;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
|
||||||
d="m 45.902791,212.76114 v 3.23047 l 1.003906,1.00195 h 3.228516 v -3.22852 l -1.001953,-1.0039 h -0.05469 z m 0.263672,0.26367 h 2.855469 l 0.849609,0.84961 v 2.85547 h -2.855468 l -0.84961,-0.84961 z"
|
|
||||||
id="rect815-3"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
<path
|
|
||||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#474747;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
|
||||||
d="m 46.344997,207.34832 -0.290893,0.17906 1.133594,1.1102 v 2.91047 h 0.264579 v -3.04271 z"
|
|
||||||
id="rect815-6"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="ccccccc" />
|
|
||||||
<path
|
|
||||||
style="fill:none;stroke:#474747;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="m 38.473823,212.26371 v -3.175 l -1.058333,-1.05833"
|
|
||||||
id="path856-6"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="ccc" />
|
|
||||||
<path
|
|
||||||
id="rect815-9"
|
|
||||||
style="opacity:1;vector-effect:none;fill:#24242b;fill-opacity:0.95;fill-rule:nonzero;stroke:#3a4051;stroke-width:0.449792;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
|
||||||
d="m 26.373445,212.94994 h 3.704167 0.753402 v -1.5875 l -2.870068,-2.64583 h -0.748275 -0.839226"
|
|
||||||
inkscape:export-xdpi="96.000008"
|
|
||||||
inkscape:export-ydpi="96.000008"
|
|
||||||
sodipodi:nodetypes="ccccccc" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 453 B |
@@ -1,100 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="17.700001"
|
|
||||||
height="17.700001"
|
|
||||||
viewBox="0 0 4.6831256 4.6831253"
|
|
||||||
version="1.1"
|
|
||||||
id="svg8"
|
|
||||||
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
|
|
||||||
sodipodi:docname="item_status_middle.svg"
|
|
||||||
inkscape:export-filename="C:\ss14\space-station-14\Resources\Textures\Interface\Nano\item_status_left.svg.96dpi.png"
|
|
||||||
inkscape:export-xdpi="96"
|
|
||||||
inkscape:export-ydpi="96">
|
|
||||||
<defs
|
|
||||||
id="defs2" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="256"
|
|
||||||
inkscape:cx="0.27981532"
|
|
||||||
inkscape:cy="1.9876937"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:pagecheckerboard="true"
|
|
||||||
units="px"
|
|
||||||
showguides="true"
|
|
||||||
inkscape:window-width="2560"
|
|
||||||
inkscape:window-height="1377"
|
|
||||||
inkscape:window-x="1912"
|
|
||||||
inkscape:window-y="-8"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:guide-bbox="true"
|
|
||||||
inkscape:snap-intersection-paths="true"
|
|
||||||
inkscape:snap-bbox="true"
|
|
||||||
inkscape:snap-page="true"
|
|
||||||
inkscape:document-rotation="0"
|
|
||||||
fit-margin-top="0"
|
|
||||||
fit-margin-left="0"
|
|
||||||
fit-margin-right="0"
|
|
||||||
fit-margin-bottom="0">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid817"
|
|
||||||
originx="0.44979165"
|
|
||||||
originy="1.5931808" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
|
||||||
id="metadata5">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
transform="translate(-26.372785,-208.49171)">
|
|
||||||
<path
|
|
||||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#474747;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
|
||||||
d="m 45.902791,212.76114 v 3.23047 l 1.003906,1.00195 h 3.228516 v -3.22852 l -1.001953,-1.0039 h -0.05469 z m 0.263672,0.26367 h 2.855469 l 0.849609,0.84961 v 2.85547 h -2.855468 l -0.84961,-0.84961 z"
|
|
||||||
id="rect815-3"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
<path
|
|
||||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#474747;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
|
||||||
d="m 46.344997,207.34832 -0.290893,0.17906 1.133594,1.1102 v 2.91047 h 0.264579 v -3.04271 z"
|
|
||||||
id="rect815-6"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="ccccccc" />
|
|
||||||
<path
|
|
||||||
style="fill:none;stroke:#474747;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="m 38.473823,212.26371 v -3.175 l -1.058333,-1.05833"
|
|
||||||
id="path856-6"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="ccc" />
|
|
||||||
<path
|
|
||||||
id="rect815-9"
|
|
||||||
style="opacity:1;vector-effect:none;fill:#24242b;fill-opacity:0.95;fill-rule:nonzero;stroke:#3a4051;stroke-width:0.449792;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
|
||||||
d="m 26.598004,212.94994 h 3.479608 0.753402 v -1.5875 l -2.870068,-2.64583 h -0.748275 -0.614667 z"
|
|
||||||
inkscape:export-xdpi="96.000008"
|
|
||||||
inkscape:export-ydpi="96.000008"
|
|
||||||
sodipodi:nodetypes="cccccccc" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 458 B |
@@ -1,100 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="17.700001"
|
|
||||||
height="17.700001"
|
|
||||||
viewBox="0 0 4.6831256 4.6831253"
|
|
||||||
version="1.1"
|
|
||||||
id="svg8"
|
|
||||||
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
|
|
||||||
sodipodi:docname="item_status_right.svg"
|
|
||||||
inkscape:export-filename="C:\ss14\space-station-14\Resources\Textures\Interface\Nano\item_status_right.svg.96dpi.png"
|
|
||||||
inkscape:export-xdpi="96"
|
|
||||||
inkscape:export-ydpi="96">
|
|
||||||
<defs
|
|
||||||
id="defs2" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
id="base"
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1.0"
|
|
||||||
inkscape:pageopacity="0.0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:zoom="45.254834"
|
|
||||||
inkscape:cx="2.2968017"
|
|
||||||
inkscape:cy="9.7979333"
|
|
||||||
inkscape:document-units="px"
|
|
||||||
inkscape:current-layer="layer1"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:pagecheckerboard="true"
|
|
||||||
units="px"
|
|
||||||
showguides="true"
|
|
||||||
inkscape:window-width="2560"
|
|
||||||
inkscape:window-height="1377"
|
|
||||||
inkscape:window-x="1912"
|
|
||||||
inkscape:window-y="-8"
|
|
||||||
inkscape:window-maximized="1"
|
|
||||||
inkscape:guide-bbox="true"
|
|
||||||
inkscape:snap-intersection-paths="true"
|
|
||||||
inkscape:snap-bbox="true"
|
|
||||||
inkscape:snap-page="true"
|
|
||||||
inkscape:document-rotation="0"
|
|
||||||
fit-margin-top="0"
|
|
||||||
fit-margin-left="0"
|
|
||||||
fit-margin-right="0"
|
|
||||||
fit-margin-bottom="0">
|
|
||||||
<inkscape:grid
|
|
||||||
type="xygrid"
|
|
||||||
id="grid817"
|
|
||||||
originx="0.44979165"
|
|
||||||
originy="1.5931808" />
|
|
||||||
</sodipodi:namedview>
|
|
||||||
<metadata
|
|
||||||
id="metadata5">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<g
|
|
||||||
inkscape:label="Layer 1"
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer1"
|
|
||||||
transform="translate(-26.372785,-208.49171)">
|
|
||||||
<path
|
|
||||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#474747;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
|
||||||
d="m 45.902791,212.76114 v 3.23047 l 1.003906,1.00195 h 3.228516 v -3.22852 l -1.001953,-1.0039 h -0.05469 z m 0.263672,0.26367 h 2.855469 l 0.849609,0.84961 v 2.85547 h -2.855468 l -0.84961,-0.84961 z"
|
|
||||||
id="rect815-3"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
<path
|
|
||||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#474747;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
|
||||||
d="m 46.344997,207.34832 -0.290893,0.17906 1.133594,1.1102 v 2.91047 h 0.264579 v -3.04271 z"
|
|
||||||
id="rect815-6"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="ccccccc" />
|
|
||||||
<path
|
|
||||||
style="fill:none;stroke:#474747;stroke-width:0.529167;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="m 38.473823,212.26371 v -3.175 l -1.058333,-1.05833"
|
|
||||||
id="path856-6"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
sodipodi:nodetypes="ccc" />
|
|
||||||
<path
|
|
||||||
id="rect815-9"
|
|
||||||
style="opacity:1;vector-effect:none;fill:#24242b;fill-opacity:0.95;fill-rule:nonzero;stroke:#3a4051;stroke-width:0.449792;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
|
||||||
d="m 31.05591,212.94994 h -3.704167 -0.753402 v -1.5875 l 2.870068,-2.64583 h 0.748275 0.839226"
|
|
||||||
inkscape:export-xdpi="96.000008"
|
|
||||||
inkscape:export-ydpi="96.000008"
|
|
||||||
sodipodi:nodetypes="ccccccc" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 431 B |
BIN
Resources/Textures/Interface/Plasmafire/item_status_left.png
Normal file
|
After Width: | Height: | Size: 271 B |
|
After Width: | Height: | Size: 220 B |
BIN
Resources/Textures/Interface/Plasmafire/item_status_right.png
Normal file
|
After Width: | Height: | Size: 271 B |
|
After Width: | Height: | Size: 206 B |
BIN
Resources/Textures/Interface/Retro/item_status_left.png
Normal file
|
After Width: | Height: | Size: 249 B |
|
After Width: | Height: | Size: 235 B |
BIN
Resources/Textures/Interface/Retro/item_status_right.png
Normal file
|
After Width: | Height: | Size: 239 B |
|
After Width: | Height: | Size: 253 B |
BIN
Resources/Textures/Interface/Slimecore/item_status_left.png
Normal file
|
After Width: | Height: | Size: 280 B |
|
After Width: | Height: | Size: 219 B |
BIN
Resources/Textures/Interface/Slimecore/item_status_right.png
Normal file
|
After Width: | Height: | Size: 267 B |
|
After Width: | Height: | Size: 206 B |