Disarm 1498 (#11016)
This commit is contained in:
@@ -2,14 +2,20 @@ using Content.Server.Damage.Components;
|
|||||||
using Content.Server.Damage.Events;
|
using Content.Server.Damage.Events;
|
||||||
using Content.Server.Popups;
|
using Content.Server.Popups;
|
||||||
using Content.Server.Weapon.Melee;
|
using Content.Server.Weapon.Melee;
|
||||||
|
using Content.Server.Administration.Logs;
|
||||||
|
using Content.Server.CombatMode;
|
||||||
using Content.Shared.Alert;
|
using Content.Shared.Alert;
|
||||||
using Content.Shared.Rounding;
|
using Content.Shared.Rounding;
|
||||||
using Content.Shared.Stunnable;
|
using Content.Shared.Stunnable;
|
||||||
|
using Content.Shared.Database;
|
||||||
|
using Content.Shared.IdentityManagement;
|
||||||
|
using Content.Shared.Popups;
|
||||||
using Robust.Shared.Collections;
|
using Robust.Shared.Collections;
|
||||||
using Robust.Shared.Physics.Dynamics;
|
using Robust.Shared.Physics.Dynamics;
|
||||||
using Robust.Shared.Player;
|
using Robust.Shared.Player;
|
||||||
using Robust.Shared.Timing;
|
using Robust.Shared.Timing;
|
||||||
using Robust.Shared.Audio;
|
using Robust.Shared.Audio;
|
||||||
|
using Robust.Shared.Random;
|
||||||
|
|
||||||
|
|
||||||
namespace Content.Server.Damage.Systems;
|
namespace Content.Server.Damage.Systems;
|
||||||
@@ -20,6 +26,8 @@ public sealed class StaminaSystem : EntitySystem
|
|||||||
[Dependency] private readonly AlertsSystem _alerts = default!;
|
[Dependency] private readonly AlertsSystem _alerts = default!;
|
||||||
[Dependency] private readonly PopupSystem _popup = default!;
|
[Dependency] private readonly PopupSystem _popup = default!;
|
||||||
[Dependency] private readonly SharedStunSystem _stunSystem = 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 const float UpdateCooldown = 2f;
|
||||||
private float _accumulator;
|
private float _accumulator;
|
||||||
@@ -36,10 +44,11 @@ public sealed class StaminaSystem : EntitySystem
|
|||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
SubscribeLocalEvent<StaminaDamageOnCollideComponent, StartCollideEvent>(OnCollide);
|
|
||||||
SubscribeLocalEvent<StaminaDamageOnHitComponent, MeleeHitEvent>(OnHit);
|
|
||||||
SubscribeLocalEvent<StaminaComponent, ComponentStartup>(OnStartup);
|
SubscribeLocalEvent<StaminaComponent, ComponentStartup>(OnStartup);
|
||||||
SubscribeLocalEvent<StaminaComponent, ComponentShutdown>(OnShutdown);
|
SubscribeLocalEvent<StaminaComponent, ComponentShutdown>(OnShutdown);
|
||||||
|
SubscribeLocalEvent<StaminaComponent, DisarmedEvent>(OnDisarmed);
|
||||||
|
SubscribeLocalEvent<StaminaDamageOnCollideComponent, StartCollideEvent>(OnCollide);
|
||||||
|
SubscribeLocalEvent<StaminaDamageOnHitComponent, MeleeHitEvent>(OnHit);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnShutdown(EntityUid uid, StaminaComponent component, ComponentShutdown args)
|
private void OnShutdown(EntityUid uid, StaminaComponent component, ComponentShutdown args)
|
||||||
@@ -52,6 +61,32 @@ public sealed class StaminaSystem : EntitySystem
|
|||||||
SetStaminaAlert(uid, component);
|
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)
|
private void OnHit(EntityUid uid, StaminaDamageOnHitComponent component, MeleeHitEvent args)
|
||||||
{
|
{
|
||||||
if (component.Damage <= 0f) return;
|
if (component.Damage <= 0f) return;
|
||||||
|
|||||||
@@ -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 Content.Shared.Stunnable;
|
||||||
using Robust.Shared.Audio;
|
|
||||||
using Robust.Shared.Player;
|
|
||||||
using Robust.Shared.Random;
|
|
||||||
|
|
||||||
namespace Content.Server.Stunnable
|
namespace Content.Server.Stunnable
|
||||||
{
|
{
|
||||||
public sealed class StunSystem : SharedStunSystem
|
public sealed class StunSystem : SharedStunSystem
|
||||||
{
|
{}
|
||||||
[Dependency] private readonly IRobustRandom _random = default!;
|
|
||||||
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
|
||||||
|
|
||||||
public override void Initialize()
|
|
||||||
{
|
|
||||||
base.Initialize();
|
|
||||||
|
|
||||||
SubscribeLocalEvent<StatusEffectsComponent, DisarmedEvent>(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<KnockedDownComponent>(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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,10 +15,7 @@ namespace Content.Shared.CombatMode
|
|||||||
private TargetingZone _activeZone;
|
private TargetingZone _activeZone;
|
||||||
|
|
||||||
[DataField("disarmFailChance")]
|
[DataField("disarmFailChance")]
|
||||||
public readonly float BaseDisarmFailChance = 0.4f;
|
public readonly float BaseDisarmFailChance = 0.75f;
|
||||||
|
|
||||||
[DataField("pushChance")]
|
|
||||||
public readonly float BasePushFailChance = 0.4f;
|
|
||||||
|
|
||||||
[DataField("disarmFailSound")]
|
[DataField("disarmFailSound")]
|
||||||
public readonly SoundSpecifier DisarmFailSound = new SoundPathSpecifier("/Audio/Weapons/punchmiss.ogg");
|
public readonly SoundSpecifier DisarmFailSound = new SoundPathSpecifier("/Audio/Weapons/punchmiss.ogg");
|
||||||
|
|||||||
Reference in New Issue
Block a user