Merge pull request #8813 from pchote/fix-bounds-checks

Replace map.Contains with proper array bounds checks.
This commit is contained in:
Pavel Penev
2015-07-28 04:27:53 +03:00
4 changed files with 15 additions and 17 deletions

View File

@@ -194,7 +194,7 @@ namespace OpenRA.Traits
public IEnumerable<Actor> GetUnitsAt(CPos a) public IEnumerable<Actor> GetUnitsAt(CPos a)
{ {
if (!map.Contains(a)) if (!influence.Contains(a))
yield break; yield break;
for (var i = influence[a]; i != null; i = i.Next) for (var i = influence[a]; i != null; i = i.Next)
@@ -204,7 +204,7 @@ namespace OpenRA.Traits
public IEnumerable<Actor> GetUnitsAt(CPos a, SubCell sub) public IEnumerable<Actor> GetUnitsAt(CPos a, SubCell sub)
{ {
if (!map.Contains(a)) if (!influence.Contains(a))
yield break; yield break;
for (var i = influence[a]; i != null; i = i.Next) for (var i = influence[a]; i != null; i = i.Next)
@@ -249,7 +249,7 @@ namespace OpenRA.Traits
// NOTE: always includes transients with influence // NOTE: always includes transients with influence
public bool AnyUnitsAt(CPos a) public bool AnyUnitsAt(CPos a)
{ {
if (!map.Contains(a)) if (!influence.Contains(a))
return false; return false;
return influence[a] != null; return influence[a] != null;
@@ -258,7 +258,7 @@ namespace OpenRA.Traits
// NOTE: can not check aircraft // NOTE: can not check aircraft
public bool AnyUnitsAt(CPos a, SubCell sub, bool checkTransient = true) public bool AnyUnitsAt(CPos a, SubCell sub, bool checkTransient = true)
{ {
if (!map.Contains(a)) if (!influence.Contains(a))
return false; return false;
var always = sub == SubCell.FullCell || sub == SubCell.Any; var always = sub == SubCell.FullCell || sub == SubCell.Any;
@@ -281,7 +281,7 @@ namespace OpenRA.Traits
// NOTE: can not check aircraft // NOTE: can not check aircraft
public bool AnyUnitsAt(CPos a, SubCell sub, Func<Actor, bool> withCondition) public bool AnyUnitsAt(CPos a, SubCell sub, Func<Actor, bool> withCondition)
{ {
if (!map.Contains(a)) if (!influence.Contains(a))
return false; return false;
var always = sub == SubCell.FullCell || sub == SubCell.Any; var always = sub == SubCell.FullCell || sub == SubCell.Any;
@@ -296,7 +296,7 @@ namespace OpenRA.Traits
{ {
foreach (var c in ios.OccupiedCells()) foreach (var c in ios.OccupiedCells())
{ {
if (!map.Contains(c.First)) if (!influence.Contains(c.First))
continue; continue;
influence[c.First] = new InfluenceNode { Next = influence[c.First], SubCell = c.Second, Actor = self }; influence[c.First] = new InfluenceNode { Next = influence[c.First], SubCell = c.Second, Actor = self };
@@ -312,7 +312,7 @@ namespace OpenRA.Traits
{ {
foreach (var c in ios.OccupiedCells()) foreach (var c in ios.OccupiedCells())
{ {
if (!map.Contains(c.First)) if (!influence.Contains(c.First))
continue; continue;
var temp = influence[c.First]; var temp = influence[c.First];
@@ -381,7 +381,7 @@ namespace OpenRA.Traits
foreach (var c in cells) foreach (var c in cells)
{ {
if (!map.Contains(c)) if (!influence.Contains(c))
continue; continue;
if (!cellTriggerInfluence.ContainsKey(c)) if (!cellTriggerInfluence.ContainsKey(c))

View File

@@ -36,7 +36,7 @@ namespace OpenRA.Mods.Common.Traits
return; return;
foreach (var u in FootprintUtils.Tiles(map.Rules, a.Info.Name, b.Info, a.Location)) foreach (var u in FootprintUtils.Tiles(map.Rules, a.Info.Name, b.Info, a.Location))
if (map.Contains(u) && influence[u] == null) if (influence.Contains(u) && influence[u] == null)
influence[u] = a; influence[u] = a;
}; };
@@ -47,14 +47,14 @@ namespace OpenRA.Mods.Common.Traits
return; return;
foreach (var u in FootprintUtils.Tiles(map.Rules, a.Info.Name, b.Info, a.Location)) foreach (var u in FootprintUtils.Tiles(map.Rules, a.Info.Name, b.Info, a.Location))
if (map.Contains(u) && influence[u] == a) if (influence.Contains(u) && influence[u] == a)
influence[u] = null; influence[u] = null;
}; };
} }
public Actor GetBuildingAt(CPos cell) public Actor GetBuildingAt(CPos cell)
{ {
if (!map.Contains(cell)) if (!influence.Contains(cell))
return null; return null;
return influence[cell]; return influence[cell];

View File

@@ -27,14 +27,12 @@ namespace OpenRA.Mods.Common.Traits
class BridgeLayer : IWorldLoaded class BridgeLayer : IWorldLoaded
{ {
readonly BridgeLayerInfo info; readonly BridgeLayerInfo info;
readonly World world;
Dictionary<ushort, Pair<string, int>> bridgeTypes = new Dictionary<ushort, Pair<string, int>>(); Dictionary<ushort, Pair<string, int>> bridgeTypes = new Dictionary<ushort, Pair<string, int>>();
CellLayer<Bridge> bridges; CellLayer<Bridge> bridges;
public BridgeLayer(Actor self, BridgeLayerInfo info) public BridgeLayer(Actor self, BridgeLayerInfo info)
{ {
this.info = info; this.info = info;
this.world = self.World;
} }
public void WorldLoaded(World w, WorldRenderer wr) public void WorldLoaded(World w, WorldRenderer wr)
@@ -81,6 +79,7 @@ namespace OpenRA.Mods.Common.Traits
}).Trait<Bridge>(); }).Trait<Bridge>();
var subTiles = new Dictionary<CPos, byte>(); var subTiles = new Dictionary<CPos, byte>();
var mapTiles = w.Map.MapTiles.Value;
// For each subtile in the template // For each subtile in the template
for (byte ind = 0; ind < template.Size.X * template.Size.Y; ind++) for (byte ind = 0; ind < template.Size.X * template.Size.Y; ind++)
@@ -89,8 +88,7 @@ namespace OpenRA.Mods.Common.Traits
var subtile = new CPos(ni + ind % template.Size.X, nj + ind / template.Size.X); var subtile = new CPos(ni + ind % template.Size.X, nj + ind / template.Size.X);
// This isn't the bridge you're looking for // This isn't the bridge you're looking for
if (!w.Map.Contains(subtile) || w.Map.MapTiles.Value[subtile].Type != tile || if (!mapTiles.Contains(subtile) || mapTiles[subtile].Type != tile || mapTiles[subtile].Index != ind)
w.Map.MapTiles.Value[subtile].Index != ind)
continue; continue;
subTiles.Add(subtile, ind); subTiles.Add(subtile, ind);
@@ -103,7 +101,7 @@ namespace OpenRA.Mods.Common.Traits
// Used to check for neighbouring bridges // Used to check for neighbouring bridges
public Bridge GetBridge(CPos cell) public Bridge GetBridge(CPos cell)
{ {
if (!world.Map.Contains(cell)) if (!bridges.Contains(cell))
return null; return null;
return bridges[cell]; return bridges[cell];

View File

@@ -72,7 +72,7 @@ namespace OpenRA.Mods.Common.Traits
public bool IsPassable(CPos p1, CPos p2) public bool IsPassable(CPos p1, CPos p2)
{ {
if (!map.Contains(p1) || !map.Contains(p2)) if (!domains.Contains(p1) || !domains.Contains(p2))
return false; return false;
if (domains[p1] == domains[p2]) if (domains[p1] == domains[p2])