Add some additional robustness against bogus cell queries in ActorMap.
This commit is contained in:
@@ -119,22 +119,31 @@ 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))
|
||||||
|
return false;
|
||||||
|
|
||||||
return influence[a] != null;
|
return influence[a] != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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)
|
||||||
{
|
{
|
||||||
bool always = sub == SubCell.FullCell || sub == SubCell.Any;
|
if (!map.Contains(a))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var always = sub == SubCell.FullCell || sub == SubCell.Any;
|
||||||
for (var i = influence[a]; i != null; i = i.Next)
|
for (var i = influence[a]; i != null; i = i.Next)
|
||||||
|
{
|
||||||
if (always || i.SubCell == sub || i.SubCell == SubCell.FullCell)
|
if (always || i.SubCell == sub || i.SubCell == SubCell.FullCell)
|
||||||
{
|
{
|
||||||
if (checkTransient)
|
if (checkTransient)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
var pos = i.Actor.TraitOrDefault<IPositionable>();
|
var pos = i.Actor.TraitOrDefault<IPositionable>();
|
||||||
if (pos == null || !pos.IsLeavingCell(a, i.SubCell))
|
if (pos == null || !pos.IsLeavingCell(a, i.SubCell))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -142,7 +151,10 @@ 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)
|
||||||
{
|
{
|
||||||
bool always = sub == SubCell.FullCell || sub == SubCell.Any;
|
if (!map.Contains(a))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var always = sub == SubCell.FullCell || sub == SubCell.Any;
|
||||||
for (var i = influence[a]; i != null; i = i.Next)
|
for (var i = influence[a]; i != null; i = i.Next)
|
||||||
if (always || i.SubCell == sub || i.SubCell == SubCell.FullCell)
|
if (always || i.SubCell == sub || i.SubCell == SubCell.FullCell)
|
||||||
if (withCondition(i.Actor))
|
if (withCondition(i.Actor))
|
||||||
|
|||||||
Reference in New Issue
Block a user