diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/client/MinecraftClientMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/client/MinecraftClientMixin.java index 3dfd8c8c5..0e8f1bd34 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/client/MinecraftClientMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/client/MinecraftClientMixin.java @@ -17,23 +17,34 @@ package com.dfsek.terra.fabric.mixin.lifecycle.client; +import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; +import com.dfsek.terra.fabric.FabricEntryPoint; +import com.dfsek.terra.fabric.event.BiomeRegistrationEvent; +import com.dfsek.terra.fabric.generation.TerraGeneratorType; +import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor; + import net.minecraft.client.MinecraftClient; import net.minecraft.client.RunArgs; import net.minecraft.client.world.GeneratorType; import net.minecraft.text.LiteralText; +import net.minecraft.util.registry.DynamicRegistryManager; +import net.minecraft.util.registry.DynamicRegistryManager.Mutable; +import org.slf4j.Logger; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; -import com.dfsek.terra.fabric.FabricEntryPoint; -import com.dfsek.terra.fabric.generation.TerraGeneratorType; -import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor; - @Mixin(MinecraftClient.class) public class MinecraftClientMixin { + @Shadow + @Final + private static Logger LOGGER; + @Inject(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/WindowProvider;createWindow" + "(Lnet/minecraft/client/WindowSettings;Ljava/lang/String;Ljava/lang/String;)" + @@ -49,4 +60,17 @@ public class MinecraftClientMixin { GeneratorTypeAccessor.getValues().add(1, generatorType); }); } + + @Redirect(method = "method_40187(Lnet/minecraft/util/registry/DynamicRegistryManager;Lnet/minecraft/world/gen/GeneratorOptions;" + + "Lnet/minecraft/world/level/LevelInfo;Lnet/minecraft/resource/ResourceManager;" + + "Lnet/minecraft/resource/DataPackSettings;)Lcom/mojang/datafixers/util/Pair;", + at = @At(value = "INVOKE", + target = "net/minecraft/util/registry/DynamicRegistryManager.createAndLoad ()" + + "Lnet/minecraft/util/registry/DynamicRegistryManager$Mutable;")) + private static Mutable injectBiomes() { + Mutable mutable = DynamicRegistryManager.createAndLoad(); + LOGGER.info("Injecting Terra biomes..."); + FabricEntryPoint.getPlatform().getEventManager().callEvent(new BiomeRegistrationEvent(mutable)); + return mutable; + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java index 45263fc62..0b428be5e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java @@ -17,25 +17,50 @@ package com.dfsek.terra.fabric.mixin.lifecycle.server; -import net.minecraft.server.Main; -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 com.dfsek.terra.api.event.events.platform.PlatformInitializationEvent; import com.dfsek.terra.fabric.FabricEntryPoint; +import com.dfsek.terra.fabric.event.BiomeRegistrationEvent; + +import net.minecraft.server.Main; +import net.minecraft.util.registry.DynamicRegistryManager; +import net.minecraft.util.registry.DynamicRegistryManager.Mutable; +import org.slf4j.Logger; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Main.class) public class ServerMainMixin { + @Shadow + @Final + private static Logger LOGGER; + @Inject(method = "main([Ljava/lang/String;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/SaveLoader;refresh()V") // after registry manager creation - ) + ) private static void injectConstructor(String[] args, CallbackInfo ci) { FabricEntryPoint.getPlatform().getEventManager().callEvent( new PlatformInitializationEvent()); // Load during MinecraftServer construction, after other mods have registered blocks // and stuff } + + @Redirect(method = "method_40373(Lnet/minecraft/world/level/storage/LevelStorage$Session;Ljoptsimple/OptionSet;" + + "Ljoptsimple/OptionSpec;Lnet/minecraft/server/dedicated/ServerPropertiesLoader;Ljoptsimple/OptionSpec;" + + "Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/resource/DataPackSettings;)" + + "Lcom/mojang/datafixers/util/Pair;", + at = @At(value = "INVOKE", + target = "net/minecraft/util/registry/DynamicRegistryManager.createAndLoad ()" + + "Lnet/minecraft/util/registry/DynamicRegistryManager$Mutable;")) + private static Mutable injectBiomes() { + Mutable mutable = DynamicRegistryManager.createAndLoad(); + LOGGER.info("Injecting Terra biomes..."); + FabricEntryPoint.getPlatform().getEventManager().callEvent(new BiomeRegistrationEvent(mutable)); + return mutable; + } }