diff --git a/src/main/java/ru/betterend/mixin/common/InternalBiomeDataMixin.java b/src/main/java/ru/betterend/mixin/common/InternalBiomeDataMixin.java new file mode 100644 index 00000000..1d988365 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/InternalBiomeDataMixin.java @@ -0,0 +1,30 @@ +package ru.betterend.mixin.common; + +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 net.fabricmc.fabric.impl.biome.InternalBiomeData; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.BiomeKeys; +import ru.betterend.BetterEnd; +import ru.betterend.registry.EndBiomes; + +@Mixin(InternalBiomeData.class) +public class InternalBiomeDataMixin { + @Inject(method = "addEndBiomeReplacement", at = @At("TAIL")) + private static void beAddIslandsBiomeFromFabric(RegistryKey replaced, RegistryKey variant, double weight, CallbackInfo info) { + if (replaced == BiomeKeys.SMALL_END_ISLANDS) { + Biome biome = BuiltinRegistries.BIOME.get(variant); + Identifier id = BuiltinRegistries.BIOME.getId(biome); + EndBiomes.FABRIC_VOID.add(id); + if (BetterEnd.isDevEnvironment()) { + System.out.println("Added " + id + " from Fabric small islands biome map"); + } + } + } +} diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index bb0e19fe..ea06c464 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -14,6 +14,7 @@ import com.google.gson.JsonObject; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.impl.biome.InternalBiomeData; import net.minecraft.client.MinecraftClient; import net.minecraft.server.MinecraftServer; import net.minecraft.util.Identifier; @@ -45,6 +46,7 @@ import ru.betterend.world.generator.BiomeType; public class EndBiomes { private static final HashMap ID_MAP = Maps.newHashMap(); private static final HashMap CLIENT = Maps.newHashMap(); + public static final Set FABRIC_VOID = Sets.newHashSet(); public static final BiomePicker LAND_BIOMES = new BiomePicker(); public static final BiomePicker VOID_BIOMES = new BiomePicker(); @@ -89,6 +91,7 @@ public class EndBiomes { VOID_BIOMES.clearMutables(); Map configs = Maps.newHashMap(); + biomeRegistry.forEach((biome) -> { if (biome.getCategory() == Category.THEEND) { Identifier id = biomeRegistry.getId(biome); @@ -101,7 +104,7 @@ public class EndBiomes { } float fog = 1F; float chance = 1F; - boolean isVoid = false; + boolean isVoid = FABRIC_VOID.contains(id); boolean hasCaves = true; JsonElement element = config.get(id.getPath()); if (element != null && element.isJsonObject()) { @@ -234,6 +237,7 @@ public class EndBiomes { parent.addSubBiome(biome); SUBBIOMES.add(biome); ID_MAP.put(biome.getID(), biome); + addLandBiomeToFabricApi(biome); } return biome; } @@ -249,6 +253,12 @@ public class EndBiomes { if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { addToPicker(biome, type); ID_MAP.put(biome.getID(), biome); + if (type == BiomeType.LAND) { + addLandBiomeToFabricApi(biome); + } + else { + addVoidBiomeToFabricApi(biome); + } } return biome; } @@ -292,6 +302,18 @@ public class EndBiomes { } } + private static void addLandBiomeToFabricApi(EndBiome biome) { + float weight = biome.getGenChanceImmutable(); + RegistryKey key = BuiltinRegistries.BIOME.getKey(biome.getBiome()).get(); + InternalBiomeData.addEndBiomeReplacement(BiomeKeys.END_HIGHLANDS, key, weight); + } + + private static void addVoidBiomeToFabricApi(EndBiome biome) { + float weight = biome.getGenChanceImmutable(); + RegistryKey key = BuiltinRegistries.BIOME.getKey(biome.getBiome()).get(); + InternalBiomeData.addEndBiomeReplacement(BiomeKeys.SMALL_END_ISLANDS, key, weight); + } + public static EndBiome getFromBiome(Biome biome) { return ID_MAP.getOrDefault(biomeRegistry.getId(biome), END); } diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index 8e0ab030..676db37d 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -170,6 +170,10 @@ public class EndBiome { return this.genChance; } + public float getGenChanceImmutable() { + return this.genChanceUnmutable; + } + public boolean hasCaves() { return hasCaves; } diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 96268298..c6c94d9d 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -12,6 +12,7 @@ "ServerPlayerEntityMixin", "ChorusPlantFeatureMixin", "BubbleColumnBlockMixin", + "InternalBiomeDataMixin", "ChorusFlowerBlockMixin", "LandPathNodeMakerMixin", "ChorusPlantBlockMixin",