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;