]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Truncate melee wide swings (#16242)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Mon, 8 May 2023 07:46:26 +0000 (17:46 +1000)
committerGitHub <noreply@github.com>
Mon, 8 May 2023 07:46:26 +0000 (17:46 +1000)
Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs
Content.Client/Weapons/Melee/MeleeWeaponSystem.cs
Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs

index c2a494296afb1f52f59a9fd33297abfd3e73e574..e64545bc9509505913e4470520525bdf66d3da31 100644 (file)
@@ -154,12 +154,12 @@ public sealed partial class MeleeWeaponSystem
                 break;
             case WeaponArcAnimation.None:
                 var xformQuery = GetEntityQuery<TransformComponent>();
-                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;
index a74dc48e6fedd23ae2d457811c9ad3ab915c967b..23271c54786c968f7e2f6cb1e10ff75bff01dfb4 100644 (file)
@@ -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<TransformComponent>(user, out var userXform) || !Timing.IsFirstTimePredicted)
+        if (!TryComp<TransformComponent>(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)
index 5bf5dc8f17458e969f868eb33b2caf3452f62414..faa61198405ed333dfa84fc078001ac80b879e88 100644 (file)
@@ -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);
 
+    /// <summary>
+    /// Maximum amount of targets allowed for a wide-attack.
+    /// </summary>
+    public const int MaxTargets = 5;
+
     /// <summary>
     /// If an attack is released within this buffer it's assumed to be full damage.
     /// </summary>
@@ -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<TransformComponent>(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<TransformComponent>(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)