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 5e553a4a7..87235d6b2 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 @@ -38,11 +38,14 @@ import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.config.PostLoadCompatibilityOptions; import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions; +import com.dfsek.terra.fabric.event.BiomeRegistrationEvent; +import com.dfsek.terra.fabric.event.GameInitializationEvent; 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.util.FabricUtil; import com.dfsek.terra.fabric.util.ProtoBiome; import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.profiler.ProfilerImpl; @@ -58,6 +61,7 @@ import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.WorldAccess; +import net.minecraft.world.biome.Biome; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.decorator.Decorator; import net.minecraft.world.gen.decorator.NopeDecoratorConfig; @@ -111,10 +115,10 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final DebugLogger debugLogger = new DebugLogger(logger); private final ItemHandle itemHandle = new FabricItemHandle(); private final WorldHandle worldHandle = new FabricWorldHandle(); - private final ConfigRegistry registry = new ConfigRegistry(); - private final CheckedRegistry checkedRegistry = new CheckedRegistry<>(registry); + private final ConfigRegistry configRegistry = new ConfigRegistry(); + private final CheckedRegistry checkedRegistry = new CheckedRegistry<>(configRegistry); - private final FabricAddon fabricAddon = new FabricAddon(this); + private final FabricAddon fabricAddon = new FabricAddon(); private final AddonRegistry addonRegistry = new AddonRegistry(fabricAddon, this); private final LockedRegistry addonLockedRegistry = new LockedRegistry<>(addonRegistry); @@ -200,11 +204,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { public boolean reload() { config.load(this); LangUtil.load(config.getLanguage(), this); // Load language. - boolean succeed = registry.loadAll(this); + boolean succeed = configRegistry.loadAll(this); worldMap.forEach((seed, pair) -> { pair.getRight().getConfig().getSamplerCache().clear(); String packID = pair.getRight().getConfig().getTemplate().getID(); - pair.setRight(new TerraWorld(pair.getRight().getWorld(), registry.get(packID), this)); + pair.setRight(new TerraWorld(pair.getRight().getWorld(), configRegistry.get(packID), this)); }); return succeed; } @@ -247,12 +251,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { }); } - public void packInit() { - logger.info("Loading config packs..."); - registry.loadAll(this); - logger.info("Loaded packs."); - } - @Override public void onInitialize() { instance = this; @@ -300,19 +298,12 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Addon("Terra-Fabric") @Author("Terra") @Version("1.0.0") - public static final class FabricAddon extends TerraAddon implements EventListener { - - private final TerraPlugin main; - + public final class FabricAddon extends TerraAddon implements EventListener { private final Map> templates = new HashMap<>(); - private FabricAddon(TerraPlugin main) { - this.main = main; - } - @Override public void initialize() { - main.getEventManager().registerListener(this, this); + eventManager.registerListener(this, this); } @Priority(Priority.LOWEST) @@ -351,7 +342,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { if(!template.getExcludedRegistryFeatures().contains(entry.getKey().getValue())) { try { event.getPack().getTreeRegistry().add(entry.getKey().getValue().toString(), (Tree) entry.getValue()); - main.getDebugLogger().info("Injected ConfiguredFeature " + entry.getKey().getValue() + " as Tree."); + debugLogger.info("Injected ConfiguredFeature " + entry.getKey().getValue() + " as Tree."); } catch(DuplicateEntryException ignored) { } } @@ -374,6 +365,21 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { templates.get(event.getPack()).setRight(template); } + @Global + public void injectBiomes(BiomeRegistrationEvent event) { + logger.info("Registering biomes..."); + Registry biomeRegistry = event.getRegistryManager().get(Registry.BIOME_KEY); + configRegistry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(biomeRegistry, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(biome, pack, event.getRegistryManager())))); // Register all Terra biomes. + logger.info("Biomes registered."); + } + + @Global + public void initializePacks(GameInitializationEvent event) { + TerraFabricPlugin main = TerraFabricPlugin.getInstance(); + main.logger().info("Loading config packs..."); + configRegistry.loadAll(TerraFabricPlugin.this); + logger.info("Loaded packs."); + } private void injectTree(CheckedRegistry registry, String id, ConfiguredFeature tree) { try { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/event/BiomeRegistrationEvent.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/event/BiomeRegistrationEvent.java new file mode 100644 index 000000000..747645e67 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/event/BiomeRegistrationEvent.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.fabric.event; + +import com.dfsek.terra.api.event.events.Event; +import net.minecraft.util.registry.DynamicRegistryManager; + +/** + * Fired when biomes should be registered. + */ +public class BiomeRegistrationEvent implements Event { + private final DynamicRegistryManager registryManager; + + public BiomeRegistrationEvent(DynamicRegistryManager registryManager) { + this.registryManager = registryManager; + } + + public DynamicRegistryManager getRegistryManager() { + return registryManager; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/event/GameInitializationEvent.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/event/GameInitializationEvent.java new file mode 100644 index 000000000..1a2ca827f --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/event/GameInitializationEvent.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.fabric.event; + +import com.dfsek.terra.api.event.events.Event; + +/** + * Called when the game is initialized and packs should be registered. + */ +public class GameInitializationEvent implements Event { +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.java index 065d8e7c0..fb842a330 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.java @@ -2,6 +2,7 @@ package com.dfsek.terra.fabric.generation; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.event.BiomeRegistrationEvent; import com.dfsek.terra.fabric.util.FabricUtil; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -26,8 +27,7 @@ public class TerraGeneratorType extends GeneratorType { @Override public GeneratorOptions createDefaultOptions(DynamicRegistryManager.Impl registryManager, long seed, boolean generateStructures, boolean bonusChest) { GeneratorOptions options = super.createDefaultOptions(registryManager, seed, generateStructures, bonusChest); - Registry biomeRegistry = registryManager.get(Registry.BIOME_KEY); - TerraFabricPlugin.getInstance().getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(biomeRegistry, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(TerraFabricPlugin.getInstance().getFabricAddon(), biome, pack, registryManager)))); // Register all Terra biomes. + TerraFabricPlugin.getInstance().getEventManager().callEvent(new BiomeRegistrationEvent(registryManager)); // register biomes return options; } 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/lifecycle/client/MinecraftClientMixin.java similarity index 87% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftClientMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/client/MinecraftClientMixin.java index 59dba3484..aa2a4aee1 100644 --- 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/lifecycle/client/MinecraftClientMixin.java @@ -1,6 +1,7 @@ -package com.dfsek.terra.fabric.mixin.init; +package com.dfsek.terra.fabric.mixin.lifecycle.client; import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.event.GameInitializationEvent; import com.dfsek.terra.fabric.generation.TerraGeneratorType; import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor; import net.minecraft.client.MinecraftClient; @@ -18,7 +19,7 @@ public class MinecraftClientMixin { 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 + TerraFabricPlugin.getInstance().getEventManager().callEvent(new GameInitializationEvent()); TerraFabricPlugin.getInstance().getConfigRegistry().forEach(pack -> { final GeneratorType generatorType = new TerraGeneratorType(pack); //noinspection ConstantConditions diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/package-info.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/package-info.java new file mode 100644 index 000000000..428f9772c --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/package-info.java @@ -0,0 +1,4 @@ +/** + * Mixins that inject behavior into the client/server lifecycle. + */ +package com.dfsek.terra.fabric.mixin.lifecycle; \ No newline at end of file diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/GeneratorOptionsMixin.java similarity index 88% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/GeneratorOptionsMixin.java index 6b012002c..c665bb3c4 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorOptionsMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/GeneratorOptionsMixin.java @@ -1,7 +1,8 @@ -package com.dfsek.terra.fabric.mixin; +package com.dfsek.terra.fabric.mixin.lifecycle.server; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.event.BiomeRegistrationEvent; import com.dfsek.terra.fabric.generation.TerraBiomeSource; import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.util.FabricUtil; @@ -61,11 +62,7 @@ public abstract class GeneratorOptionsMixin { if(config == null) throw new IllegalArgumentException("No such pack " + prop); - - main.logger().info("Registering biomes..."); - main.getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(biomeRegistry, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(main.getFabricAddon(), biome, pack, registryManager)))); // Register all Terra biomes. - main.logger().info("Biomes registered."); - + main.getEventManager().callEvent(new BiomeRegistrationEvent(registryManager)); // register biomes cir.setReturnValue(new GeneratorOptions(l, generateStructures, false, GeneratorOptions.getRegistryWithReplacedOverworldGenerator(dimensionTypes, dimensionOptions, new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, l, config), l, config)))); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/ServerMainMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java similarity index 67% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/ServerMainMixin.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java index 99cc5cfcb..b32f2e591 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/ServerMainMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/server/ServerMainMixin.java @@ -1,6 +1,7 @@ -package com.dfsek.terra.fabric.mixin.init; +package com.dfsek.terra.fabric.mixin.lifecycle.server; import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.event.GameInitializationEvent; import net.minecraft.server.Main; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -11,6 +12,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; public class ServerMainMixin { @Inject(method = "main([Ljava/lang/String;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/registry/DynamicRegistryManager;create()Lnet/minecraft/util/registry/DynamicRegistryManager$Impl;")) private static void injectConstructor(String[] args, CallbackInfo ci) { - TerraFabricPlugin.getInstance().packInit(); // Load during MinecraftServer construction, after other mods have registered blocks and stuff + TerraFabricPlugin.getInstance().getEventManager().callEvent(new GameInitializationEvent()); // Load during MinecraftServer construction, after other mods have registered blocks and stuff } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java index 97d0cd74a..7b5a3dedf 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java @@ -33,15 +33,16 @@ public final class FabricUtil { /** * Clones a Vanilla biome and injects Terra data to create a Terra-vanilla biome delegate. * - * @param fabricAddon The Fabric addon instance. * @param biome The Terra BiomeBuilder. * @param pack The ConfigPack this biome belongs to. * @return The Minecraft delegate biome. */ - public static Biome createBiome(TerraFabricPlugin.FabricAddon fabricAddon, BiomeBuilder biome, ConfigPack pack, DynamicRegistryManager registryManager) { + public static Biome createBiome(BiomeBuilder biome, ConfigPack pack, DynamicRegistryManager registryManager) { BiomeTemplate template = biome.getTemplate(); Map colors = template.getColors(); + TerraFabricPlugin.FabricAddon fabricAddon = TerraFabricPlugin.getInstance().getFabricAddon(); + Registry biomeRegistry = registryManager.get(Registry.BIOME_KEY); Biome vanilla = ((ProtoBiome) (new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0))).get(biomeRegistry); diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index b97212194..4e1dc8491 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -6,7 +6,7 @@ "mixins": [ "StructureAccessorAccessor", "CommandManagerMixin", - "GeneratorOptionsMixin", + "lifecycle.server.GeneratorOptionsMixin", "ServerWorldMixin", "access.BiomeEffectsAccessor", "access.MobSpawnerLogicAccessor", @@ -37,10 +37,10 @@ ], "client": [ "access.GeneratorTypeAccessor", - "init.MinecraftClientMixin" + "lifecycle.client.MinecraftClientMixin" ], "server": [ - "init.ServerMainMixin" + "lifecycle.server.ServerMainMixin" ], "injectors": { "defaultRequire": 1