From 4d22b18f3c610ce1ddfd85f1f5a44404b69d4bc9 Mon Sep 17 00:00:00 2001 From: s809 <11816467-s809@users.noreply.gitlab.com> Date: Sun, 7 Jan 2024 20:25:34 +0500 Subject: [PATCH] Refactor initializer code --- .run/Forge Client & Server - Current.run.xml | 4 +- ...Neoforge Client & Server - Current.run.xml | 7 + .run/Neoforge Client (gradle).run.xml | 24 ++ .run/Neoforge Server (gradle).run.xml | 24 ++ .../common/AbstractModInitializer.java | 261 ++++++++++++++++++ .../distanthorizons/common/IEventProxy.java | 6 + .../distanthorizons/common/LodCommonMain.java | 171 ------------ .../common/forge/LodForgeMethodCaller.java | 52 ---- .../block/TintGetterOverrideFast.java | 19 +- .../block/TintGetterOverrideSmooth.java | 19 +- .../fabric/FabricClientMain.java | 35 --- .../fabric/FabricClientProxy.java | 3 +- .../fabric/FabricDedicatedServerMain.java | 77 ------ .../distanthorizons/fabric/FabricMain.java | 150 +++++----- .../fabric/FabricServerProxy.java | 3 +- fabric/src/main/resources/fabric.mod.json | 4 +- .../forge/ForgeClientProxy.java | 18 +- .../distanthorizons/forge/ForgeMain.java | 201 ++++---------- .../forge/ForgeServerProxy.java | 13 +- neoforged/build.gradle | 4 +- .../neoforged/NeoforgeClientProxy.java | 16 +- .../neoforged/NeoforgeMain.java | 167 +++++------ .../neoforged/NeoforgeServerProxy.java | 11 +- 23 files changed, 595 insertions(+), 694 deletions(-) create mode 100644 .run/Neoforge Client & Server - Current.run.xml create mode 100644 .run/Neoforge Client (gradle).run.xml create mode 100644 .run/Neoforge Server (gradle).run.xml create mode 100644 common/src/main/java/com/seibel/distanthorizons/common/AbstractModInitializer.java create mode 100644 common/src/main/java/com/seibel/distanthorizons/common/IEventProxy.java delete mode 100644 common/src/main/java/com/seibel/distanthorizons/common/LodCommonMain.java delete mode 100644 common/src/main/java/com/seibel/distanthorizons/common/forge/LodForgeMethodCaller.java delete mode 100644 fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientMain.java delete mode 100644 fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricDedicatedServerMain.java diff --git a/.run/Forge Client & Server - Current.run.xml b/.run/Forge Client & Server - Current.run.xml index 046441476..8675be3a6 100644 --- a/.run/Forge Client & Server - Current.run.xml +++ b/.run/Forge Client & Server - Current.run.xml @@ -1,7 +1,7 @@ - - + + \ No newline at end of file diff --git a/.run/Neoforge Client & Server - Current.run.xml b/.run/Neoforge Client & Server - Current.run.xml new file mode 100644 index 000000000..a4829f786 --- /dev/null +++ b/.run/Neoforge Client & Server - Current.run.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.run/Neoforge Client (gradle).run.xml b/.run/Neoforge Client (gradle).run.xml new file mode 100644 index 000000000..1736f839b --- /dev/null +++ b/.run/Neoforge Client (gradle).run.xml @@ -0,0 +1,24 @@ + + + + + + + true + true + false + false + + + \ No newline at end of file diff --git a/.run/Neoforge Server (gradle).run.xml b/.run/Neoforge Server (gradle).run.xml new file mode 100644 index 000000000..bcffb3fb8 --- /dev/null +++ b/.run/Neoforge Server (gradle).run.xml @@ -0,0 +1,24 @@ + + + + + + + true + true + false + false + + + \ No newline at end of file diff --git a/common/src/main/java/com/seibel/distanthorizons/common/AbstractModInitializer.java b/common/src/main/java/com/seibel/distanthorizons/common/AbstractModInitializer.java new file mode 100644 index 000000000..01ccf283d --- /dev/null +++ b/common/src/main/java/com/seibel/distanthorizons/common/AbstractModInitializer.java @@ -0,0 +1,261 @@ +package com.seibel.distanthorizons.common; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.arguments.BoolArgumentType; +import com.mojang.brigadier.arguments.DoubleArgumentType; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiAfterDhInitEvent; +import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiBeforeDhInitEvent; +import com.seibel.distanthorizons.common.wrappers.DependencySetup; +import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftDedicatedServerWrapper; +import com.seibel.distanthorizons.core.api.internal.SharedApi; +import com.seibel.distanthorizons.core.config.Config; +import com.seibel.distanthorizons.core.config.ConfigBase; +import com.seibel.distanthorizons.core.config.eventHandlers.presets.ThreadPresetConfigEventHandler; +import com.seibel.distanthorizons.core.config.types.AbstractConfigType; +import com.seibel.distanthorizons.core.config.types.ConfigEntry; +import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; +import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; +import com.seibel.distanthorizons.core.jar.ModJarInfo; +import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.util.objects.Pair; +import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModAccessor; +import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModChecker; +import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector; +import com.seibel.distanthorizons.coreapi.ModInfo; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.dedicated.DedicatedServer; +import org.apache.logging.log4j.Logger; + +#if MC_VER >= MC_1_19_2 +import net.minecraft.network.chat.Component; +#else // < 1.19.2 +import net.minecraft.network.chat.TranslatableComponent; +#endif + +import java.lang.invoke.MethodHandles; +import java.util.HashMap; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +import static com.mojang.brigadier.arguments.DoubleArgumentType.doubleArg; +import static com.mojang.brigadier.arguments.IntegerArgumentType.integer; +import static net.minecraft.commands.Commands.argument; +import static net.minecraft.commands.Commands.literal; + +public abstract class AbstractModInitializer +{ + protected static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName()); + + protected abstract void createInitialBindings(); + protected abstract IEventProxy createClientProxy(); + protected abstract IEventProxy createServerProxy(boolean isDedicated); + protected abstract void initializeModCompat(); + + protected abstract void subscribeRegisterCommandsEvent(Consumer> eventHandler); + private CommandDispatcher commandDispatcher; + + protected abstract void subscribeClientStartedEvent(Runnable eventHandler); + protected abstract void subscribeServerStartingEvent(Consumer eventHandler); + protected abstract void runDelayedSetup(); + + + + private void startup() + { + DependencySetup.createSharedBindings(); + SharedApi.init(); + this.createInitialBindings(); + } + + private void printModInfo(boolean printGitInfo) + { + LOGGER.info(ModInfo.READABLE_NAME + ", Version: " + ModInfo.VERSION); + + if (printGitInfo) + { + // Useful for dev builds + LOGGER.info("DH Branch: " + ModJarInfo.Git_Branch); + LOGGER.info("DH Commit: " + ModJarInfo.Git_Commit); + LOGGER.info("DH Jar Build Source: " + ModJarInfo.Build_Source); + } + } + + protected void tryCreateModCompatAccessor(String modId, Class accessorClass, Supplier accessorConstructor) + { + IModChecker modChecker = SingletonInjector.INSTANCE.get(IModChecker.class); + if (modChecker.isModLoaded(modId)) + { + //noinspection unchecked + ModAccessorInjector.INSTANCE.bind((Class) accessorClass, accessorConstructor.get()); + } + } + + private void initConfig() + { + ConfigBase.INSTANCE = new ConfigBase(ModInfo.ID, ModInfo.NAME, Config.class, 2); + Config.completeDelayedSetup(); + } + + public void onInitializeClient() + { + DependencySetup.createClientBindings(); + + LOGGER.info("Initializing " + ModInfo.READABLE_NAME); + ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null); + + this.startup(); + this.printModInfo(true); + + this.createClientProxy().registerEvents(); + this.createServerProxy(false).registerEvents(); + + this.initializeModCompat(); + + LOGGER.info(ModInfo.READABLE_NAME + " Initialized"); + ApiEventInjector.INSTANCE.fireAllEvents(DhApiAfterDhInitEvent.class, null); + + // Client uses config for auto-updater, so it's initialized here instead of post-init stage + this.initConfig(); + + this.subscribeClientStartedEvent(this::postInit); + } + + public void onInitializeServer() + { + DependencySetup.createServerBindings(); + + LOGGER.info("Initializing " + ModInfo.READABLE_NAME); + ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null); + + this.startup(); + this.printModInfo(false); + + // This prevents returning uninitialized Config values, + // resulting from a circular reference mid-initialization in a static class + // noinspection ResultOfMethodCallIgnored + ThreadPresetConfigEventHandler.INSTANCE.toString(); + + this.createServerProxy(true).registerEvents(); + + LOGGER.info(ModInfo.READABLE_NAME + " Initialized"); + ApiEventInjector.INSTANCE.fireAllEvents(DhApiAfterDhInitEvent.class, null); + + this.subscribeRegisterCommandsEvent(dispatcher -> { + this.commandDispatcher = dispatcher; + }); + + this.subscribeServerStartingEvent(server -> { + MinecraftDedicatedServerWrapper.INSTANCE.dedicatedServer = (DedicatedServer)server; + + this.initConfig(); + this.postInit(); + this.initCommands(); + + LOGGER.info("Dedicated server initialized at " + server.getServerDirectory()); + }); + } + + private void postInit() + { + LOGGER.info("Post-Initializing Mod"); + this.runDelayedSetup(); + LOGGER.info("Mod Post-Initialized"); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + private void initCommands() + { + LiteralArgumentBuilder builder = literal("dhconfig") + .requires(source -> source.hasPermission(4)); + + for (AbstractConfigType type : ConfigBase.INSTANCE.entries) + { + if (!(type instanceof ConfigEntry)) continue; + //noinspection PatternVariableCanBeUsed + ConfigEntry configEntry = (ConfigEntry) type; + if (configEntry.getServersideShortName() == null) continue; + + Function< + Function, Object>, + Command + > makeConfigUpdater = getter -> c -> { + Object value = getter.apply(c); + + c.getSource().sendSuccess( + #if MC_VER >= MC_1_20_1 + () -> Component.literal("Changed the value of "+configEntry.getServersideShortName()+" to "+value), + #elif MC_VER >= MC_1_19_2 + Component.literal("Changed the value of "+configEntry.getServersideShortName()+" to "+value), + #else + new TranslatableComponent("Changed the value of "+configEntry.getServersideShortName()+" to "+value), + #endif + true); + configEntry.set(value); + return 1; + }; + + LiteralArgumentBuilder subcommand = literal(configEntry.getServersideShortName()) + .executes(c -> { + #if MC_VER >= MC_1_20_1 + c.getSource().sendSuccess(() -> Component.literal("Current value of "+configEntry.getServersideShortName()+" is "+configEntry.get()), true); + #elif MC_VER >= MC_1_19_2 + c.getSource().sendSuccess(Component.literal("Current value of "+configEntry.getServersideShortName()+" is "+configEntry.get()), true); + #else // < 1.19.2 + c.getSource().sendSuccess(new TranslatableComponent("Current value of "+configEntry.getServersideShortName()+" is "+configEntry.get()), true); + #endif + return 1; + }); + + if (Enum.class.isAssignableFrom(configEntry.getType())) + { + for (Object choice : configEntry.getType().getEnumConstants()) + { + subcommand.then( + literal(choice.toString()) + .executes(makeConfigUpdater.apply(c -> choice)) + ); + } + } + else + { + boolean setterAdded = false; + + for (java.util.Map.Entry, Pair>, BiFunction, String, ?>>> pair : new HashMap< + Class, + Pair< + Supplier>, + BiFunction, String, ?>> + >() {{ + put(Integer.class, new Pair<>(() -> integer((int) configEntry.getMin(), (int) configEntry.getMax()), IntegerArgumentType::getInteger)); + put(Double.class, new Pair<>(() -> doubleArg((double) configEntry.getMin(), (double) configEntry.getMax()), DoubleArgumentType::getDouble)); + put(Boolean.class, new Pair<>(BoolArgumentType::bool, BoolArgumentType::getBool)); + }}.entrySet()) + { + if (!pair.getKey().isAssignableFrom(configEntry.getType())) continue; + + subcommand.then(argument("value", pair.getValue().first.get()) + .executes(makeConfigUpdater.apply(c -> pair.getValue().second.apply(c, "value")))); + + setterAdded = true; + break; + } + + if (!setterAdded) + throw new RuntimeException("Config type of "+type.getName()+" is not supported: "+configEntry.getType().getSimpleName()); + } + + builder.then(subcommand); + } + + commandDispatcher.register(builder); + } + +} diff --git a/common/src/main/java/com/seibel/distanthorizons/common/IEventProxy.java b/common/src/main/java/com/seibel/distanthorizons/common/IEventProxy.java new file mode 100644 index 000000000..0f2e6b896 --- /dev/null +++ b/common/src/main/java/com/seibel/distanthorizons/common/IEventProxy.java @@ -0,0 +1,6 @@ +package com.seibel.distanthorizons.common; + +public interface IEventProxy +{ + void registerEvents(); +} diff --git a/common/src/main/java/com/seibel/distanthorizons/common/LodCommonMain.java b/common/src/main/java/com/seibel/distanthorizons/common/LodCommonMain.java deleted file mode 100644 index 79850e64c..000000000 --- a/common/src/main/java/com/seibel/distanthorizons/common/LodCommonMain.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * This file is part of the Distant Horizons mod - * licensed under the GNU LGPL v3 License. - * - * Copyright (C) 2020-2023 James Seibel - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package com.seibel.distanthorizons.common; - -import com.mojang.brigadier.Command; -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.arguments.ArgumentType; -import com.mojang.brigadier.arguments.BoolArgumentType; -import com.mojang.brigadier.arguments.DoubleArgumentType; -import com.mojang.brigadier.arguments.IntegerArgumentType; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.mojang.brigadier.context.CommandContext; -import com.seibel.distanthorizons.common.forge.LodForgeMethodCaller; -import com.seibel.distanthorizons.common.wrappers.DependencySetup; -import com.seibel.distanthorizons.core.config.types.AbstractConfigType; -import com.seibel.distanthorizons.core.config.types.ConfigEntry; -import com.seibel.distanthorizons.core.util.objects.Pair; -import com.seibel.distanthorizons.coreapi.ModInfo; -import com.seibel.distanthorizons.core.api.internal.SharedApi; -import com.seibel.distanthorizons.core.config.Config; -import com.seibel.distanthorizons.core.config.ConfigBase; -import net.minecraft.commands.CommandSourceStack; - -#if MC_VER >= MC_1_19_2 -import net.minecraft.network.chat.Component; -#else // < 1.19.2 -import net.minecraft.network.chat.TranslatableComponent; -#endif - -import java.util.HashMap; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Supplier; - -import static com.mojang.brigadier.arguments.DoubleArgumentType.doubleArg; -import static com.mojang.brigadier.arguments.IntegerArgumentType.integer; -import static net.minecraft.commands.Commands.argument; -import static net.minecraft.commands.Commands.literal; - -/** - * This is the common main class - * - * @author Ran - */ -public class LodCommonMain -{ - public static boolean forge = false; - public static LodForgeMethodCaller forgeMethodCaller; - public static CommandDispatcher commandDispatcher; - - - public static void startup(LodForgeMethodCaller forgeMethodCaller) - { - if (forgeMethodCaller != null) - { - LodCommonMain.forge = true; - LodCommonMain.forgeMethodCaller = forgeMethodCaller; - } - - DependencySetup.createSharedBindings(); - SharedApi.init(); - } - - public static void initConfig() - { - ConfigBase.INSTANCE = new ConfigBase(ModInfo.ID, ModInfo.NAME, Config.class, 2); - Config.completeDelayedSetup(); - } - - @SuppressWarnings({"rawtypes", "unchecked"}) - public static void initCommands() - { - LiteralArgumentBuilder builder = literal("dhconfig") - .requires(source -> source.hasPermission(4)); - - for (AbstractConfigType type : ConfigBase.INSTANCE.entries) - { - if (!(type instanceof ConfigEntry)) continue; - ConfigEntry configEntry = (ConfigEntry) type; - if (configEntry.getServersideShortName() == null) continue; - - Function< - Function, Object>, - Command - > makeConfigUpdater = getter -> c -> { - Object value = getter.apply(c); - #if MC_VER >= MC_1_20_1 - c.getSource().sendSuccess(() -> Component.literal("Changed the value of "+configEntry.getServersideShortName()+" to "+value), true); - #elif MC_VER >= MC_1_19_2 - c.getSource().sendSuccess(Component.literal("Changed the value of "+configEntry.getServersideShortName()+" to "+value), true); - #else // < 1.19.2 - c.getSource().sendSuccess(new TranslatableComponent("Changed the value of "+configEntry.getServersideShortName()+" to "+value), true); - #endif - configEntry.set(value); - return 1; - }; - - LiteralArgumentBuilder subcommand = literal(configEntry.getServersideShortName()) - .executes(c -> { - #if MC_VER >= MC_1_20_1 - c.getSource().sendSuccess(() -> Component.literal("Current value of "+configEntry.getServersideShortName()+" is "+configEntry.get()), true); - #elif MC_VER >= MC_1_19_2 - c.getSource().sendSuccess(Component.literal("Current value of "+configEntry.getServersideShortName()+" is "+configEntry.get()), true); - #else // < 1.19.2 - c.getSource().sendSuccess(new TranslatableComponent("Current value of "+configEntry.getServersideShortName()+" is "+configEntry.get()), true); - #endif - return 1; - }); - - if (Enum.class.isAssignableFrom(configEntry.getType())) - { - for (Object choice : configEntry.getType().getEnumConstants()) - { - subcommand.then( - literal(choice.toString()) - .executes(makeConfigUpdater.apply(c -> choice)) - ); - } - } - else - { - boolean setterAdded = false; - - for (java.util.Map.Entry, Pair>, BiFunction, String, ?>>> pair : new HashMap< - Class, - Pair< - Supplier>, - BiFunction, String, ?>> - >() {{ - put(Integer.class, new Pair<>(() -> integer((int) configEntry.getMin(), (int) configEntry.getMax()), IntegerArgumentType::getInteger)); - put(Double.class, new Pair<>(() -> doubleArg((double) configEntry.getMin(), (double) configEntry.getMax()), DoubleArgumentType::getDouble)); - put(Boolean.class, new Pair<>(BoolArgumentType::bool, BoolArgumentType::getBool)); - }}.entrySet()) - { - if (!pair.getKey().isAssignableFrom(configEntry.getType())) continue; - - subcommand.then(argument("value", pair.getValue().first.get()) - .executes(makeConfigUpdater.apply(c -> pair.getValue().second.apply(c, "value")))); - - setterAdded = true; - break; - } - - if (!setterAdded) - throw new RuntimeException("Config type of "+type.getName()+" is not supported: "+configEntry.getType().getSimpleName()); - } - - builder.then(subcommand); - } - - commandDispatcher.register(builder); - } - -} diff --git a/common/src/main/java/com/seibel/distanthorizons/common/forge/LodForgeMethodCaller.java b/common/src/main/java/com/seibel/distanthorizons/common/forge/LodForgeMethodCaller.java deleted file mode 100644 index afa8fa468..000000000 --- a/common/src/main/java/com/seibel/distanthorizons/common/forge/LodForgeMethodCaller.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * This file is part of the Distant Horizons mod - * licensed under the GNU LGPL v3 License. - * - * Copyright (C) 2020-2023 James Seibel - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, version 3. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package com.seibel.distanthorizons.common.forge; - -import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftClientWrapper; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.core.Direction; -#if MC_VER >= MC_1_19_2 -import net.minecraft.util.RandomSource; -#endif -import net.minecraft.world.level.ColorResolver; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; - -import java.util.List; -import java.util.Random; - -/** - * used for calling methods that forge modified - * (forge modifies vanilla methods for some reason) - * - * @author Ran - */ -public interface LodForgeMethodCaller -{ - #if MC_VER < MC_1_19_2 - List getQuads(MinecraftClientWrapper mc, Block block, BlockState blockState, Direction direction, Random random); // FIXME: For 1.19 - #else - List getQuads(MinecraftClientWrapper mc, Block block, BlockState blockState, Direction direction, RandomSource random); // FIXME: For 1.19 - #endif - - int colorResolverGetColor(ColorResolver resolver, Biome biome, double x, double z); - -} diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideFast.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideFast.java index da3e8d4cf..543747c2c 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideFast.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideFast.java @@ -19,7 +19,6 @@ package com.seibel.distanthorizons.common.wrappers.block; -import com.seibel.distanthorizons.common.LodCommonMain; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.*; @@ -60,15 +59,15 @@ public class TintGetterOverrideFast implements BlockAndTintGetter @Override public int getBlockTint(BlockPos blockPos, ColorResolver colorResolver) { - if (LodCommonMain.forgeMethodCaller != null) - { - return LodCommonMain.forgeMethodCaller.colorResolverGetColor(colorResolver, _getBiome(blockPos), - blockPos.getX(), blockPos.getZ()); - } - else - { - return colorResolver.getColor(_getBiome(blockPos), blockPos.getX(), blockPos.getZ()); - } + //if (LodCommonMain.forgeMethodCaller != null) + //{ + // return LodCommonMain.forgeMethodCaller.colorResolverGetColor(colorResolver, _getBiome(blockPos), + // blockPos.getX(), blockPos.getZ()); + //} + //else + //{ + return colorResolver.getColor(this._getBiome(blockPos), blockPos.getX(), blockPos.getZ()); + //} } @Override diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideSmooth.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideSmooth.java index 240c4e848..4e8ff00c5 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideSmooth.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideSmooth.java @@ -19,7 +19,6 @@ package com.seibel.distanthorizons.common.wrappers.block; -import com.seibel.distanthorizons.common.LodCommonMain; import net.minecraft.core.BlockPos; import net.minecraft.core.Cursor3D; import net.minecraft.core.Direction; @@ -75,15 +74,15 @@ public class TintGetterOverrideSmooth implements BlockAndTintGetter { mutableBlockPos.set(cursor3D.nextX(), cursor3D.nextY(), cursor3D.nextZ()); int n; - if (LodCommonMain.forgeMethodCaller != null) - { - n = LodCommonMain.forgeMethodCaller.colorResolverGetColor(colorResolver, _getBiome(mutableBlockPos), - mutableBlockPos.getX(), mutableBlockPos.getZ()); - } - else - { - n = colorResolver.getColor(_getBiome(mutableBlockPos), mutableBlockPos.getX(), mutableBlockPos.getZ()); - } + //if (LodCommonMain.forgeMethodCaller != null) + //{ + // n = LodCommonMain.forgeMethodCaller.colorResolverGetColor(colorResolver, _getBiome(mutableBlockPos), + // mutableBlockPos.getX(), mutableBlockPos.getZ()); + //} + //else + //{ + n = colorResolver.getColor(this._getBiome(mutableBlockPos), mutableBlockPos.getX(), mutableBlockPos.getZ()); + //} k += (n & 0xFF0000) >> 16; l += (n & 0xFF00) >> 8; diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientMain.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientMain.java deleted file mode 100644 index 2990b3ffd..000000000 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientMain.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.seibel.distanthorizons.fabric; - -import com.seibel.distanthorizons.common.LodCommonMain; -import com.seibel.distanthorizons.common.wrappers.DependencySetup; -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; - -@Environment(EnvType.CLIENT) -public class FabricClientMain implements ClientModInitializer -{ - public static FabricClientProxy client_proxy; - public static FabricServerProxy server_proxy; - - - // Do if implements ClientModInitializer - // This loads the mod before minecraft loads which causes a lot of issues - @Override - public void onInitializeClient() - { - DependencySetup.createClientBindings(); - FabricMain.init(); - LodCommonMain.initConfig(); - - server_proxy = new FabricServerProxy(false); - server_proxy.registerEvents(); - - client_proxy = new FabricClientProxy(); - client_proxy.registerEvents(); - - ClientLifecycleEvents.CLIENT_STARTED.register((mc) -> FabricMain.postInit()); - } - -} diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java index 99068a62e..58650997f 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java @@ -19,6 +19,7 @@ package com.seibel.distanthorizons.fabric; +import com.seibel.distanthorizons.common.IEventProxy; import com.seibel.distanthorizons.common.rendering.SeamlessOverdraw; import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; @@ -72,7 +73,7 @@ import org.lwjgl.opengl.GL15; * @version 2023-7-27 */ @Environment(EnvType.CLIENT) -public class FabricClientProxy +public class FabricClientProxy implements IEventProxy { private final ClientApi clientApi = ClientApi.INSTANCE; private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricDedicatedServerMain.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricDedicatedServerMain.java deleted file mode 100644 index 63d9bbe38..000000000 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricDedicatedServerMain.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.seibel.distanthorizons.fabric; - -import com.seibel.distanthorizons.common.LodCommonMain; -import com.seibel.distanthorizons.common.wrappers.DependencySetup; -import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftDedicatedServerWrapper; -import com.seibel.distanthorizons.core.config.eventHandlers.presets.ThreadPresetConfigEventHandler; -import com.seibel.distanthorizons.core.util.LodUtil; -import net.fabricmc.api.DedicatedServerModInitializer; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.dedicated.DedicatedServer; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -#if MC_VER >= MC_1_19_2 -import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; -#else // < 1.19.2 -import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; -#endif - -@Environment(EnvType.SERVER) -public class FabricDedicatedServerMain implements DedicatedServerModInitializer -{ - private static final Logger LOGGER = LogManager.getLogger(FabricDedicatedServerMain.class.getSimpleName()); - private static final ResourceLocation INITIAL_PHASE = ResourceLocation.tryParse("distanthorizons:dedicated_server_initial"); - - public static FabricServerProxy server_proxy; - public boolean hasPostSetupDone = false; - - - @Override - public void onInitializeServer() - { - DependencySetup.createServerBindings(); - FabricMain.init(); - - // FIXME this prevents returning uninitialized Config values - // resulting from a circular reference mid-initialization in a static class - //noinspection ResultOfMethodCallIgnored - ThreadPresetConfigEventHandler.INSTANCE.toString(); - - server_proxy = new FabricServerProxy(true); - server_proxy.registerEvents(); - - - #if MC_VER >= MC_1_19_2 - CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { - #else // < 1.19.2 - CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> { - #endif - LodCommonMain.commandDispatcher = dispatcher; - }); - - ServerLifecycleEvents.SERVER_STARTING.addPhaseOrdering(INITIAL_PHASE, Event.DEFAULT_PHASE); - ServerLifecycleEvents.SERVER_STARTING.register(INITIAL_PHASE, (server) -> - { - if (this.hasPostSetupDone) - { - return; - } - - this.hasPostSetupDone = true; - LodUtil.assertTrue(server instanceof DedicatedServer); - - MinecraftDedicatedServerWrapper.INSTANCE.dedicatedServer = (DedicatedServer) server; - LodCommonMain.initConfig(); - FabricMain.postInit(); - LodCommonMain.initCommands(); - - LOGGER.info("Dedicated server initialized at " + server.getServerDirectory()); - }); - } - -} diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java index 931f729a6..e446e8720 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java @@ -19,25 +19,35 @@ package com.seibel.distanthorizons.fabric; -import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiAfterDhInitEvent; -import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiBeforeDhInitEvent; -import com.seibel.distanthorizons.core.config.ConfigBase; -import com.seibel.distanthorizons.core.jar.ModJarInfo; -import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; -import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.*; -import com.seibel.distanthorizons.common.LodCommonMain; -import com.seibel.distanthorizons.coreapi.ModInfo; +import com.mojang.brigadier.CommandDispatcher; +import com.seibel.distanthorizons.common.AbstractModInitializer; +import com.seibel.distanthorizons.common.IEventProxy; import com.seibel.distanthorizons.core.config.Config; -import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector; +import com.seibel.distanthorizons.core.config.ConfigBase; import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; -import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.*; +import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.fabric.wrappers.FabricDependencySetup; import com.seibel.distanthorizons.fabric.wrappers.modAccessor.*; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.api.DedicatedServerModInitializer; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; -import org.apache.logging.log4j.Logger; +#if MC_VER >= MC_1_19_2 +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +#else // < 1.19.2 +import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; +#endif import javax.swing.*; +import java.util.function.Consumer; /** * Initialize and setup the Mod.
@@ -48,44 +58,33 @@ import javax.swing.*; * @author Ran * @version 9-2-2022 */ -public class FabricMain +public class FabricMain extends AbstractModInitializer implements ClientModInitializer, DedicatedServerModInitializer { - private static final Logger LOGGER = DhLoggerBuilder.getLogger(); + private static final ResourceLocation INITIAL_PHASE = ResourceLocation.tryParse("distanthorizons:dedicated_server_initial"); - public static void postInit() + + + @Override + protected void createInitialBindings() { - LOGGER.info("Post-Initializing Mod"); - FabricDependencySetup.runDelayedSetup(); - - if (Config.Client.Advanced.Graphics.Fog.disableVanillaFog.get() && SingletonInjector.INSTANCE.get(IModChecker.class).isModLoaded("bclib")) - ModAccessorInjector.INSTANCE.get(IBCLibAccessor.class).setRenderCustomFog(false); // Remove BCLib's fog - #if MC_VER >= MC_1_20_1 - if (SingletonInjector.INSTANCE.get(IModChecker.class).isModLoaded("sodium")) - ModAccessorInjector.INSTANCE.get(ISodiumAccessor.class).setFogOcclusion(false); // FIXME: This is a tmp fix for sodium 0.5.0, and 0.5.1. This is fixed in sodium 0.5.2 - #endif - - if (ConfigBase.INSTANCE == null) - throw new IllegalStateException("Config was not initialized. Make sure to call LodCommonMain.initConfig() before calling this method."); - - LOGGER.info("Mod Post-Initialized"); + FabricDependencySetup.createInitialBindings(); } - - // This loads the mod after minecraft loads which doesn't causes a lot of issues - public static void init() + @Override + protected IEventProxy createClientProxy() + { + return new FabricClientProxy(); + } + + @Override + protected IEventProxy createServerProxy(boolean isDedicated) + { + return new FabricServerProxy(isDedicated); + } + + @Override + protected void initializeModCompat() { - ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null); - - LOGGER.info("Initializing Mod"); - LodCommonMain.startup(null); - FabricDependencySetup.createInitialBindings(); - LOGGER.info(ModInfo.READABLE_NAME + ", Version: " + ModInfo.VERSION); - - // Print git info (Useful for dev builds) - LOGGER.info("DH Branch: " + ModJarInfo.Git_Branch); - LOGGER.info("DH Commit: " + ModJarInfo.Git_Commit); - LOGGER.info("DH Jar Build Source: " + ModJarInfo.Build_Source); - IModChecker modChecker = SingletonInjector.INSTANCE.get(IModChecker.class); if (modChecker.isModLoaded("sodium")) { @@ -105,35 +104,52 @@ public class FabricMain mc.crashMinecraft(errorMessage, new Exception(exceptionError)); } } - if (modChecker.isModLoaded("starlight")) - //if (SingletonInjector.INSTANCE.get(IModChecker.class).isModLoaded("imm_ptl_core")) - //{ - //ModAccessorInjector.INSTANCE.bind(IImmersivePortalsAccessor.class, new ImmersivePortalsAccessor()); - //} - if (SingletonInjector.INSTANCE.get(IModChecker.class).isModLoaded("starlight")) - { - ModAccessorInjector.INSTANCE.bind(IStarlightAccessor.class, new StarlightAccessor()); - } - if (modChecker.isModLoaded("optifine")) - { - ModAccessorInjector.INSTANCE.bind(IOptifineAccessor.class, new OptifineAccessor()); - } - if (modChecker.isModLoaded("bclib")) - { - ModAccessorInjector.INSTANCE.bind(IBCLibAccessor.class, new BCLibAccessor()); - } + this.tryCreateModCompatAccessor("starlight", IStarlightAccessor.class, StarlightAccessor::new); + //this.tryCreateModCompatAccessor("imm_ptl_core", IImmersivePortalsAccessor.class, ImmersivePortalsAccessor::new); + this.tryCreateModCompatAccessor("optifine", IOptifineAccessor.class, OptifineAccessor::new); + this.tryCreateModCompatAccessor("bclib", IBCLibAccessor.class, BCLibAccessor::new); #if MC_VER != MC_1_17_1 && MC_VER <= MC_1_20_1 // 1.17.1 won't support this since there isn't a matching Iris version - if (modChecker.isModLoaded("iris")) - { - ModAccessorInjector.INSTANCE.bind(IIrisAccessor.class, new IrisAccessor()); - } + this.tryCreateModCompatAccessor("iris", IIrisAccessor.class, IrisAccessor::new); + #endif + } + + @Override + protected void subscribeRegisterCommandsEvent(Consumer> eventHandler) + { + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess #if MC_VER >= MC_1_19_2 , environment #endif ) -> { + eventHandler.accept(dispatcher); + }); + } + + @Override + protected void subscribeClientStartedEvent(Runnable eventHandler) + { + ClientLifecycleEvents.CLIENT_STARTED.register((mc) -> eventHandler.run()); + } + + @Override + protected void subscribeServerStartingEvent(Consumer eventHandler) + { + ServerLifecycleEvents.SERVER_STARTING.addPhaseOrdering(INITIAL_PHASE, Event.DEFAULT_PHASE); + ServerLifecycleEvents.SERVER_STARTING.register(INITIAL_PHASE, eventHandler::accept); + } + + @Override + protected void runDelayedSetup() + { + FabricDependencySetup.runDelayedSetup(); + + if (Config.Client.Advanced.Graphics.Fog.disableVanillaFog.get() && SingletonInjector.INSTANCE.get(IModChecker.class).isModLoaded("bclib")) + ModAccessorInjector.INSTANCE.get(IBCLibAccessor.class).setRenderCustomFog(false); // Remove BCLib's fog + #if MC_VER >= MC_1_20_1 + if (SingletonInjector.INSTANCE.get(IModChecker.class).isModLoaded("sodium")) + ModAccessorInjector.INSTANCE.get(ISodiumAccessor.class).setFogOcclusion(false); // FIXME: This is a tmp fix for sodium 0.5.0, and 0.5.1. This is fixed in sodium 0.5.2 #endif - LOGGER.info(ModInfo.READABLE_NAME + " Initialized"); - - ApiEventInjector.INSTANCE.fireAllEvents(DhApiAfterDhInitEvent.class, null); + if (ConfigBase.INSTANCE == null) + throw new IllegalStateException("Config was not initialized. Make sure to call LodCommonMain.initConfig() before calling this method."); } } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java index 79ba7c760..02b1e63e6 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java @@ -1,5 +1,6 @@ package com.seibel.distanthorizons.fabric; +import com.seibel.distanthorizons.common.IEventProxy; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; @@ -32,7 +33,7 @@ import java.util.function.Supplier; * @author Tomlee * @version 5-11-2022 */ -public class FabricServerProxy +public class FabricServerProxy implements IEventProxy { private static final ServerApi SERVER_API = ServerApi.INSTANCE; private static final Logger LOGGER = DhLoggerBuilder.getLogger(); diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 2ffe2d3cc..c14865e15 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -24,10 +24,10 @@ "environment": "*", "entrypoints": { "client": [ - "com.seibel.distanthorizons.fabric.FabricClientMain" + "com.seibel.distanthorizons.fabric.FabricMain" ], "server": [ - "com.seibel.distanthorizons.fabric.FabricDedicatedServerMain" + "com.seibel.distanthorizons.fabric.FabricMain" ], "modmenu": [ "com.seibel.distanthorizons.fabric.wrappers.config.ModMenuIntegration" diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java index 422865a69..84acd95bd 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java @@ -19,6 +19,7 @@ package com.seibel.distanthorizons.forge; +import com.seibel.distanthorizons.common.IEventProxy; import com.seibel.distanthorizons.common.util.ProxyUtil; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; @@ -52,7 +53,7 @@ import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.common.MinecraftForge; #if MC_VER >= MC_1_20_2 import net.minecraftforge.network.Channel; import net.minecraftforge.network.ChannelBuilder; @@ -87,7 +88,7 @@ import java.util.function.Predicate; * @author James_Seibel * @version 2023-7-27 */ -public class ForgeClientProxy +public class ForgeClientProxy implements IEventProxy { private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); private static final Logger LOGGER = DhLoggerBuilder.getLogger(); @@ -103,6 +104,15 @@ public class ForgeClientProxy + @Override + public void registerEvents() + { + MinecraftForge.EVENT_BUS.register(this); + this.setupNetworkingListeners(); + } + + + //=============// // tick events // //=============// @@ -253,8 +263,7 @@ public class ForgeClientProxy // networking // //============// - /** @param event this is just to ensure the event is called at the right time, if it is called outside the {@link FMLClientSetupEvent} event, the binding may fail */ - public static void setupNetworkingListeners(FMLClientSetupEvent event) + public void setupNetworkingListeners() { #if MC_VER >= MC_1_20_2 Channel.VersionTest versionTest = (status, version) @@ -355,5 +364,4 @@ public class ForgeClientProxy } } - } diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeMain.java b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeMain.java index cfe03bdb7..3ad57967e 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeMain.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeMain.java @@ -19,36 +19,18 @@ package com.seibel.distanthorizons.forge; -import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiAfterDhInitEvent; -import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiBeforeDhInitEvent; -import com.seibel.distanthorizons.common.LodCommonMain; -import com.seibel.distanthorizons.common.forge.LodForgeMethodCaller; -import com.seibel.distanthorizons.common.wrappers.DependencySetup; +import com.mojang.brigadier.CommandDispatcher; +import com.seibel.distanthorizons.common.AbstractModInitializer; +import com.seibel.distanthorizons.common.IEventProxy; import com.seibel.distanthorizons.common.wrappers.gui.GetConfigScreen; -import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftClientWrapper; -import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftDedicatedServerWrapper; -import com.seibel.distanthorizons.core.config.eventHandlers.presets.ThreadPresetConfigEventHandler; -import com.seibel.distanthorizons.core.jar.ModJarInfo; -import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.AbstractOptifineAccessor; -import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector; import com.seibel.distanthorizons.coreapi.ModInfo; -import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; -import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IOptifineAccessor; import com.seibel.distanthorizons.forge.wrappers.ForgeDependencySetup; import com.seibel.distanthorizons.forge.wrappers.modAccessor.OptifineAccessor; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.core.Direction; -#if MC_VER >= MC_1_19_2 -import net.minecraft.util.RandomSource; -#endif -import net.minecraft.server.dedicated.DedicatedServer; -import net.minecraft.world.level.ColorResolver; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.server.MinecraftServer; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.fml.ModLoadingContext; @@ -72,20 +54,15 @@ import net.minecraftforge.client.ConfigGuiHandler; import net.minecraftforge.client.ConfigScreenHandler; #endif -import org.apache.logging.log4j.Logger; - // these imports change due to forge refactoring classes in 1.19 #if MC_VER < MC_1_19_2 import net.minecraftforge.client.model.data.ModelDataMap; import java.util.Random; #else -import net.minecraft.client.renderer.RenderType; -import net.minecraftforge.client.model.data.ModelData; #endif -import java.lang.invoke.MethodHandles; -import java.util.List; +import java.util.function.Consumer; /** * Initialize and setup the Mod.
@@ -98,47 +75,38 @@ import java.util.List; * @version 8-15-2022 */ @Mod(ModInfo.ID) -public class ForgeMain implements LodForgeMethodCaller +public class ForgeMain extends AbstractModInitializer { - private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName()); - public static ForgeClientProxy client_proxy = null; - public static ForgeServerProxy server_proxy = null; - public ForgeMain() { - -// initDedicated(null); -// initDedicated(null); // Register the mod initializer (Actual event registration is done in the different proxies) - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::initClient); - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::initDedicated); + FMLJavaModLoadingContext.get().getModEventBus().addListener((FMLClientSetupEvent e) -> this.onInitializeClient()); + FMLJavaModLoadingContext.get().getModEventBus().addListener((FMLDedicatedServerSetupEvent e) -> this.onInitializeServer()); } - private void initClient(final FMLClientSetupEvent event) + @Override + protected void createInitialBindings() { - DependencySetup.createClientBindings(); - ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null); - - LOGGER.info("Initializing Mod"); - LodCommonMain.startup(this); ForgeDependencySetup.createInitialBindings(); - LOGGER.info(ModInfo.READABLE_NAME + ", Version: " + ModInfo.VERSION); + } + + @Override + protected IEventProxy createClientProxy() + { + return new ForgeClientProxy(); + } + + @Override + protected IEventProxy createServerProxy(boolean isDedicated) + { + return new ForgeServerProxy(isDedicated); + } + + @Override + protected void initializeModCompat() + { + this.tryCreateModCompatAccessor("optifine", IOptifineAccessor.class, OptifineAccessor::new); - // Print git info (Useful for dev builds) - LOGGER.info("DH Branch: " + ModJarInfo.Git_Branch); - LOGGER.info("DH Commit: " + ModJarInfo.Git_Commit); - LOGGER.info("DH Jar Build Source: " + ModJarInfo.Build_Source); - - client_proxy = new ForgeClientProxy(); - MinecraftForge.EVENT_BUS.register(client_proxy); - server_proxy = new ForgeServerProxy(false); - MinecraftForge.EVENT_BUS.register(server_proxy); - - if (AbstractOptifineAccessor.optifinePresent()) - { - ModAccessorInjector.INSTANCE.bind(IOptifineAccessor.class, new OptifineAccessor()); - } - #if MC_VER < MC_1_17_1 ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, () -> (client, parent) -> GetConfigScreen.getScreen(parent)); @@ -149,101 +117,36 @@ public class ForgeMain implements LodForgeMethodCaller ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class, () -> new ConfigScreenHandler.ConfigScreenFactory((client, parent) -> GetConfigScreen.getScreen(parent))); #endif - - ForgeClientProxy.setupNetworkingListeners(event); - - LOGGER.info(ModInfo.READABLE_NAME + " Initialized"); - - ApiEventInjector.INSTANCE.fireAllEvents(DhApiAfterDhInitEvent.class, null); - - // Init config - // The reason im initialising in this rather than the post init process is cus im using this for the auto updater - LodCommonMain.initConfig(); } - private void initDedicated(final FMLDedicatedServerSetupEvent event) - { - DependencySetup.createServerBindings(); - ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null); - - LOGGER.info("Initializing Mod"); - LodCommonMain.startup(this); - ForgeDependencySetup.createInitialBindings(); - LOGGER.info(ModInfo.READABLE_NAME + ", Version: " + ModInfo.VERSION); - - // Print git info (Useful for dev builds) - //LOGGER.info("DH Branch: " + ModJarInfo.Git_Branch); - //LOGGER.info("DH Commit: " + ModJarInfo.Git_Commit); - //LOGGER.info("DH Jar Build Source: " + ModJarInfo.Build_Source); - - // FIXME this prevents returning uninitialized Config values - // resulting from a circular reference mid-initialization in a static class - //noinspection ResultOfMethodCallIgnored - ThreadPresetConfigEventHandler.INSTANCE.toString(); - - server_proxy = new ForgeServerProxy(true); - MinecraftForge.EVENT_BUS.register(server_proxy); - - LOGGER.info(ModInfo.READABLE_NAME + " Initialized"); - - ApiEventInjector.INSTANCE.fireAllEvents(DhApiAfterDhInitEvent.class, null); - - MinecraftForge.EVENT_BUS.addListener((RegisterCommandsEvent e) -> { - LodCommonMain.commandDispatcher = e.getDispatcher(); - }); - - #if MC_VER >= MC_1_18_2 - MinecraftForge.EVENT_BUS.addListener((ServerStartingEvent e) -> { - MinecraftDedicatedServerWrapper.INSTANCE.dedicatedServer = (DedicatedServer)e.getServer(); - #else - MinecraftForge.EVENT_BUS.addListener((FMLServerStartingEvent e) -> { - MinecraftDedicatedServerWrapper.INSTANCE.dedicatedServer = (DedicatedServer)e.getServer(); - #endif - - // Init config - // The reason im initialising in this rather than the post init process is cus im using this for the auto updater - LodCommonMain.initConfig(); - postInitCommon(); - LodCommonMain.initCommands(); - }); - } - - private void postInitCommon() - { - LOGGER.info("Post-Initializing Mod"); - ForgeDependencySetup.runDelayedSetup(); - - LOGGER.info("Mod Post-Initialized"); - } - - #if MC_VER < MC_1_19_2 - private final ModelDataMap modelData = new ModelDataMap.Builder().build(); - #else - private final ModelData modelData = ModelData.EMPTY; - #endif - @Override - #if MC_VER < MC_1_19_2 - public List getQuads(MinecraftClientWrapper mc, Block block, BlockState blockState, Direction direction, Random random) + protected void subscribeRegisterCommandsEvent(Consumer> eventHandler) { - return mc.getModelManager().getBlockModelShaper().getBlockModel(block.defaultBlockState()).getQuads(blockState, direction, random, modelData); + MinecraftForge.EVENT_BUS.addListener((RegisterCommandsEvent e) -> + { + eventHandler.accept(e.getDispatcher()); + }); } - #else - public List getQuads(MinecraftClientWrapper mc, Block block, BlockState blockState, Direction direction, RandomSource random) - { - return mc.getModelManager().getBlockModelShaper().getBlockModel(block.defaultBlockState()).getQuads(blockState, direction, random, modelData #if MC_VER >= MC_1_19_2 , RenderType.solid() #endif ); - } - #endif - @Override //TODO: Check this if its still needed - public int colorResolverGetColor(ColorResolver resolver, Biome biome, double x, double z) + @Override + protected void subscribeClientStartedEvent(Runnable eventHandler) { - #if MC_1_17_1______Still_needed - return resolver.m_130045_(biome, x, z); - #else - return resolver.getColor(biome, x, z); - #endif - + // FIXME Why it's unused? + } + + @Override + protected void subscribeServerStartingEvent(Consumer eventHandler) + { + MinecraftForge.EVENT_BUS.addListener((#if MC_VER >= MC_1_18_2 ServerStartingEvent #else FMLServerStartingEvent #endif e) -> + { + eventHandler.accept(e.getServer()); + }); + } + + @Override + protected void runDelayedSetup() + { + ForgeDependencySetup.runDelayedSetup(); } } diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java index 09ce9814e..944faf3fd 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java @@ -1,5 +1,6 @@ package com.seibel.distanthorizons.forge; +import com.seibel.distanthorizons.common.IEventProxy; import com.seibel.distanthorizons.common.util.ProxyUtil; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper; @@ -14,6 +15,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.player.PlayerEvent; #if MC_VER < MC_1_19_2 @@ -48,7 +50,7 @@ import org.apache.logging.log4j.Logger; import java.util.function.Supplier; -public class ForgeServerProxy +public class ForgeServerProxy implements IEventProxy { #if MC_VER < MC_1_19_2 private static LevelAccessor GetEventLevel(WorldEvent e) { return e.getWorld(); } @@ -62,6 +64,15 @@ public class ForgeServerProxy public static Supplier isGenerationThreadChecker = null; + + @Override + public void registerEvents() + { + MinecraftForge.EVENT_BUS.register(this); + } + + + //=============// // constructor // //=============// diff --git a/neoforged/build.gradle b/neoforged/build.gradle index eb49e83bb..fbf8459a9 100644 --- a/neoforged/build.gradle +++ b/neoforged/build.gradle @@ -54,14 +54,14 @@ loom { client { client() setConfigName("Neoforged Client") - ideConfigGenerated(true) + ideConfigGenerated(false) runDir("../run") // vmArgs("-XX:-OmitStackTraceInFastThrow", minecraftMemoryJavaArg) } server { server() setConfigName("Neoforged Server") - ideConfigGenerated(true) + ideConfigGenerated(false) runDir("../run") } } diff --git a/neoforged/src/main/java/com/seibel/distanthorizons/neoforged/NeoforgeClientProxy.java b/neoforged/src/main/java/com/seibel/distanthorizons/neoforged/NeoforgeClientProxy.java index 1390e2337..34aef5d89 100644 --- a/neoforged/src/main/java/com/seibel/distanthorizons/neoforged/NeoforgeClientProxy.java +++ b/neoforged/src/main/java/com/seibel/distanthorizons/neoforged/NeoforgeClientProxy.java @@ -19,6 +19,7 @@ package com.seibel.distanthorizons.neoforged; +import com.seibel.distanthorizons.common.IEventProxy; import com.seibel.distanthorizons.common.util.ProxyUtil; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; @@ -37,6 +38,7 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.client.multiplayer.ClientLevel; import net.neoforged.neoforge.client.event.RenderLevelStageEvent; +import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.level.ChunkEvent; import net.neoforged.neoforge.event.level.LevelEvent; @@ -64,7 +66,7 @@ import org.lwjgl.opengl.GL32; * @author James_Seibel * @version 2023-7-27 */ -public class NeoforgeClientProxy +public class NeoforgeClientProxy implements IEventProxy { private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); private static final Logger LOGGER = DhLoggerBuilder.getLogger(); @@ -76,6 +78,15 @@ public class NeoforgeClientProxy + @Override + public void registerEvents() + { + NeoForge.EVENT_BUS.register(this); + setupNetworkingListeners(); + } + + + //=============// // tick events // //=============// @@ -202,8 +213,7 @@ public class NeoforgeClientProxy // networking // //============// - /** @param event this is just to ensure the event is called at the right time, if it is called outside the {@link FMLClientSetupEvent} event, the binding may fail */ - public static void setupNetworkingListeners(FMLClientSetupEvent event) + public static void setupNetworkingListeners() { // multiversePluginChannel = NetworkRegistry.newSimpleChannel( // new ResourceLocation(ModInfo.NETWORKING_RESOURCE_NAMESPACE, ModInfo.MULTIVERSE_PLUGIN_NAMESPACE), diff --git a/neoforged/src/main/java/com/seibel/distanthorizons/neoforged/NeoforgeMain.java b/neoforged/src/main/java/com/seibel/distanthorizons/neoforged/NeoforgeMain.java index 88facc284..14d70700d 100644 --- a/neoforged/src/main/java/com/seibel/distanthorizons/neoforged/NeoforgeMain.java +++ b/neoforged/src/main/java/com/seibel/distanthorizons/neoforged/NeoforgeMain.java @@ -19,45 +19,27 @@ package com.seibel.distanthorizons.neoforged; -import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiAfterDhInitEvent; -import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiBeforeDhInitEvent; -import com.seibel.distanthorizons.common.LodCommonMain; -import com.seibel.distanthorizons.common.forge.LodForgeMethodCaller; -import com.seibel.distanthorizons.common.wrappers.DependencySetup; +import com.mojang.brigadier.CommandDispatcher; +import com.seibel.distanthorizons.common.AbstractModInitializer; +import com.seibel.distanthorizons.common.IEventProxy; import com.seibel.distanthorizons.common.wrappers.gui.GetConfigScreen; -import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftClientWrapper; -import com.seibel.distanthorizons.core.jar.ModJarInfo; -import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.AbstractOptifineAccessor; -import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector; -import com.seibel.distanthorizons.coreapi.ModInfo; -import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; -import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IOptifineAccessor; +import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.neoforged.wrappers.NeoforgeDependencySetup; - import com.seibel.distanthorizons.neoforged.wrappers.modAccessor.OptifineAccessor; - -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.core.Direction; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.ColorResolver; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.server.MinecraftServer; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModLoadingContext; import net.neoforged.fml.common.Mod; -import net.neoforged.fml.event.lifecycle.*; +import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.fml.event.lifecycle.FMLDedicatedServerSetupEvent; import net.neoforged.neoforge.client.ConfigScreenHandler; - import net.neoforged.neoforge.common.NeoForge; -import org.apache.logging.log4j.Logger; +import net.neoforged.neoforge.event.RegisterCommandsEvent; +import net.neoforged.neoforge.event.server.ServerStartingEvent; -import net.minecraft.client.renderer.RenderType; -import net.neoforged.neoforge.client.model.data.ModelData; - -import java.lang.invoke.MethodHandles; -import java.util.List; +import java.util.function.Consumer; /** * Initialize and setup the Mod.
@@ -70,92 +52,67 @@ import java.util.List; * @version 8-15-2022 */ @Mod(ModInfo.ID) -public class NeoforgeMain implements LodForgeMethodCaller +public class NeoforgeMain extends AbstractModInitializer { - private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName()); - public static NeoforgeClientProxy client_proxy = null; - public static NeoforgeServerProxy server_proxy = null; - public NeoforgeMain(IEventBus eventBus) { - DependencySetup.createClientBindings(); - -// initDedicated(null); -// initDedicated(null); - // Register the mod initializer (Actual event registration is done in the different proxies) - eventBus.addListener(this::initClient); - eventBus.addListener(this::initDedicated); + eventBus.addListener((FMLClientSetupEvent e) -> this.onInitializeClient()); + eventBus.addListener((FMLDedicatedServerSetupEvent e) -> this.onInitializeServer()); } - private void initClient(final FMLClientSetupEvent event) - { - ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null); - - LOGGER.info("Initializing Mod"); - LodCommonMain.startup(this); - NeoforgeDependencySetup.createInitialBindings(); - LOGGER.info(ModInfo.READABLE_NAME + ", Version: " + ModInfo.VERSION); - - // Print git info (Useful for dev builds) - LOGGER.info("DH Branch: " + ModJarInfo.Git_Branch); - LOGGER.info("DH Commit: " + ModJarInfo.Git_Commit); - LOGGER.info("DH Jar Build Source: " + ModJarInfo.Build_Source); - - client_proxy = new NeoforgeClientProxy(); - NeoForge.EVENT_BUS.register(client_proxy); - server_proxy = new NeoforgeServerProxy(false); - NeoForge.EVENT_BUS.register(server_proxy); - - if (AbstractOptifineAccessor.optifinePresent()) - { - ModAccessorInjector.INSTANCE.bind(IOptifineAccessor.class, new OptifineAccessor()); - } - - ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class, - () -> new ConfigScreenHandler.ConfigScreenFactory((client, parent) -> GetConfigScreen.getScreen(parent))); - - NeoforgeClientProxy.setupNetworkingListeners(event); - - LOGGER.info(ModInfo.READABLE_NAME + " Initialized"); - - ApiEventInjector.INSTANCE.fireAllEvents(DhApiAfterDhInitEvent.class, null); - - // Init config - // The reason im initialising in this rather than the post init process is cus im using this for the auto updater - LodCommonMain.initConfig(); - } - - private void initDedicated(final FMLDedicatedServerSetupEvent event) - { -// DependencySetup.createServerBindings(); -// initCommon(); - -// server_proxy = new ForgeServerProxy(true); -// MinecraftForge.EVENT_BUS.register(server_proxy); -// - postInitCommon(); - } - - private void postInitCommon() - { - LOGGER.info("Post-Initializing Mod"); - NeoforgeDependencySetup.runDelayedSetup(); - - LOGGER.info("Mod Post-Initialized"); - } - - private final ModelData modelData = ModelData.EMPTY; - @Override - public List getQuads(MinecraftClientWrapper mc, Block block, BlockState blockState, Direction direction, RandomSource random) + protected void createInitialBindings() { - return mc.getModelManager().getBlockModelShaper().getBlockModel(block.defaultBlockState()).getQuads(blockState, direction, random, modelData, RenderType.solid() ); + NeoforgeDependencySetup.createInitialBindings(); } - @Override //TODO: Check this if its still needed - public int colorResolverGetColor(ColorResolver resolver, Biome biome, double x, double z) + @Override + protected IEventProxy createClientProxy() { - return resolver.getColor(biome, x, z); + return new NeoforgeClientProxy(); + } + + @Override + protected IEventProxy createServerProxy(boolean isDedicated) + { + return new NeoforgeServerProxy(isDedicated); + } + + @Override + protected void initializeModCompat() + { + this.tryCreateModCompatAccessor("optifine", IOptifineAccessor.class, OptifineAccessor::new); + + ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class, + () -> new ConfigScreenHandler.ConfigScreenFactory((client, parent) -> GetConfigScreen.getScreen(parent))); + } + + @Override + protected void subscribeRegisterCommandsEvent(Consumer> eventHandler) + { + NeoForge.EVENT_BUS.addListener((RegisterCommandsEvent e) -> { + eventHandler.accept(e.getDispatcher()); + }); + } + + @Override + protected void subscribeClientStartedEvent(Runnable eventHandler) + { + // FIXME Why it's unused? + } + + @Override + protected void subscribeServerStartingEvent(Consumer eventHandler) + { + NeoForge.EVENT_BUS.addListener((ServerStartingEvent e) -> { + eventHandler.accept(e.getServer()); + }); + } + + @Override + protected void runDelayedSetup() + { + NeoforgeDependencySetup.runDelayedSetup(); } } diff --git a/neoforged/src/main/java/com/seibel/distanthorizons/neoforged/NeoforgeServerProxy.java b/neoforged/src/main/java/com/seibel/distanthorizons/neoforged/NeoforgeServerProxy.java index bbeb5c009..f5e786880 100644 --- a/neoforged/src/main/java/com/seibel/distanthorizons/neoforged/NeoforgeServerProxy.java +++ b/neoforged/src/main/java/com/seibel/distanthorizons/neoforged/NeoforgeServerProxy.java @@ -1,5 +1,6 @@ package com.seibel.distanthorizons.neoforged; +import com.seibel.distanthorizons.common.IEventProxy; import com.seibel.distanthorizons.common.util.ProxyUtil; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper; @@ -10,6 +11,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.LevelAccessor; +import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.TickEvent; import net.neoforged.neoforge.event.level.ChunkEvent; import net.neoforged.neoforge.event.level.LevelEvent; @@ -23,7 +25,7 @@ import org.apache.logging.log4j.Logger; import java.util.function.Supplier; -public class NeoforgeServerProxy +public class NeoforgeServerProxy implements IEventProxy { private static LevelAccessor GetEventLevel(LevelEvent e) { return e.getLevel(); } @@ -43,6 +45,13 @@ public class NeoforgeServerProxy isGenerationThreadChecker = BatchGenerationEnvironment::isCurrentThreadDistantGeneratorThread; } + @Override + public void registerEvents() + { + NeoForge.EVENT_BUS.register(this); + } + + //========//