From be402fba7ff468d90cf839f0c5e4b73fe41eea7b Mon Sep 17 00:00:00 2001 From: Adubbz Date: Tue, 7 Jul 2020 22:55:19 +1000 Subject: [PATCH] Fixed biome provider preservation across world loads --- .../common/world/BOPBiomeProvider.java | 61 ++++++++++--------- .../common/world/BOPNetherBiomeProvider.java | 42 ++++++++----- .../java/biomesoplenty/init/ModBiomes.java | 7 +++ 3 files changed, 66 insertions(+), 44 deletions(-) diff --git a/src/main/java/biomesoplenty/common/world/BOPBiomeProvider.java b/src/main/java/biomesoplenty/common/world/BOPBiomeProvider.java index 3b7160761..dfbc1e888 100644 --- a/src/main/java/biomesoplenty/common/world/BOPBiomeProvider.java +++ b/src/main/java/biomesoplenty/common/world/BOPBiomeProvider.java @@ -8,51 +8,52 @@ package biomesoplenty.common.world; import biomesoplenty.api.enums.BOPClimates; -import com.google.common.collect.Sets; -import net.minecraft.block.BlockState; +import com.google.common.collect.ImmutableList; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.provider.OverworldBiomeProvider; -import net.minecraft.world.gen.feature.structure.Structure; +import net.minecraft.world.biome.Biomes; +import net.minecraft.world.biome.provider.BiomeProvider; import net.minecraft.world.gen.layer.Layer; -import java.util.Set; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; -public class BOPBiomeProvider extends OverworldBiomeProvider +public class BOPBiomeProvider extends BiomeProvider { + public static final Codec CODEC = RecordCodecBuilder.create((builder) -> + { + return builder.group(Codec.LONG.fieldOf("seed").stable().forGetter((biomeProvider) -> biomeProvider.seed)).apply(builder, builder.stable(BOPBiomeProvider::new)); + }); + + private static final List VANILLA_POSSIBLE_BIOMES = ImmutableList.of(Biomes.OCEAN, Biomes.PLAINS, Biomes.DESERT, Biomes.MOUNTAINS, Biomes.FOREST, Biomes.TAIGA, Biomes.SWAMP, Biomes.RIVER, Biomes.FROZEN_OCEAN, Biomes.FROZEN_RIVER, Biomes.SNOWY_TUNDRA, Biomes.SNOWY_MOUNTAINS, Biomes.MUSHROOM_FIELDS, Biomes.MUSHROOM_FIELD_SHORE, Biomes.BEACH, Biomes.DESERT_HILLS, Biomes.WOODED_HILLS, Biomes.TAIGA_HILLS, Biomes.MOUNTAIN_EDGE, Biomes.JUNGLE, Biomes.JUNGLE_HILLS, Biomes.JUNGLE_EDGE, Biomes.DEEP_OCEAN, Biomes.STONE_SHORE, Biomes.SNOWY_BEACH, Biomes.BIRCH_FOREST, Biomes.BIRCH_FOREST_HILLS, Biomes.DARK_FOREST, Biomes.SNOWY_TAIGA, Biomes.SNOWY_TAIGA_HILLS, Biomes.GIANT_TREE_TAIGA, Biomes.GIANT_TREE_TAIGA_HILLS, Biomes.WOODED_MOUNTAINS, Biomes.SAVANNA, Biomes.SAVANNA_PLATEAU, Biomes.BADLANDS, Biomes.WOODED_BADLANDS_PLATEAU, Biomes.BADLANDS_PLATEAU, Biomes.WARM_OCEAN, Biomes.LUKEWARM_OCEAN, Biomes.COLD_OCEAN, Biomes.DEEP_WARM_OCEAN, Biomes.DEEP_LUKEWARM_OCEAN, Biomes.DEEP_COLD_OCEAN, Biomes.DEEP_FROZEN_OCEAN, Biomes.SUNFLOWER_PLAINS, Biomes.DESERT_LAKES, Biomes.GRAVELLY_MOUNTAINS, Biomes.FLOWER_FOREST, Biomes.TAIGA_MOUNTAINS, Biomes.SWAMP_HILLS, Biomes.ICE_SPIKES, Biomes.MODIFIED_JUNGLE, Biomes.MODIFIED_JUNGLE_EDGE, Biomes.TALL_BIRCH_FOREST, Biomes.TALL_BIRCH_HILLS, Biomes.DARK_FOREST_HILLS, Biomes.SNOWY_TAIGA_MOUNTAINS, Biomes.GIANT_SPRUCE_TAIGA, Biomes.GIANT_SPRUCE_TAIGA_HILLS, Biomes.MODIFIED_GRAVELLY_MOUNTAINS, Biomes.SHATTERED_SAVANNA, Biomes.SHATTERED_SAVANNA_PLATEAU, Biomes.ERODED_BADLANDS, Biomes.MODIFIED_WOODED_BADLANDS_PLATEAU, Biomes.MODIFIED_BADLANDS_PLATEAU); + + private final long seed; private final Layer noiseBiomeLayer; - protected final Set possibleBiomes; public BOPBiomeProvider(long seed) { - super(seed, false, false); - this.possibleBiomes = Sets.newHashSet(super.possibleBiomes); - this.possibleBiomes.addAll(BOPClimates.getOverworldBiomes()); + super(Stream.concat(VANILLA_POSSIBLE_BIOMES.stream(), BOPClimates.getOverworldBiomes().stream()).collect(Collectors.toList())); + this.seed = seed; this.noiseBiomeLayer = BOPLayerUtil.createGenLayers(seed, new BOPOverworldGenSettings()); } + @Override + protected Codec codec() + { + return CODEC; + } + + @Override + public BiomeProvider withSeed(long seed) + { + return new BOPBiomeProvider(seed); + } + @Override public Biome getNoiseBiome(int x, int y, int z) { return this.noiseBiomeLayer.get(x, z); } - - @Override - public boolean canGenerateStructure(Structure structure) - { - return this.supportedStructures.computeIfAbsent(structure, (p_226839_1_) -> this.possibleBiomes.stream().anyMatch((biome) -> biome.isValidStart(p_226839_1_))); - } - - @Override - public Set getSurfaceBlocks() - { - if (this.surfaceBlocks.isEmpty()) - { - for(Biome biome : this.possibleBiomes) - { - this.surfaceBlocks.add(biome.getSurfaceBuilderConfig().getTopMaterial()); - } - } - - return this.surfaceBlocks; - } } \ No newline at end of file diff --git a/src/main/java/biomesoplenty/common/world/BOPNetherBiomeProvider.java b/src/main/java/biomesoplenty/common/world/BOPNetherBiomeProvider.java index fe5c8bc89..1e4265de7 100644 --- a/src/main/java/biomesoplenty/common/world/BOPNetherBiomeProvider.java +++ b/src/main/java/biomesoplenty/common/world/BOPNetherBiomeProvider.java @@ -7,36 +7,50 @@ ******************************************************************************/ package biomesoplenty.common.world; -import com.google.common.collect.Lists; +import biomesoplenty.api.enums.BOPClimates; +import com.google.common.collect.ImmutableList; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.Biomes; import net.minecraft.world.biome.provider.BiomeProvider; -import net.minecraft.world.biome.provider.NetherBiomeProvider; import net.minecraft.world.gen.layer.Layer; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import java.util.Optional; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; -public class BOPNetherBiomeProvider extends NetherBiomeProvider +public class BOPNetherBiomeProvider extends BiomeProvider { + public static final Codec CODEC = RecordCodecBuilder.create((builder) -> builder.group(Codec.LONG.fieldOf("seed").stable().forGetter((biomeProvider) -> biomeProvider.seed)).apply(builder, builder.stable(BOPNetherBiomeProvider::new))); + + private static final List VANILLA_POSSIBLE_BIOMES = ImmutableList.of(Biomes.NETHER_WASTES, Biomes.SOUL_SAND_VALLEY, Biomes.CRIMSON_FOREST, Biomes.WARPED_FOREST, Biomes.BASALT_DELTAS); + + private final long seed; private final Layer noiseBiomeLayer; public BOPNetherBiomeProvider(long seed) { - super(seed, Lists.newArrayList(), Optional.empty()); + super(Stream.concat(VANILLA_POSSIBLE_BIOMES.stream(), BOPClimates.NETHER.getLandBiomes().stream().map((entry) -> entry.biome)).collect(Collectors.toList())); + this.seed = seed; this.noiseBiomeLayer = BOPNetherLayerUtil.createGenLayers(seed); } + @Override + protected Codec codec() + { + return CODEC; + } + + @Override + public BiomeProvider withSeed(long seed) + { + return new BOPNetherBiomeProvider(seed); + } + @Override public Biome getNoiseBiome(int x, int y, int z) { return this.noiseBiomeLayer.get(x, z); } - - @Override - @OnlyIn(Dist.CLIENT) - public BiomeProvider withSeed(long seed) - { - return new BOPNetherBiomeProvider(seed); - } } diff --git a/src/main/java/biomesoplenty/init/ModBiomes.java b/src/main/java/biomesoplenty/init/ModBiomes.java index 8766cb057..31a0efdc5 100644 --- a/src/main/java/biomesoplenty/init/ModBiomes.java +++ b/src/main/java/biomesoplenty/init/ModBiomes.java @@ -13,11 +13,14 @@ import biomesoplenty.common.biome.BiomeRegistry; import biomesoplenty.common.biome.nether.*; import biomesoplenty.common.biome.overworld.*; import biomesoplenty.common.world.BOPBiomeGeneratorTypeScreen; +import biomesoplenty.common.world.BOPBiomeProvider; +import biomesoplenty.common.world.BOPNetherBiomeProvider; import com.google.common.collect.HashMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import net.minecraft.client.gui.screen.BiomeGeneratorTypeScreens; import net.minecraft.entity.villager.IVillagerType; +import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biomes; import net.minecraftforge.common.BiomeDictionary; @@ -43,6 +46,10 @@ public class ModBiomes { biomeGeneratorTypeScreenBOP = new BOPBiomeGeneratorTypeScreen(); BiomeGeneratorTypeScreens.PRESETS.add(biomeGeneratorTypeScreenBOP); + + // Register biome providers + Registry.register(Registry.BIOME_SOURCE, "biomesoplenty_overworld", BOPBiomeProvider.CODEC); + Registry.register(Registry.BIOME_SOURCE, "biomesoplenty_nether", BOPNetherBiomeProvider.CODEC); } @SubscribeEvent