From e72e25aba1953e4a267ee64b336d39c11dd5aea8 Mon Sep 17 00:00:00 2001 From: Wolfkey-SomeoneElseTookMyUsername Date: Wed, 21 May 2025 21:18:57 -0500 Subject: [PATCH] Add disposal signalers (#37535) * Add disposal signalers * Sprite changes * Some requested changes * Requested changes + change spelling to be with two l's to be consistent with the remote signaller --- .../Tube/DisposalSignallerComponent.cs | 14 +++++ .../Disposal/Tube/DisposalSignallerSystem.cs | 25 +++++++++ .../machine-linking/transmitter_ports.ftl | 3 + .../Prototypes/DeviceLinking/source_ports.yml | 6 ++ .../Structures/Piping/Disposal/pipes.yml | 37 +++++++++++++ .../Graphs/utilities/disposal_pipes.yml | 22 ++++++++ .../Recipes/Construction/utilities.yml | 9 +++ .../Piping/disposal.rsi/conpipe-signaller.png | Bin 0 -> 3795 bytes .../Structures/Piping/disposal.rsi/meta.json | 52 +++++++++++++++++- .../Piping/disposal.rsi/pipe-signaller.png | Bin 0 -> 5611 bytes 10 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 Content.Server/Disposal/Tube/DisposalSignallerComponent.cs create mode 100644 Content.Server/Disposal/Tube/DisposalSignallerSystem.cs create mode 100644 Resources/Textures/Structures/Piping/disposal.rsi/conpipe-signaller.png create mode 100644 Resources/Textures/Structures/Piping/disposal.rsi/pipe-signaller.png diff --git a/Content.Server/Disposal/Tube/DisposalSignallerComponent.cs b/Content.Server/Disposal/Tube/DisposalSignallerComponent.cs new file mode 100644 index 0000000000..ff13a942dc --- /dev/null +++ b/Content.Server/Disposal/Tube/DisposalSignallerComponent.cs @@ -0,0 +1,14 @@ +using Content.Shared.DeviceLinking; +using Robust.Shared.Prototypes; + +namespace Content.Server.Disposal.Tube; + +/// +/// Disposal pipes with this component can be linked with devices to send a signal every time an item goes through the pipe +/// +[RegisterComponent, Access(typeof(DisposalSignallerSystem))] +public sealed partial class DisposalSignallerComponent : Component +{ + [DataField] + public ProtoId Port = "ItemDetected"; +} diff --git a/Content.Server/Disposal/Tube/DisposalSignallerSystem.cs b/Content.Server/Disposal/Tube/DisposalSignallerSystem.cs new file mode 100644 index 0000000000..76c3c47ab4 --- /dev/null +++ b/Content.Server/Disposal/Tube/DisposalSignallerSystem.cs @@ -0,0 +1,25 @@ +using Content.Server.DeviceLinking.Systems; + +namespace Content.Server.Disposal.Tube; + +public sealed class DisposalSignallerSystem : EntitySystem +{ + [Dependency] private readonly DeviceLinkSystem _link = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnGetNextDirection, after: new[] { typeof(DisposalTubeSystem) }); + } + + private void OnInit(EntityUid uid, DisposalSignallerComponent comp, ComponentInit args) + { + _link.EnsureSourcePorts(uid, comp.Port); + } + + private void OnGetNextDirection(EntityUid uid, DisposalSignallerComponent comp, ref GetDisposalsNextDirectionEvent args) + { + _link.InvokePort(uid, comp.Port); + } +} diff --git a/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl b/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl index 1d879fcee9..89a978479e 100644 --- a/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl +++ b/Resources/Locale/en-US/machine-linking/transmitter_ports.ftl @@ -69,3 +69,6 @@ signal-port-description-power-charging = This port is invoked with HIGH when the signal-port-name-power-discharging = Discharging signal-port-description-power-discharging = This port is invoked with HIGH when the battery is losing charge and LOW when not. + +signal-port-name-item-detected = Detected +signal-port-description-item-detected = This port is invoked whenever the transmitter detects an item. diff --git a/Resources/Prototypes/DeviceLinking/source_ports.yml b/Resources/Prototypes/DeviceLinking/source_ports.yml index ae7fb31408..4a460e722d 100644 --- a/Resources/Prototypes/DeviceLinking/source_ports.yml +++ b/Resources/Prototypes/DeviceLinking/source_ports.yml @@ -156,3 +156,9 @@ id: PowerDischarging name: signal-port-name-power-discharging description: signal-port-description-power-discharging + +- type: sourcePort + id: ItemDetected + name: signal-port-name-item-detected + description: signal-port-description-item-detected + defaultLinks: [ Toggle, Trigger, Timer ] diff --git a/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml b/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml index bb7b08cc2c..839247fc3f 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml @@ -151,6 +151,43 @@ containers: - DisposalTagger +- type: entity + id: DisposalSignaller + parent: DisposalPipeBase + name: disposal signaller + description: A pipe that emits a signal when in item goes through it. + components: + - type: Sprite + layers: + - map: [ "pipe" ] + state: conpipe-signaller + - type: DisposalTube + containerId: DisposalTransit + - type: DisposalTransit + - type: DeviceNetwork + deviceNetId: Wireless + receiveFrequencyId: BasicDevice + - type: DeviceLinkSource + ports: + - ItemDetected + - type: WirelessNetworkConnection + range: 200 + - type: DisposalSignaller + - type: ContainerContainer + containers: + DisposalTransit: !type:Container + - type: GenericVisualizer + visuals: + enum.DisposalTubeVisuals.VisualState: + pipe: + Free: { state: conpipe-signaller } + Anchored: { state: pipe-signaller } + - type: Construction + graph: DisposalPipe + node: pipe + containers: + - DisposalTransit + - type: entity id: DisposalTrunk parent: DisposalPipeBase diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/disposal_pipes.yml b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/disposal_pipes.yml index 41ec858a1a..83c562fc96 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/disposal_pipes.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/disposal_pipes.yml @@ -14,6 +14,14 @@ - material: Steel amount: 2 doAfter: 1 + - to: signaller + steps: + - material: Steel + amount: 2 + doAfter: 1 + - material: Cable + amount: 1 + doAfter: 1 - to: trunk steps: - material: Steel @@ -108,6 +116,20 @@ steps: - tool: Welding doAfter: 1 + - node: signaller + entity: DisposalSignaller + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: SheetSteel1 + amount: 2 + - !type:SpawnPrototype + prototype: CableApcStack1 # I have no idea why this does not work + - !type:DeleteEntity + steps: + - tool: Welding + doAfter: 1 - node: trunk entity: DisposalTrunk edges: diff --git a/Resources/Prototypes/Recipes/Construction/utilities.yml b/Resources/Prototypes/Recipes/Construction/utilities.yml index 0feffe998d..575ca3ae4e 100644 --- a/Resources/Prototypes/Recipes/Construction/utilities.yml +++ b/Resources/Prototypes/Recipes/Construction/utilities.yml @@ -119,6 +119,15 @@ placementMode: SnapgridCenter canBuildInImpassable: false +- type: construction + id: DisposalSignaller + graph: DisposalPipe + startNode: start + targetNode: signaller + category: construction-category-utilities + placementMode: SnapgridCenter + canBuildInImpassable: false + - type: construction id: DisposalTrunk graph: DisposalPipe diff --git a/Resources/Textures/Structures/Piping/disposal.rsi/conpipe-signaller.png b/Resources/Textures/Structures/Piping/disposal.rsi/conpipe-signaller.png new file mode 100644 index 0000000000000000000000000000000000000000..fe84a8977aec24b3d127f49d1562affcb9f665f8 GIT binary patch literal 3795 zcmV;^4lMDBP)aWF6PdeQ{hI4F$1@wxUIGH_Vw}Z zyYG(6FUK3eo;`bLZf>TxuaCxAv$)#Z%d+Lmxzf|a6K!o=>FJ^M@yF@u>0#00#a!*} zrE%6Q;y7mS-o5|JY2U@(y?cq{xWc_?@nU*LI7g3R+4AKT?%uvWnwy*1vuDq^{g1mk zt5>hK*=!ciQ8-?TY&J{A_euLc*=!ae1f^1md_GSQ1QZGd;y9*MDv`_OICJLALuo)u zON*_mt0R?4;W!Td2yZ5nA(cvDttAKoiiHCCLV+L%h{Fjb@ii0*1tMz@ zQq|n`xYP)+7O5Okeuhsz{cH^X?>_i|?c28_xA3S)FXP$XxLjBe(04WthjK8nz>gzxxD>hk3WNAsI zQ#G|$s&?(0kPR?#JZ`hPx-3!%CU5$Q5lp4Lnk=@MAa~6Iuv%m7_=csft{$Vu7u19x z1hZz%CS8Md*IG|V`)WR`gp?@HtNN{DT?ZZOI;wv2v-P-My5<4Y0&6W+NaQ`LeLw!u zcY<0_yA4oo)xy=4|Zi)%WwI&E5a2*#R?oRAM{K*#hDFooUNac>( zE{sA-g%V7%74ZEujypcT(Gez!YVNuAV-QiLT5TuVD(csEqK*8>@74;UIGT_e)`GAY z0C$hR2k}Q?5u<+!0o*4BP*%awFj^z5nRGuO3XAA_jO+dQbr@nzZC)Tu=ol0=ov#D^ z*C`b9lj;Wm6pKYn4SfnB5kG|=AfP6-HbAKqPP!j3lnZJSs&t$QnV*^kptY{4U8z_C z#N;Y~5ZoFVz;(TGn_6osH^y2pq4P=z!S?OjS-Ny7`H=`r`LlHCQrb6e03nFt+6Pbz zthE&KdBReWwU4iPApfu0*AteC*a-+=LPpS-#JK%t=T3h2!3S0EfBoVM^!N29UZ4<6 zrZa4fMhb~GhC+~|{pq!1+B~;uJwd(zMwc%SHK8T}C?zpEzH0=9VCTQQLhjZL+|0D( zq9i4b>k(-?##%otjI}7wBjq}Ho`>T&Y})X56bpG~%xFY94q9sjf;f&QWCLp60%1N! zU+-05L>sh02F(~H6nEHKOLup| zefI2GQmGV2j~+!z$)Q7sFvf7?$Ptv|aPs6y(&;o^KX&8$KBfkb@MoVIo5B>PFoh{h zVG2{2!cU2pUV2IF+O=!inl)>tx3#s+JaFJZB+#Xu4l6jBh!F@pmG zbYJeqaZ|Lkv~X*1Q1=-TI>nkbYY=Unr+xfPhRav3 zpp@dwnKR65YN}c$&-0A6me$r*ip3(r8m7;l%Og$ml9HEE1s6gHwANT_M

Ek~9fJ z7)hX7Ylx!|j3$agI?i4M;ozlR9((LD1_uTz{0=}I$JTXS)~{brsZ=7wQkTtOVh7iC z@w0V&ccydXFSfD(qpzQ%zl9Jyvtd1P2(Fhx2#KFck;-IPw{9I*E?=$^Komt*DaEN% zr+D(oCn@FwS|4w#XtTAJLx&Dk+TWW2zV}%O!L#k_iJ}q$!S;Vz!@qs}F@7dPM@L81 z0wfwRvI5_H^9}9o?N}YrG;cnI;0|#d^OyhZpsVXr<<4IVthM~(uU{mStxIf#l4LR& zjvYJ3{Q2{%_O9!?2B5vY9UaHmI3$ztlZhI`NBj5F)zvj2{y$pF=4UtHx*n;NOUm=e zW-@HtxRFa;T@`)_uwdRiBZXkgmMvs58Du%&VJ*l1noQnLr^%$#WPCsQqg2+v z&bz;j`gC`9^V#9gvBqGn!BL8AHp}MCo0AOcC(;H6c~?CE<(Giq)mL9(`t+Ii?RX-H3PUtDq$x*lw`|!0z^aui zE30t6v(o~6{`u#XNb|r@5!Y{cX#U%`2l?>Bk0>V#4j(>T^?tMf%;Cd_34)*^G3B}s zOmmkdKe|$5G{i_YIXh!Eetjdx7=j?+v(G-mT1$O>eN}sFt$FUb=Lo|PEX;l65u|cz zWQ?&JH*Ta@C?q+4EXElA;TP-BTGQR# zJ%*%QmXaU+<4C}A`SRtw^76|`&7cxkV<;91w70i&sjCZXtpxO_|JgtM;SaR8w-alf zq`8IQg{@oo_fI~ZF#ob;OWE-EZ6K1u4r49(e7FMp2fF7M1Gslk~S8Z)=l){iw zDPnjyhsE-%Uu@v3W1@1zjF$4f5-(%hwr!Nc5J(JnDU1-sA}3FtWL{GfTI(tSSYyn( zb?a0F_Kh2o+MiL!?ESx?9O!({U6 z%H_*MVOT8yYprc*X`wuTgNF{$wx&5rNlV4rCt46fVzdTpP@aeDrIE_52u3MY8DxKd zKgJl8Qe5lnMQcqim!q|{mBE1lT-O~F**lN-j73Zr9U18bjnf>b(% zu$IO-b8+0HXv%Xv;;2L+$Pom?D2fnHOc;e21mAx9E%Tb1a2%(4 z3kV_X>C>lKx_A+ef~5LlQ zi7-ZR>f%M_%$^NnlQOoYrG;q3^}c%L3NsrUaU2I*3UM7poC|SXhp?C@3>A)YkO)eJ zJaJS4V=%@Nh9wGx0zyb)3!SIWW39m=Xl-rfMzT1vN&r`Sdd#DbK1v+N+#0ye;I01} zaVzf~=GY=Mn^aI*z}Q3uD$i01BcwD~i?E%O>IRwVTq#u{z4F$Rl?w61TQIa6G?aFK?FhRR;4 z4C1}_-V5G-`|V7WoSXA>90kg8jgrzBW2}_Y2qEl<+iYgfo^8JV)1M}k`&zYX)m5!^ z`i(c@mrd-qoOD;iK&SGUL*V~sJUP$=BFa^=e8RyhIXd;ZRm+WyhV zX0wZwQdVnigb>#EGehS)FHG7PM#neq$3KNBOkoOBn8MEx{|%t_-o{87PO|_2002ov JPDHLkV1ht>LrMSu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Piping/disposal.rsi/meta.json b/Resources/Textures/Structures/Piping/disposal.rsi/meta.json index 7fce39e694..55d687bc2e 100644 --- a/Resources/Textures/Structures/Piping/disposal.rsi/meta.json +++ b/Resources/Textures/Structures/Piping/disposal.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "https://github.com/discordia-space/CEV-Eris/blob/bbe32606902c90f5290b57d905a3f31b84dc6d7d/icons/obj/pipes/disposal.dmi and modified by DrSmugleaf. Signal router sprites based on normal router modified by deltanedas (github). disposal bins by EmoGarbage404 (github). pipe-x pipe-xf, conpipe-x by K-Dynamic (github).", + "copyright": "https://github.com/discordia-space/CEV-Eris/blob/bbe32606902c90f5290b57d905a3f31b84dc6d7d/icons/obj/pipes/disposal.dmi and modified by DrSmugleaf. Signal router sprites based on normal router modified by deltanedas (github). disposal bins by EmoGarbage404 (github). pipe-x pipe-xf, conpipe-x by K-Dynamic (github). Signaler sprites based on tagger modified by Wolfkey", "states": [ { "name": "condisposal", @@ -51,6 +51,10 @@ "name": "conpipe-tagger", "directions": 4 }, + { + "name": "conpipe-signaller", + "directions": 4 + }, { "name": "conpipe-y", "directions": 4 @@ -323,6 +327,52 @@ "name": "pipe-tagger-partial", "directions": 4 }, + { + "name": "pipe-signaller", + "directions": 4, + "delays": [ + [ + 0.1, + 0.141, + 0.1, + 0.141, + 0.1, + 0.141, + 0.1, + 0.141 + ], + [ + 0.1, + 0.141, + 0.1, + 0.141, + 0.1, + 0.141, + 0.1, + 0.141 + ], + [ + 0.1, + 0.141, + 0.1, + 0.141, + 0.1, + 0.141, + 0.1, + 0.141 + ], + [ + 0.1, + 0.141, + 0.1, + 0.141, + 0.1, + 0.141, + 0.1, + 0.141 + ] + ] + }, { "name": "pipe-tf", "directions": 4 diff --git a/Resources/Textures/Structures/Piping/disposal.rsi/pipe-signaller.png b/Resources/Textures/Structures/Piping/disposal.rsi/pipe-signaller.png new file mode 100644 index 0000000000000000000000000000000000000000..76b177234b58180d390a8b58e8ee1cad99128374 GIT binary patch literal 5611 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 Tc0k(n7GR`rqWAHd!_)r&G-;AA literal 0 HcmV?d00001 -- 2.51.2