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 super T> accessorClass, Supplier accessorConstructor)
+ {
+ IModChecker modChecker = SingletonInjector.INSTANCE.get(IModChecker.class);
+ if (modChecker.isModLoaded(modId))
+ {
+ //noinspection unchecked
+ ModAccessorInjector.INSTANCE.bind((Class extends IModAccessor>) 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);
+ }
+
+
//========//