From 0cc831cb186c8afb2706600b9de704e29ed1ec59 Mon Sep 17 00:00:00 2001 From: Aviu00 <93730715+Aviu00@users.noreply.github.com> Date: Thu, 21 Sep 2023 23:04:05 +0900 Subject: [PATCH] Add snatcherprod (#422) --- .../ConstructionSystem.Interactions.cs | 4 + .../Snatcherprod/SnatcherprodComponent.cs | 9 + .../White/Snatcherprod/SnatcherprodSystem.cs | 178 ++++++++++++++++++ .../Damage/Events/StaminaMeleeHitEvent.cs | 5 +- .../Damage/Systems/StaminaSystem.cs | 2 +- .../prototypes/entities/snatcherprod.ftl | 2 + .../Entities/Objects/Materials/parts.yml | 4 + .../Entities/Objects/Misc/machine_parts.yml | 2 +- .../Entities/Objects/Weapons/snatcherprod.yml | 77 ++++++++ .../White/Recipes/hidden_crafts.yml | 27 +++ .../White/Objects/Weapons/prod.rsi/meta.json | 14 ++ .../Weapons/prod.rsi/prod_unfinished.png | Bin 0 -> 722 bytes .../Weapons/snatcherprod.rsi/inhand-left.png | Bin 0 -> 675 bytes .../Weapons/snatcherprod.rsi/inhand-right.png | Bin 0 -> 692 bytes .../Weapons/snatcherprod.rsi/meta.json | 34 ++++ .../snatcherprod.rsi/snatcherprod_nocell.png | Bin 0 -> 732 bytes .../snatcherprod.rsi/snatcherprod_off.png | Bin 0 -> 747 bytes .../snatcherprod.rsi/snatcherprod_on.png | Bin 0 -> 770 bytes 18 files changed, 355 insertions(+), 3 deletions(-) create mode 100644 Content.Server/White/Snatcherprod/SnatcherprodComponent.cs create mode 100644 Content.Server/White/Snatcherprod/SnatcherprodSystem.cs create mode 100644 Resources/Locale/ru-RU/white/prototypes/entities/snatcherprod.ftl create mode 100644 Resources/Prototypes/White/Entities/Objects/Weapons/snatcherprod.yml create mode 100644 Resources/Textures/White/Objects/Weapons/prod.rsi/meta.json create mode 100644 Resources/Textures/White/Objects/Weapons/prod.rsi/prod_unfinished.png create mode 100644 Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/inhand-left.png create mode 100644 Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/inhand-right.png create mode 100644 Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/meta.json create mode 100644 Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/snatcherprod_nocell.png create mode 100644 Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/snatcherprod_off.png create mode 100644 Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/snatcherprod_on.png diff --git a/Content.Server/Construction/ConstructionSystem.Interactions.cs b/Content.Server/Construction/ConstructionSystem.Interactions.cs index 6112dd13ad..a5e9b4cc8c 100644 --- a/Content.Server/Construction/ConstructionSystem.Interactions.cs +++ b/Content.Server/Construction/ConstructionSystem.Interactions.cs @@ -11,6 +11,7 @@ using Content.Shared.DoAfter; using Content.Shared.Interaction; using Content.Shared.Prying.Systems; using Content.Shared.Radio.EntitySystems; +using Content.Shared.Stacks; using Content.Shared.Tools.Components; using Content.Shared.Tools.Systems; using Robust.Shared.Containers; @@ -92,6 +93,9 @@ namespace Content.Server.Construction if (!Resolve(uid, ref construction)) return HandleResult.False; + if (TryComp(uid, out StackComponent? stack) && stack.Count > 1) // WD + return HandleResult.False; + // Let's make extra sure this is zero... construction.StepIndex = 0; diff --git a/Content.Server/White/Snatcherprod/SnatcherprodComponent.cs b/Content.Server/White/Snatcherprod/SnatcherprodComponent.cs new file mode 100644 index 0000000000..4364baa327 --- /dev/null +++ b/Content.Server/White/Snatcherprod/SnatcherprodComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Server.White.Snatcherprod; + +[RegisterComponent, Access(typeof(SnatcherprodSystem))] +public sealed partial class SnatcherprodComponent : Component +{ + [ViewVariables(VVAccess.ReadWrite)] + [DataField("energyPerUse")] + public float EnergyPerUse { get; set; } = 36; +} diff --git a/Content.Server/White/Snatcherprod/SnatcherprodSystem.cs b/Content.Server/White/Snatcherprod/SnatcherprodSystem.cs new file mode 100644 index 0000000000..49e1986715 --- /dev/null +++ b/Content.Server/White/Snatcherprod/SnatcherprodSystem.cs @@ -0,0 +1,178 @@ +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Content.Server.Popups; +using Content.Server.Power.Components; +using Content.Server.Power.EntitySystems; +using Content.Shared.Damage.Events; +using Content.Shared.Examine; +using Content.Shared.Hands.Components; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Item.ItemToggle; +using Content.Shared.Item.ItemToggle.Components; +using Content.Shared.Toggleable; +using Robust.Shared.Containers; + +namespace Content.Server.White.Snatcherprod; + +public sealed class SnatcherprodSystem : EntitySystem +{ + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedContainerSystem _containers = default!; + [Dependency] private readonly BatterySystem _battery = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly SharedItemToggleSystem _itemToggle = default!; + + private const string CellSlot = "cell_slot"; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnStaminaHitAttempt); + SubscribeLocalEvent(OnHit); + SubscribeLocalEvent(OnEntRemoved); + SubscribeLocalEvent(OnEntInserted); + SubscribeLocalEvent(TryTurnOn); + SubscribeLocalEvent(ToggleDone); + } + + private void OnEntInserted(EntityUid uid, SnatcherprodComponent component, EntInsertedIntoContainerMessage args) + { + _itemToggle.TryDeactivate(uid, predicted: false); + + if (TryComp(uid, out var appearance)) + { + _appearance.SetData(uid, ToggleVisuals.Toggled, false, appearance); + } + } + + private void OnEntRemoved(EntityUid uid, SnatcherprodComponent component, EntRemovedFromContainerMessage args) + { + if (TerminatingOrDeleted(uid)) + return; + + if (!_itemToggle.IsActivated(uid)) + { + if (TryComp(uid, out var appearance)) + { + _appearance.SetData(uid, ToggleVisuals.Toggled, "nocell", appearance); + } + } + else + _itemToggle.TryDeactivate(uid, predicted: false); + } + + private void OnHit(EntityUid uid, SnatcherprodComponent component, StaminaMeleeHitEvent args) + { + if (!_itemToggle.IsActivated(uid) || args.HitList.Count == 0) + return; + + var entity = args.HitList.First().Entity; + + if (!TryComp(entity, out HandsComponent? hands)) + return; + + EntityUid? heldEntity = null; + + if (hands.ActiveHandEntity != null) + heldEntity = hands.ActiveHandEntity; + else + { + foreach (var hand in hands.Hands) + { + if (hand.Value.HeldEntity == null) + continue; + + heldEntity = hand.Value.HeldEntity; + break; + } + + if (heldEntity == null) + return; + } + + if (!_hands.TryDrop(entity, heldEntity.Value, null, false, false, handsComp: hands)) + return; + + _hands.PickupOrDrop(args.User, heldEntity.Value, false); + } + + private void OnStaminaHitAttempt(EntityUid uid, SnatcherprodComponent component, ref StaminaDamageOnHitAttemptEvent args) + { + if (!_itemToggle.IsActivated(uid) || !TryGetBatteryComponent(uid, out var battery, out var batteryUid) || + !_battery.TryUseCharge(batteryUid.Value, component.EnergyPerUse, battery)) + { + args.Cancelled = true; + return; + } + + if (battery.CurrentCharge < component.EnergyPerUse) + { + _itemToggle.TryDeactivate(uid, predicted: false); + } + } + + private void OnExamined(EntityUid uid, SnatcherprodComponent comp, ExaminedEvent args) + { + var msg = _itemToggle.IsActivated(uid) + ? Loc.GetString("comp-snatcherprod-examined-on") + : Loc.GetString("comp-snatcherprod-examined-off"); + args.PushMarkup(msg); + } + + private void ToggleDone(Entity entity, ref ItemToggledEvent args) + { + if (TryGetBatteryComponent(entity, out _, out _) || !TryComp(entity, out var appearance)) + return; + + _appearance.SetData(entity, ToggleVisuals.Toggled, "nocell", appearance); + } + + private void TryTurnOn(Entity entity, ref ItemToggleActivateAttemptEvent args) + { + if (TryGetBatteryComponent(entity, out var battery, out _) && + battery.CurrentCharge >= entity.Comp.EnergyPerUse) + return; + + args.Cancelled = true; + + if (TryComp(entity, out var appearance)) + { + _appearance.SetData(entity, ToggleVisuals.Toggled, battery == null ? "nocell" : false, appearance); + } + + if (args.User != null) + { + _popup.PopupEntity(Loc.GetString("stunbaton-component-low-charge"), (EntityUid) args.User, + (EntityUid) args.User); + } + } + + private bool TryGetBatteryComponent(EntityUid uid, [NotNullWhen(true)] out BatteryComponent? battery, + [NotNullWhen(true)] out EntityUid? batteryUid) + { + if (TryComp(uid, out battery)) + { + batteryUid = uid; + return true; + } + + if (!_containers.TryGetContainer(uid, CellSlot, out var container) || + container is not ContainerSlot slot) + { + battery = null; + batteryUid = null; + return false; + } + + batteryUid = slot.ContainedEntity; + + if (batteryUid != null) + return TryComp(batteryUid, out battery); + + battery = null; + return false; + } +} diff --git a/Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs b/Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs index c5ed0ddb60..719d73de35 100644 --- a/Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs +++ b/Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs @@ -24,8 +24,11 @@ public sealed class StaminaMeleeHitEvent : HandledEntityEventArgs /// public float FlatModifier = 0; - public StaminaMeleeHitEvent(List<(EntityUid Entity, StaminaComponent Component)> hitList) + public EntityUid User; // WD + + public StaminaMeleeHitEvent(List<(EntityUid Entity, StaminaComponent Component)> hitList, EntityUid user) // WD EDIT { HitList = hitList; + User = user; // WD } } diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index 33f1b0375b..91bc46ea94 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -169,7 +169,7 @@ public sealed partial class StaminaSystem : EntitySystem toHit.Add((ent, stam)); } - var hitEvent = new StaminaMeleeHitEvent(toHit); + var hitEvent = new StaminaMeleeHitEvent(toHit, args.User); // WD EDIT RaiseLocalEvent(uid, hitEvent); if (hitEvent.Handled) diff --git a/Resources/Locale/ru-RU/white/prototypes/entities/snatcherprod.ftl b/Resources/Locale/ru-RU/white/prototypes/entities/snatcherprod.ftl new file mode 100644 index 0000000000..fb5c89cac5 --- /dev/null +++ b/Resources/Locale/ru-RU/white/prototypes/entities/snatcherprod.ftl @@ -0,0 +1,2 @@ +comp-snatcherprod-examined-on = Хваталка [color=darkgreen]включена[/color]. +comp-snatcherprod-examined-off = Хваталка [color=darkred]выключена[/color]. diff --git a/Resources/Prototypes/Entities/Objects/Materials/parts.yml b/Resources/Prototypes/Entities/Objects/Materials/parts.yml index 4db618761e..3f34735eed 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/parts.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/parts.yml @@ -127,6 +127,10 @@ - ItemMask restitution: 0.3 friction: 0.2 + - type: Construction + deconstructionTarget: null + graph: SnatcherprodGraph + node: rod - type: entity parent: PartRodMetal diff --git a/Resources/Prototypes/Entities/Objects/Misc/machine_parts.yml b/Resources/Prototypes/Entities/Objects/Misc/machine_parts.yml index c38239a08d..252e81e8cc 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/machine_parts.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/machine_parts.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: BaseStockPart name: stock part parent: BaseItem diff --git a/Resources/Prototypes/White/Entities/Objects/Weapons/snatcherprod.yml b/Resources/Prototypes/White/Entities/Objects/Weapons/snatcherprod.yml new file mode 100644 index 0000000000..a02f746eda --- /dev/null +++ b/Resources/Prototypes/White/Entities/Objects/Weapons/snatcherprod.yml @@ -0,0 +1,77 @@ +- type: entity + name: хваталка + parent: BaseItem + id: Snatcherprod + description: Искрится жаждой воровства и коварства. + components: + - type: Sprite + sprite: White/Objects/Weapons/snatcherprod.rsi + layers: + - state: snatcherprod_nocell + map: [ "enum.ToggleVisuals.Layer" ] + - type: ItemToggle + soundActivate: + collection: sparks + params: + variation: 0.250 + soundDeactivate: + collection: sparks + params: + variation: 0.250 + soundFailToActivate: + path: /Audio/Machines/button.ogg + params: + variation: 0.250 + - type: ItemToggleMeleeWeapon + activatedDamage: + types: + Blunt: 0 + - type: MeleeWeapon + damage: + types: + Blunt: 9 + angle: 0 + animation: WeaponArcThrust + - type: StaminaDamageOnHit + damage: 40 + sound: /Audio/Weapons/egloves.ogg + - type: StaminaDamageOnCollide + damage: 20 + - type: UseDelay + - type: Item + size: Normal + - type: Appearance + - type: GenericVisualizer + visuals: + enum.ToggleVisuals.Toggled: + enum.ToggleVisuals.Layer: + nocell: {state: snatcherprod_nocell} + True: {state: snatcherprod_on} + False: {state: snatcherprod_off} + - type: PowerCellSlot + cellSlotId: cell_slot + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + - type: Snatcherprod + - type: Construction + deconstructionTarget: null + graph: SnatcherprodGraph + node: snatcherprod + +- type: entity + name: палка + parent: BaseItem + id: ProdUnfinished + description: Стержень с проводами. + components: + - type: Sprite + sprite: White/Objects/Weapons/prod.rsi + state: prod_unfinished + - type: Item + size: 30 + - type: Construction + deconstructionTarget: null + graph: SnatcherprodGraph + node: unfinished diff --git a/Resources/Prototypes/White/Recipes/hidden_crafts.yml b/Resources/Prototypes/White/Recipes/hidden_crafts.yml index c3afbfe4fb..2399b9da40 100644 --- a/Resources/Prototypes/White/Recipes/hidden_crafts.yml +++ b/Resources/Prototypes/White/Recipes/hidden_crafts.yml @@ -95,3 +95,30 @@ doAfter: 1 - node: crossbow entity: WeaponPoweredCrossbow + +- type: constructionGraph + id: SnatcherprodGraph + start: rod + graph: + - node: rod + entity: PartRodMetal1 + edges: + - to: unfinished + steps: + - material: Cable + amount: 15 + doAfter: 1 + - node: unfinished + entity: ProdUnfinished + edges: + - to: capacitor + steps: + - tag: CapacitorStockPart + - node: capacitor + edges: + - to: snatcherprod + steps: + - material: Telecrystal + traitorOnly: true + - node: snatcherprod + entity: Snatcherprod diff --git a/Resources/Textures/White/Objects/Weapons/prod.rsi/meta.json b/Resources/Textures/White/Objects/Weapons/prod.rsi/meta.json new file mode 100644 index 0000000000..d9a85e7f34 --- /dev/null +++ b/Resources/Textures/White/Objects/Weapons/prod.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at https://github.com/tgstation/ at d0dffe7ca643db2624424fdcebf45863f85c0448", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "prod_unfinished" + } + ] +} diff --git a/Resources/Textures/White/Objects/Weapons/prod.rsi/prod_unfinished.png b/Resources/Textures/White/Objects/Weapons/prod.rsi/prod_unfinished.png new file mode 100644 index 0000000000000000000000000000000000000000..288cf4c0cc6988ef6c98d2f2431bcf24974cfbae GIT binary patch literal 722 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D%zmjw8Pxc>kD zA1Lnb?k*=MXK88aC*G(&sVHiQCC-&k(TD- z;-aCU0kq4_&5hvj$1o_2~WSuELKR^RdE^@*D&+JeGjUfi5xVP*H~-db5%`JGDQlhq|3i;Ct% zMHQ(?&73*2wzjsgurMkzvbeZ-*REZA_UtJyFF(A!JT)c7%gYPsDbv`?t5>g{J0+>4 zFd;NF)YsQn?P+6hRJgghd24HHKtO=olxzzNi-l6AhK7bAAt4fzlP;}1>-H7Hzb5d^fcD5S-o)4+Ddbv$Lj>Qh}`OMs2Hf zVc~WWwK7|CTj}@Cz<}#13GxdD#?_a<<$E(8th1UA45$GG-jTEJ0Nv%{>Eak-(VLtg zvBp7U|CSaF57s)@AfBL0Mirqa1SYV*oPJ1o{gO3@8vGeO;zC5W8z20|In!Rt-?&ng i=@X9@%ae9%28Jd7I1)}c1l$Fh$KdJe=d#Wzp$PzcOKC&^ literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/inhand-left.png b/Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d553fc69649a7b38245208bab162f03b4cb544 GIT binary patch literal 675 zcmeAS@N?(olHy`uVBq!ia0vp^4M42G!3-qd{%H^gQjEnx?oJHr&dIz4vK<3_LR^7@ zx0_7%FtH!lIH* zEgbJ{vt6pMsiLg8z0$BlMb}N=f-SFKvLfB*i86DQi(*aQUyWoBk- zXlPhlTmPSFY&`S7UHNJ;&VjEtN)bEb>4 zv#F_RNJxlQl+Qci`2O^RND&VJPJ(4+@Ksm6bo}w|v>!EsG`l%j!EU ztnAJguRU|=`uUk_|NsBb%gg(riy^FI4feu-az@5J>75vgSg3JO8- z`F76XmoDCE@9cl-;*wF;I$c^iZ0UrXK<{Oj1o;Is08OD2aQ~kx543isr;B4qMC;p2 z2YDM5cv=(95*frc7&g54XZ_OgD3@C81PQ*s`EvWxg-zWqoA~}-*~y{m5-gqauWr^w zMJo^CC;v|UZjck$lizg5Ua#YtPS9QnY5)F%m!9WD#ZLM8;#x{{!d3hBCERzIH@y0M zK~46?j_HSYwYPKe$9?!(_c7q*MsBK)vH&}%(Rr(_kRBA^R>OLM^_Z_3(4I(JImC< zF)S*1slMjDZMG`PnjI>-+ba!U-EOuQ*3{P4j*E-)@bLJ**Td6HJ2^R7Q&ZE|*Vn

2>i>TR1~)gi$jHc< zGiSOuJDZxChJ=J@Rj&1!btZc4le`13%-eQPIsfYa8HQ4x@}RI7Sy}mme#@7w-LhD+ zzpTE)!piP^@!B(&uAiT|78n$~yu2T}81n0SX0F=SFmbM)p5E5um-q$vPF#Nw6rZo4 zpb(K-X6GD!>EfOC&im6^wwM%q3uXWsL^r^=ETjc!@gh$b z$B>BDx0h?Vnhki`AKp`8|G*?@sQv2i`7KI(I%-SyUovE?{QsuiKfp(`Ymvq;uQSD; zZ_cdTad^)ixmO%dbKbLTExsS&I*WDU*6M~+KficQSzYQca55xsq3xX2HgBaHnR0(m zaf~lqx24oy7%dp8_C0rV|1n+W^^EuRTkeUsf#q9t(6WgQu&X%Q~loCICGBYQF#g literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/meta.json b/Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/meta.json new file mode 100644 index 0000000000..ae24ae8e94 --- /dev/null +++ b/Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/meta.json @@ -0,0 +1,34 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at https://github.com/tgstation/ at d0dffe7ca643db2624424fdcebf45863f85c0448", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "snatcherprod_off" + }, + { + "name": "snatcherprod_nocell" + }, + { + "name": "snatcherprod_on", + "delays": [ + [ + 0.1, + 0.1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/snatcherprod_nocell.png b/Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/snatcherprod_nocell.png new file mode 100644 index 0000000000000000000000000000000000000000..5d75de014ebec22b9793db3402f7c6b9dc40010a GIT binary patch literal 732 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D%zmjw8Pxc>kD zA1Lnb?k*=MXK88aC*G(&sVHiQCC-&k(TD- z;-aCU0kq4_&5hvj$1o_2~WSuELKR^RdE^@*D&+JeGjUfi5xVP*H~-db5%`JGDQlhq|3i;Ct% zMHQ(?&73*2wzjsgurMkzvbeZ-*REZA_UtJyFF(A!JT)c7%gYPsDbv`?t5>g{J0+>4 zFd;NF)YsQn?P+6hRJgghd24HHKtO=olxzzNi-l6AhK7bAAt4fzlP;}1>-H7Hzb5d^fcD5S-o)4+Ddbv$Lj>Qh}`OMs2Hf zVc~WWwK7|CTj}@Cz<}#13GxdD#?_a<<$E(8th1UA45$GG-jTEJ0Nv&1>Eak-(VLvG zK=r}n$A|UxRdkx-<2+>MGkMw-+I%uHx@4rJRPm(IBg#!^K6AsTA4?=friOkvr7bu? teaZZw&+bn@o?b05Aw57*!Tt^-!)g^yooO$s&j3wk@O1TaS?83{1OQ4>a1{Um literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/snatcherprod_off.png b/Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/snatcherprod_off.png new file mode 100644 index 0000000000000000000000000000000000000000..96d16402ef1a8880ce02b1a791796999fd9823d3 GIT binary patch literal 747 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D%zmjw8Pxc>kD zA1Lnb?k*=MXK88aC*G(&sVHiQCC-&k(TD- z;-aCU0kq4_&5hvj$1o_2~WSuELKR^RdE^@*D&+JeGjUfi5xVP*H~-db5%`JGDQlhq|3i;Ct% zMHQ(?&73*2wzjsgurMkzvbeZ-*REZA_UtJyFF(A!JT)c7%gYPsDbv`?t5>g{J0+>4 zFd;NF)YsQn?P+6hRJgghd24HHKtO=olxzzNi-l6AhK7bAAt4fzlP;}1>-H7Hzb5d^fcD5S-o)4+Ddbv$Lj>Qh}`OMs2Hf zVc~WWwK7|CTj}@Cz<}#13GxdD#?_a<<$E(8th1UA45$GG-jTEJ0NoYq>Eak-(fjtS zBVU672a7}8frXPyd@lwa{rA7~8ao5~N)ytT&vrnbnLKI3q;O*MBb z!nDM*?=88X7nfhuSGVHlKHfsv1?+axjqmr{7xBuNd|3aSY2ImWyYAPs`hXTOc)I$z JtaD0e0svB#dl3Kt literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/snatcherprod_on.png b/Resources/Textures/White/Objects/Weapons/snatcherprod.rsi/snatcherprod_on.png new file mode 100644 index 0000000000000000000000000000000000000000..fe711cbfc6f4301a0cd0828c3b82496e43966d5f GIT binary patch literal 770 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QjEnx?oJHr&dIz4vX=z-gt-3y z{~svs?(QxpCueDC>Ez@DWN2$^cZ=%&XE3(6w+Bl7zt3Qt_W!@FvGL6RGtd0D%m4o` zI{yFCwg2rxKg-Jpul)a^Wzzdy-uilaKs(YH7=R{9N&UZc>C*G(&sVHiQCC-&k(TD- z;-aCU0kq4_&5hvj$1o_2~WSuELKR^RdE^@*D&+JeGjUfi5xVP*H~-db5%`JGDQlhq|3i;Ct% zMHQ(?&73*2wzjsgurMkzvbeZ-*REZA_UtJyFF(A!JT)c7%gYPsDbv`?t5>g{J0+>4 zFd;NF)YsQn?P+6hRJgghd24HHKtO=olxzzNi-l6AhK7bAAt4fzlP;}1>-H7Hzb5d^fcD5S-o)4+Ddbv$Lj>Qh}`OMs2Hf zVc~WWwK7|CTj}@Cz<}#13GxdD#?_a<<$E(8th1UA45$GG-jTEJ0NqvM>EamT(fRiL zL9PY`9<~Rz4sQaQI<&VQx%Z!U^9w8Xw+fB_zy3BiYv`M);(jE}@k^!Q*}sd