From 5f4e6dc1a3731041020f85156c71ac2b239a031e Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Thu, 23 May 2019 15:16:59 +0300 Subject: [PATCH] (8adbf4e54) Fixed hitscan projectiles going through walls if the weapon is fired while it's barrel is inside a collider --- .../Source/Items/Components/Projectile.cs | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs index 596e50d1e..f821873bc 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs @@ -276,12 +276,34 @@ namespace Barotrauma.Items.Components private List DoRayCast(Vector2 rayStart, Vector2 rayEnd) { List hits = new List(); + + Vector2 dir = rayEnd - rayStart; + dir = dir.LengthSquared() < 0.00001f ? Vector2.UnitY : Vector2.Normalize(dir); + + //do an AABB query first to see if the start of the ray is inside a fixture + var aabb = new FarseerPhysics.Collision.AABB(rayStart - Vector2.One * 0.001f, rayStart + Vector2.One * 0.001f); + GameMain.World.QueryAABB((fixture) => + { + //ignore sensors and items + if (fixture?.Body == null || fixture.IsSensor) return true; + if (fixture.UserData is Item) return true; + + //ignore everything else than characters, sub walls and level walls + if (!fixture.CollisionCategories.HasFlag(Physics.CollisionCharacter) && + !fixture.CollisionCategories.HasFlag(Physics.CollisionWall) && + !fixture.CollisionCategories.HasFlag(Physics.CollisionLevel)) return true; + + hits.Add(new HitscanResult(fixture, rayStart, -dir, 0.0f)); + return true; + }, ref aabb); + GameMain.World.RayCast((fixture, point, normal, fraction) => { - if (fixture == null || fixture.IsSensor) return -1; - + //ignore sensors and items + if (fixture?.Body == null || fixture.IsSensor) return -1; if (fixture.UserData is Item) return -1; + //ignore everything else than characters, sub walls and level walls if (!fixture.CollisionCategories.HasFlag(Physics.CollisionCharacter) && !fixture.CollisionCategories.HasFlag(Physics.CollisionWall) && !fixture.CollisionCategories.HasFlag(Physics.CollisionLevel)) return -1;