2016-06-22 23:49:47 -04:00
/*
* Minecraft Forge
* Copyright (c) 2016.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
2013-04-04 17:55:35 -07:00
package net.minecraftforge.common ;
import java.util.* ;
2013-09-05 10:08:02 -04:00
2016-12-01 00:48:44 +01:00
import javax.annotation.Nonnull ;
2016-04-09 18:03:46 -05:00
import net.minecraft.init.Biomes ;
2014-07-01 12:46:00 +10:00
import net.minecraft.init.Blocks ;
2016-03-03 18:07:18 +11:00
import net.minecraft.util.ResourceLocation ;
2013-04-04 17:55:35 -07:00
import net.minecraft.world.biome.* ;
import static net.minecraftforge.common.BiomeDictionary.Type.* ;
2016-12-01 00:48:44 +01:00
import net.minecraftforge.fml.common.FMLLog ;
import net.minecraftforge.fml.common.registry.ForgeRegistries ;
import com.google.common.base.Preconditions ;
import com.google.common.collect.ImmutableList ;
2013-04-04 17:55:35 -07:00
public class BiomeDictionary
{
2016-12-01 00:48:44 +01:00
public static final class Type
2013-04-04 17:55:35 -07:00
{
2016-12-01 00:48:44 +01:00
private static final Map < String , Type > byName = new HashMap < String , Type > ();
2014-07-01 12:46:00 +10:00
/*Temperature-based tags. Specifying neither implies a biome is temperate*/
2016-12-01 00:48:44 +01:00
public static final Type HOT = new Type ( "HOT" );
public static final Type COLD = new Type ( "COLD" );
2014-07-01 12:46:00 +10:00
/*Tags specifying the amount of vegetation a biome has. Specifying neither implies a biome to have moderate amounts*/
2016-12-01 00:48:44 +01:00
public static final Type SPARSE = new Type ( "SPARSE" );
public static final Type DENSE = new Type ( "DENSE" );
2014-07-01 12:46:00 +10:00
/*Tags specifying how moist a biome is. Specifying neither implies the biome as having moderate humidity*/
2016-12-01 00:48:44 +01:00
public static final Type WET = new Type ( "WET" );
public static final Type DRY = new Type ( "DRY" );
2014-07-01 12:46:00 +10:00
/*Tree-based tags, SAVANNA refers to dry, desert-like trees (Such as Acacia), CONIFEROUS refers to snowy trees (Such as Spruce) and JUNGLE refers to jungle trees.
* Specifying no tag implies a biome has temperate trees (Such as Oak)*/
2016-12-01 00:48:44 +01:00
public static final Type SAVANNA = new Type ( "SAVANNA" );
public static final Type CONIFEROUS = new Type ( "CONIFEROUS" );
public static final Type JUNGLE = new Type ( "JUNGLE" );
2014-07-07 21:29:37 -07:00
2014-07-01 12:46:00 +10:00
/*Tags specifying the nature of a biome*/
2016-12-01 00:48:44 +01:00
public static final Type SPOOKY = new Type ( "SPOOKY" );
public static final Type DEAD = new Type ( "DEAD" );
public static final Type LUSH = new Type ( "LUSH" );
public static final Type NETHER = new Type ( "NETHER" );
public static final Type END = new Type ( "END" );
public static final Type MUSHROOM = new Type ( "MUSHROOM" );
public static final Type MAGICAL = new Type ( "MAGICAL" );
2016-12-03 10:46:36 -08:00
public static final Type RARE = new Type ( "RARE" );
2016-12-01 00:48:44 +01:00
public static final Type OCEAN = new Type ( "OCEAN" );
public static final Type RIVER = new Type ( "RIVER" );
/**
* A general tag for all water-based biomes. Shown as present if OCEAN or RIVER are.
**/
public static final Type WATER = new Type ( "WATER" , OCEAN , RIVER );
2014-07-07 21:29:37 -07:00
2014-07-01 12:46:00 +10:00
/*Generic types which a biome can be*/
2016-12-01 00:48:44 +01:00
public static final Type MESA = new Type ( "MESA" );
public static final Type FOREST = new Type ( "FOREST" );
public static final Type PLAINS = new Type ( "PLAINS" );
public static final Type MOUNTAIN = new Type ( "MOUNTAIN" );
public static final Type HILLS = new Type ( "HILLS" );
public static final Type SWAMP = new Type ( "SWAMP" );
public static final Type SANDY = new Type ( "SANDY" );
public static final Type SNOWY = new Type ( "SNOWY" );
public static final Type WASTELAND = new Type ( "WASTELAND" );
public static final Type BEACH = new Type ( "BEACH" );
2016-12-03 10:46:36 -08:00
public static final Type VOID = new Type ( "VOID" );
2016-12-01 00:48:44 +01:00
private final String name ;
private final List < Type > subTypes ;
private final Set < Biome > biomes = new HashSet < Biome > ();
private final Set < Biome > biomesUn = Collections . unmodifiableSet ( biomes );
private Type ( String name , Type ... subTypes )
{
this . name = name ;
this . subTypes = ImmutableList . copyOf ( subTypes );
byName . put ( name , this );
}
private boolean hasSubTypes ()
{
return ! subTypes . isEmpty ();
}
/**
* Gets the name for this type.
*/
public String getName ()
2014-07-01 12:46:00 +10:00
{
2016-12-01 00:48:44 +01:00
return name ;
2014-07-01 12:46:00 +10:00
}
2014-07-07 21:29:37 -07:00
2016-12-01 00:48:44 +01:00
public String toString ()
2014-07-01 12:46:00 +10:00
{
2016-12-01 00:48:44 +01:00
return name ;
2014-07-01 12:46:00 +10:00
}
2014-07-07 21:29:37 -07:00
/**
2016-12-01 00:48:44 +01:00
* Retrieves a Type instance by name,
2014-07-07 21:29:37 -07:00
* if one does not exist already it creates one.
2016-03-23 17:34:48 +03:00
* This can be used as intermediate measure for modders to
2016-12-01 00:48:44 +01:00
* add their own Biome types.
* <p>
* There are <i>no</i> naming conventions besides:
* <ul><li><b>Must</b> be all upper case (enforced by name.toUpper())</li>
* <li><b>No</b> Special characters. {Unenforced, just don't be a pain, if it becomes a issue I WILL
* make this RTE with no worry about backwards compatibility}</li></ul>
* <p>
2014-07-07 21:29:37 -07:00
* Note: For performance sake, the return value of this function SHOULD be cached.
* Two calls with the same name SHOULD return the same value.
*
* @param name The name of this Type
* @return An instance of Type for this name.
*/
public static Type getType ( String name , Type ... subTypes )
{
name = name . toUpperCase ();
2016-12-01 00:48:44 +01:00
Type t = byName . get ( name );
if ( t == null )
2015-06-12 17:08:19 -07:00
{
2016-12-01 00:48:44 +01:00
t = new Type ( name , subTypes );
2014-08-14 20:33:23 -07:00
}
2016-12-01 00:48:44 +01:00
return t ;
2014-07-07 21:29:37 -07:00
}
2013-04-04 17:55:35 -07:00
}
2016-12-01 00:48:44 +01:00
private static final Map < ResourceLocation , BiomeInfo > biomeInfoMap = new HashMap < ResourceLocation , BiomeInfo > ();
2013-04-04 17:55:35 -07:00
private static class BiomeInfo
{
2016-12-01 00:48:44 +01:00
private final Set < Type > types = new HashSet < Type > ();
private final Set < Type > typesUn = Collections . unmodifiableSet ( this . types );
2013-04-04 17:55:35 -07:00
}
static
{
registerVanillaBiomes ();
}
/**
2016-12-01 00:48:44 +01:00
* Adds the given types to the biome.
2014-07-07 21:29:37 -07:00
*
2013-04-04 17:55:35 -07:00
*/
2016-12-01 00:48:44 +01:00
public static void addTypes ( Biome biome , Type ... types )
2014-07-07 21:29:37 -07:00
{
2016-12-01 00:48:44 +01:00
Preconditions . checkArgument ( ForgeRegistries . BIOMES . containsValue ( biome ), "Cannot add types to unregistered biome %s" , biome );
2013-04-04 17:55:35 -07:00
2017-02-04 18:29:42 +01:00
Collection < Type > supertypes = listSupertypes ( types );
2013-04-04 17:55:35 -07:00
2017-02-04 18:29:42 +01:00
for ( Type type : supertypes )
2016-12-01 00:48:44 +01:00
{
type . biomes . add ( biome );
2013-04-04 17:55:35 -07:00
}
2017-02-05 18:47:07 +01:00
BiomeInfo biomeInfo = getBiomeInfo ( biome );
Collections . addAll ( biomeInfo . types , types );
biomeInfo . types . addAll ( supertypes );
2013-04-04 17:55:35 -07:00
}
/**
2016-12-01 00:48:44 +01:00
* Gets the set of biomes that have the given type.
2014-07-07 21:29:37 -07:00
*
2013-04-04 17:55:35 -07:00
*/
2016-12-01 00:48:44 +01:00
@Nonnull
public static Set < Biome > getBiomes ( Type type )
2013-04-04 17:55:35 -07:00
{
2016-12-01 00:48:44 +01:00
return type . biomesUn ;
2013-04-04 17:55:35 -07:00
}
/**
2016-12-01 00:48:44 +01:00
* Gets the set of types that have been added to the given biome.
2014-07-07 21:29:37 -07:00
*
2013-04-04 17:55:35 -07:00
*/
2016-12-01 00:48:44 +01:00
@Nonnull
public static Set < Type > getTypes ( Biome biome )
2013-04-04 17:55:35 -07:00
{
2016-12-01 00:48:44 +01:00
ensureHasTypes ( biome );
return getBiomeInfo ( biome ). typesUn ;
2013-04-04 17:55:35 -07:00
}
/**
2016-12-01 00:48:44 +01:00
* Checks if the two given biomes have types in common.
2014-07-07 21:29:37 -07:00
*
2013-04-04 17:55:35 -07:00
* @return returns true if a common type is found, false otherwise
*/
2016-12-01 00:48:44 +01:00
public static boolean areSimilar ( Biome biomeA , Biome biomeB )
2013-04-04 17:55:35 -07:00
{
2016-12-01 00:48:44 +01:00
for ( Type type : getTypes ( biomeA ))
2013-04-04 17:55:35 -07:00
{
2017-02-04 18:29:42 +01:00
if ( getTypes ( biomeB ). contains ( type ))
2016-05-18 03:29:10 -07:00
{
return true ;
}
2013-04-04 17:55:35 -07:00
}
return false ;
}
/**
2016-12-01 00:48:44 +01:00
* Checks if the given type has been added to the given biome.
2014-07-07 21:29:37 -07:00
*
2013-04-04 17:55:35 -07:00
*/
2016-12-01 00:48:44 +01:00
public static boolean hasType ( Biome biome , Type type )
2014-07-07 21:29:37 -07:00
{
2016-12-01 00:48:44 +01:00
return getTypes ( biome ). contains ( type );
2013-04-04 17:55:35 -07:00
}
/**
2016-12-01 00:48:44 +01:00
* Checks if any type has been added to the given biome.
2014-07-07 21:29:37 -07:00
*
2013-04-04 17:55:35 -07:00
*/
2016-12-01 00:48:44 +01:00
public static boolean hasAnyType ( Biome biome )
2013-04-04 17:55:35 -07:00
{
2016-12-01 00:48:44 +01:00
return ! getBiomeInfo ( biome ). types . isEmpty ();
2013-04-04 17:55:35 -07:00
}
/**
2016-12-01 00:48:44 +01:00
* Automatically adds appropriate types to a given biome based on certain heuristics.
* If a biome's types are requested and no types have been added to the biome so far, the biome's types
* will be determined and added using this method.
2014-07-07 21:29:37 -07:00
*
2013-04-04 17:55:35 -07:00
*/
2016-05-18 03:29:10 -07:00
public static void makeBestGuess ( Biome biome )
2014-07-07 21:29:37 -07:00
{
2017-06-10 17:59:01 -07:00
if ( biome . decorator . treesPerChunk >= 3 )
2013-04-04 17:55:35 -07:00
{
2016-03-13 04:40:03 +03:00
if ( biome . isHighHumidity () && biome . getTemperature () >= 0 . 9F )
2013-04-04 17:55:35 -07:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , JUNGLE );
2013-04-04 17:55:35 -07:00
}
2014-07-01 12:46:00 +10:00
else if ( ! biome . isHighHumidity ())
2013-04-04 17:55:35 -07:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , FOREST );
2014-07-01 12:46:00 +10:00
2016-03-13 04:40:03 +03:00
if ( biome . getTemperature () <= 0 . 2f )
2014-07-01 12:46:00 +10:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , CONIFEROUS );
2014-07-01 12:46:00 +10:00
}
2013-04-04 17:55:35 -07:00
}
}
2016-12-01 00:48:44 +01:00
else if ( biome . getHeightVariation () <= 0 . 3F && biome . getHeightVariation () >= 0 . 0F )
2013-04-04 17:55:35 -07:00
{
2016-12-01 00:48:44 +01:00
if ( ! biome . isHighHumidity () || biome . getBaseHeight () >= 0 . 0F )
2013-04-04 17:55:35 -07:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , PLAINS );
2013-04-04 17:55:35 -07:00
}
}
2016-03-13 04:40:03 +03:00
if ( biome . getRainfall () > 0 . 85f )
2014-07-01 12:46:00 +10:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , WET );
2014-07-01 12:46:00 +10:00
}
2016-03-13 04:40:03 +03:00
if ( biome . getRainfall () < 0 . 15f )
2014-07-01 12:46:00 +10:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , DRY );
2014-07-01 12:46:00 +10:00
}
2016-03-13 04:40:03 +03:00
if ( biome . getTemperature () > 0 . 85f )
2014-07-01 12:46:00 +10:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , HOT );
2014-07-01 12:46:00 +10:00
}
2016-03-13 04:40:03 +03:00
if ( biome . getTemperature () < 0 . 15f )
2014-07-01 12:46:00 +10:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , COLD );
2014-07-01 12:46:00 +10:00
}
2017-06-10 17:59:01 -07:00
if ( biome . decorator . treesPerChunk > 0 && biome . decorator . treesPerChunk < 3 )
2014-07-01 12:46:00 +10:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , SPARSE );
2014-07-01 12:46:00 +10:00
}
2017-06-10 17:59:01 -07:00
else if ( biome . decorator . treesPerChunk >= 10 )
2014-07-01 12:46:00 +10:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , DENSE );
2014-07-01 12:46:00 +10:00
}
2016-03-13 04:40:03 +03:00
if ( biome . isHighHumidity () && biome . getBaseHeight () < 0 . 0F && ( biome . getHeightVariation () <= 0 . 3F && biome . getHeightVariation () >= 0 . 0F ))
2013-04-04 17:55:35 -07:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , SWAMP );
2013-04-04 17:55:35 -07:00
}
2016-03-13 04:40:03 +03:00
if ( biome . getBaseHeight () <= - 0 . 5F )
2013-04-04 17:55:35 -07:00
{
2016-03-13 04:40:03 +03:00
if ( biome . getHeightVariation () == 0 . 0F )
2014-07-01 12:46:00 +10:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , RIVER );
2014-07-01 12:46:00 +10:00
}
else
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , OCEAN );
2014-07-01 12:46:00 +10:00
}
2013-04-04 17:55:35 -07:00
}
2016-03-13 04:40:03 +03:00
if ( biome . getHeightVariation () >= 0 . 4F && biome . getHeightVariation () < 1 . 5F )
2014-07-01 12:46:00 +10:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , HILLS );
2014-07-01 12:46:00 +10:00
}
2016-03-13 04:40:03 +03:00
if ( biome . getHeightVariation () >= 1 . 5F )
2013-04-04 17:55:35 -07:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , MOUNTAIN );
2013-04-04 17:55:35 -07:00
}
2014-07-01 12:46:00 +10:00
if ( biome . getEnableSnow ())
2013-04-04 17:55:35 -07:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , SNOWY );
2013-04-04 17:55:35 -07:00
}
2014-07-01 12:46:00 +10:00
2016-05-18 05:11:56 -07:00
if ( biome . topBlock != Blocks . SAND && biome . getTemperature () >= 1 . 0f && biome . getRainfall () < 0 . 2f )
2014-07-01 12:46:00 +10:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , SAVANNA );
2014-07-01 12:46:00 +10:00
}
2016-05-18 05:11:56 -07:00
if ( biome . topBlock == Blocks . SAND )
2013-04-04 17:55:35 -07:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , SANDY );
2014-07-01 12:46:00 +10:00
}
2016-05-18 05:11:56 -07:00
else if ( biome . topBlock == Blocks . MYCELIUM )
2014-07-01 12:46:00 +10:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , MUSHROOM );
2013-04-04 17:55:35 -07:00
}
2016-05-18 05:11:56 -07:00
if ( biome . fillerBlock == Blocks . HARDENED_CLAY )
2015-06-19 07:04:19 -07:00
{
2016-12-01 00:48:44 +01:00
BiomeDictionary . addTypes ( biome , MESA );
2015-06-19 07:04:19 -07:00
}
2013-04-04 17:55:35 -07:00
}
2014-07-07 21:29:37 -07:00
//Internal implementation
2016-05-18 03:29:10 -07:00
private static BiomeInfo getBiomeInfo ( Biome biome )
2016-03-03 18:07:18 +11:00
{
2016-12-01 00:48:44 +01:00
BiomeInfo info = biomeInfoMap . get ( biome . getRegistryName ());
if ( info == null )
{
info = new BiomeInfo ();
biomeInfoMap . put ( biome . getRegistryName (), info );
}
return info ;
2016-03-03 18:07:18 +11:00
}
2016-05-18 03:29:10 -07:00
2016-12-01 00:48:44 +01:00
/**
* Ensure that at least one type has been added to the given biome.
*/
static void ensureHasTypes ( Biome biome )
2013-04-04 17:55:35 -07:00
{
2016-12-01 00:48:44 +01:00
if ( ! hasAnyType ( biome ))
2013-04-04 17:55:35 -07:00
{
makeBestGuess ( biome );
2017-06-23 07:33:11 +02:00
FMLLog . log . warn ( "No types have been added to Biome {}, types have been assigned on a best-effort guess: {}" , biome . getRegistryName (), getTypes ( biome ));
2013-04-04 17:55:35 -07:00
}
}
2017-02-04 18:29:42 +01:00
private static Collection < Type > listSupertypes ( Type ... types )
2013-04-04 17:55:35 -07:00
{
2017-02-04 18:29:42 +01:00
Set < Type > supertypes = new HashSet < Type > ();
Deque < Type > next = new ArrayDeque < Type > ();
Collections . addAll ( next , types );
2014-07-07 21:29:37 -07:00
2017-02-04 18:29:42 +01:00
while ( ! next . isEmpty ())
2014-07-01 12:46:00 +10:00
{
2017-02-04 18:29:42 +01:00
Type type = next . remove ();
for ( Type sType : Type . byName . values ())
2016-12-01 00:48:44 +01:00
{
2017-02-04 18:29:42 +01:00
if ( type . subTypes . contains ( type ) && supertypes . add ( sType ))
next . add ( sType );
2016-12-01 00:48:44 +01:00
}
2014-07-01 12:46:00 +10:00
}
2014-07-07 21:29:37 -07:00
2017-02-04 18:29:42 +01:00
return supertypes ;
2014-07-01 12:46:00 +10:00
}
2013-04-04 17:55:35 -07:00
private static void registerVanillaBiomes ()
{
2016-12-03 10:46:36 -08:00
addTypes ( Biomes . OCEAN , OCEAN );
addTypes ( Biomes . PLAINS , PLAINS );
addTypes ( Biomes . DESERT , HOT , DRY , SANDY );
addTypes ( Biomes . EXTREME_HILLS , MOUNTAIN , HILLS );
addTypes ( Biomes . FOREST , FOREST );
addTypes ( Biomes . TAIGA , COLD , CONIFEROUS , FOREST );
addTypes ( Biomes . SWAMPLAND , WET , SWAMP );
addTypes ( Biomes . RIVER , RIVER );
addTypes ( Biomes . HELL , HOT , DRY , NETHER );
addTypes ( Biomes . SKY , COLD , DRY , END );
addTypes ( Biomes . FROZEN_OCEAN , COLD , OCEAN , SNOWY );
addTypes ( Biomes . FROZEN_RIVER , COLD , RIVER , SNOWY );
addTypes ( Biomes . ICE_PLAINS , COLD , SNOWY , WASTELAND );
addTypes ( Biomes . ICE_MOUNTAINS , COLD , SNOWY , MOUNTAIN );
addTypes ( Biomes . MUSHROOM_ISLAND , MUSHROOM , RARE );
addTypes ( Biomes . MUSHROOM_ISLAND_SHORE , MUSHROOM , BEACH , RARE );
addTypes ( Biomes . BEACH , BEACH );
addTypes ( Biomes . DESERT_HILLS , HOT , DRY , SANDY , HILLS );
addTypes ( Biomes . FOREST_HILLS , FOREST , HILLS );
addTypes ( Biomes . TAIGA_HILLS , COLD , CONIFEROUS , FOREST , HILLS );
addTypes ( Biomes . EXTREME_HILLS_EDGE , MOUNTAIN );
addTypes ( Biomes . JUNGLE , HOT , WET , DENSE , JUNGLE );
addTypes ( Biomes . JUNGLE_HILLS , HOT , WET , DENSE , JUNGLE , HILLS );
addTypes ( Biomes . JUNGLE_EDGE , HOT , WET , JUNGLE , FOREST , RARE );
addTypes ( Biomes . DEEP_OCEAN , OCEAN );
addTypes ( Biomes . STONE_BEACH , BEACH );
addTypes ( Biomes . COLD_BEACH , COLD , BEACH , SNOWY );
addTypes ( Biomes . BIRCH_FOREST , FOREST );
addTypes ( Biomes . BIRCH_FOREST_HILLS , FOREST , HILLS );
addTypes ( Biomes . ROOFED_FOREST , SPOOKY , DENSE , FOREST );
addTypes ( Biomes . COLD_TAIGA , COLD , CONIFEROUS , FOREST , SNOWY );
addTypes ( Biomes . COLD_TAIGA_HILLS , COLD , CONIFEROUS , FOREST , SNOWY , HILLS );
addTypes ( Biomes . REDWOOD_TAIGA , COLD , CONIFEROUS , FOREST );
addTypes ( Biomes . REDWOOD_TAIGA_HILLS , COLD , CONIFEROUS , FOREST , HILLS );
addTypes ( Biomes . EXTREME_HILLS_WITH_TREES , MOUNTAIN , FOREST , SPARSE );
addTypes ( Biomes . SAVANNA , HOT , SAVANNA , PLAINS , SPARSE );
addTypes ( Biomes . SAVANNA_PLATEAU , HOT , SAVANNA , PLAINS , SPARSE , RARE );
addTypes ( Biomes . MESA , MESA , SANDY );
addTypes ( Biomes . MESA_ROCK , MESA , SPARSE , SANDY );
addTypes ( Biomes . MESA_CLEAR_ROCK , MESA , SANDY );
addTypes ( Biomes . VOID , VOID );
addTypes ( Biomes . MUTATED_PLAINS , PLAINS , RARE );
addTypes ( Biomes . MUTATED_DESERT , HOT , DRY , SANDY , RARE );
addTypes ( Biomes . MUTATED_EXTREME_HILLS , MOUNTAIN , SPARSE , RARE );
addTypes ( Biomes . MUTATED_FOREST , FOREST , HILLS , RARE );
addTypes ( Biomes . MUTATED_TAIGA , COLD , CONIFEROUS , FOREST , MOUNTAIN , RARE );
addTypes ( Biomes . MUTATED_SWAMPLAND , WET , SWAMP , HILLS , RARE );
addTypes ( Biomes . MUTATED_ICE_FLATS , COLD , SNOWY , HILLS , RARE );
addTypes ( Biomes . MUTATED_JUNGLE , HOT , WET , DENSE , JUNGLE , MOUNTAIN , RARE );
addTypes ( Biomes . MUTATED_JUNGLE_EDGE , HOT , SPARSE , JUNGLE , HILLS , RARE );
addTypes ( Biomes . MUTATED_BIRCH_FOREST , FOREST , DENSE , HILLS , RARE );
addTypes ( Biomes . MUTATED_BIRCH_FOREST_HILLS , FOREST , DENSE , MOUNTAIN , RARE );
addTypes ( Biomes . MUTATED_ROOFED_FOREST , SPOOKY , DENSE , FOREST , MOUNTAIN , RARE );
addTypes ( Biomes . MUTATED_TAIGA_COLD , COLD , CONIFEROUS , FOREST , SNOWY , MOUNTAIN , RARE );
addTypes ( Biomes . MUTATED_REDWOOD_TAIGA , DENSE , FOREST , RARE );
addTypes ( Biomes . MUTATED_REDWOOD_TAIGA_HILLS , DENSE , FOREST , HILLS , RARE );
addTypes ( Biomes . MUTATED_EXTREME_HILLS_WITH_TREES , MOUNTAIN , SPARSE , RARE );
addTypes ( Biomes . MUTATED_SAVANNA , HOT , DRY , SPARSE , SAVANNA , MOUNTAIN , RARE );
addTypes ( Biomes . MUTATED_SAVANNA_ROCK , HOT , DRY , SPARSE , SAVANNA , HILLS , RARE );
addTypes ( Biomes . MUTATED_MESA , HOT , DRY , SPARSE , SAVANNA , MOUNTAIN , RARE );
addTypes ( Biomes . MUTATED_MESA_ROCK , HOT , DRY , SPARSE , HILLS , RARE );
addTypes ( Biomes . MUTATED_MESA_CLEAR_ROCK , HOT , DRY , SPARSE , SAVANNA , MOUNTAIN , RARE );
2013-04-04 17:55:35 -07:00
}
2013-04-19 14:08:53 +03:00
}