    001    package net.minecraft.src;
    002
    003    import java.util.Random;
    004
    005    public class BiomeDecorator
    006    {
    007        /** The world the BiomeDecorator is currently decorating */
    008        protected World currentWorld;
    009
    010        /** The Biome Decorator's random number generator. */
    011        protected Random randomGenerator;
    012
    013        /** The X-coordinate of the chunk currently being decorated */
    014        protected int chunk_X;
    015
    016        /** The Z-coordinate of the chunk currently being decorated */
    017        protected int chunk_Z;
    018
    019        /** The biome generator object. */
    020        protected BiomeGenBase biome;
    021
    022        /** The clay generator. */
    023        protected WorldGenerator clayGen = new WorldGenClay(4);
    024
    025        /** The sand generator. */
    026        protected WorldGenerator sandGen;
    027
    028        /** The gravel generator. */
    029        protected WorldGenerator gravelAsSandGen;
    030
    031        /** The dirt generator. */
    032        protected WorldGenerator dirtGen;
    033        protected WorldGenerator gravelGen;
    034        protected WorldGenerator coalGen;
    035        protected WorldGenerator ironGen;
    036
    037        /** Field that holds gold WorldGenMinable */
    038        protected WorldGenerator goldGen;
    039
    040        /** Field that holds redstone WorldGenMinable */
    041        protected WorldGenerator redstoneGen;
    042
    043        /** Field that holds diamond WorldGenMinable */
    044        protected WorldGenerator diamondGen;
    045
    046        /** Field that holds Lapis WorldGenMinable */
    047        protected WorldGenerator lapisGen;
    048
    049        /** Field that holds one of the plantYellow WorldGenFlowers */
    050        protected WorldGenerator plantYellowGen;
    051
    052        /** Field that holds one of the plantRed WorldGenFlowers */
    053        protected WorldGenerator plantRedGen;
    054
    055        /** Field that holds mushroomBrown WorldGenFlowers */
    056        protected WorldGenerator mushroomBrownGen;
    057
    058        /** Field that holds mushroomRed WorldGenFlowers */
    059        protected WorldGenerator mushroomRedGen;
    060
    061        /** Field that holds big mushroom generator */
    062        protected WorldGenerator bigMushroomGen;
    063
    064        /** Field that holds WorldGenReed */
    065        protected WorldGenerator reedGen;
    066
    067        /** Field that holds WorldGenCactus */
    068        protected WorldGenerator cactusGen;
    069
    070        /** The water lily generation! */
    071        protected WorldGenerator waterlilyGen;
    072
    073        /** Amount of waterlilys per chunk. */
    074        protected int waterlilyPerChunk;
    075
    076        /**
    077         * The number of trees to attempt to generate per chunk. Up to 10 in forests, none in deserts.
    078         */
    079        protected int treesPerChunk;
    080
    081        /**
    082         * The number of yellow flower patches to generate per chunk. The game generates much less than this number, since
    083         * it attempts to generate them at a random altitude.
    084         */
    085        protected int flowersPerChunk;
    086
    087        /** The amount of tall grass to generate per chunk. */
    088        protected int grassPerChunk;
    089
    090        /**
    091         * The number of dead bushes to generate per chunk. Used in deserts and swamps.
    092         */
    093        protected int deadBushPerChunk;
    094
    095        /**
    096         * The number of extra mushroom patches per chunk. It generates 1/4 this number in brown mushroom patches, and 1/8
    097         * this number in red mushroom patches. These mushrooms go beyond the default base number of mushrooms.
    098         */
    099        protected int mushroomsPerChunk;
    100
    101        /**
    102         * The number of reeds to generate per chunk. Reeds won't generate if the randomly selected placement is unsuitable.
    103         */
    104        protected int reedsPerChunk;
    105
    106        /**
    107         * The number of cactus plants to generate per chunk. Cacti only work on sand.
    108         */
    109        protected int cactiPerChunk;
    110
    111        /**
    112         * The number of sand patches to generate per chunk. Sand patches only generate when part of it is underwater.
    113         */
    114        protected int sandPerChunk;
    115
    116        /**
    117         * The number of sand patches to generate per chunk. Sand patches only generate when part of it is underwater. There
    118         * appear to be two separate fields for this.
    119         */
    120        protected int sandPerChunk2;
    121
    122        /**
    123         * The number of clay patches to generate per chunk. Only generates when part of it is underwater.
    124         */
    125        protected int clayPerChunk;
    126
    127        /** Amount of big mushrooms per chunk */
    128        protected int bigMushroomsPerChunk;
    129
    130        /** True if decorator should generate surface lava & water */
    131        public boolean generateLakes;
    132
    133        public BiomeDecorator(BiomeGenBase par1BiomeGenBase)
    134        {
    135            this.sandGen = new WorldGenSand(7, Block.sand.blockID);
    136            this.gravelAsSandGen = new WorldGenSand(6, Block.gravel.blockID);
    137            this.dirtGen = new WorldGenMinable(Block.dirt.blockID, 32);
    138            this.gravelGen = new WorldGenMinable(Block.gravel.blockID, 32);
    139            this.coalGen = new WorldGenMinable(Block.oreCoal.blockID, 16);
    140            this.ironGen = new WorldGenMinable(Block.oreIron.blockID, 8);
    141            this.goldGen = new WorldGenMinable(Block.oreGold.blockID, 8);
    142            this.redstoneGen = new WorldGenMinable(Block.oreRedstone.blockID, 7);
    143            this.diamondGen = new WorldGenMinable(Block.oreDiamond.blockID, 7);
    144            this.lapisGen = new WorldGenMinable(Block.oreLapis.blockID, 6);
    145            this.plantYellowGen = new WorldGenFlowers(Block.plantYellow.blockID);
    146            this.plantRedGen = new WorldGenFlowers(Block.plantRed.blockID);
    147            this.mushroomBrownGen = new WorldGenFlowers(Block.mushroomBrown.blockID);
    148            this.mushroomRedGen = new WorldGenFlowers(Block.mushroomRed.blockID);
    149            this.bigMushroomGen = new WorldGenBigMushroom();
    150            this.reedGen = new WorldGenReed();
    151            this.cactusGen = new WorldGenCactus();
    152            this.waterlilyGen = new WorldGenWaterlily();
    153            this.waterlilyPerChunk = 0;
    154            this.treesPerChunk = 0;
    155            this.flowersPerChunk = 2;
    156            this.grassPerChunk = 1;
    157            this.deadBushPerChunk = 0;
    158            this.mushroomsPerChunk = 0;
    159            this.reedsPerChunk = 0;
    160            this.cactiPerChunk = 0;
    161            this.sandPerChunk = 1;
    162            this.sandPerChunk2 = 3;
    163            this.clayPerChunk = 1;
    164            this.bigMushroomsPerChunk = 0;
    165            this.generateLakes = true;
    166            this.biome = par1BiomeGenBase;
    167        }
    168
    169        /**
    170         * Decorates the world. Calls code that was formerly (pre-1.8) in ChunkProviderGenerate.populate
    171         */
    172        public void decorate(World par1World, Random par2Random, int par3, int par4)
    173        {
    174            if (this.currentWorld != null)
    175            {
    176                throw new RuntimeException("Already decorating!!");
    177            }
    178            else
    179            {
    180                this.currentWorld = par1World;
    181                this.randomGenerator = par2Random;
    182                this.chunk_X = par3;
    183                this.chunk_Z = par4;
    184                this.decorate();
    185                this.currentWorld = null;
    186                this.randomGenerator = null;
    187            }
    188        }
    189
    190        /**
    191         * The method that does the work of actually decorating chunks
    192         */
    193        protected void decorate()
    194        {
    195            this.generateOres();
    196            int var1;
    197            int var2;
    198            int var3;
    199
    200            for (var1 = 0; var1 < this.sandPerChunk2; ++var1)
    201            {
    202                var2 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    203                var3 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    204                this.sandGen.generate(this.currentWorld, this.randomGenerator, var2, this.currentWorld.getTopSolidOrLiquidBlock(var2, var3), var3);
    205            }
    206
    207            for (var1 = 0; var1 < this.clayPerChunk; ++var1)
    208            {
    209                var2 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    210                var3 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    211                this.clayGen.generate(this.currentWorld, this.randomGenerator, var2, this.currentWorld.getTopSolidOrLiquidBlock(var2, var3), var3);
    212            }
    213
    214            for (var1 = 0; var1 < this.sandPerChunk; ++var1)
    215            {
    216                var2 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    217                var3 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    218                this.sandGen.generate(this.currentWorld, this.randomGenerator, var2, this.currentWorld.getTopSolidOrLiquidBlock(var2, var3), var3);
    219            }
    220
    221            var1 = this.treesPerChunk;
    222
    223            if (this.randomGenerator.nextInt(10) == 0)
    224            {
    225                ++var1;
    226            }
    227
    228            int var4;
    229
    230            for (var2 = 0; var2 < var1; ++var2)
    231            {
    232                var3 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    233                var4 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    234                WorldGenerator var5 = this.biome.getRandomWorldGenForTrees(this.randomGenerator);
    235                var5.setScale(1.0D, 1.0D, 1.0D);
    236                var5.generate(this.currentWorld, this.randomGenerator, var3, this.currentWorld.getHeightValue(var3, var4), var4);
    237            }
    238
    239            for (var2 = 0; var2 < this.bigMushroomsPerChunk; ++var2)
    240            {
    241                var3 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    242                var4 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    243                this.bigMushroomGen.generate(this.currentWorld, this.randomGenerator, var3, this.currentWorld.getHeightValue(var3, var4), var4);
    244            }
    245
    246            int var7;
    247
    248            for (var2 = 0; var2 < this.flowersPerChunk; ++var2)
    249            {
    250                var3 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    251                var4 = this.randomGenerator.nextInt(128);
    252                var7 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    253                this.plantYellowGen.generate(this.currentWorld, this.randomGenerator, var3, var4, var7);
    254
    255                if (this.randomGenerator.nextInt(4) == 0)
    256                {
    257                    var3 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    258                    var4 = this.randomGenerator.nextInt(128);
    259                    var7 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    260                    this.plantRedGen.generate(this.currentWorld, this.randomGenerator, var3, var4, var7);
    261                }
    262            }
    263
    264            for (var2 = 0; var2 < this.grassPerChunk; ++var2)
    265            {
    266                var3 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    267                var4 = this.randomGenerator.nextInt(128);
    268                var7 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    269                WorldGenerator var6 = this.biome.getRandomWorldGenForGrass(this.randomGenerator);
    270                var6.generate(this.currentWorld, this.randomGenerator, var3, var4, var7);
    271            }
    272
    273            for (var2 = 0; var2 < this.deadBushPerChunk; ++var2)
    274            {
    275                var3 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    276                var4 = this.randomGenerator.nextInt(128);
    277                var7 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    278                (new WorldGenDeadBush(Block.deadBush.blockID)).generate(this.currentWorld, this.randomGenerator, var3, var4, var7);
    279            }
    280
    281            for (var2 = 0; var2 < this.waterlilyPerChunk; ++var2)
    282            {
    283                var3 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    284                var4 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    285
    286                for (var7 = this.randomGenerator.nextInt(128); var7 > 0 && this.currentWorld.getBlockId(var3, var7 - 1, var4) == 0; --var7)
    287                {
    288                    ;
    289                }
    290
    291                this.waterlilyGen.generate(this.currentWorld, this.randomGenerator, var3, var7, var4);
    292            }
    293
    294            for (var2 = 0; var2 < this.mushroomsPerChunk; ++var2)
    295            {
    296                if (this.randomGenerator.nextInt(4) == 0)
    297                {
    298                    var3 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    299                    var4 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    300                    var7 = this.currentWorld.getHeightValue(var3, var4);
    301                    this.mushroomBrownGen.generate(this.currentWorld, this.randomGenerator, var3, var7, var4);
    302                }
    303
    304                if (this.randomGenerator.nextInt(8) == 0)
    305                {
    306                    var3 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    307                    var4 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    308                    var7 = this.randomGenerator.nextInt(128);
    309                    this.mushroomRedGen.generate(this.currentWorld, this.randomGenerator, var3, var7, var4);
    310                }
    311            }
    312
    313            if (this.randomGenerator.nextInt(4) == 0)
    314            {
    315                var2 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    316                var3 = this.randomGenerator.nextInt(128);
    317                var4 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    318                this.mushroomBrownGen.generate(this.currentWorld, this.randomGenerator, var2, var3, var4);
    319            }
    320
    321            if (this.randomGenerator.nextInt(8) == 0)
    322            {
    323                var2 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    324                var3 = this.randomGenerator.nextInt(128);
    325                var4 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    326                this.mushroomRedGen.generate(this.currentWorld, this.randomGenerator, var2, var3, var4);
    327            }
    328
    329            for (var2 = 0; var2 < this.reedsPerChunk; ++var2)
    330            {
    331                var3 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    332                var4 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    333                var7 = this.randomGenerator.nextInt(128);
    334                this.reedGen.generate(this.currentWorld, this.randomGenerator, var3, var7, var4);
    335            }
    336
    337            for (var2 = 0; var2 < 10; ++var2)
    338            {
    339                var3 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    340                var4 = this.randomGenerator.nextInt(128);
    341                var7 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    342                this.reedGen.generate(this.currentWorld, this.randomGenerator, var3, var4, var7);
    343            }
    344
    345            if (this.randomGenerator.nextInt(32) == 0)
    346            {
    347                var2 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    348                var3 = this.randomGenerator.nextInt(128);
    349                var4 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    350                (new WorldGenPumpkin()).generate(this.currentWorld, this.randomGenerator, var2, var3, var4);
    351            }
    352
    353            for (var2 = 0; var2 < this.cactiPerChunk; ++var2)
    354            {
    355                var3 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    356                var4 = this.randomGenerator.nextInt(128);
    357                var7 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    358                this.cactusGen.generate(this.currentWorld, this.randomGenerator, var3, var4, var7);
    359            }
    360
    361            if (this.generateLakes)
    362            {
    363                for (var2 = 0; var2 < 50; ++var2)
    364                {
    365                    var3 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    366                    var4 = this.randomGenerator.nextInt(this.randomGenerator.nextInt(120) + 8);
    367                    var7 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    368                    (new WorldGenLiquids(Block.waterMoving.blockID)).generate(this.currentWorld, this.randomGenerator, var3, var4, var7);
    369                }
    370
    371                for (var2 = 0; var2 < 20; ++var2)
    372                {
    373                    var3 = this.chunk_X + this.randomGenerator.nextInt(16) + 8;
    374                    var4 = this.randomGenerator.nextInt(this.randomGenerator.nextInt(this.randomGenerator.nextInt(112) + 8) + 8);
    375                    var7 = this.chunk_Z + this.randomGenerator.nextInt(16) + 8;
    376                    (new WorldGenLiquids(Block.lavaMoving.blockID)).generate(this.currentWorld, this.randomGenerator, var3, var4, var7);
    377                }
    378            }
    379        }
    380
    381        /**
    382         * Standard ore generation helper. Generates most ores.
    383         */
    384        protected void genStandardOre1(int par1, WorldGenerator par2WorldGenerator, int par3, int par4)
    385        {
    386            for (int var5 = 0; var5 < par1; ++var5)
    387            {
    388                int var6 = this.chunk_X + this.randomGenerator.nextInt(16);
    389                int var7 = this.randomGenerator.nextInt(par4 - par3) + par3;
    390                int var8 = this.chunk_Z + this.randomGenerator.nextInt(16);
    391                par2WorldGenerator.generate(this.currentWorld, this.randomGenerator, var6, var7, var8);
    392            }
    393        }
    394
    395        /**
    396         * Standard ore generation helper. Generates Lapis Lazuli.
    397         */
    398        protected void genStandardOre2(int par1, WorldGenerator par2WorldGenerator, int par3, int par4)
    399        {
    400            for (int var5 = 0; var5 < par1; ++var5)
    401            {
    402                int var6 = this.chunk_X + this.randomGenerator.nextInt(16);
    403                int var7 = this.randomGenerator.nextInt(par4) + this.randomGenerator.nextInt(par4) + (par3 - par4);
    404                int var8 = this.chunk_Z + this.randomGenerator.nextInt(16);
    405                par2WorldGenerator.generate(this.currentWorld, this.randomGenerator, var6, var7, var8);
    406            }
    407        }
    408
    409        /**
    410         * Generates ores in the current chunk
    411         */
    412        protected void generateOres()
    413        {
    414            this.genStandardOre1(20, this.dirtGen, 0, 128);
    415            this.genStandardOre1(10, this.gravelGen, 0, 128);
    416            this.genStandardOre1(20, this.coalGen, 0, 128);
    417            this.genStandardOre1(20, this.ironGen, 0, 64);
    418            this.genStandardOre1(2, this.goldGen, 0, 32);
    419            this.genStandardOre1(8, this.redstoneGen, 0, 16);
    420            this.genStandardOre1(1, this.diamondGen, 0, 16);
    421            this.genStandardOre2(1, this.lapisGen, 16, 16);
    422        }
    423    }