BiomeDictionary code cleanup (#3466)
This commit is contained in:
parent
dac8e49f50
commit
96f88538d5
|
@ -21,133 +21,140 @@ package net.minecraftforge.common;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import net.minecraftforge.fml.common.FMLLog;
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
import net.minecraft.init.Biomes;
|
import net.minecraft.init.Biomes;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
import net.minecraft.world.biome.*;
|
import net.minecraft.world.biome.*;
|
||||||
import net.minecraftforge.common.util.EnumHelper;
|
|
||||||
import net.minecraftforge.event.terraingen.DeferredBiomeDecorator;
|
|
||||||
import static net.minecraftforge.common.BiomeDictionary.Type.*;
|
import static net.minecraftforge.common.BiomeDictionary.Type.*;
|
||||||
|
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;
|
||||||
|
|
||||||
public class BiomeDictionary
|
public class BiomeDictionary
|
||||||
{
|
{
|
||||||
public enum Type
|
public static final class Type
|
||||||
{
|
{
|
||||||
|
|
||||||
|
private static final Map<String, Type> byName = new HashMap<String, Type>();
|
||||||
|
|
||||||
/*Temperature-based tags. Specifying neither implies a biome is temperate*/
|
/*Temperature-based tags. Specifying neither implies a biome is temperate*/
|
||||||
HOT,
|
public static final Type HOT = new Type("HOT");
|
||||||
COLD,
|
public static final Type COLD = new Type("COLD");
|
||||||
|
|
||||||
/*Tags specifying the amount of vegetation a biome has. Specifying neither implies a biome to have moderate amounts*/
|
/*Tags specifying the amount of vegetation a biome has. Specifying neither implies a biome to have moderate amounts*/
|
||||||
SPARSE,
|
public static final Type SPARSE = new Type("SPARSE");
|
||||||
DENSE,
|
public static final Type DENSE = new Type("DENSE");
|
||||||
|
|
||||||
/*Tags specifying how moist a biome is. Specifying neither implies the biome as having moderate humidity*/
|
/*Tags specifying how moist a biome is. Specifying neither implies the biome as having moderate humidity*/
|
||||||
WET,
|
public static final Type WET = new Type("WET");
|
||||||
DRY,
|
public static final Type DRY = new Type("DRY");
|
||||||
|
|
||||||
/*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.
|
/*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)*/
|
* Specifying no tag implies a biome has temperate trees (Such as Oak)*/
|
||||||
SAVANNA,
|
public static final Type SAVANNA = new Type("SAVANNA");
|
||||||
CONIFEROUS,
|
public static final Type CONIFEROUS = new Type("CONIFEROUS");
|
||||||
JUNGLE,
|
public static final Type JUNGLE = new Type("JUNGLE");
|
||||||
|
|
||||||
/*Tags specifying the nature of a biome*/
|
/*Tags specifying the nature of a biome*/
|
||||||
SPOOKY,
|
public static final Type SPOOKY = new Type("SPOOKY");
|
||||||
DEAD,
|
public static final Type DEAD = new Type("DEAD");
|
||||||
LUSH,
|
public static final Type LUSH = new Type("LUSH");
|
||||||
NETHER,
|
public static final Type NETHER = new Type("NETHER");
|
||||||
END,
|
public static final Type END = new Type("END");
|
||||||
MUSHROOM,
|
public static final Type MUSHROOM = new Type("MUSHROOM");
|
||||||
MAGICAL,
|
public static final Type MAGICAL = new Type("MAGICAL");
|
||||||
|
|
||||||
OCEAN,
|
public static final Type OCEAN = new Type("OCEAN");
|
||||||
RIVER,
|
public static final Type RIVER = new Type("RIVER");
|
||||||
/**A general tag for all water-based biomes. Shown as present if OCEAN or RIVER are.**/
|
/**
|
||||||
WATER(OCEAN, 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);
|
||||||
|
|
||||||
/*Generic types which a biome can be*/
|
/*Generic types which a biome can be*/
|
||||||
MESA,
|
public static final Type MESA = new Type("MESA");
|
||||||
FOREST,
|
public static final Type FOREST = new Type("FOREST");
|
||||||
PLAINS,
|
public static final Type PLAINS = new Type("PLAINS");
|
||||||
MOUNTAIN,
|
public static final Type MOUNTAIN = new Type("MOUNTAIN");
|
||||||
HILLS,
|
public static final Type HILLS = new Type("HILLS");
|
||||||
SWAMP,
|
public static final Type SWAMP = new Type("SWAMP");
|
||||||
SANDY,
|
public static final Type SANDY = new Type("SANDY");
|
||||||
SNOWY,
|
public static final Type SNOWY = new Type("SNOWY");
|
||||||
WASTELAND,
|
public static final Type WASTELAND = new Type("WASTELAND");
|
||||||
BEACH;
|
public static final Type BEACH = new Type("BEACH");
|
||||||
|
|
||||||
private List<Type> subTags;
|
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(Type... subTags)
|
private Type(String name, Type... subTypes)
|
||||||
{
|
{
|
||||||
this.subTags = Arrays.asList(subTags);
|
this.name = name;
|
||||||
|
this.subTypes = ImmutableList.copyOf(subTypes);
|
||||||
|
|
||||||
|
byName.put(name, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasSubTags()
|
private boolean hasSubTypes()
|
||||||
{
|
{
|
||||||
return subTags != null && !subTags.isEmpty();
|
return !subTypes.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves a Type value by name,
|
* Gets the name for this type.
|
||||||
|
*/
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves a Type instance by name,
|
||||||
* if one does not exist already it creates one.
|
* if one does not exist already it creates one.
|
||||||
* This can be used as intermediate measure for modders to
|
* This can be used as intermediate measure for modders to
|
||||||
* add their own category of Biome.
|
* add their own Biome types.
|
||||||
*
|
* <p>
|
||||||
* There are NO naming conventions besides:
|
* There are <i>no</i> naming conventions besides:
|
||||||
* MUST be all upper case (enforced by name.toUpper())
|
* <ul><li><b>Must</b> be all upper case (enforced by name.toUpper())</li>
|
||||||
* NO Special characters. {Unenforced, just don't be a pain, if it becomes a issue I WILL
|
* <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}
|
* make this RTE with no worry about backwards compatibility}</li></ul>
|
||||||
*
|
* <p>
|
||||||
* Note: For performance sake, the return value of this function SHOULD be cached.
|
* Note: For performance sake, the return value of this function SHOULD be cached.
|
||||||
* Two calls with the same name SHOULD return the same value.
|
* Two calls with the same name SHOULD return the same value.
|
||||||
*
|
*
|
||||||
*
|
|
||||||
* @param name The name of this Type
|
* @param name The name of this Type
|
||||||
* @return An instance of Type for this name.
|
* @return An instance of Type for this name.
|
||||||
*/
|
*/
|
||||||
public static Type getType(String name, Type... subTypes)
|
public static Type getType(String name, Type... subTypes)
|
||||||
{
|
{
|
||||||
name = name.toUpperCase();
|
name = name.toUpperCase();
|
||||||
for (Type t : values())
|
Type t = byName.get(name);
|
||||||
|
if (t == null)
|
||||||
{
|
{
|
||||||
if (t.name().equals(name))
|
t = new Type(name, subTypes);
|
||||||
return t;
|
|
||||||
}
|
}
|
||||||
Type ret = EnumHelper.addEnum(Type.class, name, new Class[]{Type[].class}, new Object[]{subTypes});
|
return t;
|
||||||
if (ret.ordinal() >= typeInfoList.length)
|
|
||||||
{
|
|
||||||
typeInfoList = Arrays.copyOf(typeInfoList, ret.ordinal()+1);
|
|
||||||
}
|
|
||||||
for(BiomeInfo bInfo:biomeInfoMap.values())
|
|
||||||
{
|
|
||||||
if(bInfo != null)
|
|
||||||
{
|
|
||||||
EnumSet<Type> oldSet = bInfo.typeList;
|
|
||||||
bInfo.typeList = EnumSet.noneOf(Type.class);
|
|
||||||
bInfo.typeList.addAll(oldSet);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static HashMap<ResourceLocation, BiomeInfo> biomeInfoMap = new HashMap<ResourceLocation, BiomeInfo>();
|
private static final Map<ResourceLocation, BiomeInfo> biomeInfoMap = new HashMap<ResourceLocation, BiomeInfo>();
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private static ArrayList<Biome>[] typeInfoList = new ArrayList[Type.values().length];
|
|
||||||
|
|
||||||
private static class BiomeInfo
|
private static class BiomeInfo
|
||||||
{
|
{
|
||||||
public EnumSet<Type> typeList;
|
|
||||||
|
|
||||||
public BiomeInfo(Type[] types)
|
private final Set<Type> types = new HashSet<Type>();
|
||||||
{
|
private final Set<Type> typesUn = Collections.unmodifiableSet(this.types);
|
||||||
typeList = EnumSet.noneOf(Type.class);
|
|
||||||
for(Type t : types)
|
|
||||||
{
|
|
||||||
typeList.add(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
|
@ -156,90 +163,54 @@ public class BiomeDictionary
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers a biome with a specific biome type
|
* Adds the given types to the biome.
|
||||||
*
|
*
|
||||||
* @param biome the biome to be registered
|
|
||||||
* @param types the types to register the biome as
|
|
||||||
* @return returns true if the biome was registered successfully
|
|
||||||
*/
|
*/
|
||||||
public static boolean registerBiomeType(Biome biome, Type ... types)
|
public static void addTypes(Biome biome, Type... types)
|
||||||
{
|
{
|
||||||
types = listSubTags(types);
|
Preconditions.checkArgument(ForgeRegistries.BIOMES.containsValue(biome), "Cannot add types to unregistered biome %s", biome);
|
||||||
|
|
||||||
if(Biome.REGISTRY.getNameForObject(biome) != null)
|
List<Type> subTypes = listSubTypes(types);
|
||||||
|
|
||||||
|
for (Type type : subTypes)
|
||||||
{
|
{
|
||||||
for(Type type : types)
|
type.biomes.add(biome);
|
||||||
{
|
|
||||||
if(typeInfoList[type.ordinal()] == null)
|
|
||||||
{
|
|
||||||
typeInfoList[type.ordinal()] = new ArrayList<Biome>();
|
|
||||||
}
|
|
||||||
|
|
||||||
typeInfoList[type.ordinal()].add(biome);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!isBiomeRegistered(biome))
|
|
||||||
{
|
|
||||||
ResourceLocation location = Biome.REGISTRY.getNameForObject(biome);
|
|
||||||
biomeInfoMap.put(location, new BiomeInfo(types));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for(Type type : types)
|
|
||||||
{
|
|
||||||
getBiomeInfo(biome).typeList.add(type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
getBiomeInfo(biome).types.addAll(subTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a list of biomes registered with a specific type
|
* Gets the set of biomes that have the given type.
|
||||||
*
|
*
|
||||||
* @param type the Type to look for
|
|
||||||
* @return a list of biomes of the specified type, null if there are none
|
|
||||||
*/
|
*/
|
||||||
public static Biome[] getBiomesForType(Type type)
|
@Nonnull
|
||||||
|
public static Set<Biome> getBiomes(Type type)
|
||||||
{
|
{
|
||||||
if(typeInfoList[type.ordinal()] != null)
|
return type.biomesUn;
|
||||||
{
|
|
||||||
return typeInfoList[type.ordinal()].toArray(new Biome[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Biome[0];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a list of Types that a specific biome is registered with
|
* Gets the set of types that have been added to the given biome.
|
||||||
*
|
*
|
||||||
* @param biome the biome to check
|
|
||||||
* @return the list of types, null if there are none
|
|
||||||
*/
|
*/
|
||||||
public static Type[] getTypesForBiome(Biome biome)
|
@Nonnull
|
||||||
|
public static Set<Type> getTypes(Biome biome)
|
||||||
{
|
{
|
||||||
checkRegistration(biome);
|
ensureHasTypes(biome);
|
||||||
return getBiomeInfo(biome).typeList.toArray(new Type[0]);
|
return getBiomeInfo(biome).typesUn;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks to see if two biomes are registered as having the same type
|
* Checks if the two given biomes have types in common.
|
||||||
*
|
*
|
||||||
* @param biomeA
|
|
||||||
* @param biomeB
|
|
||||||
* @return returns true if a common type is found, false otherwise
|
* @return returns true if a common type is found, false otherwise
|
||||||
*/
|
*/
|
||||||
public static boolean areBiomesEquivalent(Biome biomeA, Biome biomeB)
|
public static boolean areSimilar(Biome biomeA, Biome biomeB)
|
||||||
{
|
{
|
||||||
checkRegistration(biomeA);
|
for (Type type : getTypes(biomeA))
|
||||||
checkRegistration(biomeB);
|
|
||||||
|
|
||||||
for(Type type : getTypesForBiome(biomeA))
|
|
||||||
{
|
{
|
||||||
if(containsType(getBiomeInfo(biomeB), type))
|
if (containsType(getTypes(biomeB), type))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -249,61 +220,28 @@ public class BiomeDictionary
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks to see if the given biome is registered as being a specific type
|
* Checks if the given type has been added to the given biome.
|
||||||
*
|
*
|
||||||
* @param biome the biome to be considered
|
|
||||||
* @param type the type to check for
|
|
||||||
* @return returns true if the biome is registered as being of type type, false otherwise
|
|
||||||
*/
|
*/
|
||||||
public static boolean isBiomeOfType(Biome biome, Type type)
|
public static boolean hasType(Biome biome, Type type)
|
||||||
{
|
{
|
||||||
checkRegistration(biome);
|
return getTypes(biome).contains(type);
|
||||||
return containsType(getBiomeInfo(biome), type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks to see if the given biome has been registered as being of any type
|
* Checks if any type has been added to the given biome.
|
||||||
* @param biome the biome to consider
|
|
||||||
* @return returns true if the biome has been registered, false otherwise
|
|
||||||
*/
|
|
||||||
public static boolean isBiomeRegistered(Biome biome)
|
|
||||||
{
|
|
||||||
return biomeInfoMap.containsKey(Biome.REGISTRY.getNameForObject(biome));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void registerAllBiomes()
|
|
||||||
{
|
|
||||||
FMLLog.warning("Redundant call to BiomeDictionary.registerAllBiomes ignored");
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Loops through the biome list and automatically adds tags to any biome that does not have any
|
|
||||||
* This is called by Forge at postinit time. It will additionally dispatch any deferred decorator
|
|
||||||
* creation events.
|
|
||||||
*
|
*
|
||||||
* DO NOT call this during world generation
|
|
||||||
*/
|
*/
|
||||||
public static void registerAllBiomesAndGenerateEvents()
|
public static boolean hasAnyType(Biome biome)
|
||||||
{
|
{
|
||||||
for (ResourceLocation biomeResource : Biome.REGISTRY.getKeys())
|
return !getBiomeInfo(biome).types.isEmpty();
|
||||||
{
|
|
||||||
Biome biome = Biome.REGISTRY.getObject(biomeResource);
|
|
||||||
|
|
||||||
if (biome.theBiomeDecorator instanceof DeferredBiomeDecorator)
|
|
||||||
{
|
|
||||||
DeferredBiomeDecorator decorator = (DeferredBiomeDecorator) biome.theBiomeDecorator;
|
|
||||||
decorator.fireCreateEventAndReplace(biome);
|
|
||||||
}
|
|
||||||
|
|
||||||
checkRegistration(biome);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Automatically looks for and registers a given biome with appropriate tags
|
* Automatically adds appropriate types to a given biome based on certain heuristics.
|
||||||
* This method is called automatically if a biome has not been registered with any tags,
|
* If a biome's types are requested and no types have been added to the biome so far, the biome's types
|
||||||
* And another method requests information about it
|
* will be determined and added using this method.
|
||||||
*
|
*
|
||||||
* @param biome the biome to be considered
|
|
||||||
*/
|
*/
|
||||||
public static void makeBestGuess(Biome biome)
|
public static void makeBestGuess(Biome biome)
|
||||||
{
|
{
|
||||||
|
@ -311,189 +249,202 @@ public class BiomeDictionary
|
||||||
{
|
{
|
||||||
if (biome.isHighHumidity() && biome.getTemperature() >= 0.9F)
|
if (biome.isHighHumidity() && biome.getTemperature() >= 0.9F)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, JUNGLE);
|
BiomeDictionary.addTypes(biome, JUNGLE);
|
||||||
}
|
}
|
||||||
else if (!biome.isHighHumidity())
|
else if (!biome.isHighHumidity())
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, FOREST);
|
BiomeDictionary.addTypes(biome, FOREST);
|
||||||
|
|
||||||
if (biome.getTemperature() <= 0.2f)
|
if (biome.getTemperature() <= 0.2f)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, CONIFEROUS);
|
BiomeDictionary.addTypes(biome, CONIFEROUS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(biome.getHeightVariation() <= 0.3F && biome.getHeightVariation() >= 0.0F)
|
else if (biome.getHeightVariation() <= 0.3F && biome.getHeightVariation() >= 0.0F)
|
||||||
{
|
{
|
||||||
if(!biome.isHighHumidity() || biome.getBaseHeight() >= 0.0F)
|
if (!biome.isHighHumidity() || biome.getBaseHeight() >= 0.0F)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, PLAINS);
|
BiomeDictionary.addTypes(biome, PLAINS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (biome.getRainfall() > 0.85f)
|
if (biome.getRainfall() > 0.85f)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, WET);
|
BiomeDictionary.addTypes(biome, WET);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (biome.getRainfall() < 0.15f)
|
if (biome.getRainfall() < 0.15f)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, DRY);
|
BiomeDictionary.addTypes(biome, DRY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (biome.getTemperature() > 0.85f)
|
if (biome.getTemperature() > 0.85f)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, HOT);
|
BiomeDictionary.addTypes(biome, HOT);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (biome.getTemperature() < 0.15f)
|
if (biome.getTemperature() < 0.15f)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, COLD);
|
BiomeDictionary.addTypes(biome, COLD);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (biome.theBiomeDecorator.treesPerChunk > 0 && biome.theBiomeDecorator.treesPerChunk < 3)
|
if (biome.theBiomeDecorator.treesPerChunk > 0 && biome.theBiomeDecorator.treesPerChunk < 3)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, SPARSE);
|
BiomeDictionary.addTypes(biome, SPARSE);
|
||||||
}
|
}
|
||||||
else if (biome.theBiomeDecorator.treesPerChunk >= 10)
|
else if (biome.theBiomeDecorator.treesPerChunk >= 10)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, DENSE);
|
BiomeDictionary.addTypes(biome, DENSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (biome.isHighHumidity() && biome.getBaseHeight() < 0.0F && (biome.getHeightVariation() <= 0.3F && biome.getHeightVariation() >= 0.0F))
|
if (biome.isHighHumidity() && biome.getBaseHeight() < 0.0F && (biome.getHeightVariation() <= 0.3F && biome.getHeightVariation() >= 0.0F))
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, SWAMP);
|
BiomeDictionary.addTypes(biome, SWAMP);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (biome.getBaseHeight() <= -0.5F)
|
if (biome.getBaseHeight() <= -0.5F)
|
||||||
{
|
{
|
||||||
if (biome.getHeightVariation() == 0.0F)
|
if (biome.getHeightVariation() == 0.0F)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, RIVER);
|
BiomeDictionary.addTypes(biome, RIVER);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, OCEAN);
|
BiomeDictionary.addTypes(biome, OCEAN);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (biome.getHeightVariation() >= 0.4F && biome.getHeightVariation() < 1.5F)
|
if (biome.getHeightVariation() >= 0.4F && biome.getHeightVariation() < 1.5F)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, HILLS);
|
BiomeDictionary.addTypes(biome, HILLS);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (biome.getHeightVariation() >= 1.5F)
|
if (biome.getHeightVariation() >= 1.5F)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, MOUNTAIN);
|
BiomeDictionary.addTypes(biome, MOUNTAIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (biome.getEnableSnow())
|
if (biome.getEnableSnow())
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, SNOWY);
|
BiomeDictionary.addTypes(biome, SNOWY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (biome.topBlock != Blocks.SAND && biome.getTemperature() >= 1.0f && biome.getRainfall() < 0.2f)
|
if (biome.topBlock != Blocks.SAND && biome.getTemperature() >= 1.0f && biome.getRainfall() < 0.2f)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, SAVANNA);
|
BiomeDictionary.addTypes(biome, SAVANNA);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (biome.topBlock == Blocks.SAND)
|
if (biome.topBlock == Blocks.SAND)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, SANDY);
|
BiomeDictionary.addTypes(biome, SANDY);
|
||||||
}
|
}
|
||||||
else if (biome.topBlock == Blocks.MYCELIUM)
|
else if (biome.topBlock == Blocks.MYCELIUM)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, MUSHROOM);
|
BiomeDictionary.addTypes(biome, MUSHROOM);
|
||||||
}
|
}
|
||||||
if (biome.fillerBlock == Blocks.HARDENED_CLAY)
|
if (biome.fillerBlock == Blocks.HARDENED_CLAY)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerBiomeType(biome, MESA);
|
BiomeDictionary.addTypes(biome, MESA);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Internal implementation
|
//Internal implementation
|
||||||
private static BiomeInfo getBiomeInfo(Biome biome)
|
private static BiomeInfo getBiomeInfo(Biome biome)
|
||||||
{
|
{
|
||||||
return biomeInfoMap.get(Biome.REGISTRY.getNameForObject(biome));
|
BiomeInfo info = biomeInfoMap.get(biome.getRegistryName());
|
||||||
|
if (info == null)
|
||||||
|
{
|
||||||
|
info = new BiomeInfo();
|
||||||
|
biomeInfoMap.put(biome.getRegistryName(), info);
|
||||||
|
}
|
||||||
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void checkRegistration(Biome biome)
|
/**
|
||||||
|
* Ensure that at least one type has been added to the given biome.
|
||||||
|
*/
|
||||||
|
static void ensureHasTypes(Biome biome)
|
||||||
{
|
{
|
||||||
if(!isBiomeRegistered(biome))
|
if (!hasAnyType(biome))
|
||||||
{
|
{
|
||||||
|
FMLLog.warning("No types have been added to Biome %s, types will be assigned on a best-effort guess.", biome.getRegistryName());
|
||||||
makeBestGuess(biome);
|
makeBestGuess(biome);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean containsType(BiomeInfo info, Type type)
|
private static boolean containsType(Set<Type> types, Type type)
|
||||||
{
|
{
|
||||||
if (type.hasSubTags())
|
if (type.hasSubTypes())
|
||||||
{
|
{
|
||||||
for (Type remappedType : listSubTags(type))
|
return !Collections.disjoint(types, type.subTypes);
|
||||||
{
|
}
|
||||||
if (info.typeList.contains(remappedType)) return true;
|
else
|
||||||
}
|
{
|
||||||
|
return types.contains(type);
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return info.typeList.contains(type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Type[] listSubTags(Type... types)
|
private static List<Type> listSubTypes(Type... types)
|
||||||
{
|
{
|
||||||
List<Type> subTags = new ArrayList<Type>();
|
List<Type> subTags = new ArrayList<Type>();
|
||||||
|
|
||||||
for (Type type : types)
|
for (Type type : types)
|
||||||
{
|
{
|
||||||
if (type.hasSubTags()) subTags.addAll(type.subTags);
|
if (type.hasSubTypes())
|
||||||
else subTags.add(type);
|
{
|
||||||
|
subTags.addAll(type.subTypes);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
subTags.add(type);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return subTags.toArray(new Type[subTags.size()]);
|
return subTags;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void registerVanillaBiomes()
|
private static void registerVanillaBiomes()
|
||||||
{
|
{
|
||||||
registerBiomeType(Biomes.OCEAN, OCEAN );
|
addTypes(Biomes.OCEAN, OCEAN );
|
||||||
registerBiomeType(Biomes.PLAINS, PLAINS );
|
addTypes(Biomes.PLAINS, PLAINS );
|
||||||
registerBiomeType(Biomes.DESERT, HOT, DRY, SANDY );
|
addTypes(Biomes.DESERT, HOT, DRY, SANDY );
|
||||||
registerBiomeType(Biomes.EXTREME_HILLS, MOUNTAIN, HILLS );
|
addTypes(Biomes.EXTREME_HILLS, MOUNTAIN, HILLS );
|
||||||
registerBiomeType(Biomes.FOREST, FOREST );
|
addTypes(Biomes.FOREST, FOREST );
|
||||||
registerBiomeType(Biomes.TAIGA, COLD, CONIFEROUS, FOREST );
|
addTypes(Biomes.TAIGA, COLD, CONIFEROUS, FOREST );
|
||||||
registerBiomeType(Biomes.TAIGA_HILLS, COLD, CONIFEROUS, FOREST, HILLS );
|
addTypes(Biomes.TAIGA_HILLS, COLD, CONIFEROUS, FOREST, HILLS );
|
||||||
registerBiomeType(Biomes.SWAMPLAND, WET, SWAMP );
|
addTypes(Biomes.SWAMPLAND, WET, SWAMP );
|
||||||
registerBiomeType(Biomes.RIVER, RIVER );
|
addTypes(Biomes.RIVER, RIVER );
|
||||||
registerBiomeType(Biomes.FROZEN_OCEAN, COLD, OCEAN, SNOWY );
|
addTypes(Biomes.FROZEN_OCEAN, COLD, OCEAN, SNOWY );
|
||||||
registerBiomeType(Biomes.FROZEN_RIVER, COLD, RIVER, SNOWY );
|
addTypes(Biomes.FROZEN_RIVER, COLD, RIVER, SNOWY );
|
||||||
registerBiomeType(Biomes.ICE_PLAINS, COLD, SNOWY, WASTELAND );
|
addTypes(Biomes.ICE_PLAINS, COLD, SNOWY, WASTELAND );
|
||||||
registerBiomeType(Biomes.ICE_MOUNTAINS, COLD, SNOWY, MOUNTAIN );
|
addTypes(Biomes.ICE_MOUNTAINS, COLD, SNOWY, MOUNTAIN );
|
||||||
registerBiomeType(Biomes.BEACH, BEACH );
|
addTypes(Biomes.BEACH, BEACH );
|
||||||
registerBiomeType(Biomes.DESERT_HILLS, HOT, DRY, SANDY, HILLS );
|
addTypes(Biomes.DESERT_HILLS, HOT, DRY, SANDY, HILLS );
|
||||||
registerBiomeType(Biomes.JUNGLE, HOT, WET, DENSE, JUNGLE );
|
addTypes(Biomes.JUNGLE, HOT, WET, DENSE, JUNGLE );
|
||||||
registerBiomeType(Biomes.JUNGLE_HILLS, HOT, WET, DENSE, JUNGLE, HILLS);
|
addTypes(Biomes.JUNGLE_HILLS, HOT, WET, DENSE, JUNGLE, HILLS);
|
||||||
registerBiomeType(Biomes.FOREST_HILLS, FOREST, HILLS );
|
addTypes(Biomes.FOREST_HILLS, FOREST, HILLS );
|
||||||
registerBiomeType(Biomes.SKY, COLD, DRY, END );
|
addTypes(Biomes.SKY, COLD, DRY, END );
|
||||||
registerBiomeType(Biomes.HELL, HOT, DRY, NETHER );
|
addTypes(Biomes.HELL, HOT, DRY, NETHER );
|
||||||
registerBiomeType(Biomes.MUSHROOM_ISLAND, MUSHROOM );
|
addTypes(Biomes.MUSHROOM_ISLAND, MUSHROOM );
|
||||||
registerBiomeType(Biomes.EXTREME_HILLS_EDGE, MOUNTAIN );
|
addTypes(Biomes.EXTREME_HILLS_EDGE, MOUNTAIN );
|
||||||
registerBiomeType(Biomes.MUSHROOM_ISLAND_SHORE, MUSHROOM, BEACH );
|
addTypes(Biomes.MUSHROOM_ISLAND_SHORE, MUSHROOM, BEACH );
|
||||||
registerBiomeType(Biomes.JUNGLE_EDGE, HOT, WET, JUNGLE, FOREST );
|
addTypes(Biomes.JUNGLE_EDGE, HOT, WET, JUNGLE, FOREST );
|
||||||
registerBiomeType(Biomes.DEEP_OCEAN, OCEAN );
|
addTypes(Biomes.DEEP_OCEAN, OCEAN );
|
||||||
registerBiomeType(Biomes.STONE_BEACH, BEACH );
|
addTypes(Biomes.STONE_BEACH, BEACH );
|
||||||
registerBiomeType(Biomes.COLD_BEACH, COLD, BEACH, SNOWY );
|
addTypes(Biomes.COLD_BEACH, COLD, BEACH, SNOWY );
|
||||||
registerBiomeType(Biomes.BIRCH_FOREST, FOREST );
|
addTypes(Biomes.BIRCH_FOREST, FOREST );
|
||||||
registerBiomeType(Biomes.BIRCH_FOREST_HILLS, FOREST, HILLS );
|
addTypes(Biomes.BIRCH_FOREST_HILLS, FOREST, HILLS );
|
||||||
registerBiomeType(Biomes.ROOFED_FOREST, SPOOKY, DENSE, FOREST );
|
addTypes(Biomes.ROOFED_FOREST, SPOOKY, DENSE, FOREST );
|
||||||
registerBiomeType(Biomes.COLD_TAIGA, COLD, CONIFEROUS, FOREST, SNOWY );
|
addTypes(Biomes.COLD_TAIGA, COLD, CONIFEROUS, FOREST, SNOWY );
|
||||||
registerBiomeType(Biomes.COLD_TAIGA_HILLS, COLD, CONIFEROUS, FOREST, SNOWY, HILLS);
|
addTypes(Biomes.COLD_TAIGA_HILLS, COLD, CONIFEROUS, FOREST, SNOWY, HILLS);
|
||||||
registerBiomeType(Biomes.REDWOOD_TAIGA, COLD, CONIFEROUS, FOREST );
|
addTypes(Biomes.REDWOOD_TAIGA, COLD, CONIFEROUS, FOREST );
|
||||||
registerBiomeType(Biomes.REDWOOD_TAIGA_HILLS, COLD, CONIFEROUS, FOREST, HILLS );
|
addTypes(Biomes.REDWOOD_TAIGA_HILLS, COLD, CONIFEROUS, FOREST, HILLS );
|
||||||
registerBiomeType(Biomes.EXTREME_HILLS_WITH_TREES, MOUNTAIN, FOREST, SPARSE );
|
addTypes(Biomes.EXTREME_HILLS_WITH_TREES, MOUNTAIN, FOREST, SPARSE );
|
||||||
registerBiomeType(Biomes.SAVANNA, HOT, SAVANNA, PLAINS, SPARSE );
|
addTypes(Biomes.SAVANNA, HOT, SAVANNA, PLAINS, SPARSE );
|
||||||
registerBiomeType(Biomes.SAVANNA_PLATEAU, HOT, SAVANNA, PLAINS, SPARSE );
|
addTypes(Biomes.SAVANNA_PLATEAU, HOT, SAVANNA, PLAINS, SPARSE );
|
||||||
registerBiomeType(Biomes.MESA, MESA, SANDY );
|
addTypes(Biomes.MESA, MESA, SANDY );
|
||||||
registerBiomeType(Biomes.MESA_ROCK, MESA, SPARSE, SANDY );
|
addTypes(Biomes.MESA_ROCK, MESA, SPARSE, SANDY );
|
||||||
registerBiomeType(Biomes.MESA_CLEAR_ROCK, MESA, SANDY );
|
addTypes(Biomes.MESA_CLEAR_ROCK, MESA, SANDY );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
package net.minecraftforge.common;
|
package net.minecraftforge.common;
|
||||||
|
|
||||||
|
import net.minecraft.world.biome.Biome;
|
||||||
import static net.minecraftforge.common.config.Configuration.CATEGORY_CLIENT;
|
import static net.minecraftforge.common.config.Configuration.CATEGORY_CLIENT;
|
||||||
import static net.minecraftforge.common.config.Configuration.CATEGORY_GENERAL;
|
import static net.minecraftforge.common.config.Configuration.CATEGORY_GENERAL;
|
||||||
|
|
||||||
|
@ -38,11 +39,9 @@ import java.util.Date;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.apache.logging.log4j.Level;
|
import org.apache.logging.log4j.Level;
|
||||||
|
|
||||||
import net.minecraft.crash.CrashReport;
|
|
||||||
import net.minecraft.crash.ICrashReportDetail;
|
import net.minecraft.crash.ICrashReportDetail;
|
||||||
import net.minecraft.nbt.NBTBase;
|
import net.minecraft.nbt.NBTBase;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
@ -57,8 +56,10 @@ import net.minecraftforge.common.config.Property;
|
||||||
import net.minecraftforge.common.model.animation.CapabilityAnimation;
|
import net.minecraftforge.common.model.animation.CapabilityAnimation;
|
||||||
import net.minecraftforge.common.network.ForgeNetworkHandler;
|
import net.minecraftforge.common.network.ForgeNetworkHandler;
|
||||||
import net.minecraftforge.energy.CapabilityEnergy;
|
import net.minecraftforge.energy.CapabilityEnergy;
|
||||||
|
import net.minecraftforge.event.terraingen.DeferredBiomeDecorator;
|
||||||
import net.minecraftforge.fluids.FluidRegistry;
|
import net.minecraftforge.fluids.FluidRegistry;
|
||||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||||
|
import net.minecraftforge.fml.common.registry.ForgeRegistries;
|
||||||
import net.minecraftforge.items.CapabilityItemHandler;
|
import net.minecraftforge.items.CapabilityItemHandler;
|
||||||
import net.minecraftforge.fluids.UniversalBucket;
|
import net.minecraftforge.fluids.UniversalBucket;
|
||||||
import net.minecraftforge.fml.common.registry.GameRegistry;
|
import net.minecraftforge.fml.common.registry.GameRegistry;
|
||||||
|
@ -82,7 +83,6 @@ import net.minecraftforge.fml.common.LoadController;
|
||||||
import net.minecraftforge.fml.common.Loader;
|
import net.minecraftforge.fml.common.Loader;
|
||||||
import net.minecraftforge.fml.common.ModMetadata;
|
import net.minecraftforge.fml.common.ModMetadata;
|
||||||
import net.minecraftforge.fml.common.WorldAccessContainer;
|
import net.minecraftforge.fml.common.WorldAccessContainer;
|
||||||
import net.minecraftforge.fml.common.discovery.ASMDataTable;
|
|
||||||
import net.minecraftforge.fml.common.discovery.ASMDataTable.ASMData;
|
import net.minecraftforge.fml.common.discovery.ASMDataTable.ASMData;
|
||||||
import net.minecraftforge.fml.common.event.FMLConstructionEvent;
|
import net.minecraftforge.fml.common.event.FMLConstructionEvent;
|
||||||
import net.minecraftforge.fml.common.event.FMLLoadCompleteEvent;
|
import net.minecraftforge.fml.common.event.FMLLoadCompleteEvent;
|
||||||
|
@ -428,10 +428,24 @@ public class ForgeModContainer extends DummyModContainer implements WorldAccessC
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void postInit(FMLPostInitializationEvent evt)
|
public void postInit(FMLPostInitializationEvent evt)
|
||||||
{
|
{
|
||||||
BiomeDictionary.registerAllBiomesAndGenerateEvents();
|
registerAllBiomesAndGenerateEvents();
|
||||||
ForgeChunkManager.loadConfiguration();
|
ForgeChunkManager.loadConfiguration();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void registerAllBiomesAndGenerateEvents()
|
||||||
|
{
|
||||||
|
for (Biome biome : ForgeRegistries.BIOMES.getValues())
|
||||||
|
{
|
||||||
|
if (biome.theBiomeDecorator instanceof DeferredBiomeDecorator)
|
||||||
|
{
|
||||||
|
DeferredBiomeDecorator decorator = (DeferredBiomeDecorator)biome.theBiomeDecorator;
|
||||||
|
decorator.fireCreateEventAndReplace(biome);
|
||||||
|
}
|
||||||
|
|
||||||
|
BiomeDictionary.ensureHasTypes(biome);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onAvailable(FMLLoadCompleteEvent evt)
|
public void onAvailable(FMLLoadCompleteEvent evt)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue