private void DispatchDecoration(Chunk chunk, int x, int z, PopulationParam populationParam, IDecoration decoration, int curBiomeId) { Decorade(chunk, x, z, populationParam, decoration); int size = _random.Range(populationParam.minSize, populationParam.maxSize); for (int i = 0; i < size; i++) { int dis = _random.Range(populationParam.minParentDis, populationParam.maxParentDis); int minX = Math.Max(0, x - dis); int maxX = Math.Min(Chunk.chunkWidth, x + dis) + 1; int minZ = Math.Max(0, z - dis); int maxZ = Math.Min(Chunk.chunkDepth, z + dis) + 1; int nextX = _random.Range(minX, maxX); if (nextX < 0 || nextX > Chunk.chunkWidth - 1) { continue; } int nextZ = _random.Range(minZ, maxZ); if (nextZ < 0 || nextZ > Chunk.chunkDepth - 1) { continue; } if (chunk.GetBiomeId(nextX, nextZ) != curBiomeId) { continue; } Decorade(chunk, nextX, nextZ, populationParam, decoration); } }
public int GetBiomeId(int x, int z) { Chunk chunk = GetChunk(x, 0, z); if (chunk != null && chunk.isTerrainDataPrepared) { return(chunk.GetBiomeId(x - chunk.worldPos.x, z - chunk.worldPos.z, true)); } return(-1); }
private void GenerateEntity(Chunk chunk, BiomeConfig biomeConfig) { for (int i = 0; i < biomeConfig.entityParams.Count; i++) { EntityParam entityParam = biomeConfig.entityParams[i]; if (_random.Range(0, 100) < entityParam.productRate) { for (int j = 0; j < entityParam.maxNum; j++) { int x = _random.Range(1, Chunk.chunkWidth - 1); int z = _random.Range(1, Chunk.chunkDepth - 1); if (chunk.GetBiomeId(x, z, true) != biomeConfig.biomeId) { continue; } DispatchEntity(chunk, x, z, entityParam); } } } }
private void GeneratePopulation(Chunk chunk, BiomeConfig biomeConfig) { for (int i = 0; i < biomeConfig.populationParams.Count; i++) { PopulationParam populationParam = biomeConfig.populationParams[i]; if (_random.Range(0, 100) < populationParam.productRate) { IDecoration decoration = DecorationFactory.GetDecoration(populationParam.decorationType); for (int j = 0; j < populationParam.frequency; j++) { int x = _random.Range(0, Chunk.chunkWidth); int z = _random.Range(0, Chunk.chunkDepth); if (chunk.GetBiomeId(x, z, true) != biomeConfig.biomeId) { continue; } DispatchDecoration(chunk, x, z, populationParam, decoration, biomeConfig.biomeId); } } } }
public void Generate(Chunk chunk) { _biomes.Clear(); _random.seed = chunk.chunkSeed; for (int x = 0; x < Chunk.chunkWidth; x++) { for (int z = 0; z < Chunk.chunkDepth; z++) { int biomeId = chunk.GetBiomeId(x, z, true); if (!_biomes.Contains(biomeId)) { _biomes.Add(biomeId); } } } for (int i = 0; i < _biomes.Count; i++) { BiomeConfig biomeConfig = WorldConfig.Instance.GetBiomeConfigById(_biomes[i]); GeneratePopulation(chunk, biomeConfig); GenerateEntity(chunk, biomeConfig); } }