2016-06-22 23:49:47 -04:00
/*
* Minecraft Forge
2020-07-02 19:49:11 +02:00
* Copyright (c) 2016-2020.
2016-06-22 23:49:47 -04:00
*
* 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.* ;
2017-06-27 14:04:51 -07:00
import java.util.stream.Collectors ;
2013-09-05 10:08:02 -04:00
2016-12-01 00:48:44 +01:00
import javax.annotation.Nonnull ;
2018-09-11 18:25:25 -07:00
import javax.annotation.Nullable ;
import org.apache.logging.log4j.LogManager ;
import org.apache.logging.log4j.Logger ;
2016-04-09 18:03:46 -05:00
2019-05-23 16:02:15 -07:00
import net.minecraft.world.biome.Biomes ;
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.* ;
2018-09-06 04:39:01 -07:00
import net.minecraftforge.registries.ForgeRegistries ;
2016-12-01 00:48:44 +01:00
import com.google.common.base.Preconditions ;
import com.google.common.collect.ImmutableList ;
2013-04-04 17:55:35 -07:00
public class BiomeDictionary
{
2017-06-27 14:04:51 -07:00
private static final boolean DEBUG = false ;
2018-09-11 18:25:25 -07:00
private static final Logger LOGGER = LogManager . getLogger ();
2017-06-27 14:04:51 -07:00
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 > ();
2018-04-01 03:03:27 -05:00
private static Collection < Type > allTypes = Collections . unmodifiableCollection ( byName . values ());
2016-12-01 00:48:44 +01:00
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 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" );
2019-11-01 12:26:08 -06:00
public static final Type PLATEAU = new Type ( "PLATEAU" );
public static final Type MODIFIED = new Type ( "MODIFIED" );
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
2019-11-01 12:26:08 -06:00
/*Tags specifying the dimension a biome generates in. Specifying none implies a biome that generates in a modded dimension*/
public static final Type OVERWORLD = new Type ( "OVERWORLD" );
public static final Type NETHER = new Type ( "NETHER" );
public static final Type END = new Type ( "END" );
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 );
}
/**
* 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
}
2018-09-11 18:25:25 -07:00
2018-04-01 03:03:27 -05:00
/**
* @return An unmodifiable collection of all current biome types.
*/
public static Collection < Type > getAll ()
{
return allTypes ;
}
2018-09-11 18:25:25 -07:00
@Nullable
public static Type fromVanilla ( Biome . Category category )
{
if ( category == Biome . Category . NONE )
return null ;
if ( category == Biome . Category . THEEND )
return VOID ;
return getType ( category . name ());
}
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 );
2017-06-27 14:04:51 -07:00
Collections . addAll ( supertypes , 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
{
2018-09-22 03:40:22 -07:00
Type type = Type . fromVanilla ( biome . getCategory ());
2018-09-11 18:25:25 -07:00
if ( type != null )
2013-04-04 17:55:35 -07:00
{
2018-09-11 18:25:25 -07:00
BiomeDictionary . addTypes ( biome , type );
2013-04-04 17:55:35 -07:00
}
2018-09-22 03:40:22 -07:00
if ( biome . getDownfall () > 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
}
2018-09-22 03:40:22 -07:00
if ( biome . getDownfall () < 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
}
2017-10-03 22:08:36 -07:00
if ( biome . getDefaultTemperature () > 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
}
2017-10-03 22:08:36 -07:00
if ( biome . getDefaultTemperature () < 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
}
2018-09-22 03:40:22 -07:00
if ( biome . isHighHumidity () && biome . getDepth () < 0 . 0F && ( biome . getScale () <= 0 . 3F && biome . getScale () >= 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
}
2018-09-22 03:40:22 -07:00
if ( biome . getDepth () <= - 0 . 5F )
2013-04-04 17:55:35 -07:00
{
2018-09-22 03:40:22 -07:00
if ( biome . getScale () == 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
}
2018-09-22 03:40:22 -07:00
if ( biome . getScale () >= 0 . 4F && biome . getScale () < 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
}
2018-09-22 03:40:22 -07:00
if ( biome . getScale () >= 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-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
{
2017-06-28 00:14:10 -07:00
return biomeInfoMap . computeIfAbsent ( biome . getRegistryName (), k -> new BiomeInfo ());
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 );
2019-11-01 14:24:01 -04:00
LOGGER . warn ( "No types have been added to Biome {}, types have been assigned on a best-effort guess: {}" , biome . getRegistryName (), ! getBiomeInfo ( biome ). types . isEmpty () ? getBiomeInfo ( biome ). types : "could not guess types" );
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-06-27 14:04:51 -07:00
if ( sType . subTypes . contains ( type ) && supertypes . add ( sType ))
2017-02-04 18:29:42 +01:00
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 ()
{
2020-06-23 20:56:24 -04:00
addTypes ( Biomes . OCEAN , OCEAN , OVERWORLD );
addTypes ( Biomes . PLAINS , PLAINS , OVERWORLD );
addTypes ( Biomes . DESERT , HOT , DRY , SANDY , OVERWORLD );
addTypes ( Biomes . MOUNTAINS , MOUNTAIN , HILLS , OVERWORLD );
addTypes ( Biomes . FOREST , FOREST , OVERWORLD );
addTypes ( Biomes . TAIGA , COLD , CONIFEROUS , FOREST , OVERWORLD );
addTypes ( Biomes . SWAMP , WET , SWAMP , OVERWORLD );
addTypes ( Biomes . RIVER , RIVER , OVERWORLD );
addTypes ( Biomes . field_235254_j_ , HOT , DRY , NETHER );
addTypes ( Biomes . THE_END , COLD , DRY , END );
addTypes ( Biomes . FROZEN_OCEAN , COLD , OCEAN , SNOWY , OVERWORLD );
addTypes ( Biomes . FROZEN_RIVER , COLD , RIVER , SNOWY , OVERWORLD );
addTypes ( Biomes . SNOWY_TUNDRA , COLD , SNOWY , WASTELAND , OVERWORLD );
addTypes ( Biomes . SNOWY_MOUNTAINS , COLD , SNOWY , MOUNTAIN , OVERWORLD );
addTypes ( Biomes . MUSHROOM_FIELDS , MUSHROOM , RARE , OVERWORLD );
addTypes ( Biomes . MUSHROOM_FIELD_SHORE , MUSHROOM , BEACH , RARE , OVERWORLD );
addTypes ( Biomes . BEACH , BEACH , OVERWORLD );
addTypes ( Biomes . DESERT_HILLS , HOT , DRY , SANDY , HILLS , OVERWORLD );
addTypes ( Biomes . WOODED_HILLS , FOREST , HILLS , OVERWORLD );
addTypes ( Biomes . TAIGA_HILLS , COLD , CONIFEROUS , FOREST , HILLS , OVERWORLD );
addTypes ( Biomes . MOUNTAIN_EDGE , MOUNTAIN , OVERWORLD );
addTypes ( Biomes . JUNGLE , HOT , WET , DENSE , JUNGLE , OVERWORLD );
addTypes ( Biomes . JUNGLE_HILLS , HOT , WET , DENSE , JUNGLE , HILLS , OVERWORLD );
addTypes ( Biomes . JUNGLE_EDGE , HOT , WET , JUNGLE , FOREST , RARE , OVERWORLD );
addTypes ( Biomes . DEEP_OCEAN , OCEAN , OVERWORLD );
addTypes ( Biomes . STONE_SHORE , BEACH , OVERWORLD );
addTypes ( Biomes . SNOWY_BEACH , COLD , BEACH , SNOWY , OVERWORLD );
addTypes ( Biomes . BIRCH_FOREST , FOREST , OVERWORLD );
addTypes ( Biomes . BIRCH_FOREST_HILLS , FOREST , HILLS , OVERWORLD );
addTypes ( Biomes . DARK_FOREST , SPOOKY , DENSE , FOREST , OVERWORLD );
addTypes ( Biomes . SNOWY_TAIGA , COLD , CONIFEROUS , FOREST , SNOWY , OVERWORLD );
addTypes ( Biomes . SNOWY_TAIGA_HILLS , COLD , CONIFEROUS , FOREST , SNOWY , HILLS , OVERWORLD );
addTypes ( Biomes . GIANT_TREE_TAIGA , COLD , CONIFEROUS , FOREST , OVERWORLD );
addTypes ( Biomes . GIANT_TREE_TAIGA_HILLS , COLD , CONIFEROUS , FOREST , HILLS , OVERWORLD );
addTypes ( Biomes . WOODED_MOUNTAINS , MOUNTAIN , FOREST , SPARSE , OVERWORLD );
addTypes ( Biomes . SAVANNA , HOT , SAVANNA , PLAINS , SPARSE , OVERWORLD );
addTypes ( Biomes . SAVANNA_PLATEAU , HOT , SAVANNA , PLAINS , SPARSE , RARE , OVERWORLD , PLATEAU );
addTypes ( Biomes . BADLANDS , MESA , SANDY , DRY , OVERWORLD );
addTypes ( Biomes . WOODED_BADLANDS_PLATEAU , MESA , SANDY , DRY , SPARSE , OVERWORLD , PLATEAU );
addTypes ( Biomes . BADLANDS_PLATEAU , MESA , SANDY , DRY , OVERWORLD , PLATEAU );
addTypes ( Biomes . SMALL_END_ISLANDS , END );
addTypes ( Biomes . END_MIDLANDS , END );
addTypes ( Biomes . END_HIGHLANDS , END );
addTypes ( Biomes . END_BARRENS , END );
addTypes ( Biomes . WARM_OCEAN , OCEAN , HOT , OVERWORLD );
addTypes ( Biomes . LUKEWARM_OCEAN , OCEAN , OVERWORLD );
addTypes ( Biomes . COLD_OCEAN , OCEAN , COLD , OVERWORLD );
addTypes ( Biomes . DEEP_WARM_OCEAN , OCEAN , HOT , OVERWORLD );
addTypes ( Biomes . DEEP_LUKEWARM_OCEAN , OCEAN , OVERWORLD );
addTypes ( Biomes . DEEP_COLD_OCEAN , OCEAN , COLD , OVERWORLD );
addTypes ( Biomes . DEEP_FROZEN_OCEAN , OCEAN , COLD , OVERWORLD );
addTypes ( Biomes . THE_VOID , VOID );
addTypes ( Biomes . SUNFLOWER_PLAINS , PLAINS , RARE , OVERWORLD );
addTypes ( Biomes . DESERT_LAKES , HOT , DRY , SANDY , RARE , OVERWORLD );
addTypes ( Biomes . GRAVELLY_MOUNTAINS , MOUNTAIN , SPARSE , RARE , OVERWORLD );
addTypes ( Biomes . FLOWER_FOREST , FOREST , HILLS , RARE , OVERWORLD );
addTypes ( Biomes . TAIGA_MOUNTAINS , COLD , CONIFEROUS , FOREST , MOUNTAIN , RARE , OVERWORLD );
addTypes ( Biomes . SWAMP_HILLS , WET , SWAMP , HILLS , RARE , OVERWORLD );
addTypes ( Biomes . ICE_SPIKES , COLD , SNOWY , HILLS , RARE , OVERWORLD );
addTypes ( Biomes . MODIFIED_JUNGLE , HOT , WET , DENSE , JUNGLE , MOUNTAIN , RARE , OVERWORLD , MODIFIED );
addTypes ( Biomes . MODIFIED_JUNGLE_EDGE , HOT , SPARSE , JUNGLE , HILLS , RARE , OVERWORLD , MODIFIED );
addTypes ( Biomes . TALL_BIRCH_FOREST , FOREST , DENSE , HILLS , RARE , OVERWORLD );
addTypes ( Biomes . TALL_BIRCH_HILLS , FOREST , DENSE , MOUNTAIN , RARE , OVERWORLD );
addTypes ( Biomes . DARK_FOREST_HILLS , SPOOKY , DENSE , FOREST , MOUNTAIN , RARE , OVERWORLD );
addTypes ( Biomes . SNOWY_TAIGA_MOUNTAINS , COLD , CONIFEROUS , FOREST , SNOWY , MOUNTAIN , RARE , OVERWORLD );
addTypes ( Biomes . GIANT_SPRUCE_TAIGA , DENSE , FOREST , RARE , OVERWORLD );
addTypes ( Biomes . GIANT_SPRUCE_TAIGA_HILLS , DENSE , FOREST , HILLS , RARE , OVERWORLD );
addTypes ( Biomes . MODIFIED_GRAVELLY_MOUNTAINS , MOUNTAIN , SPARSE , RARE , OVERWORLD , MODIFIED );
addTypes ( Biomes . SHATTERED_SAVANNA , HOT , DRY , SPARSE , SAVANNA , MOUNTAIN , RARE , OVERWORLD );
addTypes ( Biomes . SHATTERED_SAVANNA_PLATEAU , HOT , DRY , SPARSE , SAVANNA , HILLS , RARE , OVERWORLD , PLATEAU );
addTypes ( Biomes . ERODED_BADLANDS , HOT , DRY , SPARSE , MOUNTAIN , RARE , OVERWORLD );
addTypes ( Biomes . MODIFIED_WOODED_BADLANDS_PLATEAU , HOT , DRY , SPARSE , HILLS , RARE , OVERWORLD , PLATEAU , MODIFIED );
addTypes ( Biomes . MODIFIED_BADLANDS_PLATEAU , HOT , DRY , SPARSE , MOUNTAIN , RARE , OVERWORLD , PLATEAU , MODIFIED );
2017-06-27 14:04:51 -07:00
if ( DEBUG )
{
2018-09-11 18:25:25 -07:00
StringBuilder buf = new StringBuilder ();
buf . append ( "BiomeDictionary:\n" );
Type . byName . forEach (( name , type ) -> buf . append ( " " ). append ( type . name ). append ( ": " ). append ( type . biomes . stream (). map ( b -> b . getRegistryName (). toString ()). collect ( Collectors . joining ( ", " ))). append ( '\n' ));
LOGGER . debug ( buf . toString ());
2017-06-27 14:04:51 -07:00
}
2013-04-04 17:55:35 -07:00
}
2013-04-19 14:08:53 +03:00
}