From cc33a9138bb10be961d9b79f717327b90a4e2995 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 12 Nov 2021 08:50:41 +0300 Subject: [PATCH] Biome modification API --- gradle.properties | 2 +- src/main/java/ru/bclib/api/BiomeAPI.java | 76 +++++++++++++++++++ .../ru/bclib/gui/gridlayout/GridLayout.java | 2 +- .../bclib/mixin/common/ServerLevelMixin.java | 1 + .../generator/BCLibNetherBiomeSource.java | 1 + 5 files changed, 80 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index a20ca271..e3998406 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ loader_version= 0.12.4 fabric_version = 0.41.3+1.17 # Mod Properties -mod_version = 0.5.0 +mod_version = 0.5.1 maven_group = ru.bclib archives_base_name = bclib diff --git a/src/main/java/ru/bclib/api/BiomeAPI.java b/src/main/java/ru/bclib/api/BiomeAPI.java index eb4ff13e..35de02fd 100644 --- a/src/main/java/ru/bclib/api/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/BiomeAPI.java @@ -1,6 +1,8 @@ package ru.bclib.api; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.impl.biome.InternalBiomeData; @@ -10,8 +12,11 @@ import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome.ClimateParameters; +import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.biome.Biomes; import org.jetbrains.annotations.Nullable; import ru.bclib.util.MHelper; @@ -19,8 +24,11 @@ import ru.bclib.world.biomes.BCLBiome; import ru.bclib.world.biomes.FabricBiomesData; import ru.bclib.world.generator.BiomePicker; +import java.util.List; import java.util.Map; import java.util.Random; +import java.util.Set; +import java.util.function.BiConsumer; public class BiomeAPI { /** @@ -37,6 +45,9 @@ public class BiomeAPI { private static final Map CLIENT = Maps.newHashMap(); private static Registry biomeRegistry; + private static final Map>> MODIFICATIONS = Maps.newHashMap(); + private static final Set MODIFIED_BIOMES = Sets.newHashSet(); + public static final BCLBiome NETHER_WASTES_BIOME = registerNetherBiome(getFromRegistry(Biomes.NETHER_WASTES)); public static final BCLBiome CRIMSON_FOREST_BIOME = registerNetherBiome(getFromRegistry(Biomes.CRIMSON_FOREST)); public static final BCLBiome WARPED_FOREST_BIOME = registerNetherBiome(getFromRegistry(Biomes.WARPED_FOREST)); @@ -320,4 +331,69 @@ public class BiomeAPI { private static boolean pickerHasBiome(BiomePicker picker, ResourceLocation key) { return picker.getBiomes().stream().filter(biome -> biome.getID().equals(key)).findFirst().isPresent(); } + + /** + * Registers new biome modification for specified dimension. Will work both for mod and datapack biomes. + * @param dimensionID {@link ResourceLocation} dimension ID, example: Level.OVERWORLD or "minecraft:overworld". + * @param modification {@link BiConsumer} with {@link ResourceKey} biome ID and {@link Biome} parameters. + */ + public static void registerBiomeModification(ResourceKey dimensionID, BiConsumer modification) { + List> modifications = MODIFICATIONS.get(dimensionID); + if (modifications == null) { + modifications = Lists.newArrayList(); + MODIFICATIONS.put(dimensionID, modifications); + } + modifications.add(modification); + } + + /** + * Registers new biome modification for the Overworld. Will work both for mod and datapack biomes. + * @param modification {@link BiConsumer} with {@link ResourceLocation} biome ID and {@link Biome} parameters. + */ + public static void registerOverworldBiomeModification(BiConsumer modification) { + registerBiomeModification(Level.OVERWORLD, modification); + } + + /** + * Registers new biome modification for the Nether. Will work both for mod and datapack biomes. + * @param modification {@link BiConsumer} with {@link ResourceLocation} biome ID and {@link Biome} parameters. + */ + public static void registerNetherBiomeModification(BiConsumer modification) { + registerBiomeModification(Level.NETHER, modification); + } + + /** + * Registers new biome modification for the End. Will work both for mod and datapack biomes. + * @param modification {@link BiConsumer} with {@link ResourceLocation} biome ID and {@link Biome} parameters. + */ + public static void registerEndBiomeModification(BiConsumer modification) { + registerBiomeModification(Level.END, modification); + } + + /** + * Will apply biome modifications to world, internal usage only. + * @param level + */ + public static void applyModifications(ServerLevel level) { + List> modifications = MODIFICATIONS.get(level.dimension()); + if (modifications == null) { + return; + } + BiomeSource source = level.getChunkSource().getGenerator().getBiomeSource(); + List biomes = source.possibleBiomes(); + + biomes.forEach(biome -> { + ResourceLocation biomeID = getBiomeID(biome); + boolean modify = isDatapackBiome(biomeID); + if (!modify && !MODIFIED_BIOMES.contains(biomeID)) { + MODIFIED_BIOMES.add(biomeID); + modify = true; + } + if (modify) { + modifications.forEach(consumer -> { + consumer.accept(biomeID, biome); + }); + } + }); + } } diff --git a/src/main/java/ru/bclib/gui/gridlayout/GridLayout.java b/src/main/java/ru/bclib/gui/gridlayout/GridLayout.java index cacee79d..5e9ef459 100644 --- a/src/main/java/ru/bclib/gui/gridlayout/GridLayout.java +++ b/src/main/java/ru/bclib/gui/gridlayout/GridLayout.java @@ -5,8 +5,8 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.components.AbstractWidget; import ru.bclib.gui.gridlayout.GridLayout.GridValueType; -import ru.bclib.util.Pair; import ru.bclib.interfaces.TriConsumer; +import ru.bclib.util.Pair; import java.util.LinkedList; import java.util.List; diff --git a/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java b/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java index 1717d4f7..8de68864 100644 --- a/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java +++ b/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java @@ -33,6 +33,7 @@ public abstract class ServerLevelMixin extends Level { @Inject(method = "*", at = @At("TAIL")) private void bclib_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey registryKey, DimensionType dimensionType, ChunkProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { BiomeAPI.initRegistry(server); + BiomeAPI.applyModifications(ServerLevel.class.cast(this)); if (bclib_lastWorld != null && bclib_lastWorld.equals(session.getLevelId())) { return; diff --git a/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java b/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java index 9fdbfbe5..27a8ba3c 100644 --- a/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java +++ b/src/main/java/ru/bclib/world/generator/BCLibNetherBiomeSource.java @@ -28,6 +28,7 @@ public class BCLibNetherBiomeSource extends BiomeSource { private BiomeMap biomeMap; private final long seed; + @Deprecated(forRemoval = true) public static final List> onInit = new LinkedList<>(); public BCLibNetherBiomeSource(Registry biomeRegistry, long seed) {