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