private void Decorade(Chunk chunk, int x, int z, PopulationParam populationParam, IDecoration decoration) { if (decoration == null || chunk == null) { return; } int height = populationParam.maxDecorationHeight < heightCap ? populationParam.maxDecorationHeight : heightCap; //找出适合当前装饰品的高度 for (int y = height - 1; y >= populationParam.minDecorationHeight; y--) { BlockType curType = chunk.GetBlock(x, y, z).BlockType; if (curType != BlockType.Air && curType != BlockType.StillWater) { List <CheckCondition> conditions = populationParam.checkConditions; bool canDecorate = CheckConditionMeet(chunk, conditions, x, y, z); if (canDecorate && _random.Range(0, 100) < populationParam.heightGenerateRate) { if (decoration.Decorade(chunk, x, y + 1, z, _random)) { return; } } } } }
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); } }
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); } } } }