]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Remove .Owner from melee weapons (#14600)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Sun, 12 Mar 2023 04:56:05 +0000 (15:56 +1100)
committerGitHub <noreply@github.com>
Sun, 12 Mar 2023 04:56:05 +0000 (15:56 +1100)
Content.Client/Weapons/Melee/MeleeArcOverlay.cs
Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs
Content.Client/Weapons/Melee/MeleeWeaponSystem.cs
Content.Client/Weapons/Melee/MeleeWindupOverlay.cs
Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs
Content.Server/NPC/Systems/NPCSteeringSystem.Obstacles.cs
Content.Server/Weapons/Melee/MeleeWeaponSystem.cs
Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs

index 02bc4336014d0e2d70b8995ec1ddd937ff849ef0..99ef6ca41ded72db10dc0d7057d91ac030aec3db 100644 (file)
@@ -42,9 +42,7 @@ public sealed class MeleeArcOverlay : Overlay
             return;
         }
 
-        var weapon = _melee.GetWeapon(player.Value);
-
-        if (weapon == null)
+        if (!_melee.TryGetWeapon(player.Value, out _, out var weapon))
             return;
 
         var mousePos = _inputManager.MouseScreenPosition;
index 6deb60c996e925e01c361e3bcfaf2f47b6c0c5b7..5c423d03153aba1d38b418d8ae4f2cf5ba612d4d 100644 (file)
@@ -15,7 +15,6 @@ public sealed partial class MeleeWeaponSystem
     /// </summary>
     private const float DamageAnimationLength = 0.30f;
 
-    private const string AnimationKey = "melee-animation";
     private const string DamageAnimationKey = "damage-effect";
     private const string FadeAnimationKey = "melee-fade";
     private const string SlashAnimationKey = "melee-slash";
@@ -154,10 +153,10 @@ public sealed partial class MeleeWeaponSystem
                     _animation.Play(animationUid, GetFadeAnimation(sprite, 0.05f, 0.15f), FadeAnimationKey);
                 break;
             case WeaponArcAnimation.None:
-                var mapPos = userXform.WorldPosition;
+                var (mapPos, mapRot) = _transform.GetWorldPositionRotation(userXform, GetEntityQuery<TransformComponent>());
                 var xform = Transform(animationUid);
                 xform.AttachToGridOrMap();
-                xform.WorldPosition = mapPos + (userXform.WorldRotation - userXform.LocalRotation).RotateVec(localPos);
+                _transform.SetWorldPosition(xform, mapPos + (mapRot - userXform.LocalRotation).RotateVec(localPos));
                 if (arcComponent.Fadeout)
                     _animation.Play(animationUid, GetFadeAnimation(sprite, 0f, 0.15f), FadeAnimationKey);
                 break;
index 973d4974557808d443f3b84a16e332cc1d27bdf3..05b487719119c9e229207311549c2107a4054c42 100644 (file)
@@ -62,9 +62,8 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
             return;
 
         var entity = entityNull.Value;
-        var weapon = GetWeapon(entity);
 
-        if (weapon == null)
+        if (!TryGetWeapon(entity, out var weaponUid, out var weapon))
             return;
 
         if (!CombatMode.IsInCombatMode(entity) || !Blocker.CanAttack(entity))
@@ -72,7 +71,7 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
             weapon.Attacking = false;
             if (weapon.WindUpStart != null)
             {
-                EntityManager.RaisePredictiveEvent(new StopHeavyAttackEvent(weapon.Owner));
+                EntityManager.RaisePredictiveEvent(new StopHeavyAttackEvent(weaponUid));
             }
 
             return;
@@ -94,7 +93,7 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
             }
 
             // If it's an unarmed attack then do a disarm
-            if (weapon.Owner == entity)
+            if (weaponUid == entity)
             {
                 EntityUid? target = null;
 
@@ -103,11 +102,11 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
 
                 if (MapManager.TryFindGridAt(mousePos, out var grid))
                 {
-                    coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, EntityManager);
+                    coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, _transform, EntityManager);
                 }
                 else
                 {
-                    coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, EntityManager);
+                    coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, _transform, EntityManager);
                 }
 
                 if (_stateManager.CurrentState is GameplayStateBase screen)
