fix biome registration

This commit is contained in:
dfsek 2022-03-23 23:52:05 -07:00
parent ee3dd1259c
commit 9fc9688fa6
2 changed files with 61 additions and 12 deletions

View File

@ -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 = "<init>", 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;
}
}

View File

@ -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;
}
}