001 package net.minecraft.world.biome;
002
003 import cpw.mods.fml.relauncher.Side;
004 import cpw.mods.fml.relauncher.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 }