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