From ee77db1831428c6b683a47722a32526746cd2774 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Wed, 24 Sep 2014 22:30:13 +1200 Subject: [PATCH] Add some additional robustness against bogus cell queries in ActorMap. --- OpenRA.Game/Traits/World/ActorMap.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/OpenRA.Game/Traits/World/ActorMap.cs b/OpenRA.Game/Traits/World/ActorMap.cs index 7bb3911ecf..4511fa174c 100644 --- a/OpenRA.Game/Traits/World/ActorMap.cs +++ b/OpenRA.Game/Traits/World/ActorMap.cs @@ -119,22 +119,31 @@ namespace OpenRA.Traits // NOTE: always includes transients with influence public bool AnyUnitsAt(CPos a) { + if (!map.Contains(a)) + return false; + return influence[a] != null; } // NOTE: can not check aircraft 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) + { if (always || i.SubCell == sub || i.SubCell == SubCell.FullCell) { if (checkTransient) return true; + var pos = i.Actor.TraitOrDefault(); if (pos == null || !pos.IsLeavingCell(a, i.SubCell)) return true; } + } return false; } @@ -142,7 +151,10 @@ namespace OpenRA.Traits // NOTE: can not check aircraft public bool AnyUnitsAt(CPos a, SubCell sub, Func 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) if (always || i.SubCell == sub || i.SubCell == SubCell.FullCell) if (withCondition(i.Actor))