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 }