From 37355c73645a2db624a68663134fe7c84def4c00 Mon Sep 17 00:00:00 2001 From: NR <66198468+withoutcode333@users.noreply.github.com> Date: Sun, 30 Mar 2025 07:15:43 +0500 Subject: [PATCH 1/4] BASED Wellx3 --- .../ArmorPlates/ArmorPlateComponent.cs | 21 ++++ .../BodyArmor/ArmorPlates/ArmorPlateSystem.cs | 78 ++++++++++++ .../PlateCarrier/PlateCarrierComponent.cs | 26 ++++ .../PlateCarrier/PlateCarrierSystem.cs | 114 ++++++++++++++++++ .../_White/BodyArmor/BodyArmorEvents.cs | 14 +++ .../White/BodyArmor/PlateCarrier/close.ogg | Bin 0 -> 22250 bytes .../White/BodyArmor/PlateCarrier/open.ogg | Bin 0 -> 13430 bytes .../bodyarmor/platecarrier/platecarrier.ftl | 2 + .../ru-RU/locales-new/autotranslate-5.ftl | 4 +- .../Entities/Clothing/OuterClothing/armor.yml | 17 +-- .../BodyArmor/ArmorPlates/armorplates.yml | 22 ++++ .../ArmorPlates/armorplates.rsi/meta.json | 14 +++ .../ArmorPlates/armorplates.rsi/onetier.png | Bin 0 -> 224 bytes 13 files changed, 299 insertions(+), 13 deletions(-) create mode 100644 Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateComponent.cs create mode 100644 Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateSystem.cs create mode 100644 Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierComponent.cs create mode 100644 Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs create mode 100644 Content.Shared/_White/BodyArmor/BodyArmorEvents.cs create mode 100644 Resources/Audio/White/BodyArmor/PlateCarrier/close.ogg create mode 100644 Resources/Audio/White/BodyArmor/PlateCarrier/open.ogg create mode 100644 Resources/Locale/ru-RU/_white/bodyarmor/platecarrier/platecarrier.ftl create mode 100644 Resources/Prototypes/_White/BodyArmor/ArmorPlates/armorplates.yml create mode 100644 Resources/Textures/White/BodyArmors/ArmorPlates/armorplates.rsi/meta.json create mode 100644 Resources/Textures/White/BodyArmors/ArmorPlates/armorplates.rsi/onetier.png diff --git a/Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateComponent.cs b/Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateComponent.cs new file mode 100644 index 00000000000..9efe8900aa8 --- /dev/null +++ b/Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateComponent.cs @@ -0,0 +1,21 @@ +namespace Content.Server._White.BodyArmor.ArmorPlates; + +[RegisterComponent] +public sealed partial class ArmorPlateComponent : Component +{ + [DataField] + public int AllowedDamage = 100; + + [DataField] + public int ReceivedDamage; + + [DataField("tier")] + public PlateTier PlateTier = 0; +} + +public enum PlateTier : byte +{ + TierOne = 0, + TierTwo = 1, + TierThree = 2, +} diff --git a/Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateSystem.cs b/Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateSystem.cs new file mode 100644 index 00000000000..fc2b330eb5f --- /dev/null +++ b/Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateSystem.cs @@ -0,0 +1,78 @@ +using Content.Server._White.BodyArmor.PlateCarrier; +using Content.Server.DoAfter; +using Content.Shared._White.BodyArmor; +using Content.Shared.DoAfter; +using Content.Shared.Interaction; +using Robust.Server.Containers; +using Robust.Shared.Containers; + +namespace Content.Server._White.BodyArmor.ArmorPlates; + +public sealed class ArmorPlateSystem : EntitySystem +{ + [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly ContainerSystem _containerSystem = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInteract); + SubscribeLocalEvent(OnPutPlateDoAfter); + } + + private void OnInteract(EntityUid uid, ArmorPlateComponent component, AfterInteractEvent args) + { + var platecarrier = args.Target; + + if(!TryComp(platecarrier, out var plateCarrierComponent)) + return; + + if(plateCarrierComponent.PlateIsClosed) + return; + + if(plateCarrierComponent.HasPlate) + return; + + var doAfterEventArgs = new DoAfterArgs(EntityManager, + args.User, + plateCarrierComponent.TimeToPutPlate, + new PutPlateDoAfterEvent(), + uid, + used: uid, + target: platecarrier) + { + BreakOnMove = true, + BreakOnDamage = true, + NeedHand = true + }; + + if(!_doAfterSystem.TryStartDoAfter(doAfterEventArgs)) + return; + + args.Handled = true; + } + + private void OnPutPlateDoAfter(EntityUid uid, ArmorPlateComponent component, PutPlateDoAfterEvent args) + { + if (args.Handled || args.Cancelled) + return; + + if(args.Target == null || args.Used == null) + return; + + var platecarrier = (EntityUid)args.Target; + + if (!TryComp(platecarrier, out var plateCarrierComponent)) + return; + + var armorplate = (EntityUid)args.Used; + + var armorPlateContainer = + _containerSystem.EnsureContainer(platecarrier, PlateCarrierComponent.ArmorPlateContainer); + + _containerSystem.Insert(armorplate, armorPlateContainer); + plateCarrierComponent.HasPlate = true; + + args.Handled = true; + } +} diff --git a/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierComponent.cs b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierComponent.cs new file mode 100644 index 00000000000..978ee2076eb --- /dev/null +++ b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierComponent.cs @@ -0,0 +1,26 @@ +using Robust.Shared.Audio; + +namespace Content.Server._White.BodyArmor.PlateCarrier; + +[RegisterComponent] +public sealed partial class PlateCarrierComponent : Component +{ + public static string ArmorPlateContainer = "armor_plate"; + + [DataField] + public bool PlateIsClosed = true; // true - застегнут отдел для бронеплит + + [DataField] + public bool HasPlate = false; + + [DataField] + [ViewVariables(VVAccess.ReadWrite)] + public SoundSpecifier OpenSound = new SoundPathSpecifier("/Audio/White/BodyArmor/PlateCarrier/open.ogg"); + + [DataField] + [ViewVariables(VVAccess.ReadWrite)] + public SoundSpecifier CloseSound = new SoundPathSpecifier("/Audio/White/BodyArmor/PlateCarrier/close.ogg"); + + [DataField] + public TimeSpan TimeToPutPlate = TimeSpan.FromSeconds(3); +} diff --git a/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs new file mode 100644 index 00000000000..5e55392e3f2 --- /dev/null +++ b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs @@ -0,0 +1,114 @@ +using System.Linq; +using Content.Server.DoAfter; +using Content.Server.Hands.Systems; +using Content.Shared._White.BodyArmor; +using Content.Shared.Coordinates; +using Content.Shared.DoAfter; +using Content.Shared.Verbs; +using Robust.Server.Audio; +using Robust.Server.Containers; +using Robust.Shared.Containers; + +namespace Content.Server._White.BodyArmor.PlateCarrier; + +public sealed class PlateCarrierSystem : EntitySystem +{ + [Dependency] private readonly AudioSystem _audioSystem = default!; + [Dependency] private readonly ContainerSystem _containerSystem = default!; + [Dependency] private readonly HandsSystem _handsSystem = default!; + [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent>(OnAltVerb); + SubscribeLocalEvent(OnGetPlateDoAfter); + } + + private void OnAltVerb(GetVerbsEvent args) + { + var platecarrier = args.Target; + if(!TryComp(platecarrier, out var plateCarrierComponent)) + return; + + if (plateCarrierComponent is { HasPlate: true, PlateIsClosed: false }) + { + AlternativeVerb plateVerb = new() + { + Act = () => + { + GetArmorPlate(args.User, args.Target, plateCarrierComponent); + }, + Disabled = false, + Priority = 1, + Text = Loc.GetString("getplate"), + }; + args.Verbs.Add(plateVerb); + } + + AlternativeVerb verb = new() + { + Act = () => + { + SetPlateCarrierClosed(args.User, args.Target, plateCarrierComponent); + }, + Disabled = false, + Priority = 3, + Text = Loc.GetString("platecarrierclosed", ("closed", (plateCarrierComponent.PlateIsClosed ? "Расстегнуть" : "Застегнуть"))), + }; + + args.Verbs.Add(verb); + } + + private void SetPlateCarrierClosed(EntityUid uid, EntityUid platecarrier, PlateCarrierComponent plateCarrierComponent) + { + _audioSystem.PlayPvs((plateCarrierComponent.PlateIsClosed ? plateCarrierComponent.OpenSound : plateCarrierComponent.CloseSound), platecarrier.ToCoordinates()); + plateCarrierComponent.PlateIsClosed = !plateCarrierComponent.PlateIsClosed; + } + + private void GetArmorPlate(EntityUid uid, EntityUid platecarrier, PlateCarrierComponent plateCarrierComponent) + { + var doAfterEventArgs = new DoAfterArgs(EntityManager, + uid, + plateCarrierComponent.TimeToPutPlate, + new GetPlateDoAfterEvent(), + platecarrier, + target: platecarrier) + { + BreakOnMove = true, + BreakOnDamage = true, + NeedHand = true + }; + + if(!_doAfterSystem.TryStartDoAfter(doAfterEventArgs)) + return; + } + + private void OnGetPlateDoAfter(EntityUid uid, PlateCarrierComponent component, GetPlateDoAfterEvent args) + { + if (args.Handled || args.Cancelled) + return; + + if(!component.HasPlate) + return; + + if(args.Target == null) + return; + + var platecarrier = (EntityUid)args.Target; + + var armorPlateContainer = + _containerSystem.EnsureContainer(platecarrier, PlateCarrierComponent.ArmorPlateContainer); + + var plates = armorPlateContainer.ContainedEntities.ToList(); + + _containerSystem.EmptyContainer(armorPlateContainer, true); + foreach (var plate in plates) + { + _handsSystem.PickupOrDrop(args.User, plate); + } + component.HasPlate = false; + + args.Handled = true; + } +} diff --git a/Content.Shared/_White/BodyArmor/BodyArmorEvents.cs b/Content.Shared/_White/BodyArmor/BodyArmorEvents.cs new file mode 100644 index 00000000000..13bd9701109 --- /dev/null +++ b/Content.Shared/_White/BodyArmor/BodyArmorEvents.cs @@ -0,0 +1,14 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Shared._White.BodyArmor; + +[Serializable, NetSerializable] +public sealed partial class PutPlateDoAfterEvent : SimpleDoAfterEvent +{ +} + +[Serializable, NetSerializable] +public sealed partial class GetPlateDoAfterEvent : SimpleDoAfterEvent +{ +} diff --git a/Resources/Audio/White/BodyArmor/PlateCarrier/close.ogg b/Resources/Audio/White/BodyArmor/PlateCarrier/close.ogg new file mode 100644 index 0000000000000000000000000000000000000000..55d720d7d5488eacca797f5e8439cae472473e2b GIT binary patch literal 22250 zcmb@tbzGE9+c11C4N@Y~DXnx#gCHs^-6;*yT~e!*(hbr`D=FP50@5Wc4N{AAH|%$U z*L6Sl@AWlBJ~@fCBszVC)1NH%S?J+++w1#NEN!#LDHS z00L_S03;XyCzRXYI*8Iu&Hsd(nh-FT#+d7P*Z2nWzrq;mUrKl&g1oW2g}`G@AwEtX zZf;bt02};1eWETa&dbfqLjY#f<<#Y6#fOrHz77WrHSp7cMdtRV4rb=g;$US{urd$# z&6k_b*2?5BVF>!)-$&9inh*dBtidBs*8v-f)&KxP05D=?!;iC&W6O)rX7x&re{qxQ z;Qo*t|Dl7-G@PgN--wRi>^=aX0WenV$edL<>j7a)GL}f^EMY4}p#nP0P?ZH??C(d+ zruO+&`8M_gY)n{qI_Ln%KB*VqC7Uy$aE^RO`M9S-kLx&V3J zKe=&=B7X{VB1P6&tA?cSa8!*z<$1<5O-q|G418P$gb``~MA*0E07s4{jX`ckD2;VP z{ykfMvNK5P@380q7&uJec?_{!1#xc$RsS%f(muP&J%M39Sv7S94KTPFXt|ri-QD2s zzB_&Jg2_%CpXXS(CHvR7K3o&65FQ-6rUD_KcNN&7oz}X zH!PvUj(xxunI*m!`gDs#YZw+^wDB!lU?5qt zY%Cevzb%0X@3WWbQif6v`i1dRR|`F4c65eN?9$eCk9g=;!|0w>(&3# z`$sK`UZo9u6aEd>_%M}fQ;%%`rq0aLw)?Sf%Ko?dNP%)Qo*?T?e@EvViD5!apHCl0 z;~Iq@m&NmwEte)D@)@)!Kv|WXCC~NU?a1i>Adv7@i~o&oRr#+L=f;LU>|w3!cyN!~Vs|gy63Yd>-n2))ePu7_0)%xnx{9`bG&1N3%_FtBBVtGN3hmWmh=(J4W$gkfE-!r2j1d z0BDQGeR=CgR8%>}R0YOVIW*M8|IZc!LdWp%a z0uqH;^1vFH+3~TeHhH<@Ai#AMP|bRPQPssfUYf& zSNZi%C_sk;PRcs0x*1%1bl};{j73Uc7D?PolaivvJV zyJ(m|77C^2b0Id0JM6b(gaB=zEkD7aH@#UI1%eUSPqLeSa%bZbQ+y=?UVy7ITyXrD zpmp8q7F3SyMk{VK&;dGrApk}_Q7-abZdltWoBk05CI$d6*lrh=pmp6a{YD!9t}}V^ z|C9QkvfI?^KY+d);e-pXQr*-|b5R7<|1ByY1&er)dM_O9{>>P%Kv9Pq->QE!G$;O+ z!3mlad1(PeHyRB(D5gA6^EqnzgxS~FlD8@~mpN@Fqo2apF60DJWp z05V^sc4Bg7}ZUTu(0l5~|^tXa1q|Z!iA;&;EZl z0TlM)Vz#YeQ(9`vi9DjhlT9O^uz+T)Ym@v=S$ZuucLZu%Apm`H!z@+M zOvZWF3gcs;(2@=k)9{Z0s;Un`4+{FjaeQegM>UCFSjDQY4Q6&O=s|B3th6~G8fsIr zLS|YnjF@`D%2qvL5-tGO^~Nu%0tr+f>)Z4TzXv@$&p3rkzre}NOOSGkO{oB8rVC+y z-h_3803ywsP~`NNZbbbmjqA`81dS`S1e^s2#4+i8cI&IPZTbZea{&Y*So79jK*hG% z5kJWYu;&3adFa~>%9A=Wn?d0dsz7{^QyN_0XM`glrOzE3Ez(;)@}5$ujqok#UvPl; z;Di48~Gfun6J41i2x;Y=x%BZeUd6q+`T7J zzm&rgj6yUW14v=F6B@Y7A$$*V#3hn2e%xfMUL7iIU4e+Ff0tI3_OcuIiK4CzhuKe7 z7M>bn-az82DcwJyJ2&}K;Tp~(SJaURMS$yf;2i*<-sQcAMJ)C9EiND=^&%Ptz`27< z-7YI7#YvyjmgOif#F8!u08ifc5q@~zLC2F#!TK;C71n_s>;wE9nt0Jz2jfK5AL=l` zl*W=Ke5Xw%1;G{)`W?(Nw;M>AmZhe?e$&p)zIp-V!X)tE)5niXYrCfa_FZy%HXh+8 zaw?!Z1_K>%3OYee*!$NOt3o1T5>nDnpS^&}D=Mq1|IdK~40ekv1;#Mg-y;Pn@TlP? z+#D&~AcmHGRH}eLSddSUJjehgb!82tD^d#StD&kWsHLK;rmUf+p`od*rmo4arK6<| z{%U9;KO)0*G<9^fwM9gQ9}8=1YwBofX=));ky^-j;m6#(ynO1q8fw~_nwrR5WUQ!$ zmb#Fp#$yp-EnQ(D9c^tL9U&cEH4QB-WFj(3NLWNjNmWx@LqkhjLt9frQ(Z?}Lq(BG zOG8aaP+Juli-aO&ka9>dqyUns7VwarEVqd-CYR1|p@hIA!kT`kA80VV@f?ZP z%FH8}z_0eq8b+<^8l8&laI#e?9bvpc1bkO!Uxu1KF#u2Kf+-zv?mhI(bulDYBy1^~ zk8liW@I;L$NUJ80qG@1teL`!m-{>W697`C{?|SeSN>5?<1Np67txz-&v2$L^#X97R z`H2TtyfrHzb#~KYP%P});&Ee6fheGj%v?ua6KE7JK3Bd{Kdb0LO8N&Pk*Cieem)I) z2&2710sN3i{}t*EOrN$80$K?$KA;X--206xAtu54mH-MMM1|%d#8G@SJ)#6FGT34g z3)yHeK0qwqg9h3GBF{i*Xkj5l$v|DeJ!~MZ`(Cr*2oh;!v_F2e-^_&ys;_`9&s50; zDom6NS@Ii%& zd)Ctx{?HxsKMR+<zsnqsUw^qyc@gGL2M=>Ic@)C9e!OOMir*pN zyCHRSaDx0Sd444c^5YaHdg6o$Wp!*h_&p#~RQH8U=Uv{)O0{YcL+`I{-XI)+fXUI1 z^*(Jp0qfo=4CKK#owp&X5Fh2mVj#Ya+!CFb7Iu(M;JFaF*shb^VH-oh47&-UAdKVcmu%D&z0)sotemvYLuqxsV)FaSZ*(FeR`+j1% z^V`n-5HUl6EF5$;-Id9XEc}94+&ZQHqrw+`mhMGpjiHcMUEhF|^z}4k^Ub_0vnOY# zAfMq*VWJIO+>|!-scHPTa0v}-{gPviq0)-*FS&?mVZsw969VO{lhsm$lm zmdP|fy82njn>@O-x`_4!JdtAGYYdqFH7>l?p9@wJVE8qz3FWmFdzkPU=a2I_foYm_ z4q6Azs3={6ZUER<&GWfmrQY*6_mB1&*6%s!WlG&2!@8IPq(lNN;@+z=L;Cvd_Pu_$>NAL~4DDg51Ac>uNh|Su9n>4k7|}l_hA}e1jIV zm8C)91ukB~7O&5WeSpvdOeP6{0D$e|6I+VWKmiXxY=FQAwtsn=rlOTIbt)oXjaL~pak zXr-^T9BJeYAtjyZ1P@>*f4u0d5GeQJ(xwD5wMV?Qae=l4J6zbrt`P)ar_Mpq)RU|; z@UX45^G$fU?KxfbYB^{2PH~Pu zYV@=xJ!>WSXxG_)c$Gb0!GZ#W($dGua1ZG#@{;Wmbp3AJn+2qdI2^0)0uM}VS^$9k zZqVyrNyU;=hsRefOQUNA7lIC?R}(Ha)-B$4eb>LNy^LLA!Vnpi!baJTS>~d&fwpp@ ziD;5dNp8ky|0S#jE0kOtMR#&sj8J!>=ac}2@k;lYIif(_;UQ=Vvk0bv{4|+-KD(b0G(n1}zbf1MXy*o-X3AZLe{y z0i2xn^}xC1_VyYqGLi;Z1GkR=zzF~YSwU`7qd--a=v8o{1?&{_QT7lhl$O2UhV;`=-!0lNdWS@geE&v{iOKcaDEAKV3!9i=!Kvk-ZRxU&S_&Hw zk|f4iK}BFXcItRxwqde5p6vb34kQA$B|tB$15RF9O$30%V=D7IQstCBwy7`f;Q&Vz zv-r6CJN$T$>QVKJn8`!OhRbcb@8SbmTV3u!zEH$m`-MTiFwNWpG!*zN348bVq=fb2 zeYDa3&MZhC&V+Xg%7zKcIsS(AFwxJ`$KOBv;?A-!tSw8x63RO3M_$P!`$!C3`#~;P z3o7u9VTCY5?!b2>SSgWP@u+&D)QG2H-Jb*=Beiw&*;S0Ks_qzQ2V*CE^H=t(^KWr! z$x#;Dendk{qwE9v%d{QVgiujSbiW-j8jn4QrIgnRz69VYHqdtF6O7U$N;?4TLJ*CJ z%6(42EfAWg2$Rl6S&^-s&QlyuW>-jrFsqYoJ#^|!zYtn-LSCQwXcehvI3Wjo(;!mV zQckpOs01tNe8fVF}UoXOv^cD`+RdCJX-Qm8^qL$WY( zFs#h0uRbJ0uk+Uw1x1a5JV3@=>FQ@E&C<8q^85TNTa~TkR(83(bzJ?zqqPimV1A2Z z`Cd7b!%sCSX6h*F_PgA+94v~DDS_N&`;eI;7>-jtmHcBF>-4gNOFe5pXOQ+v`{)GuF!S`P6~`}J3CKiVNM@aX2~`5u9-vpn zl`2vfiwAa39WlT~=nT4}X4-vaF=Ay_r{G11Se7!l%m7cB9R0)qrU6T_cme>?MGmCh zKVVM6_U8E_ejII=of;kS|55RkC9O-d=3x78NXFV%=taSfl%OHvlEAyAgy~L%&JgJxCrICZpSrEr zFXuA4;7vy>9jdi%rjwZSlG?==9zoTX-1EF$Zc*;2zyfZ;7^X@~oI}z}%z1LUw}2{2 zG>RYVXd0l^^;#E(2w~(EtKmBP2Q{ zOAqhxru=r5uT(jlJ7I(=lbZR1+Q+)FE4id=Q?8YiI{@(G{()_6M;Bq~q}F7$h_hl+ zZK}I|;%IYyvi?;H4_EW7oAZdi4dzib{BX1_&i)YqOr1NFhge;GIOU*l^N)e+`cCI# z12qH7nF$UwirvCk!3eN3>=XqFwg&Gd_h$ST^Zw9O);CJlqVIU;Qw`MGAWMC>8~t6% zsgB!QJ>j3Oudo2DK2a9g*G#CWkN7?NMggm6-A^%OFlA0+M+~Wq!W%z`MpB@ruQ4d8 zz3o3zGqh@J=PqF)t}~gqv*Z7@HJL!Wq>(+%X~4G5&8V`T3m97X#gs-4c|VJ%{R=;e zm?X0m4~XVDZT&V+w?8F+L+{u9LFTA;%QCLRt<$U1UUS-h7rgMA?vH$_{kno7?caKg zO)FL%%eO_eb!>z|-IKb)9y?|9p7pgiW(Z*}b(LU9Hwt(Nly<)z zh1b(~m^xiv{AZ4&{6@W;XvT)`N#9h28&a2@cEUU3X|tbygL_69EjX#y8c15u@SOcp zvP3`*;cy-$N4IO*U+YHZ1@E70E$oJmDhd#%0&siR472N7J$KrJ<5m&4wFu z>7+Opx#5nkw*`EPlvHrMxTE2?+}#$Sl zBH!5?qe=l9 z?>fYX-lf-P+Z`iO0ePY&G!va}y<&qii)Q<>=2z!FBW!CkmM#*#*HN7vP5kv0-V?2p zX7G>g8Py>H=A(LAl;FmTN6sS~{yUaaZHwQrDzJLj!9~hyd%Fl=rDy~XV)-f5Ledsw zH=mca_Lw&uZtj~lR`@Qe@>zb(+MCOkZyO-`a+w4RmoDydHw`6P(n?HWn zA0O^ek|UGuCbpbj&Ch!vE#Re_DAQpDA>ilYWG4g_c!K%$OEiCs>*_TV19(A>vY`!p z1sn&(PkeU3YgQuDMESLAfyO_Jqxs)zXg!?9cGPO&O*QHDdK-i8iUYQ`w#Nv94f3qa zv`p7&0MK6OfPcxn*W|>9=J94B$hj#iL0GZPEW#688K5Ko1qzIvNXN4OS4jI6f8#ZG z%FEhTo;O#eTXk{p;j0}#Uyn3%)5+?c>6e1}cb`c_4le)vx%`s>07QZvP5n$qq$HxS z(is>i^cSjkVhDp-VSPsrL7G&|TSG#YGU2oiJN~V%&&3RMc~2Tr>rO^0`)b_``Rpfo zG&A*iw~pgNYy~l=4MM6n#YbdnA%NA-{mNdO(a>sv6p{TVOk?eldr6}xf_ji$O;lwp zw0#@~4xK>mCXdXrj6y6z;KUWUmjA7vgmV$*=vX^v)A-)#YaqeN{aPs2Gd7Hw^t(ua zA7>WOu3i*<)-pfYax^&+^|+x_pjAR^Iy-qM?X0czpp#jr5pDt3EfzkgmIL*?CjCTj zywso(4jHMbSvU`w4i;<7QFUWJmO2c z+Fd^Xl1^OhdD1VqH6^mWg_?*M*!B=?bl-a80l&UF$@H(Ik*cFqM4jSz(OvJ0ve*g) zyq|^416u`cavF&*V-;H^`yQD++`u{PjfDqa{rTW>&+<)WVfxGTkt73nek9!9-`VWa zeyRLe-hHdV$)TfRa?_;JUlMo$#edUxe9`y4|u9Lh4Mg%Z4I zd4Q2*<@@`*b4s(w6R#unjN0ks%(?eV!m8V39=-`ygJOo^;fJ%U>kK@I55ZQ>{o~w8 z%nHCl^{;|DU$Qv1aur*@??V;k4VZ{q!s6C6@bwNoN}TA%Z8HHNZkV{!aP_T>M?s$B&@)k5J0H zWq!uJUVuD>C1tsE_f(-&x6f)6h2$?B! zkT>26TPEb5 ziTk3SC6Ne*c9(+6vr41a+jD&BU&4n;05O``@9P!I&nL%HlYH0D*9%2ET*HfoBu-qG zD(V@IrmjA^e7n4qn0{As$ilnr>wR2h*T_Kzv?-AhD$ym&ll2epMXSsKSGLvo&){Oy zyW;04(pbbqc4i7`^tDr$?0*FO>rZ^NF8W6%m%Z4kb;SSV(r$`y<%I}N8!((*%x~Zs3YjTPUSCkWUU$?i;*gE`rlSnx(o1N5rApHMs z<#4j~gj%PGM~+S#UoLmw`P7z+PpL*WFp5TVZl2mu?@w*|+O|YN;=NBJG(V&lIC!sX ze5&%4zl1!#2U)lJVf(61PI{qWv-tYLA*^idz$o(0taM$=Au;=h&p&LAP)gpi`|u0p zdK+8|H;L&A>!q}{*>b)7prLquD&rndBBnl9PfJ8zBr{?4yokmil8QIv_e8{7)J@}Y znV%TmLnREq94H@h@OMAU8I6NxwAyJ(FEjJUqGYshEDM(XzTA;e%kFTGky1;5pN4;b z`l6`uQVX*qS0U#);)y>tV_sI^N3^zja3Ti-%xa6W7F3WC>jCs7$ zoJKo3eqQ50Nk<(i#y-IEUd`lyqA(D5KgylNf!-!+?=tWL_K7xKW8swBUq-kvsSMf2 zfJiUX{A%<|DI#;kV5R!SQ#nCbRQm0Ld$X>aA%mvB6Q;jSsxp*xO8ALPrDaAEkd8%` z&Z(HAii|fJHQp7pS6O%Tu7BrH@B)X%(_$>e7}xBsu!Z z^vpAr*>A8c>YJHNf+xzQx4OuRw@y=0cC0d#u& zV&oNnNwwdcD?`rrt}@(d`h6uSOw8mt1tY|uAs>!Zt!I3RXO^y$PlpEg%pY9lD0MLx zvb*cA2uYEdh-pEHEGQEGho-7Se2FjZ>N5Qk$`DQ6iGvNvy?rSLDX0jcfu!x!ok<<` z76T9MZ87StIv(e~es18LyrWB4m9)|R+UN;M4D-i$_p4%s3c+%5fyKHvzw~YQULNB^ z^g+(iCFOc%v1S~V@}ePDivoX&8RLE>}vhxtaL|es;N`}x-i#( zz60Cn`<5Z;6xe(~E`Bo+F=t}D+=I6a1J`alXKzf-(ExQ4J&e!zv@N5>!gZOF2rF^k z(xb(u1I_f+zIscfsHv~}s#@j4bcc)!=Ol~BBJtz_haGTB)FW(FZKKSrs&Q{`NguB9 z)?96a))Jq8St!Dah!R?v559@VX_x3*THa~g@Y{cFB)va6o%34A;3^DCQTE6A=*JNy zo8e5c!o5^dFEtwYfk`C+Ccv$dj87SV$4l)~wxtrB^0HKPwu6bVcJLeR`(Ic6+hgL5 z-NKuwfWC-^<$Ho){MjhlN>`e+8ke$H+liIOTGP&gs}oU!5|LKc)5SFB57;hGYqVo& zmC=D(>;6_JtEY-6T=zyY6z1^>zN?q@X_QQijFkxMZMtnNoGy#t1Gv(|-OnWN#JC$E zXR&T9y-7IJ%q}fT zb!@1AdU3a3+nUtOP~0>mP3_idv|!t|rpGHA)e=LC&`*P*kvqiHrw z!|V7;JfdFlXN-AlRvS5=E8h(JX|6rf5>kwyGeH3uDcnW`ap+AQnvwmtG)&g+e5lHhBVBIK3N>0eEC zTXcD#qM)Fm155kjsN{KEdXg-6eo07=DJTEVkvrd5T-W%V$&MUd1ExMHLx4kJw*j?3 z@#tMvS6Eo6QdcHUrw1ygi32_3A2~%Ed~F=;IcqPXFYft3BfgG0Jk(l~Cz&ZQ4`2Y~ zp<}?g4UWLkmRjlc3{Fe zbK_TpY*X3qoLXPS!;A`P^gw0$*g>Q=1`x=SyHQiGGB#fzV@m40OUC>^3Nz0&#XlGwWL_}QfDq=C0Qf)m-2&G3aL_FU$4(@*Jq zKd9L8S}_}5;a!znDmX&*wf?9|1p=evn10zci?hFQbJf-mU!1Ij>VBGK?5gOKHmnMA zeN29U`|O+Bo1JI&1a6~~sV2hx^;N>+rgJmCHV25U)aJQqj^C`V8^P%|jdl%j$AN=b zz-Jol`}oD~<~`H1e_;1oXCS_QT>iD8$6R0fw#rN3dM*!8pL*x)1h{3fHpRco=#QlI4ze`De_+nG>blsU3m^n`snJr6JsP=FKrqZ-ytsrl{3i z{H+z@&)uvkuKQW4i4C*pFaToaz2e^kyWbJB*E>nC*T0!wYh9Ecx2~IwZtvNLl6779 z#nD{z=JS{@Pwq1(XW5NV2y(Uqh5ntc3ju!F5$cPRmp@CF5?qlY>2DdXcZJ7FCrJfP zAWwNU(ES9>M4UyDUdhd~Rxhb*Pp6Y?dAGOIwUWMFZ6xVU^&B^CAWVecY;3RcW{kDc zDY7g?MJDYYhBJ6c=e*$c%1flG80U96VTn}=bSrXwJ=S-J{1RXZRW8+kDVxO%p)-{TbAaK z_^Su$zqFG7Mm*rSYK-F^Apv0HpSeCMIqPhd)Vd?+J?v$yIs4{Kdy=UJS5&DXq-k4K z<4$l&=Fbj_@&|M;v<)h?n3fDTa!NJ%0zzoz##q@ZoQMj0!e(i=rN*Oe=WMUA;JlkiJJ=$>7l_Gb<0r9tikf}c`&MNaT*iwPnD2*As#(sx?wMld zPz2x-cK0ql<%uS(Wf&jl)G5$MJ3oI;jbccX5qtQddi>^S=@q7#Fh;!X9s$4*_7oi` zmk@j&tQW-D-Od2`vGV7Jr{SQqRr&T`wm9=E$Jd#^jsF28JIw0h@A+ zN?A*`(|RH03d4$+dV{jYnkefaR(3u^N*`Wn-UQt&AuMw!WFcgXRIPr2s#=ly>Umdd=4i30glaOm(_B%)C-DB1P5qa`*SuzQQW(+j%(md-_Y%3_0Z@AD`?P;d3LD zXhSHGLc-E2c(7MEI?mGezEf&h=Co5kL^7k-k!-(M@h@q9D6pB0Cx}sA4L3#US~N9T zm!cNa4@*Cjuuvkodh|$aD+Aq;vfoE8%FxLdMFkar-2;Z#+uK@j+G1;-Evu6{iNZL1 z`VM{$_WtbOkm)|7(@dA&m`Jn4$X=eaHkeF|QKlXzH8H}IKUs(yL}D!3 zBAb*+)bsObYRFn-j|wAxZ$CWIDtjg=7A8LZEFc+J_|yF75r&tFWr$)6-hRHEeOP64 zEdD~sQ}PgVxZuRqt0=KZ$*zx=d!GAyfn5V~_IJcgf(oYTt{kr!N|>TZyj5|Qk~){R z4#mFcn(i%5(~ZP9;%9~lTNSYr81~NEB~Ay2xiK_Bhe<#5`QPz-c;;ZceB94yWnQu} zcs`;@E5vYejy>FsPiwyHh$N{$l2luZ#~C@WCboPO zI2b78S;YuPW%Bh7=MjvHkcy@F${1=^UqNhr)f)A{t==UE786kzk5l}}m*)yjsg9&N~;69BnOoI0{rOmK}!%%!C&Y0Qf7S zvS$P-0E~>O^t{E#@64$Wkoi*KvlZYz35vz}zW+!BLX6rrG*lZp z9d9iA#(sCMW_qdFsOA5 zUG1G+vTGWQo%5rCay5@4?<9_y%mV3`c%Ay}*x;uGF-Y=52SIj0 z3=SlG1-XlT%9-aanx;38n193s?vs!KL~T&)r#Pl)^cx)p_9y8U29;}5)B1PDU)dIH zcu&L6ud6O}Jx)Ar;M=;r-m@RCefB;_W!3_)BDUJc>|}2N1D(|0oe@{pc{SF{c8nrj zY-s$qJ26IlbJcY``?|8rJ+~w{ZOhu>(uj|6CVSMD8C*=*O1?#W8&#BncB0w_UTW(; z>pop-(CA)abFf`%zyO@?NahVz=X*@4zQm>5dFWpqYxH$arx%y|(EAQ}0J;TW`Z#7b z`p-woif|jetb2^uT`?Ot%*n6k_ek&ZN6x!94yJYMzS5td8mB1^srMGsy9a#kRpUwb zuZ6#eo&UD=v@hA)FWBWFtllfjXnN`{M2un-t-;>kv844Zxq8}5z|s_MSf|8e*U;5) z;eg9b4)-;t7-(t4*A}$#*m9xqrh(}x$&~$Ir1C7N9eYdDaoQ?@ar1wbNEWGud+O^b ziVXOSBoU}_`Lz1pOiG4`fr@^jEn&$=wTaITR*txyF_+C#`;VlF4Gw&)4sl!^57Xls z&(N{i(JckrlJf_RB5j%)ChO|kuH9C04qd{hUL*P$3@6im?T%{ zlv76I?AiWM3!~NYd1+i;OhQGB{g;kly~$?(t*I-U$L`M>S>ExWE*zTqiL)6OM;ViB zt&CPie&w}1uqS$O8iVuALHjch4KU(+1vI%{gw7ajJz}OKtxbohIBSU8r3tkj>e;` z!h1ePUa)a>6U4;)nB1 z`a9hTBz!Dd+cvUE(uiEc0vW5-^u9@pdvwgeu7{t;_YVjzyTy|Q%nU~R7K8kX{c%NS z+R1K@&OIwW(I~ytlZKP6sUb~MlgYP?NU^yjt00EdseO|s?M}DKnC`6)W(uj@1ke)rQ{{%P z;hkdUMlKtJkVBmcIq$K!m9VY0LxUT^^(tI$S?A0aH{Q39y%<>k)ffK|{CCs-Lx){L2IS>#Hr{6c9N;dfE|eK&`hG39 zt>CCXou(l2xY@~l`>;8=gy7LVTt?P_Ji3gxWKLG+L)LoB6e8w|P)7AX#`dc@Pw)og zOJzRF$ey8yG0Kg~mOs_ldCP+tF5xQDQ|D9YW99p~N%vx|YUd#OzVhMEFJ9`^;F<*; zEo7yBPy6B5@Dr~Auk{awpBeFR`^1MSDdAUj9_rd}Q4QI?WvddDex!BPYRka36-$$q zDZEO@l+%Knr$kJ$`mZydIN22oICvxNlYK22nEV7Aqa0>zYs<9iwdDO$gD3Nus#eFw zm2~0KPekjC;boXd`SV?k7G>aGeCZ|216Rv{od#5Vpk}OInEt{y3?FX6o z$BR`y1F-N(!%O?OXaqR#(Z^@(UJ7hb@-f3PPP#-iPMBM93VFoWVK^%L?Iyg%h4wN1 zUds$m+fu)bbqarXX^vsRKx2Ej_J!w9!i$IHyIsZYmwX5`Yl8QWElNzNN*I>eU9bbh z-nk~

3H}mUIQ*D^Nuju(F~}y(2peu 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 P)&&6p0RaIH4h{|uME{^9 literal 0 HcmV?d00001 diff --git a/Resources/Audio/White/BodyArmor/PlateCarrier/open.ogg b/Resources/Audio/White/BodyArmor/PlateCarrier/open.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a8736d8708cfed003902507fdc944715d25ef287 GIT binary patch literal 13430 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 Date: Sun, 30 Mar 2025 09:24:13 +0500 Subject: [PATCH 2/4] base apply damage + more more more --- .../ArmorPlates/ArmorPlateComponent.cs | 12 +- .../BodyArmor/ArmorPlates/ArmorPlateSystem.cs | 19 +++ .../PlateCarrier/PlateCarrierComponent.cs | 3 + .../PlateCarrierOnUserComponent.cs | 8 ++ .../PlateCarrier/PlateCarrierSystem.cs | 119 +++++++++++++++++- .../bodyarmor/armorplates/armorplate.ftl | 2 + .../bodyarmor/platecarrier/platecarrier.ftl | 4 +- 7 files changed, 161 insertions(+), 6 deletions(-) create mode 100644 Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierOnUserComponent.cs create mode 100644 Resources/Locale/ru-RU/_white/bodyarmor/armorplates/armorplate.ftl diff --git a/Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateComponent.cs b/Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateComponent.cs index 9efe8900aa8..e255f7a06e3 100644 --- a/Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateComponent.cs +++ b/Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateComponent.cs @@ -1,4 +1,6 @@ -namespace Content.Server._White.BodyArmor.ArmorPlates; +using Content.Shared.FixedPoint; + +namespace Content.Server._White.BodyArmor.ArmorPlates; [RegisterComponent] public sealed partial class ArmorPlateComponent : Component @@ -11,6 +13,14 @@ public sealed partial class ArmorPlateComponent : Component [DataField("tier")] public PlateTier PlateTier = 0; + + [DataField] + public Dictionary DamageOfTier = new() + { + { PlateTier.TierOne, 7 }, + { PlateTier.TierTwo, 12 }, + { PlateTier.TierThree, 14 } + }; } public enum PlateTier : byte diff --git a/Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateSystem.cs b/Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateSystem.cs index fc2b330eb5f..8593f8f4e98 100644 --- a/Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateSystem.cs +++ b/Content.Server/_White/BodyArmor/ArmorPlates/ArmorPlateSystem.cs @@ -2,6 +2,7 @@ using Content.Server.DoAfter; using Content.Shared._White.BodyArmor; using Content.Shared.DoAfter; +using Content.Shared.Examine; using Content.Shared.Interaction; using Robust.Server.Containers; using Robust.Shared.Containers; @@ -18,6 +19,24 @@ public override void Initialize() SubscribeLocalEvent(OnInteract); SubscribeLocalEvent(OnPutPlateDoAfter); + SubscribeLocalEvent(OnExamined); + } + + private void OnExamined(EntityUid uid, ArmorPlateComponent component, ExaminedEvent args) + { + var hasDamage = component.ReceivedDamage > 0 ? "имеются визуальные повреждения." : "визуальные повреждения отсутствуют."; + Dictionary tierList = new() + { + { PlateTier.TierOne, "первый уровень броне-защиты" }, + { PlateTier.TierTwo, "второй уровень броне-защиты" }, + { PlateTier.TierThree, "третий уровень броне-защиты" } + }; + + using (args.PushGroup(nameof(ArmorPlateComponent))) + { + args.PushMarkup(Loc.GetString("armorplate-tier", ("tier", tierList[component.PlateTier]))); + args.PushMarkup(Loc.GetString("armorplate-damage", ("hasdamage", hasDamage))); + } } private void OnInteract(EntityUid uid, ArmorPlateComponent component, AfterInteractEvent args) diff --git a/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierComponent.cs b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierComponent.cs index 978ee2076eb..ce8aa2ef417 100644 --- a/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierComponent.cs +++ b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierComponent.cs @@ -13,6 +13,9 @@ public sealed partial class PlateCarrierComponent : Component [DataField] public bool HasPlate = false; + [DataField] + public int PlateCarrierDamage = 0; + [DataField] [ViewVariables(VVAccess.ReadWrite)] public SoundSpecifier OpenSound = new SoundPathSpecifier("/Audio/White/BodyArmor/PlateCarrier/open.ogg"); diff --git a/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierOnUserComponent.cs b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierOnUserComponent.cs new file mode 100644 index 00000000000..d9d572a4661 --- /dev/null +++ b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierOnUserComponent.cs @@ -0,0 +1,8 @@ +namespace Content.Server._White.BodyArmor.PlateCarrier; + +[RegisterComponent] +public sealed partial class PlateCarrierOnUserComponent : Component +{ + [DataField] + public EntityUid? PlateCarrier; +} diff --git a/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs index 5e55392e3f2..f4204c741a3 100644 --- a/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs +++ b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs @@ -1,10 +1,17 @@ using System.Linq; +using Content.Server._White.BodyArmor.ArmorPlates; using Content.Server.DoAfter; using Content.Server.Hands.Systems; using Content.Shared._White.BodyArmor; using Content.Shared.Coordinates; +using Content.Shared.Damage; using Content.Shared.DoAfter; +using Content.Shared.Examine; +using Content.Shared.FixedPoint; +using Content.Shared.Hands.Components; +using Content.Shared.Inventory.Events; using Content.Shared.Verbs; +using Content.Shared.Weapons.Ranged.Components; using Robust.Server.Audio; using Robust.Server.Containers; using Robust.Shared.Containers; @@ -22,7 +29,23 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent>(OnAltVerb); + SubscribeLocalEvent(OnExamined); SubscribeLocalEvent(OnGetPlateDoAfter); + SubscribeLocalEvent(OnEquipped); + SubscribeLocalEvent(OnUnequipped); + SubscribeLocalEvent(OnUserGetDamage); + } + + private void OnExamined(EntityUid uid, PlateCarrierComponent component, ExaminedEvent args) + { + var hasPlate = component.HasPlate ? "установлена." : "не установлена."; + var hasDamage = component.PlateCarrierDamage > 0 ? "имеются визуальные повреждения." : "визуальные повреждения отсутствуют."; + + using (args.PushGroup(nameof(PlateCarrierComponent))) + { + args.PushMarkup(Loc.GetString("armorplate-place", ("hasplate", hasPlate))); + args.PushMarkup(Loc.GetString("platecarrier-damage", ("hasdamage", hasDamage))); + } } private void OnAltVerb(GetVerbsEvent args) @@ -50,7 +73,7 @@ private void OnAltVerb(GetVerbsEvent args) { Act = () => { - SetPlateCarrierClosed(args.User, args.Target, plateCarrierComponent); + SetPlateCarrierClosed(args.Target, plateCarrierComponent); }, Disabled = false, Priority = 3, @@ -60,7 +83,66 @@ private void OnAltVerb(GetVerbsEvent args) args.Verbs.Add(verb); } - private void SetPlateCarrierClosed(EntityUid uid, EntityUid platecarrier, PlateCarrierComponent plateCarrierComponent) + private void OnEquipped(EntityUid uid, PlateCarrierComponent component, GotEquippedEvent args) + { + if(HasComp(args.Equipee)) + return; + + var userComp = EnsureComp(args.Equipee); + userComp.PlateCarrier = args.Equipment; + } + + private void OnUnequipped(EntityUid uid, PlateCarrierComponent component, GotUnequippedEvent args) + { + UnequipHelper(args.Equipee); + } + + private void OnUserGetDamage(EntityUid uid, PlateCarrierOnUserComponent component, DamageModifyEvent args) + { + if(args.Origin == null) + return; + + var attacker = args.Origin; + + if (!_handsSystem.TryGetActiveHand((Entity) attacker, out var activeHand)) + return; + + if(activeHand.Container == null) + return; + + if(!HasComp(activeHand.Container.ContainedEntities[0])) + return; + + if(!TryComp(component.PlateCarrier, out var plateCarrierComponent)) + return; + + var intDamage = (int)args.OriginalDamage.DamageDict.First().Value; + + if (!plateCarrierComponent.HasPlate) + { + plateCarrierComponent.PlateCarrierDamage += intDamage; + return; + } + + plateCarrierComponent.PlateCarrierDamage += (intDamage / 2); + var armorPlate = GetArmorPlateInContainer((EntityUid)component.PlateCarrier, plateCarrierComponent); + + if(!TryComp(armorPlate, out var armorPlateComponent)) + return; + + armorPlateComponent.ReceivedDamage += (intDamage / 2); + + var newDamageSpecifier = new DamageSpecifier(); + + foreach (var damage in args.OriginalDamage.DamageDict) + { + newDamageSpecifier.DamageDict.Add(damage.Key, (damage.Value - ApplyDamage(armorPlateComponent))); + } + + args.Damage = newDamageSpecifier; + } + + private void SetPlateCarrierClosed(EntityUid platecarrier, PlateCarrierComponent plateCarrierComponent) { _audioSystem.PlayPvs((plateCarrierComponent.PlateIsClosed ? plateCarrierComponent.OpenSound : plateCarrierComponent.CloseSound), platecarrier.ToCoordinates()); plateCarrierComponent.PlateIsClosed = !plateCarrierComponent.PlateIsClosed; @@ -80,8 +162,7 @@ private void GetArmorPlate(EntityUid uid, EntityUid platecarrier, PlateCarrierCo NeedHand = true }; - if(!_doAfterSystem.TryStartDoAfter(doAfterEventArgs)) - return; + _doAfterSystem.TryStartDoAfter(doAfterEventArgs); } private void OnGetPlateDoAfter(EntityUid uid, PlateCarrierComponent component, GetPlateDoAfterEvent args) @@ -111,4 +192,34 @@ private void OnGetPlateDoAfter(EntityUid uid, PlateCarrierComponent component, G args.Handled = true; } + + private EntityUid? GetArmorPlateInContainer(EntityUid platecarrier, PlateCarrierComponent component) + { + if(!component.HasPlate) + return null; + + var container = + _containerSystem.EnsureContainer(platecarrier, PlateCarrierComponent.ArmorPlateContainer); + + return container.ContainedEntities[0]; + } + + private FixedPoint2 ApplyDamage(ArmorPlateComponent armorPlateComponent) + { + if (armorPlateComponent.ReceivedDamage >= armorPlateComponent.AllowedDamage) + return 0; + + if (armorPlateComponent.ReceivedDamage >= (armorPlateComponent.AllowedDamage / 2)) + return (armorPlateComponent.DamageOfTier[armorPlateComponent.PlateTier] / 2); + + return armorPlateComponent.DamageOfTier[armorPlateComponent.PlateTier]; + } + + private void UnequipHelper(EntityUid user) + { + if(!HasComp(user)) + return; + + RemComp(user); + } } diff --git a/Resources/Locale/ru-RU/_white/bodyarmor/armorplates/armorplate.ftl b/Resources/Locale/ru-RU/_white/bodyarmor/armorplates/armorplate.ftl new file mode 100644 index 00000000000..4e4a9d6bda1 --- /dev/null +++ b/Resources/Locale/ru-RU/_white/bodyarmor/armorplates/armorplate.ftl @@ -0,0 +1,2 @@ +armorplate-damage = Визуальный осмотр: { $hasdamage } +armorplate-tier = Уровень защиты: { $tier } \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_white/bodyarmor/platecarrier/platecarrier.ftl b/Resources/Locale/ru-RU/_white/bodyarmor/platecarrier/platecarrier.ftl index 098672c1de8..4eed92831d3 100644 --- a/Resources/Locale/ru-RU/_white/bodyarmor/platecarrier/platecarrier.ftl +++ b/Resources/Locale/ru-RU/_white/bodyarmor/platecarrier/platecarrier.ftl @@ -1,2 +1,4 @@ platecarrierclosed = { CAPITALIZE($closed) } плитник -getplate = Достать бронеплиту \ No newline at end of file +getplate = Достать бронеплиту +armorplate-place = Бронеплита: [color=red]{ $hasplate }[/color] +platecarrier-damage = Визуальный осмотр: { $hasdamage } \ No newline at end of file From 4edc7a649c334b8386e8e5d9735f53ec748b4834 Mon Sep 17 00:00:00 2001 From: NR <66198468+withoutcode333@users.noreply.github.com> Date: Fri, 11 Apr 2025 15:37:33 +0500 Subject: [PATCH 3/4] break prikol --- .../PlateCarrier/PlateCarrierComponent.cs | 13 +++++++ .../PlateCarrier/PlateCarrierSystem.cs | 34 ++++++++++++++++-- .../White/BodyArmor/PlateCarrier/break.ogg | Bin 0 -> 9556 bytes .../bodyarmor/platecarrier/platecarrier.ftl | 4 ++- 4 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 Resources/Audio/White/BodyArmor/PlateCarrier/break.ogg diff --git a/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierComponent.cs b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierComponent.cs index ce8aa2ef417..0e41186de02 100644 --- a/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierComponent.cs +++ b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierComponent.cs @@ -13,6 +13,19 @@ public sealed partial class PlateCarrierComponent : Component [DataField] public bool HasPlate = false; + [DataField] + public string PlateCarrierSlot = "outerClothing"; + + [DataField] + public bool IsBreak = false; + + [DataField] + public float ChanceOfBreak = 0.05F; + + [DataField] + [ViewVariables(VVAccess.ReadWrite)] + public SoundSpecifier BreakSound = new SoundPathSpecifier("/Audio/White/BodyArmor/PlateCarrier/break.ogg"); + [DataField] public int PlateCarrierDamage = 0; diff --git a/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs index f4204c741a3..07f65ddd091 100644 --- a/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs +++ b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs @@ -9,12 +9,14 @@ using Content.Shared.Examine; using Content.Shared.FixedPoint; using Content.Shared.Hands.Components; +using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Content.Shared.Verbs; using Content.Shared.Weapons.Ranged.Components; using Robust.Server.Audio; using Robust.Server.Containers; using Robust.Shared.Containers; +using Robust.Shared.Random; namespace Content.Server._White.BodyArmor.PlateCarrier; @@ -24,6 +26,8 @@ public sealed class PlateCarrierSystem : EntitySystem [Dependency] private readonly ContainerSystem _containerSystem = default!; [Dependency] private readonly HandsSystem _handsSystem = default!; [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; + [Dependency] private readonly InventorySystem _inventorySystem = default!; public override void Initialize() { base.Initialize(); @@ -34,17 +38,20 @@ public override void Initialize() SubscribeLocalEvent(OnEquipped); SubscribeLocalEvent(OnUnequipped); SubscribeLocalEvent(OnUserGetDamage); + SubscribeLocalEvent(BeforeEquipPlateCarrier); } private void OnExamined(EntityUid uid, PlateCarrierComponent component, ExaminedEvent args) { var hasPlate = component.HasPlate ? "установлена." : "не установлена."; var hasDamage = component.PlateCarrierDamage > 0 ? "имеются визуальные повреждения." : "визуальные повреждения отсутствуют."; + var isBreak = component.IsBreak; using (args.PushGroup(nameof(PlateCarrierComponent))) { args.PushMarkup(Loc.GetString("armorplate-place", ("hasplate", hasPlate))); args.PushMarkup(Loc.GetString("platecarrier-damage", ("hasdamage", hasDamage))); + args.PushMarkup(isBreak ? Loc.GetString("platecarrier-break") : Loc.GetString("platecarrier-nobreak")); } } @@ -83,6 +90,14 @@ private void OnAltVerb(GetVerbsEvent args) args.Verbs.Add(verb); } + private void BeforeEquipPlateCarrier(EntityUid uid, PlateCarrierComponent component, BeingEquippedAttemptEvent args) + { + if (component.IsBreak) + { + args.Cancel(); + } + } + private void OnEquipped(EntityUid uid, PlateCarrierComponent component, GotEquippedEvent args) { if(HasComp(args.Equipee)) @@ -136,7 +151,7 @@ private void OnUserGetDamage(EntityUid uid, PlateCarrierOnUserComponent componen foreach (var damage in args.OriginalDamage.DamageDict) { - newDamageSpecifier.DamageDict.Add(damage.Key, (damage.Value - ApplyDamage(armorPlateComponent))); + newDamageSpecifier.DamageDict.Add(damage.Key, (damage.Value - ApplyDamage(uid, armorPlateComponent, plateCarrierComponent))); } args.Damage = newDamageSpecifier; @@ -204,10 +219,13 @@ private void OnGetPlateDoAfter(EntityUid uid, PlateCarrierComponent component, G return container.ContainedEntities[0]; } - private FixedPoint2 ApplyDamage(ArmorPlateComponent armorPlateComponent) + private FixedPoint2 ApplyDamage(EntityUid target, ArmorPlateComponent armorPlateComponent, PlateCarrierComponent plateCarrierComponent) { if (armorPlateComponent.ReceivedDamage >= armorPlateComponent.AllowedDamage) + { + ChanceOfBreak(target, plateCarrierComponent); return 0; + } if (armorPlateComponent.ReceivedDamage >= (armorPlateComponent.AllowedDamage / 2)) return (armorPlateComponent.DamageOfTier[armorPlateComponent.PlateTier] / 2); @@ -215,6 +233,18 @@ private FixedPoint2 ApplyDamage(ArmorPlateComponent armorPlateComponent) return armorPlateComponent.DamageOfTier[armorPlateComponent.PlateTier]; } + private void ChanceOfBreak(EntityUid target, PlateCarrierComponent plateCarrierComponent) + { + var isBreak = _robustRandom.Prob(plateCarrierComponent.ChanceOfBreak); + + if(!isBreak) + return; + + _audioSystem.PlayPvs(plateCarrierComponent.BreakSound, target); + _inventorySystem.TryUnequip(target, plateCarrierComponent.PlateCarrierSlot, true, true, true); + plateCarrierComponent.IsBreak = true; + } + private void UnequipHelper(EntityUid user) { if(!HasComp(user)) diff --git a/Resources/Audio/White/BodyArmor/PlateCarrier/break.ogg b/Resources/Audio/White/BodyArmor/PlateCarrier/break.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4e8d1aa6cf20f0215e5245b2be3d3a87a448d098 GIT binary patch literal 9556 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 n{w>shmx~Yhgk3X#2V literal 0 HcmV?d00001 diff --git a/Resources/Locale/ru-RU/_white/bodyarmor/platecarrier/platecarrier.ftl b/Resources/Locale/ru-RU/_white/bodyarmor/platecarrier/platecarrier.ftl index 4eed92831d3..96bd6c351f6 100644 --- a/Resources/Locale/ru-RU/_white/bodyarmor/platecarrier/platecarrier.ftl +++ b/Resources/Locale/ru-RU/_white/bodyarmor/platecarrier/platecarrier.ftl @@ -1,4 +1,6 @@ platecarrierclosed = { CAPITALIZE($closed) } плитник getplate = Достать бронеплиту armorplate-place = Бронеплита: [color=red]{ $hasplate }[/color] -platecarrier-damage = Визуальный осмотр: { $hasdamage } \ No newline at end of file +platecarrier-damage = Визуальный осмотр: { $hasdamage } +platecarrier-break = Состояние: [color=red]разорвана держащая лямка.[/color] +platecarrier-nobreak = Состояние: [color=green]держащие лямки и панели без повреждений.[/color] \ No newline at end of file From c740f252609d716f2b4c0cfd56cb6eb81f7aa26b Mon Sep 17 00:00:00 2001 From: NR <66198468+withoutcode333@users.noreply.github.com> Date: Fri, 11 Apr 2025 15:53:30 +0500 Subject: [PATCH 4/4] oops --- .../_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs index 07f65ddd091..bdaf771ea12 100644 --- a/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs +++ b/Content.Server/_White/BodyArmor/PlateCarrier/PlateCarrierSystem.cs @@ -223,7 +223,9 @@ private FixedPoint2 ApplyDamage(EntityUid target, ArmorPlateComponent armorPlate { if (armorPlateComponent.ReceivedDamage >= armorPlateComponent.AllowedDamage) { - ChanceOfBreak(target, plateCarrierComponent); + if(!plateCarrierComponent.IsBreak) + ChanceOfBreak(target, plateCarrierComponent); + return 0; }