@@ -124,7 +123,7 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
             // Start a windup
             if (weapon.WindUpStart == null)
             {
-                EntityManager.RaisePredictiveEvent(new StartHeavyAttackEvent(weapon.Owner));
+                EntityManager.RaisePredictiveEvent(new StartHeavyAttackEvent(weaponUid));
                 weapon.WindUpStart = currentTime;
             }
 
@@ -138,14 +137,14 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
                 // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
                 if (MapManager.TryFindGridAt(mousePos, out var grid))
                 {
-                    coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, EntityManager);
+                    coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, _transform, EntityManager);
                 }
                 else
                 {
-                    coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, EntityManager);
+                    coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, _transform, EntityManager);
                 }
 
-                EntityManager.RaisePredictiveEvent(new HeavyAttackEvent(weapon.Owner, coordinates));
+                EntityManager.RaisePredictiveEvent(new HeavyAttackEvent(weaponUid, coordinates));
             }
 
             return;
@@ -153,7 +152,7 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
 
         if (weapon.WindUpStart != null)
         {
-            EntityManager.RaisePredictiveEvent(new StopHeavyAttackEvent(weapon.Owner));
+            EntityManager.RaisePredictiveEvent(new StopHeavyAttackEvent(weaponUid));
         }
 
         // Light attack
@@ -179,11 +178,11 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
             // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
             if (MapManager.TryFindGridAt(mousePos, out var grid))
             {
-                coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, EntityManager);
+                coordinates = EntityCoordinates.FromMap(grid.Owner, mousePos, _transform, EntityManager);
             }
             else
             {
-                coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, EntityManager);
+                coordinates = EntityCoordinates.FromMap(MapManager.GetMapEntityId(mousePos.MapId), mousePos, _transform, EntityManager);
             }
 
             EntityUid? target = null;
@@ -194,13 +193,13 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
                 target = screen.GetClickedEntity(mousePos);
             }
 
-            RaisePredictiveEvent(new LightAttackEvent(target, weapon.Owner, coordinates));
+            RaisePredictiveEvent(new LightAttackEvent(target, weaponUid, coordinates));
             return;
         }
 
         if (weapon.Attacking)
         {
-            RaisePredictiveEvent(new StopAttackEvent(weapon.Owner));
+            RaisePredictiveEvent(new StopAttackEvent(weaponUid));
         }
     }
 
index aaf744a2fcbb829ad9c4db094f9b67a10954e35f..6f800772525ce8ba20e4c9952928d688de953609 100644 (file)
@@ -44,9 +44,7 @@ public sealed class MeleeWindupOverlay : Overlay
             return;
         }
 
-        var comp = _melee.GetWeapon(owner.Value);
-
-        if (comp == null)
+        if (!_melee.TryGetWeapon(owner.Value, out var meleeUid, out var comp))
             return;
 
         var handle = args.WorldHandle;
@@ -67,7 +65,7 @@ public sealed class MeleeWindupOverlay : Overlay
             return;
         }
 
