From 72fa97798f1f8fd4deeaa90c6658742b94881c92 Mon Sep 17 00:00:00 2001 From: rhailrake <49613070+rhailrake@users.noreply.github.com> Date: Fri, 28 Apr 2023 02:10:32 +0600 Subject: [PATCH] [feat] Egun --- .../Components/MagazineVisualsComponent.cs | 2 + .../Ranged/Systems/GunSystem.AmmoCounter.cs | 11 ++- .../Ranged/Systems/GunSystem.Battery.cs | 4 + .../Systems/GunSystem.MagazineVisuals.cs | 53 ++++++++++++ .../Ranged/Systems/GunSystem.Battery.cs | 79 ++++++++++++++++-- .../Weapons/Ranged/Components/GunComponent.cs | 2 +- .../TwoModeEnergyAmmoProviderComponent.cs | 43 ++++++++++ .../Ranged/Systems/SharedGunSystem.Battery.cs | 76 +++++++++++++++++ .../Systems/SharedGunSystem.Interactions.cs | 11 +++ .../Weapons/Ranged/Systems/SharedGunSystem.cs | 2 + .../Audio/Weapons/Guns/Misc/egun_toggle.ogg | Bin 0 -> 6694 bytes .../Prototypes/Catalog/Cargo/cargo_armory.yml | 10 +++ .../Catalog/Fills/Crates/armory.yml | 9 ++ .../Catalog/Fills/Lockers/heads.yml | 9 +- .../Catalog/Fills/Lockers/security.yml | 7 +- .../Weapons/Guns/Battery/battery_guns.yml | 40 ++++++++- .../Entities/Structures/Power/chargers.yml | 3 + .../Weapons/Guns/Battery/egun.rsi/base.png | Bin 0 -> 5601 bytes .../Battery/egun.rsi/equipped-BACKPACK.png | Bin 0 -> 1560 bytes .../Weapons/Guns/Battery/egun.rsi/icon.png | Bin 0 -> 5601 bytes .../Guns/Battery/egun.rsi/inhand-left.png | Bin 0 -> 1028 bytes .../Guns/Battery/egun.rsi/inhand-right.png | Bin 0 -> 1012 bytes .../Battery/egun.rsi/laser-inhand-left.png | Bin 0 -> 1026 bytes .../Battery/egun.rsi/laser-inhand-right.png | Bin 0 -> 1009 bytes .../Guns/Battery/egun.rsi/mag-twomode1-0.png | Bin 0 -> 292 bytes .../Guns/Battery/egun.rsi/mag-twomode1-1.png | Bin 0 -> 113 bytes .../Guns/Battery/egun.rsi/mag-twomode1-2.png | Bin 0 -> 113 bytes .../Guns/Battery/egun.rsi/mag-twomode1-3.png | Bin 0 -> 115 bytes .../Guns/Battery/egun.rsi/mag-twomode1-4.png | Bin 0 -> 117 bytes .../Guns/Battery/egun.rsi/mag-twomode2-0.png | Bin 0 -> 292 bytes .../Guns/Battery/egun.rsi/mag-twomode2-1.png | Bin 0 -> 113 bytes .../Guns/Battery/egun.rsi/mag-twomode2-2.png | Bin 0 -> 113 bytes .../Guns/Battery/egun.rsi/mag-twomode2-3.png | Bin 0 -> 115 bytes .../Guns/Battery/egun.rsi/mag-twomode2-4.png | Bin 0 -> 117 bytes .../Weapons/Guns/Battery/egun.rsi/meta.json | 79 ++++++++++++++++++ 35 files changed, 425 insertions(+), 15 deletions(-) create mode 100644 Content.Shared/Weapons/Ranged/Components/TwoModeEnergyAmmoProviderComponent.cs create mode 100644 Resources/Audio/Weapons/Guns/Misc/egun_toggle.ogg create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/base.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/equipped-BACKPACK.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/icon.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/laser-inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/laser-inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode1-0.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode1-1.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode1-2.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode1-3.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode1-4.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode2-0.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode2-1.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode2-2.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode2-3.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode2-4.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/meta.json diff --git a/Content.Client/Weapons/Ranged/Components/MagazineVisualsComponent.cs b/Content.Client/Weapons/Ranged/Components/MagazineVisualsComponent.cs index 373be94a38..c8b5cd080b 100644 --- a/Content.Client/Weapons/Ranged/Components/MagazineVisualsComponent.cs +++ b/Content.Client/Weapons/Ranged/Components/MagazineVisualsComponent.cs @@ -30,4 +30,6 @@ public enum GunVisualLayers : byte BaseUnshaded, Mag, MagUnshaded, + TwoModeFirst, + TwoModeSecond } diff --git a/Content.Client/Weapons/Ranged/Systems/GunSystem.AmmoCounter.cs b/Content.Client/Weapons/Ranged/Systems/GunSystem.AmmoCounter.cs index dfb5418f11..456f6d7807 100644 --- a/Content.Client/Weapons/Ranged/Systems/GunSystem.AmmoCounter.cs +++ b/Content.Client/Weapons/Ranged/Systems/GunSystem.AmmoCounter.cs @@ -251,14 +251,19 @@ public sealed partial class GunSystem _ammoCount.Visible = true; _ammoCount.Text = $"x{count:00}"; - max = Math.Min(max, 8); - FillBulletRow(_bulletsList, count, max); + float step = 1; + if (max > 8) + { + step = ((float)max / 8); + } + FillBulletRow(_bulletsList, count, max, step); } - private static void FillBulletRow(Control container, int count, int capacity) + private static void FillBulletRow(Control container, int count, int capacity, float step = 1) { var colorGone = Color.FromHex("#000000"); var color = Color.FromHex("#E00000"); + int emptyNumber = 0; // Draw the empty ones for (var i = count; i < capacity; i++) diff --git a/Content.Client/Weapons/Ranged/Systems/GunSystem.Battery.cs b/Content.Client/Weapons/Ranged/Systems/GunSystem.Battery.cs index 122244e7f2..0f1535e357 100644 --- a/Content.Client/Weapons/Ranged/Systems/GunSystem.Battery.cs +++ b/Content.Client/Weapons/Ranged/Systems/GunSystem.Battery.cs @@ -14,6 +14,10 @@ public sealed partial class GunSystem // Projectile SubscribeLocalEvent(OnControl); SubscribeLocalEvent(OnAmmoCountUpdate); + + // TwoModeEnergy + SubscribeLocalEvent(OnControl); + SubscribeLocalEvent(OnAmmoCountUpdate); } private void OnAmmoCountUpdate(EntityUid uid, BatteryAmmoProviderComponent component, UpdateAmmoCounterEvent args) diff --git a/Content.Client/Weapons/Ranged/Systems/GunSystem.MagazineVisuals.cs b/Content.Client/Weapons/Ranged/Systems/GunSystem.MagazineVisuals.cs index 2d670d1e77..6e358ae77d 100644 --- a/Content.Client/Weapons/Ranged/Systems/GunSystem.MagazineVisuals.cs +++ b/Content.Client/Weapons/Ranged/Systems/GunSystem.MagazineVisuals.cs @@ -28,6 +28,18 @@ public sealed partial class GunSystem sprite.LayerSetState(GunVisualLayers.MagUnshaded, $"{component.MagState}-unshaded-{component.MagSteps - 1}"); sprite.LayerSetVisible(GunVisualLayers.MagUnshaded, false); } + + if (sprite.LayerMapTryGet(GunVisualLayers.TwoModeFirst, out _)) + { + sprite.LayerSetState(GunVisualLayers.TwoModeFirst, $"{component.MagState}-twomode1-{component.MagSteps - 1}"); + sprite.LayerSetVisible(GunVisualLayers.TwoModeFirst, false); + } + + if (sprite.LayerMapTryGet(GunVisualLayers.TwoModeSecond, out _)) + { + sprite.LayerSetState(GunVisualLayers.TwoModeSecond, $"{component.MagState}-twomode2-{component.MagSteps - 1}"); + sprite.LayerSetVisible(GunVisualLayers.TwoModeSecond, false); + } } private void OnMagazineVisualsChange(EntityUid uid, MagazineVisualsComponent component, ref AppearanceChangeEvent args) @@ -67,6 +79,16 @@ public sealed partial class GunSystem sprite.LayerSetVisible(GunVisualLayers.MagUnshaded, false); } + if (sprite.LayerMapTryGet(GunVisualLayers.TwoModeFirst, out _)) + { + sprite.LayerSetVisible(GunVisualLayers.TwoModeFirst, false); + } + + if (sprite.LayerMapTryGet(GunVisualLayers.TwoModeSecond, out _)) + { + sprite.LayerSetVisible(GunVisualLayers.TwoModeSecond, false); + } + return; } @@ -81,6 +103,27 @@ public sealed partial class GunSystem sprite.LayerSetVisible(GunVisualLayers.MagUnshaded, true); sprite.LayerSetState(GunVisualLayers.MagUnshaded, $"{component.MagState}-unshaded-{step}"); } + + if (!args.AppearanceData.TryGetValue(AmmoVisuals.InStun, out var inStun) || inStun is true) + { + if (sprite.LayerMapTryGet(GunVisualLayers.TwoModeFirst, out var _)) + { + sprite.LayerSetVisible(GunVisualLayers.TwoModeSecond, false); + sprite.LayerSetVisible(GunVisualLayers.TwoModeFirst, true); + sprite.LayerSetState(GunVisualLayers.TwoModeFirst, $"{component.MagState}-twomode1-{step}"); + } + } + + else if (inStun is false) + { + if (sprite.LayerMapTryGet(GunVisualLayers.TwoModeSecond, out var _)) + { + sprite.LayerSetVisible(GunVisualLayers.TwoModeFirst, false); + sprite.LayerSetVisible(GunVisualLayers.TwoModeSecond, true); + sprite.LayerSetState(GunVisualLayers.TwoModeSecond, $"{component.MagState}-twomode2-{step}"); + + } + } } else { @@ -93,6 +136,16 @@ public sealed partial class GunSystem { sprite.LayerSetVisible(GunVisualLayers.MagUnshaded, false); } + + if (sprite.LayerMapTryGet(GunVisualLayers.TwoModeFirst, out _)) + { + sprite.LayerSetVisible(GunVisualLayers.TwoModeFirst, false); + } + + if (sprite.LayerMapTryGet(GunVisualLayers.TwoModeSecond, out _)) + { + sprite.LayerSetVisible(GunVisualLayers.TwoModeSecond, false); + } } } } diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs index f4deffd113..0c1e85f24d 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs @@ -2,6 +2,7 @@ using Content.Server.Power.Components; using Content.Shared.Damage; using Content.Shared.Damage.Events; using Content.Shared.FixedPoint; +using Content.Shared.Interaction.Events; using Content.Shared.Projectiles; using Content.Shared.Weapons.Ranged; using Content.Shared.Weapons.Ranged.Components; @@ -11,6 +12,8 @@ namespace Content.Server.Weapons.Ranged.Systems; public sealed partial class GunSystem { + [Dependency] private readonly SharedAudioSystem _audio = default!; + protected override void InitializeBattery() { base.InitializeBattery(); @@ -24,6 +27,41 @@ public sealed partial class GunSystem SubscribeLocalEvent(OnBatteryStartup); SubscribeLocalEvent(OnBatteryChargeChange); SubscribeLocalEvent(OnBatteryDamageExamine); + + //TwoModeEnergy + SubscribeLocalEvent(OnBatteryStartup); + SubscribeLocalEvent(OnBatteryChargeChange); + SubscribeLocalEvent(OnBatteryDamageExamine); + SubscribeLocalEvent(OnBatteryModeChange); + } + + private void OnBatteryModeChange(EntityUid uid, TwoModeEnergyAmmoProviderComponent component, UseInHandEvent args) + { + if (!TryComp(uid, out var gun)) + return; + + if (component.CurrentMode == EnergyModes.Stun) + { + component.InStun = false; + gun.SoundGunshot = component.HitscanSound; + component.CurrentMode = EnergyModes.Laser; + component.FireCost = component.HitscanFireCost; + _audio.PlayPvs(component.ToggleSound, args.User); + } + else if (component.CurrentMode == EnergyModes.Laser) + { + component.InStun = true; + gun.SoundGunshot = component.ProjSound; + component.CurrentMode = EnergyModes.Stun; + component.FireCost = component.ProjFireCost; + _audio.PlayPvs(component.ToggleSound, args.User); + } + UpdateShots(uid, component); + UpdateTwoModeAppearance(uid, component); + UpdateBatteryAppearance(uid, component); + UpdateAmmoCount(uid); + Dirty(gun); + Dirty(component); } private void OnBatteryStartup(EntityUid uid, BatteryAmmoProviderComponent component, ComponentStartup args) @@ -66,12 +104,24 @@ public sealed partial class GunSystem if (damageSpec == null) return; - var damageType = component switch + string? damageType; + switch (component) { - HitscanBatteryAmmoProviderComponent => Loc.GetString("damage-hitscan"), - ProjectileBatteryAmmoProviderComponent => Loc.GetString("damage-projectile"), - _ => throw new ArgumentOutOfRangeException(), - }; + case HitscanBatteryAmmoProviderComponent: + damageType = Loc.GetString("damage-hitscan"); + break; + case ProjectileBatteryAmmoProviderComponent: + damageType = Loc.GetString("damage-projectile"); + break; + case TwoModeEnergyAmmoProviderComponent twoMode: + if (twoMode.CurrentMode == EnergyModes.Stun) + damageType = Loc.GetString("damage-projectile"); + else + damageType = Loc.GetString("damage-hitscan"); + break; + default: + throw new ArgumentOutOfRangeException(); + } _damageExamine.AddDamageExamine(args.Message, damageSpec, damageType); } @@ -99,6 +149,25 @@ public sealed partial class GunSystem return ProtoManager.Index(hitscan.Prototype).Damage; } + if (component is TwoModeEnergyAmmoProviderComponent twoMode) + { + if (twoMode.CurrentMode == EnergyModes.Stun) + { + if (ProtoManager.Index(twoMode.ProjectilePrototype).Components + .TryGetValue(_factory.GetComponentName(typeof(ProjectileComponent)), out var projectile)) + { + var p = (ProjectileComponent) projectile.Component; + + if (p.Damage.Total > FixedPoint2.Zero) + { + return p.Damage; + } + } + + return null; + } + return ProtoManager.Index(twoMode.HitscanPrototype).Damage; + } return null; } diff --git a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs index 350dd85d69..dc5be423a9 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs @@ -16,7 +16,7 @@ public partial class GunComponent : Component #region Sound [ViewVariables(VVAccess.ReadWrite), DataField("soundGunshot")] - public SoundSpecifier? SoundGunshot = new SoundPathSpecifier("/Audio/Weapons/Guns/Gunshots/smg.ogg"); + public SoundSpecifier? SoundGunshot { get; set; } = new SoundPathSpecifier("/Audio/Weapons/Guns/Gunshots/smg.ogg"); [ViewVariables(VVAccess.ReadWrite), DataField("soundEmpty")] public SoundSpecifier? SoundEmpty = new SoundPathSpecifier("/Audio/Weapons/Guns/Empty/empty.ogg"); diff --git a/Content.Shared/Weapons/Ranged/Components/TwoModeEnergyAmmoProviderComponent.cs b/Content.Shared/Weapons/Ranged/Components/TwoModeEnergyAmmoProviderComponent.cs new file mode 100644 index 0000000000..5d089287b8 --- /dev/null +++ b/Content.Shared/Weapons/Ranged/Components/TwoModeEnergyAmmoProviderComponent.cs @@ -0,0 +1,43 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Shared.Weapons.Ranged.Components; + +[RegisterComponent, NetworkedComponent] +public sealed class TwoModeEnergyAmmoProviderComponent : BatteryAmmoProviderComponent +{ + [ViewVariables(VVAccess.ReadOnly), + DataField("projProto", required: true, customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ProjectilePrototype = default!; + + [ViewVariables(VVAccess.ReadOnly), + DataField("hitscanProto", required: true, customTypeSerializer: typeof(PrototypeIdSerializer))] + public string HitscanPrototype = default!; + + [ViewVariables(VVAccess.ReadOnly), DataField("projFireCost")] + public float ProjFireCost = 50; + + [ViewVariables(VVAccess.ReadOnly), DataField("hitscanFireCost")] + public float HitscanFireCost = 100; + + [ViewVariables(VVAccess.ReadOnly), DataField("currentMode")] + public EnergyModes CurrentMode { get; set; } = EnergyModes.Stun; + + [ViewVariables(VVAccess.ReadOnly), DataField("projSound")] + public SoundSpecifier? ProjSound = new SoundPathSpecifier("/Audio/Weapons/Guns/Gunshots/taser2.ogg"); + + [ViewVariables(VVAccess.ReadOnly), DataField("hitscanSound")] + public SoundSpecifier? HitscanSound = new SoundPathSpecifier("/Audio/Weapons/Guns/Gunshots/laser_cannon.ogg"); + + public SoundSpecifier? ToggleSound = new SoundPathSpecifier("/Audio/Weapons/Guns/Misc/egun_toggle.ogg"); + + [ViewVariables(VVAccess.ReadOnly)] public bool InStun = true; +} + +public enum EnergyModes +{ + Stun, + Laser +} diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Battery.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Battery.cs index ecbd19d517..e5902e6189 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Battery.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Battery.cs @@ -1,4 +1,5 @@ using Content.Shared.Examine; +using Content.Shared.Item; using Content.Shared.Weapons.Ranged.Components; using Content.Shared.Weapons.Ranged.Events; using Robust.Shared.GameStates; @@ -9,6 +10,8 @@ namespace Content.Shared.Weapons.Ranged.Systems; public abstract partial class SharedGunSystem { + [Dependency] private readonly SharedItemSystem _item = default!; + protected virtual void InitializeBattery() { // Trying to dump comp references hence the below @@ -25,6 +28,62 @@ public abstract partial class SharedGunSystem SubscribeLocalEvent(OnBatteryTakeAmmo); SubscribeLocalEvent(OnBatteryAmmoCount); SubscribeLocalEvent(OnBatteryExamine); + + // TwoModeEnergy + SubscribeLocalEvent(OnTwoModeInit); + SubscribeLocalEvent(OnBatteryTwoModeGetState); + SubscribeLocalEvent(OnBatteryTwoModeHandleState); + SubscribeLocalEvent(OnBatteryTakeAmmo); + SubscribeLocalEvent(OnBatteryAmmoCount); + SubscribeLocalEvent(OnBatteryExamine); + } + + + private void OnTwoModeInit(EntityUid uid, TwoModeEnergyAmmoProviderComponent component, ComponentInit args) + { + if (!Timing.IsFirstTimePredicted || !TryComp(component.Owner, out var appearance)) return; + + Appearance.SetData(appearance.Owner, AmmoVisuals.InStun, component.InStun, appearance); + } + + private void OnBatteryTwoModeHandleState(EntityUid uid, TwoModeEnergyAmmoProviderComponent component, ref ComponentHandleState args) + { + if (args.Current is not TwoModeComponentState state) + return; + + component.Shots = state.Shots; + component.Capacity = state.MaxShots; + component.FireCost = state.FireCost; + component.CurrentMode = state.CurrentMode; + component.InStun = state.InStun; + } + + private void OnBatteryTwoModeGetState(EntityUid uid, TwoModeEnergyAmmoProviderComponent component, ref ComponentGetState args) + { + args.State = new TwoModeComponentState() + { + Shots = component.Shots, + MaxShots = component.Capacity, + FireCost = component.FireCost, + CurrentMode = component.CurrentMode, + InStun = component.InStun + }; + } + + protected void UpdateTwoModeAppearance(EntityUid uid, TwoModeEnergyAmmoProviderComponent component) + { + if (!TryComp(uid, out var appearance)) + return; + if (!TryComp(uid, out var item)) + return; + + if (component.InStun) + _item.SetHeldPrefix(uid, null, item); + else + _item.SetHeldPrefix(uid, "laser", item); + + + Appearance.SetData(uid, AmmoVisuals.InStun, component.InStun, appearance); } private void OnBatteryHandleState(EntityUid uid, BatteryAmmoProviderComponent component, ref ComponentHandleState args) @@ -101,6 +160,13 @@ public abstract partial class SharedGunSystem return (ent, EnsureShootable(ent)); case HitscanBatteryAmmoProviderComponent hitscan: return (null, ProtoManager.Index(hitscan.Prototype)); + case TwoModeEnergyAmmoProviderComponent twoMode: + if (twoMode.CurrentMode == EnergyModes.Stun) + { + var projEnt = Spawn(twoMode.ProjectilePrototype, coordinates); + return (projEnt, EnsureComp(projEnt)); + } + return (null, ProtoManager.Index(twoMode.HitscanPrototype)); default: throw new ArgumentOutOfRangeException(); } @@ -113,4 +179,14 @@ public abstract partial class SharedGunSystem public int MaxShots; public float FireCost; } + + [Serializable, NetSerializable] + public sealed class TwoModeComponentState : ComponentState + { + public EnergyModes CurrentMode { get; init; } + public int Shots; + public int MaxShots; + public float FireCost; + public bool InStun; + } } diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs index 852096a386..54d7de3540 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs @@ -20,9 +20,20 @@ public abstract partial class SharedGunSystem ("mode", GetLocSelector(component.SelectedMode)))); args.PushMarkup(Loc.GetString("gun-fire-rate-examine", ("color", FireRateExamineColor), ("fireRate", $"{component.FireRate:0.0}"))); + + if (!TryComp(uid, out var comp)) + return; + + args.PushMarkup(Loc.GetString("gun-twomode-mode-examine", ("color", TwoModeExamineColor), + ("mode", GetLocMode(comp.CurrentMode)))); } } + private object GetLocMode(EnergyModes mode) + { + return Loc.GetString($"gun-twomode-{mode.ToString()}"); + } + private string GetLocSelector(SelectiveFire mode) { return Loc.GetString($"gun-{mode.ToString()}"); diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index 06667857b3..f302a8a9d6 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -67,6 +67,7 @@ public abstract partial class SharedGunSystem : EntitySystem protected const string AmmoExamineColor = "yellow"; protected const string FireRateExamineColor = "yellow"; protected const string ModeExamineColor = "cyan"; + protected const string TwoModeExamineColor = "red"; public override void Initialize() { @@ -501,4 +502,5 @@ public enum AmmoVisuals : byte HasAmmo, // used for generic visualizers. c# stuff can just check ammocount != 0 MagLoaded, BoltClosed, + InStun } diff --git a/Resources/Audio/Weapons/Guns/Misc/egun_toggle.ogg b/Resources/Audio/Weapons/Guns/Misc/egun_toggle.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b993f8a28681d408097bcd41c734401d3e8c1815 GIT binary patch literal 6694 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 aAJ(4 zRF50-H5>4-Ua+(~8h%4CH*)U+g(-~h8d|)KOguJfzIto@VcYctiRC*K&P?1FWGc_v zv+wPR*vic;$6kBtdET3RH!#}wz=xnE@9ej3t|*FL$K~e#F7|rAh6I0>fgWRG-xv00 znleeQz4e!UZ3forEX98==RL+H>1a_iWgN! z`IW!5nI(Q$*2(_uTxf=p?nZXui9Z>Z9a<=^bh&vQ>q5N~rxq91P4_iB^X~uO=WlQG zzTX(Nw(a^EuB{ANYZ$LEt=PyGz`fv@l!I=AR5k;Kpn{)`zts83&5_s6bJpq4N++^$DEhdrYz)d$SSphu!ya_**(W7~XYVh5ezIWEsqIc3w^x+rFRpv= z+wNRNr|LILh6kJOvN4!Vza`#cXkgH0yzhKXveM?SCwT(AW~%8cMxI<)`cIfafaPEi z+xfOo$>t{u9g06UtStI@QYT^ZKVcCkiTmGuCr^*qG^zQT)b;Dv)i|1#>dl&`?z^>W zyW>3dv%mS}KmHEpm0mud{Wp7j;OeXQY~qZ?CI}q*ar<`0C!yEx*E(nSmT0xQC>>lf zB~5bv|HMPv9kxmt+}-K)|1{gI+3ec;-mmvr#hGk+pfpxSUiRSL9S!fwCi*Qcxcv6f zlP4*f!Syo=zB49dXP;gYta<0opF_769{AY*z96<-r)?t74NVcA=jBKJ%B}dHpMLu3 z68rxdiD!2evobuGvw5ylqDr$n&xxWwx4nD}FTPd*(G6X(|GOVJmvy^}9b;s;FU6Z; zDc_l%Bv|9CQyLo2a*ZL2@k#{q3f6#R-UVU~y`~LO45kDGjkhwMz9lw)`bwS&L9=>{ z?^W;5pQ?Lg#_wv^ZM)M|FEtqa_`U51hvacbyZP-wr#KYjj&u~*Db7Ey{Mcfnd8X2H zW+%0+NA+*#s)UDM{Oc^W(n^sn*Iv9| zyZEH{hg$jbriw{+ir;Rwtjs>3a!9uF#nJNJ5v!jR+{sG3TROk=tm}F8BcBvaE_Lts z4o|T>?zhk&SS;X-`jKy{KX!=UUvYinUjDQwjc3AdYEYBxv#Zh{*qx6hWveSY2m!M( NgQu&X%Q~loCII zRF50-H5>4-Ua+(~8h%4CH*)U+g(-~h8d|)KOguJfzIto@VcYctiRC*K&P?1FWGc_v zv+wPR*vic;$6kBtdET3RH!#}wz=xnE@9ej3t|*FL$K~e#F7|rAh6I0>fgWRG-xv00 znleeQz4Uyn;1gF)ym1hIvD=Ug-Ck>R!AL=A7P?*;K68DiFk> zD4FcVQz)Y+>%MpAsrwDH4>B-Z;CD8um0$N->-FtFNlsfiPw`q%Cz~- zj4xj>ANcldTa5P9g7W(Qu(fR)Zo3}c6t`!-p<3+qvt9dl?K<-EW%B&K!>PX_MR&eq zZc;dLw$&-hezS;WU+SdE9pu?hT(>I%L z_IoEAQh~gAfUiXvkPploX@o6__akN;Lj;+6*&l<#|5v}y7)wqFm=>r6B{d4%)pq36#x zv9(;U-SSF0ql}MNkj3kM)5$vyH~zDp(fpKVFvDuqeD^%TnHIZbXJ63lc<_7na^_?o zE=9M@kB=XhS*|~k+QnYfbu#tkgcoAgQ`ZBH;9mDyEH3-dnmY%gR< zRF50-H5>4-Ua+(~8h%4CH*)U+g(-~h8d|)KOguJfzIto@VcYctiRC*K&P?1FWGc_v zv+wPR*vic;$6kBtdET3RH!#}wz=xnE@9ej3t|*FL$K~e#F7|rAh6I0>fgWRG-xv00 znleeQz47mJS?I$bF2QDg*t@yo{eZi)bbFCAb zROhKo>YVaw!;xJklepKZYbwrtDl)O>Ci@1aFKNLuiVq0L&oFj=@>fdbNpt-^X|X4g z*Rr;Lm~?XypF^*pgKUG8a)T9vsT)HnLsk#ND~2l)j8_;}7&5J34oGGRVD}I@FMR9s zk&Kzy)5H{7E}V|r%xB}D@q6vwFQprqES~=gIW=)gkxGk1YL2v%PI{$m#^3K3KOcD! zaxLHT`S!x=d;5Mf-~V1H!SZJEY*vPt(%lRP!n}U>7_hM&E0DM{L+{=3ve%1c6_#FE zs^FkH{qWJJ{tONhZPJl8vwfDDYW<9zlBMo*?R9?{yGkc#m;W_8ue}~;`{{7>P@BY1bL0MDS>aVXJni{hfp4(bq&=4fB zVbNm;&DJfcic`G|6BT$d1NZLD^NSYy_4odYC*_3~GY%BanJKl*>cNVb zYwKP!F@&ry|6j8=?*5NQ@eqYGuuN6;Tr^CIpNs z$?CFic5+kKx}N#5H|hA@(?Z$`T6H#J^OcfsYlv`72+BJ5b8|<>H({<;CZlb0e@sv- zvsXyE7x8D+?W42b=GJ6xXT0xkc5}wbzb%#KiJ?i>3Ovr=Zb-++#4Vb1dZ7r*gdnwB zti|7ih2A%`o@=Prb#*zfy>yw%nqP$v=45L=)zFI5WM%keIn6limz0Rpix4ef$UADb zE_%E`gylo6y#G{z&GRSx$UAf>{eaCP>mvJZd7gK-wq88Y_t@s8>Gi$yC!FA4xH9rj z>~5vkyDYS(Pk+VK^|$3n9jD!#qvf}9Q;r|i;W}E^bdw)7ko4mY$UhN{X|NUDeG{06 O89ZJ6T-G@yGywpb+sEht literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode1-0.png b/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode1-0.png new file mode 100644 index 0000000000000000000000000000000000000000..4db92c967da8fac76dd1705058c0446cc3635fef GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!VDw>HYaZfQbGYfA+84w9GJ<#@SlNgDi1@N zF+&;yL+kkyp+H&2k|4ie28U-ifI9;N!wQN@zkdlX z`1tjSmbb3fxija3H-s8oG=A_%=e&>RNrs}H-W?XkLB^Mjy%gp=nsj7Rh(fTYss2`t zy+(GX+ZQYe>g+aF-Mm6VBj?1?nPF3A%;rjBE?u_dnMzob$twxw-jn*8dMDUtCZ{Y* z&RCUvV(FR(ubwk)lV!*WRP|l@k|`VLE)7o?#}JF&q`W0)i&( mCmE)m7jl@n+wGvn0Vak3R>okPn&U1&Jq(_%elF{r5}E*({b)G= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode1-1.png b/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..057e117738412014f6b7b39f13426a86c8a9abf9 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$ef*8>L*FwFd)cIJPl^v0h+ zLB^6GzhDN3XE)M-95GK9#}J9B$q5VC6G|G4W=OqAlK;xU&{@N9gmsZn9#92?r>mdK II;Vst02@LdW&i*H literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode1-2.png b/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode1-2.png new file mode 100644 index 0000000000000000000000000000000000000000..93421c8792e389a13d1685f8d8e7030e585dd399 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$ef*8>L*FwFd)cIJPl^v0h+ zLB^6GzhDN3XE)M-95GK9#}J9B$q5VC6G~c*X6$;AB>$CxVe(Ig%i3RcWq>LeJYD@< J);T3K0RTKxAmac4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode1-3.png b/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode1-3.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b1342a6e1f0f72e247131361e9443b5f81464e GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$ef*8>L*FwFd)cIJPl^v0h+ zLB^6GzhDN3XE)M-90^Ys#}J9B$q5VC6G}uI4QA{zd6A@em4RXJMn-L*FwFd)cIJPl^v0h+ zLB^6GzhDN3XE)M-94Sv1#}J9B$q5VC6G}um8H{J_G7-CQ)GdpVA$bGif7ux6K%goH MPgg&ebxsLQ0E5aO;{X5v literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode2-0.png b/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode2-0.png new file mode 100644 index 0000000000000000000000000000000000000000..4db92c967da8fac76dd1705058c0446cc3635fef GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!VDw>HYaZfQbGYfA+84w9GJ<#@SlNgDi1@N zF+&;yL+kkyp+H&2k|4ie28U-ifI9;N!wQN@zkdlX z`1tjSmbb3fxija3H-s8oG=A_%=e&>RNrs}H-W?XkLB^Mjy%gp=nsj7Rh(fTYss2`t zy+(GX+ZQYe>g+aF-Mm6VBj?1?nPF3A%;rjBE?u_dnMzob$twxw-jn*8dMDUtCZ{Y* z&RCUvV(FR(ubwk)lV!*WRP|l@k|`VLE)7o?#}JF&q`W0)i&( mCmE)m7jl@n+wGvn0Vak3R>okPn&U1&Jq(_%elF{r5}E*({b)G= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode2-1.png b/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..f000d0bd6dd2d6dfe2629771be7ad306ac1dffe2 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$ef*8>L*oMB-2&%hA6_J$Zx zkg+7lFPOpM*^M+HN6gd3F+^f&a>4@kgpvlM8B#BjFVdQ I&MBb@0EJr}3IG5A literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode2-2.png b/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode2-2.png new file mode 100644 index 0000000000000000000000000000000000000000..f7dd0fc86ddf8f28a42ae902594ff1bdae1f86a7 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$ef*8>L*oMB-2&%hA6_J$Zx zkg+7lFPOpM*^M+HN6gd3F+^f&a>4@kgpyXH8M|I2$$w>FnEaFBvi4V98K4RVPgg&e IbxsLQ0H$mnhX4Qo literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode2-3.png b/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode2-3.png new file mode 100644 index 0000000000000000000000000000000000000000..960d8f9c812d9216201f5379149b5651a01a9563 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$ef*8>L*oMB-2&%hA6_J$Zx zkg+7lFPOpM*^M+HN5a#^F+^f&a>4@kgc8w4gBiO_UL+}AWnkF5k&)kRb)f}N4TGnv KpUXO@geCyT%N_mz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode2-4.png b/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/mag-twomode2-4.png new file mode 100644 index 0000000000000000000000000000000000000000..3db83e4dc98681ecdf1d56447ca85cf822b4faba GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$ef*8>L*oMB-2&%hA6_J$Zx zkg+7lFPOpM*^M+HN6OR1F+^f&a>4@kgc4Cs2ICpKOvEl6b<1L8NZ!EsUp7WM5U7g5 M)78&qol`;+0OWHWhX4Qo literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/meta.json new file mode 100644 index 0000000000..e503b81db7 --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Guns/Battery/egun.rsi/meta.json @@ -0,0 +1,79 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from White at https://github.com/frosty-dev/white", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "base" + }, + { + "name": "mag-twomode1-0", + "delays": [ + [ + 0.3, + 0.3 + ] + ] + }, + { + "name": "mag-twomode1-1" + }, + { + "name": "mag-twomode1-2" + }, + { + "name": "mag-twomode1-3" + }, + { + "name": "mag-twomode1-4" + }, + { + "name": "mag-twomode2-0", + "delays": [ + [ + 0.3, + 0.3 + ] + ] + }, + { + "name": "mag-twomode2-1" + }, + { + "name": "mag-twomode2-2" + }, + { + "name": "mag-twomode2-3" + }, + { + "name": "mag-twomode2-4" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "laser-inhand-left", + "directions": 4 + }, + { + "name": "laser-inhand-right", + "directions": 4 + }, + { + "name": "equipped-BACKPACK", + "directions": 4 + } + ] +}