From bc88447ee979e96e5cff80b98e8bde703cea9c15 Mon Sep 17 00:00:00 2001 From: ScarKy0 Date: Thu, 5 Sep 2024 17:25:37 +0200 Subject: [PATCH 01/25] Boom! Emergency access! --- .../StationAi/StationAiSystem.Airlock.cs | 19 ++++++++++++++++++ .../Doors/Components/AirlockComponent.cs | 13 ++++++++++++ .../Doors/Systems/SharedAirlockSystem.cs | 13 +++++++++++- .../Doors/Systems/SharedDoorSystem.Bolts.cs | 2 +- .../SharedStationAiSystem.Airlock.cs | 13 ++++++++++++ .../StationAi/SharedStationAiSystem.cs | 1 + .../Audio/Machines/airlock_emergencyoff.ogg | Bin 0 -> 8107 bytes .../Audio/Machines/airlock_emergencyon.ogg | Bin 0 -> 11642 bytes 8 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 Resources/Audio/Machines/airlock_emergencyoff.ogg create mode 100644 Resources/Audio/Machines/airlock_emergencyon.ogg diff --git a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs index bf6b65a9697b5a..f3d2b96352fd86 100644 --- a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs +++ b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs @@ -1,4 +1,5 @@ using Content.Shared.Doors.Components; + using Content.Shared.Silicons.StationAi; using Robust.Shared.Utility; @@ -9,6 +10,7 @@ public sealed partial class StationAiSystem private void InitializeAirlock() { SubscribeLocalEvent(OnDoorBoltGetRadial); + SubscribeLocalEvent(OnEmergencyAccessGetRadial); } private void OnDoorBoltGetRadial(Entity ent, ref GetStationAiRadialEvent args) @@ -27,4 +29,21 @@ private void OnDoorBoltGetRadial(Entity ent, ref GetStationAi } }); } + + private void OnEmergencyAccessGetRadial(Entity ent, ref GetStationAiRadialEvent args) + { + args.Actions.Add(new StationAiRadial() + { + Sprite = ent.Comp.EmergencyAccess ? + new SpriteSpecifier.Rsi( + new ResPath("/Textures/Structures/Doors/Airlocks/Standard/basic.rsi"), "open") : + new SpriteSpecifier.Rsi( + new ResPath("/Textures/Structures/Doors/Airlocks/Standard/basic.rsi"), "closed"), + Tooltip = ent.Comp.EmergencyAccess ? Loc.GetString("bolt-open") : Loc.GetString("bolt-close"), + Event = new StationAiEmergencyAccessEvent() + { + EmergencyAccess = !ent.Comp.EmergencyAccess, + } + }); + } } diff --git a/Content.Shared/Doors/Components/AirlockComponent.cs b/Content.Shared/Doors/Components/AirlockComponent.cs index b2fa7574f76f51..29ed139e3b142e 100644 --- a/Content.Shared/Doors/Components/AirlockComponent.cs +++ b/Content.Shared/Doors/Components/AirlockComponent.cs @@ -1,5 +1,6 @@ using Content.Shared.DeviceLinking; using Content.Shared.Doors.Systems; +using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -23,6 +24,18 @@ public sealed partial class AirlockComponent : Component [ViewVariables(VVAccess.ReadWrite)] [DataField, AutoNetworkedField] public bool EmergencyAccess = false; + + /// + /// Sound to play when the airlock emergency access is turned on. + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public SoundSpecifier EmergencyOnSound = new SoundPathSpecifier("/Audio/Machines/airlock_emergencyon.ogg"); + + /// + /// Sound to play when the airlock emergency access is turned off. + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public SoundSpecifier EmergencyOffSound = new SoundPathSpecifier("/Audio/Machines/airlock_emergencyoff.ogg"); /// /// Pry modifier for a powered airlock. diff --git a/Content.Shared/Doors/Systems/SharedAirlockSystem.cs b/Content.Shared/Doors/Systems/SharedAirlockSystem.cs index 5a6d45d9ec0b08..34d1cc7941830f 100644 --- a/Content.Shared/Doors/Systems/SharedAirlockSystem.cs +++ b/Content.Shared/Doors/Systems/SharedAirlockSystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Doors.Components; +using Robust.Shared.Audio.Systems; using Content.Shared.Popups; using Content.Shared.Prying.Components; using Content.Shared.Wires; @@ -11,6 +12,7 @@ public abstract class SharedAirlockSystem : EntitySystem [Dependency] protected readonly SharedDoorSystem DoorSystem = default!; [Dependency] protected readonly SharedPopupSystem Popup = default!; [Dependency] private readonly SharedWiresSystem _wiresSystem = default!; + [Dependency] protected readonly SharedAudioSystem Audio = default!; public override void Initialize() { @@ -123,11 +125,20 @@ public void UpdateEmergencyLightStatus(EntityUid uid, AirlockComponent component Appearance.SetData(uid, DoorVisuals.EmergencyLights, component.EmergencyAccess); } - public void ToggleEmergencyAccess(EntityUid uid, AirlockComponent component) + public void ToggleEmergencyAccess(EntityUid uid, AirlockComponent component, EntityUid? user = null, bool predicted = false) { + if(!component.Powered) + return; + component.EmergencyAccess = !component.EmergencyAccess; Dirty(uid, component); // This only runs on the server apparently so we need this. UpdateEmergencyLightStatus(uid, component); + + var sound = component.EmergencyAccess ? component.EmergencyOnSound : component.EmergencyOffSound; + if (predicted) + Audio.PlayPredicted(sound, uid, user: user); + else + Audio.PlayPvs(sound, uid); } public void SetAutoCloseDelayModifier(AirlockComponent component, float value) diff --git a/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs b/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs index 35681bfd822931..dc4dfdec2c96de 100644 --- a/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs +++ b/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs @@ -77,7 +77,7 @@ public void SetBoltLightsEnabled(Entity ent, bool value) public void SetBoltsDown(Entity ent, bool value, EntityUid? user = null, bool predicted = false) { - if (ent.Comp.BoltsDown == value) + if (ent.Comp.BoltsDown == value || !ent.Comp.Powered) return; ent.Comp.BoltsDown = value; diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs index ff6fc1ece07967..50a8b5834beab4 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs @@ -10,12 +10,19 @@ public abstract partial class SharedStationAiSystem private void InitializeAirlock() { SubscribeLocalEvent(OnAirlockBolt); + SubscribeLocalEvent(OnAirlockEmergencyAccess); } private void OnAirlockBolt(EntityUid ent, DoorBoltComponent component, StationAiBoltEvent args) { _doors.SetBoltsDown((ent, component), args.Bolted, args.User, predicted: true); } + + private void OnAirlockEmergencyAccess(EntityUid ent, AirlockComponent component, StationAiEmergencyAccessEvent args) + { + _airlocks.ToggleEmergencyAccess(ent, component, predicted = true); + //_doors.SetBoltsDown((ent, component), args.Bolted, args.User, predicted: true); + } } [Serializable, NetSerializable] @@ -23,3 +30,9 @@ public sealed class StationAiBoltEvent : BaseStationAiAction { public bool Bolted; } + +[Serializable, NetSerializable] +public sealed class StationAiEmergencyAccessEvent : BaseStationAiAction +{ + public bool EmergencyAccess; +} diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs index 17c592879c8f99..aa55a091cd11cf 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs @@ -34,6 +34,7 @@ public abstract partial class SharedStationAiSystem : EntitySystem [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedContainerSystem _containers = default!; [Dependency] private readonly SharedDoorSystem _doors = default!; + [Dependency] private readonly SharedAirlockSystem _airlocks = default!; [Dependency] private readonly SharedEyeSystem _eye = default!; [Dependency] protected readonly SharedMapSystem Maps = default!; [Dependency] private readonly SharedMindSystem _mind = default!; diff --git a/Resources/Audio/Machines/airlock_emergencyoff.ogg b/Resources/Audio/Machines/airlock_emergencyoff.ogg new file mode 100644 index 0000000000000000000000000000000000000000..137a1eed4a2d6eebb2a4ecb4af4d0980e2b66510 GIT binary patch literal 8107 zcmeHMd0bOh_P>u1NZ1SzVt{~QlLWyM2pB+X08xT~BrF2TlvP30BHLhFohO?Cfk8wJ zi%w({A~>J~_i1Dk6%hpYs=?jbX=ywC6a^dPJvXq%K~Qxskm&Eip>NfGuLXxw^T!E^+0vIg*s*oTRj^8`%L{ zbJH?E+`1)YYc`jd*&5!Itw|pyr(`Y*PRLF2bY1MenCI$B%riSXMxOoU`uRs;hywk2 z!R$eNtTGZI8ba~*T%&y(MBJ9@!<_B1>Oi72=vpGHE*WGdmGOpt&e;59GlaAe&Y@N` zJrivj_1egEtjLsmrG*NPuysqtYAh-)~E~9Gp!G^W?>6j+mCmzk# z*%*@BdDT4THriS=KJscL6&81Bp=1IQHnqx@Th%0L-LUCcT77To(cUdrjyqpDZlLJ` z3ZPA_2FcUvTK~_pA*LqfKR?3MVJ9R6EH7?jUEF3LAhExg>8z_kco>09g%an%O#Z4Y z{>7}N@T|&Saj81^>feIr{VW7R><9^Ytif%pOMr&NWg^pKZPv0|Ss}Lo3IdUTpLS{V z1vX-Ha6`=|oZ?=Ypn(O4X_<#9{syz0po8@A6L#HL-M3f0jOw1s+v)Wa7fK@P9Z$E* z>NOJFJZkvpzZ2b%fw2BRVK1n8G`y-v6NPBe^- z8LNBNcA5^QlInU#<>`po`R3H3{dWzc7rdrmM9JOy^wZQhD7{W@`0^^1p#55Xgdn$s z+svVZ`RpAPI*D|fR-1j+*?%o5t(u$H|0)m%DR&~VtVHc zX4Y&T-pYB$atIT#^{RLrSf%|B%aL;`9tkS!L{;`NRSUP*Y%Hm3uRZj#y;1L1mXlg~ zL{@r4TKZgC!6~UpE2&eQZrptN*sC-D@%hDaR%P151C|qzY5$JpsCX=Yu%_eAA>YpK zaoIQknjJ9zT>&7Zsx(-wIY-12mm3m~8xohuh-LrYVxaW~KV*Ur!0t!L9HA%8t&<-a znIu+vmH4JoL<6kB_1-TVn%0-?uC!Yz`m0U&2u)il8xs}LCm+RbvdW6sQ{I^z=WHZvaU(&KH_46PgChR)1R#jQC=0 zc;==7M&l9KIDd{8a8bDj2>IYietY^Cyu=>Zns;~!`60rHkl)Vfzcc(7f&YjAs5oW> zFT?M!%_1#afT7)wg;i|PG#^ijnO>S_5p1fCW-Ogor#tbpb%2BYhM#A>bY3g9l0WZ| z?zMunUt&na-VP0ipmQM6@chEhdJPMi4mNG2ju&pyS~^jf*2hm!{OiTx2;rD6!jb7^ z;V)}y3N%4TP?a15@kL-&3Wo5Mm_xbE{C7&fM{f-&Y)kp&KExs)U>2E4sUZ_J+WeM3IstV zwtOfWA9}vMm3r-4*f*!NF-;5H3&2h$VE0T7ayAM}9S%Zld!(8Y)I8nZ$SH;RNpX3b z^ObK`i0L8Wk#PqeN7ppVsz9*?YJ{SY88gqDvI}|w&N7bkWyRVBEvjnWe#jBx)=gE-vy{4} z*XGdQerOKk%s7w+0hGfPLPqThg&x!<0H`7&-c=}G_4N|?-^xk2M}Yt8j0$kiNijb~ zxNm2Dgw|vrr8;(xOE0s2vkgcs z9cW4JK}w*(R??k=P6MrbkeOZ{z^PwHw5E4@aGz$a?!FP5)S+D1R8~dMI+QnUt0itj z^l&KE6}k?6&rIszJ&)aI(l=ur?gE|DK^N?j%iD)yL2;-lW#uk6sJ1SZM(CBKnVAJ@#x5joV$BpygD-@aAT#r%pBoMrR!J_y z2%-VlIkZg9j^GfHa8Ua%4K3Bx63tkOCPap-C=scefbLdHU|bRKn2ntQ5Ix|bX$XQV zE8UMe+fZEv{aWT4fDz0;*8q%Qn%NOhAVTo{L|>wy$=it%RA=+qh8AE1#90!-2&!}Q zX&6;YoMx+V{E~>%&(6tZAk_WXQms{Vw_u^hX5ofL)9voL8GE!W^Rh_P>A%wAnY{V7 zNY_Rgy*h>Mds!58FrUKJX)h{sYLV@$@w+0E7$h#@WtZ_*c|DEryU2u7JRc#Fv70G{ zF5I=t011SFm0Czo-@vLrKqy>n)1;DT1PdGwdLra29if#-2id&C796Km5qqgUk9ueO}2)FnZ?`8o*=<^fl%fFrP`{KN!=V*8LQ2ViC5C4dr3&{D3dQn+6 zlyUiF+n39xPSuPvL$|-8`!aZ$nVH&U3UN1s-lO11^P|iHP^4MN)3+U+2e1F&pSoM- z@A1gzji_ih9D{w?A(UFc>(q`#_?AQkcH`+Hl*= z$tXoYOfvW-Q+8y!olTd%fTp9{*HEa`|AITwzR%S=QvuPrE3+wIoE}iJnQwx(wM7?* z)63hWqQ|Q<3hkR`SQ<2(83*rPL-|HlifHf~c;fvthZ_MKc69WK5$&?5qtSrVBO`== zFldDk_{Qm79t4Q&#zEpInk3DEPb>&27ZN%9rWp#|O_UInAa!ZTcqkcVYs4X+AgK6C z)TxQz%b{{k?g|u!rf%po4mEtC}jU(XCb84hQO+&t^Bh z-5Rs%)0c54tLYiJ`vitaZ7A>UMZ)Hg1?$I1dwmjCt6pkXP_n#D>~h&^bo!-jL`L+%FhDxb}U|(*K^}oKk2w#+x>x~PgnN6%DU6n)R}8#U1{a}*M*C< z(R6-w`|rrKfc!YsUe!t_%UEYsqWj=3S8v+T%ZNS-!r`dDY2lG?oE~;GzQ75D!z{LG zY)wnMv2wMCcHw|<&>@C_67rUY8yllA=T0v*%^2${(y|3i88_&<}oSyeH zua99UU?F>dfviAA@^S5!G2KnweTX?$^jma;6A|+gI~5$zY%LS+vTPW8KP2eI6l!x9jl#_8!RJ>2E^5Z_AitoP9 zeArlXW)Dm7?4*C!>SZkFUdzV|V3lgE5%RFtAnUg82>g`|vSd~)V)fOa5Yd2$FC7u^ zKw_&>9H<0FGu6J3cR=WYY$ z=DkMj_oW8Owb%S}j`%6(Rv-Bu8vZQ&>5mQW`wI$~JX0S5?MNN00mbMcDPKWB@=X}Z zxR4;^8dp}*bqKQuH@+bNBD!v|0n|1V@*db=3i&G<5_|-|*-oHblwM-jgBxJ`H044d zu)TR;KnenYay|GSoK6@Bp8;79ytocx^U)hEa7@#-p>_6wwi4(`T_%oc9IF7gv{zwMJ#scUwMI zPc|-jD6EgYuw`g#*#eZ~q(ov}_EFutU?T;j?gEmjsk^)Ti2~xg49+yxM)W2fWQHk~ zGK7jd;oM&2c@z*yMfd^qC8kH>#5<^TGf*(%<64v{y0wbxN|s~Z_-b62W>}+sT>VFA zlvDNC`aQCEs+Ultej=wD>BW}0(#ooYUaq5ZOpeiUojj1r?*x(4PycYfeUb4w4|Kb{ zJ42zq^3zA*Yi;w=QJ3XoIM*+qLE;|+1La0&YWTvg+ZTwmtG2e*ieg8I8*7tF$ttH@ zP_AWqxG@|ru0X!7ed?3N2w#oG8zR(*)@#Xe2V7sJ6}(NyL1?PR!nBxbYy?@Tv8AvJ zScyBXGlLz%_(D>iaF5vNF8O@kW>*(!kOS4j!L!Up5QKn!|_%`BbG}>T?{1C3RCxyWQc?7O{=x(LUJB5MdS}D zu5y&x&poR0mE`H-)>)d(y)` zi(has`k!huB!u5}Vozqt4JBRznh(uKAmzEAV4ff)fV71qJh4NJIw)=D4fW7%aKku# zN^FEYP}t_Q)nXNRI}A@k4!GO2wiH{B65~t1R*}OD<;X&X9ns{jBn~pnu*lPCB!$%k zEm$9vnrZZ)a<4ebw~L|2V$EPAI?aGi(bdt@LuBHJvw#zRm2zzGy-L@4)7ocwZ^bUz zU+deCkd|K9TDBaaHm*r!H^l>8Z!j`S92qbg7ziF2`9jEq6ClhD(>Ak16rHj*xCSy| z{m}{B#pHNXgkNoi|1;pB5FtSHkPYVqV5|UxC#y*UI7l5-Bnqgsid4FQMekt-($G9) z$VR%AWW#AJBn+8TR=%bTt-;ekmrKHTvdhMFpQ?l^qL&;Qp}%mR4xhy&m+kZFyY6L( zFYo<5skvG-?U`_Lid=QoxVwNzBp<0USQsfm8wrj36O)pRJ$T0beWgW3E+N6;JZI;D zm6nq|{K$c@Mfr8DoA}-k)(kVMD!yOOSsy`Pwt@oEeaXHyS&r3ZmeU(eHLUoc4VyL$Vba-MPFeHKe7z)M>Oxk^-?p{O0sh>xdSzZJIalPW@Ck3vi6m{ z!8K(xw-@4jD?Li7%Xxmoa?zm)PtHQVwcTi}LixZc{LO%%(1d^0t5YshZ!cr=F~)~< zQ;S`nhFxSugat44Of_V%5vT>>h2+561;QRLhp{7M+Qwo@n0sg_^>1m|K<#1rWZ8Vu z**zu3J_3QDi{$Q3?Ne)Xxb5yb%(CCw%wKzu;dDFszP9p?MRcqwx!);Xfwi`Hg!$74 zl56|Bv!1-ULQlM`JazBpfRoXxBt4!3!@K6R`fHQjO}rvzc~M2m;u$8ZVyG~g|Cc49 z&wmt1hYDAuItO-cOImpRiueP+gJ1PqJ61d^nY1XG0+t;CUD5j5*z_mYe{}L%{`#{!KfFCx`{UECJH9!6;=6;ViQ@e~e7SkY z#;xAV&#wFaPd@7&*4B?+JD&5?_VeG}-!Snycga^-7he~D^gTA_(ag?Cx)Ei!`+#TB zJ&R+diJLD|Lmm{pIph4vJfHT9rkjQqKe?4M_3>@dvO{6+CO8iMq-0Pg8HnBhZ#>KOu6E`c{N7vUWQy80fy*Gd1fzJ#dCO>L+JK?yuf%&R7cm7aE{S#{U z=l%Yk_4+^Dbsm0Z@)rJQTQ}}#^?o7N*!=0&B!PSV{=eT<-)nG8KjQOo#>3;6elQF{ GM*j{(hYAxXxB5YkXewrnw$P%5M-yR2E- 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 I=}avD4 Date: Thu, 5 Sep 2024 18:26:17 +0200 Subject: [PATCH 02/25] Emergency access sound --- .../Systems/AdminVerbSystem.Tools.cs | 10 +++++----- Content.Server/Remotes/DoorRemoteSystem.cs | 2 +- .../Doors/Systems/SharedAirlockSystem.cs | 16 ++++++++-------- .../SharedStationAiSystem.Airlock.cs | 2 +- .../Audio/Machines/airlock_emergencyoff.ogg | Bin 8107 -> 6675 bytes .../Audio/Machines/airlock_emergencyon.ogg | Bin 11642 -> 9055 bytes 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs index fef8a031d9da9a..7db58b05163029 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs @@ -90,22 +90,22 @@ private void AddTricksVerbs(GetVerbsEvent args) args.Verbs.Add(bolt); } - if (TryComp(args.Target, out var airlock)) + if (TryComp(args.Target, out var airlockComp)) { Verb emergencyAccess = new() { - Text = airlock.EmergencyAccess ? "Emergency Access Off" : "Emergency Access On", + Text = airlockComp.EmergencyAccess ? "Emergency Access Off" : "Emergency Access On", Category = VerbCategory.Tricks, Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/emergency_access.png")), Act = () => { - _airlockSystem.ToggleEmergencyAccess(args.Target, airlock); + _airlockSystem.ToggleEmergencyAccess((args.Target, airlockComp)); }, Impact = LogImpact.Medium, - Message = Loc.GetString(airlock.EmergencyAccess + Message = Loc.GetString(airlockComp.EmergencyAccess ? "admin-trick-emergency-access-off-description" : "admin-trick-emergency-access-on-description"), - Priority = (int) (airlock.EmergencyAccess ? TricksVerbPriorities.EmergencyAccessOff : TricksVerbPriorities.EmergencyAccessOn), + Priority = (int) (airlockComp.EmergencyAccess ? TricksVerbPriorities.EmergencyAccessOff : TricksVerbPriorities.EmergencyAccessOn), }; args.Verbs.Add(emergencyAccess); } diff --git a/Content.Server/Remotes/DoorRemoteSystem.cs b/Content.Server/Remotes/DoorRemoteSystem.cs index 67160650871d4f..2b9f218e203f77 100644 --- a/Content.Server/Remotes/DoorRemoteSystem.cs +++ b/Content.Server/Remotes/DoorRemoteSystem.cs @@ -74,7 +74,7 @@ private void OnBeforeInteract(Entity entity, ref BeforeRang case OperatingMode.ToggleEmergencyAccess: if (airlockComp != null) { - _airlock.ToggleEmergencyAccess(args.Target.Value, airlockComp); + _airlock.ToggleEmergencyAccess((args.Target.Value, airlockComp)); _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(args.User):player} used {ToPrettyString(args.Used)} on {ToPrettyString(args.Target.Value)} to set emergency access {(airlockComp.EmergencyAccess ? "on" : "off")}"); } diff --git a/Content.Shared/Doors/Systems/SharedAirlockSystem.cs b/Content.Shared/Doors/Systems/SharedAirlockSystem.cs index 34d1cc7941830f..78ecc42c1257cd 100644 --- a/Content.Shared/Doors/Systems/SharedAirlockSystem.cs +++ b/Content.Shared/Doors/Systems/SharedAirlockSystem.cs @@ -125,20 +125,20 @@ public void UpdateEmergencyLightStatus(EntityUid uid, AirlockComponent component Appearance.SetData(uid, DoorVisuals.EmergencyLights, component.EmergencyAccess); } - public void ToggleEmergencyAccess(EntityUid uid, AirlockComponent component, EntityUid? user = null, bool predicted = false) + public void ToggleEmergencyAccess(Entity ent, EntityUid? user = null, bool predicted = false) { - if(!component.Powered) + if(!ent.Comp.Powered) return; - component.EmergencyAccess = !component.EmergencyAccess; - Dirty(uid, component); // This only runs on the server apparently so we need this. - UpdateEmergencyLightStatus(uid, component); + ent.Comp.EmergencyAccess = !ent.Comp.EmergencyAccess; + Dirty(ent, ent.Comp); // This only runs on the server apparently so we need this. + UpdateEmergencyLightStatus(ent, ent.Comp); - var sound = component.EmergencyAccess ? component.EmergencyOnSound : component.EmergencyOffSound; + var sound = ent.Comp.EmergencyAccess ? ent.Comp.EmergencyOnSound : ent.Comp.EmergencyOffSound; if (predicted) - Audio.PlayPredicted(sound, uid, user: user); + Audio.PlayPredicted(sound, ent, user: user); else - Audio.PlayPvs(sound, uid); + Audio.PlayPvs(sound, ent); } public void SetAutoCloseDelayModifier(AirlockComponent component, float value) diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs index 50a8b5834beab4..c07979f646a4dc 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs @@ -20,7 +20,7 @@ private void OnAirlockBolt(EntityUid ent, DoorBoltComponent component, StationAi private void OnAirlockEmergencyAccess(EntityUid ent, AirlockComponent component, StationAiEmergencyAccessEvent args) { - _airlocks.ToggleEmergencyAccess(ent, component, predicted = true); + _airlocks.ToggleEmergencyAccess((ent, component), args.User, predicted: true); //_doors.SetBoltsDown((ent, component), args.Bolted, args.User, predicted: true); } } diff --git a/Resources/Audio/Machines/airlock_emergencyoff.ogg b/Resources/Audio/Machines/airlock_emergencyoff.ogg index 137a1eed4a2d6eebb2a4ecb4af4d0980e2b66510..5ad95bf325de86578826be9ce778e854b806bfb2 100644 GIT binary patch delta 5133 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 pe|>~WnqR!E{{yg~TU`JE literal 8107 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 GM*j#?q;5zmH-L<^HfUz>j=)Q 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 I=}avD4 Date: Thu, 5 Sep 2024 19:11:41 +0200 Subject: [PATCH 03/25] locale --- Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs | 2 +- Resources/Locale/en-US/silicons/station-ai.ftl | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs index f3d2b96352fd86..8eb6fc03ed3249 100644 --- a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs +++ b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs @@ -39,7 +39,7 @@ private void OnEmergencyAccessGetRadial(Entity ent, ref GetSta new ResPath("/Textures/Structures/Doors/Airlocks/Standard/basic.rsi"), "open") : new SpriteSpecifier.Rsi( new ResPath("/Textures/Structures/Doors/Airlocks/Standard/basic.rsi"), "closed"), - Tooltip = ent.Comp.EmergencyAccess ? Loc.GetString("bolt-open") : Loc.GetString("bolt-close"), + Tooltip = ent.Comp.EmergencyAccess ? Loc.GetString("emergency-access-off") : Loc.GetString("emergency-access-on"), Event = new StationAiEmergencyAccessEvent() { EmergencyAccess = !ent.Comp.EmergencyAccess, diff --git a/Resources/Locale/en-US/silicons/station-ai.ftl b/Resources/Locale/en-US/silicons/station-ai.ftl index d51a99ebb0437c..747a6cbbe8d773 100644 --- a/Resources/Locale/en-US/silicons/station-ai.ftl +++ b/Resources/Locale/en-US/silicons/station-ai.ftl @@ -11,4 +11,7 @@ ai-close = Close actions bolt-close = Close bolt bolt-open = Open bolt +emergency-access-on = Enable emergency access +emergency-access-off = Disable emergency access + toggle-light = Toggle light From 8d33a04dd8762b777c290038f1276269cae28a0e Mon Sep 17 00:00:00 2001 From: ScarKy0 Date: Thu, 5 Sep 2024 20:10:08 +0200 Subject: [PATCH 04/25] Updated sounds --- .../StationAi/StationAiSystem.Airlock.cs | 8 ++++---- .../Audio/Machines/airlock_emergencyoff.ogg | Bin 6675 -> 7952 bytes .../Audio/Machines/airlock_emergencyon.ogg | Bin 9055 -> 10094 bytes .../Actions/actions_ai.rsi/bolt_door.png | Bin 0 -> 343 bytes .../Actions/actions_ai.rsi/emergency_off.png | Bin 0 -> 702 bytes .../Actions/actions_ai.rsi/emergency_on.png | Bin 0 -> 428 bytes .../Actions/actions_ai.rsi/meta.json | 12 ++++++++++++ .../Actions/actions_ai.rsi/unbolt_door.png | Bin 0 -> 592 bytes 8 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 Resources/Textures/Interface/Actions/actions_ai.rsi/bolt_door.png create mode 100644 Resources/Textures/Interface/Actions/actions_ai.rsi/emergency_off.png create mode 100644 Resources/Textures/Interface/Actions/actions_ai.rsi/emergency_on.png create mode 100644 Resources/Textures/Interface/Actions/actions_ai.rsi/unbolt_door.png diff --git a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs index 8eb6fc03ed3249..a8c8b9d0eee91a 100644 --- a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs +++ b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs @@ -19,9 +19,9 @@ private void OnDoorBoltGetRadial(Entity ent, ref GetStationAi { Sprite = ent.Comp.BoltsDown ? new SpriteSpecifier.Rsi( - new ResPath("/Textures/Structures/Doors/Airlocks/Standard/basic.rsi"), "open") : + new ResPath("/Textures/Interface/Actions/actions_ai.rsi"), "unbolt_door") : new SpriteSpecifier.Rsi( - new ResPath("/Textures/Structures/Doors/Airlocks/Standard/basic.rsi"), "closed"), + new ResPath("/Textures/Interface/Actions/actions_ai.rsi"), "bolt_door"), Tooltip = ent.Comp.BoltsDown ? Loc.GetString("bolt-open") : Loc.GetString("bolt-close"), Event = new StationAiBoltEvent() { @@ -36,9 +36,9 @@ private void OnEmergencyAccessGetRadial(Entity ent, ref GetSta { Sprite = ent.Comp.EmergencyAccess ? new SpriteSpecifier.Rsi( - new ResPath("/Textures/Structures/Doors/Airlocks/Standard/basic.rsi"), "open") : + new ResPath("/Textures/Interface/Actions/actions_ai.rsi"), "emergency_off") : new SpriteSpecifier.Rsi( - new ResPath("/Textures/Structures/Doors/Airlocks/Standard/basic.rsi"), "closed"), + new ResPath("/Textures/Interface/Actions/actions_ai.rsi"), "emergency_on"), Tooltip = ent.Comp.EmergencyAccess ? Loc.GetString("emergency-access-off") : Loc.GetString("emergency-access-on"), Event = new StationAiEmergencyAccessEvent() { diff --git a/Resources/Audio/Machines/airlock_emergencyoff.ogg b/Resources/Audio/Machines/airlock_emergencyoff.ogg index 5ad95bf325de86578826be9ce778e854b806bfb2..5046a75ec20e112b40c8f9a8b1fe92ada225d066 100644 GIT binary patch delta 4047 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 KXM57{GXDWvw~f&N diff --git a/Resources/Audio/Machines/airlock_emergencyon.ogg b/Resources/Audio/Machines/airlock_emergencyon.ogg index f12fcdaa26fadffc177cb917fdc66277f494dd03..6c8b54a28459d7eccf88ef87b5ee70ef8e6d056b 100644 GIT binary patch delta 6214 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 diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/bolt_door.png b/Resources/Textures/Interface/Actions/actions_ai.rsi/bolt_door.png new file mode 100644 index 0000000000000000000000000000000000000000..e553671524ed2287838eab31a6136112cfca2c57 GIT binary patch literal 343 zcmV-d0jU0oP)F4>9WWBB&?7bfKPd+9m_3mwvx!m!vs_tBkU`VH z7_Zvv7tS)=ef6GbN3am%0A$Oz?An7@osXLf0|SyHsOA8eWkYX^g pfM5t*yHCF1#ONLH>Ub240svbgRv=GoFW3M8002ovPDHLkV1g5Qe~|zH literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/emergency_off.png b/Resources/Textures/Interface/Actions/actions_ai.rsi/emergency_off.png new file mode 100644 index 0000000000000000000000000000000000000000..0c253a5cd58c052c4dd939785b52aa4b5ecb49c7 GIT binary patch literal 702 zcmV;v0zv(WP)IP)NQ&ZBip>9sQ5SaqFVW@_r4VMZ3ddif488M% znP`XLRe;T6qwDzfoYQ20hY~Rk!6^Z<9A+^gO9?p!Uau+50Hw{rz&E5u1bHE`j+Tq_}14K}zgq zaL77$RQHdG_807#qfb4q^8<|hYau@)G!lIn}7~(iX039Iv9>zw_ zYWOS%0Z=HA9Ri>P2LhmAhp~$%xe#qR2#_5Dpi~Y@?H~Y)b5eW`1Gqwfs3;&NtKkF4 zxgZ*?=)f5T?FS!W6r1E&4gw(GgK*pwMGQHV5CG**)5j1ttnl#vl*-`kq`>eh{}NoC z*hD>sSq!ZNE#A8C0mDYV*(f2Pxe>KKz*-le7qQ4bKkd&)&|(+>S&j@qr79@>5UdM8 zr63Hf-;)Vv2f9pWVE9V3{Xn${bDqra0#`;rCiV~j0pw5s0rV=B5`e8H1OcoefNU`c zKpH2Qd6*P{tt|io7_A=knvt3F6XU=)mW!1(|Fe*}k-5ll1lDE`N#fn4zS%Y8CesAhqphsPVSP>Ike3aIfk>5!=~Tfz?oSb+~}7wIxnRun^J=vOJ=DHk`jC z!x>D^z4?zJ-9&{bM;tzS9H$&k2V8yrjzL>e2*Y9!h?%jMpry!QqjeORUX}BgA*vlU z%`xH9^l)+}M)ZIzhFR|D=t#5!{EsdJ53qYZ;DCa(g zIKeak1IWQnY7~F~CIP)NQ&ZBip>9sQ5SaqFVW@_r4VMZ3ddif488M% znP`XLRe;T6qwDzfoYQ20hY~Rk!6^Z<9A+`dQjgSpqJkd=cFdm02y+a`A-EiYRS=iu z%3^{Hng+&rExvx?EW_Pb?}>H<3n9y4;xNm%?An9Z0X}Xn3=Bw)fB}%1AhXdOf#LvM zmV*Gya*(g^x`2V;QDjDFq}s z09UYIT|uQNK(9P-S&p9IKtPy}xPlDb4zL421p=(~LXPF60_3&soH~;{AjUAsu40rti0000 Date: Thu, 5 Sep 2024 20:53:38 +0200 Subject: [PATCH 05/25] bleh --- .../StationAi/SharedStationAiSystem.Airlock.cs | 1 - Resources/Locale/en-US/silicons/station-ai.ftl | 3 +++ .../Actions/actions_ai.rsi/electrify_door.png | Bin 0 -> 289 bytes .../Interface/Actions/actions_ai.rsi/meta.json | 6 ++++++ .../Actions/actions_ai.rsi/unelectrify_door.png | Bin 0 -> 441 bytes 5 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Interface/Actions/actions_ai.rsi/electrify_door.png create mode 100644 Resources/Textures/Interface/Actions/actions_ai.rsi/unelectrify_door.png diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs index c07979f646a4dc..4f72f3202bb0b1 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs @@ -21,7 +21,6 @@ private void OnAirlockBolt(EntityUid ent, DoorBoltComponent component, StationAi private void OnAirlockEmergencyAccess(EntityUid ent, AirlockComponent component, StationAiEmergencyAccessEvent args) { _airlocks.ToggleEmergencyAccess((ent, component), args.User, predicted: true); - //_doors.SetBoltsDown((ent, component), args.Bolted, args.User, predicted: true); } } diff --git a/Resources/Locale/en-US/silicons/station-ai.ftl b/Resources/Locale/en-US/silicons/station-ai.ftl index 747a6cbbe8d773..21193401761373 100644 --- a/Resources/Locale/en-US/silicons/station-ai.ftl +++ b/Resources/Locale/en-US/silicons/station-ai.ftl @@ -14,4 +14,7 @@ bolt-open = Open bolt emergency-access-on = Enable emergency access emergency-access-off = Disable emergency access +electrify-door-on = Enable overcharge +electrify-door-off = Disable overcharge + toggle-light = Toggle light diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/electrify_door.png b/Resources/Textures/Interface/Actions/actions_ai.rsi/electrify_door.png new file mode 100644 index 0000000000000000000000000000000000000000..9b49dd0f07caa15ff91d6d3ada3c07dc340a6145 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS24TkI`72U@g4;Y@978<3&-Mp$9X8-OTK50(JEoV+&Yn|m zZoJH*_T{C`*7;>K>^W<$?@#^~ba}gX%lTiWoBKYq?cQG6W*#AH*MUA@@O1TaS?83{1ON_1YqJ0V literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json b/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json index 2432fb751c91e8..8f30f29fe219e6 100644 --- a/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json +++ b/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json @@ -45,6 +45,12 @@ }, { "name": "unbolt_door" + }, + { + "name": "electrify_door" + }, + { + "name": "unelectrify_door" } ] } diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/unelectrify_door.png b/Resources/Textures/Interface/Actions/actions_ai.rsi/unelectrify_door.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a08efe60813da5490f95c74fcdd80cc90666f4 GIT binary patch literal 441 zcmV;q0Y?6bP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0ZvIoK~zXfwUx1U z!Y~X)N%t(-yOpK?|1Dk8jlByW5MC|EmSxG3IVX331j4(KWSr$Vj@y-d}SFeOb50gp*rH}V7M2Z!?ecWrURz}Lj8ZJANB-xQ>~7g?(Kkq3TVxUA(vBo^B_Vk zQfFWdM&P%oSu?3KO|QH;I~B+k+3zLn0+o?KS?_1Z;|^1xq_+ee`V5?OzMFdUP%3cm zov(ej4k_@{iLj#)sJCDO$Eg`Osz7`(x_yr4$bvW1306v>1S&(GOE0t!K|l^Ecr%@7 jAA&?+yPl`?XM5}~V(rSk32v%`00000NkvXXu0mjf4BfeY literal 0 HcmV?d00001 From 265fd0787393cca293f78999ba16f595afa83dce Mon Sep 17 00:00:00 2001 From: ScarKy0 Date: Fri, 6 Sep 2024 16:24:05 +0200 Subject: [PATCH 06/25] Door electrify base --- .../StationAi/StationAiSystem.Airlock.cs | 20 +++++++- .../Completions/AttemptElectrocute.cs | 1 + Content.Server/Power/PowerWireAction.cs | 1 + .../Components/ElectrifiedComponent.cs | 49 ++++++++++--------- .../SharedElectrocutionSystem.cs | 6 +++ .../SharedStationAiSystem.Airlock.cs | 13 +++++ .../StationAi/SharedStationAiSystem.cs | 2 + 7 files changed, 67 insertions(+), 25 deletions(-) rename {Content.Server => Content.Shared}/Electrocution/Components/ElectrifiedComponent.cs (66%) diff --git a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs index a8c8b9d0eee91a..2915d2b43f9909 100644 --- a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs +++ b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs @@ -1,5 +1,5 @@ using Content.Shared.Doors.Components; - +using Content.Shared.Electrocution; using Content.Shared.Silicons.StationAi; using Robust.Shared.Utility; @@ -11,6 +11,7 @@ private void InitializeAirlock() { SubscribeLocalEvent(OnDoorBoltGetRadial); SubscribeLocalEvent(OnEmergencyAccessGetRadial); + SubscribeLocalEvent(OnDoorElectrifiedGetRadial); } private void OnDoorBoltGetRadial(Entity ent, ref GetStationAiRadialEvent args) @@ -46,4 +47,21 @@ private void OnEmergencyAccessGetRadial(Entity ent, ref GetSta } }); } + + private void OnDoorElectrifiedGetRadial(Entity ent, ref GetStationAiRadialEvent args) + { + args.Actions.Add(new StationAiRadial + { + Sprite = ent.Comp.Enabled ? + new SpriteSpecifier.Rsi( + new ResPath("/Textures/Structures/Doors/Airlocks/Standard/basic.rsi"), "open") : + new SpriteSpecifier.Rsi( + new ResPath("/Textures/Structures/Doors/Airlocks/Standard/basic.rsi"), "closed"), + Tooltip = ent.Comp.Enabled ? Loc.GetString("bolt-open") : Loc.GetString("bolt-close"), + Event = new StationAiElectrifiedEvent + { + Electrified = !ent.Comp.Enabled, + } + }); + } } diff --git a/Content.Server/Construction/Completions/AttemptElectrocute.cs b/Content.Server/Construction/Completions/AttemptElectrocute.cs index 05f0977b662788..5c97d5e90fec98 100644 --- a/Content.Server/Construction/Completions/AttemptElectrocute.cs +++ b/Content.Server/Construction/Completions/AttemptElectrocute.cs @@ -1,4 +1,5 @@ using Content.Server.Electrocution; +using Content.Shared.Electrocution; using Content.Shared.Construction; namespace Content.Server.Construction.Completions; diff --git a/Content.Server/Power/PowerWireAction.cs b/Content.Server/Power/PowerWireAction.cs index ac34966036cc97..1e7af2af2fa871 100644 --- a/Content.Server/Power/PowerWireAction.cs +++ b/Content.Server/Power/PowerWireAction.cs @@ -1,4 +1,5 @@ using Content.Server.Electrocution; +using Content.Shared.Electrocution; using Content.Server.Power.Components; using Content.Server.Wires; using Content.Shared.Power; diff --git a/Content.Server/Electrocution/Components/ElectrifiedComponent.cs b/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs similarity index 66% rename from Content.Server/Electrocution/Components/ElectrifiedComponent.cs rename to Content.Shared/Electrocution/Components/ElectrifiedComponent.cs index 5755e98091b578..2e821796836f50 100644 --- a/Content.Server/Electrocution/Components/ElectrifiedComponent.cs +++ b/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs @@ -1,121 +1,122 @@ +using Robust.Shared.GameStates; using Robust.Shared.Audio; -namespace Content.Server.Electrocution; +namespace Content.Shared.Electrocution; /// /// Component for things that shock users on touch. /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class ElectrifiedComponent : Component { - [DataField("enabled")] + [DataField("enabled"), AutoNetworkedField] public bool Enabled = true; /// /// Should player get damage on collide /// - [DataField("onBump")] + [DataField("onBump"), AutoNetworkedField] public bool OnBump = true; /// /// Should player get damage on attack /// - [DataField("onAttacked")] + [DataField("onAttacked"), AutoNetworkedField] public bool OnAttacked = true; /// /// When true - disables power if a window is present in the same tile /// - [DataField("noWindowInTile")] + [DataField("noWindowInTile"), AutoNetworkedField] public bool NoWindowInTile = false; /// /// Should player get damage on interact with empty hand /// - [DataField("onHandInteract")] + [DataField("onHandInteract"), AutoNetworkedField] public bool OnHandInteract = true; /// /// Should player get damage on interact while holding an object in their hand /// - [DataField("onInteractUsing")] + [DataField("onInteractUsing"), AutoNetworkedField] public bool OnInteractUsing = true; /// /// Indicates if the entity requires power to function /// - [DataField("requirePower")] + [DataField("requirePower"), AutoNetworkedField] public bool RequirePower = true; /// /// Indicates if the entity uses APC power /// - [DataField("usesApcPower")] + [DataField("usesApcPower"), AutoNetworkedField] public bool UsesApcPower = false; /// /// Identifier for the high voltage node. /// - [DataField("highVoltageNode")] + [DataField("highVoltageNode"), AutoNetworkedField] public string? HighVoltageNode; /// /// Identifier for the medium voltage node. /// - [DataField("mediumVoltageNode")] + [DataField("mediumVoltageNode"), AutoNetworkedField] public string? MediumVoltageNode; /// /// Identifier for the low voltage node. /// - [DataField("lowVoltageNode")] + [DataField("lowVoltageNode"), AutoNetworkedField] public string? LowVoltageNode; /// /// Damage multiplier for HV electrocution /// - [DataField] + [DataField, AutoNetworkedField] public float HighVoltageDamageMultiplier = 3f; /// /// Shock time multiplier for HV electrocution /// - [DataField] + [DataField, AutoNetworkedField] public float HighVoltageTimeMultiplier = 1.5f; /// /// Damage multiplier for MV electrocution /// - [DataField] + [DataField, AutoNetworkedField] public float MediumVoltageDamageMultiplier = 2f; /// /// Shock time multiplier for MV electrocution /// - [DataField] + [DataField, AutoNetworkedField] public float MediumVoltageTimeMultiplier = 1.25f; - [DataField("shockDamage")] + [DataField("shockDamage"), AutoNetworkedField] public float ShockDamage = 7.5f; /// /// Shock time, in seconds. /// - [DataField("shockTime")] + [DataField("shockTime"), AutoNetworkedField] public float ShockTime = 8f; - [DataField("siemensCoefficient")] + [DataField("siemensCoefficient"), AutoNetworkedField] public float SiemensCoefficient = 1f; - [DataField("shockNoises")] + [DataField("shockNoises"), AutoNetworkedField] public SoundSpecifier ShockNoises = new SoundCollectionSpecifier("sparks"); - [DataField("playSoundOnShock")] + [DataField("playSoundOnShock"), AutoNetworkedField] public bool PlaySoundOnShock = true; - [DataField("shockVolume")] + [DataField("shockVolume"), AutoNetworkedField] public float ShockVolume = 20; - [DataField] + [DataField, AutoNetworkedField] public float Probability = 1f; } diff --git a/Content.Shared/Electrocution/SharedElectrocutionSystem.cs b/Content.Shared/Electrocution/SharedElectrocutionSystem.cs index b228a987af4af6..f6e0a2bc175d49 100644 --- a/Content.Shared/Electrocution/SharedElectrocutionSystem.cs +++ b/Content.Shared/Electrocution/SharedElectrocutionSystem.cs @@ -43,6 +43,12 @@ public virtual bool TryDoElectrocution( private void OnInsulatedElectrocutionAttempt(EntityUid uid, InsulatedComponent insulated, ElectrocutionAttemptEvent args) { args.SiemensCoefficient *= insulated.Coefficient; + } + + public void ToggleElectrified(Entity ent, EntityUid? user = null, bool predicted = false) + { + ent.Comp.Enabled = !ent.Comp.Enabled; + Dirty(ent, ent.Comp); } } } diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs index 4f72f3202bb0b1..eb60892b51184b 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs @@ -1,5 +1,6 @@ using Content.Shared.Doors.Components; using Robust.Shared.Serialization; +using Content.Shared.Electrocution; namespace Content.Shared.Silicons.StationAi; @@ -11,6 +12,7 @@ private void InitializeAirlock() { SubscribeLocalEvent(OnAirlockBolt); SubscribeLocalEvent(OnAirlockEmergencyAccess); + SubscribeLocalEvent(OnElectrified); } private void OnAirlockBolt(EntityUid ent, DoorBoltComponent component, StationAiBoltEvent args) @@ -22,6 +24,11 @@ private void OnAirlockEmergencyAccess(EntityUid ent, AirlockComponent component, { _airlocks.ToggleEmergencyAccess((ent, component), args.User, predicted: true); } + + private void OnElectrified(EntityUid ent, ElectrifiedComponent component, StationAiElectrifiedEvent args) + { + _electrify.ToggleElectrified((ent, component), args.User, predicted: true); + } } [Serializable, NetSerializable] @@ -35,3 +42,9 @@ public sealed class StationAiEmergencyAccessEvent : BaseStationAiAction { public bool EmergencyAccess; } + +[Serializable, NetSerializable] +public sealed class StationAiElectrifiedEvent : BaseStationAiAction +{ + public bool Electrified; +} diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs index aa55a091cd11cf..2b008573bc6ba8 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Containers.ItemSlots; using Content.Shared.Database; using Content.Shared.Doors.Systems; +using Content.Shared.Electrocution; using Content.Shared.Interaction; using Content.Shared.Item.ItemToggle; using Content.Shared.Mind; @@ -34,6 +35,7 @@ public abstract partial class SharedStationAiSystem : EntitySystem [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedContainerSystem _containers = default!; [Dependency] private readonly SharedDoorSystem _doors = default!; + [Dependency] private readonly SharedElectrocutionSystem _electrify = default!; [Dependency] private readonly SharedAirlockSystem _airlocks = default!; [Dependency] private readonly SharedEyeSystem _eye = default!; [Dependency] protected readonly SharedMapSystem Maps = default!; From a08fffc95588486b3f96ea151e382c85c95d143a Mon Sep 17 00:00:00 2001 From: "pa.pecherskij" Date: Sun, 8 Sep 2024 17:27:35 +0300 Subject: [PATCH 07/25] feat: popups on attempt to activate AI action when wires cut --- .../Doors/WireActions/DoorBoltWireAction.cs | 1 - .../Electrocution/ElectrocutionSystem.cs | 6 +++ Content.Server/Power/PowerWireAction.cs | 1 + .../Components/ElectrifiedComponent.cs | 3 ++ .../SharedStationAiSystem.Airlock.cs | 44 +++++++++++++++++-- .../StationAi/SharedStationAiSystem.cs | 2 + .../Locale/en-US/silicons/station-ai.ftl | 2 + 7 files changed, 55 insertions(+), 4 deletions(-) diff --git a/Content.Server/Doors/WireActions/DoorBoltWireAction.cs b/Content.Server/Doors/WireActions/DoorBoltWireAction.cs index fc1cf50cd87d5c..80555f68f9b63a 100644 --- a/Content.Server/Doors/WireActions/DoorBoltWireAction.cs +++ b/Content.Server/Doors/WireActions/DoorBoltWireAction.cs @@ -2,7 +2,6 @@ using Content.Server.Wires; using Content.Shared.Doors; using Content.Shared.Doors.Components; -using Content.Shared.Doors.Systems; using Content.Shared.Wires; namespace Content.Server.Doors; diff --git a/Content.Server/Electrocution/ElectrocutionSystem.cs b/Content.Server/Electrocution/ElectrocutionSystem.cs index 67e60c9de4660c..98e6120322326d 100644 --- a/Content.Server/Electrocution/ElectrocutionSystem.cs +++ b/Content.Server/Electrocution/ElectrocutionSystem.cs @@ -488,4 +488,10 @@ private void PlayElectrocutionSound(EntityUid targetUid, EntityUid sourceUid, El } _audio.PlayPvs(electrified.ShockNoises, targetUid, AudioParams.Default.WithVolume(electrified.ShockVolume)); } + + public void SetElectrifiedWireCut(Entity ent, bool value) + { + ent.Comp.IsWireCut = value; + Dirty(ent); + } } diff --git a/Content.Server/Power/PowerWireAction.cs b/Content.Server/Power/PowerWireAction.cs index 1e7af2af2fa871..cebb7de8ec8685 100644 --- a/Content.Server/Power/PowerWireAction.cs +++ b/Content.Server/Power/PowerWireAction.cs @@ -105,6 +105,7 @@ private void SetElectrified(EntityUid used, bool setting, ElectrifiedComponent? && !EntityManager.TryGetComponent(used, out electrified)) return; + _electrocutionSystem.SetElectrifiedWireCut((used, electrified), setting); electrified.Enabled = setting; } diff --git a/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs b/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs index 2e821796836f50..dedbea21b905be 100644 --- a/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs +++ b/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs @@ -119,4 +119,7 @@ public sealed partial class ElectrifiedComponent : Component [DataField, AutoNetworkedField] public float Probability = 1f; + + [DataField, AutoNetworkedField] + public bool IsWireCut = false; } diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs index eb60892b51184b..aad82959afeffd 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs @@ -1,6 +1,7 @@ using Content.Shared.Doors.Components; using Robust.Shared.Serialization; using Content.Shared.Electrocution; +using Content.Shared.Popups; namespace Content.Shared.Silicons.StationAi; @@ -17,16 +18,53 @@ private void InitializeAirlock() private void OnAirlockBolt(EntityUid ent, DoorBoltComponent component, StationAiBoltEvent args) { + if ( + !TryComp(ent, out var doorBolt) + || !TryComp(ent, out var whiteList)) + { + return; + } + + if (!whiteList.Enabled || doorBolt.BoltWireCut) + { + _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); + return; + } + _doors.SetBoltsDown((ent, component), args.Bolted, args.User, predicted: true); } - + private void OnAirlockEmergencyAccess(EntityUid ent, AirlockComponent component, StationAiEmergencyAccessEvent args) { + if (!TryComp(ent, out var whiteList)) + { + return; + } + + if (!whiteList.Enabled) + { + _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); + return; + } + _airlocks.ToggleEmergencyAccess((ent, component), args.User, predicted: true); } - - private void OnElectrified(EntityUid ent, ElectrifiedComponent component, StationAiElectrifiedEvent args) + + private void OnElectrified(EntityUid ent, ElectrifiedComponent component, StationAiElectrifiedEvent args) { + if ( + !TryComp(ent, out var electrified) + || !TryComp(ent, out var whiteList)) + { + return; + } + + if (!whiteList.Enabled || electrified.IsWireCut) + { + _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); + return; + } + _electrify.ToggleElectrified((ent, component), args.User, predicted: true); } } diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs index 2b008573bc6ba8..649d8a6e197be9 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs @@ -10,6 +10,7 @@ using Content.Shared.Mind; using Content.Shared.Movement.Components; using Content.Shared.Movement.Systems; +using Content.Shared.Popups; using Content.Shared.Power; using Content.Shared.StationAi; using Content.Shared.Verbs; @@ -44,6 +45,7 @@ public abstract partial class SharedStationAiSystem : EntitySystem [Dependency] private readonly SharedTransformSystem _xforms = default!; [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; [Dependency] private readonly StationAiVisionSystem _vision = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; // StationAiHeld is added to anything inside of an AI core. // StationAiHolder indicates it can hold an AI positronic brain (e.g. holocard / core). diff --git a/Resources/Locale/en-US/silicons/station-ai.ftl b/Resources/Locale/en-US/silicons/station-ai.ftl index 21193401761373..7d9db3f6dc5a8b 100644 --- a/Resources/Locale/en-US/silicons/station-ai.ftl +++ b/Resources/Locale/en-US/silicons/station-ai.ftl @@ -18,3 +18,5 @@ electrify-door-on = Enable overcharge electrify-door-off = Disable overcharge toggle-light = Toggle light + +ai-device-not-responding = Device is not responding From a5967bbcc05bbd642c3c316a6808c974547c08c7 Mon Sep 17 00:00:00 2001 From: "pa.pecherskij" Date: Sun, 8 Sep 2024 21:58:47 +0300 Subject: [PATCH 08/25] refactor: use SharedApcPowerReceiverComponent to check if AI can interact with door --- .../SharedStationAiSystem.Airlock.cs | 19 +++++++++++++------ .../StationAi/SharedStationAiSystem.Held.cs | 14 ++++++++++++-- .../StationAi/SharedStationAiSystem.cs | 2 ++ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs index aad82959afeffd..fe6c12bd45dd40 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs @@ -2,6 +2,7 @@ using Robust.Shared.Serialization; using Content.Shared.Electrocution; using Content.Shared.Popups; +using Content.Shared.Power.Components; namespace Content.Shared.Silicons.StationAi; @@ -18,14 +19,12 @@ private void InitializeAirlock() private void OnAirlockBolt(EntityUid ent, DoorBoltComponent component, StationAiBoltEvent args) { - if ( - !TryComp(ent, out var doorBolt) - || !TryComp(ent, out var whiteList)) + if (!TryComp(ent, out var whiteList)) { return; } - if (!whiteList.Enabled || doorBolt.BoltWireCut) + if (!whiteList.Enabled || component.BoltWireCut || !component.Powered) { _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); return; @@ -41,7 +40,7 @@ private void OnAirlockEmergencyAccess(EntityUid ent, AirlockComponent component, return; } - if (!whiteList.Enabled) + if (!whiteList.Enabled || !component.Powered) { _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); return; @@ -58,8 +57,16 @@ private void OnElectrified(EntityUid ent, ElectrifiedComponent component, Statio { return; } + SharedApcPowerReceiverComponent? apcPowerReceiverComponent = null; - if (!whiteList.Enabled || electrified.IsWireCut) + if ( + !whiteList.Enabled + || electrified.IsWireCut + || ( + PowerReceiver.ResolveApc(ent, ref apcPowerReceiverComponent) + && !apcPowerReceiverComponent.Powered + ) + ) { _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); return; diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs index c59c4723079aa5..d81ca6df23abcc 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs @@ -2,6 +2,8 @@ using Content.Shared.Actions.Events; using Content.Shared.IdentityManagement; using Content.Shared.Interaction.Events; +using Content.Shared.Popups; +using Content.Shared.Power.Components; using Content.Shared.Verbs; using Robust.Shared.Serialization; using Robust.Shared.Utility; @@ -138,11 +140,18 @@ private void OnTargetVerbs(Entity ent, ref GetVerbs var isOpen = _uiSystem.IsUiOpen(target, AiUi.Key, user); - args.Verbs.Add(new AlternativeVerb() + var verb = new AlternativeVerb { Text = isOpen ? Loc.GetString("ai-close") : Loc.GetString("ai-open"), Act = () => { + SharedApcPowerReceiverComponent? component = null; + if (PowerReceiver.ResolveApc(ent.Owner, ref component) && !component.Powered) + { + _popup.PopupClient(Loc.GetString("ai-device-not-responding"), user, PopupType.MediumCaution); + return; + } + if (isOpen) { _uiSystem.CloseUi(ent.Owner, AiUi.Key, user); @@ -152,7 +161,8 @@ private void OnTargetVerbs(Entity ent, ref GetVerbs _uiSystem.OpenUi(ent.Owner, AiUi.Key, user); } } - }); + }; + args.Verbs.Add(verb); } } diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs index 649d8a6e197be9..de3b7bfc647d76 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs @@ -12,6 +12,7 @@ using Content.Shared.Movement.Systems; using Content.Shared.Popups; using Content.Shared.Power; +using Content.Shared.Power.EntitySystems; using Content.Shared.StationAi; using Content.Shared.Verbs; using Robust.Shared.Containers; @@ -46,6 +47,7 @@ public abstract partial class SharedStationAiSystem : EntitySystem [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; [Dependency] private readonly StationAiVisionSystem _vision = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] protected readonly SharedPowerReceiverSystem PowerReceiver = default!; // StationAiHeld is added to anything inside of an AI core. // StationAiHolder indicates it can hold an AI positronic brain (e.g. holocard / core). From 90507431696cfab0683eb37e18dad4dd8027f5d5 Mon Sep 17 00:00:00 2001 From: "pa.pecherskij" Date: Sun, 8 Sep 2024 22:53:20 +0300 Subject: [PATCH 09/25] refactor: added icon and sound for door overcharge --- .../StationAi/StationAiSystem.Airlock.cs | 4 ++-- .../StationAi/SharedStationAiSystem.Airlock.cs | 9 ++++++++- .../Silicons/StationAi/SharedStationAiSystem.cs | 2 ++ .../Audio/Machines/airlock_overcharge_off.ogg | Bin 0 -> 10397 bytes .../Audio/Machines/airlock_overcharge_on.ogg | Bin 0 -> 10226 bytes .../actions_ai.rsi/door_overcharge_off.png | Bin 0 -> 585 bytes .../actions_ai.rsi/door_overcharge_on.png | Bin 0 -> 357 bytes .../Interface/Actions/actions_ai.rsi/meta.json | 8 +++++++- 8 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 Resources/Audio/Machines/airlock_overcharge_off.ogg create mode 100644 Resources/Audio/Machines/airlock_overcharge_on.ogg create mode 100644 Resources/Textures/Interface/Actions/actions_ai.rsi/door_overcharge_off.png create mode 100644 Resources/Textures/Interface/Actions/actions_ai.rsi/door_overcharge_on.png diff --git a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs index 2915d2b43f9909..2543415389d9cc 100644 --- a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs +++ b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs @@ -54,9 +54,9 @@ private void OnDoorElectrifiedGetRadial(Entity ent, ref Ge { Sprite = ent.Comp.Enabled ? new SpriteSpecifier.Rsi( - new ResPath("/Textures/Structures/Doors/Airlocks/Standard/basic.rsi"), "open") : + new ResPath("/Textures/Interface/Actions/actions_ai.rsi"), "door_overcharge_off") : new SpriteSpecifier.Rsi( - new ResPath("/Textures/Structures/Doors/Airlocks/Standard/basic.rsi"), "closed"), + new ResPath("/Textures/Interface/Actions/actions_ai.rsi"), "door_overcharge_on"), Tooltip = ent.Comp.Enabled ? Loc.GetString("bolt-open") : Loc.GetString("bolt-close"), Event = new StationAiElectrifiedEvent { diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs index fe6c12bd45dd40..d60b306557e31a 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs @@ -3,6 +3,7 @@ using Content.Shared.Electrocution; using Content.Shared.Popups; using Content.Shared.Power.Components; +using Robust.Shared.Audio; namespace Content.Shared.Silicons.StationAi; @@ -69,10 +70,16 @@ private void OnElectrified(EntityUid ent, ElectrifiedComponent component, Statio ) { _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); - return; + return; } _electrify.ToggleElectrified((ent, component), args.User, predicted: true); + _audio.PlayEntity(component.Enabled + ? new SoundPathSpecifier("/Audio/Machines/airlock_overcharge_on.ogg") + : new SoundPathSpecifier("/Audio/Machines/airlock_overcharge_off.ogg"), + args.User, + ent + ); } } diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs index de3b7bfc647d76..bf1e9f3fc77700 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs @@ -15,6 +15,7 @@ using Content.Shared.Power.EntitySystems; using Content.Shared.StationAi; using Content.Shared.Verbs; +using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Map.Components; using Robust.Shared.Network; @@ -48,6 +49,7 @@ public abstract partial class SharedStationAiSystem : EntitySystem [Dependency] private readonly StationAiVisionSystem _vision = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] protected readonly SharedPowerReceiverSystem PowerReceiver = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; // StationAiHeld is added to anything inside of an AI core. // StationAiHolder indicates it can hold an AI positronic brain (e.g. holocard / core). diff --git a/Resources/Audio/Machines/airlock_overcharge_off.ogg b/Resources/Audio/Machines/airlock_overcharge_off.ogg new file mode 100644 index 0000000000000000000000000000000000000000..66d7127aa09df0dab9d18b42cb9560cbbe0bee7d GIT binary patch literal 10397 zcmaiZ1z40#_xHWhAs{8~5(_M_NSAa8OD`ZLAl)4gs0c`Rt+YrjNQbn7L8o*G5`rKi zCMmJsz4*NE`+V>BUH|`m&CWIVoSAcG&iS2lpPAKjaxw%i0e?T;l7AXK8kAlTHb|hC zudRz8t_z}C{r8Z+AQz1`h#qd{zaQL89OY-^VmXyQ_WybY@%}Ip1L>wN-p+!0zD`hg z7u#DG?4g=a5g`#FAxR-IC@;#vKETe!(+R5P8R+8c<>}$z=?};8B?f;Eo_1dL4!&{_ zf zE0ZCbCXw30Gq>z&I|(iC`;AF&<^NrgT;OAuETta7^!5hc*;D|XXQtlv)-EI0jC2hrN2d)k!$G6D_|0H7$$((A)A2x6YxW5-O_Fk;bEn+vssfovIyh*ik{NCF4M7HvRt$8&#; zN>k*1EUci-n|d8*l*iLvk)3y8LH9Anb4UyF9mc z5=*dkY@h#ilmyrJ-|$fc?PfF2(D(QuG$fhOmX^JYJ%i0Zg(9O+cmQ6?mXxfHtccJ@ zG4f#iA71Pn3ILH*7byN$bpho+C@xKp=NsaEHX<@CfUByz$7FWuyQx&jg+UYxh=V9j zYThjHtCiMp!!*yD^JCB`Bpma{qd=oV?NgNq884h9I@@;$UJiQ2KMnVt>+KcRiGP&0 zKUfT?VPKgMK^Th485IY+j9WWX(BIt5^b9( z+@Bwzt4#98!2j|bAKLyjmccYGtwt`LNrBOyVtT*CCTP?Q#B>blEGOs!rsy3EB`l}J z9j1&OW&#}+S{y7|L(E$Kc9=hIvoaU(56{852#0j?x<)$we>|sd&LKqv#{m&i) zQfI_;ro=$SJ^}zn0N@0T97z@Lo2u+7XG$!*$wg2kO<2^!5Lr$oN-lkw!#`DtN3Jbh zx|{shDvFm*RXZXHCYcPq{HE--=0_=FFzn$21^^HyJRsb|;5(){Sg1NCO!62#AkBlx znAC(LG8shSurg}9_56}a&B0PMgI4_GQfj-n8gLRo1pdg1##8AainIV=OO7IiN1;(; z@Xb`zknl$q6jHi8-*8Ntm^E@pnDB7~6&%B2I0o-$i5yY-m>)5�vn>R}k>0%qwQE z22k+;tKM91GsLuLVOlh5Z)qLoXmsWtiH(Yh8yFc6(-_Yf886c77`MQ5XmoV;jErg2 zjOmQ0GIflbJ>H5rEEpNTr#GHyaag2(V3HZIBC2BszRrTwfVs>N>sb%W?7vy*&|a{T zFrI4>H}E$$Fm^CAGByizFgr9hnGMkbsfIcWbjHRl#tZu%#+e~&{>GLj4hx6IX7mp% z=AzaPLe>~?oabf&K&s8GgH3C|3a?A9i)-=I%3R*c%8JSskILE_i{ej}#g#*iPL;LQ zLydJ+weCA0wf1Rcqd;Y)KviS)Nu|I}%hSq^nxV$}yxOXrmTzR;0y`bvm9@21jbCuo zj+&i5pPde&`(^OqvZ~J=6&)R(I~_hFEgmc-m7lx#hTqf=HGbRaxZV`NZeSen9&Nd9 z0`9}Z`mX|u!>C4&8!u~4hCl|BN78S-SlYp9&pesIzP?}l3N}*77^hrtrIj^#l~p^9 zp8Va_JIV&eA(oFERwOOWu6nLWCR@xU6<2=l;2Z7&1qmbT$j_igI>XVED54^aKGLlSJ&ST{D4Vw3g_hDIT@dI= zbJvQ#Y4gM@c2pu;rS@Z*B$y@~0c5pRSW2Oc#FWx%ArZGmKp>Y)Drr=dQX6VkG=r=# zrSw`z;TBp8PvKb>a7HP$g(kd@*3bjdm&@4)1z8Q^gkQ+`n2iQmo zI93tKNKJT4I#L^46%yGHg)(;+p3O(Oi-W5IS*0W05q;(s+RXt}=42PEs%gIE=33JS z3Ws4Bw2%$W^lqNQn@mWT8l3QoUV4jUP`II+c-gEgj$q*-H=FB+teKrgC4mGxkItFg zd*A-Gb6ZzL->hv7PB>q~qjXUC<~#F5Y4oHm$SNI`2+pu@Z!gPq1qr#Rgyzk6e(vH2 z)8^GU8Cu{M!Y`$L{}vc^!temaFcODCTnNFrtx_y%Ow)zRcSM?xM0rG-r@~iT84fod zQ6h#lk4eMfy|dE9FbusGAENh`8ypVq0s-b77j8?a6W0qNy=+DTsDfVH2LmcfrgnUB$KOoGseG*J;+9o`2; zr=vh|;Fck=3k&7G~C4lsX$ounX4dcdQIJG*)g-W)#7s?h?_Ta-H;%` zZL}Q#mI#P|dOT(|2_6O#J~8`?O@u)~H6{v2)7r)hZ{@2H!+W#A9H)!{mwJF7SzP{+ z2ok{8K9C^2#e%Ey{gVHanEaGRF^v;)7u_aiL?{9EkvV6TvXEC|6L53^Ar@8YgOANdu0V zHBUf*E{6nPZ4V2Xgl|Fkjv3g-^b}-pizR))AV1NQ`QHVneyDAby6%Hfpk)Rp=^hKur zyN^m{>kqU*KyCdQht^lVfEIBP*av3?LB@O0f`KiPKMC9g7$d2{R1OVt{?mu124!5N zcW4w2k)UdDgbS!%v`E-->be-r{%0;O7X%@Shl|3TpSVhfINZh7-r(sw4pFOr0LYo>ELE{C_oCXb`>tunGyI1j4uoVq;?+lS{hS z@wim&BTIWW@L?BZTt!U$=cs~z(f)I4R#f>z#+{mRV)&>N|B{Encz9sEJbZ!(9zi~S zegQZ_P=FsH$j^sB@bU0~O+J1&KSF>XY#{gq`1wFWb6ZPIWz+NK_S)+EtZGCX-|N=w zHVX(6FLkwEE5C!t<0OZ!&iS9qZ_!J%CrOLxEi7PVA-YJ)&R(7b-5Gaa88*jcrfTCfq%DIXy?uNgN(Jl z63e^2Ux!T+;q+y{JFM}`pKl$F3;kq3)+ zH+HuiFLv#rC=kUR2RF01@8N88)EvMIobJ_7%z6#B&c=C#<8ROrA|Jlq|a54g#H5C~8y1Y7q#_VnS&t6Em@`{}sE*!eVb_{kZikJ#D?Gu}8{(QdE5 z8NI(aW$;WmrMV;K3+Lw_hQKM~KFj>avpR1k?@;bA!iO|a)))3>Uz_%S1STL#&*Xf7 z->AQSS{_LEH|M;=XW`IlzeM(T+|w|ZC@UK?20Gd}eu?Tbx_Cq+cFo!hcXDwt$&ts3 zpW~7199ad1p~zT0yCgE~zfkUCHo6)&`L%9eJ*zJ&8P%180J0o%D7bI8LgD&KIo_QJ zn$_`B`s?Yo-Tg*D+pZl=K$p)dlt*q-9mKM%Nfd@{D26>T zs_A#!doZlSv0HqJg)Lydq^SlQf!#iHAmo#R)Mj4Q5$7(!E^z=O{KFq#*qYXrT=Nk? zzLtOf9CFGihg4xZxNiC` zatlku;(m=)u_CJA;Co+NwyS(hkVUFa#-#lGEXuoM*%&)&0Rg7zTwb^2DtdtPsE4<^=`l$d>uUt4?TJR_9lAc?;{Sq3>FB< zSx}7%g*E9bW8YmL17_fq{S2~^aYmNEYt_t*zI5JRqUaIJ+503f_1+DhyqVuU?Oryd z(eX?WS?>M5FxGSN`;8$o0AoH$?Bn2FhU#`VJb;CaG3J_9!Lqq)djYxmUp)k;j3wtb zip)Q*;62qtReOr1-GyYlCv{yZlu zmv{-pRDb7cmX-5RWhA$LO>h_J<2!@=n$S%i?$-yv$T1n+H5lrc0O?Zj3p0APzwe-U zFF?h9<#1m{k-<#K#1>Jr|D{155BS2kzvQ?$urmI6*J}4tE&cMFGXX?pTQP^5l~ri5 ziA(eM6@TZ>1gsh!AjU23Ao>w~9$rEGJ7f`7L4UA0|DJmNm_h6#M%NFUmhhRr0d<71 zayne60BD)S)tGd*pKQyo^b@7J78M;@rVEH4ewnMF%o6L(;*G;8!I z;(Vw#S+1+G2Y`fZ8LTTYyY7udbbk~Wa*7wtrQe9!5zBdR?XRbD z06tsiWY~+GP&yy^h0aD_rOGJLK=Bzom9tx8PA%CT71n1MSD0!||OCNl4Jcl3n;0CJs1*mDHVp4?f#OnO~zeNEzVYux+a{`L5u z?pmUJ=^+5`$Xn;~z}kD|*3UGj-wBF#o;NqOC+anNWJc4#d`^{ejwoGPzwAn5OD~#*Uk2_Vy?+L`MlB~V@Fetfe64=vb)gh?GWi$2YFppTdGet?s zIsrM@qiJi}0sqUPQuOl6J4xYU6H1aCB!=C1FQMzkrRN3{mLlU7<9L3W;c95=D~7Vf zz_Qaws)z$t&t{cG*ZOYT{5Uc4VK@c>FWfOUhn+#d6GOTs{JgiWU|=rAu{(e8aN>vQ zv_irM1d&%}S;jSkO`G!OJ|4&Nr8`+ePTk^5g}o~ES*F~%d<&vs$m1f*4YGuKmF?6e z!>H}^A%mBZgIm4X!l%TXQv!%O3&6# z8@|3Y%areS5n|~=Hi&HGq#Ov3K^1t-GZ={hE9Z@d#4T*dtMJrQOw10{|8w(b9KZss zX0GNW&r}Lr0`Bloc7AwWHZ*);-SRA`?}Ka5+qO*O9e4vy}VzyYI<_ z9_@xHDHLcfM$GaZjrKPhalPuaVfMwT`~#9}kXGUaSBa)Ibjv*}-o?Q>PrP|nlRkCZ zWs?_)A4YDPE1QXnRZ>c%#-JueU&eGjBA`Z{VajZy5QtfIem=pRJI@*o1w>meTc%Ch ziQ}<3k6g+?V#|fTN5`H%>e?2SaYv!%3GaxMY4SOgQUXAR5aXD$1bOYC{0pP0ev!9# z#kHp0Zi^BoQROpV-Kz^XX5d#MN}qac_2+qBb*K>W;g7ZgO<(^SfX- z$S2u}o?ZF~?hip+A$rF-wE0;%IY$x=x(eq0EBKWVuBGN0IMTrVaVdh zsQmct3YS{{lvYogp?=u#%)|jDXJ+a}+#3V%`ThI%^K}n*^LeSMJufvS&nXh(dIHkLd>IB~E3+u;$UteD&tVf?W>O1{F>e}flWM-5M0b6>>&rT+f54QzNRX7grQ7o~xp|Z# z-Vqg?wq3(+FU!D1jHwvo&3dleJdf8YtUYLFnd}t66)%3ryUgO?ER_14dCD<8!AFOi z_z6!)mEikL$0;NDzyom6S4OZd`a`3ie`9LCzenGNspD(R^WK@%Dj##W0)*Xvhn=nu zstIz8j0nYJ?hk+_G zazh0-Vb0PESEuiqy*LQreY2F!dcXM0K~=k0YviyrC1U@SI9xN8Bf&-6-u&u&RvY51 z9HJJTs)UHNHjJFEd#k}3R_E5$4SyS-DSLl<(c0@15SRPYB@y3Pm&1J+4GkL&E;DJ5o!t$E3+kCCQa0wY9q2mpiV~Qr)~iT;@bAakn5dQNUP=aqpG0 zXq9`h*Hk_}aQ?I@obvP#;a-W8hi-QuRZ!M{cu?#)is82k)7Fc{>^;}^d3u-==B`FB#z<@lkWffLzI z1vi2F9J36J@jpEdlV}}lH)KLBd>3=a(zY{x{zVn)eAkvb(RYfSd(hR%+l**RW6$I8 zQ~Q9wj&MoVDx2O@nnpaB;ff^9?LbqJnS10Hw-ER#LI1ghzyq754qikQ4RuXbjrH}F zWtfbNG>Clm$R(N{Ec_KszBMY!)s~EsxpKq4T5*3cZV$ZOS(Y4-NVV=-o-zwgH1~-4 zc5Son`nzlq9qxiqotp8X2O&oJvC?y1pAWj+djwQH{&Gu_czNpk(BzC<#dQ61{!Dy~ z!{Lq2mh~&CPWp}S<+%%n^p;T@(b>UoGRXEK((z^(RhgtMZrc3_wJ{$3oIi}7Io7z! zEZSw8!CxjP8y>9RsJVd{C7-0X)i!l)P<}%KSOqnOlWe}EjFxP({#;R8SWh4?V+twr zxRc%kei;=jH@Ll|eND<==ytkbU`yJVrQe8hS_Oy5M}~&Z<;!kQqC@&iucn0JPt;|G z9qIJ=)HmoxJ#a}B)Wd1-oKs55onL3?n|Bdp?h`xVkHXE{a&N5$29&P>4}vxt zC^oV9-|@d`b=FptC8XMtvao?6h2|yo^#lO$?s-)7^wCw$mqPM1J-$uBCngjyJ-NKE zKgd^RL*DcCwl`;L*InzCt%fGZ@=L2cKo_)QW6d)Y6_vF5AwtWru_z2K;J;XZ^k$&^tKlMAsv4ej-CSxTk&+CcUbcWiF{IgaH z@Nev_hgNL4G~^GOOnpm=f9b{Z0&Jj)DK}pdwS{L1KBy~mx{a3!WZbI#34X=HTCC2k zI_usGH9i00mUEq4FC{mn^<<-Q=!?ym6~F&z$ubR(;5BVesGBUYN!%J_a4Gvh`pFV( zuj~`qyzs*P3K7`0kc#oH2!Wj30@n(IwBVYE zPaIl;RXv4PR1O|5KO_Ir8+~-xGCa2szqFCO^4MMCm0=X zI}iISEl5{~h|Srkf&>JF_p9TgNn^U&p^ahMdGB$ZOULO$901Vw`b$^IOlCR1Qs;s< zN}(zV&(KWwq-~es+Km$x&Vc;TqGpv}0TNwNOjugJU~`)0$m!_$0Bw`b7ft7#?Xc&U z2BuTs1h+kzq~?NGPh4e(RT7eZnR1l6NPNf>ShzlW>1&4Nb%9?W#O9u5JTC!bbeB_880F8GL_rU~{Xln68-2i&lBIc7 zN@i4o0pSoR_i|1u&w5_S`2B-|mvq1D%LODScHiAcGW;s8&AtBlTT|LTc?xHcf4B-# zH(h~?&_d(Bx9;WYc%I>)UShp?{Bdyug;xCqQ@6Yd~ zE81mkTGFZ55!H_%)^BL{QF%_dJ?Ztdgt|(DtKsrSI#cmS(gy<$-#retj{@{)C#04y zqZ!^ROpArdCVlu|4?7X4svSk_=9C zMjm`WRv`#%t-UVkaCb<1G_u}dy70krBjuht6aii2V)&M6eFA}#_zW~%%jmqVzjnh> zN!>Z;_&58uiAy1IiM*scET^%fP|YNDCun}e%#UEV1&$<4AT)^Pe7&JmRqt2bd8NIF zH57W=RAa47moeJLk8Mjh#)1Dzigk?)#L9{5Rd$X%wF_3o^|e({I&@SG2-nmZLT6F{ zVG-t5eZ32%t#|eoX+!LSjsov~T|J(dx~=DKMej$MFLrdEB{X-h_fAIEoN7(k`%q^k zE8BD;+1Rs&}e~$-f)QdTQNJw zum$Y#A%;+Kd9^C4q(H|yX{p?A&ypMQu@WQBalmUpPPNps0h^G+FOV-cqJ= zfxST&1AuB}^L^pls_L24bh%2Il~Cb2h~UMbL82M;Bw@rq{CIK zwo!+v81V9dSDL<8TsU$u=H_poZ?^T=4PMV)8{YK;BXHJHIjHNJZl`2rk}6L8wtW+9TNu{zICq zz2$#4@7lie@yFtbK~>I1+dHXw->S{lg6pz9-hS#2s80|x(7P~bs6!@$8}i<4KbaD- zJJye+gGHucGuJ6ah~j7ajLB{kzCn;f|6kd2s$_YQ!<;T@>|NUhAH?mhwR4X-XD-jt zqJIm*<{!ns&1+dv@dCC0D~HnA8$9`!6hsczOf5V3!kDybH6Xw%K4u=Q=kGVS2hVrv zMl7usM3xoaJvnRb<*YjP{$4L$`sy@b-#HBt?!=#S?zzU-b_4JG3GBIH#`R-Yo3P@F zk90>!gNA#`Vvn755fnf9x3-qBb5GObLL?HkwbXiRn>2*=%G51q2qBC?GlKr~)E6#{~h2k~5Nn1VwTXP=bO4 zNh(K;v7TO9xg_~%j=zii01JYj}hgZQ|5 zSlD}FyC8~{|GeT0xoEUNG_fQ9>%xx2Qr7;!QlVPs|JOB$d&x))q#M|~*$HTR*utIc zE%Ywf!&TuTLLx#!5<+5dZj`l^x23&{EnLaP$KJ!$#o5}$3xVZJ1m4yzmabOT9#Rne zOMVD>1wF_GMOYo)8#JDX1^_4kJYYvqq}Zq;iZJ=y57RL!*jBGlR5~WAm(DU)xbI&T zT+E6Z0PuhyZsPcYbybHkNn1Luc#k|u`+GM_;DpiIOOnKI4mmAdiW`a@UB(a`MC69} z0H`ck6_zj<3R_u3vV_xtRRojA082@h2MJGUUNDKs06aupaccC%`a0%(x}MuqDiRHq7KW z%$zR#pYkhU@fce!mJWvid2EttD~K1Y3@^S&zQ7F)ufzeYuquHQC$l1w3sj439IEY~ zH`!G*IS<$I4cC!fyaE~;4?7zm&pxyG|0yR0|{1S}u`KvtNk*PUq))CP+Gy@$BI zr__w6#tf(mtVaIl>*)nvz=g16+oU-J5s4<6U#KMrWJ{M%q(F8l349?ke-)lNp80cB zk|J|0uMGD5{p%>*=UlC2>CZ1L=rl&Z0@@NWl+l})F`nr;rb?DsblG}H`JAw-Y!d9F z-^ilqqc;cNv!Bc)Ec<8xjx`+5TrX{ffvqUabFRi#-AjJ|z@p4FYwWe;GB_gY({smG zViU0S+bU~klo;Fh-{B(*+Rc2Ht}i z`7q5kDzhvj=UdqelKrY_UP`q8X#fD|P9#&ih$Gr4{wb9B6pA0MEA>Bn z3`m_4(|9iiDmE1W=mCHYG;%03+9OfkMaqCkc%2mIEnR2{RFq7ToYgB)j!UW~ zS+a-h=MsvWT2VbDjzc0IPX4C&zUtadA~5XX0oni%Bs?Jemd;~LbudqHOqe(uGa$)T zlrpJ`;7_9yMQ{{TTCQXjOsWnRV(8SOvkNILqpH9`03mpj=8q>*Lu6q9U_pi=L4;vY zV~F)c)R6ER6ACF=lBF{yNyHpFButPU0!0)t>5L)znL>6=EV;42OA%9pai~!#y@OfLP-)Dhij9hiYwMzisnAop=s6kkMnX~}2X=ju4e^_b2E?C__ z&oqf^d!e<_)`q%hLmz9yW3>KsfEq~E(fCM>MmM299y+7b0+zkdCi>PNkI{xSfyOgo z%SQprbXd+aQ{EueeA?Q)*?W=OKGWXeMQM2^cX@ePd6RQ_b(QgpujMbwhw5z0t1E}< zYAULoHbH82X?Y!Ac{yK2UFAtR-)2*3d0W*`UG4Mgip{27(jLCeHn;NX>WaE8EVZp_ zv(J6AO~}6(F-5U^~(bf7%Fa4#t8JG@X=n1IFe z9m>QB_Zv+H#!K9o@Ss|s4YFQ)5s;H1g z4Jq6NGjBQe>WUSuk4K*UYm{nDyo})umA1Iuo zh)xapvXREoMR=V7X7D)aH~ zzgBMHz~47*QH2%G^D;FV6u$n+C{_|PX#uiIM#X|7jGbDG(;PrTCMu?J{gbDY_|XTW zN~{bu@C)IY(0Zr`Mx7vBKsJcjIu9E{ux=|Ci5gS2hkA@i@(|09NOF~VsLLY|=n*+0 zj>a)b1fq9Zl8B>-MvaHRSI-fF09U~e<{cMqOP~?e3n3vlBnA{gFYbebafg7uh%RKD zt`KGkWi6ru?NS7@1a(X2Ng>ZeZ#gE%jR@63@*u*XNL7v^FzY2@0`obiaf|^IIHAip z@_@{OOgJ3wr7Oa7HB=qRRrVCrXq7hzg`(aOBZsPnSy`g0uxSxB4iE}9Rd3UccmZGw zoY2-q9N_>G2?1HU0#L4`E!1K}@+*@V7#W#DDR}y_LMY^ksKIG~->MNwu!72i1Tf#r z4*{zp%p{h8LVkmTeTX72ECGWe0RSF1Fe9qfw(<;4$^&C24)72gGm(;n`Ix(iJ~$>B z1&RZgROUej>aJH0OTZXy!9i#^iTgl7SoIkxAgg)}9IIK1rY$PPXFw1)u4g(TL4xCG zD*(*n69Tokj7m4S=!kj5tS%N21P9d^D;y59h!)<+QXoR~rh_?7F&#Gb06((W{38}5 zfRBA3L2`o$TV;91|2r}HcZ>M{vxqV<&$_Ayey#iH7>O>k^1GB5kCsmVBoJ4{CNoQFJI*^egICV#UMB}tYY$K?DFhWdQ#E4HD zkpfFDZa|Pqt$TQCVf~wlr3+iLfXTM}g|@L90~BbBJS0#MoazzT15F^AA%VK8TUnt18fmrCU6&E45b89ISk18vJXQE%D71H zFeoe{LDgUh7f`)u5wl>`b@4LG}vvKI`oI*Bd6!PT-GKmtKz0N_6B zu!)!+fcIvFrm2M{dO$4%uA-tPm0wz`(D%|!VT6ldIw;4lSr)O{n%R~};hsv29+EpL zc+#V?(PsqQ4#J55At;OJQ&|X%ZU7V%iiZI5YP-jU@8jXEQi_m}k@SapPTJ!F(9i+0 zq(}oYN~-dwFDz~W2KOHf5C)OO#Wlo`eiiA)H<|Z_hr;n#B6}gQ#Gnu=7r!s$nk}!1 zZz&Z~T<(e?z%>9!CWo`KW=h6WBwR^^CS6UYOrgSn@CAS+NYE7^h#fyNGSVi#pl1b_ zUC}DE@a-xd#|0T%5fNQ(Rq!s_m%HX}jY~3i*NhcInBUET;I8N9;}_uJlk!2mHlCmwvfB#Ri_8^Z*u9R7VjQ+-0j^i*hu65`73A;GsR=MUMoTC9g%8qf0t~~{WNM|k~ z6!(q)dAQ!zM5x?{Q&x@Lm`yFms*^^+9U6#TC$t4ExC}V2L!_Bm;)}G*WQ`!&+Fs6`|<+^$bX*&*vZcpc% z#p#@^?j8e*ln5jGAsCEbQqkoYYbwloXP4tiZSne1IECd!uEWze1pWmw6HgW>QD5Pe?nFI3% zejG9&AvGhJQZni_QTI0^5NRc|IT!)JUec3yKz%IXWidhS(&fYapu)y5j;ShRs2&p^BInk z-a;1ceMtS{#=d%)la0@Olq_}boRomRw7|Y9aC-HSC{p>SlI*@y_O>muo4VF1J;VNS z*tLerNr94nZllC){!?whia`ljPdMdjrsJ=C&B?hJ$(M^;6)^7#Y~7j9y_IX@Ww3ZlYDB! zSJLu4OZ&f5`FU5=O|PG1ls466b$qF}Q~Hj2`mCG~Xwzeo7o+{wbtRO`Fl_ly85giN z060@1dEiM64Fuq}ITbw=_d>*cp*^q2;Xrq2Pup-C1n6u@@Mu`s4lq1!x!rh1Se^5- zasG3~%{%8U6NCmTJ-k9OP}J7w%q zw$VXg#q(D?8{xFgcAk%qrs1lwo#`LL$?!T&z6XZobamf~FOI*2Osesmc z`h+^W$<4^r{(ZsNMRhvUO>eh}cTeksbSdwSOi<8ttHHj4UrhfQd7bgq+lhB@(6r?h8h(^2d-jR>;@@5la&jOpqX7ub_|{;q^p7&|_P_)SOmK8zP86}b59J4+2e0pV<0Up z0nlmN0KYnUj(~T)cJt@B?);=4f02$b)k#DYHw70+hp10l5v%_Nvj_OyC-(&gDnjmP zXrA@GPF`GMzAjzD7;MQ@ZU`#NS_I$H5mRq+1M4THhe{t2g1``ibe! z(;pK}$|w`P$yA2Sv--Z1zXxZn!5r42XnLdi*`^os>?#Vb`VbAN%KbiM2QAV7JmWj> zvRtYNUiRaVc`uXyKqpR<;7Y8$pa$n81W2@$)x_Ai_@xzRK0v8W7Ot+%TsK1};0o-v z6(a%!S?5M>F$W`gGW~Z~ubZ?k^-Pv~tDikn*Q>nIl}>i@K)VJaI`ebQApel3udMFfF2*h6ktWuBJXNF?#D@bU z!lH=#4<$+->Zs?r(lcY&h9qHpo5VYi6;dNLiVgH2dW^z0M&I4EE!DOy|tb1Ngw1_)SGOuzl00gEt zu#m5JUE$Lt==rG@*xW`kGZGeI+JyJn3ty$@vserOe9irG7VFtsU>?ksOd&4nyui0G zT{%Pa>Thks^15zp0hDjg1#P)?+e31eP`X`5P~z|PhjCd^XX}()OK;*HS5;d$!!e&2az1DvJnLSt3VnYCPPdiImqZccpF zveJBGf0JA#ZW7!yG~7sO@cAvxdp^Tf>2|&~4D*zE;&R8qxU*k~A|Zs&BTQl5ETiS? zDm_EpHs#63pf@ zpMkk+k?uvCe!w-Qxvv+$T&#!A_@s3oo+@uXJJ-70EM;LB-mrD!7U$?u)Wb~R^_ii< zW_6b{A3G2jIRd8}e3C$*gWt2C>TfMG!EwbjxR7cDXtUoS)F_kz&mi@BhUph2jcfo>;wAMlm|TWEAhSLOUKDXYu5KUhTp|3;jku&*Z#8cc$HpG`{B%HngYn$ ziS@qvW!UE6L+am5~~P2OuMYu60Gk zRt10S6l`UjALi7qOIOF0(7+3F`IPw`Ymd-mx+;n61a@EhtZWpg*^W=<0PX(WSmQYR zE1O?zuDA^r&SiSF(|DwXd#Cr{y(GZ5x(-C4iDWyuA+fjWr?G?S_FbN@`vy==4@B>J-?Q3RF;#0-{dRYoXs;K{Or^AOa*6;q>CKN z8(R7!Pa^`aFzS2r`y9B54a;1m>$yMC=^y36beLvp^VXX3DgLLXHr+&iZ}wcD{QeAy zEQ1;LiRJ}v?_eWjwBi%_022|aI<_ljc_ei=cG$L|@_5};LX8o-!cY~@w5RbD5xxK* z9XSHf{o2K)pxaZ6POkS0Hm>FVmS>2g``evzhl>h4-g{P~;rVT69p-sh`ZkMpsyJ<( zAuLlfpS=db+?C3a0drNM`RqRQqJM8zHi+UdxDTas_c=K+kC1L{kMD;1uv-Lma*_39 z*(%pU&<}Q1l%$h%+zEN$Kng=IT+{W_XG%oo=9-;KPJMR-!A#X-T*0_E(wu4{{G(Fw zKD~VsZmQc|D+?Joxesw>+7EJhkJMbG{d9?8;FNEqtC;<8Jh}$6;x?n6$79cHhN$DF zJirEdpy$xcB5T=Ej7?XE%fjJ{e&b0^)nQY#skp-mWEoRJ&ER*k~$&1(8>=IS}#i(u+{(*!`lVS@^cK?RO_(YfUJV)k` zuq{K5;k=D{KvE5jWr(4&AqC?}3eHO$#qRB;C7h7p17~L+{Lorh_v3awrI;n7soPVd zx{t=Drd}u$purr$cLXZ7_XMZqwbw51p!|7;z?OtGUdjSl-XW#g9{>=VsJOdbOYJzd z>HAKhIsMV2L*&lUgJP48(bv7C$6S)?F+bT@G^qV_h&x1~oK2;V9}@m0W{MLPjk(jc zM(F9+eQy9k@<#XQalt;HTP}I-?PW{c?Cm*D9s=u!7C4zFf`_g&um%jGztTqMdFzjm z*zF&Ul)u|v>69#8TPrMOzGb$%W$>9-r;BFTJhpWqK!%Cq8?HZaaoB;E;P>yt4qULw zXWyDgTHoAXSyTHm3sX@7E{;-U?8$ZJCX(U`vmc{@a)h3g>8!FdRlr&tM*sjgMJPYz z@0ns>BP(2KADDGfP*|X|>19Sw0BqEKo+CDNnd?lUHmp zFX|n=1C)6G@S%3(sJ*u0Vz)vIXX=O1TUt=q2d~pxAKA@GtK1szyLo>|+fB$kJs794 zylHaK{3+<}4<9Cddid9uO!N_ml=i&-(BEnWG7$qdXd9__Q;54l}t60QXNTuz&knesY$bv_tFAI{Yq zFtl>3H|guEH~r@C0M`A)wEfwX`RdNJ9jyQ^^+!IBCh6G=4z?;WDPiUL@}qyRD+S$u zU*GQFOdnXpVD#81t&3dQ%lu_{NA2Rz>RJ)zhcKxyV~ej2x=jve#0jpW%&5l;niRR_ ziS3ILi(@knk800Lbg97oOM@^47;`j*#$^E6U`jbp0Ac{45Q69hbz1?6(%?ZC8&5Y~ z;{g3ysEtYdPhJg_t zXUhNKH^3R3g3siSZ&Ye{uffWESV@`#F#Z;$0p1JjTsvxo-X7ogk|XNgkLKu@>R;cM zYoH6`eecKi$NQFKVC!&Orzldvi(!d2jdm-QQF+#cE(z&Fw~{h)n_ud)A3xXP!%=T9 z33IWh5L3HVZt~MyfFhmZR49}gB4e{pObCou5fecRRzZi(Q@Neqa_7qno0|?u7quTZ zMf|w~I_fI+#41LktF_GJQQ1d&cBF~R9IELLY^O8c&`(snDw?6sp}RBYb2c7x&{3H3 z>ZX)DX8^aUUenqfx*oD!h2z@);sqp)cSW?FsBx5wr8CeUk@dR|(`uwq+}JujWDxCk z{;mC5mciyn<8>G!z;+|?HMJxeU~1ctAGy?ZrRB9-N9{TJ-w>N8WvCpZgsP<}zfl-dE4ow~bZELNTX#QBhuLX6h98f5tIM1NQJD5$}M_+#Gt$Akt5 zX7Se!r_SFn)~?7i)kxGFES)eKsFpoVy3tSNDfX(xT>ynwmBii{64)w6G5xWrS^pzt z^@llOTK=0OI1GL>W!l>Q%w^F|jz&BNrS}Accq^+_GE-_KM@pi8{to6O5uL^-U{HDE z(iL%T(6rOF*9L8H9&BW^a!*vvY?ef7y-i~~LF16i9WJ z@d2CM!x-D!ifi*pG~r}x%-nS{dwN^DY)*x#{zH6ZDI}FF{5+yc+w83~iA9@zJ{Q{PMAcUk?D&$q_o(#;TiygiyUZR%jHL#UxD=Ejd8L!X|GK>&=35%y!YJ$WDB7WnRr*gMl1(PE z+5$AD!e@`-z1!uUzYsg2wU2A7`iABNuGzr+7?T*#v}aUS*LK34m)f;(A7$_M^Sl9f zl&t*WC7SML^gmW`mquh5G06k-z#OsXVi<2Msi}V2M5fIeHQ@#W|>-Nt*yPGR@5ZT z`uzQFf-4vwEE<|c&=7S5N8ogb9-(?_iPo_wad0;r?jTU1$Uo)5ndd~|H9 zc-WsNjxjdj6R59udV)c(>7_p7i_!6+NpBu-Id}ZQaEs0HZPFR{#J2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/door_overcharge_off.png b/Resources/Textures/Interface/Actions/actions_ai.rsi/door_overcharge_off.png new file mode 100644 index 0000000000000000000000000000000000000000..b7b4afd72f6f39644136854534b26f733ee561eb GIT binary patch literal 585 zcmV-P0=E5$P)*s?Y%DA+Y{l9}@&I-gzJL$l z3s~5Roe*rS#aFN}g&=`+k}jMGCrXGnhjY%&&EC#jg!6+yLN?#e%w%`Zxtg(HS=`@f z%rxtIqp6x#wGf57D^nHe@S~wNQo2AA-gz$n&EuBKs$?-DiUS!XW~luYCVwBnHZ=6ct~@gV(td=k6cyQr{Usvyh-oryvPLgHFb zao`JbV&6l=*!#EFcJ4)I0sAiT@p%v{Fb{b0(E8K>?R^<|?SJmQlAafO{+WTf_ z?1uYe6%YST-2z{F5Koe4INxk(DQyNMaPjU#+svUdAf@+-!z_e$N3#Krzeuh&z|(8Q zEmc_3I+eteiFU5@JN?OqWT8t@S^=J(C#Qm3Tw8^lfwHZb{?D=O&7bs^m79e|GoFseraFAqG`=9xDxjL|Kh{cqsiI2P@L(-zU3w& zZDAY_KG~`+beJmeU~-isZ}JD`n0@SCfg)TYtqid>d`vfL_(hI=u(e$15XNz!hHp!c z%-bcF3{Pf1jq zd9uywj%2fk7BQ-3GA?J{@Ket6MCZmiGqxC56f Date: Sun, 8 Sep 2024 23:09:14 +0300 Subject: [PATCH 10/25] meta.json should use tabs not spaces --- .../Actions/actions_ai.rsi/meta.json | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json b/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json index 555cbe734d12e4..8acc3ef2067f29 100644 --- a/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json +++ b/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json @@ -1,27 +1,27 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/blob/c473a8bcc28fbd80827dfca5660d81ca6e833e2c/icons/hud/screen_ai.dmi", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "ai_core" - }, - { - "name": "camera_light" - }, - { - "name": "crew_monitor" - }, - { - "name": "manifest" - }, - { - "name": "state_laws" - }, + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/blob/c473a8bcc28fbd80827dfca5660d81ca6e833e2c/icons/hud/screen_ai.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "ai_core" + }, + { + "name": "camera_light" + }, + { + "name": "crew_monitor" + }, + { + "name": "manifest" + }, + { + "name": "state_laws" + }, { "name": "station_records" }, @@ -52,11 +52,11 @@ { "name": "unelectrify_door" }, - { - "name": "door_overcharge_on" - }, - { - "name": "door_overcharge_off" - } - ] + { + "name": "door_overcharge_on" + }, + { + "name": "door_overcharge_off" + } + ] } From ac195436d0ebb82a908ae67074a40422d722ddec Mon Sep 17 00:00:00 2001 From: "pa.pecherskij" Date: Sun, 8 Sep 2024 23:18:48 +0300 Subject: [PATCH 11/25] refactor: extracted sounds for airlock overcharge to static field in system --- .../Doors/Systems/SharedDoorSystem.Bolts.cs | 2 +- .../Components/ElectrifiedComponent.cs | 37 ++++++++++--------- .../SharedStationAiSystem.Airlock.cs | 13 ++++--- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs b/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs index dc4dfdec2c96de..35681bfd822931 100644 --- a/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs +++ b/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs @@ -77,7 +77,7 @@ public void SetBoltLightsEnabled(Entity ent, bool value) public void SetBoltsDown(Entity ent, bool value, EntityUid? user = null, bool predicted = false) { - if (ent.Comp.BoltsDown == value || !ent.Comp.Powered) + if (ent.Comp.BoltsDown == value) return; ent.Comp.BoltsDown = value; diff --git a/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs b/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs index dedbea21b905be..522b4e0f69f493 100644 --- a/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs +++ b/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs @@ -9,67 +9,67 @@ namespace Content.Shared.Electrocution; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class ElectrifiedComponent : Component { - [DataField("enabled"), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool Enabled = true; /// /// Should player get damage on collide /// - [DataField("onBump"), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool OnBump = true; /// /// Should player get damage on attack /// - [DataField("onAttacked"), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool OnAttacked = true; /// /// When true - disables power if a window is present in the same tile /// - [DataField("noWindowInTile"), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool NoWindowInTile = false; /// /// Should player get damage on interact with empty hand /// - [DataField("onHandInteract"), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool OnHandInteract = true; /// /// Should player get damage on interact while holding an object in their hand /// - [DataField("onInteractUsing"), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool OnInteractUsing = true; /// /// Indicates if the entity requires power to function /// - [DataField("requirePower"), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool RequirePower = true; /// /// Indicates if the entity uses APC power /// - [DataField("usesApcPower"), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool UsesApcPower = false; /// /// Identifier for the high voltage node. /// - [DataField("highVoltageNode"), AutoNetworkedField] + [DataField, AutoNetworkedField] public string? HighVoltageNode; /// /// Identifier for the medium voltage node. /// - [DataField("mediumVoltageNode"), AutoNetworkedField] + [DataField, AutoNetworkedField] public string? MediumVoltageNode; /// /// Identifier for the low voltage node. /// - [DataField("lowVoltageNode"), AutoNetworkedField] + [DataField, AutoNetworkedField] public string? LowVoltageNode; /// @@ -96,25 +96,28 @@ public sealed partial class ElectrifiedComponent : Component [DataField, AutoNetworkedField] public float MediumVoltageTimeMultiplier = 1.25f; - [DataField("shockDamage"), AutoNetworkedField] + [DataField, AutoNetworkedField] public float ShockDamage = 7.5f; /// /// Shock time, in seconds. /// - [DataField("shockTime"), AutoNetworkedField] + [DataField, AutoNetworkedField] public float ShockTime = 8f; - [DataField("siemensCoefficient"), AutoNetworkedField] + [DataField, AutoNetworkedField] public float SiemensCoefficient = 1f; - [DataField("shockNoises"), AutoNetworkedField] + [DataField, AutoNetworkedField] public SoundSpecifier ShockNoises = new SoundCollectionSpecifier("sparks"); - [DataField("playSoundOnShock"), AutoNetworkedField] + [DataField, AutoNetworkedField] + public SoundSpecifier DoorElectrified = new SoundCollectionSpecifier("sparks"); + + [DataField, AutoNetworkedField] public bool PlaySoundOnShock = true; - [DataField("shockVolume"), AutoNetworkedField] + [DataField, AutoNetworkedField] public float ShockVolume = 20; [DataField, AutoNetworkedField] diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs index d60b306557e31a..c93e0467cec610 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs @@ -9,6 +9,9 @@ namespace Content.Shared.Silicons.StationAi; public abstract partial class SharedStationAiSystem { + private static readonly SoundPathSpecifier AirlockOverchargeDisabled = new("/Audio/Machines/airlock_overcharge_on.ogg"); + private static readonly SoundPathSpecifier AirlockOverchargeEnabled = new("/Audio/Machines/airlock_overcharge_off.ogg"); + // Handles airlock radial private void InitializeAirlock() @@ -74,12 +77,10 @@ private void OnElectrified(EntityUid ent, ElectrifiedComponent component, Statio } _electrify.ToggleElectrified((ent, component), args.User, predicted: true); - _audio.PlayEntity(component.Enabled - ? new SoundPathSpecifier("/Audio/Machines/airlock_overcharge_on.ogg") - : new SoundPathSpecifier("/Audio/Machines/airlock_overcharge_off.ogg"), - args.User, - ent - ); + var soundToPlay = component.Enabled + ? AirlockOverchargeDisabled + : AirlockOverchargeEnabled; + _audio.PlayEntity(soundToPlay, args.User, ent); } } From fc889c47d4905feb1aa4011389b47a4147064882 Mon Sep 17 00:00:00 2001 From: "pa.pecherskij" Date: Mon, 9 Sep 2024 21:07:45 +0300 Subject: [PATCH 12/25] refactor: cleanup, ScarKy0 mentions for resources --- .../StationAi/StationAiSystem.Airlock.cs | 82 ++++++++++--------- .../Systems/AdminVerbSystem.Tools.cs | 2 +- Content.Server/Remotes/DoorRemoteSystem.cs | 2 +- .../Doors/Systems/SharedAirlockSystem.cs | 9 +- .../Components/ElectrifiedComponent.cs | 3 - .../SharedElectrocutionSystem.cs | 19 +++-- .../SharedStationAiSystem.Airlock.cs | 26 ++++-- .../StationAi/SharedStationAiSystem.Held.cs | 1 + Resources/Audio/Machines/attributions.yml | 9 ++ .../Actions/actions_ai.rsi/meta.json | 2 +- 10 files changed, 97 insertions(+), 58 deletions(-) diff --git a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs index 2543415389d9cc..77cf0684d64e45 100644 --- a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs +++ b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs @@ -7,6 +7,8 @@ namespace Content.Client.Silicons.StationAi; public sealed partial class StationAiSystem { + private readonly ResPath _aiActionsRsi = new ResPath("/Textures/Interface/Actions/actions_ai.rsi"); + private void InitializeAirlock() { SubscribeLocalEvent(OnDoorBoltGetRadial); @@ -16,52 +18,58 @@ private void InitializeAirlock() private void OnDoorBoltGetRadial(Entity ent, ref GetStationAiRadialEvent args) { - args.Actions.Add(new StationAiRadial() - { - Sprite = ent.Comp.BoltsDown ? - new SpriteSpecifier.Rsi( - new ResPath("/Textures/Interface/Actions/actions_ai.rsi"), "unbolt_door") : - new SpriteSpecifier.Rsi( - new ResPath("/Textures/Interface/Actions/actions_ai.rsi"), "bolt_door"), - Tooltip = ent.Comp.BoltsDown ? Loc.GetString("bolt-open") : Loc.GetString("bolt-close"), - Event = new StationAiBoltEvent() + args.Actions.Add( + new StationAiRadial { - Bolted = !ent.Comp.BoltsDown, + Sprite = ent.Comp.BoltsDown + ? new SpriteSpecifier.Rsi(_aiActionsRsi, "unbolt_door") + : new SpriteSpecifier.Rsi(_aiActionsRsi, "bolt_door"), + Tooltip = ent.Comp.BoltsDown + ? Loc.GetString("bolt-open") + : Loc.GetString("bolt-close"), + Event = new StationAiBoltEvent + { + Bolted = !ent.Comp.BoltsDown, + } } - }); + ); } - - private void OnEmergencyAccessGetRadial(Entity ent, ref GetStationAiRadialEvent args) + + private void OnEmergencyAccessGetRadial(Entity ent, ref GetStationAiRadialEvent args) { - args.Actions.Add(new StationAiRadial() - { - Sprite = ent.Comp.EmergencyAccess ? - new SpriteSpecifier.Rsi( - new ResPath("/Textures/Interface/Actions/actions_ai.rsi"), "emergency_off") : - new SpriteSpecifier.Rsi( - new ResPath("/Textures/Interface/Actions/actions_ai.rsi"), "emergency_on"), - Tooltip = ent.Comp.EmergencyAccess ? Loc.GetString("emergency-access-off") : Loc.GetString("emergency-access-on"), - Event = new StationAiEmergencyAccessEvent() + args.Actions.Add( + new StationAiRadial { - EmergencyAccess = !ent.Comp.EmergencyAccess, + Sprite = ent.Comp.EmergencyAccess + ? new SpriteSpecifier.Rsi(_aiActionsRsi, "emergency_off") + : new SpriteSpecifier.Rsi(_aiActionsRsi, "emergency_on"), + Tooltip = ent.Comp.EmergencyAccess + ? Loc.GetString("emergency-access-off") + : Loc.GetString("emergency-access-on"), + Event = new StationAiEmergencyAccessEvent + { + EmergencyAccess = !ent.Comp.EmergencyAccess, + } } - }); + ); } - - private void OnDoorElectrifiedGetRadial(Entity ent, ref GetStationAiRadialEvent args) + + private void OnDoorElectrifiedGetRadial(Entity ent, ref GetStationAiRadialEvent args) { - args.Actions.Add(new StationAiRadial - { - Sprite = ent.Comp.Enabled ? - new SpriteSpecifier.Rsi( - new ResPath("/Textures/Interface/Actions/actions_ai.rsi"), "door_overcharge_off") : - new SpriteSpecifier.Rsi( - new ResPath("/Textures/Interface/Actions/actions_ai.rsi"), "door_overcharge_on"), - Tooltip = ent.Comp.Enabled ? Loc.GetString("bolt-open") : Loc.GetString("bolt-close"), - Event = new StationAiElectrifiedEvent + args.Actions.Add( + new StationAiRadial { - Electrified = !ent.Comp.Enabled, + Sprite = ent.Comp.Enabled + ? new SpriteSpecifier.Rsi(_aiActionsRsi, "door_overcharge_off") + : new SpriteSpecifier.Rsi(_aiActionsRsi, "door_overcharge_on"), + Tooltip = ent.Comp.Enabled + ? Loc.GetString("bolt-open") + : Loc.GetString("bolt-close"), + Event = new StationAiElectrifiedEvent + { + Electrified = !ent.Comp.Enabled, + } } - }); + ); } } diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs index 7db58b05163029..56cf2878506060 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs @@ -99,7 +99,7 @@ private void AddTricksVerbs(GetVerbsEvent args) Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/emergency_access.png")), Act = () => { - _airlockSystem.ToggleEmergencyAccess((args.Target, airlockComp)); + _airlockSystem.SetEmergencyAccess((args.Target, airlockComp), !airlockComp.EmergencyAccess); }, Impact = LogImpact.Medium, Message = Loc.GetString(airlockComp.EmergencyAccess diff --git a/Content.Server/Remotes/DoorRemoteSystem.cs b/Content.Server/Remotes/DoorRemoteSystem.cs index 2b9f218e203f77..de327bd084038a 100644 --- a/Content.Server/Remotes/DoorRemoteSystem.cs +++ b/Content.Server/Remotes/DoorRemoteSystem.cs @@ -74,7 +74,7 @@ private void OnBeforeInteract(Entity entity, ref BeforeRang case OperatingMode.ToggleEmergencyAccess: if (airlockComp != null) { - _airlock.ToggleEmergencyAccess((args.Target.Value, airlockComp)); + _airlock.SetEmergencyAccess((args.Target.Value, airlockComp), !airlockComp.EmergencyAccess); _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(args.User):player} used {ToPrettyString(args.Used)} on {ToPrettyString(args.Target.Value)} to set emergency access {(airlockComp.EmergencyAccess ? "on" : "off")}"); } diff --git a/Content.Shared/Doors/Systems/SharedAirlockSystem.cs b/Content.Shared/Doors/Systems/SharedAirlockSystem.cs index 78ecc42c1257cd..d750dfcc9bf0ff 100644 --- a/Content.Shared/Doors/Systems/SharedAirlockSystem.cs +++ b/Content.Shared/Doors/Systems/SharedAirlockSystem.cs @@ -125,12 +125,15 @@ public void UpdateEmergencyLightStatus(EntityUid uid, AirlockComponent component Appearance.SetData(uid, DoorVisuals.EmergencyLights, component.EmergencyAccess); } - public void ToggleEmergencyAccess(Entity ent, EntityUid? user = null, bool predicted = false) + public void SetEmergencyAccess(Entity ent, bool value, EntityUid? user = null, bool predicted = false) { if(!ent.Comp.Powered) return; - - ent.Comp.EmergencyAccess = !ent.Comp.EmergencyAccess; + + if (ent.Comp.EmergencyAccess == value) + return; + + ent.Comp.EmergencyAccess = value; Dirty(ent, ent.Comp); // This only runs on the server apparently so we need this. UpdateEmergencyLightStatus(ent, ent.Comp); diff --git a/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs b/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs index 522b4e0f69f493..c3a6f2c229cf92 100644 --- a/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs +++ b/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs @@ -111,9 +111,6 @@ public sealed partial class ElectrifiedComponent : Component [DataField, AutoNetworkedField] public SoundSpecifier ShockNoises = new SoundCollectionSpecifier("sparks"); - [DataField, AutoNetworkedField] - public SoundSpecifier DoorElectrified = new SoundCollectionSpecifier("sparks"); - [DataField, AutoNetworkedField] public bool PlaySoundOnShock = true; diff --git a/Content.Shared/Electrocution/SharedElectrocutionSystem.cs b/Content.Shared/Electrocution/SharedElectrocutionSystem.cs index f6e0a2bc175d49..3b2d761e6b835d 100644 --- a/Content.Shared/Electrocution/SharedElectrocutionSystem.cs +++ b/Content.Shared/Electrocution/SharedElectrocutionSystem.cs @@ -23,6 +23,19 @@ public void SetInsulatedSiemensCoefficient(EntityUid uid, float siemensCoefficie Dirty(uid, insulated); } + /// + /// Sets electrified value of component and marks dirty if required. + /// + public void SetElectrified(Entity ent, bool value) + { + var oldValue = ent.Comp.Enabled; + ent.Comp.Enabled = value; + if (value != oldValue) + { + Dirty(ent, ent.Comp); + } + } + /// Entity being electrocuted. /// Source entity of the electrocution. /// How much shock damage the entity takes. @@ -43,12 +56,6 @@ public virtual bool TryDoElectrocution( private void OnInsulatedElectrocutionAttempt(EntityUid uid, InsulatedComponent insulated, ElectrocutionAttemptEvent args) { args.SiemensCoefficient *= insulated.Coefficient; - } - - public void ToggleElectrified(Entity ent, EntityUid? user = null, bool predicted = false) - { - ent.Comp.Enabled = !ent.Comp.Enabled; - Dirty(ent, ent.Comp); } } } diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs index c93e0467cec610..937e62f7783a2c 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs @@ -21,6 +21,9 @@ private void InitializeAirlock() SubscribeLocalEvent(OnElectrified); } + /// + /// Attempts to bolt door. If wire was cut (AI or for bolts) or its not powered - notifies AI and does nothing. + /// private void OnAirlockBolt(EntityUid ent, DoorBoltComponent component, StationAiBoltEvent args) { if (!TryComp(ent, out var whiteList)) @@ -37,6 +40,9 @@ private void OnAirlockBolt(EntityUid ent, DoorBoltComponent component, StationAi _doors.SetBoltsDown((ent, component), args.Bolted, args.User, predicted: true); } + /// + /// Attempts to bolt door. If wire was cut (AI) or its not powered - notifies AI and does nothing. + /// private void OnAirlockEmergencyAccess(EntityUid ent, AirlockComponent component, StationAiEmergencyAccessEvent args) { if (!TryComp(ent, out var whiteList)) @@ -50,19 +56,21 @@ private void OnAirlockEmergencyAccess(EntityUid ent, AirlockComponent component, return; } - _airlocks.ToggleEmergencyAccess((ent, component), args.User, predicted: true); + _airlocks.SetEmergencyAccess((ent, component), args.EmergencyAccess, args.User, predicted: true); } + /// + /// Attempts to bolt door. If wire was cut (AI or for one of power-wires) or its not powered - notifies AI and does nothing. + /// private void OnElectrified(EntityUid ent, ElectrifiedComponent component, StationAiElectrifiedEvent args) { - if ( - !TryComp(ent, out var electrified) + if (!TryComp(ent, out var electrified) || !TryComp(ent, out var whiteList)) { return; } - SharedApcPowerReceiverComponent? apcPowerReceiverComponent = null; + SharedApcPowerReceiverComponent? apcPowerReceiverComponent = null; if ( !whiteList.Enabled || electrified.IsWireCut @@ -73,10 +81,10 @@ private void OnElectrified(EntityUid ent, ElectrifiedComponent component, Statio ) { _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); - return; + return; } - _electrify.ToggleElectrified((ent, component), args.User, predicted: true); + _electrify.SetElectrified((ent, component), args.Electrified); var soundToPlay = component.Enabled ? AirlockOverchargeDisabled : AirlockOverchargeEnabled; @@ -84,20 +92,26 @@ private void OnElectrified(EntityUid ent, ElectrifiedComponent component, Statio } } +/// Event for StationAI attempt at bolting/unbolting door. [Serializable, NetSerializable] public sealed class StationAiBoltEvent : BaseStationAiAction { + /// Marker, should be door bolted or unbolted. public bool Bolted; } +/// Event for StationAI attempt at setting emergency access for door on/off. [Serializable, NetSerializable] public sealed class StationAiEmergencyAccessEvent : BaseStationAiAction { + /// Marker, should door have emergency access on or off. public bool EmergencyAccess; } +/// Event for StationAI attempt at electrifying/de-electrifying door. [Serializable, NetSerializable] public sealed class StationAiElectrifiedEvent : BaseStationAiAction { + /// Marker, should door be electrified or no. public bool Electrified; } diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs index d81ca6df23abcc..41e0b4ea4bf170 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs @@ -145,6 +145,7 @@ private void OnTargetVerbs(Entity ent, ref GetVerbs Text = isOpen ? Loc.GetString("ai-close") : Loc.GetString("ai-open"), Act = () => { + // no need to show menu if device is not powered. SharedApcPowerReceiverComponent? component = null; if (PowerReceiver.ResolveApc(ent.Owner, ref component) && !component.Powered) { diff --git a/Resources/Audio/Machines/attributions.yml b/Resources/Audio/Machines/attributions.yml index b1f99245468303..7483cdcff304ff 100644 --- a/Resources/Audio/Machines/attributions.yml +++ b/Resources/Audio/Machines/attributions.yml @@ -171,3 +171,12 @@ license: "CC0-1.0" copyright: "by Ko4erga" source: "https://github.com/space-wizards/space-station-14/pull/30431" + +- files: + - airlock_emergencyoff.ogg + - airlock_emergencyon.ogg + - airlock_overcharge_off.ogg + - airlock_overcharge_on.ogg + license: "CC0-1.0" + copyright: "by ScarKy0" + source: "https://github.com/space-wizards/space-station-14/pull/32012" diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json b/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json index 8acc3ef2067f29..e1d2c7299db4a7 100644 --- a/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json +++ b/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/blob/c473a8bcc28fbd80827dfca5660d81ca6e833e2c/icons/hud/screen_ai.dmi", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/blob/c473a8bcc28fbd80827dfca5660d81ca6e833e2c/icons/hud/screen_ai.dmi and sprites made by ScarKy0", "size": { "x": 32, "y": 32 From 43261a51bb7b710ec5bb498226188ce7076bc55e Mon Sep 17 00:00:00 2001 From: "pa.pecherskij" Date: Mon, 9 Sep 2024 21:11:39 +0300 Subject: [PATCH 13/25] refactor: removed unused textures --- .../Actions/actions_ai.rsi/electrify_door.png | Bin 289 -> 0 bytes .../Interface/Actions/actions_ai.rsi/meta.json | 6 ------ .../Actions/actions_ai.rsi/unelectrify_door.png | Bin 441 -> 0 bytes 3 files changed, 6 deletions(-) delete mode 100644 Resources/Textures/Interface/Actions/actions_ai.rsi/electrify_door.png delete mode 100644 Resources/Textures/Interface/Actions/actions_ai.rsi/unelectrify_door.png diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/electrify_door.png b/Resources/Textures/Interface/Actions/actions_ai.rsi/electrify_door.png deleted file mode 100644 index 9b49dd0f07caa15ff91d6d3ada3c07dc340a6145..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS24TkI`72U@g4;Y@978<3&-Mp$9X8-OTK50(JEoV+&Yn|m zZoJH*_T{C`*7;>K>^W<$?@#^~ba}gX%lTiWoBKYq?cQG6W*#AH*MUA@@O1TaS?83{1ON_1YqJ0V diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json b/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json index e1d2c7299db4a7..1475066e61492c 100644 --- a/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json +++ b/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json @@ -46,12 +46,6 @@ { "name": "unbolt_door" }, - { - "name": "electrify_door" - }, - { - "name": "unelectrify_door" - }, { "name": "door_overcharge_on" }, diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/unelectrify_door.png b/Resources/Textures/Interface/Actions/actions_ai.rsi/unelectrify_door.png deleted file mode 100644 index d8a08efe60813da5490f95c74fcdd80cc90666f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmV;q0Y?6bP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0ZvIoK~zXfwUx1U z!Y~X)N%t(-yOpK?|1Dk8jlByW5MC|EmSxG3IVX331j4(KWSr$Vj@y-d}SFeOb50gp*rH}V7M2Z!?ecWrURz}Lj8ZJANB-xQ>~7g?(Kkq3TVxUA(vBo^B_Vk zQfFWdM&P%oSu?3KO|QH;I~B+k+3zLn0+o?KS?_1Z;|^1xq_+ee`V5?OzMFdUP%3cm zov(ej4k_@{iLj#)sJCDO$Eg`Osz7`(x_yr4$bvW1306v>1S&(GOE0t!K|l^Ecr%@7 jAA&?+yPl`?XM5}~V(rSk32v%`00000NkvXXu0mjf4BfeY From d899a5acbab9f32ee5e1d942b2dab791bb73e2d9 Mon Sep 17 00:00:00 2001 From: "pa.pecherskij" Date: Tue, 10 Sep 2024 22:40:09 +0300 Subject: [PATCH 14/25] feat: now notification is displayed when AI attempting to interact with door which have wire cut --- .../StationAi/SharedStationAiSystem.Held.cs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs index 41e0b4ea4bf170..91a9e52df071b4 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs @@ -122,20 +122,25 @@ private void OnHeldInteraction(Entity ent, ref Interacti // Cancel if it's not us or something with a whitelist. args.Cancelled = ent.Owner != args.Target && args.Target != null && - (!TryComp(args.Target, out StationAiWhitelistComponent? whitelist) || !whitelist.Enabled); + !HasComp(args.Target); } private void OnTargetVerbs(Entity ent, ref GetVerbsEvent args) { - if (!args.CanComplexInteract || - !ent.Comp.Enabled || - !HasComp(args.User) || - !HasComp(args.Target)) + if (!args.CanComplexInteract + || !HasComp(args.User) + || !HasComp(args.Target)) { return; } var user = args.User; + if (!ent.Comp.Enabled) + { + _popup.PopupClient(Loc.GetString("ai-device-not-responding"), user, PopupType.MediumCaution); + return; + } + var target = args.Target; var isOpen = _uiSystem.IsUiOpen(target, AiUi.Key, user); From 36ff0ee518dd7a31f8347383aad22bca4268764b Mon Sep 17 00:00:00 2001 From: "pa.pecherskij" Date: Wed, 11 Sep 2024 19:39:24 +0300 Subject: [PATCH 15/25] StationAiWhitelistComponent is properly gating BUI OnMessageAttempt, SharedPowerReceiverSystem.IsPowered is now used to check if device powered --- .../SharedPowerReceiverSystem.cs | 4 ++- .../SharedStationAiSystem.Airlock.cs | 27 ++++-------------- .../StationAi/SharedStationAiSystem.Held.cs | 13 ++++++--- .../StationAi/SharedStationAiSystem.cs | 26 ++++++++--------- .../Audio/Machines/airlock_overcharge_off.ogg | Bin 10397 -> 9392 bytes .../Audio/Machines/airlock_overcharge_on.ogg | Bin 10226 -> 9852 bytes 6 files changed, 30 insertions(+), 40 deletions(-) diff --git a/Content.Shared/Power/EntitySystems/SharedPowerReceiverSystem.cs b/Content.Shared/Power/EntitySystems/SharedPowerReceiverSystem.cs index 2bc2af78314352..b7ba2a31c5d94e 100644 --- a/Content.Shared/Power/EntitySystems/SharedPowerReceiverSystem.cs +++ b/Content.Shared/Power/EntitySystems/SharedPowerReceiverSystem.cs @@ -1,5 +1,4 @@ using System.Diagnostics.CodeAnalysis; -using Content.Shared.Examine; using Content.Shared.Power.Components; namespace Content.Shared.Power.EntitySystems; @@ -8,6 +7,9 @@ public abstract class SharedPowerReceiverSystem : EntitySystem { public abstract bool ResolveApc(EntityUid entity, [NotNullWhen(true)] ref SharedApcPowerReceiverComponent? component); + /// + /// Checks if entity is APC-powered device, and if it have power. + /// public bool IsPowered(Entity entity) { if (!ResolveApc(entity.Owner, ref entity.Comp)) diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs index 937e62f7783a2c..7ff975cf7eec29 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs @@ -2,7 +2,6 @@ using Robust.Shared.Serialization; using Content.Shared.Electrocution; using Content.Shared.Popups; -using Content.Shared.Power.Components; using Robust.Shared.Audio; namespace Content.Shared.Silicons.StationAi; @@ -26,12 +25,7 @@ private void InitializeAirlock() /// private void OnAirlockBolt(EntityUid ent, DoorBoltComponent component, StationAiBoltEvent args) { - if (!TryComp(ent, out var whiteList)) - { - return; - } - - if (!whiteList.Enabled || component.BoltWireCut || !component.Powered) + if (component.BoltWireCut || !component.Powered) { _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); return; @@ -45,12 +39,7 @@ private void OnAirlockBolt(EntityUid ent, DoorBoltComponent component, StationAi ///
private void OnAirlockEmergencyAccess(EntityUid ent, AirlockComponent component, StationAiEmergencyAccessEvent args) { - if (!TryComp(ent, out var whiteList)) - { - return; - } - - if (!whiteList.Enabled || !component.Powered) + if (!PowerReceiver.IsPowered(ent)) { _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); return; @@ -64,20 +53,14 @@ private void OnAirlockEmergencyAccess(EntityUid ent, AirlockComponent component, /// private void OnElectrified(EntityUid ent, ElectrifiedComponent component, StationAiElectrifiedEvent args) { - if (!TryComp(ent, out var electrified) - || !TryComp(ent, out var whiteList)) + if (!TryComp(ent, out var electrified)) { return; } - SharedApcPowerReceiverComponent? apcPowerReceiverComponent = null; if ( - !whiteList.Enabled - || electrified.IsWireCut - || ( - PowerReceiver.ResolveApc(ent, ref apcPowerReceiverComponent) - && !apcPowerReceiverComponent.Powered - ) + electrified.IsWireCut + || !PowerReceiver.IsPowered(ent) ) { _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs index 91a9e52df071b4..501ff8e46fb537 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs @@ -3,7 +3,6 @@ using Content.Shared.IdentityManagement; using Content.Shared.Interaction.Events; using Content.Shared.Popups; -using Content.Shared.Power.Components; using Content.Shared.Verbs; using Robust.Shared.Serialization; using Robust.Shared.Utility; @@ -109,12 +108,19 @@ private void OnMessageAttempt(BoundUserInterfaceMessageAttempt ev) if (ev.Actor == ev.Target) return; + StationAiWhitelistComponent? whitelistComponent = null; if (TryComp(ev.Actor, out StationAiHeldComponent? aiComp) && (!ValidateAi((ev.Actor, aiComp)) || - !HasComp(ev.Target))) + !TryComp(ev.Target, out whitelistComponent))) { ev.Cancel(); } + + if (whitelistComponent is { Enabled: false }) + { + ev.Cancel(); + _popup.PopupClient(Loc.GetString("ai-device-not-responding"), ev.Actor, PopupType.MediumCaution); + } } private void OnHeldInteraction(Entity ent, ref InteractionAttemptEvent args) @@ -151,8 +157,7 @@ private void OnTargetVerbs(Entity ent, ref GetVerbs Act = () => { // no need to show menu if device is not powered. - SharedApcPowerReceiverComponent? component = null; - if (PowerReceiver.ResolveApc(ent.Owner, ref component) && !component.Powered) + if (!PowerReceiver.IsPowered(ent.Owner)) { _popup.PopupClient(Loc.GetString("ai-device-not-responding"), user, PopupType.MediumCaution); return; diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs index bf1e9f3fc77700..bcf28f8b9b3cf4 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs @@ -29,27 +29,27 @@ namespace Content.Shared.Silicons.StationAi; public abstract partial class SharedStationAiSystem : EntitySystem { [Dependency] private readonly ISharedAdminManager _admin = default!; - [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly INetManager _net = default!; - [Dependency] private readonly ItemSlotsSystem _slots = default!; - [Dependency] private readonly ItemToggleSystem _toggles = default!; - [Dependency] private readonly ActionBlockerSystem _blocker = default!; - [Dependency] private readonly MetaDataSystem _metadata = default!; + [Dependency] private readonly SharedAirlockSystem _airlocks = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly ActionBlockerSystem _blocker = default!; [Dependency] private readonly SharedContainerSystem _containers = default!; [Dependency] private readonly SharedDoorSystem _doors = default!; [Dependency] private readonly SharedElectrocutionSystem _electrify = default!; - [Dependency] private readonly SharedAirlockSystem _airlocks = default!; [Dependency] private readonly SharedEyeSystem _eye = default!; - [Dependency] protected readonly SharedMapSystem Maps = default!; - [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly MetaDataSystem _metadata = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; [Dependency] private readonly SharedMoverController _mover = default!; - [Dependency] private readonly SharedTransformSystem _xforms = default!; + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly ItemSlotsSystem _slots = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly ItemToggleSystem _toggles = default!; [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; [Dependency] private readonly StationAiVisionSystem _vision = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] protected readonly SharedPowerReceiverSystem PowerReceiver = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedTransformSystem _xforms = default!; + [Dependency] protected readonly SharedMapSystem Maps = default!; + [Dependency] private readonly SharedPowerReceiverSystem PowerReceiver = default!; // StationAiHeld is added to anything inside of an AI core. // StationAiHolder indicates it can hold an AI positronic brain (e.g. holocard / core). diff --git a/Resources/Audio/Machines/airlock_overcharge_off.ogg b/Resources/Audio/Machines/airlock_overcharge_off.ogg index 66d7127aa09df0dab9d18b42cb9560cbbe0bee7d..41e0a516153541bae670d5f3a288814badd3edaf 100644 GIT binary patch delta 5544 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 delta 6557 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 F|37A@aT5Rl diff --git a/Resources/Audio/Machines/airlock_overcharge_on.ogg b/Resources/Audio/Machines/airlock_overcharge_on.ogg index ccaf931507a25f2b5ae41d4d67873063a140607d..705a35bda887bfa72a9af201adc4629cb919ad5a 100644 GIT binary patch delta 5992 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 delta 6369 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 z zH2?Ie#~Fv_cl+HF4**P3(_*b-Pyfr)etP$3MD@p(HI!RjEG{jxvuuBqRpnNdmn@4@ jb{3eo$Zr2@@){l^^Om{W@AkhYuaQT-YqHz#C1wHur>Wz8 From 9d8d5d42a44a263fc08750a498cbfbeb8ecd2c46 Mon Sep 17 00:00:00 2001 From: "pa.pecherskij" Date: Thu, 12 Sep 2024 11:56:42 +0300 Subject: [PATCH 16/25] refactor: use PlayLocal to play electrify sound only for AI player --- .../Silicons/StationAi/SharedStationAiSystem.Airlock.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs index 7ff975cf7eec29..ed8f426b7cc628 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs @@ -71,7 +71,7 @@ private void OnElectrified(EntityUid ent, ElectrifiedComponent component, Statio var soundToPlay = component.Enabled ? AirlockOverchargeDisabled : AirlockOverchargeEnabled; - _audio.PlayEntity(soundToPlay, args.User, ent); + _audio.PlayLocal(soundToPlay, ent, args.User); } } From 67e6875fd7fd779b9e2df01819353f40694a8137 Mon Sep 17 00:00:00 2001 From: "pa.pecherskij" Date: Thu, 12 Sep 2024 12:26:26 +0300 Subject: [PATCH 17/25] refactor: SetBoltsDown now uses TrySetBoltDown, checks for power. --- .../Doors/Systems/SharedDoorSystem.Bolts.cs | 15 ++++++++++++++- .../StationAi/SharedStationAiSystem.Airlock.cs | 8 ++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs b/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs index 35681bfd822931..a01af8b01c5656 100644 --- a/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs +++ b/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs @@ -77,8 +77,20 @@ public void SetBoltLightsEnabled(Entity ent, bool value) public void SetBoltsDown(Entity ent, bool value, EntityUid? user = null, bool predicted = false) { + TrySetBoltDown(ent, value, user, predicted); + } + + public bool TrySetBoltDown( + Entity ent, + bool value, + EntityUid? user = null, + bool predicted = false + ) + { + if (!ent.Comp.Powered) + return false; if (ent.Comp.BoltsDown == value) - return; + return false; ent.Comp.BoltsDown = value; Dirty(ent, ent.Comp); @@ -89,6 +101,7 @@ public void SetBoltsDown(Entity ent, bool value, EntityUid? u Audio.PlayPredicted(sound, ent, user: user); else Audio.PlayPvs(sound, ent); + return true; } private void OnStateChanged(Entity entity, ref DoorStateChangedEvent args) diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs index ed8f426b7cc628..94fa935f5e4a0c 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs @@ -25,13 +25,17 @@ private void InitializeAirlock() /// private void OnAirlockBolt(EntityUid ent, DoorBoltComponent component, StationAiBoltEvent args) { - if (component.BoltWireCut || !component.Powered) + if (component.BoltWireCut) { _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); return; } - _doors.SetBoltsDown((ent, component), args.Bolted, args.User, predicted: true); + var setResult = _doors.TrySetBoltDown((ent, component), args.Bolted, args.User, predicted: true); + if (!setResult) + { + _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); + } } /// From 5dc4dfc24a4042c96341a8fac2bc45fbca4e2cb4 Mon Sep 17 00:00:00 2001 From: "pa.pecherskij" Date: Thu, 12 Sep 2024 12:43:43 +0300 Subject: [PATCH 18/25] bolts now check for power using SharedPowerReceiverSystem --- Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs | 2 +- Content.Shared/Doors/Systems/SharedDoorSystem.cs | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs b/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs index a01af8b01c5656..13050616e1ba5e 100644 --- a/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs +++ b/Content.Shared/Doors/Systems/SharedDoorSystem.Bolts.cs @@ -87,7 +87,7 @@ public bool TrySetBoltDown( bool predicted = false ) { - if (!ent.Comp.Powered) + if (!_powerReceiver.IsPowered(ent.Owner)) return false; if (ent.Comp.BoltsDown == value) return false; diff --git a/Content.Shared/Doors/Systems/SharedDoorSystem.cs b/Content.Shared/Doors/Systems/SharedDoorSystem.cs index 2319d5e916b2e5..3d9a721473516f 100644 --- a/Content.Shared/Doors/Systems/SharedDoorSystem.cs +++ b/Content.Shared/Doors/Systems/SharedDoorSystem.cs @@ -9,6 +9,7 @@ using Content.Shared.Interaction; using Content.Shared.Physics; using Content.Shared.Popups; +using Content.Shared.Power.EntitySystems; using Content.Shared.Prying.Components; using Content.Shared.Prying.Systems; using Content.Shared.Stunnable; @@ -42,6 +43,7 @@ public abstract partial class SharedDoorSystem : EntitySystem [Dependency] private readonly PryingSystem _pryingSystem = default!; [Dependency] protected readonly SharedPopupSystem Popup = default!; [Dependency] private readonly SharedMapSystem _mapSystem = default!; + [Dependency] private readonly SharedPowerReceiverSystem _powerReceiver = default!; [ValidatePrototypeId] From 7483434ade1ef20f4f624d208b7313575cd2b1cf Mon Sep 17 00:00:00 2001 From: "pa.pecherskij" Date: Thu, 12 Sep 2024 16:49:44 +0300 Subject: [PATCH 19/25] electrify localization and louder electrify sounds --- .../StationAi/StationAiSystem.Airlock.cs | 4 ++-- .../Audio/Machines/airlock_overcharge_off.ogg | Bin 9392 -> 9989 bytes .../Audio/Machines/airlock_overcharge_on.ogg | Bin 9852 -> 10481 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs index 77cf0684d64e45..098b0caf1f2c3e 100644 --- a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs +++ b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs @@ -63,8 +63,8 @@ private void OnDoorElectrifiedGetRadial(Entity ent, ref Ge ? new SpriteSpecifier.Rsi(_aiActionsRsi, "door_overcharge_off") : new SpriteSpecifier.Rsi(_aiActionsRsi, "door_overcharge_on"), Tooltip = ent.Comp.Enabled - ? Loc.GetString("bolt-open") - : Loc.GetString("bolt-close"), + ? Loc.GetString("electrify-door-on") + : Loc.GetString("electrify-door-off"), Event = new StationAiElectrifiedEvent { Electrified = !ent.Comp.Enabled, diff --git a/Resources/Audio/Machines/airlock_overcharge_off.ogg b/Resources/Audio/Machines/airlock_overcharge_off.ogg index 41e0a516153541bae670d5f3a288814badd3edaf..c88d00299e9215a647c144f514a18d7dc5af7a87 100644 GIT binary patch delta 6029 zcmV;87jo#ZNrg@tPiJRS00IC200000004?#000000061Re20-5E)I%c00031005r} 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 diff --git a/Resources/Audio/Machines/airlock_overcharge_on.ogg b/Resources/Audio/Machines/airlock_overcharge_on.ogg index 705a35bda887bfa72a9af201adc4629cb919ad5a..c87b7d3851bc94d63601ccc8b0ef91eb9be2db2a 100644 GIT binary patch delta 6608 zcmV;>887DiOz}|~PiJRS00IC200000003EE00000005+2FQSneE(}>;00031001<) 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 Date: Thu, 12 Sep 2024 18:23:49 +0300 Subject: [PATCH 20/25] extracted ShowDeviceNotRespondingPopup, reverted airlocks not opening/closing when ai wire was cut --- .../SharedStationAiSystem.Airlock.cs | 8 +++--- .../StationAi/SharedStationAiSystem.Held.cs | 25 +++++++++++++------ 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs index 94fa935f5e4a0c..1ad83c7de89c5e 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs @@ -27,14 +27,14 @@ private void OnAirlockBolt(EntityUid ent, DoorBoltComponent component, StationAi { if (component.BoltWireCut) { - _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); + ShowDeviceNotRespondingPopup(args.User); return; } var setResult = _doors.TrySetBoltDown((ent, component), args.Bolted, args.User, predicted: true); if (!setResult) { - _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); + ShowDeviceNotRespondingPopup(args.User); } } @@ -45,7 +45,7 @@ private void OnAirlockEmergencyAccess(EntityUid ent, AirlockComponent component, { if (!PowerReceiver.IsPowered(ent)) { - _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); + ShowDeviceNotRespondingPopup(args.User); return; } @@ -67,7 +67,7 @@ private void OnElectrified(EntityUid ent, ElectrifiedComponent component, Statio || !PowerReceiver.IsPowered(ent) ) { - _popup.PopupClient(Loc.GetString("ai-device-not-responding"), args.User, PopupType.MediumCaution); + ShowDeviceNotRespondingPopup(args.User); return; } diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs index 501ff8e46fb537..31dc3efd52a7de 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs @@ -119,16 +119,22 @@ private void OnMessageAttempt(BoundUserInterfaceMessageAttempt ev) if (whitelistComponent is { Enabled: false }) { ev.Cancel(); - _popup.PopupClient(Loc.GetString("ai-device-not-responding"), ev.Actor, PopupType.MediumCaution); + ShowDeviceNotRespondingPopup(ev.Actor); } } private void OnHeldInteraction(Entity ent, ref InteractionAttemptEvent args) { - // Cancel if it's not us or something with a whitelist. - args.Cancelled = ent.Owner != args.Target && - args.Target != null && - !HasComp(args.Target); + StationAiWhitelistComponent? whitelistComponent = null; + // Cancel if it's not us or something with a whitelist, or whitelist is disabled. + args.Cancelled = ent.Owner != args.Target + && args.Target != null + && (!TryComp(args.Target, out whitelistComponent) + || !whitelistComponent.Enabled); + if (whitelistComponent is { Enabled: false }) + { + ShowDeviceNotRespondingPopup(ent.Owner); + } } private void OnTargetVerbs(Entity ent, ref GetVerbsEvent args) @@ -143,7 +149,7 @@ private void OnTargetVerbs(Entity ent, ref GetVerbs var user = args.User; if (!ent.Comp.Enabled) { - _popup.PopupClient(Loc.GetString("ai-device-not-responding"), user, PopupType.MediumCaution); + ShowDeviceNotRespondingPopup(user); return; } @@ -159,7 +165,7 @@ private void OnTargetVerbs(Entity ent, ref GetVerbs // no need to show menu if device is not powered. if (!PowerReceiver.IsPowered(ent.Owner)) { - _popup.PopupClient(Loc.GetString("ai-device-not-responding"), user, PopupType.MediumCaution); + ShowDeviceNotRespondingPopup(user); return; } @@ -175,6 +181,11 @@ private void OnTargetVerbs(Entity ent, ref GetVerbs }; args.Verbs.Add(verb); } + + private void ShowDeviceNotRespondingPopup(EntityUid toEntity) + { + _popup.PopupClient(Loc.GetString("ai-device-not-responding"), toEntity, PopupType.MediumCaution); + } } /// From 96c46fcfce6d5c937de869aaa9229ac7f0dfa6b1 Mon Sep 17 00:00:00 2001 From: "pa.pecherskij" Date: Mon, 16 Sep 2024 23:17:08 +0300 Subject: [PATCH 21/25] refactor: cleanup --- .../SharedStationAiSystem.Airlock.cs | 7 +---- .../StationAi/SharedStationAiSystem.Held.cs | 27 +++++++------------ 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs index 1ad83c7de89c5e..63c79695c47e76 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs @@ -57,13 +57,8 @@ private void OnAirlockEmergencyAccess(EntityUid ent, AirlockComponent component, /// private void OnElectrified(EntityUid ent, ElectrifiedComponent component, StationAiElectrifiedEvent args) { - if (!TryComp(ent, out var electrified)) - { - return; - } - if ( - electrified.IsWireCut + component.IsWireCut || !PowerReceiver.IsPowered(ent) ) { diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs index 31dc3efd52a7de..353c63a38be998 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs @@ -14,9 +14,9 @@ public abstract partial class SharedStationAiSystem /* * Added when an entity is inserted into a StationAiCore. */ - - //TODO: Fix this, please - private const string JobNameLocId = "job-name-station-ai"; + + //TODO: Fix this, please + private const string JobNameLocId = "job-name-station-ai"; private void InitializeHeld() { @@ -27,10 +27,10 @@ private void InitializeHeld() SubscribeLocalEvent(OnHeldInteraction); SubscribeLocalEvent(OnHeldRelay); SubscribeLocalEvent(OnCoreJump); - SubscribeLocalEvent(OnTryGetIdentityShortInfo); + SubscribeLocalEvent(OnTryGetIdentityShortInfo); } - - private void OnTryGetIdentityShortInfo(TryGetIdentityShortInfoEvent args) + + private void OnTryGetIdentityShortInfo(TryGetIdentityShortInfoEvent args) { if (args.Handled) { @@ -41,7 +41,7 @@ private void OnTryGetIdentityShortInfo(TryGetIdentityShortInfoEvent args) { return; } - args.Title = $"{Name(args.ForActor)} ({Loc.GetString(JobNameLocId)})"; + args.Title = $"{Name(args.ForActor)} ({Loc.GetString(JobNameLocId)})"; args.Handled = true; } @@ -115,8 +115,7 @@ private void OnMessageAttempt(BoundUserInterfaceMessageAttempt ev) { ev.Cancel(); } - - if (whitelistComponent is { Enabled: false }) + else if (whitelistComponent is { Enabled: false }) { ev.Cancel(); ShowDeviceNotRespondingPopup(ev.Actor); @@ -140,18 +139,12 @@ private void OnHeldInteraction(Entity ent, ref Interacti private void OnTargetVerbs(Entity ent, ref GetVerbsEvent args) { if (!args.CanComplexInteract - || !HasComp(args.User) - || !HasComp(args.Target)) + || !HasComp(args.User)) { return; } var user = args.User; - if (!ent.Comp.Enabled) - { - ShowDeviceNotRespondingPopup(user); - return; - } var target = args.Target; @@ -160,7 +153,7 @@ private void OnTargetVerbs(Entity ent, ref GetVerbs var verb = new AlternativeVerb { Text = isOpen ? Loc.GetString("ai-close") : Loc.GetString("ai-open"), - Act = () => + Act = () => { // no need to show menu if device is not powered. if (!PowerReceiver.IsPowered(ent.Owner)) From 1a7eac53e4f8303a876e5c3ceab2c58fa4a0cc74 Mon Sep 17 00:00:00 2001 From: ScarKy0 Date: Thu, 19 Sep 2024 22:08:12 +0200 Subject: [PATCH 22/25] New sprites and fixes --- .../StationAi/StationAiSystem.Airlock.cs | 4 ++-- .../Actions/actions_ai.rsi/bolt_door.png | Bin 343 -> 296 bytes .../actions_ai.rsi/door_overcharge_off.png | Bin 585 -> 530 bytes .../actions_ai.rsi/door_overcharge_on.png | Bin 357 -> 352 bytes .../Actions/actions_ai.rsi/emergency_off.png | Bin 702 -> 719 bytes .../Actions/actions_ai.rsi/emergency_on.png | Bin 428 -> 533 bytes .../Actions/actions_ai.rsi/unbolt_door.png | Bin 592 -> 536 bytes 7 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs index 098b0caf1f2c3e..d5bc764b348c8e 100644 --- a/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs +++ b/Content.Client/Silicons/StationAi/StationAiSystem.Airlock.cs @@ -63,8 +63,8 @@ private void OnDoorElectrifiedGetRadial(Entity ent, ref Ge ? new SpriteSpecifier.Rsi(_aiActionsRsi, "door_overcharge_off") : new SpriteSpecifier.Rsi(_aiActionsRsi, "door_overcharge_on"), Tooltip = ent.Comp.Enabled - ? Loc.GetString("electrify-door-on") - : Loc.GetString("electrify-door-off"), + ? Loc.GetString("electrify-door-off") + : Loc.GetString("electrify-door-on"), Event = new StationAiElectrifiedEvent { Electrified = !ent.Comp.Enabled, diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/bolt_door.png b/Resources/Textures/Interface/Actions/actions_ai.rsi/bolt_door.png index e553671524ed2287838eab31a6136112cfca2c57..485a4feb62877ab11d2858a03762fab3e89925e6 100644 GIT binary patch delta 248 zcmV%G?1P0szL`4B51q~rE;MMUc7zF^s2s4`lXQ%f70000W ukYX^gfM5t*yCF}$;l$`2@alLJi~;~#B32+zY%kaV00008*m10Ku6CR zC_tj8MM@-YkeVhk%*tzKXWx9*i4>lc#Ibkhy?HyHwYzT5IA|ICd@}DN<8Hn-;kcoJ znfUZ*6AHTeo`;2)0}yczt^tj;gs2yY+zHmNUoX?a@zvWHOMersiGU|Lxst_5p20;R zA)1JpM^2M03kTu~at_5rMO+9#Qc$fu z|4+w=oF^k)s2tcP`=bEx9;;??O->AkS_2>RV~5b!X$EMhlJ0RqX6lGWxLFd zi0Q+HXkuiWK1740QtLjKMCf*u$#4_`$X-w2T9npd?Dg}WVwgi8# zZJk;CYjQA~*TkYEjwKJ3+XCQ}OymT#;*k30de_DAApLxN61&^GsIXqDAj}1wi9!WJ z;#yE~;0tnM-$TUM`?uG2?nP$-`!4bEc@Qfw4|wv>`qTjJeHnP~DXuP8)#7v@a}}uC z`(|hChWld`4}bqo-2z{F5Koe4INxk(DQyNMaPjU#+svUdAf@+-!z_e$N3#Krzeuh& zz|(8QEmc_3I+eteiFU5@JN?OqWT8t@S^=J(C#Qm3Tw8^lfwHZb{?D=O&7bs^vXaI($_w=4!#Xm3BRU$qtpH95u0C6MgZ?8Et z0R+|)4gsx1ao}{LsIaE?2b2H(Xy!8#LZwHsy6_EB6jGj^h2Wq7000hUSV?A0O#mtY d000O802BZK0002eQ(P_ z4ZYsAcVFQ_!QdO;0i@B>`F2TD;C3KWF^U3?A#*nAHZ z#_&Bkp+Hs$zt>MH47I75yXWGsf%pH z2I^9%{Q-^GWrZptWMK-;Mud`VbP*-?7j#jm7Tt8`!j;sduesAV&v|#we7VpAA@gzP zo^$Wa+<8L$XCyJk{aPgpvAcUP4fY#ksE99~od!AG|5XVV;(s(i#LBr1$krvqIzi;f z+3l_n)yC=g@6qX)-hbP|LTn=7piZtuVGwfY^D`eMAvO`l04G<(I;kS!;5L*EUnb5( zkS9nmA-y)?K_#4=Kz)9bN&;L;b7Z#YNkl%Eq4Q%qyoCV1C{Y0;*=ccq?+TD>Uzk#8Ps zNq_}X1T|3fmOWRIdrNVM0O%+$G{$LlP_$%m+f26<}tYk zJRlvg6cct2f0X)&TooA~-qoA(*IV`o$P0vQe_L-C`-RAV4v&J!<@)ia{8hIq#seh< z*vcdU?fIRr6KLxKWkC0#uB&kdh^+OhDF(AP{Uh@GFFr&IK+iLw*aDsf^rTYSU+*2u z{+q??(SIV8AH7(?TfmhT2kz1zfxWg6H&(ZTNO>l8I6ui0dB{}@AxEVezWe&YQ`-_N zf`|$H6OVI30hC&F00~!LUUm|Hez;pAR%_{b?hmJ8;c1`%6ooFt24t(UmzQ+Efb)+w zN&{=#ONMh76!GJm&x^5HVS{|Ow;MjGs!IA`DI3vI-wFQ=CtyU90!efC{{R3007*qo IM6N<$g6LH{i~s-t delta 657 zcmV;C0&e}!1-=E4Ie&0TL_t(og=1hCV8BR<;#G>w|A|o-cK zO6+EE&ya(&cg}bOrfayI{?4`v>=spZV2HIW4u`XAVplRS0L`+s zwgh_$=m=m4+(%Ilb^vnRqXUrT5#6)l{3RLAV0!M&e+=m+DkzS?upEbnU77$RQHdG_807#qfb4q^8<|hYau@)G!lIn}7~(iX039Iv z9>zw_YWOS%0Z=HA9Ri>P2LhmAhp~$%xe#qR2#_5Dpnp^jO6?#3i*r(Z4gkPVHBI>SPlXp--B@66h#aoK0ocxN6=yz09lRPyhk+DwPs|ttJEk ztRaAGF$h2!CzyGd6o9QQ00J1T9`u@#nk^%2?Lv%f2vPuRPE!LAYLpJnW;wDWK=gog rOb9syAD~*-43|R)0a7}r0}cSrmslPlqhqK5015yANkvXXu0mjf?ROMK diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/emergency_on.png b/Resources/Textures/Interface/Actions/actions_ai.rsi/emergency_on.png index bc0a12c62caf21ab7b0c5aa2535e21c34b9d4132..977829ea580454d4b0902cb637aceef33dfc96e8 100644 GIT binary patch delta 486 zcmVyFbWWusV<)V$uSsX#i(DgB(Fh;v?4qSizq|EM)5?sec^6m&##|AT<<7b~>RH zPHI*pDHjlHI7}@uxq#U6o1}zAhWP^raJi6NACqhsHo^bx2Om-0_DXv>toC7bfLGf} z6oGA3;aCktSBDGOT3h0D1i@?wvOIeF9yotVhBKI+d-ESdiUu=LjyQbuI8Hg74!HXK z9fP){5QfDd5PvgcFF{L@!A9#SFukgRfg!qsNC!NeoXM!&wh|>VB3ta}=*X~?NC)^I zT?VGNbznv%QAIJb??G&2KCu843QH?6#fdJ8k$q2U6o3FI6vz$%P=W&iP_V<;q=o|7 zAplC{pwtcm$Z@_jllW{10=Pnes3;)CB5VL(F2ETDz+cjkYQ-_g_aKaJISAkk0a)ST z|0$Kh+ev{ei?{B3z_5{THr@~*swf6If*b&{92r21bQC+WIzT>mI$0Lt1Hgg}t9=7r c9S=AF0C=vxB+mV@@Bjb+07*qoM6N<$f*XL%4FCWD delta 380 zcmV-?0fYXP1gry)Ie%VBL_t(og=1hC1*2dTjC8>G|NnmkhmjFXGxI3^$EAT>@b}Ao zMyw7%7XVq_vh^Uf?PsX*w#VuStPXIm>Oc|O*;awoP;_;;fUUJ9PDij1(hRaZqI))+ zza+yMOwYafk0ISeg(ycHK6)Id98L#Zeg2L?TT%$aVi1U#v45AKrO05TbrhIhmGhS& zsvR}WG2znmaB?O_^nfgeS?=iQNVEg|k1hk_xG9QYOJNuUa5?}PAp0J~M&=U>K%uZG z=RSrw!88B^$iYr(6o3FI1a?jVC1zAd5ETNT1P213V280u4F$480F=r>sT~AXAc?Oi zB|aO10Im=qDs>7-u?QPL&IQqEM&XQt_Jfb8RvaVe0(5{g1Ym`S|EE+2Zzlz^EZ(~B z0mDYV*?7wVqKaaWBgg?D%aH-7R3)k?29<&+e1=Z49Ki4uVa}8JUDzw5fv%26!6+C7 aqW}Of_mWcVlseo10000!kIa8$K32cyR(;*{1B4t&F=rr-tOF9lB`&1Oz{17 zC%43%OlRhCO@XCxe|=^eH2dwCLA(LTxEx#)iuHl07sy;0EPu&9zp(k%CiR0L8U$?Q z<`!cMhz8*_Nb^OfoSTyYl8hmU&`hiu%$@8QJpa_dqf2wkh%-gbLV z=Gx+|0OX=;DrC-+k+a~;fFXNTzI#sJXcoGQj=}6-UdJJGXWMFtl(RtBQ{GwW6fD0= z=H=g1#MZpJfq${{$;~k7ADyWI4+j^H`SIwwpw6Cdlfn5%E+M!=0EK?0kFfpubnKWP z-tDRJNN^ikq?yO65kOn!jR27O&gGzyc{Bhrr`0}RX#WqOnJ=pv0D4$x=6u>|t6GE# zUICz$Nz(h(1TMIZVXtcAzb)bg&$$JB7Epz2y4tmJUt<*_BH}@)woCKx(S9_DEcdVy zO44OAC;1+BwOfGJLJQ{JbD{ZA8e42=@sgqsr3iw9g!X0ls2jng9R*07*qoM6N<$g4V3``v3p{ delta 547 zcmV+;0^I$W1kePKIDY~HNklRi|7k2+I(dH7R5N5Fo$6ulh zz4L>aXouicfX!l~>-hDY(`0~$5-|?JDFLz^W--W8kJNmkf*%HU%$~>ya}3BKxEz61 z5SQi3VuB2s2F7?TzJB2>!`)Z!iFO1FA+Jn~tK7Vd53=Bw)fB}%1AhXdO zf#LvMmV*Gya*(g^x`2VKWJ7G0XU5~V{B|6It-1(^q3r1kA!cB61Pl;N12D_KzQ&G`Etl#= zh!f**5WpJ(FpF`4XT_+N6RQsykev&VEoZN1Cf6A99Dr;&FyS(2NBm`Y`-wb9kn8|- z%P9pUIRIC%UtK|^C_t|~a9NI?;6Ol_kGO&i-43t=Kz{`Sto1^U<)i}SwgJIxh|6-2 zk6}TN%lBu9NF(qlfQ15b5Fr<@xPqM&%aMyAX&K#!+qDL@P~&_olbM~Jc6{KY004ZA9iKxCcl`hW002ovPDHLkV1j&2?nVFr From fdc01d3a2ab859d6928c5cc020071f0d32c82796 Mon Sep 17 00:00:00 2001 From: ScarKy0 Date: Thu, 19 Sep 2024 22:20:32 +0200 Subject: [PATCH 23/25] Copyright --- Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json b/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json index 1475066e61492c..1efee13f3aae0f 100644 --- a/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json +++ b/Resources/Textures/Interface/Actions/actions_ai.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/blob/c473a8bcc28fbd80827dfca5660d81ca6e833e2c/icons/hud/screen_ai.dmi and sprites made by ScarKy0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/blob/c473a8bcc28fbd80827dfca5660d81ca6e833e2c/icons/hud/screen_ai.dmi , some sprites updated by ScarKy0(Discord), door actions by ScarKy0(Discord) and @Max_tanuki(Twitter)", "size": { "x": 32, "y": 32 From 64094f9875bf861c0c205a0c95761f6f8b62019c Mon Sep 17 00:00:00 2001 From: ScarKy0 Date: Fri, 20 Sep 2024 19:25:10 +0200 Subject: [PATCH 24/25] even more sprite changes --- .../Actions/actions_ai.rsi/bolt_door.png | Bin 296 -> 372 bytes .../actions_ai.rsi/door_overcharge_off.png | Bin 530 -> 614 bytes .../actions_ai.rsi/door_overcharge_on.png | Bin 352 -> 495 bytes .../Actions/actions_ai.rsi/emergency_off.png | Bin 719 -> 876 bytes .../Actions/actions_ai.rsi/emergency_on.png | Bin 533 -> 767 bytes .../Actions/actions_ai.rsi/unbolt_door.png | Bin 536 -> 588 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/bolt_door.png b/Resources/Textures/Interface/Actions/actions_ai.rsi/bolt_door.png index 485a4feb62877ab11d2858a03762fab3e89925e6..f79424898024d8257ebfb465f4a778576c466cbc 100644 GIT binary patch delta 325 zcmV-L0lNOE0`vlqIDY{qNklhrxGcuy5Mms`LX?SUmLvNVn;H;}OAXl$K(`#-cc4%L$q^e$Fu+8r z1F%_+ON?d?pe7h_2N0bG-oJlORdq0cH{L9@MZwwc;}2A2{C^x+%ORZVj$eI^(;k8$ zFuTr@kP^Hgwdpus`N5qAKtcNU{bvRRC2q0|e{kF$8AsuSQ;4#FTd-5o$JK(+&>muiFQ|43}QIsle47?IfI0FtX?WI!m3(cA&sr<+mi zfT58H$;s!$>OLVDiJ%&>BUguH2Y^7uc;M(0+l&8{BFzf*U X&U|Hr^WPe!00000NkvXXu0mjf>cfyh delta 248 zcmV%G?1P0szL`4B51q~rE;MMUc7zF^s2s4`lXQ%f70000=H41m*;gIDY~dNklWdaXrdCx<;8w&Yaoh(18#y8bB&cYhBN!2rZZg{*(RUaW}9 z{R=zR6gy%&kRp#JQvUyD{go9F7BkQS+`s?{Q#&O2%4WHB?n>S!z(#~xdXP)tn(7DJ zYPJcm5rK?B-uU>Ar&htmPpomcK#N;xpDed=DdPQ}I6cU?Vr$$teIg#c9vh)}aX*|~Kl2S^X-pgb`jjsKe5S^(UQ-s>VjOp&kdP7B)= z(ng06~U3~>%xx(0NhIV7ta`tqOSRv_rUVtK%nd@ zWd9{hdxS)21=LJ*au8C+q@Hyap!S|4N47XjBEr02tbc&afSYOnTB93N6%keiQUDZ} z@)?#~x?TDLFjb1rR}PyJwBUXNC1wUf-VT4+JTr90s@dd=k_qj>`fvN8yxDm(3jGgwb4*= z6K;;5j50f=@wMD_W8pwmmE5i&qB=X_{m0jlb?i=mnsxC7YGa@0g+j^900000NkvXX Hu0mjfujC5f delta 484 zcmVD5p0&Gf&p2oq{CqO+BjawqHsQFT zftmR9XcG#$`kse{m;(@T4z2->wS=e_h};R*uU{|I!SU7G7=KF>t%-mqIk}R>NS?t( zAR(HFnMY2OEDHzX3UUs`L`7T(K;$5{v_4@tHxkGt)I?McIOHR=%n>=o(~5VdO;S*; zJ^xR~h@2-QU8o$`Ci|D$ceVQI7rBrG>>_)MT!On$I50K)C^>Qg79oI|JtDt;x=3>( zfujNvWcEttEq@_H0;=pI0co~3!xK<-J&inHmwlmgTxfE@BcB3GK(Y1_ z+fl7}E))W^9m}}YnzBa?F9`q*qPOnzT{Qg=k`An?6K?q*CiXmqh4xl*w=u0?1xe?R0((r(ORc6UtiPA& z%VHAY{C?p`C_ym@JPyTJ+=Om&|9vs>gjm?wtC=RmL(9wQ a-thxkr;$S*EAKlJ zyy|$*=fOECfq&Nde9Uh|Fax#|o0yY_-j(1y1-$k|%*iEENnEHec#omW0m!AgYhri> zK=H8ODW0=zYJd~+d&xav*mq|^6o4}5X8fbM$=~i0000f;rr=v1m{-#IJ)72v8f^d+|PcnzdYb)p#lQ=2vo!t6hMh#AOdLg z9>bcs9^eFOoudMhv!Bk96rcp=a&Hxobx+pRDVP(O)4fH2%71+?uD>iP?34lmfn{9- zP3L0Y`y4DSy1EmNgxry6P)a~_FMJE6b&gnvS$Tmjc`gt%WH; z5)iqcl1SrRTDiWUPJlY)$dNQS0ZHYT+>s6#=5(K9QYa>%EHL$c3R;=n^Vaymp*cnm zEyY|Se77%uKPg??h*uP_6iNcTh(#6D{R*u3Lwo`CpphRd1<8;A00002Ia_>Fo-rW0U0RAzQLLKX??W*?s+p$zZv43p(jq`PtDrJa-deYn7 z^=z5h$zt2|290G!215)u7-#}q+ThdQ=GZc`lf|~_4G@&!e0rK)dGO4SKNZJ&POi1h zC$=IoL`2g+p?hdTaXOuLkOG>HJ!jVv`+5ilgYd+C5M<qwu^lb=}mcP%e9&78wf0S>AX3&n+1D~d%f>^Cdq z2*Wv`MWkpo3&4SaAN7y3E~gg$rYFZ3G6*Zc(a;xysDIZD+DahNi}}nVJ1TSZjre@h z_@>7vj-cP~hqy)rCpgeq#qO!hk=(aHj-$9F0bB%*;Ng`e1|kI2tT>8hNV&^Ao(@>R?>bda!1HRHX)LGuY^TD@V$8hxi9kR15iaG$j#C^ zmwKctuzzUp-o;K(vspL=lZNa$unJ$g9vk*6YHOgUxe+o$F$16U9N-x2?SM@!XAI;> zs6Qvx^zJwKPmYWVV@m~0e4WYNZwa><$S*+!%UCAjdRZ-71KVTP1w`Aov64}lziA!F zeV2(io*rSV?Ul>A00aiolb?J40bDy87TJkJEPts2)DscOaXw=&0v@6rE>Yz+a&RT?qaH4K)iF1rfxB3aN{1 z#0Kh8sQm$r*ky$(B4l9-%|?WhY;+MN_7`+fs21IH=faiLq_4TtH_v%@&V0Gh10nNq z=bm%#%-nfG{AVOF#{F6)3$eR!FMZ>gJSs+oVJ^`XnW`vo33s4qN=`!7C33qa2^q1XbR1@xp++F$P- z%l@0i>wnQAlpnoV!CSzU76qsYQQryw3@2bjk^)I{_x}I@002ov JPDHLkV1jAtJG}q^ diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/emergency_on.png b/Resources/Textures/Interface/Actions/actions_ai.rsi/emergency_on.png index 977829ea580454d4b0902cb637aceef33dfc96e8..14034429f4c189b2dc6e059d6fc559d7059ecb55 100644 GIT binary patch delta 723 zcmV;^0xbQN1pft)IDZ1MNkl#G2z>kS7EFUI09o|$2f}O+8`*N0T4DfE zA@HA9nIX05I73IS4%|Wz$n3s~;)uuhAAs2vldpjFFfhC(Xn!`rAhNKq_&;;zOosII zbcRo_?}5d(O!LO7)+cK#nC25zVu0y6apDACJMcyUvgIIyuHAh_(7_-zAhjSpAiW?n z$aVla&{7urKfP2Nr#wiGlpH{m1Kz)XkHQxg(UGR8&+D%mqZ1-ylc8 zvLLYllobhCJ}3ZA7m9f$l9ZkBfmhq+}Ti(mgcw|fz<&&Uq4~E zfB6cE*s{(NhX4Qmp@>CS_7UX(kY`$6Kl%Uh^ll7C5Py{om$nx%m?za>5ibThqL-k4 zbk7j&fIBbWF{p?O!TF3p_wPuzW9Yd9;h&t>LeTQ50=i(@$&rB}Hpryzl`@>~0y>x#Oklan01CYVa42b2(p>UFjbV?`$h^`G`!49$<6ePR% zAVNY>SAPeLk@+wH3IPyK-tUUlT%sJn$b?V^a)<{oB-~u=;9{^uhHNnmfIMib4Qp`I3lt>5o zA6*8fw{>7fB~e8&vhP7`WInL~6bef#FvW>3ijjR!Y7~F~C=|#J0Z@Vi0Z_2R*rbL6 z*&zT*<)G9K0?2W`G?Vyj2m-i5fT$=S#Ug9~UoOBI1z^C^kZQ#-$oC+OZaE0x3;|f- z;r}U>!P`lJEQ`19d%&=fZ#Lc#AgU+^If5JjvK$#ei*yt_u{uCLcRE=X;sd~f4Xb?v dUL6lO004Ndz9i25vG4!@002ovPDHLkV1mE}&0_!n diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/unbolt_door.png b/Resources/Textures/Interface/Actions/actions_ai.rsi/unbolt_door.png index 5ecb6c1bd905af650f4bfcc4cabe29ff4d711c0b..dfbb102f97bf98b71845d3e464b6a7c1b188366c 100644 GIT binary patch delta 542 zcmV+(0^$9b1k41GIe-31L_t(og=1hC1!$njROLTC&1OVb;3mM#uWMSY#O#Pi=bGJ>{DcbuEy){8wPxqV|4&7NBGZKi{U$DJ%8w-v@s=^pyeRIgv|jU zg&++u05S+J-#&ubo?QGGax30_V&Lb16dlK}zQ$<}3n3TIuCs)**Y#Y3 zTLhu`k=O{!gMUi27=obu)TZNj&BvPt&;iI`^fZCZa#8?Z2Y`b9?fcIRyn_GWIKEW_ z#SzGsgXECag7kvSAlm`-03cKk?Eq|+gR&tA zQ{o7s9DvPo`(#-#8XnP!>bZX4o77G6NqV*oMPpIX-|b%5c>SL^nu?wVYH(U_=2n%SkO>K>%B^jjdUZ zQW;^h9F)!Mfko=u_awUkT3hm?R$xFoNN$#EDT|TSS-E!i6(b?DQ2Oj3J27OspBqo$MGq|J1;wd2xOIU+$zDfR9uNU8~yOc6(0d z+TyJMJXT?3f?k z?Wyrda2r~rna8RTKwIXG0Fe34<)D#yGypQE)jnTn{|}& Date: Sat, 21 Sep 2024 14:24:09 +0300 Subject: [PATCH 25/25] refactore: cleanup, rename overcharge => electrify --- .../Electrocution/ElectrocutionSystem.cs | 5 +++ .../Doors/Components/AirlockComponent.cs | 4 +- .../Components/ElectrifiedComponent.cs | 6 +++ .../SharedElectrocutionSystem.cs | 9 ++-- .../SharedStationAiSystem.Airlock.cs | 9 +--- .../StationAi/SharedStationAiSystem.Held.cs | 23 +++++----- .../StationAi/SharedStationAiSystem.cs | 42 +++++++++--------- ...arge_off.ogg => airlock_electrify_off.ogg} | Bin ...charge_on.ogg => airlock_electrify_on.ogg} | Bin Resources/Audio/Machines/attributions.yml | 4 +- 10 files changed, 53 insertions(+), 49 deletions(-) rename Resources/Audio/Machines/{airlock_overcharge_off.ogg => airlock_electrify_off.ogg} (100%) rename Resources/Audio/Machines/{airlock_overcharge_on.ogg => airlock_electrify_on.ogg} (100%) diff --git a/Content.Server/Electrocution/ElectrocutionSystem.cs b/Content.Server/Electrocution/ElectrocutionSystem.cs index 98e6120322326d..88404c4aa96052 100644 --- a/Content.Server/Electrocution/ElectrocutionSystem.cs +++ b/Content.Server/Electrocution/ElectrocutionSystem.cs @@ -491,6 +491,11 @@ private void PlayElectrocutionSound(EntityUid targetUid, EntityUid sourceUid, El public void SetElectrifiedWireCut(Entity ent, bool value) { + if (ent.Comp.IsWireCut == value) + { + return; + } + ent.Comp.IsWireCut = value; Dirty(ent); } diff --git a/Content.Shared/Doors/Components/AirlockComponent.cs b/Content.Shared/Doors/Components/AirlockComponent.cs index 29ed139e3b142e..e5794f186f4cfa 100644 --- a/Content.Shared/Doors/Components/AirlockComponent.cs +++ b/Content.Shared/Doors/Components/AirlockComponent.cs @@ -28,13 +28,13 @@ public sealed partial class AirlockComponent : Component /// /// Sound to play when the airlock emergency access is turned on. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public SoundSpecifier EmergencyOnSound = new SoundPathSpecifier("/Audio/Machines/airlock_emergencyon.ogg"); /// /// Sound to play when the airlock emergency access is turned off. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField] public SoundSpecifier EmergencyOffSound = new SoundPathSpecifier("/Audio/Machines/airlock_emergencyoff.ogg"); /// diff --git a/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs b/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs index c3a6f2c229cf92..52eb76ca541354 100644 --- a/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs +++ b/Content.Shared/Electrocution/Components/ElectrifiedComponent.cs @@ -111,6 +111,12 @@ public sealed partial class ElectrifiedComponent : Component [DataField, AutoNetworkedField] public SoundSpecifier ShockNoises = new SoundCollectionSpecifier("sparks"); + [DataField, AutoNetworkedField] + public SoundPathSpecifier AirlockElectrifyDisabled = new("/Audio/Machines/airlock_electrify_on.ogg"); + + [DataField, AutoNetworkedField] + public SoundPathSpecifier AirlockElectrifyEnabled = new("/Audio/Machines/airlock_electrify_off.ogg"); + [DataField, AutoNetworkedField] public bool PlaySoundOnShock = true; diff --git a/Content.Shared/Electrocution/SharedElectrocutionSystem.cs b/Content.Shared/Electrocution/SharedElectrocutionSystem.cs index 3b2d761e6b835d..e36e4a804b7ee1 100644 --- a/Content.Shared/Electrocution/SharedElectrocutionSystem.cs +++ b/Content.Shared/Electrocution/SharedElectrocutionSystem.cs @@ -28,12 +28,13 @@ public void SetInsulatedSiemensCoefficient(EntityUid uid, float siemensCoefficie /// public void SetElectrified(Entity ent, bool value) { - var oldValue = ent.Comp.Enabled; - ent.Comp.Enabled = value; - if (value != oldValue) + if (ent.Comp.Enabled == value) { - Dirty(ent, ent.Comp); + return; } + + ent.Comp.Enabled = value; + Dirty(ent, ent.Comp); } /// Entity being electrocuted. diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs index 63c79695c47e76..37e5cd6e6aed9c 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Airlock.cs @@ -1,16 +1,11 @@ using Content.Shared.Doors.Components; using Robust.Shared.Serialization; using Content.Shared.Electrocution; -using Content.Shared.Popups; -using Robust.Shared.Audio; namespace Content.Shared.Silicons.StationAi; public abstract partial class SharedStationAiSystem { - private static readonly SoundPathSpecifier AirlockOverchargeDisabled = new("/Audio/Machines/airlock_overcharge_on.ogg"); - private static readonly SoundPathSpecifier AirlockOverchargeEnabled = new("/Audio/Machines/airlock_overcharge_off.ogg"); - // Handles airlock radial private void InitializeAirlock() @@ -68,8 +63,8 @@ private void OnElectrified(EntityUid ent, ElectrifiedComponent component, Statio _electrify.SetElectrified((ent, component), args.Electrified); var soundToPlay = component.Enabled - ? AirlockOverchargeDisabled - : AirlockOverchargeEnabled; + ? component.AirlockElectrifyDisabled + : component.AirlockElectrifyEnabled; _audio.PlayLocal(soundToPlay, ent, args.User); } } diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs index 353c63a38be998..e067cf3efadb60 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs @@ -108,28 +108,25 @@ private void OnMessageAttempt(BoundUserInterfaceMessageAttempt ev) if (ev.Actor == ev.Target) return; - StationAiWhitelistComponent? whitelistComponent = null; if (TryComp(ev.Actor, out StationAiHeldComponent? aiComp) && - (!ValidateAi((ev.Actor, aiComp)) || - !TryComp(ev.Target, out whitelistComponent))) - { - ev.Cancel(); - } - else if (whitelistComponent is { Enabled: false }) + (!TryComp(ev.Target, out StationAiWhitelistComponent? whitelistComponent) || + !ValidateAi((ev.Actor, aiComp)))) { + if (whitelistComponent is { Enabled: false }) + { + ShowDeviceNotRespondingPopup(ev.Actor); + } ev.Cancel(); - ShowDeviceNotRespondingPopup(ev.Actor); } } private void OnHeldInteraction(Entity ent, ref InteractionAttemptEvent args) { - StationAiWhitelistComponent? whitelistComponent = null; // Cancel if it's not us or something with a whitelist, or whitelist is disabled. - args.Cancelled = ent.Owner != args.Target - && args.Target != null - && (!TryComp(args.Target, out whitelistComponent) - || !whitelistComponent.Enabled); + args.Cancelled = (!TryComp(args.Target, out StationAiWhitelistComponent? whitelistComponent) + || !whitelistComponent.Enabled) + && ent.Owner != args.Target + && args.Target != null; if (whitelistComponent is { Enabled: false }) { ShowDeviceNotRespondingPopup(ent.Owner); diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs index bcf28f8b9b3cf4..baef62c3da98ec 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs @@ -28,28 +28,28 @@ namespace Content.Shared.Silicons.StationAi; public abstract partial class SharedStationAiSystem : EntitySystem { - [Dependency] private readonly ISharedAdminManager _admin = default!; - [Dependency] private readonly SharedAirlockSystem _airlocks = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly ActionBlockerSystem _blocker = default!; - [Dependency] private readonly SharedContainerSystem _containers = default!; - [Dependency] private readonly SharedDoorSystem _doors = default!; - [Dependency] private readonly SharedElectrocutionSystem _electrify = default!; - [Dependency] private readonly SharedEyeSystem _eye = default!; - [Dependency] private readonly MetaDataSystem _metadata = default!; - [Dependency] private readonly SharedMindSystem _mind = default!; - [Dependency] private readonly SharedMoverController _mover = default!; - [Dependency] private readonly INetManager _net = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly ItemSlotsSystem _slots = default!; - [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly ItemToggleSystem _toggles = default!; - [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; - [Dependency] private readonly StationAiVisionSystem _vision = default!; - [Dependency] private readonly SharedTransformSystem _xforms = default!; + [Dependency] private readonly ISharedAdminManager _admin = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly ItemSlotsSystem _slots = default!; + [Dependency] private readonly ItemToggleSystem _toggles = default!; + [Dependency] private readonly ActionBlockerSystem _blocker = default!; + [Dependency] private readonly MetaDataSystem _metadata = default!; + [Dependency] private readonly SharedAirlockSystem _airlocks = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedContainerSystem _containers = default!; + [Dependency] private readonly SharedDoorSystem _doors = default!; + [Dependency] private readonly SharedElectrocutionSystem _electrify = default!; + [Dependency] private readonly SharedEyeSystem _eye = default!; [Dependency] protected readonly SharedMapSystem Maps = default!; - [Dependency] private readonly SharedPowerReceiverSystem PowerReceiver = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly SharedMoverController _mover = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedPowerReceiverSystem PowerReceiver = default!; + [Dependency] private readonly SharedTransformSystem _xforms = default!; + [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; + [Dependency] private readonly StationAiVisionSystem _vision = default!; // StationAiHeld is added to anything inside of an AI core. // StationAiHolder indicates it can hold an AI positronic brain (e.g. holocard / core). diff --git a/Resources/Audio/Machines/airlock_overcharge_off.ogg b/Resources/Audio/Machines/airlock_electrify_off.ogg similarity index 100% rename from Resources/Audio/Machines/airlock_overcharge_off.ogg rename to Resources/Audio/Machines/airlock_electrify_off.ogg diff --git a/Resources/Audio/Machines/airlock_overcharge_on.ogg b/Resources/Audio/Machines/airlock_electrify_on.ogg similarity index 100% rename from Resources/Audio/Machines/airlock_overcharge_on.ogg rename to Resources/Audio/Machines/airlock_electrify_on.ogg diff --git a/Resources/Audio/Machines/attributions.yml b/Resources/Audio/Machines/attributions.yml index 7483cdcff304ff..1b4ea7474160bf 100644 --- a/Resources/Audio/Machines/attributions.yml +++ b/Resources/Audio/Machines/attributions.yml @@ -175,8 +175,8 @@ - files: - airlock_emergencyoff.ogg - airlock_emergencyon.ogg - - airlock_overcharge_off.ogg - - airlock_overcharge_on.ogg + - airlock_electrify_off.ogg + - airlock_electrify_on.ogg license: "CC0-1.0" copyright: "by ScarKy0" source: "https://github.com/space-wizards/space-station-14/pull/32012"