From a1b3680643789822312fd2cdef3e80af48776006 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 5 May 2021 15:22:02 -0700 Subject: [PATCH] initialize later --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 61 ++++++++++--------- .../mixin/init/MinecraftClientMixin.java | 19 ++++++ .../mixin/init/MinecraftServerMixin.java | 33 ++++++++++ .../src/main/resources/terra.mixins.json | 7 ++- 4 files changed, 90 insertions(+), 30 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftClientMixin.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftServerMixin.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index ca1ab5347..f53c0fc7a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -37,13 +37,13 @@ import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; +import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; +import com.dfsek.terra.fabric.generation.PopulatorFeature; +import com.dfsek.terra.fabric.generation.TerraBiomeSource; import com.dfsek.terra.fabric.handle.FabricItemHandle; import com.dfsek.terra.fabric.handle.FabricWorldHandle; import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor; -import com.dfsek.terra.fabric.generation.TerraBiomeSource; -import com.dfsek.terra.fabric.generation.PopulatorFeature; -import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.exception.DuplicateEntryException; @@ -292,32 +292,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { .build(); } - @Override - public void onInitialize() { - instance = this; - - this.dataFolder = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); - saveDefaultConfig(); - config.load(this); - LangUtil.load(config.getLanguage(), this); - logger.info("Initializing Terra..."); - - if(!addonRegistry.loadAll()) { - throw new IllegalStateException("Failed to load addons. Please correct addon installations to continue."); - } - logger.info("Loaded addons."); - + public void packInit() { + logger.info("Loading config packs..."); registry.loadAll(this); - logger.info("Loaded packs."); - - Registry.register(Registry.FEATURE, new Identifier("terra", "flora_populator"), POPULATOR_FEATURE); - RegistryKey> floraKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN, new Identifier("terra", "flora_populator")); - Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, floraKey.getValue(), POPULATOR_CONFIGURED_FEATURE); - registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, id)), createBiome(biome)))); // Register all Terra biomes. - Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), FabricChunkGeneratorWrapper.CODEC); - Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), TerraBiomeSource.CODEC); if(FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { registry.forEach(pack -> { @@ -333,6 +312,33 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { }); } + logger.info("Loaded packs."); + } + + @Override + public void onInitialize() { + instance = this; + + this.dataFolder = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); + saveDefaultConfig(); + config.load(this); + LangUtil.load(config.getLanguage(), this); + logger.info("Initializing Terra..."); + + if(!addonRegistry.loadAll()) { + throw new IllegalStateException("Failed to load addons. Please correct addon installations to continue."); + } + logger.info("Loaded addons."); + + + + Registry.register(Registry.FEATURE, new Identifier("terra", "flora_populator"), POPULATOR_FEATURE); + RegistryKey> floraKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN, new Identifier("terra", "flora_populator")); + Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, floraKey.getValue(), POPULATOR_CONFIGURED_FEATURE); + + Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), FabricChunkGeneratorWrapper.CODEC); + Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), TerraBiomeSource.CODEC); + CommandManager manager = new TerraCommandManager(this); try { CommandUtil.registerAll(manager); @@ -340,7 +346,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { e.printStackTrace(); // TODO do something here even though this should literally never happen } - CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> { int max = manager.getMaxArgumentDepth(); RequiredArgumentBuilder arg = argument("arg" + (max - 1), StringArgumentType.word()); @@ -355,7 +360,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { //dispatcher.register(literal("te").redirect(root)); } ); - + logger.info("Finished initialization."); } private RequiredArgumentBuilder assemble(RequiredArgumentBuilder in, CommandManager manager) { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftClientMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftClientMixin.java new file mode 100644 index 000000000..4da836a97 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftClientMixin.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.fabric.mixin.init; + +import com.dfsek.terra.fabric.TerraFabricPlugin; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.RunArgs; +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; + +@Mixin(MinecraftClient.class) +public class MinecraftClientMixin { + @Inject(method = "", at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/util/WindowProvider;createWindow(Lnet/minecraft/client/WindowSettings;Ljava/lang/String;Ljava/lang/String;)Lnet/minecraft/client/util/Window;", // sorta arbitrary position, after mod init, before window opens + shift = At.Shift.BEFORE)) + public void injectConstructor(RunArgs args, CallbackInfo callbackInfo) { + TerraFabricPlugin.getInstance().packInit(); // Load during MinecraftClient construction, after other mods have registered blocks and stuff + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftServerMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftServerMixin.java new file mode 100644 index 000000000..3eb2dc6aa --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftServerMixin.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.fabric.mixin.init; + +import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.mojang.authlib.GameProfileRepository; +import com.mojang.authlib.minecraft.MinecraftSessionService; +import com.mojang.datafixers.DataFixer; +import net.minecraft.resource.ResourcePackManager; +import net.minecraft.resource.ServerResourceManager; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.WorldGenerationProgressListenerFactory; +import net.minecraft.util.UserCache; +import net.minecraft.util.registry.DynamicRegistryManager; +import net.minecraft.world.SaveProperties; +import net.minecraft.world.level.storage.LevelStorage; +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 java.net.Proxy; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin { + @Inject(method = "", at = @At("RETURN")) + public void injectConstructor(Thread thread, DynamicRegistryManager.Impl impl, LevelStorage.Session session, + SaveProperties saveProperties, ResourcePackManager resourcePackManager, Proxy proxy, + DataFixer dataFixer, ServerResourceManager serverResourceManager, + MinecraftSessionService minecraftSessionService, GameProfileRepository gameProfileRepository, + UserCache userCache, WorldGenerationProgressListenerFactory worldGenerationProgressListenerFactory, + CallbackInfo callbackInfo) { + TerraFabricPlugin.getInstance().packInit(); // Load during MinecraftServer construction, after other mods have registered blocks and stuff + } +} diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 394dd3742..8db745b86 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -33,9 +33,12 @@ "implementations.world.ServerWorldMixin" ], "client": [ - "access.GeneratorTypeAccessor" + "access.GeneratorTypeAccessor", + "init.MinecraftClientMixin" + ], + "server": [ + "init.MinecraftServerMixin" ], - "server": [], "injectors": { "defaultRequire": 1 },