Blocks O' Plenty

This commit is contained in:
Adubbz 2021-12-01 21:04:28 +11:00
parent b03c90452f
commit cf9c865a0f

View file

@ -1,208 +0,0 @@
/*******************************************************************************
* Copyright 2021, the Glitchfiend Team.
* All rights reserved.
******************************************************************************/
package biomesoplenty.api.enums;
import biomesoplenty.api.biome.BOPBiomes;
import biomesoplenty.common.util.biome.BiomeUtil;
import biomesoplenty.init.ModBiomes;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.Biomes;
import net.minecraft.world.level.newbiome.context.Context;
import net.minecraftforge.common.BiomeManager;
import net.minecraftforge.common.BiomeManager.BiomeType;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Set;
import java.util.stream.Collectors;
public enum BOPClimates
{
ICE_CAP (BiomeType.ICY),
TUNDRA (BiomeType.ICY),
WET_BOREAL (BiomeType.COOL),
DRY_BOREAL (BiomeType.COOL),
WET_TEMPERATE (BiomeType.COOL),
DRY_TEMPERATE (BiomeType.WARM),
COOL_TEMPERATE (BiomeType.COOL),
WARM_TEMPERATE (BiomeType.WARM),
SUBTROPICAL (BiomeType.WARM),
TROPICAL (BiomeType.DESERT),
MEDITERRANEAN (BiomeType.WARM),
SAVANNA (BiomeType.DESERT),
HOT_DESERT (BiomeType.DESERT),
WASTELAND (null),
NETHER (null);
public final BiomeType biomeType;
private int totalBiomesWeight;
private int totalIslandBiomesWeight;
private ArrayList<WeightedBiomeEntry> landBiomes = Lists.newArrayList();
private ArrayList<WeightedBiomeEntry> islandBiomes = Lists.newArrayList();
BOPClimates(BiomeType biomeType)
{
this.biomeType = biomeType;
}
public BOPClimates addBiome(int weight, ResourceKey<Biome> biome)
{
return this.addBiome(new WeightedBiomeEntry(weight, biome));
}
public BOPClimates addBiome(WeightedBiomeEntry biomeEntry)
{
this.totalBiomesWeight += biomeEntry.weight;
this.landBiomes.add(biomeEntry);
return this;
}
public BOPClimates addIslandBiome(int weight, ResourceKey<Biome> biome)
{
return this.addIslandBiome(new WeightedBiomeEntry(weight, biome));
}
public BOPClimates addIslandBiome(WeightedBiomeEntry biomeEntry)
{
this.totalIslandBiomesWeight += biomeEntry.weight;
this.islandBiomes.add(biomeEntry);
return this;
}
public ResourceKey<Biome> getRandomBiome(Context context, ResourceKey<Biome> fallback)
{
if (this.totalBiomesWeight == 0)
return fallback;
int weight = context.nextRandom(this.totalBiomesWeight);
Iterator<WeightedBiomeEntry> iterator = this.landBiomes.iterator();
WeightedBiomeEntry item;
do
{
item = iterator.next();
weight -= item.weight;
}
while (weight >= 0);
return item.biome;
}
public ResourceKey<Biome> getRandomIslandBiome(Context context, ResourceKey<Biome> fallback)
{
if (this.totalIslandBiomesWeight == 0)
return fallback;
int weight = context.nextRandom(this.totalIslandBiomesWeight);
Iterator<WeightedBiomeEntry> iterator = this.islandBiomes.iterator();
WeightedBiomeEntry item;
do
{
item = iterator.next();
weight -= item.weight;
}
while (weight >= 0);
return item.biome;
}
public ResourceKey<Biome> getRandomOceanBiome(Context context, boolean deep)
{
return (deep ? Biomes.DEEP_OCEAN : Biomes.OCEAN);
}
public ImmutableList<WeightedBiomeEntry> getLandBiomes()
{
return this.landBiomes.isEmpty() ? ImmutableList.of(this.getDefaultWeightedBiomeEntry()) : ImmutableList.copyOf(this.landBiomes);
}
public ImmutableList<WeightedBiomeEntry> getIslandBiomes()
{
return this.islandBiomes.isEmpty() ? ImmutableList.of(this.getDefaultWeightedBiomeEntry()) : ImmutableList.copyOf(this.islandBiomes);
}
private WeightedBiomeEntry getDefaultWeightedBiomeEntry()
{
return new WeightedBiomeEntry(100, Biomes.OCEAN);
}
private static BOPClimates[] values = BOPClimates.values();
public static BOPClimates lookup(int i) {return values[i];}
// map temperature and rainfall to climates
// temperature values from 0 (cold) to 8 (hot) and rainfall values from 0 (wet) to 11 (dry), index is (temperatureValue * 12) + rainfallValue
// we will contrive to make any combination equally likely, so the overall rarity of each climate is in proportion to the number of times it appears in the array
private static final BOPClimates[] climateMapping = new BOPClimates[]
{
TUNDRA, TUNDRA, ICE_CAP, ICE_CAP, ICE_CAP, ICE_CAP, ICE_CAP, ICE_CAP, ICE_CAP, ICE_CAP, TUNDRA, TUNDRA,
WET_BOREAL, WET_BOREAL, TUNDRA, TUNDRA, TUNDRA, TUNDRA, TUNDRA, TUNDRA, TUNDRA, TUNDRA, DRY_BOREAL, DRY_BOREAL,
WET_BOREAL, WET_BOREAL, WET_BOREAL, WET_BOREAL, WET_BOREAL, WET_BOREAL, DRY_BOREAL, DRY_BOREAL, DRY_BOREAL, DRY_BOREAL, DRY_BOREAL, DRY_BOREAL,
WET_TEMPERATE, WET_TEMPERATE, WET_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, DRY_TEMPERATE, DRY_TEMPERATE, DRY_TEMPERATE,
WET_TEMPERATE, WET_TEMPERATE, WET_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, COOL_TEMPERATE, DRY_TEMPERATE, DRY_TEMPERATE, DRY_TEMPERATE,
SUBTROPICAL, SUBTROPICAL, WET_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, DRY_TEMPERATE, SAVANNA, SAVANNA,
SUBTROPICAL, SUBTROPICAL, SUBTROPICAL, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, WARM_TEMPERATE, SAVANNA, SAVANNA, SAVANNA,
TROPICAL, TROPICAL, SUBTROPICAL, SUBTROPICAL, MEDITERRANEAN, MEDITERRANEAN, MEDITERRANEAN, MEDITERRANEAN, SAVANNA, SAVANNA, HOT_DESERT, HOT_DESERT,
TROPICAL, TROPICAL, SUBTROPICAL, SUBTROPICAL, MEDITERRANEAN, MEDITERRANEAN, MEDITERRANEAN, MEDITERRANEAN, SAVANNA, SAVANNA, HOT_DESERT, HOT_DESERT
};
public static int[] getClimateMappingInts()
{
// 9 temperature values, 12 rainfall values, 12 * 9 = 108
int[] out = new int[108];
for (int i = 0; i < 108; i++)
{
out[i] = climateMapping[i].ordinal();
}
return out;
}
public static ImmutableSet<ResourceKey<Biome>> getOverworldBiomes()
{
Set<ResourceKey<Biome>> set = Sets.newHashSet();
for (BOPClimates climate : BOPClimates.values())
{
if (climate == BOPClimates.NETHER)
{
continue;
}
set.addAll(climate.getLandBiomes().stream().map(weightedBiomeEntry -> weightedBiomeEntry.biome).collect(Collectors.toSet()));
set.addAll(climate.getIslandBiomes().stream().map(weightedBiomeEntry -> weightedBiomeEntry.biome).collect(Collectors.toSet()));
}
ModBiomes.subBiomes.values().forEach(weightedSubBiome -> set.add(weightedSubBiome.biome));
return ImmutableSet.copyOf(set);
}
public static class WeightedBiomeEntry
{
public final int weight;
public final ResourceKey<Biome> biome;
public WeightedBiomeEntry(int weight, ResourceKey<Biome> biome)
{
this.weight = weight;
this.biome = biome;
}
}
// for debugging purposes
public static void printWeights()
{
for (BOPClimates climate : BOPClimates.values())
{
for (WeightedBiomeEntry entry : climate.landBiomes)
{
System.out.println(climate.name()+" "+entry.biome.location()+" "+entry.weight);
}
}
}
}