From 8acac895fc532a3a4f5d6dc2453c67cc56ec20de Mon Sep 17 00:00:00 2001 From: TaralGit <76408146+TaralGit@users.noreply.github.com> Date: Sat, 12 Aug 2023 22:58:07 -0700 Subject: [PATCH] (Re)Adds open bolt animations for gun sprites (#17219) Co-authored-by: and_a Co-authored-by: metalgearsloth --- .../Systems/GunSystem.ChamberMagazine.cs | 25 +- .../Weapons/Ranged/Systems/GunSystem.cs | 2 +- .../BallisticAmmoProviderComponent.cs | 18 +- .../ChamberMagazineAmmoProviderComponent.cs | 28 +- .../Weapons/Ranged/Events/TakeAmmoEvent.cs | 5 + .../Systems/SharedGunSystem.Ballistic.cs | 51 +-- .../SharedGunSystem.ChamberMagazine.cs | 331 +++++++++++++++--- .../Systems/SharedGunSystem.Clothing.cs | 2 +- .../Systems/SharedGunSystem.Container.cs | 9 +- .../Systems/SharedGunSystem.Magazine.cs | 22 +- .../Weapons/Ranged/Systems/SharedGunSystem.cs | 6 + Content.Shared/Wieldable/WieldableSystem.cs | 3 + Resources/Locale/en-US/weapons/ranged/gun.ftl | 9 + .../Entities/Debugging/debug_sweps.yml | 1 + .../Objects/Weapons/Guns/LMGs/lmgs.yml | 2 + .../Weapons/Guns/Launchers/launchers.yml | 1 - .../Objects/Weapons/Guns/Pistols/pistols.yml | 4 + .../Objects/Weapons/Guns/Rifles/rifles.yml | 4 + .../Objects/Weapons/Guns/SMGs/smgs.yml | 6 +- .../Weapons/Guns/Shotguns/shotguns.yml | 3 +- .../Objects/Weapons/Guns/Snipers/snipers.yml | 1 - .../Entities/Objects/Weapons/Guns/turrets.yml | 1 - .../Weapons/Guns/LMGs/l6.rsi/bolt-open.png | Bin 0 -> 313 bytes .../Weapons/Guns/LMGs/l6.rsi/meta.json | 83 ++--- .../Launchers/china_lake.rsi/bolt-open.png | Bin 0 -> 331 bytes .../Guns/Launchers/china_lake.rsi/meta.json | 3 + .../Guns/Pistols/mk58.rsi/bolt-open.png | Bin 0 -> 355 bytes .../Weapons/Guns/Pistols/mk58.rsi/meta.json | 3 + .../Guns/Pistols/viper.rsi/bolt-open.png | Bin 0 -> 503 bytes .../Weapons/Guns/Pistols/viper.rsi/meta.json | 11 +- .../Revolvers/inspector.rsi/bolt-open.png | Bin 0 -> 344 bytes .../Guns/Revolvers/inspector.rsi/meta.json | 3 + .../Guns/Revolvers/mateba.rsi/bolt-open.png | Bin 0 -> 345 bytes .../Guns/Revolvers/mateba.rsi/meta.json | 3 + .../pirate_revolver.rsi/bolt-open.png | Bin 0 -> 351 bytes .../Revolvers/pirate_revolver.rsi/meta.json | 37 +- .../Guns/Revolvers/python.rsi/bolt-open.png | Bin 0 -> 334 bytes .../Guns/Revolvers/python.rsi/meta.json | 3 + .../Weapons/Guns/Rifles/ak.rsi/bolt-open.png | Bin 0 -> 318 bytes .../Weapons/Guns/Rifles/ak.rsi/meta.json | 3 + .../Guns/Rifles/carbine.rsi/bolt-open.png | Bin 0 -> 356 bytes .../Weapons/Guns/Rifles/carbine.rsi/meta.json | 45 +-- .../Guns/Rifles/lecter.rsi/bolt-open.png | Bin 0 -> 459 bytes .../Weapons/Guns/Rifles/lecter.rsi/meta.json | 3 + .../Guns/SMGs/atreides.rsi/bolt-open.png | Bin 0 -> 274 bytes .../Weapons/Guns/SMGs/atreides.rsi/meta.json | 51 +-- .../Weapons/Guns/SMGs/c20r.rsi/bolt-open.png | Bin 0 -> 276 bytes .../Weapons/Guns/SMGs/c20r.rsi/meta.json | 81 ++--- .../Weapons/Guns/SMGs/drozd.rsi/bolt-open.png | Bin 0 -> 378 bytes .../Weapons/Guns/SMGs/drozd.rsi/meta.json | 3 + .../Guns/SMGs/vector.rsi/bolt-open.png | Bin 0 -> 346 bytes .../Weapons/Guns/SMGs/vector.rsi/meta.json | 45 +-- .../Shotguns/blunderbuss.rsi/bolt-open.png | Bin 0 -> 308 bytes .../Guns/Shotguns/blunderbuss.rsi/meta.json | 29 +- .../Guns/Shotguns/bulldog.rsi/bolt-open.png | Bin 0 -> 392 bytes .../Guns/Shotguns/bulldog.rsi/meta.json | 47 +-- .../Shotguns/db_shotgun.rsi/bolt-open.png | Bin 0 -> 286 bytes .../Guns/Shotguns/db_shotgun.rsi/meta.json | 3 + .../Guns/Shotguns/enforcer.rsi/bolt-open.png | Bin 0 -> 347 bytes .../Guns/Shotguns/enforcer.rsi/meta.json | 35 +- .../Guns/Shotguns/flaregun.rsi/bolt-open.png | Bin 0 -> 302 bytes .../Guns/Shotguns/flaregun.rsi/meta.json | 39 ++- .../Guns/Shotguns/hm_pistol.rsi/bolt-open.png | Bin 0 -> 309 bytes .../Guns/Shotguns/hm_pistol.rsi/meta.json | 3 + .../Guns/Shotguns/pump.rsi/bolt-open.png | Bin 0 -> 280 bytes .../Weapons/Guns/Shotguns/pump.rsi/meta.json | 3 + .../Guns/Shotguns/sawn.rsi/bolt-open.png | Bin 0 -> 250 bytes .../Weapons/Guns/Shotguns/sawn.rsi/meta.json | 3 + .../Snipers/bolt_gun_wood.rsi/bolt-open.png | Bin 0 -> 364 bytes .../Guns/Snipers/bolt_gun_wood.rsi/meta.json | 3 + .../Snipers/heavy_sniper.rsi/bolt-open.png | Bin 0 -> 294 bytes .../Guns/Snipers/heavy_sniper.rsi/meta.json | 3 + 72 files changed, 726 insertions(+), 353 deletions(-) create mode 100644 Resources/Textures/Objects/Weapons/Guns/LMGs/l6.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Pistols/mk58.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Pistols/viper.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Revolvers/inspector.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Revolvers/mateba.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Revolvers/python.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/atreides.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/vector.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/blunderbuss.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/flaregun.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/hm_pistol.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/pump.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Shotguns/sawn.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi/bolt-open.png diff --git a/Content.Client/Weapons/Ranged/Systems/GunSystem.ChamberMagazine.cs b/Content.Client/Weapons/Ranged/Systems/GunSystem.ChamberMagazine.cs index 13e64d5393..0f1595010f 100644 --- a/Content.Client/Weapons/Ranged/Systems/GunSystem.ChamberMagazine.cs +++ b/Content.Client/Weapons/Ranged/Systems/GunSystem.ChamberMagazine.cs @@ -1,7 +1,9 @@ -using Content.Shared.Examine; +using Content.Client.Weapons.Ranged.Components; using Content.Shared.Weapons.Ranged; using Content.Shared.Weapons.Ranged.Components; using Content.Shared.Weapons.Ranged.Events; +using Content.Shared.Weapons.Ranged.Systems; +using Robust.Client.GameObjects; using Robust.Shared.Containers; namespace Content.Client.Weapons.Ranged.Systems; @@ -13,6 +15,27 @@ public sealed partial class GunSystem base.InitializeChamberMagazine(); SubscribeLocalEvent(OnChamberMagazineCounter); SubscribeLocalEvent(OnChamberMagazineAmmoUpdate); + SubscribeLocalEvent(OnChamberMagazineAppearance); + } + + private void OnChamberMagazineAppearance(EntityUid uid, ChamberMagazineAmmoProviderComponent component, ref AppearanceChangeEvent args) + { + if (args.Sprite == null || + !args.Sprite.LayerMapTryGet(GunVisualLayers.Base, out var boltLayer) || + !Appearance.TryGetData(uid, AmmoVisuals.BoltClosed, out bool boltClosed)) + { + return; + } + + // Maybe re-using base layer for this will bite me someday but screw you future sloth. + if (boltClosed) + { + args.Sprite.LayerSetState(boltLayer, "base"); + } + else + { + args.Sprite.LayerSetState(boltLayer, "bolt-open"); + } } protected override void OnMagazineSlotChange(EntityUid uid, MagazineAmmoProviderComponent component, ContainerModifiedMessage args) diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs index 55fd7b5f8d..4a35e64c6c 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs @@ -174,7 +174,7 @@ public sealed partial class GunSystem : SharedGunSystem if (!cartridge.DeleteOnSpawn && !Containers.IsEntityInContainer(ent!.Value)) EjectCartridge(ent.Value, angle); - Dirty(cartridge); + Dirty(ent!.Value, cartridge); break; // Ammo shoots itself case AmmoComponent newAmmo: diff --git a/Content.Shared/Weapons/Ranged/Components/BallisticAmmoProviderComponent.cs b/Content.Shared/Weapons/Ranged/Components/BallisticAmmoProviderComponent.cs index 7b6a345f8b..679b0df782 100644 --- a/Content.Shared/Weapons/Ranged/Components/BallisticAmmoProviderComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/BallisticAmmoProviderComponent.cs @@ -39,21 +39,11 @@ public sealed partial class BallisticAmmoProviderComponent : Component public List Entities = new(); /// - /// Will the ammoprovider automatically cycle through rounds or does it need doing manually. - /// - [ViewVariables(VVAccess.ReadWrite), DataField("autoCycle")] - public bool AutoCycle = true; - - /// - /// Is the gun ready to shoot; if AutoCycle is true then this will always stay true and not need to be manually done. - /// - [ViewVariables(VVAccess.ReadWrite), DataField("cycled")] - [AutoNetworkedField] - public bool Cycled = true; - - /// - /// Is the magazine allowed to be cycled + /// Is the magazine allowed to be manually cycled to eject a cartridge. /// + /// + /// Set to false for entities like turrets to avoid users being able to cycle them. + /// [ViewVariables(VVAccess.ReadWrite), DataField("cycleable")] [AutoNetworkedField] public bool Cycleable = true; diff --git a/Content.Shared/Weapons/Ranged/Components/ChamberMagazineAmmoProviderComponent.cs b/Content.Shared/Weapons/Ranged/Components/ChamberMagazineAmmoProviderComponent.cs index 10fcb6ddd6..e64ec0d68d 100644 --- a/Content.Shared/Weapons/Ranged/Components/ChamberMagazineAmmoProviderComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/ChamberMagazineAmmoProviderComponent.cs @@ -1,7 +1,31 @@ +using Robust.Shared.Audio; + namespace Content.Shared.Weapons.Ranged.Components; /// /// Chamber + mags in one package. If you need just magazine then use /// -[RegisterComponent] -public sealed class ChamberMagazineAmmoProviderComponent : MagazineAmmoProviderComponent {} +[RegisterComponent, AutoGenerateComponentState] +public sealed partial class ChamberMagazineAmmoProviderComponent : MagazineAmmoProviderComponent +{ + /// + /// If the gun has a bolt and whether that bolt is closed. Firing is impossible + /// + [ViewVariables(VVAccess.ReadWrite), DataField("boltClosed"), AutoNetworkedField] + public bool? BoltClosed = false; + + /// + /// Does the gun automatically open and close the bolt upon shooting. + /// + [ViewVariables(VVAccess.ReadWrite), DataField("autoCycle"), AutoNetworkedField] + public bool AutoCycle = true; + + [ViewVariables(VVAccess.ReadWrite), DataField("soundBoltClosed"), AutoNetworkedField] + public SoundSpecifier? BoltClosedSound = new SoundPathSpecifier("/Audio/Weapons/Guns/Bolt/rifle_bolt_closed.ogg"); + + [ViewVariables(VVAccess.ReadWrite), DataField("soundBoltOpened"), AutoNetworkedField] + public SoundSpecifier? BoltOpenedSound = new SoundPathSpecifier("/Audio/Weapons/Guns/Bolt/rifle_bolt_open.ogg"); + + [ViewVariables(VVAccess.ReadWrite), DataField("soundRack"), AutoNetworkedField] + public SoundSpecifier? RackSound = new SoundPathSpecifier("/Audio/Weapons/Guns/Cock/ltrifle_cock.ogg"); +} diff --git a/Content.Shared/Weapons/Ranged/Events/TakeAmmoEvent.cs b/Content.Shared/Weapons/Ranged/Events/TakeAmmoEvent.cs index a28816d8e2..50cd7871d6 100644 --- a/Content.Shared/Weapons/Ranged/Events/TakeAmmoEvent.cs +++ b/Content.Shared/Weapons/Ranged/Events/TakeAmmoEvent.cs @@ -11,6 +11,11 @@ public sealed class TakeAmmoEvent : EntityEventArgs public readonly int Shots; public List<(EntityUid? Entity, IShootable Shootable)> Ammo; + /// + /// If no ammo returned what is the reason for it? + /// + public string? Reason; + /// /// Coordinates to spawn the ammo at. /// diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs index c232264b5c..b0f8ae15d6 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs @@ -132,12 +132,17 @@ public abstract partial class SharedGunSystem { if (!args.CanAccess || !args.CanInteract || args.Hands == null || !component.Cycleable) return; - args.Verbs.Add(new Verb() + + if (component.Cycleable) { - Text = Loc.GetString("gun-ballistic-cycle"), - Disabled = GetBallisticShots(component) == 0, - Act = () => ManualCycle(uid, component, Transform(uid).MapPosition, args.User), - }); + args.Verbs.Add(new Verb() + { + Text = Loc.GetString("gun-ballistic-cycle"), + Disabled = GetBallisticShots(component) == 0, + Act = () => ManualCycle(uid, component, Transform(uid).MapPosition, args.User), + }); + + } } private void OnBallisticExamine(EntityUid uid, BallisticAmmoProviderComponent component, ExaminedEvent args) @@ -165,8 +170,6 @@ public abstract partial class SharedGunSystem Audio.PlayPredicted(component.SoundRack, uid, user); var shots = GetBallisticShots(component); - component.Cycled = true; - Cycle(uid, component, coordinates); var text = Loc.GetString(shots == 0 ? "gun-ballistic-cycled-empty" : "gun-ballistic-cycled"); @@ -181,6 +184,9 @@ public abstract partial class SharedGunSystem private void OnBallisticInit(EntityUid uid, BallisticAmmoProviderComponent component, ComponentInit args) { component.Container = Containers.EnsureContainer(uid, "ballistic-ammo"); + // TODO: This is called twice though we need to support loading appearance data (and we need to call it on MapInit + // to ensure it's correct). + UpdateBallisticAppearance(uid, component); } private void OnBallisticMapInit(EntityUid uid, BallisticAmmoProviderComponent component, MapInitEvent args) @@ -190,6 +196,7 @@ public abstract partial class SharedGunSystem if (component.FillProto != null) { component.UnspawnedCount = Math.Max(0, component.Capacity - component.Container.ContainedEntities.Count); + UpdateBallisticAppearance(uid, component); Dirty(uid, component); } } @@ -203,9 +210,6 @@ public abstract partial class SharedGunSystem { for (var i = 0; i < args.Shots; i++) { - if (!component.Cycled) - break; - EntityUid entity; if (component.Entities.Count > 0) @@ -213,14 +217,6 @@ public abstract partial class SharedGunSystem entity = component.Entities[^1]; args.Ammo.Add((entity, EnsureComp(entity))); - - // Leave the entity as is if it doesn't auto cycle - // TODO: Suss this out with NewAmmoComponent as I don't think it gets removed from container properly - if (!component.AutoCycle) - { - return; - } - component.Entities.RemoveAt(component.Entities.Count - 1); component.Container.Remove(entity); } @@ -229,25 +225,6 @@ public abstract partial class SharedGunSystem component.UnspawnedCount--; entity = Spawn(component.FillProto, args.Coordinates); args.Ammo.Add((entity, EnsureComp(entity))); - - // Put it back in if it doesn't auto-cycle - if (HasComp(entity) && !component.AutoCycle) - { - if (!entity.IsClientSide()) - { - component.Entities.Add(entity); - component.Container.Insert(entity); - } - else - { - component.UnspawnedCount++; - } - } - } - - if (!component.AutoCycle) - { - component.Cycled = false; } } diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.ChamberMagazine.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.ChamberMagazine.cs index 84c65eca95..17c32f639a 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.ChamberMagazine.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.ChamberMagazine.cs @@ -1,5 +1,7 @@ using System.Diagnostics.CodeAnalysis; +using Content.Shared.Containers.ItemSlots; using Content.Shared.Examine; +using Content.Shared.Interaction; using Content.Shared.Interaction.Events; using Content.Shared.Verbs; using Content.Shared.Weapons.Ranged.Components; @@ -14,21 +16,244 @@ public abstract partial class SharedGunSystem protected virtual void InitializeChamberMagazine() { + SubscribeLocalEvent(OnChamberStartup); SubscribeLocalEvent(OnChamberMagazineTakeAmmo); SubscribeLocalEvent(OnChamberAmmoCount); + + /* + * Open and close bolts are separate verbs. + * Racking does both in one hit and has a different sound (to avoid RSI + sounds cooler). + */ + + SubscribeLocalEvent>(OnChamberVerb); + SubscribeLocalEvent>(OnChamberActivationVerb); + SubscribeLocalEvent>(OnChamberInteractionVerb); SubscribeLocalEvent>(OnMagazineVerb); + + SubscribeLocalEvent(OnChamberActivate); + SubscribeLocalEvent(OnChamberUse); + SubscribeLocalEvent(OnMagazineSlotChange); SubscribeLocalEvent(OnMagazineSlotChange); - SubscribeLocalEvent(OnMagazineUse); SubscribeLocalEvent(OnChamberMagazineExamine); } + private void OnChamberStartup(EntityUid uid, ChamberMagazineAmmoProviderComponent component, ComponentStartup args) + { + // Appearance data doesn't get serialized and want to make sure this is correct on spawn (regardless of MapInit) so. + if (component.BoltClosed != null) + { + Appearance.SetData(uid, AmmoVisuals.BoltClosed, component.BoltClosed.Value); + } + } + + private void OnChamberVerb(EntityUid uid, ChamberMagazineAmmoProviderComponent component, GetVerbsEvent args) + { + if (component.BoltClosed != null) + { + args.Verbs.Add(new Verb() + { + Text = component.BoltClosed.Value ? Loc.GetString("gun-chamber-bolt-open") : Loc.GetString("gun-chamber-bolt-close"), + Act = () => ToggleBolt(uid, component, args.User), + }); + } + } + + private void OnChamberActivate(EntityUid uid, ChamberMagazineAmmoProviderComponent component, ActivateInWorldEvent args) + { + if (args.Handled || component.BoltClosed == null) + return; + + args.Handled = true; + ToggleBolt(uid, component, args.User); + } + + private void OnChamberUse(EntityUid uid, ChamberMagazineAmmoProviderComponent component, UseInHandEvent args) + { + if (args.Handled || component.BoltClosed == null) + return; + + args.Handled = true; + UseChambered(uid, component, args.User); + } + + private void OnChamberActivationVerb(EntityUid uid, ChamberMagazineAmmoProviderComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract || component.BoltClosed == null) + return; + + args.Verbs.Add(new ActivationVerb() + { + Text = Loc.GetString("gun-chamber-rack"), + Act = () => + { + UseChambered(uid, component, args.User); + } + }); + } + + private void UseChambered(EntityUid uid, ChamberMagazineAmmoProviderComponent component, EntityUid? user = null) + { + if (component.BoltClosed == null || !component.BoltClosed.Value) + return; + + if (TryTakeChamberEntity(uid, out var chamberEnt)) + { + if (_netManager.IsServer) + { + EjectCartridge(chamberEnt.Value); + } + else + { + // Similar to below just due to prediction. + TransformSystem.DetachParentToNull(chamberEnt.Value, Transform(chamberEnt.Value)); + } + } + + CycleCartridge(uid, component, user); + + if (component.BoltClosed.Value) + { + Audio.PlayPredicted(component.RackSound, uid, user); + } + } + + private void OnChamberInteractionVerb(EntityUid uid, ChamberMagazineAmmoProviderComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract || component.BoltClosed == null) + return; + + args.Verbs.Add(new InteractionVerb() + { + Text = component.BoltClosed.Value ? Loc.GetString("gun-chamber-bolt-open") : Loc.GetString("gun-chamber-bolt-close"), + Act = () => + { + // Just toggling might be more user friendly instead of trying to set to whatever they think? + ToggleBolt(uid, component, args.User); + } + }); + } + + public void SetBoltClosed(EntityUid uid, ChamberMagazineAmmoProviderComponent component, bool value, EntityUid? user = null, AppearanceComponent? appearance = null, ItemSlotsComponent? slots = null) + { + if (component.BoltClosed == null || value == component.BoltClosed) + return; + + Resolve(uid, ref appearance, ref slots, false); + Appearance.SetData(uid, AmmoVisuals.BoltClosed, value, appearance); + + if (value) + { + CycleCartridge(uid, component, user, appearance); + + if (user != null) + PopupSystem.PopupClient(Loc.GetString("gun-chamber-bolt-closed"), uid, user.Value); + + if (slots != null) + { + _slots.SetLock(uid, ChamberSlot, true, slots); + } + + Audio.PlayPredicted(component.BoltClosedSound, uid, user); + } + else + { + if (TryTakeChamberEntity(uid, out var chambered)) + { + if (_netManager.IsServer) + { + EjectCartridge(chambered.Value); + } + else + { + // Prediction moment + // The problem is client will dump the cartridge on the ground and the new server state + // won't correspond due to randomness so looks weird + // but we also need to always take it from the chamber or else ammocount won't be correct. + TransformSystem.DetachParentToNull(chambered.Value, Transform(chambered.Value)); + } + + UpdateAmmoCount(uid); + } + + if (user != null) + PopupSystem.PopupClient(Loc.GetString("gun-chamber-bolt-opened"), uid, user.Value); + + if (slots != null) + { + _slots.SetLock(uid, ChamberSlot, false, slots); + } + + Audio.PlayPredicted(component.BoltOpenedSound, uid, user); + } + + component.BoltClosed = value; + Dirty(uid, component); + } + + /// + /// Tries to take ammo from the magazine and insert into the chamber. + /// + private void CycleCartridge(EntityUid uid, ChamberMagazineAmmoProviderComponent component, EntityUid? user = null, AppearanceComponent? appearance = null) + { + // Try to put a new round in if possible. + var magEnt = GetMagazineEntity(uid); + + // Similar to what takeammo does though that uses an optimised version where + // multiple bullets may be fired in a single tick. + if (magEnt != null) + { + var relayedArgs = new TakeAmmoEvent(1, + new List<(EntityUid? Entity, IShootable Shootable)>(), + Transform(uid).Coordinates, + user); + RaiseLocalEvent(magEnt.Value, relayedArgs); + + if (relayedArgs.Ammo.Count > 0) + { + var newChamberEnt = relayedArgs.Ammo[0].Entity; + TryInsertChamber(uid, newChamberEnt!.Value); + var ammoEv = new GetAmmoCountEvent(); + RaiseLocalEvent(magEnt.Value, ref ammoEv); + FinaliseMagazineTakeAmmo(uid, component, ammoEv.Count, ammoEv.Capacity, user, appearance); + UpdateAmmoCount(uid); + + // Clientside reconciliation things + if (_netManager.IsClient) + { + foreach (var (ent, _) in relayedArgs.Ammo) + { + Del(ent!.Value); + } + } + } + else + { + UpdateAmmoCount(uid); + } + } + } + + public void ToggleBolt(EntityUid uid, ChamberMagazineAmmoProviderComponent component, EntityUid? user = null) + { + if (component.BoltClosed == null) + return; + + SetBoltClosed(uid, component, !component.BoltClosed.Value, user); + } + private void OnChamberMagazineExamine(EntityUid uid, ChamberMagazineAmmoProviderComponent component, ExaminedEvent args) { if (!args.IsInDetailsRange) return; var (count, _) = GetChamberMagazineCountCapacity(uid, component); + + if (component.BoltClosed != null) + { + args.PushMarkup(Loc.GetString("gun-chamber-bolt", ("bolt", component.BoltClosed), ("color", component.BoltClosed.Value ? Color.FromHex("#94e1f2") : Color.FromHex("#f29d94")))); + } + args.PushMarkup(Loc.GetString("gun-magazine-examine", ("color", AmmoExamineColor), ("count", count))); } @@ -88,52 +313,80 @@ public abstract partial class SharedGunSystem private void OnChamberMagazineTakeAmmo(EntityUid uid, ChamberMagazineAmmoProviderComponent component, TakeAmmoEvent args) { + if (component.BoltClosed == false) + { + args.Reason = Loc.GetString("gun-chamber-bolt-ammo"); + return; + } + // So chamber logic is kinda sussier than the others // Essentially we want to treat the chamber as a potentially free slot and then the mag as the remaining slots // i.e. if we shoot 3 times, then we use the chamber once (regardless if it's empty or not) and 2 from the mag // We move the n + 1 shot into the chamber as we essentially treat it like a stack. TryComp(uid, out var appearance); - if (TryTakeChamberEntity(uid, out var chamberEnt)) + EntityUid? chamberEnt; + + // Normal behaviour for guns. + if (component.AutoCycle) { + if (TryTakeChamberEntity(uid, out chamberEnt)) + { + args.Ammo.Add((chamberEnt.Value, EnsureComp(chamberEnt.Value))); + } + // No ammo returned. + else + { + return; + } + + var magEnt = GetMagazineEntity(uid); + + // Pass an event to the magazine to get more (to refill chamber or for shooting). + if (magEnt != null) + { + // We pass in Shots not Shots - 1 as we'll take the last entity and move it into the chamber. + var relayedArgs = new TakeAmmoEvent(args.Shots, new List<(EntityUid? Entity, IShootable Shootable)>(), args.Coordinates, args.User); + RaiseLocalEvent(magEnt.Value, relayedArgs); + + // Put in the nth slot back into the chamber + // Rest of the ammo gets shot + if (relayedArgs.Ammo.Count > 0) + { + var newChamberEnt = relayedArgs.Ammo[^1].Entity; + TryInsertChamber(uid, newChamberEnt!.Value); + } + + // Anything above the chamber-refill amount gets fired. + for (var i = 0; i < relayedArgs.Ammo.Count - 1; i++) + { + args.Ammo.Add(relayedArgs.Ammo[i]); + } + + // If no more ammo then open bolt. + if (relayedArgs.Ammo.Count == 0) + { + SetBoltClosed(uid, component, false, user: args.User, appearance: appearance); + } + } + else + { + Appearance.SetData(uid, AmmoVisuals.MagLoaded, false, appearance); + return; + } + + var ammoEv = new GetAmmoCountEvent(); + RaiseLocalEvent(magEnt.Value, ref ammoEv); + + FinaliseMagazineTakeAmmo(uid, component, ammoEv.Count, ammoEv.Capacity, args.User, appearance); + } + // If gun doesn't autocycle (e.g. bolt-action weapons) then we leave the chambered entity in there but still return it. + else if (Containers.TryGetContainer(uid, ChamberSlot, out var container) && + container is ContainerSlot { ContainedEntity: not null } slot) + { + // Shooting code won't eject it if it's still contained. + chamberEnt = slot.ContainedEntity; args.Ammo.Add((chamberEnt.Value, EnsureComp(chamberEnt.Value))); } - - var magEnt = GetMagazineEntity(uid); - - // Pass an event to the magazine to get more (to refill chamber or for shooting). - if (magEnt != null) - { - // We pass in Shots not Shots - 1 as we'll take the last entity and move it into the chamber. - var relayedArgs = new TakeAmmoEvent(args.Shots, new List<(EntityUid? Entity, IShootable Shootable)>(), args.Coordinates, args.User); - RaiseLocalEvent(magEnt.Value, relayedArgs); - - // Put in the nth slot back into the chamber - // Rest of the ammo gets shot - if (relayedArgs.Ammo.Count > 0) - { - var newChamberEnt = relayedArgs.Ammo[^1].Entity; - TryInsertChamber(uid, newChamberEnt!.Value); - } - - // Anything above the chamber-refill amount gets fired. - for (var i = 0; i < relayedArgs.Ammo.Count - 1; i++) - { - args.Ammo.Add(relayedArgs.Ammo[i]); - } - } - else - { - Appearance.SetData(uid, AmmoVisuals.MagLoaded, false, appearance); - return; - } - - var count = chamberEnt != null ? 1 : 0; - const int capacity = 1; - - var ammoEv = new GetAmmoCountEvent(); - RaiseLocalEvent(magEnt.Value, ref ammoEv); - - FinaliseMagazineTakeAmmo(uid, component, args, count + ammoEv.Count, capacity + ammoEv.Capacity, appearance); } } diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Clothing.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Clothing.cs index 669c49aefa..0f2a631644 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Clothing.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Clothing.cs @@ -32,7 +32,7 @@ public partial class SharedGunSystem private bool TryGetClothingSlotEntity(EntityUid uid, ClothingSlotAmmoProviderComponent component, [NotNullWhen(true)] out EntityUid? slotEntity) { slotEntity = null; - if (!_container.TryGetContainingContainer(uid, out var container)) + if (!Containers.TryGetContainingContainer(uid, out var container)) return false; var user = container.Owner; diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Container.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Container.cs index 23e2d94e1f..999d5379a2 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Container.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Container.cs @@ -8,9 +8,6 @@ namespace Content.Shared.Weapons.Ranged.Systems; public partial class SharedGunSystem { - [Dependency] private readonly INetManager _netMan = default!; - [Dependency] private readonly SharedContainerSystem _container = default!; - private void InitializeContainer() { SubscribeLocalEvent(OnContainerTakeAmmo); @@ -20,7 +17,7 @@ public partial class SharedGunSystem private void OnContainerTakeAmmo(EntityUid uid, ContainerAmmoProviderComponent component, TakeAmmoEvent args) { component.ProviderUid ??= uid; - if (!_container.TryGetContainer(component.ProviderUid.Value, component.Container, out var container)) + if (!Containers.TryGetContainer(component.ProviderUid.Value, component.Container, out var container)) return; for (var i = 0; i < args.Shots; i++) @@ -30,7 +27,7 @@ public partial class SharedGunSystem var ent = container.ContainedEntities[0]; - if (_netMan.IsServer) + if (_netManager.IsServer) container.Remove(ent); args.Ammo.Add((ent, EnsureComp(ent))); @@ -40,7 +37,7 @@ public partial class SharedGunSystem private void OnContainerAmmoCount(EntityUid uid, ContainerAmmoProviderComponent component, ref GetAmmoCountEvent args) { component.ProviderUid ??= uid; - if (!_container.TryGetContainer(component.ProviderUid.Value, component.Container, out var container)) + if (!Containers.TryGetContainer(component.ProviderUid.Value, component.Container, out var container)) { args.Capacity = 0; args.Count = 0; diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Magazine.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Magazine.cs index a0375e3b4a..57db1d2b9c 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Magazine.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Magazine.cs @@ -66,7 +66,13 @@ public abstract partial class SharedGunSystem if (!TryComp(uid, out var appearance)) return; - Appearance.SetData(uid, AmmoVisuals.MagLoaded, GetMagazineEntity(uid) != null, appearance); + var magEnt = GetMagazineEntity(uid); + Appearance.SetData(uid, AmmoVisuals.MagLoaded, magEnt != null, appearance); + + if (magEnt != null) + { + UpdateMagazineAppearance(uid, component, magEnt.Value); + } } protected (int, int) GetMagazineCountCapacity(EntityUid uid, MagazineAmmoProviderComponent component) @@ -124,16 +130,16 @@ public abstract partial class SharedGunSystem var ammoEv = new GetAmmoCountEvent(); RaiseLocalEvent(magEntity.Value, ref ammoEv); - FinaliseMagazineTakeAmmo(uid, component, args, ammoEv.Count, ammoEv.Capacity, appearance); + FinaliseMagazineTakeAmmo(uid, component, ammoEv.Count, ammoEv.Capacity, args.User, appearance); } - private void FinaliseMagazineTakeAmmo(EntityUid uid, MagazineAmmoProviderComponent component, TakeAmmoEvent args, int count, int capacity, AppearanceComponent? appearance) + private void FinaliseMagazineTakeAmmo(EntityUid uid, MagazineAmmoProviderComponent component, int count, int capacity, EntityUid? user, AppearanceComponent? appearance) { // If no ammo then check for autoeject - if (component.AutoEject && args.Ammo.Count == 0) + if (component.AutoEject && count == 0) { EjectMagazine(uid, component); - Audio.PlayPredicted(component.SoundAutoEject, uid, args.User); + Audio.PlayPredicted(component.SoundAutoEject, uid, user); } UpdateMagazineAppearance(uid, appearance, true, count, capacity); @@ -146,12 +152,6 @@ public abstract partial class SharedGunSystem var count = 0; var capacity = 0; - if (component is ChamberMagazineAmmoProviderComponent chamber) - { - count = GetChamberEntity(uid) != null ? 1 : 0; - capacity = 1; - } - if (TryComp(magEnt, out var magAppearance)) { Appearance.TryGetData(magEnt, AmmoVisuals.AmmoCount, out var addCount, magAppearance); diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index c72deb5956..cbf48432f9 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -307,6 +307,11 @@ public abstract partial class SharedGunSystem : EntitySystem // If they're firing an existing clip then don't play anything. if (shots > 0) { + if (ev.Reason != null) + { + PopupSystem.PopupClient(ev.Reason, gunUid, user); + } + // Don't spam safety sounds at gun fire rate, play it at a reduced rate. // May cause prediction issues? Needs more tweaking gun.NextFire = TimeSpan.FromSeconds(Math.Max(lastFire.TotalSeconds + SafetyNextFire, gun.NextFire.TotalSeconds)); @@ -467,4 +472,5 @@ public enum AmmoVisuals : byte AmmoMax, HasAmmo, // used for generic visualizers. c# stuff can just check ammocount != 0 MagLoaded, + BoltClosed, } diff --git a/Content.Shared/Wieldable/WieldableSystem.cs b/Content.Shared/Wieldable/WieldableSystem.cs index 31e462c6af..952ce3a378 100644 --- a/Content.Shared/Wieldable/WieldableSystem.cs +++ b/Content.Shared/Wieldable/WieldableSystem.cs @@ -111,6 +111,9 @@ public sealed class WieldableSystem : EntitySystem { if (args.Handled) return; + + args.Handled = true; + if(!component.Wielded) AttemptWield(uid, component, args.User); else diff --git a/Resources/Locale/en-US/weapons/ranged/gun.ftl b/Resources/Locale/en-US/weapons/ranged/gun.ftl index b1e75acf0c..5982934215 100644 --- a/Resources/Locale/en-US/weapons/ranged/gun.ftl +++ b/Resources/Locale/en-US/weapons/ranged/gun.ftl @@ -26,6 +26,15 @@ gun-cartridge-unspent = It is [color=lime]not spent[/color]. # BatteryAmmoProvider gun-battery-examine = It has enough charge for [color={$color}]{$count}[/color] shots. +# CartridgeAmmoProvider +gun-chamber-bolt-ammo = Gun not bolted +gun-chamber-bolt = The bolt is [color={$color}]{$bolt}[/color]. +gun-chamber-bolt-closed = Closed bolt +gun-chamber-bolt-opened = Opened bolt +gun-chamber-bolt-close = Close bolt +gun-chamber-bolt-open = Open bolt +gun-chamber-rack = Rack + # MagazineAmmoProvider gun-magazine-examine = It has [color={$color}]{$count}[/color] shots remaining. diff --git a/Resources/Prototypes/Entities/Debugging/debug_sweps.yml b/Resources/Prototypes/Entities/Debugging/debug_sweps.yml index 27546e4c58..862735ab13 100644 --- a/Resources/Prototypes/Entities/Debugging/debug_sweps.yml +++ b/Resources/Prototypes/Entities/Debugging/debug_sweps.yml @@ -10,6 +10,7 @@ - Debug - type: Sprite sprite: Objects/Weapons/Guns/Pistols/debug.rsi + state: icon - type: Clothing sprite: Objects/Weapons/Guns/Pistols/debug.rsi - type: Gun diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml index f83e6420ed..1d16d308e4 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml @@ -31,6 +31,8 @@ soundEmpty: path: /Audio/Weapons/Guns/Empty/lmg_empty.ogg - type: ChamberMagazineAmmoProvider + soundRack: + path: /Audio/Weapons/Guns/Cock/lmg_cock.ogg - type: AmmoCounter - type: ItemSlots slots: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml index 4be8f44de1..3796ac92b8 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml @@ -45,7 +45,6 @@ whitelist: tags: - Grenade - autoCycle: false capacity: 3 proto: GrenadeFrag soundInsert: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index ae7e02444a..ff098b32f9 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -28,6 +28,8 @@ soundGunshot: path: /Audio/Weapons/Guns/Gunshots/pistol.ogg - type: ChamberMagazineAmmoProvider + soundRack: + path: /Audio/Weapons/Guns/Cock/pistol_cock.ogg - type: ItemSlots slots: gun_magazine: @@ -108,6 +110,8 @@ map: ["enum.GunVisualLayers.Mag"] - type: Clothing sprite: Objects/Weapons/Guns/Pistols/cobra.rsi + - type: ChamberMagazineAmmoProvider + boltClosed: null - type: Gun fireRate: 4 soundGunshot: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml index c35c49da95..114573c087 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml @@ -23,6 +23,8 @@ soundGunshot: path: /Audio/Weapons/Guns/Gunshots/batrifle.ogg - type: ChamberMagazineAmmoProvider + soundRack: + path: /Audio/Weapons/Guns/Cock/sf_rifle_cock.ogg - type: ItemSlots slots: gun_magazine: @@ -66,6 +68,8 @@ soundGunshot: path: /Audio/Weapons/Guns/Gunshots/rifle2.ogg - type: ChamberMagazineAmmoProvider + soundRack: + path: /Audio/Weapons/Guns/Cock/ltrifle_cock.ogg - type: ItemSlots slots: gun_magazine: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index 7d572d49e6..e423c09841 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -28,6 +28,8 @@ soundGunshot: path: /Audio/Weapons/Guns/Gunshots/smg.ogg - type: ChamberMagazineAmmoProvider + soundRack: + path: /Audio/Weapons/Guns/Cock/smg_cock.ogg - type: ItemSlots slots: gun_magazine: @@ -95,7 +97,7 @@ soundGunshot: path: /Audio/Weapons/Guns/Gunshots/c-20r.ogg - type: ChamberMagazineAmmoProvider - # autoEject: true # Do not set this until the PVS prediction issue is resolved + autoEject: true - type: MagazineVisuals magState: mag steps: 6 @@ -216,6 +218,8 @@ shader: unshaded - type: Clothing sprite: Objects/Weapons/Guns/SMGs/wt550.rsi + - type: ChamberMagazineAmmoProvider + boltClosed: null - type: Gun fireRate: 5 selectedMode: FullAuto diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml index 4197905714..4bee243d57 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml @@ -29,7 +29,6 @@ soundEmpty: path: /Audio/Weapons/Guns/Empty/empty.ogg - type: BallisticAmmoProvider - autoCycle: false whitelist: tags: - ShellShotgun @@ -266,4 +265,4 @@ id: WeaponShotgunImprovisedLoaded components: - type: BallisticAmmoProvider - proto: ShellShotgunImprovised \ No newline at end of file + proto: ShellShotgunImprovised diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml index 213e5d4155..63a06c266d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml @@ -25,7 +25,6 @@ soundGunshot: path: /Audio/Weapons/Guns/Gunshots/sniper.ogg - type: BallisticAmmoProvider - autoCycle: false capacity: 10 proto: CartridgeLightRifle whitelist: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/turrets.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/turrets.yml index 9fb02f7bed..b2ad3ff702 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/turrets.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/turrets.yml @@ -156,7 +156,6 @@ - type: BallisticAmmoProvider proto: CartridgePistol capacity: 50 - cycleable: false - type: Construction deconstructionTarget: null graph: WeaponTurretSyndicateDisposable diff --git a/Resources/Textures/Objects/Weapons/Guns/LMGs/l6.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/LMGs/l6.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..7a3df10c8b4f4f8d1c98c2442fe7696de57c2569 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#^NA%C&rs6b?Si}&H|6fVg?31 zWe{epSZZGe6qE??32_C|dAa#glG1Up32LgEe!hVw#%7KVE|X-X-vH$}N`m}?8U91S z)l(rxK(S?>E{-7;bGA-!D;I5*cSEo)hJ9prrmPgg&ebxsLQ0HZ5*2mk;8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/LMGs/l6.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/LMGs/l6.rsi/meta.json index d6806ab228..7dc67f28bd 100644 --- a/Resources/Textures/Objects/Weapons/Guns/LMGs/l6.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/LMGs/l6.rsi/meta.json @@ -6,44 +6,47 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "base" - }, - { - "name": "mag-0" - }, - { - "name": "mag-1" - }, - { - "name": "mag-2" - }, - { - "name": "mag-3" - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "wielded-inhand-left", - "directions": 4 - }, - { - "name": "wielded-inhand-right", - "directions": 4 - }, - { - "name": "equipped-BACKPACK", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "base" + }, + { + "name": "bolt-open" + }, + { + "name": "mag-0" + }, + { + "name": "mag-1" + }, + { + "name": "mag-2" + }, + { + "name": "mag-3" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "wielded-inhand-left", + "directions": 4 + }, + { + "name": "wielded-inhand-right", + "directions": 4 + }, + { + "name": "equipped-BACKPACK", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..1bd788874b2f8aaed1be012e24091c3cc4c2dc2e GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DWNC}n^YB(s&ta2iU~syqXL&z5HWBDX22WQ%mvv4F FO#u88cl`hW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/meta.json index dab75b56c6..b7d464cbb7 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/meta.json @@ -10,6 +10,9 @@ { "name": "icon" }, + { + "name": "bolt-open" + }, { "name": "inhand-left", "directions": 4 diff --git a/Resources/Textures/Objects/Weapons/Guns/Pistols/mk58.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Pistols/mk58.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1d1d0205973bb0760d6c7f8af83e7ae7b105e9 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP|z~KC&U#SDu~}GH zn3}4lnwqMfu8yOFi-ozFtBb>#jkP8~&B7%?e!&d?F@T-@9bKUG5>FS$kcv5PCqxQ0 z8}K+kPAlBt+j#H)hN+D~M#4KBe*c*|QAuC%kI`kilR-DOuFvt6# zveDgEb6E!4ZFf9G~@M3=cRo2-r2Z?2KboeEHz|NRs5QN@{-@~mm15a z@HE@*ZohPqgY)3BeU5?#%88NF>KID+XY6`(?*Q|eK@{oCO|{#S9GG z!XV7ZFl&wkP_Qe&C&U#FQWmnAzG`OG!!_8|&-pYH!}W zxw5is&6+iZg?TfkO>1pwS-g0$nwqMjqC$FlYD`RYLqnaas>+NR(~^=BN=iyvT3RMd znBeN-;OO9@rV2DtRYpe2&eqz(+)PJD+r-$+&o@v}Q7$?vDlIj$t*y=2P|wWNS;&%@ev6AGjS<3<8&u7l(_X|rep-2|a#B&^&3E70llNTg`%s)y@C_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Pistols/viper.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Pistols/viper.rsi/meta.json index b2cdaede10..b611235f4d 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Pistols/viper.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Pistols/viper.rsi/meta.json @@ -13,6 +13,9 @@ { "name": "base" }, + { + "name": "bolt-open" + }, { "name": "mag-0" }, @@ -27,9 +30,9 @@ "name": "inhand-right", "directions": 4 }, - { - "name": "equipped-BELT", - "directions": 4 - } + { + "name": "equipped-BELT", + "directions": 4 + } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/inspector.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Revolvers/inspector.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..8cb0656e6818ca5d1045cb80e4b94c25701e7a33 GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP|zm8C&U#lFzshIP2 zLN{Nt0*`Cv>C3rOHvaz~&YdSL@{`Hm$;rZed+5@AS z(U+MuVjpW&`z^*}Ob;LbRC@p4SxWvUo42Ow5`n0XpWo|nUb@8a(D+NFP)o?%Si0Vx91Z4k|Gxzk@J>IXqtI!QJAvi=-`*hYKyfyPIKhc_ QKnF5-y85}Sb4q9e0M811ga7~l literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/inspector.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Revolvers/inspector.rsi/meta.json index a22d42c872..f24ef91bcf 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Revolvers/inspector.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Revolvers/inspector.rsi/meta.json @@ -10,6 +10,9 @@ { "name": "icon" }, + { + "name": "bolt-open" + }, { "name": "inhand-left", "directions": 4 diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/mateba.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Revolvers/mateba.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..f38ef5b36967213e605c16d43ab2caed9ecd06fb GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP|z&EC&U#)40d)$M1o;Is{6`0I2ixp`vhzG$978JRyq%CM)U3ec zQYfsrQuNhd{o5?j``LCn{5~ds=8dv6&%^5ybAC%Gm{~Dhwm7!qyhMZZ8IMkv&<@6x z^6qokY}D2VT;jFlnqYEORr6SS%){6jpJOg{|H(+668^;?F>aGIn@gMiLzO3+O1tCc zzt|~hFr(1-HQ&u`4V(V258GEEC!n$=NxVz+$J?@hnHlL*AGyUB>~dSG{D(7N;T2od UuY9fVK$kLjy85}Sb4q9e0N*WxCjbBd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/mateba.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Revolvers/mateba.rsi/meta.json index a22d42c872..f24ef91bcf 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Revolvers/mateba.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Revolvers/mateba.rsi/meta.json @@ -10,6 +10,9 @@ { "name": "icon" }, + { + "name": "bolt-open" + }, { "name": "inhand-left", "directions": 4 diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..3e021f2ccb131e8d680aec635abfb77cf9b55bb6 GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9F5 zM?jcysy3fAP|z~KC&U#nuSY({DK+&V*oq*JGwyW1)eUBAr*7p_8$~F ztia*oDBRJq;O+nVoP#e9ZYireX_)`*&>KCj183D=^b~tNo}j49rw?*B6@#oBJ=_cfT0bA7Cu?=axxvjnL+8-#Attd~to1rSbEe zbGJ%ADL>F|e*by#|20=RZuHM&-Sf^)fWvu~?u*)n7k)MSH++{}G?PE!8{eN}|9+T< be_#@tz^?GB@Wy7KTNylE{an^LB{Ts5?hKGw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi/meta.json index 13dd3228e9..504a793820 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi/meta.json @@ -6,21 +6,24 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "icon" - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "equipped-BELT", - "directions": 4 - } - ] + "states": [ + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "icon" + }, + { + "name": "bolt-open" + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-BELT", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/python.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Revolvers/python.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..15c38dcf5b1ba556e1d7db5171a0996c21326a10 GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP|!HQC&U#n9{$R5FxAirRS|7bu!)L|h|a=NFBV@SoEw|&_{%!(Y%jvM%| zT>U+NTj1?ova;2UXD$9I$Sb-`uRHQ5{Yc-^uBrCtc^z6Jwlsg5I!|cB!rD{&UR^7( zYhzu16XD}-wD$SMRM821j0a;^Gi%D!9XW6c)I$z JtaD0e0suA-e5L>Z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/python.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Revolvers/python.rsi/meta.json index 30136fa39b..781b1e11b5 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Revolvers/python.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Revolvers/python.rsi/meta.json @@ -10,6 +10,9 @@ { "name": "icon" }, + { + "name": "bolt-open" + }, { "name": "inhand-left", "directions": 4 diff --git a/Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..f1c3d60963b9c12c573ae320b0871b8c95ca75ca GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DWND5xIb6XFV_r6i^Ea`PP>Tnbef%!C+BjLqU=6HXRNtEp-(H)D{Lkdl;? ze0gWJ1yCt(NswPK!+#{8%i_2eC^6mB#WAE}PI7`oio*#8A48{#CWQx&9%Y@Gz$O?L zWF#W;{Y6HqfJah6VPZm|nb?#$8B&j=q?Rl>_Tb{fM;GH#a^m84WnI-eKhs!pPgrS* z?zWI1Gqch{PF{vr{ZU)9G8Invyu1*wp)t@qhB=~!$Lzq{{vzIl4-tnO1UNVo5?+3~ v*;}9(pnO`3JtTbd4weN!l|^C`GME@9JyEQ(p34&kbRvVNtDnm{r-UW|26AnK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/meta.json index 6749a5ecca..5f57a1e7a6 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/meta.json @@ -13,6 +13,9 @@ { "name": "base" }, + { + "name": "bolt-open" + }, { "name": "mag-0" }, diff --git a/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..477b65066e29f35f3165a7e6a8041dc9757bfc44 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DWND5x9Y6XFV__4W0got<-Yb62cb;p*xtCnqN^E-on{1|;?L^fc5|fD8z* zQ>>j1)WBa7q+-t535I-!40v2)+c?BpW?x!k z;W}6IA(M=%+oubiYq{GKoXf0l^=J;31U>gTe~DWM4f+lqi2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/meta.json index 596211bc7f..9c6c4cdeab 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/meta.json @@ -7,26 +7,29 @@ "y": 32 }, "states": [ - { - "name": "icon" - }, - { - "name": "base" - }, - { - "name": "mag-0" - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "equipped-BACKPACK", - "directions": 4 - } + { + "name": "icon" + }, + { + "name": "base" + }, + { + "name": "bolt-open" + }, + { + "name": "mag-0" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-BACKPACK", + "directions": 4 + } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..0781d7099bbddbfd1c0cf7c36cfa51b95a872006 GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP%tOJC&U#SOD1`PPVG5sxB@r`I!ky zN=iUwK%l9nA}uYQmXfo4B}mczC#>p`o_6wgd=>1JzhsS^`N~Sy>5j(T7Lx zMF8znDGBlmW?=g9`#%u;{`dd?9}wgJKV~omAy_zm|L1sjbYUe>{RvMO$B>FSZzrA> zYBJz)ZB}E|HeH|_B`Es$f4xa=x&&kCQ$PRBFYnBD4{o@xTCJ`#ZHC}Mf#86r9;`yk zB7AkZTdUT#XRkDMYwu*p=_sBh^hGNu+v(gyZnq!jv*^~O>v)8($TE-PWKj? zy{t$xj3`gZb7q}lQF^!Xii$+cZLi*zo?~Y|ah$yHkLkf0=1j%Q5y>ldep@)9Kl_E} zmkf^^r%qgn3p1#yKjpV;={|@0$){`grDY~OKV94OCOuY0zwY^Y@k)kHL++bDTH-*_ O#o+1c=d#Wzp$P!x4y_OX literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/meta.json index 1658afae5d..bfcf15bd15 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/meta.json @@ -13,6 +13,9 @@ { "name": "base" }, + { + "name": "bolt-open" + }, { "name": "mag-0" }, diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/atreides.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/atreides.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..0f083b8afbc6e382f0722f384416801723236994 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DWNC@3A^6XFV_6{Mxr6cn^oR6K2LB*nylBKjH{YKn?ecoHUp^p*tq1vC7I z0&}L>SAc@mo-U3d6?2jkBzzhIJslk#92ia+o0*x3hzPO-u?a8=i%;LMB}81IppBzr zI=55f25uLJ08TCu)`Ltw_5ECGvcHp7j0fhqxB9a;eG*~>j z4&S{R#8)J|xSMg71E(M30zn=Y7AZwOhZ{x`j0^(i;#dD%npq8W27{-opUXO@geCy) Chf0kA literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/atreides.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/SMGs/atreides.rsi/meta.json index ea2a077cb4..31389e9102 100644 --- a/Resources/Textures/Objects/Weapons/Guns/SMGs/atreides.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/SMGs/atreides.rsi/meta.json @@ -7,29 +7,32 @@ "y": 32 }, "states": [ - { - "name": "icon" - }, - { - "name": "base" - }, - { - "name": "mag-0" - }, - { - "name": "suppressor" - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "equipped-BACKPACK", - "directions": 4 - } + { + "name": "icon" + }, + { + "name": "base" + }, + { + "name": "bolt-open" + }, + { + "name": "mag-0" + }, + { + "name": "suppressor" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-BACKPACK", + "directions": 4 + } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..ee7f561033bba407c9f062331d1fc2de1d5ac38f GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DWNC@31>6XFV_)z#I@%E~M(EWEwF6A}_6BqVNal6?%6U@r;s3ugEa221Og z{RRrPdb&7^Eok%E;{o0X!OYPhaqUHF*>^{WMSNZMmBTD;-asW0iiu zQ1gK2hl>HN{YknD<(%?PuS%--}uF){&fl={~zdAGq#+Sy8mXbz#pK4 O7(8A5T-G@yGywo#*=vgc literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/meta.json index 46fe76f054..979ecfc388 100644 --- a/Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/meta.json @@ -7,44 +7,47 @@ "y": 32 }, "states": [ - { - "name": "icon" - }, - { - "name": "base" - }, - { - "name": "mag-0" - }, - { - "name": "mag-1" - }, - { - "name": "mag-2" - }, - { - "name": "mag-3" - }, - { - "name": "mag-4" - }, - { - "name": "mag-5" - }, - { - "name": "suppressor" - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "equipped-BACKPACK", - "directions": 4 - } + { + "name": "icon" + }, + { + "name": "base" + }, + { + "name": "bolt-open" + }, + { + "name": "mag-0" + }, + { + "name": "mag-1" + }, + { + "name": "mag-2" + }, + { + "name": "mag-3" + }, + { + "name": "mag-4" + }, + { + "name": "mag-5" + }, + { + "name": "suppressor" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-BACKPACK", + "directions": 4 + } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..f534d46c0bf4c40c9a8d0e3e42d73c0bf345b526 GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP|zm8C&U#<{*Ow7{K zQeIv@E-r4?geD~=C1qu0DJdxt5s@dATKj9~fubAgrs(A(V2iRQD6g*m% zG^MuX(aw0Kmr-{cX3Z25-dM?&$1|%=|L|dsHY=Nr&jnM&#eT51y|m=m)fvLE`YTJS zsHd(YkI)L;ByJ~~tb{~BGkA44w0x6o3wu@u^a6vYtDnm{r-UW|=*Wvh literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/meta.json index 1f802b3647..1109258b60 100644 --- a/Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/meta.json @@ -13,6 +13,9 @@ { "name": "base" }, + { + "name": "bolt-open" + }, { "name": "mag-0" }, diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/vector.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/vector.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..f616d25f874791042cf4ffe6ea41266dfdc575ad GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9F3 z${@^GvDCf{C}tqx#}+mpUi7uDEMUE@mMx#(dmy@Qn>hx z;?p0_J@H0Wt$T8_XZqDoJ$pi~iQ44a<|%nHn8gVg-hX?;oaum`fU1D_ro>6xIToxu zFCTq!{?1;3T})0-ZMhz1zYG2%dyn;PdO`9D{@E^DT3y8-sW0@5cy9euUqAFZyZn|- S9fm;XF?hQAxvXeK@{oCO|{#S9GG z!XV7ZFl&wkP|!HQC&U#S)3OY;^pOKEy56DXEr5U|M98_0RaI81%(S$ zvbnjrKDHL7nySS?iVH3+odDD(SQ6wH%@)k^N}> zQX}3MMuo~jk5XQ)U=f+WV3uI|CAVs)-)35h0x8=fuFg)_BhhDiDB14$J&rG*uKTPl jT5!F}V&Bu*^FOgYXJH97sAls9I)uT~)z4*}Q$iB}-mi1V literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/blunderbuss.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Shotguns/blunderbuss.rsi/meta.json index 5c9dfff9ea..f55fd2db20 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Shotguns/blunderbuss.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Shotguns/blunderbuss.rsi/meta.json @@ -6,17 +6,20 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "bolt-open" + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..8d9e4729466835e95f0ba4b179c8fa96c9deed03 GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jPK-BC>eK@{oCO|{#S9GG z!XV7ZFl&wkP|zvBC&U#_xASAnKNg}k|nEF zt=h9^&+c7&TAErD;u7U#6s5#vM1{qdE?KUrp%d#B845H-tR%=UnBhM*5YpJY7^q^e zr;B4q#hkYjxrGiX@VF>)ckB;xeP17H&M3LGs(GJ*kM(T*!o2kE@0b5C>1MDy^1)7S z^Smppdu};S(JN69W9m^}rsi_&O$AcFh%03xwi@&ul7VS(}lecr`oGd5g@|M#*_=D=*Gl93i)b%S?FI zyArkM%*;8L8h7!tUp**3ZN2!Pf(aMm9z0*>)>NPIB+Wi}<-VS|y83)NYz+V0jUs^_ OVeoYIb6Mw<&;$UFRhr@e literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/meta.json index 3358222de3..fe7b4c0449 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/meta.json @@ -7,26 +7,29 @@ "y": 32 }, "states": [ - { - "name": "icon" - }, - { - "name": "base" - }, - { - "name": "mag-0" - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "equipped-BACKPACK", - "directions": 4 - } + { + "name": "icon" + }, + { + "name": "base" + }, + { + "name": "bolt-open" + }, + { + "name": "mag-0" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-BACKPACK", + "directions": 4 + } ] -} \ No newline at end of file +} diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..dcbe062978ecbcdb9f1a2c6e1ada2286b9952fc6 GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DWND5x0V6XFV_Ra8_21O(J1g?rmu6I8esWCkiID0q2!wR&k;TU$#_mwgFT z#9b2P7tHV<4rG z*6O=8D)kMAXvZ8&V zNQY2x@`}VWX=(=D34Al&oM=#6)U>Rn@#IEEUl(WQSWn?u49!ft7chNy}hk1EUHS19UUE&m6grR%=r2Ft*ophBqYSeM0GUP zlX<5z0hRKW1o;Is{6_-1ERJh|5?ef7978JRBqvCuGz2oVE^0zzwD% zJWRd{Ob)qCi#CU?joKPGVd2KbivtBZtfRKKw6x?TBxK|yOn5PYfvY^nw(5(9$AZ9s zriFn{4b6$>0t{=PzIc(5kTEski9=!K0+s*~&H|1_1(Fgj7g?oLFC1!G+`MGLVpax* Yn|pOnY*0720dzlur>mdKI;Vst05ni_Qvd(} literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer.rsi/meta.json index 840b7790ff..2aed9f90d0 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer.rsi/meta.json @@ -7,20 +7,23 @@ "y": 32 }, "states": [ - { - "name": "icon" - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "equipped-BACKPACK", - "directions": 4 - } + { + "name": "icon" + }, + { + "name": "bolt-open" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-BACKPACK", + "directions": 4 + } ] -} \ No newline at end of file +} diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/flaregun.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Shotguns/flaregun.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..93f2b28fcd4a7034228f55a854446173fcd12e3c GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#^NA%C&rs6b?Si}&H|6fVg?4j zBOuH;Rhv&5C@3A^6XFV_4NTnvLQ{f;`HD1^cLXW*_0PChtE-@_Tc(;B2hv*->MV$jQOP8WAIrpygn7KuG7D03+WF2IebKe2yiJZk*}NDU4$MeC+HY h`;Da+vrC+1WDqNpS?n=YrVi*t22WQ%mvv4FO#s=tUnBqk literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/flaregun.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Shotguns/flaregun.rsi/meta.json index 54635ca513..6358c26299 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Shotguns/flaregun.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Shotguns/flaregun.rsi/meta.json @@ -6,21 +6,24 @@ "x": 32, "y": 32 }, - "states": [ - { - "name": "icon" - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "equipped-BELT", - "directions": 4 - } - ] -} \ No newline at end of file + "states": [ + { + "name": "icon" + }, + { + "name": "bolt-open" + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "equipped-BELT", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/hm_pistol.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Shotguns/hm_pistol.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..39ce0a760b31a5be531226b6a619701425aab0d4 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DWNC}WvxFG#K=Cblw`CP66r>C<*clX84Z^4g_>N1Lc}LT^vIy<|HRbxHvGxIta!(++bys zS)jCR;lhQ94l+^<4~?fUUz)n)3`-Mdg5C75S_%<+PTjb1gF&aD?CR~^<@astw=-lh zoZnlXes0dr>aTh}58mt!W|QYRCu7OH`OBNxtY?mS^fA1OIB=jrsetS1%$VnK3oUET k&ScH-3S0O)H-L%ZrGPK-VyMy85}Sb4q9e0Gc*$A^-pY literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/hm_pistol.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Shotguns/hm_pistol.rsi/meta.json index c1d9eabe38..4e592b59a4 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Shotguns/hm_pistol.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Shotguns/hm_pistol.rsi/meta.json @@ -11,6 +11,9 @@ { "name": "icon" }, + { + "name": "bolt-open" + }, { "name": "inhand-left", "directions": 4 diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/pump.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Shotguns/pump.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..cf99a2c2d558b139914e9f57800ea899fc849807 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DWND5x0V6XFV_6%-V_yu1Vi1QJxZtVI|~ii^}Fg%@N7wt8vxwzry9xaR>C zahC-71vC7IgW9s%t3csOPZ!6KiaE&%5{nuF8NIl99$S3j3^P6eK@{oCO|{#S9GG z!XV7ZFl&wkP|!8NC&U#waQUPNKnW~O43(dGsjU+RYKI-Vc#sELE8j;7Wo)qgwBl@Ag@l-+f+v>u>(0(zJR>(8}6cPv$#Wi}yX@ z%@uud=;6}mb}6q@{bSqT@;|Wg$z;A48T{w#XU4xKJLbRNbMK6OWh?uH#Bx6N6T)o2 z&ab}`nO5=7E%Z)se|?}g%d@FsU!0`;Ui1lCG^~E49#C!hsoX;Ag8iL?Eb|U0GH%>? hQ2EkB;VPAedWOBc>@#m<8h`?a!PC{xWt~$(695wBijM#Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/meta.json index 81e977c298..a959ed58f6 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/meta.json @@ -10,6 +10,9 @@ { "name": "base" }, + { + "name": "bolt-open" + }, { "name": "inhand-left", "directions": 4 diff --git a/Resources/Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..28fc5ba1c1138369a06a9df736a32499696ff1ee GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#^NA%C&rs6b?Si}&H|6fVg?3o zVGw3ym^DWNC@2x&6XFV_<>lqGva-Cqyi83^r%ai0=FY24n>MxQhI9bsI7)*2f*Jlp zz|~VBMnJL2o-U3d6?0NA9^^f2z`+_2V0^%T!+Y0x2SUXP%rdU9ZgTo&e`W7SP4mU= z2P0aXRFAf?%(GRM^Sm+3K}+Ct_`gP#E&DYVwh8u4c*U)By`P=I+19D`+rs7ED>TAZ zF6FD0H%tuk?$%w$`As9>y;%FK*`E&un?HV=XDu;D`~HFRzZi9z8AW(1il5C2kNi|# ec;1tvhS6#&?`qv2$>l)jF?hQAxvX