diff --git a/Content.Server/Damage/Systems/StaminaSystem.cs b/Content.Server/Damage/Systems/StaminaSystem.cs index 0076556c91..c5ed27f303 100644 --- a/Content.Server/Damage/Systems/StaminaSystem.cs +++ b/Content.Server/Damage/Systems/StaminaSystem.cs @@ -2,14 +2,20 @@ using Content.Server.Damage.Components; using Content.Server.Damage.Events; using Content.Server.Popups; using Content.Server.Weapon.Melee; +using Content.Server.Administration.Logs; +using Content.Server.CombatMode; using Content.Shared.Alert; using Content.Shared.Rounding; using Content.Shared.Stunnable; +using Content.Shared.Database; +using Content.Shared.IdentityManagement; +using Content.Shared.Popups; using Robust.Shared.Collections; using Robust.Shared.Physics.Dynamics; using Robust.Shared.Player; using Robust.Shared.Timing; using Robust.Shared.Audio; +using Robust.Shared.Random; namespace Content.Server.Damage.Systems; @@ -20,6 +26,8 @@ public sealed class StaminaSystem : EntitySystem [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly SharedStunSystem _stunSystem = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IAdminLogManager _adminLogger = default!; private const float UpdateCooldown = 2f; private float _accumulator; @@ -36,10 +44,11 @@ public sealed class StaminaSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnCollide); - SubscribeLocalEvent(OnHit); SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnDisarmed); + SubscribeLocalEvent(OnCollide); + SubscribeLocalEvent(OnHit); } private void OnShutdown(EntityUid uid, StaminaComponent component, ComponentShutdown args) @@ -52,6 +61,32 @@ public sealed class StaminaSystem : EntitySystem SetStaminaAlert(uid, component); } + private void OnDisarmed(EntityUid uid, StaminaComponent component, DisarmedEvent args) + { + if (args.Handled || !_random.Prob(args.PushProbability)) + return; + + if (component.Critical) + return; + + var damage = args.PushProbability * component.CritThreshold; + TakeStaminaDamage(uid, damage, component); + + // We need a better method of getting if the entity is going to resist stam damage, both this and the lines in the foreach at the end of OnHit() are awful + if (!component.Critical) + return; + + var targetEnt = Identity.Entity(args.Target, EntityManager); + var sourceEnt = Identity.Entity(args.Source, EntityManager); + + _popup.PopupEntity(Loc.GetString("stunned-component-disarm-success-others", ("source", sourceEnt), ("target", targetEnt)), targetEnt, Filter.PvsExcept(args.Source), PopupType.LargeCaution); + _popup.PopupCursor(Loc.GetString("stunned-component-disarm-success", ("target", targetEnt)), Filter.Entities(args.Source), PopupType.Large); + + _adminLogger.Add(LogType.DisarmedKnockdown, LogImpact.Medium, $"{ToPrettyString(args.Source):user} knocked down {ToPrettyString(args.Target):target}"); + + args.Handled = true; + } + private void OnHit(EntityUid uid, StaminaDamageOnHitComponent component, MeleeHitEvent args) { if (component.Damage <= 0f) return; diff --git a/Content.Server/Stunnable/Systems/StunSystem.cs b/Content.Server/Stunnable/Systems/StunSystem.cs index b341eb2021..8f793a0a13 100644 --- a/Content.Server/Stunnable/Systems/StunSystem.cs +++ b/Content.Server/Stunnable/Systems/StunSystem.cs @@ -1,53 +1,7 @@ -using Content.Server.Administration.Logs; -using Content.Server.CombatMode; -using Content.Server.Popups; -using Content.Shared.Audio; -using Content.Shared.Database; -using Content.Shared.IdentityManagement; -using Content.Shared.Popups; -using Content.Shared.StatusEffect; using Content.Shared.Stunnable; -using Robust.Shared.Audio; -using Robust.Shared.Player; -using Robust.Shared.Random; namespace Content.Server.Stunnable { public sealed class StunSystem : SharedStunSystem - { - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly IAdminLogManager _adminLogger = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnDisarmed); - } - - private void OnDisarmed(EntityUid uid, StatusEffectsComponent status, DisarmedEvent args) - { - if (args.Handled || !_random.Prob(args.PushProbability)) - return; - - if (!TryParalyze(uid, TimeSpan.FromSeconds(4f), true, status)) - return; - - var source = args.Source; - var target = args.Target; - - var knock = EntityManager.GetComponent(uid); - SoundSystem.Play(knock.StunAttemptSound.GetSound(), Filter.Pvs(source), source, AudioHelpers.WithVariation(0.025f)); - - var targetEnt = Identity.Entity(target, EntityManager); - var sourceEnt = Identity.Entity(source, EntityManager); - // TODO: Use PopupSystem - source.PopupMessageOtherClients(Loc.GetString("stunned-component-disarm-success-others", ("source", sourceEnt), ("target", targetEnt))); - source.PopupMessageCursor(Loc.GetString("stunned-component-disarm-success", ("target", targetEnt))); - - _adminLogger.Add(LogType.DisarmedKnockdown, LogImpact.Medium, $"{ToPrettyString(args.Source):user} knocked down {ToPrettyString(args.Target):target}"); - - args.Handled = true; - } - } + {} } diff --git a/Content.Shared/CombatMode/SharedCombatModeComponent.cs b/Content.Shared/CombatMode/SharedCombatModeComponent.cs index f72869d246..88fac66fec 100644 --- a/Content.Shared/CombatMode/SharedCombatModeComponent.cs +++ b/Content.Shared/CombatMode/SharedCombatModeComponent.cs @@ -15,10 +15,7 @@ namespace Content.Shared.CombatMode private TargetingZone _activeZone; [DataField("disarmFailChance")] - public readonly float BaseDisarmFailChance = 0.4f; - - [DataField("pushChance")] - public readonly float BasePushFailChance = 0.4f; + public readonly float BaseDisarmFailChance = 0.75f; [DataField("disarmFailSound")] public readonly SoundSpecifier DisarmFailSound = new SoundPathSpecifier("/Audio/Weapons/punchmiss.ogg");