From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Sun, 2 Feb 2025 22:03:31 +0000 (+0100) Subject: Fix hitting through directional windows (and more!) (#34793) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=f25720124ab5fe63a4389af74f67c9d430ae2294;p=space-station-14.git Fix hitting through directional windows (and more!) (#34793) --- diff --git a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs index 26ec75f995..dc86580369 100644 --- a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs @@ -170,7 +170,7 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem var targetCoordinates = xform.Coordinates; var targetLocalAngle = xform.LocalRotation; - return Interaction.InRangeUnobstructed(user, target, targetCoordinates, targetLocalAngle, range); + return Interaction.InRangeUnobstructed(user, target, targetCoordinates, targetLocalAngle, range, overlapCheck: false); } protected override void DoDamageEffect(List targets, EntityUid? user, TransformComponent targetXform) diff --git a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs index ec462ae23e..3c8314041f 100644 --- a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs @@ -78,7 +78,7 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem // Could also check the arc though future effort + if they're aimbotting it's not really going to make a difference. // (This runs lagcomp internally and is what clickattacks use) - if (!Interaction.InRangeUnobstructed(ignore, targetUid, range + 0.1f)) + if (!Interaction.InRangeUnobstructed(ignore, targetUid, range + 0.1f, overlapCheck: false)) return false; // TODO: Check arc though due to the aforementioned aimbot + damage split comments it's less important. @@ -193,7 +193,7 @@ public sealed class MeleeWeaponSystem : SharedMeleeWeaponSystem if (session is { } pSession) { (targetCoordinates, targetLocalAngle) = _lag.GetCoordinatesAngle(target, pSession); - return Interaction.InRangeUnobstructed(user, target, targetCoordinates, targetLocalAngle, range); + return Interaction.InRangeUnobstructed(user, target, targetCoordinates, targetLocalAngle, range, overlapCheck: false); } return Interaction.InRangeUnobstructed(user, target, range); diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 2926e1d1b3..a88f673cac 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -667,7 +667,8 @@ namespace Content.Shared.Interaction float range = InteractionRange, CollisionGroup collisionMask = InRangeUnobstructedMask, Ignored? predicate = null, - bool popup = false) + bool popup = false, + bool overlapCheck = true) { if (!Resolve(other, ref other.Comp)) return false; @@ -687,7 +688,8 @@ namespace Content.Shared.Interaction range, collisionMask, predicate, - popup); + popup, + overlapCheck); } /// @@ -717,6 +719,7 @@ namespace Content.Shared.Interaction /// /// True if the two points are within a given range without being obstructed. /// + /// If true, if the broadphase query returns an overlap (0f distance) this function will early out true with no raycast made. public bool InRangeUnobstructed( Entity origin, Entity other, @@ -725,7 +728,8 @@ namespace Content.Shared.Interaction float range = InteractionRange, CollisionGroup collisionMask = InRangeUnobstructedMask, Ignored? predicate = null, - bool popup = false) + bool popup = false, + bool overlapCheck = true) { Ignored combinedPredicate = e => e == origin.Owner || (predicate?.Invoke(e) ?? false); var inRange = true; @@ -768,7 +772,7 @@ namespace Content.Shared.Interaction inRange = false; } // Overlap, early out and no raycast. - else if (distance.Equals(0f)) + else if (overlapCheck && distance.Equals(0f)) { return true; } diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index 767b5c4ef6..15b00e4610 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -731,7 +731,13 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem if (res.Count != 0) { - resSet.Add(res[0].HitEntity); + // If there's exact distance overlap, we simply have to deal with all overlapping objects to avoid selecting randomly. + var resChecked = res.Where(x => x.Distance.Equals(res[0].Distance)); + foreach (var r in resChecked) + { + if (Interaction.InRangeUnobstructed(ignore, r.HitEntity, range + 0.1f, overlapCheck: false)) + resSet.Add(r.HitEntity); + } } } diff --git a/Resources/Prototypes/Entities/Structures/Windows/window.yml b/Resources/Prototypes/Entities/Structures/Windows/window.yml index 861791c089..b7241b3d27 100644 --- a/Resources/Prototypes/Entities/Structures/Windows/window.yml +++ b/Resources/Prototypes/Entities/Structures/Windows/window.yml @@ -157,7 +157,7 @@ fix1: shape: !type:PhysShapeAabb - bounds: "-0.49,-0.49,0.49,-0.36" + bounds: "-0.5,-0.5,0.5,-0.28125" density: 1500 mask: - FullTileMask