From 74f1098008e4cd6e13778a385e3f69712e4833d7 Mon Sep 17 00:00:00 2001
From: Bixkitts <72874643+Bixkitts@users.noreply.github.com>
Date: Tue, 31 Oct 2023 16:54:41 +0100
Subject: [PATCH] Candy Bucket for Halloween (#21257)
* Added candy bucket and component to update appearance of held containers akin to it
* cleanup newline
* newline was load-bearing
* moved component to Shared, cleanup
* newline is spooky
* You build and run without errors, stop pretending otherwise
* Updated for new storage system in master branch
---
.../ContainerHeld/ContainerHeldComponent.cs | 14 ++++++
.../ContainerHeld/ContainerHeldSystem.cs | 43 ++++++++++++++++++
.../Entities/Objects/Fun/candy_bucket.yml | 42 +++++++++++++++++
.../candy_bucket.rsi/empty-inhand-left.png | Bin 0 -> 1001 bytes
.../candy_bucket.rsi/empty-inhand-right.png | Bin 0 -> 992 bytes
.../Fun/candy_bucket.rsi/empty_icon.png | Bin 0 -> 468 bytes
.../Fun/candy_bucket.rsi/full-inhand-left.png | Bin 0 -> 1068 bytes
.../candy_bucket.rsi/full-inhand-right.png | Bin 0 -> 1065 bytes
.../Fun/candy_bucket.rsi/full_icon.png | Bin 0 -> 524 bytes
.../Objects/Fun/candy_bucket.rsi/meta.json | 33 ++++++++++++++
10 files changed, 132 insertions(+)
create mode 100644 Content.Shared/ContainerHeld/ContainerHeldComponent.cs
create mode 100644 Content.Shared/ContainerHeld/ContainerHeldSystem.cs
create mode 100644 Resources/Prototypes/Entities/Objects/Fun/candy_bucket.yml
create mode 100644 Resources/Textures/Objects/Fun/candy_bucket.rsi/empty-inhand-left.png
create mode 100644 Resources/Textures/Objects/Fun/candy_bucket.rsi/empty-inhand-right.png
create mode 100644 Resources/Textures/Objects/Fun/candy_bucket.rsi/empty_icon.png
create mode 100644 Resources/Textures/Objects/Fun/candy_bucket.rsi/full-inhand-left.png
create mode 100644 Resources/Textures/Objects/Fun/candy_bucket.rsi/full-inhand-right.png
create mode 100644 Resources/Textures/Objects/Fun/candy_bucket.rsi/full_icon.png
create mode 100644 Resources/Textures/Objects/Fun/candy_bucket.rsi/meta.json
diff --git a/Content.Shared/ContainerHeld/ContainerHeldComponent.cs b/Content.Shared/ContainerHeld/ContainerHeldComponent.cs
new file mode 100644
index 0000000000..cc6d2bf872
--- /dev/null
+++ b/Content.Shared/ContainerHeld/ContainerHeldComponent.cs
@@ -0,0 +1,14 @@
+namespace Content.Shared.ContainerHeld;
+
+[RegisterComponent]
+public sealed partial class ContainerHeldComponent: Component
+{
+ ///
+ /// 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".
+ ///
+ [DataField("threshold")]
+ public int Threshold { get; private set; } = 1;
+}
diff --git a/Content.Shared/ContainerHeld/ContainerHeldSystem.cs b/Content.Shared/ContainerHeld/ContainerHeldSystem.cs
new file mode 100644
index 0000000000..e0ecfe1992
--- /dev/null
+++ b/Content.Shared/ContainerHeld/ContainerHeldSystem.cs
@@ -0,0 +1,43 @@
+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(OnContainerModified);
+ SubscribeLocalEvent(OnContainerModified);
+ }
+
+ private void OnContainerModified(EntityUid uid, ContainerHeldComponent comp, ContainerModifiedMessage args)
+ {
+ if (!(TryComp(uid, out var storage)
+ && TryComp(uid, out var appearance)
+ && TryComp(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);
+ }
+ }
+}
diff --git a/Resources/Prototypes/Entities/Objects/Fun/candy_bucket.yml b/Resources/Prototypes/Entities/Objects/Fun/candy_bucket.yml
new file mode 100644
index 0000000000..5bdf80f645
--- /dev/null
+++ b/Resources/Prototypes/Entities/Objects/Fun/candy_bucket.yml
@@ -0,0 +1,42 @@
+- 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
diff --git a/Resources/Textures/Objects/Fun/candy_bucket.rsi/empty-inhand-left.png b/Resources/Textures/Objects/Fun/candy_bucket.rsi/empty-inhand-left.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1a487b9eebc2a9116e192a6ce0ea694b65113e2
GIT binary patch
literal 1001
zcmVPx&qe(%EHn*PiU=;L_
zOD~~V^boM894yuGTTu`TBC-c5)?GKK4aA@}GyyAgJ%kO}CT)`Lq$0i_
z1d@HT-@JLdGlzT+AP9mW2!bF8f*=TjAP8bJ_y>b#|J4&_rR$s3bDq@}Q7zee7xPao
zzVxXpk$|a00=D0k#?_-&>AOf=P6hmfLGx*7Hw-m{(dl$q{POWOFfO5A`Hl|{-d3H@
zKNvKJvp;eDeHP6-n{2U{pB5eGyOwPtMBF}x(djgDzgEgVqtj`)eXK6M6T>0giv`NG
z8iAvV-t3dj-T@f^V5k{fc$_R7Gk&rYj7tE3nMXR#KGWBobFCiZ5)3tiu5dTr-+zP9
zHRhYE?#YD-8Zb7=2u#xd_MXnGc((<`{5eyMq`
zOT5F}+t!5M0l8QN`QkI-iw6W104OBAUaX$QSJK3?fUu5HardO#?<6|O@4wSceoV)V9=b9R>8OgP0zyZV^AUivk`Wd5($`YAH(n?
z9T#5xum=zChug<+IszP3rK8rY7fWnqPQ=mao4Rp1$awg#VI1
XM?Px&nn^@KRCt{2nonrcP#nj<9lApu^$&HhvOlq3AU#uGX
z?>A>pcyx~DzZG$#+l2?NBc^(r%m#7#IgBr4k^fdSe8v~DaQe9h$*-SEz0aco4BZY^
zwbw;tYS60=T=W6}6fuXJFVlt&lNY+c@ooS>a$d&hqHL>GAcO;I_i!&h%&vgr-B85b
zZ}lE1Z}_|}043*_q%FL=0K9ou>bR`zAR6H@67+!M-H63SaJ(BM
zK@Xx49?Qy(&fe~@Z{AF=VgF7Ide!x85gUaf+PV(m>Ls6c@9CU`Ogaybvl$(&&9>YB
zKnq(}}gJdQBY|pFyf-(diyNZu1a+s=80{BTfZ
z&L`((tY?c=^;UIajBl^{L&wg}Gs^Y<3wjBHAP9mW2!bF8f*=Tjupwp{*1w%4wmLO$
znjGB=^70oebnF{@3c!9k%T}7zDfwLuHpaKBSHh%Wsq7fdkxQI4s3y!bf(Z{vm$tPn~S-tdeEtpQMK|OvDnRFh}2ybb1O3i1$=%VbH
zPOO=ho{R)N=yW(VJIhp6%ntya4hKep9sscPRk-Vc_Pbty%}=?0i}?wg1El;7sNt0W
O0000Px$j!8s8R9J=Wl(9iC#1UjghhpO+8lo`|2ZtPLbZe+NTmpxn2Ej!f
znsVq*Xvo2#v@y51Rqi+`6U0SHDFd%5p$_Rzf*Rfj9&h;m-tYH)yx;qQL?V&=F}_I-
z#j^=}oK`x%o+zhl*7i2W7I&k6$CKN5Her9>uza}gD5PCH_`b*e#IzR!X0?HN9d3-LX=|2L6cZDW7Wtg;>ZgY4h}J7P*}z
z-iAZR%Iz%CuUV9|c?z+Rt6p&Z1mVyu0G8gSVsyAY-Ne${s6rX-msbW+Ko!a;{?`nA
z7B|c;&3cbaUMHyqM_MMY17P^P{X*AIaChGZplZF4J`yCgAgWNvtj|5fg
z`d1cV7_XzrDSXr3i;Kp>7+w;^q5zF@WmI6S<
z=+Lb9SX>Pd4bNeiT^?Hl&h#hOc_$j1Ct`VQhkGe5kw_$xf58XjcB5r!5-6$w0000<
KMNUMnLSTYi4%nRl
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Fun/candy_bucket.rsi/full-inhand-left.png b/Resources/Textures/Objects/Fun/candy_bucket.rsi/full-inhand-left.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a804cffc5c7e36c6280778dce43672e587b484d
GIT binary patch
literal 1068
zcmV+{1k?M8P)Px&=1D|BRCt{2nm=e8XBftxE3F6Fq{}s6kw51X62Zf92!TteODe0-CB(7m;zce+
z>d*|z;0`xrXsMuHDyURaE6_kpLg^pZn}=8~f|S}0PI84b)V1%DmH
z9hR-wC+m}G>HC|c`%cgMzR!K%X?S0NAP9mW2!bF8f*=TjAc&(77zwhsKDo%6T|cT`
z`&k_mhb7x;G5@LJcR%%9TxGeq+VH*EeXZy<`~0sWFcM^DI>K^sl@0cJ*|SR;n-c`K
zac`In_IX(@t}-(nVQ!ylU?j-05t#+OBHOq(%;p4vJ-ei_!9H(C40wTuh{rD>q{eWe
zM}Y9bW1P>V!6y45e>96)_7OaOsU^LO6JdO#saSk%7Uwf*Tz&g8W|eUssqRB)=f~NI
z%!Y<#0Dz^JP|H5Tom)#t^?i)Le!hY3ov(2JVHT1i0s!W}HxavQJ~!rGJxLK^=_T}!
zhVb~?`v^}xY%AYpw6z0#@(BR-WEYGr1U?%=G#|spgKhk>5X`(oI;h&OE+@WW5_
zq86=fXbA;lVJ{>_L^7pAQbde}z0eX07Om}u`w!DQY^U&~?K72)$n5EQ4QtgJde3&_
zoy$IF?aLVh#X<#MPZv&~>^kuL@6{WRpKEyXmR{<}JAjMeHRTk$@M=BL1!D`vLIu5N
zyYYtaWf*1|PuFYsQ2*U^tZT|CcKT!&hK6Ow1o_Hc?!^O~3;^m$KX0v-;+yFm<@W?Z
z5ClOG1VIo4K@bE%5FN*D2e^~*TFrq=bJWIM{DY_5vBcwQz^~t}2+`?f*RAkQ(5fk1
z4Tw%JvuHksiSj1Qbflvu*!sD+%A(WDY)%kZ`ST33*AD7a?1q~Gfsr7K=3`DP%j1_i
zHr0`ftIXqcL4y^Rm*ipnVSLE#T@`ZW^&%??RToLzq`Q99Spr9(?7&id{Nlf&R`y*MM(yV-6AB94Nsdqxm27WOu**+$%)dg3ZR
m_XO?#-{a`%^PWlgU-A#;mcZy-U}9GQ0000Px&<4Ht8RCt{2nonpWbri?HvuKfQsh7CWp}RYs&>{uLAp{GH6-`IjOWAIVhy}@t
zPCV!#d#HyIdT=4Iy%;bNZ3PRK_28dwZ#`^NDXiG7baf7EG0r$)wSjKfwxP+P!u~vD
zXUMe4rqyXX%KMz=&zs--zL$BwfxHJ01VIo4K@bE%5ClOG1OWiuLt(c2+WD&ktlo7$
z^N;j4d+2|ig!5Mi9OGwmD#?3(%=7Vff5gY0~QSV})OTf5E9z}RD)kIworU9gI`t@Y~0>PY*9t`NBvkZwqWT+m%ZPp!z`hYFC&@KUH6hH9ff=uhFNkJ^&7PT+Zbl4p}i{s-~CX1aLL++mXI(Ks(XN4^L7bLO{_N5TQ`6)se_$9)q;@Nh6Q5_g?t(9XHVj#(31eFnfyTi
z!*{{km}!OC!Oveead&;Eq27i;j7c30zw>?$-lkUne?c!n5ClOG1VIo4K@bE%5I&?{
zhxMqt#9sTW+Z;Uz=F*>D=r}fi2TH(E2U|<`P?*K0m)Wo1u6X(v_r4M^CUr0~tuO#6
zeVk!)9LHkQ%g(@reebX^(+V3cZ6da)A~wBzv?Y*@%j{D8X=f(j`*+^OmtWk%hhNPg
zBC8lJZ6eSmxTZ0@Bpa8R?OTw7)h@M%!x>EzV0T+9IST+F&%KG*qKeIzZ=n*pjgZ)e
zO3p&haKtN3E_#L|sN^h!#5M%F1gF>U6$jb_7T*rzg-=%;5t;G%JqhxfO3recoSE@?
z0Kg}~2cE6}*g?hAI=5#CdWBZc1ntJ2SGbm4JCyaCCZKl8qW1MmrgUe1z&<|=u4UJt
zB_#Ae)RIi;&=Qho>o-k+VU}Eh+sV)p5|Sw$?Zy_kdw-!DcCO0*)T6gqhB+BCq$2oSMsoLcq0M2k6Mxs0bAUg4rXTJ8m
j&~eWT*#4>4?=gP^%elKs`65V800000NkvXXu0mjfgE##g
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Fun/candy_bucket.rsi/full_icon.png b/Resources/Textures/Objects/Fun/candy_bucket.rsi/full_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..673d50f6ec7b9c7ebcda588955faeba2aee22ff8
GIT binary patch
literal 524
zcmV+n0`vWeP)Px$#z{m$R9J=Wlrd-%Q5eU6C(Lm+_81P`jyX5*ZQg{CH^Pzqe!{EcJI1ax&1-|DCbhg
zgwhY!wWE1|mE`oO@JqHR=Tc%Uu8Wwj2K)@
zWf?!Eq22n#m4y=G{sqiC&k39jA|r-Wz0hrPY*S23nE=$>CV{iT;*)n2<9GS-@e$Ge
zCEl+)7*-5`SI>O1Fa4hNLw6uyp6-fQycWp^6WmHcqUJUa<@e%b
zSOdSrJ%5izy+fhsl1b~`SfS_w;AwKR7rFzl-yWQ-T5FS^waBD(3@b*V=wetgGHIRs
ztVOlfK9t`JDZ7qsimmN{Z{Gt3hoj8gNOWV5mpvNw4tivO^JfP_-M_Q}fH`YOj9)$&
zw2IfFQSUG~9OY`_44%Ko)^@P$(4t1wR2@o}__0;Yf=B
O0000