Truncate melee wide swings (#16242)

This commit is contained in:
metalgearsloth
2023-05-08 17:46:26 +10:00
committed by GitHub
parent 211ba8c7bd
commit 3ed58be49c
3 changed files with 34 additions and 19 deletions

View File

@@ -154,12 +154,12 @@ public sealed partial class MeleeWeaponSystem
break; break;
case WeaponArcAnimation.None: case WeaponArcAnimation.None:
var xformQuery = GetEntityQuery<TransformComponent>(); var xformQuery = GetEntityQuery<TransformComponent>();
var (mapPos, mapRot) = _transform.GetWorldPositionRotation(userXform, xformQuery); var (mapPos, mapRot) = TransformSystem.GetWorldPositionRotation(userXform, xformQuery);
var xform = xformQuery.GetComponent(animationUid); var xform = xformQuery.GetComponent(animationUid);
xform.AttachToGridOrMap(); xform.AttachToGridOrMap();
var worldPos = mapPos + (mapRot - userXform.LocalRotation).RotateVec(localPos); var worldPos = mapPos + (mapRot - userXform.LocalRotation).RotateVec(localPos);
var newLocalPos = _transform.GetInvWorldMatrix(xform.ParentUid, xformQuery).Transform(worldPos); var newLocalPos = TransformSystem.GetInvWorldMatrix(xform.ParentUid, xformQuery).Transform(worldPos);
_transform.SetLocalPositionNoLerp(xform, newLocalPos); TransformSystem.SetLocalPositionNoLerp(xform, newLocalPos);
if (arcComponent.Fadeout) if (arcComponent.Fadeout)
_animation.Play(animationUid, GetFadeAnimation(sprite, 0f, 0.15f), FadeAnimationKey); _animation.Play(animationUid, GetFadeAnimation(sprite, 0f, 0.15f), FadeAnimationKey);
break; break;

View File

@@ -101,11 +101,11 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
if (MapManager.TryFindGridAt(mousePos, out var grid)) if (MapManager.TryFindGridAt(mousePos, out var grid))
{ {
coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, _transform, EntityManager); coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, TransformSystem, EntityManager);
} }
else else
{ {
coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, _transform, EntityManager); coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, TransformSystem, EntityManager);
} }
if (_stateManager.CurrentState is GameplayStateBase screen) if (_stateManager.CurrentState is GameplayStateBase screen)
@@ -136,11 +136,11 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
// ReSharper disable once ConvertIfStatementToConditionalTernaryExpression // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
if (MapManager.TryFindGridAt(mousePos, out var grid)) if (MapManager.TryFindGridAt(mousePos, out var grid))
{ {
coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, _transform, EntityManager); coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, TransformSystem, EntityManager);
} }
else else
{ {
coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, _transform, EntityManager); coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, TransformSystem, EntityManager);
} }
ClientHeavyAttack(entity, coordinates, weaponUid, weapon); ClientHeavyAttack(entity, coordinates, weaponUid, weapon);
@@ -177,11 +177,11 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
// ReSharper disable once ConvertIfStatementToConditionalTernaryExpression // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
if (MapManager.TryFindGridAt(mousePos, out var grid)) if (MapManager.TryFindGridAt(mousePos, out var grid))
{ {
coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, _transform, EntityManager); coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, TransformSystem, EntityManager);
} }
else else
{ {
coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, _transform, EntityManager); coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, TransformSystem, EntityManager);
} }
EntityUid? target = null; EntityUid? target = null;
@@ -252,22 +252,25 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
private void ClientHeavyAttack(EntityUid user, EntityCoordinates coordinates, EntityUid meleeUid, MeleeWeaponComponent component) private void ClientHeavyAttack(EntityUid user, EntityCoordinates coordinates, EntityUid meleeUid, MeleeWeaponComponent component)
{ {
// Only run on first prediction to avoid the potential raycast entities changing. // Only run on first prediction to avoid the potential raycast entities changing.
if (!TryComp<TransformComponent>(user, out var userXform) || !Timing.IsFirstTimePredicted) if (!TryComp<TransformComponent>(user, out var userXform) ||
!Timing.IsFirstTimePredicted)
{
return; return;
}
var targetMap = coordinates.ToMap(EntityManager, _transform); var targetMap = coordinates.ToMap(EntityManager, TransformSystem);
if (targetMap.MapId != userXform.MapID) if (targetMap.MapId != userXform.MapID)
return; return;
var userPos = _transform.GetWorldPosition(userXform); var userPos = TransformSystem.GetWorldPosition(userXform);
var direction = targetMap.Position - userPos; var direction = targetMap.Position - userPos;
var distance = Math.Min(component.Range, direction.Length); var distance = Math.Min(component.Range, direction.Length);
// This should really be improved. GetEntitiesInArc uses pos instead of bounding boxes. // This should really be improved. GetEntitiesInArc uses pos instead of bounding boxes.
// Server will validate it with InRangeUnobstructed. // Server will validate it with InRangeUnobstructed.
var entities = ArcRayCast(userPos, direction.ToWorldAngle(), component.Angle, distance, userXform.MapID, user); var entities = ArcRayCast(userPos, direction.ToWorldAngle(), component.Angle, distance, userXform.MapID, user).ToList();
RaisePredictiveEvent(new HeavyAttackEvent(meleeUid, entities.ToList(), coordinates)); RaisePredictiveEvent(new HeavyAttackEvent(meleeUid, entities.GetRange(0, Math.Min(MaxTargets, entities.Count)), coordinates));
} }
protected override void Popup(string message, EntityUid? uid, EntityUid? user) protected override void Popup(string message, EntityUid? uid, EntityUid? user)

