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);
     }
 }