Lag compensation for melee (#11885)
Co-authored-by: metalgearsloth <metalgearsloth@gmail.com>
This commit is contained in:
@@ -11,6 +11,7 @@ using Content.Shared.Weapons.Melee.Events;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Players;
|
||||
using Robust.Shared.Timing;
|
||||
using Robust.Shared.Utility;
|
||||
|
||||
@@ -109,7 +110,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
|
||||
if (weapon?.Owner != msg.Weapon)
|
||||
return;
|
||||
|
||||
AttemptAttack(args.SenderSession.AttachedEntity!.Value, weapon, msg);
|
||||
AttemptAttack(args.SenderSession.AttachedEntity!.Value, weapon, msg, args.SenderSession);
|
||||
}
|
||||
|
||||
private void OnStopHeavyAttack(StopHeavyAttackEvent msg, EntitySessionEventArgs args)
|
||||
@@ -147,7 +148,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
|
||||
if (userWeapon != weapon)
|
||||
return;
|
||||
|
||||
AttemptAttack(args.SenderSession.AttachedEntity.Value, weapon, msg);
|
||||
AttemptAttack(args.SenderSession.AttachedEntity.Value, weapon, msg, args.SenderSession);
|
||||
}
|
||||
|
||||
private void OnDisarmAttack(DisarmAttackEvent msg, EntitySessionEventArgs args)
|
||||
@@ -162,7 +163,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
|
||||
if (userWeapon == null)
|
||||
return;
|
||||
|
||||
AttemptAttack(args.SenderSession.AttachedEntity.Value, userWeapon, msg);
|
||||
AttemptAttack(args.SenderSession.AttachedEntity.Value, userWeapon, msg, args.SenderSession);
|
||||
}
|
||||
|
||||
private void OnGetState(EntityUid uid, MeleeWeaponComponent component, ref ComponentGetState args)
|
||||
@@ -219,7 +220,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
|
||||
if (!TryComp<TransformComponent>(target, out var targetXform))
|
||||
return;
|
||||
|
||||
AttemptAttack(user, weapon, new LightAttackEvent(target, weapon.Owner, targetXform.Coordinates));
|
||||
AttemptAttack(user, weapon, new LightAttackEvent(target, weapon.Owner, targetXform.Coordinates), null);
|
||||
}
|
||||
|
||||
public void AttemptDisarmAttack(EntityUid user, MeleeWeaponComponent weapon, EntityUid target)
|
||||
@@ -227,13 +228,13 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
|
||||
if (!TryComp<TransformComponent>(target, out var targetXform))
|
||||
return;
|
||||
|
||||
AttemptAttack(user, weapon, new DisarmAttackEvent(target, targetXform.Coordinates));
|
||||
AttemptAttack(user, weapon, new DisarmAttackEvent(target, targetXform.Coordinates), null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called when a windup is finished and an attack is tried.
|
||||
/// </summary>
|
||||
private void AttemptAttack(EntityUid user, MeleeWeaponComponent weapon, AttackEvent attack)
|
||||
private void AttemptAttack(EntityUid user, MeleeWeaponComponent weapon, AttackEvent attack, ICommonSession? session)
|
||||
{
|
||||
var curTime = Timing.CurTime;
|
||||
|
||||
@@ -258,15 +259,15 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
|
||||
switch (attack)
|
||||
{
|
||||
case LightAttackEvent light:
|
||||
DoLightAttack(user, light, weapon);
|
||||
DoLightAttack(user, light, weapon, session);
|
||||
break;
|
||||
case DisarmAttackEvent disarm:
|
||||
if (!DoDisarm(user, disarm, weapon))
|
||||
if (!DoDisarm(user, disarm, weapon, session))
|
||||
return;
|
||||
|
||||
break;
|
||||
case HeavyAttackEvent heavy:
|
||||
DoHeavyAttack(user, heavy, weapon);
|
||||
DoHeavyAttack(user, heavy, weapon, session);
|
||||
break;
|
||||
default:
|
||||
throw new NotImplementedException();
|
||||
@@ -314,17 +315,17 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
|
||||
return (float) fraction * component.HeavyDamageModifier.Float();
|
||||
}
|
||||
|
||||
protected virtual void DoLightAttack(EntityUid user, LightAttackEvent ev, MeleeWeaponComponent component)
|
||||
protected virtual void DoLightAttack(EntityUid user, LightAttackEvent ev, MeleeWeaponComponent component, ICommonSession? session)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
protected virtual void DoHeavyAttack(EntityUid user, HeavyAttackEvent ev, MeleeWeaponComponent component)
|
||||
protected virtual void DoHeavyAttack(EntityUid user, HeavyAttackEvent ev, MeleeWeaponComponent component, ICommonSession? session)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
protected virtual bool DoDisarm(EntityUid user, DisarmAttackEvent ev, MeleeWeaponComponent component)
|
||||
protected virtual bool DoDisarm(EntityUid user, DisarmAttackEvent ev, MeleeWeaponComponent component, ICommonSession? session)
|
||||
{
|
||||
if (Deleted(ev.Target) ||
|
||||
user == ev.Target)
|
||||
|
||||
Reference in New Issue
Block a user