-        if (!xformQuery.TryGetComponent(comp.Owner, out var xform) ||
+        if (!xformQuery.TryGetComponent(meleeUid, out var xform) ||
             xform.MapID != args.MapId)
         {
             return;
@@ -84,7 +82,7 @@ public sealed class MeleeWindupOverlay : Overlay
         // Use the sprite itself if we know its bounds. This means short or tall sprites don't get overlapped
         // by the bar.
         float yOffset;
-        if (spriteQuery.TryGetComponent(comp.Owner, out var sprite))
+        if (spriteQuery.TryGetComponent(meleeUid, out var sprite))
         {
             yOffset = -sprite.Bounds.Height / 2f - 0.05f;
         }
@@ -106,11 +104,11 @@ public sealed class MeleeWindupOverlay : Overlay
         const float endX = 22f;
 
         // Area marking where to release
-        var ReleaseWidth = 2f * SharedMeleeWeaponSystem.GracePeriod / (float) comp.WindupTime.TotalSeconds * EyeManager.PixelsPerMeter;
-        var releaseMiddle = (endX - startX) / 2f + startX;
+        var releaseWidth = 2f * SharedMeleeWeaponSystem.GracePeriod / (float) comp.WindupTime.TotalSeconds * EyeManager.PixelsPerMeter;
+        const float releaseMiddle = (endX - startX) / 2f + startX;
 
-        var releaseBox = new Box2(new Vector2(releaseMiddle - ReleaseWidth / 2f, 3f) / EyeManager.PixelsPerMeter,
-            new Vector2(releaseMiddle + ReleaseWidth / 2f, 4f) / EyeManager.PixelsPerMeter);
+        var releaseBox = new Box2(new Vector2(releaseMiddle - releaseWidth / 2f, 3f) / EyeManager.PixelsPerMeter,
+            new Vector2(releaseMiddle + releaseWidth / 2f, 4f) / EyeManager.PixelsPerMeter);
 
         releaseBox = releaseBox.Translated(position);
         handle.DrawRect(releaseBox, Color.LimeGreen);
@@ -131,11 +129,11 @@ public sealed class MeleeWindupOverlay : Overlay
         var xPos = (endX - startX) * fraction + startX;
 
         // In pixels
-        const float Width = 2f;
+        const float width = 2f;
         // If we hit the end we won't draw half the box so we need to subtract the end pos from it
-        var endPos = xPos + Width / 2f;
+        var endPos = xPos + width / 2f;
 
-        var box = new Box2(new Vector2(Math.Max(startX, endPos - Width), 3f) / EyeManager.PixelsPerMeter,
+        var box = new Box2(new Vector2(Math.Max(startX, endPos - width), 3f) / EyeManager.PixelsPerMeter,
             new Vector2(Math.Min(endX, endPos), 4f) / EyeManager.PixelsPerMeter);
 
         box = box.Translated(position);
index 5acf856145063a7369203ab7a50c817c0f24f053..a2e8a670753024477bdea402769753160e0f0ec7 100644 (file)
@@ -124,7 +124,7 @@ public sealed partial class NPCSteeringSystem
                 // Breaking behaviours and the likes.
                 lock (_obstacles)
                 {
-                    status = TryHandleFlags(steering, node, bodyQuery);
+                    status = TryHandleFlags(uid, steering, node, bodyQuery);
                 }
 
                 // TODO: Need to handle re-pathing in case the target moves around.
index d8c32482ce894ec1d4d913b6e9155a1e9bb843b1..06aa9f7ca92648d4679f845aefd18cc088469f07 100644 (file)
@@ -32,7 +32,7 @@ public sealed partial class NPCSteeringSystem
      */
 
 
-    private SteeringObstacleStatus TryHandleFlags(NPCSteeringComponent component, PathPoly poly, EntityQuery<PhysicsComponent> bodyQuery)
+    private SteeringObstacleStatus TryHandleFlags(EntityUid uid, NPCSteeringComponent component, PathPoly poly, EntityQuery<PhysicsComponent> bodyQuery)
     {
         DebugTools.Assert(!poly.Data.IsFreeSpace);
         // TODO: Store PathFlags on the steering comp
@@ -41,9 +41,9 @@ public sealed partial class NPCSteeringSystem
         var layer = 0;
         var mask = 0;
 
-        if (TryComp<FixturesComponent>(component.Owner, out var manager))
+        if (TryComp<FixturesComponent>(uid, out var manager))
         {
-            (layer, mask) = _physics.GetHardCollision(component.Owner, manager);
+            (layer, mask) = _physics.GetHardCollision(uid, manager);
         }
         else
         {
@@ -76,7 +76,7 @@ public sealed partial class NPCSteeringSystem
                     {
                         if (door.State != DoorState.Opening)
                         {
-                            _interaction.InteractionActivate(component.Owner, ent);
+                            _interaction.InteractionActivate(uid, ent);
                             return SteeringObstacleStatus.Continuing;
                         }
                     }
@@ -100,7 +100,7 @@ public sealed partial class NPCSteeringSystem
                     {
                         // TODO: Use the verb.
                         if (door.State != DoorState.Opening && !door.BeingPried)
-                            _doors.TryPryDoor(ent, component.Owner, component.Owner, door, true);
+                            _doors.TryPryDoor(ent, uid, uid, door, true);
 
                         return SteeringObstacleStatus.Continuing;
                     }
@@ -112,9 +112,7 @@ public sealed partial class NPCSteeringSystem
             // Try smashing obstacles.
             else if ((component.Flags & PathFlags.Smashing) != 0x0)
             {
-                var meleeWeapon = _melee.GetWeapon(component.Owner);
-
-                if (meleeWeapon != null && meleeWeapon.NextAttack <= _timing.CurTime && TryComp<CombatModeComponent>(component.Owner, out var combatMode))
+                if (_melee.TryGetWeapon(uid, out var meleeUid, out var meleeWeapon) && meleeWeapon.NextAttack <= _timing.CurTime && TryComp<CombatModeComponent>(uid, out var combatMode))
                 {
                     combatMode.IsInCombatMode = true;
                     var destructibleQuery = GetEntityQuery<DestructibleComponent>();
@@ -127,7 +125,7 @@ public sealed partial class NPCSteeringSystem
                         // TODO: Validate we can damage it
                         if (destructibleQuery.HasComponent(ent))
                         {
-                            _melee.AttemptLightAttack(component.Owner, component.Owner, meleeWeapon, ent);
+                            _melee.AttemptLightAttack(uid, uid, meleeWeapon, ent);
                             break;
                         }
                     }
index f5fd861a02f8d16f6a51ac7f283679e410b97d83..13f824d1b51e27e4253f36273ac0d415b18d6571 100644 (file)
@@ -236,7 +236,7 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem
             return;
         }
 
-        var hitBloodstreams = new List<BloodstreamComponent>();
+        var hitBloodstreams = new List<(EntityUid Entity, BloodstreamComponent Component)>();
         var bloodQuery = GetEntityQuery<BloodstreamComponent>();
 
         foreach (var entity in args.HitEntities)
@@ -245,7 +245,7 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem
                 continue;
 
             if (bloodQuery.TryGetComponent(entity, out var bloodstream))
-                hitBloodstreams.Add(bloodstream);
+                hitBloodstreams.Add((entity, bloodstream));
         }
 
         if (!hitBloodstreams.Any())
@@ -256,10 +256,10 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem
         var solutionToInject = removedSolution.SplitSolution(removedVol * comp.TransferEfficiency);
         var volPerBloodstream = solutionToInject.Volume * (1 / hitBloodstreams.Count);
 
-        foreach (var bloodstream in hitBloodstreams)
+        foreach (var (ent, bloodstream) in hitBloodstreams)
         {
             var individualInjection = solutionToInject.SplitSolution(volPerBloodstream);
-            _bloodstream.TryAddToChemicals((bloodstream).Owner, individualInjection, bloodstream);
+            _bloodstream.TryAddToChemicals(ent, individualInjection, bloodstream);
         }
     }
 }
index a96699260ecd5ce9054f5ac6589e7202868662f9..2f9113cc503b410f810fe94f69fde112e43b8c8e 100644 (file)
@@ -1,3 +1,4 @@
+using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using Content.Shared.ActionBlocker;
 using Content.Shared.Administration.Logs;
@@ -34,13 +35,13 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
     [Dependency] protected readonly ISharedAdminLogManager AdminLogger = default!;
     [Dependency] protected readonly ActionBlockerSystem Blocker = default!;
     [Dependency] protected readonly DamageableSystem Damageable = default!;
-    [Dependency] protected readonly InventorySystem Inventory = default!;
+    [Dependency] private   readonly InventorySystem _inventory = default!;
     [Dependency] protected readonly SharedAudioSystem Audio = default!;
     [Dependency] protected readonly SharedCombatModeSystem CombatMode = default!;
     [Dependency] protected readonly SharedInteractionSystem Interaction = default!;
     [Dependency] private   readonly SharedPhysicsSystem _physics = default!;
     [Dependency] protected readonly SharedPopupSystem PopupSystem = default!;
-    [Dependency] private   readonly SharedTransformSystem _transform = default!;
+    [Dependency] protected   readonly SharedTransformSystem _transform = default!;
     [Dependency] private   readonly StaminaSystem _stamina = default!;
 
     protected ISawmill Sawmill = default!;
@@ -106,10 +107,11 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
         if (user == null)
             return;
 
-        var weapon = GetWeapon(user.Value);
-
-        if (weapon?.Owner != msg.Weapon)
+        if (!TryGetWeapon(user.Value, out var weaponUid, out var weapon) ||
+            weaponUid != msg.Weapon)
+        {
             return;
+        }
 
         if (!weapon.Attacking)
             return;
@@ -125,10 +127,11 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
         if (user == null)
             return;
 
-        var weapon = GetWeapon(user.Value);
-
-        if (weapon?.Owner != msg.Weapon)
+        if (!TryGetWeapon(user.Value, out var weaponUid, out var weapon) ||
+            weaponUid != msg.Weapon)
+        {
             return;
+        }
 
         DebugTools.Assert(weapon.WindUpStart == null);
         weapon.WindUpStart = Timing.CurTime;
@@ -144,26 +147,27 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
         if (user == null)
             return;
 
-        var weapon = GetWeapon(user.Value);
-
-        if (weapon?.Owner != msg.Weapon)
+        if (!TryGetWeapon(user.Value, out var weaponUid, out var weapon) ||
+            weaponUid != msg.Weapon)
+        {
             return;
+        }
 
         AttemptAttack(args.SenderSession.AttachedEntity!.Value, msg.Weapon, weapon, msg, args.SenderSession);
     }
 
     private void OnStopHeavyAttack(StopHeavyAttackEvent msg, EntitySessionEventArgs args)
     {
-        if (args.SenderSession.AttachedEntity == null ||
-            !TryComp<MeleeWeaponComponent>(msg.Weapon, out var weapon))
+        if (args.SenderSession.AttachedEntity == null)
         {
             return;
         }
 
-        var userWeapon = GetWeapon(args.SenderSession.AttachedEntity.Value);
-
-        if (userWeapon != weapon)
+        if (!TryGetWeapon(args.SenderSession.AttachedEntity.Value, out var weaponUid, out var weapon) ||
+            weaponUid != msg.Weapon)
+        {
             return;
+        }
 
         if (weapon.WindUpStart.Equals(null))
         {
@@ -176,16 +180,16 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
 
     private void OnHeavyAttack(HeavyAttackEvent msg, EntitySessionEventArgs args)
     {
-        if (args.SenderSession.AttachedEntity == null ||
-            !TryComp<MeleeWeaponComponent>(msg.Weapon, out var weapon))
+        if (args.SenderSession.AttachedEntity == null)
         {
             return;
         }
 
-        var userWeapon = GetWeapon(args.SenderSession.AttachedEntity.Value);
-
-        if (userWeapon != weapon)
+        if (!TryGetWeapon(args.SenderSession.AttachedEntity.Value, out var weaponUid, out var weapon) ||
+            weaponUid != msg.Weapon)
+        {
             return;
+        }
 
         AttemptAttack(args.SenderSession.AttachedEntity.Value, msg.Weapon, weapon, msg, args.SenderSession);
     }
@@ -197,12 +201,12 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
             return;
         }
 
-        var userWeapon = GetWeapon(args.SenderSession.AttachedEntity.Value);
-
-        if (userWeapon == null)
+        if (!TryGetWeapon(args.SenderSession.AttachedEntity.Value, out var weaponUid, out var weapon))
+        {
             return;
+        }
 
-        AttemptAttack(args.SenderSession.AttachedEntity.Value, userWeapon.Owner, userWeapon, msg, args.SenderSession);
+        AttemptAttack(args.SenderSession.AttachedEntity.Value, weaponUid, weapon, msg, args.SenderSession);
     }
 
     private void OnGetState(EntityUid uid, MeleeWeaponComponent component, ref ComponentGetState args)
@@ -226,15 +230,22 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
         component.Range = state.Range;
     }
 
