void SpawnCrate(Actor self, CrateSpawnerInfo info) { var threshold = 100; var inWater = self.World.SharedRandom.NextDouble() < info.WaterChance; for (var n = 0; n < threshold; n++) { var p = self.World.ChooseRandomCell(self.World.SharedRandom); // Is this valid terrain? var terrainType = self.World.GetTerrainType(p); if (!(inWater ? info.ValidWater : info.ValidGround).Contains(terrainType)) { continue; } // Don't spawn on any actors if (self.World.WorldActor.Trait <BuildingInfluence>().GetBuildingAt(p) != null) { continue; } if (self.World.ActorMap.GetUnitsAt(p).Any()) { continue; } self.World.AddFrameEndTask( w => crates.Add(w.CreateActor("crate", new TypeDictionary { new LocationInit(p), new OwnerInit(self.World.WorldActor.Owner), }))); return; } }
public CrateSpawner(CrateSpawnerInfo info, Actor self) { this.info = info; this.self = self; }