Fix Map.Contains checks for maps with height.

If a cell lacked any valid projected cells, then it is off the map entirely. The previous logic would think such a cell was within the map as none of projected cells were out of bounds (as there were no projected cells to fail the check).
This commit is contained in:
RoosterDragon
2016-02-06 17:55:27 +00:00
parent 8588f36575
commit 36e09990ca
2 changed files with 9 additions and 6 deletions

View File

@@ -771,7 +771,12 @@ namespace OpenRA
if (Grid.MaximumTerrainHeight == 0) if (Grid.MaximumTerrainHeight == 0)
return Contains((PPos)uv); return Contains((PPos)uv);
foreach (var puv in ProjectedCellsCovering(uv)) // If the cell has no valid projection, then we're off the map.
var projectedCells = ProjectedCellsCovering(uv);
if (projectedCells.Length == 0)
return false;
foreach (var puv in projectedCells)
if (!Contains(puv)) if (!Contains(puv))
return false; return false;
return true; return true;

View File

@@ -65,17 +65,15 @@ namespace OpenRA.Traits
.ToArray(); .ToArray();
if (Footprint.Length == 0) if (Footprint.Length == 0)
throw new ArgumentException(("This frozen actor has no footprint! Please report a bug!\n" + throw new ArgumentException(("This frozen actor has no footprint.\n" +
"Actor Name: {0}\n" + "Actor Name: {0}\n" +
"Actor Location: {1}\n" + "Actor Location: {1}\n" +
"Input footprint: [{2}]\n" + "Input footprint: [{2}]\n" +
"Input footprint (shroud.Contains): [{3}]\n" + "Input footprint (after shroud.Contains): [{3}]")
"Input footprint (map.Contains): [{4}]")
.F(actor.Info.Name, .F(actor.Info.Name,
actor.Location.ToString(), actor.Location.ToString(),
footprint.Select(p => p.ToString()).JoinWith("|"), footprint.Select(p => p.ToString()).JoinWith("|"),
footprint.Select(p => shroud.Contains(p).ToString()).JoinWith("|"), footprint.Select(p => shroud.Contains(p).ToString()).JoinWith("|")));
footprint.Select(p => actor.World.Map.Contains(p).ToString()).JoinWith("|")));
CenterPosition = self.CenterPosition; CenterPosition = self.CenterPosition;
Bounds = self.Bounds; Bounds = self.Bounds;