(8adbf4e54) Fixed hitscan projectiles going through walls if the weapon is fired while it's barrel is inside a collider

This commit is contained in:
Joonas Rikkonen
2019-05-23 15:16:59 +03:00
parent 65eb8f35c9
commit 5f4e6dc1a3
@@ -276,12 +276,34 @@ namespace Barotrauma.Items.Components
private List<HitscanResult> DoRayCast(Vector2 rayStart, Vector2 rayEnd) private List<HitscanResult> DoRayCast(Vector2 rayStart, Vector2 rayEnd)
{ {
List<HitscanResult> hits = new List<HitscanResult>(); List<HitscanResult> hits = new List<HitscanResult>();
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) => 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; if (fixture.UserData is Item) return -1;
//ignore everything else than characters, sub walls and level walls
if (!fixture.CollisionCategories.HasFlag(Physics.CollisionCharacter) && if (!fixture.CollisionCategories.HasFlag(Physics.CollisionCharacter) &&
!fixture.CollisionCategories.HasFlag(Physics.CollisionWall) && !fixture.CollisionCategories.HasFlag(Physics.CollisionWall) &&
!fixture.CollisionCategories.HasFlag(Physics.CollisionLevel)) return -1; !fixture.CollisionCategories.HasFlag(Physics.CollisionLevel)) return -1;