diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java index 79a17c18a..45713ae21 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java @@ -23,8 +23,7 @@ import net.minecraft.util.registry.RegistryEntry; import net.minecraft.world.biome.source.BiomeSource; import net.minecraft.world.biome.source.util.MultiNoiseUtil.MultiNoiseSampler; -import java.util.Objects; -import java.util.stream.Collectors; +import java.util.stream.StreamSupport; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; @@ -33,17 +32,16 @@ import com.dfsek.terra.fabric.util.ProtoPlatformBiome; public class TerraBiomeSource extends BiomeSource { - private final Registry biomeRegistry; private final long seed; private ConfigPack pack; public TerraBiomeSource(Registry biomes, long seed, ConfigPack pack) { - super(biomes.streamEntries() - .filter(biome -> Objects.requireNonNull(biomes.getId(biome.value())) - .getNamespace() - .equals("terra")) // Filter out non-Terra biomes. - .collect(Collectors.toList())); + super(StreamSupport + .stream(pack.getBiomeProvider() + .getBiomes() + .spliterator(), false) + .map(b -> ((ProtoPlatformBiome) b.getPlatformBiome()).get(biomes))); this.biomeRegistry = biomes; this.seed = seed; this.pack = pack; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java index d14440f4e..b0cd6335c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java @@ -20,19 +20,25 @@ package com.dfsek.terra.fabric.util; import net.minecraft.block.entity.LootableContainerBlockEntity; import net.minecraft.block.entity.MobSpawnerBlockEntity; import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.tag.TagKey; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryEntry; +import net.minecraft.util.registry.RegistryEntryList.Named; import net.minecraft.world.WorldAccess; import net.minecraft.world.biome.Biome.Builder; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.GenerationSettings; +import java.util.HashMap; +import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.stream.Stream; import com.dfsek.terra.api.block.entity.BlockEntity; import com.dfsek.terra.api.block.entity.Container; @@ -51,6 +57,10 @@ public final class FabricUtil { .toLowerCase() + "/" + biomeID.getNamespace().toLowerCase(Locale.ROOT) + "/" + biomeID.getID().toLowerCase(Locale.ROOT); } + private static final Map, RegistryEntry> + TERRA_BIOME_MAP = new HashMap<>(); + private static final Map> BIOME_MAP = new HashMap<>(); + /** * Clones a Vanilla biome and injects Terra data to create a Terra-vanilla biome delegate. * @@ -59,8 +69,8 @@ public final class FabricUtil { */ public static void registerBiome(Biome biome, ConfigPack pack, DynamicRegistryManager registryManager, com.dfsek.terra.api.registry.key.RegistryKey id) { - Registry biomeRegistry = registryManager.get(Registry.BIOME_KEY); - RegistryEntry vanilla = ((ProtoPlatformBiome) biome.getPlatformBiome()).get(biomeRegistry); + Registry registry = registryManager.get(Registry.BIOME_KEY); + RegistryEntry vanilla = ((ProtoPlatformBiome) biome.getPlatformBiome()).get(registry); if(pack.getContext().get(PreLoadCompatibilityOptions.class).useVanillaBiomes()) { @@ -70,15 +80,48 @@ public final class FabricUtil { Identifier identifier = new Identifier("terra", FabricUtil.createBiomeID(pack, id)); - if(biomeRegistry.containsId(identifier)) { - ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(FabricUtil.getEntry(biomeRegistry, identifier).orElseThrow()); + if(registry.containsId(identifier)) { + ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(FabricUtil.getEntry(registry, identifier).orElseThrow()); } else { - Registry.register(biomeRegistry, identifier, minecraftBiome); - ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(FabricUtil.getEntry(biomeRegistry, identifier).orElseThrow()); + Registry.register(registry, identifier, minecraftBiome); + ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(FabricUtil.getEntry(registry, identifier).orElseThrow()); } + + RegistryEntry entry = getEntry(registry, identifier).orElseThrow(); + TERRA_BIOME_MAP.put(vanilla, entry); + BIOME_MAP.put(biome, entry); } } + public static RegistryEntry getMinecraftBiome(Biome biome) { + return BIOME_MAP.get(biome); + } + + private static Stream> getMatchingBiome(Named named) { + return TERRA_BIOME_MAP.keySet() + .stream() + .filter(named::contains) + .map(TERRA_BIOME_MAP::get); + } + + public static void registerTags(Registry registry) { + Map, List>> collect = registry + .streamTagsAndEntries() + .peek(System.out::println) + .collect(HashMap::new, + (map, pair) -> + map.put(pair.getFirst(), + Stream.concat(pair.getSecond().stream(), getMatchingBiome(pair.getSecond())).toList()), + HashMap::putAll); + registry.clearTags(); + registry.populateTags(collect); + + System.out.println(registry.streamEntries() + .map(e -> e.registryKey().getValue() + ": " + + e.streamTags().reduce("", (s, t) -> s + ", " + t, String::concat)) + .reduce("", (s, s2) -> s + "\n" + s2)); + } + public static net.minecraft.world.biome.Biome createBiome(Biome biome, net.minecraft.world.biome.Biome vanilla) { GenerationSettings.Builder generationSettings = new GenerationSettings.Builder();