diff --git a/OpenRA.Mods.RA/Crate.cs b/OpenRA.Mods.RA/Crate.cs index cfaba5d447..e48b39aeec 100644 --- a/OpenRA.Mods.RA/Crate.cs +++ b/OpenRA.Mods.RA/Crate.cs @@ -132,6 +132,10 @@ namespace OpenRA.Mods.RA self.World.ActorMap.AddInfluence(self, this); self.World.ActorMap.AddPosition(self, this); self.World.ScreenMap.Add(self); + + var cs = self.World.WorldActor.TraitOrDefault(); + if (cs != null) + cs.IncrementCrates(); } public void RemovedFromWorld(Actor self) @@ -139,6 +143,10 @@ namespace OpenRA.Mods.RA self.World.ActorMap.RemoveInfluence(self, this); self.World.ActorMap.RemovePosition(self, this); self.World.ScreenMap.Remove(self); + + var cs = self.World.WorldActor.TraitOrDefault(); + if (cs != null) + cs.DecrementCrates(); } } } diff --git a/OpenRA.Mods.RA/CrateSpawner.cs b/OpenRA.Mods.RA/CrateSpawner.cs index 02b2f04456..aafa8371dc 100644 --- a/OpenRA.Mods.RA/CrateSpawner.cs +++ b/OpenRA.Mods.RA/CrateSpawner.cs @@ -44,7 +44,7 @@ namespace OpenRA.Mods.RA public class CrateSpawner : ITick { - List crates = new List(); + int crates = 0; int ticks = 0; CrateSpawnerInfo info; Actor self; @@ -64,10 +64,8 @@ namespace OpenRA.Mods.RA { ticks = info.SpawnInterval * 25; - crates.RemoveAll(x => !x.IsInWorld); // BUG: this removes crates that are cargo of a BADR! - - var toSpawn = Math.Max(0, info.Minimum - crates.Count) - + (crates.Count < info.Maximum ? 1 : 0); + var toSpawn = Math.Max(0, info.Minimum - crates) + + (crates < info.Maximum ? 1 : 0); for (var n = 0; n < toSpawn; n++) SpawnCrate(self); @@ -91,8 +89,6 @@ namespace OpenRA.Mods.RA if (info.DeliveryAircraft != null) { var crate = w.CreateActor(false, crateActor, new TypeDictionary { new OwnerInit(w.WorldActor.Owner) }); - crates.Add(crate); - var startPos = w.ChooseRandomEdgeCell(); var altitude = Rules.Info[info.DeliveryAircraft].Traits.Get().CruiseAltitude; var plane = w.CreateActor(info.DeliveryAircraft, new TypeDictionary @@ -109,7 +105,7 @@ namespace OpenRA.Mods.RA } else { - crates.Add(w.CreateActor(crateActor, new TypeDictionary { new OwnerInit(w.WorldActor.Owner), new LocationInit(p) })); + w.CreateActor(crateActor, new TypeDictionary { new OwnerInit(w.WorldActor.Owner), new LocationInit(p) }); } }); } @@ -151,5 +147,15 @@ namespace OpenRA.Mods.RA return null; } + + public void IncrementCrates() + { + crates++; + } + + public void DecrementCrates() + { + crates--; + } } }