View File

@@ -16,6 +16,7 @@ using Content.Shared.Popups;
using Content.Shared.Weapons.Melee.Components; using Content.Shared.Weapons.Melee.Components;
using Content.Shared.Weapons.Melee.Events; using Content.Shared.Weapons.Melee.Events;
using Robust.Shared.Audio; using Robust.Shared.Audio;
using Robust.Shared.Collections;
using Robust.Shared.GameStates; using Robust.Shared.GameStates;
using Robust.Shared.Map; using Robust.Shared.Map;
using Robust.Shared.Physics; using Robust.Shared.Physics;
@@ -41,7 +42,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
[Dependency] protected readonly SharedInteractionSystem Interaction = default!; [Dependency] protected readonly SharedInteractionSystem Interaction = default!;
[Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!;
[Dependency] protected readonly SharedPopupSystem PopupSystem = default!; [Dependency] protected readonly SharedPopupSystem PopupSystem = default!;
[Dependency] protected readonly SharedTransformSystem _transform = default!; [Dependency] protected readonly SharedTransformSystem TransformSystem = default!;
[Dependency] private readonly StaminaSystem _stamina = default!; [Dependency] private readonly StaminaSystem _stamina = default!;
protected ISawmill Sawmill = default!; protected ISawmill Sawmill = default!;
@@ -49,6 +50,11 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
public const float DamagePitchVariation = 0.05f; public const float DamagePitchVariation = 0.05f;
private const int AttackMask = (int) (CollisionGroup.MobMask | CollisionGroup.Opaque); private const int AttackMask = (int) (CollisionGroup.MobMask | CollisionGroup.Opaque);
/// <summary>
/// Maximum amount of targets allowed for a wide-attack.
/// </summary>
public const int MaxTargets = 5;
/// <summary> /// <summary>
/// If an attack is released within this buffer it's assumed to be full damage. /// If an attack is released within this buffer it's assumed to be full damage.
/// </summary> /// </summary>
@@ -379,7 +385,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
throw new NotImplementedException(); throw new NotImplementedException();
} }
DoLungeAnimation(user, weapon.Angle, attack.Coordinates.ToMap(EntityManager, _transform), weapon.Range, animation); DoLungeAnimation(user, weapon.Angle, attack.Coordinates.ToMap(EntityManager, TransformSystem), weapon.Range, animation);
weapon.Attacking = true; weapon.Attacking = true;
Dirty(weapon); Dirty(weapon);
} }
@@ -519,12 +525,12 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
if (!TryComp<TransformComponent>(user, out var userXform)) if (!TryComp<TransformComponent>(user, out var userXform))
return; return;
var targetMap = ev.Coordinates.ToMap(EntityManager, _transform); var targetMap = ev.Coordinates.ToMap(EntityManager, TransformSystem);
if (targetMap.MapId != userXform.MapID) if (targetMap.MapId != userXform.MapID)
return; return;
var userPos = _transform.GetWorldPosition(userXform); var userPos = TransformSystem.GetWorldPosition(userXform);
var direction = targetMap.Position - userPos; var direction = targetMap.Position - userPos;
var distance = Math.Min(component.Range, direction.Length); var distance = Math.Min(component.Range, direction.Length);
@@ -540,6 +546,12 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
return; return;
} }
// Naughty input
if (entities.Count > MaxTargets)
{
entities.RemoveRange(MaxTargets, entities.Count - MaxTargets);
}
// Validate client // Validate client
for (var i = entities.Count - 1; i >= 0; i--) for (var i = entities.Count - 1; i >= 0; i--)
{ {
@@ -775,7 +787,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
if (!TryComp<TransformComponent>(user, out var userXform)) if (!TryComp<TransformComponent>(user, out var userXform))
return; return;
var invMatrix = _transform.GetInvWorldMatrix(userXform); var invMatrix = TransformSystem.GetInvWorldMatrix(userXform);
var localPos = invMatrix.Transform(coordinates.Position); var localPos = invMatrix.Transform(coordinates.Position);
if (localPos.LengthSquared <= 0f) if (localPos.LengthSquared <= 0f)