From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 8 May 2023 07:46:26 +0000 (+1000) Subject: Truncate melee wide swings (#16242) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=3ed58be49c8570beee92f1e61f91aa271077ed34;p=space-station-14.git Truncate melee wide swings (#16242) --- diff --git a/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs b/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs index c2a494296a..e64545bc95 100644 --- a/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs +++ b/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs @@ -154,12 +154,12 @@ public sealed partial class MeleeWeaponSystem break; case WeaponArcAnimation.None: var xformQuery = GetEntityQuery(); - var (mapPos, mapRot) = _transform.GetWorldPositionRotation(userXform, xformQuery); + var (mapPos, mapRot) = TransformSystem.GetWorldPositionRotation(userXform, xformQuery); var xform = xformQuery.GetComponent(animationUid); xform.AttachToGridOrMap(); var worldPos = mapPos + (mapRot - userXform.LocalRotation).RotateVec(localPos); - var newLocalPos = _transform.GetInvWorldMatrix(xform.ParentUid, xformQuery).Transform(worldPos); - _transform.SetLocalPositionNoLerp(xform, newLocalPos); + var newLocalPos = TransformSystem.GetInvWorldMatrix(xform.ParentUid, xformQuery).Transform(worldPos); + TransformSystem.SetLocalPositionNoLerp(xform, newLocalPos); if (arcComponent.Fadeout) _animation.Play(animationUid, GetFadeAnimation(sprite, 0f, 0.15f), FadeAnimationKey); break; diff --git a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs index a74dc48e6f..23271c5478 100644 --- a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs @@ -101,11 +101,11 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem if (MapManager.TryFindGridAt(mousePos, out var grid)) { - coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, _transform, EntityManager); + coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, TransformSystem, EntityManager); } 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) @@ -136,11 +136,11 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression if (MapManager.TryFindGridAt(mousePos, out var grid)) { - coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, _transform, EntityManager); + coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, TransformSystem, EntityManager); } 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); @@ -177,11 +177,11 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression if (MapManager.TryFindGridAt(mousePos, out var grid)) { - coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, _transform, EntityManager); + coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, TransformSystem, EntityManager); } else { - coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, _transform, EntityManager); + coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, TransformSystem, EntityManager); } EntityUid? target = null; @@ -252,22 +252,25 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem private void ClientHeavyAttack(EntityUid user, EntityCoordinates coordinates, EntityUid meleeUid, MeleeWeaponComponent component) { // Only run on first prediction to avoid the potential raycast entities changing. - if (!TryComp(user, out var userXform) || !Timing.IsFirstTimePredicted) + if (!TryComp(user, out var userXform) || + !Timing.IsFirstTimePredicted) + { return; + } - var targetMap = coordinates.ToMap(EntityManager, _transform); + var targetMap = coordinates.ToMap(EntityManager, TransformSystem); if (targetMap.MapId != userXform.MapID) return; - var userPos = _transform.GetWorldPosition(userXform); + var userPos = TransformSystem.GetWorldPosition(userXform); var direction = targetMap.Position - userPos; var distance = Math.Min(component.Range, direction.Length); // This should really be improved. GetEntitiesInArc uses pos instead of bounding boxes. // Server will validate it with InRangeUnobstructed. - var entities = ArcRayCast(userPos, direction.ToWorldAngle(), component.Angle, distance, userXform.MapID, user); - RaisePredictiveEvent(new HeavyAttackEvent(meleeUid, entities.ToList(), coordinates)); + var entities = ArcRayCast(userPos, direction.ToWorldAngle(), component.Angle, distance, userXform.MapID, user).ToList(); + RaisePredictiveEvent(new HeavyAttackEvent(meleeUid, entities.GetRange(0, Math.Min(MaxTargets, entities.Count)), coordinates)); } protected override void Popup(string message, EntityUid? uid, EntityUid? user) diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index 5bf5dc8f17..faa6119840 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -16,6 +16,7 @@ using Content.Shared.Popups; using Content.Shared.Weapons.Melee.Components; using Content.Shared.Weapons.Melee.Events; using Robust.Shared.Audio; +using Robust.Shared.Collections; using Robust.Shared.GameStates; using Robust.Shared.Map; using Robust.Shared.Physics; @@ -41,7 +42,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem [Dependency] protected readonly SharedInteractionSystem Interaction = default!; [Dependency] private readonly SharedPhysicsSystem _physics = 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!; protected ISawmill Sawmill = default!; @@ -49,6 +50,11 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem public const float DamagePitchVariation = 0.05f; private const int AttackMask = (int) (CollisionGroup.MobMask | CollisionGroup.Opaque); + /// + /// Maximum amount of targets allowed for a wide-attack. + /// + public const int MaxTargets = 5; + /// /// If an attack is released within this buffer it's assumed to be full damage. /// @@ -379,7 +385,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem 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; Dirty(weapon); } @@ -519,12 +525,12 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem if (!TryComp(user, out var userXform)) return; - var targetMap = ev.Coordinates.ToMap(EntityManager, _transform); + var targetMap = ev.Coordinates.ToMap(EntityManager, TransformSystem); if (targetMap.MapId != userXform.MapID) return; - var userPos = _transform.GetWorldPosition(userXform); + var userPos = TransformSystem.GetWorldPosition(userXform); var direction = targetMap.Position - userPos; var distance = Math.Min(component.Range, direction.Length); @@ -540,6 +546,12 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem return; } + // Naughty input + if (entities.Count > MaxTargets) + { + entities.RemoveRange(MaxTargets, entities.Count - MaxTargets); + } + // Validate client for (var i = entities.Count - 1; i >= 0; i--) { @@ -775,7 +787,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem if (!TryComp(user, out var userXform)) return; - var invMatrix = _transform.GetInvWorldMatrix(userXform); + var invMatrix = TransformSystem.GetInvWorldMatrix(userXform); var localPos = invMatrix.Transform(coordinates.Position); if (localPos.LengthSquared <= 0f)