diff --git a/OpenRA.Mods.Common/Traits/Buildings/Building.cs b/OpenRA.Mods.Common/Traits/Buildings/Building.cs index 05a2035df0..a0d7296575 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Building.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Building.cs @@ -241,13 +241,16 @@ namespace OpenRA.Mods.Common.Traits } } - public class Building : IOccupySpace, ITargetableCells, INotifySold, INotifyTransform, ISync, INotifyCreated, INotifyAddedToWorld, INotifyRemovedFromWorld + public class Building : IOccupySpace, ITargetableCells, INotifySold, INotifyTransform, ISync, INotifyCreated, + INotifyAddedToWorld, INotifyRemovedFromWorld { + public readonly bool SkipMakeAnimation; public readonly BuildingInfo Info; public bool BuildComplete { get; private set; } + [Sync] readonly CPos topLeft; readonly Actor self; - public readonly bool SkipMakeAnimation; + readonly BuildingInfluence influence; Pair[] occupiedCells; Pair[] targetableCells; @@ -274,6 +277,7 @@ namespace OpenRA.Mods.Common.Traits self = init.Self; topLeft = init.Get(); Info = info; + influence = self.World.WorldActor.Trait(); occupiedCells = Info.UnpathableTiles(TopLeft) .Select(c => Pair.New(c, SubCell.FullCell)).ToArray(); @@ -305,6 +309,8 @@ namespace OpenRA.Mods.Common.Traits if (!self.Bounds.Size.IsEmpty) self.World.ScreenMap.Add(self); + + influence.AddInfluence(self, Info.Tiles(self.Location)); } void INotifyRemovedFromWorld.RemovedFromWorld(Actor self) @@ -314,6 +320,8 @@ namespace OpenRA.Mods.Common.Traits if (!self.Bounds.Size.IsEmpty) self.World.ScreenMap.Remove(self); + + influence.RemoveInfluence(self, Info.Tiles(self.Location)); } public void NotifyBuildingComplete(Actor self) diff --git a/OpenRA.Mods.Common/Traits/Buildings/BuildingInfluence.cs b/OpenRA.Mods.Common/Traits/Buildings/BuildingInfluence.cs index f9e90a2991..d5c9a9fac2 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/BuildingInfluence.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/BuildingInfluence.cs @@ -9,6 +9,7 @@ */ #endregion +using System.Collections.Generic; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -29,28 +30,20 @@ namespace OpenRA.Mods.Common.Traits map = world.Map; influence = new CellLayer(map); + } - world.ActorAdded += a => - { - var b = a.Info.TraitInfoOrDefault(); - if (b == null) - return; + internal void AddInfluence(Actor a, IEnumerable tiles) + { + foreach (var u in tiles) + if (influence.Contains(u) && influence[u] == null) + influence[u] = a; + } - foreach (var u in b.Tiles(a.Location)) - if (influence.Contains(u) && influence[u] == null) - influence[u] = a; - }; - - world.ActorRemoved += a => - { - var b = a.Info.TraitInfoOrDefault(); - if (b == null) - return; - - foreach (var u in b.Tiles(a.Location)) - if (influence.Contains(u) && influence[u] == a) - influence[u] = null; - }; + internal void RemoveInfluence(Actor a, IEnumerable tiles) + { + foreach (var u in tiles) + if (influence.Contains(u) && influence[u] == a) + influence[u] = null; } public Actor GetBuildingAt(CPos cell)