diff --git a/src/main/java/ru/bclib/api/BiomeAPI.java b/src/main/java/ru/bclib/api/BiomeAPI.java index a4ca43f2..ba0a3df1 100644 --- a/src/main/java/ru/bclib/api/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/BiomeAPI.java @@ -1,11 +1,9 @@ package ru.bclib.api; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.impl.biome.InternalBiomeData; -import net.fabricmc.fabric.impl.biome.WeightedBiomePicker; import net.minecraft.client.Minecraft; import net.minecraft.core.Registry; import net.minecraft.data.BuiltinRegistries; @@ -16,13 +14,11 @@ import net.minecraft.world.level.biome.Biome.ClimateParameters; import net.minecraft.world.level.biome.Biomes; import org.jetbrains.annotations.Nullable; -import ru.bclib.interfaces.BiomeListProvider; import ru.bclib.util.MHelper; import ru.bclib.world.biomes.BCLBiome; +import ru.bclib.world.biomes.FabricBiomesData; import ru.bclib.world.generator.BiomePicker; -import java.util.Collections; -import java.util.List; import java.util.Map; import java.util.Random; @@ -155,6 +151,21 @@ public static BCLBiome registerEndLandBiome(Biome biome) { return bclBiome; } + /** + * Register {@link BCLBiome} wrapper for {@link Biome}. + * After that biome will be added to BCLib End Biome Generator and into Fabric Biome API as a land biome (will generate only on islands). + * @param biome {@link BCLBiome}; + * @param weight float generation chance. + * @return {@link BCLBiome} + */ + public static BCLBiome registerEndLandBiome(Biome biome, float weight) { + ResourceKey key = BuiltinRegistries.BIOME.getResourceKey(biome).get(); + BCLBiome bclBiome = new BCLBiome(key.location(), biome, 1, weight); + END_LAND_BIOME_PICKER.addBiome(bclBiome); + registerBiome(bclBiome); + return bclBiome; + } + /** * Register {@link BCLBiome} instance and its {@link Biome} if necessary. * After that biome will be added to BCLib End Biome Generator and into Fabric Biome API as a void biome (will generate only in the End void - between islands). @@ -184,6 +195,21 @@ public static BCLBiome registerEndVoidBiome(Biome biome) { return bclBiome; } + /** + * Register {@link BCLBiome} instance and its {@link Biome} if necessary. + * After that biome will be added to BCLib End Biome Generator and into Fabric Biome API as a void biome (will generate only in the End void - between islands). + * @param biome {@link BCLBiome}; + * @param weight float generation chance. + * @return {@link BCLBiome} + */ + public static BCLBiome registerEndVoidBiome(Biome biome, float weight) { + ResourceKey key = BuiltinRegistries.BIOME.getResourceKey(biome).get(); + BCLBiome bclBiome = new BCLBiome(key.location(), biome, 1, weight); + END_VOID_BIOME_PICKER.addBiome(bclBiome); + registerBiome(bclBiome); + return bclBiome; + } + /** * Get {@link BCLBiome} from {@link Biome} instance on server. Used to convert world biomes to BCLBiomes. * @@ -250,20 +276,23 @@ public static boolean hasBiome(ResourceLocation biomeID) { * Load biomes from Fabric API. For internal usage only. */ public static void loadFabricAPIBiomes() { - List> biomes = Lists.newArrayList(); - biomes.addAll(getBiomes(InternalBiomeData.getEndBiomesMap().get(Biomes.SMALL_END_ISLANDS))); - biomes.addAll(getBiomes(InternalBiomeData.getEndBarrensMap().get(Biomes.END_BARRENS))); - biomes.forEach((key) -> registerEndVoidBiome(BuiltinRegistries.BIOME.get(key.location()))); + FabricBiomesData.NETHER_BIOMES.forEach((key) -> { + if (!hasBiome(key.location())) { + registerNetherBiome(BuiltinRegistries.BIOME.get(key.location())); + } + }); - biomes.clear(); - biomes.addAll(getBiomes(InternalBiomeData.getEndBiomesMap().get(Biomes.END_MIDLANDS))); - biomes.addAll(getBiomes(InternalBiomeData.getEndBiomesMap().get(Biomes.END_HIGHLANDS))); - biomes.forEach((key) -> registerEndLandBiome(BuiltinRegistries.BIOME.get(key.location()))); - } - - private static List> getBiomes(WeightedBiomePicker picker) { - BiomeListProvider biomeList = (BiomeListProvider) (Object) picker; - return biomeList == null ? Collections.emptyList() : biomeList.getBiomes(); + FabricBiomesData.END_LAND_BIOMES.forEach((key, weight) -> { + if (!hasBiome(key.location())) { + registerEndLandBiome(BuiltinRegistries.BIOME.get(key.location()), weight); + } + }); + + FabricBiomesData.END_VOID_BIOMES.forEach((key, weight) -> { + if (!hasBiome(key.location())) { + registerEndVoidBiome(BuiltinRegistries.BIOME.get(key.location()), weight); + } + }); } @Nullable diff --git a/src/main/java/ru/bclib/interfaces/BiomeListProvider.java b/src/main/java/ru/bclib/interfaces/BiomeListProvider.java deleted file mode 100644 index 79cea98d..00000000 --- a/src/main/java/ru/bclib/interfaces/BiomeListProvider.java +++ /dev/null @@ -1,10 +0,0 @@ -package ru.bclib.interfaces; - -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.biome.Biome; - -import java.util.List; - -public interface BiomeListProvider { - List> getBiomes(); -} diff --git a/src/main/java/ru/bclib/mixin/common/InternalBiomeDataMixin.java b/src/main/java/ru/bclib/mixin/common/InternalBiomeDataMixin.java new file mode 100644 index 00000000..3f0e7c37 --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/InternalBiomeDataMixin.java @@ -0,0 +1,40 @@ +package ru.bclib.mixin.common; + +import net.fabricmc.fabric.impl.biome.InternalBiomeData; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biomes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import ru.bclib.world.biomes.FabricBiomesData; + +@Mixin(value = InternalBiomeData.class, remap = false) +public class InternalBiomeDataMixin { + @Inject(method = "addEndBiomeReplacement", at = @At(value = "HEAD")) + private static void bclib_addEndBiomeReplacement(ResourceKey replaced, ResourceKey variant, double weight, CallbackInfo info) { + if (replaced == Biomes.END_BARRENS || replaced == Biomes.SMALL_END_ISLANDS) { + FabricBiomesData.END_VOID_BIOMES.put(variant, (float) weight); + } + else { + FabricBiomesData.END_LAND_BIOMES.put(variant, (float) weight); + } + } + + @Inject(method = "addEndMidlandsReplacement", at = @At(value = "HEAD")) + private static void bclib_addEndMidlandsReplacement(ResourceKey highlands, ResourceKey midlands, double weight, CallbackInfo info) { + FabricBiomesData.END_LAND_BIOMES.put(midlands, (float) weight); + } + + @Inject(method = "addEndBarrensReplacement", at = @At(value = "HEAD")) + private static void bclib_addEndBarrensReplacement(ResourceKey highlands, ResourceKey barrens, double weight, CallbackInfo info) { + FabricBiomesData.END_LAND_BIOMES.put(barrens, (float) weight); + FabricBiomesData.END_VOID_BIOMES.put(barrens, (float) weight); + } + + @Inject(method = "addNetherBiome", at = @At(value = "HEAD")) + private static void bclib_addNetherBiome(ResourceKey biome, Biome.ClimateParameters spawnNoisePoint, CallbackInfo info) { + FabricBiomesData.NETHER_BIOMES.add(biome); + } +} diff --git a/src/main/java/ru/bclib/mixin/common/WeightedBiomePickerMixin.java b/src/main/java/ru/bclib/mixin/common/WeightedBiomePickerMixin.java deleted file mode 100644 index 602eefcc..00000000 --- a/src/main/java/ru/bclib/mixin/common/WeightedBiomePickerMixin.java +++ /dev/null @@ -1,37 +0,0 @@ -package ru.bclib.mixin.common; - -import com.google.common.collect.Lists; -import net.fabricmc.fabric.impl.biome.InternalBiomeData; -import net.fabricmc.fabric.impl.biome.WeightedBiomePicker; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.Biomes; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import ru.bclib.interfaces.BiomeListProvider; - -import java.util.List; - -@Mixin(value = WeightedBiomePicker.class, remap = false) -public class WeightedBiomePickerMixin implements BiomeListProvider { - private final List> biomes = Lists.newArrayList(); - - @Inject(method = "addBiome", at = @At("TAIL")) - private void bclib_addBiome(final ResourceKey biome, final double weight, CallbackInfo info) { - if (be_isCorrectPicker(WeightedBiomePicker.class.cast(this))) { - biomes.add(biome); - } - } - - private boolean be_isCorrectPicker(WeightedBiomePicker picker) { - return picker == InternalBiomeData.getEndBiomesMap().get(Biomes.SMALL_END_ISLANDS) || - picker == InternalBiomeData.getEndBarrensMap().get(Biomes.END_BARRENS); - } - - @Override - public List> getBiomes() { - return biomes; - } -} diff --git a/src/main/java/ru/bclib/world/biomes/FabricBiomesData.java b/src/main/java/ru/bclib/world/biomes/FabricBiomesData.java new file mode 100644 index 00000000..01d71897 --- /dev/null +++ b/src/main/java/ru/bclib/world/biomes/FabricBiomesData.java @@ -0,0 +1,15 @@ +package ru.bclib.world.biomes; + +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.biome.Biome; + +import java.util.Map; +import java.util.Set; + +public class FabricBiomesData { + public static final Map, Float> END_LAND_BIOMES = Maps.newHashMap(); + public static final Map, Float> END_VOID_BIOMES = Maps.newHashMap(); + public static final Set> NETHER_BIOMES = Sets.newHashSet(); +} diff --git a/src/main/resources/bclib.mixins.common.json b/src/main/resources/bclib.mixins.common.json index 9edf85c6..f430772b 100644 --- a/src/main/resources/bclib.mixins.common.json +++ b/src/main/resources/bclib.mixins.common.json @@ -5,7 +5,7 @@ "compatibilityLevel": "JAVA_16", "mixins": [ "SimpleReloadableResourceManagerMixin", - "WeightedBiomePickerMixin", + "InternalBiomeDataMixin", "ComposterBlockAccessor", "PotionBrewingAccessor", "RecipeManagerAccessor",