diff --git a/Content.Server/Ninja/Systems/StunProviderSystem.cs b/Content.Server/Ninja/Systems/StunProviderSystem.cs index 70182e0e36..097058f4d3 100644 --- a/Content.Server/Ninja/Systems/StunProviderSystem.cs +++ b/Content.Server/Ninja/Systems/StunProviderSystem.cs @@ -1,12 +1,15 @@ using Content.Server.Ninja.Events; using Content.Server.Power.EntitySystems; -using Content.Shared.Electrocution; +using Content.Shared.Damage; +using Content.Shared.Damage.Prototypes; using Content.Shared.Interaction; using Content.Shared.Ninja.Components; using Content.Shared.Ninja.Systems; using Content.Shared.Popups; +using Content.Shared.Stunnable; using Content.Shared.Whitelist; using Robust.Shared.Audio; +using Robust.Shared.Prototypes; using Robust.Shared.Timing; namespace Content.Server.Ninja.Systems; @@ -17,11 +20,13 @@ namespace Content.Server.Ninja.Systems; public sealed class StunProviderSystem : SharedStunProviderSystem { [Dependency] private readonly BatterySystem _battery = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedElectrocutionSystem _electrocution = default!; [Dependency] private readonly SharedNinjaGlovesSystem _gloves = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedStunSystem _stun = default!; public override void Initialize() { @@ -55,8 +60,9 @@ public sealed class StunProviderSystem : SharedStunProviderSystem _audio.PlayPvs(comp.Sound, target); - // not holding hands with target so insuls don't matter - _electrocution.TryDoElectrocution(target, uid, comp.StunDamage, comp.StunTime, false, ignoreInsulation: true); + _damageable.TryChangeDamage(target, comp.StunDamage, false, true, null, origin: uid); + _stun.TryParalyze(target, comp.StunTime, refresh: false); + // short cooldown to prevent instant stunlocking comp.NextStun = _timing.CurTime + comp.Cooldown; diff --git a/Content.Shared/Ninja/Components/StunProviderComponent.cs b/Content.Shared/Ninja/Components/StunProviderComponent.cs index e8eb25a1b6..37a27074a4 100644 --- a/Content.Shared/Ninja/Components/StunProviderComponent.cs +++ b/Content.Shared/Ninja/Components/StunProviderComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Damage; using Content.Shared.Ninja.Systems; using Content.Shared.Whitelist; using Robust.Shared.Audio; @@ -17,49 +18,55 @@ public sealed partial class StunProviderComponent : Component /// The powercell entity to take power from. /// Determines whether stunning is possible. /// - [DataField("batteryUid"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public EntityUid? BatteryUid; /// /// Sound played when stunning someone. /// - [DataField("sound"), ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite)] public SoundSpecifier Sound = new SoundCollectionSpecifier("sparks"); /// /// Joules required in the battery to stun someone. Defaults to 10 uses on a small battery. /// - [DataField("stunCharge"), ViewVariables(VVAccess.ReadWrite)] - public float StunCharge = 36.0f; + [DataField, ViewVariables(VVAccess.ReadWrite)] + public float StunCharge = 36f; /// - /// Shock damage dealt when stunning someone + /// Damage dealt when stunning someone /// - [DataField("stunDamage"), ViewVariables(VVAccess.ReadWrite)] - public int StunDamage = 5; + [DataField, ViewVariables(VVAccess.ReadWrite)] + public DamageSpecifier StunDamage = new() + { + DamageDict = new() + { + { "Shock", 5 } + } + }; /// /// Time that someone is stunned for, stacks if done multiple times. /// - [DataField("stunTime"), ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite)] public TimeSpan StunTime = TimeSpan.FromSeconds(5); /// /// How long stunning is disabled after stunning something. /// - [DataField("cooldown"), ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite)] public TimeSpan Cooldown = TimeSpan.FromSeconds(2); /// /// Locale string to popup when there is no power /// - [DataField("noPowerPopup", required: true), ViewVariables(VVAccess.ReadWrite)] + [DataField(required: true), ViewVariables(VVAccess.ReadWrite)] public string NoPowerPopup = string.Empty; /// /// Whitelist for what counts as a mob. /// - [DataField("whitelist")] + [DataField] public EntityWhitelist Whitelist = new() { Components = new[] {"Stamina"} @@ -69,6 +76,6 @@ public sealed partial class StunProviderComponent : Component /// When someone can next be stunned. /// Essentially a UseDelay unique to this component. /// - [DataField("nextStun", customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite)] + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite)] public TimeSpan NextStun = TimeSpan.Zero; } diff --git a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml index ddecf376e7..8fcc62dcb0 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml @@ -213,8 +213,6 @@ stripTimeReduction: 1 stealthy: true - type: NinjaGloves - # not actually electrified, just used to make stun ability work - - type: Electrified - type: entity parent: ClothingHandsGlovesColorBlack