--- /dev/null
+namespace Content.Shared.ContainerHeld;
+
+[RegisterComponent]
+public sealed partial class ContainerHeldComponent: Component
+{
+ /// <summary>
+ /// The amount of weight needed to be in the container
+ /// in order for it to toggle it's appearance
+ /// to ToggleVisuals.Toggled = true, and
+ /// SetHeldPrefix() to "full" instead of "empty".
+ /// </summary>
+ [DataField("threshold")]
+ public int Threshold { get; private set; } = 1;
+}
--- /dev/null
+using Robust.Shared.Containers;
+
+using Content.Shared.Item;
+using Content.Shared.Storage;
+using Content.Shared.Storage.EntitySystems;
+using Content.Shared.Toggleable;
+
+namespace Content.Shared.ContainerHeld;
+
+public sealed class ContainerHeldSystem : EntitySystem
+{
+ [Dependency] private readonly SharedItemSystem _item = default!;
+ [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
+ [Dependency] private readonly SharedStorageSystem _storage = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent<ContainerHeldComponent, EntInsertedIntoContainerMessage>(OnContainerModified);
+ SubscribeLocalEvent<ContainerHeldComponent, EntRemovedFromContainerMessage>(OnContainerModified);
+ }
+
+ private void OnContainerModified(EntityUid uid, ContainerHeldComponent comp, ContainerModifiedMessage args)
+ {
+ if (!(TryComp<StorageComponent>(uid, out var storage)
+ && TryComp<AppearanceComponent>(uid, out var appearance)
+ && TryComp<ItemComponent>(uid, out var item)))
+ {
+ return;
+ }
+ if (_storage.GetCumulativeItemSizes(uid, storage) >= comp.Threshold)
+ {
+ _item.SetHeldPrefix(uid, "full", item);
+ _appearance.SetData(uid, ToggleVisuals.Toggled, true, appearance);
+ }
+ else
+ {
+ _item.SetHeldPrefix(uid, "empty", item);
+ _appearance.SetData(uid, ToggleVisuals.Toggled, false, appearance);
+ }
+ }
+}
--- /dev/null
+- type: entity
+ name: "candy bucket"
+ parent: BaseItem
+ id: CandyBucket
+ description: A festive bucket for all your treats.
+ components:
+ - type: Sprite
+ sprite: Objects/Fun/candy_bucket.rsi
+ layers:
+ - state: empty_icon
+ map: [ "enum.ToggleVisuals.Layer" ]
+ - type: ContainerHeld
+ threshold: 1
+ - type: Item
+ heldPrefix: empty
+ size: 20
+ - type: Appearance
+ - type: GenericVisualizer
+ visuals:
+ enum.ToggleVisuals.Toggled:
+ enum.ToggleVisuals.Layer:
+ True: {state: full_icon}
+ False: {state: empty_icon}
+ - type: Storage
+ maxItemSize: Small
+ maxTotalWeight: 10
+ whitelist:
+ components:
+ - Pill
+ tags:
+ - FoodSnack
+ - type: ContainerContainer
+ containers:
+ storagebase: !type:Container
+ ents: []
+ - type: UserInterface
+ interfaces:
+ - key: enum.StorageUiKey.Key
+ type: StorageBoundUserInterface
+ # to prevent bag open/honk spam
+ - type: UseDelay
+ delay: 0.5
--- /dev/null
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Made by @ps3moira#9488",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "empty_icon"
+ },
+ {
+ "name": "full_icon"
+ },
+ {
+ "name": "empty-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "empty-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "full-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "full-inhand-left",
+ "directions": 4
+ }
+ ]
+}