From cce2cf942dc0d16228b7d697475d484e3b803a29 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Wed, 13 Dec 2017 21:07:51 +0200 Subject: [PATCH] Fixed hulls not being linked to gaps if the center of the gap is exactly at the edge of the adjacent hulls. Closes #147 --- Barotrauma/BarotraumaShared/Source/Map/Gap.cs | 7 +++++-- Barotrauma/BarotraumaShared/Source/Map/Hull.cs | 12 ++++++------ .../BarotraumaShared/Source/Map/Submarine.cs | 14 +++++++++++--- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Map/Gap.cs b/Barotrauma/BarotraumaShared/Source/Map/Gap.cs index cf1969028..8b79581b2 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Gap.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Gap.cs @@ -163,8 +163,11 @@ namespace Barotrauma searchPos[1] = new Vector2(rect.Center.X, rect.Y - rect.Height); } - hulls[0] = Hull.FindHullOld(searchPos[0], null, false); - hulls[1] = Hull.FindHullOld(searchPos[1], null, false); + for (int i = 0; i < 2; i++) + { + hulls[i] = Hull.FindHullOld(searchPos[i], null, false); + if (hulls[i] == null) hulls[i] = Hull.FindHullOld(searchPos[i], null, false, true); + } if (hulls[0] == null && hulls[1] == null) return; diff --git a/Barotrauma/BarotraumaShared/Source/Map/Hull.cs b/Barotrauma/BarotraumaShared/Source/Map/Hull.cs index 932807c2b..a74c65fd7 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Hull.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Hull.cs @@ -558,23 +558,23 @@ namespace Barotrauma return null; } - + //returns the water block which contains the point (or null if it isn't inside any) - public static Hull FindHullOld(Vector2 position, Hull guess = null, bool useWorldCoordinates = true) + public static Hull FindHullOld(Vector2 position, Hull guess = null, bool useWorldCoordinates = true, bool inclusive = false) { - return FindHullOld(position, hullList, guess, useWorldCoordinates); + return FindHullOld(position, hullList, guess, useWorldCoordinates, inclusive); } - public static Hull FindHullOld(Vector2 position, List hulls, Hull guess = null, bool useWorldCoordinates = true) + public static Hull FindHullOld(Vector2 position, List hulls, Hull guess = null, bool useWorldCoordinates = true, bool inclusive = false) { if (guess != null && hulls.Contains(guess)) { - if (Submarine.RectContains(useWorldCoordinates ? guess.WorldRect : guess.rect, position)) return guess; + if (Submarine.RectContains(useWorldCoordinates ? guess.WorldRect : guess.rect, position, inclusive)) return guess; } foreach (Hull hull in hulls) { - if (Submarine.RectContains(useWorldCoordinates ? hull.WorldRect : hull.rect, position)) return hull; + if (Submarine.RectContains(useWorldCoordinates ? hull.WorldRect : hull.rect, position, inclusive)) return hull; } return null; diff --git a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs index 5a4ae4962..854adb3be 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs @@ -491,10 +491,18 @@ namespace Barotrauma return new Rectangle((int)pos.X, (int)pos.Y, (int)size.X, (int)size.Y); } - public static bool RectContains(Rectangle rect, Vector2 pos) + public static bool RectContains(Rectangle rect, Vector2 pos, bool inclusive = false) { - return (pos.X > rect.X && pos.X < rect.X + rect.Width - && pos.Y < rect.Y && pos.Y > rect.Y - rect.Height); + if (inclusive) + { + return (pos.X >= rect.X && pos.X <= rect.X + rect.Width + && pos.Y <= rect.Y && pos.Y >= rect.Y - rect.Height); + } + else + { + return (pos.X > rect.X && pos.X < rect.X + rect.Width + && pos.Y < rect.Y && pos.Y > rect.Y - rect.Height); + } } public static bool RectsOverlap(Rectangle rect1, Rectangle rect2, bool inclusive=true)