-    public MeleeWeaponComponent? GetWeapon(EntityUid entity)
+    public bool TryGetWeapon(EntityUid entity, out EntityUid weaponUid, [NotNullWhen(true)] out MeleeWeaponComponent? melee)
     {
-        MeleeWeaponComponent? melee;
+        weaponUid = default;
+        melee = null;
 
         var ev = new GetMeleeWeaponEvent();
         RaiseLocalEvent(entity, ev);
         if (ev.Handled)
         {
-            return EntityManager.GetComponentOrNull<MeleeWeaponComponent>(ev.Weapon);
+            if (TryComp(ev.Weapon, out melee))
+            {
+                weaponUid = ev.Weapon.Value;
+                return true;
+            }
+
+            return false;
         }
 
         // Use inhands entity if we got one.
@@ -243,26 +254,30 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
         {
             if (EntityManager.TryGetComponent(held, out melee))
             {
-                return melee;
+                weaponUid = held;
+                return true;
             }
 
-            return null;
+            return false;
         }
 
         // Use hands clothing if applicable.
-        if (Inventory.TryGetSlotEntity(entity, "gloves", out var gloves) &&
+        if (_inventory.TryGetSlotEntity(entity, "gloves", out var gloves) &&
             TryComp<MeleeWeaponComponent>(gloves, out var glovesMelee))
         {
-            return glovesMelee;
+            weaponUid = gloves.Value;
+            melee = glovesMelee;
+            return true;
         }
 
         // Use our own melee
         if (TryComp(entity, out melee))
         {
-            return melee;
+            weaponUid = entity;
+            return true;
         }
 
-        return null;
+        return false;
     }
 
     public void AttemptLightAttackMiss(EntityUid user, EntityUid weaponUid, MeleeWeaponComponent weapon, EntityCoordinates coordinates)
@@ -345,7 +360,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
                 throw new NotImplementedException();
         }
 
