From 99e7fad655dd66b875746bd002baac00244c0649 Mon Sep 17 00:00:00 2001 From: cpw Date: Mon, 29 Jun 2020 22:08:50 -0400 Subject: [PATCH] Reorganize modloading on the dediserver. This removes the DedicatedServer parameter from the FMLDedicatedServerSetupEvent. Code for customizing the server instance should be moved to the ServerAboutToStartEvent or similar, where the server instance is available. This reorganization means that mods will load fully before the server is even constructed, or the server properties loaded. We also move the EULA right to the front so we don't have to wait for bootstrap. This should fix the problems with mods which customize world data and other things. Signed-off-by: cpw --- .../net/minecraft/server/Main.java.patch | 39 +++++++++++++++---- .../dedicated/DedicatedServer.java.patch | 23 ++--------- .../net/minecraftforge/fml/SidedProvider.java | 2 +- .../FMLDedicatedServerSetupEvent.java | 14 +++---- .../fml/server/ServerLifecycleHooks.java | 24 +++++++----- .../fml/server/ServerModLoader.java | 34 ++++------------ 6 files changed, 62 insertions(+), 74 deletions(-) diff --git a/patches/minecraft/net/minecraft/server/Main.java.patch b/patches/minecraft/net/minecraft/server/Main.java.patch index 3ca20da94a..5ac67d9511 100644 --- a/patches/minecraft/net/minecraft/server/Main.java.patch +++ b/patches/minecraft/net/minecraft/server/Main.java.patch @@ -8,16 +8,40 @@ try { OptionSet optionset = optionparser.parse(p_main_0_); -@@ -86,7 +87,7 @@ +@@ -79,32 +80,36 @@ + optionparser.printHelpOn(System.err); + return; + } ++ Path path1 = Paths.get("eula.txt"); ++ ServerEula servereula = new ServerEula(path1); ++ if (!optionset.has(optionspec1) && !servereula.func_154346_a()) { ++ field_240759_a_.info("You need to agree to the EULA in order to run the server. Go to eula.txt for more info."); ++ return; ++ } + + CrashReport.func_230188_h_(); + Bootstrap.func_151354_b(); + Bootstrap.func_218821_c(); Util.func_240994_l_(); ++ if (!optionset.has(optionspec1)) net.minecraftforge.fml.server.ServerModLoader.load(); // Load mods before we load almost anything else anymore. Single spot now. Only loads if they haven't passed the initserver param Path path = Paths.get("server.properties"); ServerPropertiesProvider serverpropertiesprovider = new ServerPropertiesProvider(path); -- serverpropertiesprovider.func_219035_b(); -+ if (optionset.has(optionspec1) || !java.nio.file.Files.exists(path)) serverpropertiesprovider.func_219035_b(); - Path path1 = Paths.get("eula.txt"); - ServerEula servereula = new ServerEula(path1); + serverpropertiesprovider.func_219035_b(); +- Path path1 = Paths.get("eula.txt"); +- ServerEula servereula = new ServerEula(path1); if (optionset.has(optionspec1)) { -@@ -105,6 +106,11 @@ + field_240759_a_.info("Initialized '{}' and '{}'", path.toAbsolutePath(), path1.toAbsolutePath()); + return; + } + +- if (!servereula.func_154346_a()) { +- field_240759_a_.info("You need to agree to the EULA in order to run the server. Go to eula.txt for more info."); +- return; +- } +- + File file1 = new File(optionset.valueOf(optionspec9)); + YggdrasilAuthenticationService yggdrasilauthenticationservice = new YggdrasilAuthenticationService(Proxy.NO_PROXY, UUID.randomUUID().toString()); + MinecraftSessionService minecraftsessionservice = yggdrasilauthenticationservice.createMinecraftSessionService(); GameProfileRepository gameprofilerepository = yggdrasilauthenticationservice.createProfileRepository(); PlayerProfileCache playerprofilecache = new PlayerProfileCache(gameprofilerepository, new File(file1, MinecraftServer.field_152367_a.getName())); String s = Optional.ofNullable(optionset.valueOf(optionspec10)).orElse(serverpropertiesprovider.func_219034_a().field_219021_o); @@ -25,11 +49,10 @@ + field_240759_a_.error("Invalid world directory specified, must not be null, empty or the same directory as your universe! " + s); + return; + } -+ net.minecraftforge.fml.server.ServerModLoader.gatherAndInit(); // Gather and construct mods before resource loading and before world conversions. SaveFormat saveformat = SaveFormat.func_237269_a_(file1.toPath()); SaveFormat.LevelSave saveformat$levelsave = saveformat.func_237274_c_(s); MinecraftServer.func_240777_a_(saveformat$levelsave); -@@ -170,6 +176,7 @@ +@@ -170,6 +175,7 @@ Thread thread = new Thread("Server Shutdown Thread") { public void run() { dedicatedserver.func_71263_m(true); diff --git a/patches/minecraft/net/minecraft/server/dedicated/DedicatedServer.java.patch b/patches/minecraft/net/minecraft/server/dedicated/DedicatedServer.java.patch index 17671a390a..0b8a99c471 100644 --- a/patches/minecraft/net/minecraft/server/dedicated/DedicatedServer.java.patch +++ b/patches/minecraft/net/minecraft/server/dedicated/DedicatedServer.java.patch @@ -8,24 +8,7 @@ BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8)); String s1; -@@ -98,7 +99,9 @@ - field_155771_h.warn("To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar minecraft_server.jar\""); - } - -+ net.minecraftforge.fml.server.ServerModLoader.begin(this); - field_155771_h.info("Loading properties"); -+ this.field_71340_o.func_219033_a(properties -> ServerProperties.func_218985_a(java.nio.file.Paths.get("server.properties"))); - ServerProperties serverproperties = this.field_71340_o.func_219034_a(); - if (this.func_71264_H()) { - this.func_71189_e("127.0.0.1"); -@@ -153,17 +156,20 @@ - if (!PreYggdrasilConverter.func_219587_e(this)) { - return false; - } else { -+ net.minecraftforge.fml.server.ServerModLoader.end(); - this.func_184105_a(new DedicatedPlayerList(this, this.field_240767_f_, this.field_240766_e_)); - long i = Util.func_211178_c(); - this.func_71191_d(serverproperties.field_219026_t); +@@ -159,11 +160,13 @@ SkullTileEntity.func_184293_a(this.func_152358_ax()); SkullTileEntity.func_184294_a(this.func_147130_as()); PlayerProfileCache.func_187320_a(this.func_71266_T()); @@ -39,7 +22,7 @@ if (serverproperties.field_219027_u != null) { this.func_200252_aR().func_223585_a(GameRules.field_223620_w).func_223570_a(serverproperties.field_219027_u, this); } -@@ -189,11 +195,12 @@ +@@ -189,11 +192,12 @@ } Items.field_190931_a.func_150895_a(ItemGroup.field_78027_g, NonNullList.func_191196_a()); @@ -53,7 +36,7 @@ } } -@@ -506,6 +513,11 @@ +@@ -506,6 +510,11 @@ return false; } diff --git a/src/main/java/net/minecraftforge/fml/SidedProvider.java b/src/main/java/net/minecraftforge/fml/SidedProvider.java index ae744f3073..ecc16c7b9b 100644 --- a/src/main/java/net/minecraftforge/fml/SidedProvider.java +++ b/src/main/java/net/minecraftforge/fml/SidedProvider.java @@ -40,7 +40,7 @@ public enum SidedProvider ()-> { throw new UnsupportedOperationException(); }), SIDED_SETUP_EVENT( (Function, Function>)c-> mc->new FMLClientSetupEvent(c, mc), - s-> mc->new FMLDedicatedServerSetupEvent(s, mc), + s-> mc->new FMLDedicatedServerSetupEvent(mc), ()-> { throw new UnsupportedOperationException(); }), STRIPCHARS( (Function, Function>)c-> ClientHooks::stripSpecialChars, diff --git a/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLDedicatedServerSetupEvent.java b/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLDedicatedServerSetupEvent.java index d0039db1f0..dbc2801faf 100644 --- a/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLDedicatedServerSetupEvent.java +++ b/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLDedicatedServerSetupEvent.java @@ -36,20 +36,16 @@ import java.util.function.Supplier; * * Do dedicated server specific activities with this event. * + * This event is fired before construction of the dedicated server. Use {@link net.minecraftforge.fml.event.server.FMLServerAboutToStartEvent} + * or {@link net.minecraftforge.fml.event.server.FMLServerStartingEvent} to do stuff with the server, in both dedicated + * and integrated server contexts + * * This is a parallel dispatch event. */ public class FMLDedicatedServerSetupEvent extends ModLifecycleEvent { - private final Supplier serverSupplier; - - public FMLDedicatedServerSetupEvent(Supplier server, ModContainer container) + public FMLDedicatedServerSetupEvent(ModContainer container) { super(container); - this.serverSupplier = server; - } - - public Supplier getServerSupplier() - { - return serverSupplier; } } diff --git a/src/main/java/net/minecraftforge/fml/server/ServerLifecycleHooks.java b/src/main/java/net/minecraftforge/fml/server/ServerLifecycleHooks.java index c4125fcec9..3406a73616 100644 --- a/src/main/java/net/minecraftforge/fml/server/ServerLifecycleHooks.java +++ b/src/main/java/net/minecraftforge/fml/server/ServerLifecycleHooks.java @@ -31,7 +31,19 @@ import java.util.function.BiConsumer; import java.util.function.Consumer; import net.minecraft.resources.IPackNameDecorator; +import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.world.storage.FolderName; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.LogicalSidedProvider; +import net.minecraftforge.fml.ModLoader; +import net.minecraftforge.fml.ModLoadingStage; +import net.minecraftforge.fml.ModLoadingWarning; +import net.minecraftforge.fml.SidedProvider; +import net.minecraftforge.fml.network.ConnectionType; +import net.minecraftforge.fml.network.FMLNetworkConstants; +import net.minecraftforge.fml.network.FMLStatusPing; +import net.minecraftforge.fml.network.NetworkHooks; +import net.minecraftforge.fml.network.NetworkRegistry; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Marker; @@ -46,11 +58,6 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.util.text.StringTextComponent; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.LogicalSidedProvider; -import net.minecraftforge.fml.ModLoader; -import net.minecraftforge.fml.ModLoadingStage; -import net.minecraftforge.fml.ModLoadingWarning; import net.minecraftforge.fml.config.ConfigTracker; import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.event.server.FMLServerAboutToStartEvent; @@ -60,10 +67,6 @@ import net.minecraftforge.fml.event.server.FMLServerStoppedEvent; import net.minecraftforge.fml.event.server.FMLServerStoppingEvent; import net.minecraftforge.fml.loading.FileUtils; import net.minecraftforge.fml.loading.moddiscovery.ModFile; -import net.minecraftforge.fml.network.ConnectionType; -import net.minecraftforge.fml.network.FMLNetworkConstants; -import net.minecraftforge.fml.network.NetworkHooks; -import net.minecraftforge.fml.network.NetworkRegistry; import net.minecraftforge.fml.packs.ModFileResourcePack; import net.minecraftforge.fml.packs.ResourcePackLoader; import net.minecraftforge.forgespi.language.IModInfo; @@ -87,6 +90,9 @@ public class ServerLifecycleHooks public static boolean handleServerAboutToStart(final MinecraftServer server) { currentServer = server; + currentServer.getServerStatusResponse().setForgeData(new FMLStatusPing()); //gathers NetworkRegistry data + // on the dedi server we need to force the stuff to setup properly + DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, ()->()->SidedProvider.setServer(()->(DedicatedServer)server)); LogicalSidedProvider.setServer(()->server); ConfigTracker.INSTANCE.loadConfigs(ModConfig.Type.SERVER, getServerConfigPath(server)); return !MinecraftForge.EVENT_BUS.post(new FMLServerAboutToStartEvent(server)); diff --git a/src/main/java/net/minecraftforge/fml/server/ServerModLoader.java b/src/main/java/net/minecraftforge/fml/server/ServerModLoader.java index 07d773d4bb..a763da9711 100644 --- a/src/main/java/net/minecraftforge/fml/server/ServerModLoader.java +++ b/src/main/java/net/minecraftforge/fml/server/ServerModLoader.java @@ -19,10 +19,12 @@ package net.minecraftforge.fml.server; -import net.minecraft.server.dedicated.DedicatedServer; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.*; -import net.minecraftforge.fml.network.FMLStatusPing; +import net.minecraftforge.fml.LoadingFailedException; +import net.minecraftforge.fml.LogicalSidedProvider; +import net.minecraftforge.fml.ModLoader; +import net.minecraftforge.fml.ModLoadingWarning; +import net.minecraftforge.fml.SidedProvider; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -33,40 +35,19 @@ import static net.minecraftforge.fml.loading.LogMarkers.LOADING; public class ServerModLoader { private static final Logger LOGGER = LogManager.getLogger(); - private static DedicatedServer server; private static boolean hasErrors = false; - public static void gatherAndInit() { - LanguageHook.loadForgeAndMCLangs(); + public static void load() { SidedProvider.setServer(()-> { throw new IllegalStateException("Unable to access server yet"); }); LogicalSidedProvider.setServer(()-> { throw new IllegalStateException("Unable to access server yet"); }); + LanguageHook.loadForgeAndMCLangs(); try { ModLoader.get().gatherAndInitializeMods(() -> {}); - } catch (LoadingFailedException e) { - ServerModLoader.hasErrors = true; - throw e; - } - } - - public static void begin(DedicatedServer dedicatedServer) { - ServerModLoader.server = dedicatedServer; - SidedProvider.setServer(()->ServerModLoader.server); - LogicalSidedProvider.setServer(()->ServerModLoader.server); - try { ModLoader.get().loadMods(Runnable::run, (a)->{}, (a)->{}); - } catch (LoadingFailedException e) { - ServerModLoader.hasErrors = true; - throw e; - } - } - - - public static void end() { - try { ModLoader.get().finishMods(Runnable::run); } catch (LoadingFailedException e) { ServerModLoader.hasErrors = true; @@ -78,7 +59,6 @@ public class ServerModLoader warnings.forEach(warning -> LOGGER.warn(LOADING, warning.formatToString())); } MinecraftForge.EVENT_BUS.start(); - server.getServerStatusResponse().setForgeData(new FMLStatusPing()); //gathers NetworkRegistry data } public static boolean hasErrors() {