Re-added support for biomes from other mods. Closes #1670

This commit is contained in:
Adubbz 2020-11-09 11:48:18 +11:00
parent ae366e8877
commit 7a9533387b
3 changed files with 95 additions and 14 deletions

View file

@ -18,6 +18,8 @@ import net.minecraft.util.RegistryKey;
import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.Biomes; import net.minecraft.world.biome.Biomes;
import net.minecraft.world.gen.INoiseRandom; import net.minecraft.world.gen.INoiseRandom;
import net.minecraftforge.common.BiomeManager;
import net.minecraftforge.common.BiomeManager.BiomeType;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
@ -26,27 +28,34 @@ import java.util.stream.Collectors;
public enum BOPClimates public enum BOPClimates
{ {
ICE_CAP, ICE_CAP (BiomeType.ICY),
TUNDRA, TUNDRA (BiomeType.ICY),
WET_BOREAL, WET_BOREAL (BiomeType.COOL),
DRY_BOREAL, DRY_BOREAL (BiomeType.COOL),
WET_TEMPERATE, WET_TEMPERATE (BiomeType.COOL),
DRY_TEMPERATE, DRY_TEMPERATE (BiomeType.WARM),
COOL_TEMPERATE, COOL_TEMPERATE (BiomeType.COOL),
WARM_TEMPERATE, WARM_TEMPERATE (BiomeType.WARM),
SUBTROPICAL, SUBTROPICAL (BiomeType.WARM),
TROPICAL, TROPICAL (BiomeType.DESERT),
MEDITERRANEAN, MEDITERRANEAN (BiomeType.WARM),
SAVANNA, SAVANNA (BiomeType.DESERT),
HOT_DESERT, HOT_DESERT (BiomeType.DESERT),
NETHER; WASTELAND (null),
NETHER (null);
public final BiomeType biomeType;
private int totalBiomesWeight; private int totalBiomesWeight;
private int totalIslandBiomesWeight; private int totalIslandBiomesWeight;
private ArrayList<WeightedBiomeEntry> landBiomes = Lists.newArrayList(); private ArrayList<WeightedBiomeEntry> landBiomes = Lists.newArrayList();
private ArrayList<WeightedBiomeEntry> islandBiomes = Lists.newArrayList(); private ArrayList<WeightedBiomeEntry> islandBiomes = Lists.newArrayList();
BOPClimates(BiomeType biomeType)
{
this.biomeType = biomeType;
}
public BOPClimates addBiome(int weight, RegistryKey<Biome> biome) public BOPClimates addBiome(int weight, RegistryKey<Biome> biome)
{ {
return this.addBiome(new WeightedBiomeEntry(weight, biome)); return this.addBiome(new WeightedBiomeEntry(weight, biome));

View file

@ -61,6 +61,7 @@ public class BiomesOPlenty
private void loadComplete(final FMLLoadCompleteEvent event) // PostRegistrationEven private void loadComplete(final FMLLoadCompleteEvent event) // PostRegistrationEven
{ {
proxy.init(); proxy.init();
ModCompatibility.setup();
} }
private void serverStarting(final FMLServerAboutToStartEvent event) private void serverStarting(final FMLServerAboutToStartEvent event)

View file

@ -0,0 +1,71 @@
/*******************************************************************************
* Copyright 2014-2020, the Biomes O' Plenty Team
*
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
*
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
******************************************************************************/
package biomesoplenty.init;
import biomesoplenty.api.enums.BOPClimates;
import biomesoplenty.core.BiomesOPlenty;
import com.google.common.collect.Lists;
import net.minecraft.util.RegistryKey;
import net.minecraft.world.biome.Biome;
import net.minecraftforge.common.BiomeManager;
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
import java.util.List;
import java.util.stream.Collectors;
public class ModCompatibility
{
public static void setup()
{
copyModBiomeWeights();
}
private static void copyModBiomeWeights()
{
for (BiomeManager.BiomeType type : BiomeManager.BiomeType.values())
{
// Removes vanilla entries by checking if the biome namespace is not "minecraft"
// If a mod makes their biome with minecraft namespace, they need a bug report as that's a big no-no.
List<BiomeManager.BiomeEntry> moddedBiomesInType = BiomeManager.getBiomes(type).stream()
.filter(biomeEntry -> !biomeEntry.getKey().getRegistryName().getNamespace().equals("minecraft"))
.collect(Collectors.toList());
// calls remapBiomeToBoP on each modded biome and its weight.
moddedBiomesInType.stream().forEach(biomeEntry -> remapBiomeToBoP(biomeEntry.getKey(), type, biomeEntry.weight));
}
}
// TODO: Make this more accurate, possibly analyze heights, temps, rainfall and/or biome dictionary tags
private static void remapBiomeToBoP(RegistryKey<Biome> biome, BiomeManager.BiomeType type, int weight)
{
/* If any of our climates already have the biome (from a mod using our api), then skip this biome */
for (BOPClimates climate : BOPClimates.values())
{
List<BOPClimates.WeightedBiomeEntry> entries = Lists.newArrayList();
entries.addAll(climate.getLandBiomes());
entries.addAll(climate.getIslandBiomes());
for (BOPClimates.WeightedBiomeEntry entry : entries)
{
if (entry.biome == biome)
{
return;
}
}
}
for (BOPClimates climate : BOPClimates.values())
{
if (climate.biomeType == type)
{
climate.addBiome(weight, biome);
}
}
}
}