-        DoLungeAnimation(user, weapon.Angle, attack.Coordinates.ToMap(EntityManager), weapon.Range, animation);
+        DoLungeAnimation(user, weapon.Angle, attack.Coordinates.ToMap(EntityManager, _transform), weapon.Range, animation);
         weapon.Attacking = true;
         Dirty(weapon);
     }
@@ -441,7 +456,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
             // If the target has stamina and is taking blunt damage, they should also take stamina damage based on their blunt to stamina factor
             if (damageResult.DamageDict.TryGetValue("Blunt", out var bluntDamage))
             {
-                _stamina.TakeStaminaDamage(ev.Target.Value, (bluntDamage * component.BluntStaminaDamageFactor).Float(), source:user, with:(component.Owner == user ? null : component.Owner));
+                _stamina.TakeStaminaDamage(ev.Target.Value, (bluntDamage * component.BluntStaminaDamageFactor).Float(), source:user, with:meleeUid == user ? null : meleeUid);
             }
 
             if (meleeUid == user)
@@ -452,7 +467,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
             else
             {
                 AdminLogger.Add(LogType.MeleeHit,
-                    $"{ToPrettyString(user):user} melee attacked {ToPrettyString(ev.Target.Value):target} using {ToPrettyString(component.Owner):used} and dealt {damageResult.Total:damage} damage");
+                    $"{ToPrettyString(user):user} melee attacked {ToPrettyString(ev.Target.Value):target} using {ToPrettyString(meleeUid):used} and dealt {damageResult.Total:damage} damage");
             }
 
             PlayHitSound(ev.Target.Value, user, GetHighestDamageSound(modifiedDamage, _protoManager), hitEvent.HitSoundOverride, component.HitSound);
@@ -489,7 +504,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
             return;
         }
 
-        var targetMap = ev.Coordinates.ToMap(EntityManager);
+        var targetMap = ev.Coordinates.ToMap(EntityManager, _transform);
 
         if (targetMap.MapId != userXform.MapID)
         {
@@ -570,7 +585,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
                 else
                 {
                     AdminLogger.Add(LogType.MeleeHit,
-                        $"{ToPrettyString(user):user} melee attacked {ToPrettyString(entity):target} using {ToPrettyString(component.Owner):used} and dealt {damageResult.Total:damage} damage");
+                        $"{ToPrettyString(user):user} melee attacked {ToPrettyString(entity):target} using {ToPrettyString(meleeUid):used} and dealt {damageResult.Total:damage} damage");
                 }
             }
         }
@@ -729,7 +744,7 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
         if (!TryComp<TransformComponent>(user, out var userXform))
             return;
 
-        var invMatrix = userXform.InvWorldMatrix;
+        var invMatrix = _transform.GetInvWorldMatrix(userXform);
         var localPos = invMatrix.Transform(coordinates.Position);
 
         if (localPos.LengthSquared <= 0f)
@@ -738,8 +753,8 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem
         localPos = userXform.LocalRotation.RotateVec(localPos);
 
         // We'll play the effect just short visually so it doesn't look like we should be hitting but actually aren't.
-        const float BufferLength = 0.2f;
-        var visualLength = length - BufferLength;
+        const float bufferLength = 0.2f;
+        var visualLength = length - bufferLength;
 
         if (localPos.Length > visualLength)
             localPos = localPos.Normalized * visualLength;