    001    package net.minecraft.world.biome;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.SideOnly;
    005    import java.awt.Color;
    006    import java.util.ArrayList;
    007    import java.util.List;
    008    import java.util.Random;
    009    import net.minecraft.block.Block;
    010    import net.minecraft.entity.EnumCreatureType;
    011    import net.minecraft.entity.monster.EntityCreeper;
    012    import net.minecraft.entity.monster.EntityEnderman;
    013    import net.minecraft.entity.monster.EntitySkeleton;
    014    import net.minecraft.entity.monster.EntitySlime;
    015    import net.minecraft.entity.monster.EntitySpider;
    016    import net.minecraft.entity.monster.EntityZombie;
    017    import net.minecraft.entity.passive.EntityBat;
    018    import net.minecraft.entity.passive.EntityChicken;
    019    import net.minecraft.entity.passive.EntityCow;
    020    import net.minecraft.entity.passive.EntityPig;
    021    import net.minecraft.entity.passive.EntitySheep;
    022    import net.minecraft.entity.passive.EntitySquid;
    023    import net.minecraft.util.MathHelper;
    024    import net.minecraft.world.ColorizerFoliage;
    025    import net.minecraft.world.ColorizerGrass;
    026    import net.minecraft.world.World;
    027    import net.minecraft.world.gen.feature.WorldGenBigTree;
    028    import net.minecraft.world.gen.feature.WorldGenForest;
    029    import net.minecraft.world.gen.feature.WorldGenSwamp;
    030    import net.minecraft.world.gen.feature.WorldGenTallGrass;
    031    import net.minecraft.world.gen.feature.WorldGenTrees;
    032    import net.minecraft.world.gen.feature.WorldGenerator;
    033
    034    import net.minecraftforge.common.*;
    035    import net.minecraftforge.event.terraingen.*;
    036
    037    public abstract class BiomeGenBase
    038    {
    039        /** An array of all the biomes, indexed by biome id. */
    040        public static final BiomeGenBase[] biomeList = new BiomeGenBase[256];
    041        public static final BiomeGenBase ocean = (new BiomeGenOcean(0)).setColor(112).setBiomeName("Ocean").setMinMaxHeight(-1.0F, 0.4F);
    042        public static final BiomeGenBase plains = (new BiomeGenPlains(1)).setColor(9286496).setBiomeName("Plains").setTemperatureRainfall(0.8F, 0.4F);
    043        public static final BiomeGenBase desert = (new BiomeGenDesert(2)).setColor(16421912).setBiomeName("Desert").setDisableRain().setTemperatureRainfall(2.0F, 0.0F).setMinMaxHeight(0.1F, 0.2F);
    044        public static final BiomeGenBase extremeHills = (new BiomeGenHills(3)).setColor(6316128).setBiomeName("Extreme Hills").setMinMaxHeight(0.3F, 1.5F).setTemperatureRainfall(0.2F, 0.3F);
    045        public static final BiomeGenBase forest = (new BiomeGenForest(4)).setColor(353825).setBiomeName("Forest").func_76733_a(5159473).setTemperatureRainfall(0.7F, 0.8F);
    046        public static final BiomeGenBase taiga = (new BiomeGenTaiga(5)).setColor(747097).setBiomeName("Taiga").func_76733_a(5159473).setEnableSnow().setTemperatureRainfall(0.05F, 0.8F).setMinMaxHeight(0.1F, 0.4F);
    047        public static final BiomeGenBase swampland = (new BiomeGenSwamp(6)).setColor(522674).setBiomeName("Swampland").func_76733_a(9154376).setMinMaxHeight(-0.2F, 0.1F).setTemperatureRainfall(0.8F, 0.9F);
    048        public static final BiomeGenBase river = (new BiomeGenRiver(7)).setColor(255).setBiomeName("River").setMinMaxHeight(-0.5F, 0.0F);
    049        public static final BiomeGenBase hell = (new BiomeGenHell(8)).setColor(16711680).setBiomeName("Hell").setDisableRain().setTemperatureRainfall(2.0F, 0.0F);
    050
    051        /** Is the biome used for sky world. */
    052        public static final BiomeGenBase sky = (new BiomeGenEnd(9)).setColor(8421631).setBiomeName("Sky").setDisableRain();
    053        public static final BiomeGenBase frozenOcean = (new BiomeGenOcean(10)).setColor(9474208).setBiomeName("FrozenOcean").setEnableSnow().setMinMaxHeight(-1.0F, 0.5F).setTemperatureRainfall(0.0F, 0.5F);
    054        public static final BiomeGenBase frozenRiver = (new BiomeGenRiver(11)).setColor(10526975).setBiomeName("FrozenRiver").setEnableSnow().setMinMaxHeight(-0.5F, 0.0F).setTemperatureRainfall(0.0F, 0.5F);
    055        public static final BiomeGenBase icePlains = (new BiomeGenSnow(12)).setColor(16777215).setBiomeName("Ice Plains").setEnableSnow().setTemperatureRainfall(0.0F, 0.5F);
    056        public static final BiomeGenBase iceMountains = (new BiomeGenSnow(13)).setColor(10526880).setBiomeName("Ice Mountains").setEnableSnow().setMinMaxHeight(0.3F, 1.3F).setTemperatureRainfall(0.0F, 0.5F);
    057        public static final BiomeGenBase mushroomIsland = (new BiomeGenMushroomIsland(14)).setColor(16711935).setBiomeName("MushroomIsland").setTemperatureRainfall(0.9F, 1.0F).setMinMaxHeight(0.2F, 1.0F);
    058        public static final BiomeGenBase mushroomIslandShore = (new BiomeGenMushroomIsland(15)).setColor(10486015).setBiomeName("MushroomIslandShore").setTemperatureRainfall(0.9F, 1.0F).setMinMaxHeight(-1.0F, 0.1F);
    059
    060        /** Beach biome. */
    061        public static final BiomeGenBase beach = (new BiomeGenBeach(16)).setColor(16440917).setBiomeName("Beach").setTemperatureRainfall(0.8F, 0.4F).setMinMaxHeight(0.0F, 0.1F);
    062
    063        /** Desert Hills biome. */
    064        public static final BiomeGenBase desertHills = (new BiomeGenDesert(17)).setColor(13786898).setBiomeName("DesertHills").setDisableRain().setTemperatureRainfall(2.0F, 0.0F).setMinMaxHeight(0.3F, 0.8F);
    065
    066        /** Forest Hills biome. */
    067        public static final BiomeGenBase forestHills = (new BiomeGenForest(18)).setColor(2250012).setBiomeName("ForestHills").func_76733_a(5159473).setTemperatureRainfall(0.7F, 0.8F).setMinMaxHeight(0.3F, 0.7F);
    068
    069        /** Taiga Hills biome. */
    070        public static final BiomeGenBase taigaHills = (new BiomeGenTaiga(19)).setColor(1456435).setBiomeName("TaigaHills").setEnableSnow().func_76733_a(5159473).setTemperatureRainfall(0.05F, 0.8F).setMinMaxHeight(0.3F, 0.8F);
    071
    072        /** Extreme Hills Edge biome. */
    073        public static final BiomeGenBase extremeHillsEdge = (new BiomeGenHills(20)).setColor(7501978).setBiomeName("Extreme Hills Edge").setMinMaxHeight(0.2F, 0.8F).setTemperatureRainfall(0.2F, 0.3F);
    074
    075        /** Jungle biome identifier */
    076        public static final BiomeGenBase jungle = (new BiomeGenJungle(21)).setColor(5470985).setBiomeName("Jungle").func_76733_a(5470985).setTemperatureRainfall(1.2F, 0.9F).setMinMaxHeight(0.2F, 0.4F);
    077        public static final BiomeGenBase jungleHills = (new BiomeGenJungle(22)).setColor(2900485).setBiomeName("JungleHills").func_76733_a(5470985).setTemperatureRainfall(1.2F, 0.9F).setMinMaxHeight(1.8F, 0.5F);
    078        public String biomeName;
    079        public int color;
    080
    081        /** The block expected to be on the top of this biome */
    082        public byte topBlock;
    083
    084        /** The block to fill spots in when not on the top */
    085        public byte fillerBlock;
    086        public int field_76754_C;
    087
    088        /** The minimum height of this biome. Default 0.1. */
    089        public float minHeight;
    090
    091        /** The maximum height of this biome. Default 0.3. */
    092        public float maxHeight;
    093
    094        /** The temperature of this biome. */
    095        public float temperature;
    096
    097        /** The rainfall in this biome. */
    098        public float rainfall;
    099
    100        /** Color tint applied to water depending on biome */
    101        public int waterColorMultiplier;
    102
    103        /** The biome decorator. */
    104        public BiomeDecorator theBiomeDecorator;
    105
    106        /**
    107         * Holds the classes of IMobs (hostile mobs) that can be spawned in the biome.
    108         */
    109        protected List spawnableMonsterList;
    110
    111        /**
    112         * Holds the classes of any creature that can be spawned in the biome as friendly creature.
    113         */
    114        protected List spawnableCreatureList;
    115
    116        /**
    117         * Holds the classes of any aquatic creature that can be spawned in the water of the biome.
    118         */
    119        protected List spawnableWaterCreatureList;
    120        protected List field_82914_M;
    121
    122        /** Set to true if snow is enabled for this biome. */
    123        private boolean enableSnow;
    124
    125        /**
    126         * Is true (default) if the biome support rain (desert and nether can't have rain)
    127         */
    128        private boolean enableRain;
    129
    130        /** The id number to this biome, and its index in the biomeList array. */
    131        public final int biomeID;
    132
    133        /** The tree generator. */
    134        protected WorldGenTrees worldGeneratorTrees;
    135
    136        /** The big tree generator. */
    137        protected WorldGenBigTree worldGeneratorBigTree;
    138
    139        /** The forest generator. */
    140        protected WorldGenForest worldGeneratorForest;
    141
    142        /** The swamp tree generator. */
    143        protected WorldGenSwamp worldGeneratorSwamp;
    144
    145        public BiomeGenBase(int par1)
    146        {
    147            this.topBlock = (byte)Block.grass.blockID;
    148            this.fillerBlock = (byte)Block.dirt.blockID;
    149            this.field_76754_C = 5169201;
    150            this.minHeight = 0.1F;
    151            this.maxHeight = 0.3F;
    152            this.temperature = 0.5F;
    153            this.rainfall = 0.5F;
    154            this.waterColorMultiplier = 16777215;
    155            this.spawnableMonsterList = new ArrayList();
    156            this.spawnableCreatureList = new ArrayList();
    157            this.spawnableWaterCreatureList = new ArrayList();
    158            this.field_82914_M = new ArrayList();
    159            this.enableRain = true;
    160            this.worldGeneratorTrees = new WorldGenTrees(false);
    161            this.worldGeneratorBigTree = new WorldGenBigTree(false);
    162            this.worldGeneratorForest = new WorldGenForest(false);
    163            this.worldGeneratorSwamp = new WorldGenSwamp();
    164            this.biomeID = par1;
    165            biomeList[par1] = this;
    166            this.theBiomeDecorator = this.createBiomeDecorator();
    167            this.spawnableCreatureList.add(new SpawnListEntry(EntitySheep.class, 12, 4, 4));
    168            this.spawnableCreatureList.add(new SpawnListEntry(EntityPig.class, 10, 4, 4));
    169            this.spawnableCreatureList.add(new SpawnListEntry(EntityChicken.class, 10, 4, 4));
    170            this.spawnableCreatureList.add(new SpawnListEntry(EntityCow.class, 8, 4, 4));
    171            this.spawnableMonsterList.add(new SpawnListEntry(EntitySpider.class, 10, 4, 4));
    172            this.spawnableMonsterList.add(new SpawnListEntry(EntityZombie.class, 10, 4, 4));
    173            this.spawnableMonsterList.add(new SpawnListEntry(EntitySkeleton.class, 10, 4, 4));
    174            this.spawnableMonsterList.add(new SpawnListEntry(EntityCreeper.class, 10, 4, 4));
    175            this.spawnableMonsterList.add(new SpawnListEntry(EntitySlime.class, 10, 4, 4));
    176            this.spawnableMonsterList.add(new SpawnListEntry(EntityEnderman.class, 1, 1, 4));
    177            this.spawnableWaterCreatureList.add(new SpawnListEntry(EntitySquid.class, 10, 4, 4));
    178            this.field_82914_M.add(new SpawnListEntry(EntityBat.class, 10, 8, 8));
    179        }
    180
    181        /**
    182         * Allocate a new BiomeDecorator for this BiomeGenBase
    183         */
    184        public BiomeDecorator createBiomeDecorator()
    185        {
    186            return getModdedBiomeDecorator(new BiomeDecorator(this));
    187        }
    188
    189        /**
    190         * Sets the temperature and rainfall of this biome.
    191         */
    192        public BiomeGenBase setTemperatureRainfall(float par1, float par2)
    193        {
    194            if (par1 > 0.1F && par1 < 0.2F)
    195            {
    196                throw new IllegalArgumentException("Please avoid temperatures in the range 0.1 - 0.2 because of snow");
    197            }
    198            else
    199            {
    200                this.temperature = par1;
    201                this.rainfall = par2;
    202                return this;
    203            }
    204        }
    205
    206        /**
    207         * Sets the minimum and maximum height of this biome. Seems to go from -2.0 to 2.0.
    208         */
    209        public BiomeGenBase setMinMaxHeight(float par1, float par2)
    210        {
    211            this.minHeight = par1;
    212            this.maxHeight = par2;
    213            return this;
    214        }
    215
    216        /**
    217         * Disable the rain for the biome.
    218         */
    219        public BiomeGenBase setDisableRain()
    220        {
    221            this.enableRain = false;
    222            return this;
    223        }
    224
    225        /**
    226         * Gets a WorldGen appropriate for this biome.
    227         */
    228        public WorldGenerator getRandomWorldGenForTrees(Random par1Random)
    229        {
    230            return (WorldGenerator)(par1Random.nextInt(10) == 0 ? this.worldGeneratorBigTree : this.worldGeneratorTrees);
    231        }
    232
    233        /**
    234         * Gets a WorldGen appropriate for this biome.
    235         */
    236        public WorldGenerator getRandomWorldGenForGrass(Random par1Random)
    237        {
    238            return new WorldGenTallGrass(Block.tallGrass.blockID, 1);
    239        }
    240
    241        /**
    242         * sets enableSnow to true during biome initialization. returns BiomeGenBase.
    243         */
    244        public BiomeGenBase setEnableSnow()
    245        {
    246            this.enableSnow = true;
    247            return this;
    248        }
    249
    250        public BiomeGenBase setBiomeName(String par1Str)
    251        {
    252            this.biomeName = par1Str;
    253            return this;
    254        }
    255
    256        public BiomeGenBase func_76733_a(int par1)
    257        {
    258            this.field_76754_C = par1;
    259            return this;
    260        }
    261
    262        public BiomeGenBase setColor(int par1)
    263        {
    264            this.color = par1;
    265            return this;
    266        }
    267
    268        @SideOnly(Side.CLIENT)
    269
    270        /**
    271         * takes temperature, returns color
    272         */
    273        public int getSkyColorByTemp(float par1)
    274        {
    275            par1 /= 3.0F;
    276
    277            if (par1 < -1.0F)
    278            {
    279                par1 = -1.0F;
    280            }
    281
    282            if (par1 > 1.0F)
    283            {
    284                par1 = 1.0F;
    285            }
    286
    287            return Color.getHSBColor(0.62222224F - par1 * 0.05F, 0.5F + par1 * 0.1F, 1.0F).getRGB();
    288        }
    289
    290        /**
    291         * Returns the correspondent list of the EnumCreatureType informed.
    292         */
    293        public List getSpawnableList(EnumCreatureType par1EnumCreatureType)
    294        {
    295            return par1EnumCreatureType == EnumCreatureType.monster ? this.spawnableMonsterList : (par1EnumCreatureType == EnumCreatureType.creature ? this.spawnableCreatureList : (par1EnumCreatureType == EnumCreatureType.waterCreature ? this.spawnableWaterCreatureList : (par1EnumCreatureType == EnumCreatureType.ambient ? this.field_82914_M : null)));
    296        }
    297
    298        /**
    299         * Returns true if the biome have snowfall instead a normal rain.
    300         */
    301        public boolean getEnableSnow()
    302        {
    303            return this.enableSnow;
    304        }
    305
    306        /**
    307         * Return true if the biome supports lightning bolt spawn, either by have the bolts enabled and have rain enabled.
    308         */
    309        public boolean canSpawnLightningBolt()
    310        {
    311            return this.enableSnow ? false : this.enableRain;
    312        }
    313
    314        /**
    315         * Checks to see if the rainfall level of the biome is extremely high
    316         */
    317        public boolean isHighHumidity()
    318        {
    319            return this.rainfall > 0.85F;
    320        }
    321
    322        /**
    323         * returns the chance a creature has to spawn.
    324         */
    325        public float getSpawningChance()
    326        {
    327            return 0.1F;
    328        }
    329
    330        /**
    331         * Gets an integer representation of this biome's rainfall
    332         */
    333        public final int getIntRainfall()
    334        {
    335            return (int)(this.rainfall * 65536.0F);
    336        }
    337
    338        /**
    339         * Gets an integer representation of this biome's temperature
    340         */
    341        public final int getIntTemperature()
    342        {
    343            return (int)(this.temperature * 65536.0F);
    344        }
    345
    346        @SideOnly(Side.CLIENT)
    347
    348        /**
    349         * Gets a floating point representation of this biome's rainfall
    350         */
    351        public final float getFloatRainfall()
    352        {
    353            return this.rainfall;
    354        }
    355
    356        /**
    357         * Gets a floating point representation of this biome's temperature
    358         */
    359        public final float getFloatTemperature()
    360        {
    361            return this.temperature;
    362        }
    363
    364        public void decorate(World par1World, Random par2Random, int par3, int par4)
    365        {
    366            this.theBiomeDecorator.decorate(par1World, par2Random, par3, par4);
    367        }
    368
    369        @SideOnly(Side.CLIENT)
    370
    371        /**
    372         * Provides the basic grass color based on the biome temperature and rainfall
    373         */
    374        public int getBiomeGrassColor()
    375        {
    376            double var1 = (double)MathHelper.clamp_float(this.getFloatTemperature(), 0.0F, 1.0F);
    377            double var3 = (double)MathHelper.clamp_float(this.getFloatRainfall(), 0.0F, 1.0F);
    378            return getModdedBiomeGrassColor(ColorizerGrass.getGrassColor(var1, var3));
    379        }
    380
    381        @SideOnly(Side.CLIENT)
    382
    383        /**
    384         * Provides the basic foliage color based on the biome temperature and rainfall
    385         */
    386        public int getBiomeFoliageColor()
    387        {
    388            double var1 = (double)MathHelper.clamp_float(this.getFloatTemperature(), 0.0F, 1.0F);
    389            double var3 = (double)MathHelper.clamp_float(this.getFloatRainfall(), 0.0F, 1.0F);
    390            return getModdedBiomeFoliageColor(ColorizerFoliage.getFoliageColor(var1, var3));
    391        }
    392
    393        public BiomeDecorator getModdedBiomeDecorator(BiomeDecorator original)
    394        {
    395            BiomeEvent.CreateDecorator event = new BiomeEvent.CreateDecorator(this, original);
    396            MinecraftForge.TERRAIN_GEN_BUS.post(event);
    397            return event.newBiomeDecorator;
    398        }
    399
    400        @SideOnly(Side.CLIENT)
    401        public int getWaterColorMultiplier()
    402        {
    403            BiomeEvent.GetWaterColor event = new BiomeEvent.GetWaterColor(this, waterColorMultiplier);
    404            MinecraftForge.EVENT_BUS.post(event);
    405            return event.newColor;
    406        }
    407
    408        @SideOnly(Side.CLIENT)
    409        public int getModdedBiomeGrassColor(int original)
    410        {
    411            BiomeEvent.GetGrassColor event = new BiomeEvent.GetGrassColor(this, original);
    412            MinecraftForge.EVENT_BUS.post(event);
    413            return event.newColor;
    414        }
    415
    416
    417        @SideOnly(Side.CLIENT)
    418        public int getModdedBiomeFoliageColor(int original)
    419        {
    420            BiomeEvent.GetFoliageColor event = new BiomeEvent.GetFoliageColor(this, original);
    421            MinecraftForge.EVENT_BUS.post(event);
    422            return event.newColor;
    423        }
    424    }