diff --git a/src/main/java/cpw/mods/fml/client/FMLClientHandler.java b/src/main/java/cpw/mods/fml/client/FMLClientHandler.java index b335954..949d92e 100644 --- a/src/main/java/cpw/mods/fml/client/FMLClientHandler.java +++ b/src/main/java/cpw/mods/fml/client/FMLClientHandler.java @@ -234,6 +234,20 @@ client.refreshResources(); } + try + { + Loader.instance().preinitializeMods(); + } + catch (CustomModLoadingErrorDisplayException custom) + { + FMLLog.log(Level.ERROR, custom, "A custom exception was thrown by a mod, the game will now halt"); + customError = custom; + } + catch (LoaderException le) + { + haltGame("There was a severe problem during mod loading that has caused the game to fail", le); + return; + } Map> sharedModList = (Map>) Launch.blackboard.get("modList"); if (sharedModList == null) { @@ -285,8 +299,7 @@ return; } - // Reload resources has to happen early, or minecraft itself has resource loading issues - // This is a second refresh for mods that register stuff late! + // Reload resources client.refreshResources(); RenderingRegistry.instance().loadEntityRenderers((Map, Render>)RenderManager.instance.entityRenderMap); guiFactories = HashBiMap.create(); @@ -812,7 +825,7 @@ public void setPlayClient(NetHandlerPlayClient netHandlerPlayClient) { playClientBlock.countDown(); - this.currentPlayClient = new WeakReference(netHandlerPlayClient); + this.currentPlayClient = new WeakReference(netHandlerPlayClient); } @Override @@ -836,6 +849,7 @@ { if (side == Side.CLIENT) { + waitForPlayClient(); bus.post(new FMLNetworkEvent.CustomPacketRegistrationEvent(manager, channelSet, channel, side, NetHandlerPlayClient.class)); } else diff --git a/src/main/java/cpw/mods/fml/common/Loader.java b/src/main/java/cpw/mods/fml/common/Loader.java index a0b522d..493fdf0 100644 --- a/src/main/java/cpw/mods/fml/common/Loader.java +++ b/src/main/java/cpw/mods/fml/common/Loader.java @@ -148,6 +148,7 @@ private static List injectedContainers; private ImmutableMap fmlBrandingProperties; private File forcedModFile; + private ModDiscoverer discoverer; public static Loader instance() { @@ -462,15 +463,15 @@ namedMods = Maps.newHashMap(); modController = new LoadController(this); modController.transition(LoaderState.LOADING, false); - ModDiscoverer disc = identifyMods(); - ModAPIManager.INSTANCE.manageAPI(modClassLoader, disc); + discoverer = identifyMods(); + ModAPIManager.INSTANCE.manageAPI(modClassLoader, discoverer); disableRequestedMods(); modController.distributeStateMessage(FMLLoadEvent.class); sortModList(); ModAPIManager.INSTANCE.cleanupAPIContainers(modController.getActiveModList()); ModAPIManager.INSTANCE.cleanupAPIContainers(mods); mods = ImmutableList.copyOf(mods); - for (File nonMod : disc.getNonModLibs()) + for (File nonMod : discoverer.getNonModLibs()) { if (nonMod.isFile()) { @@ -486,7 +487,7 @@ } } modController.transition(LoaderState.CONSTRUCTING, false); - modController.distributeStateMessage(LoaderState.CONSTRUCTING, modClassLoader, disc.getASMTable(), reverseDependencies); + modController.distributeStateMessage(LoaderState.CONSTRUCTING, modClassLoader, discoverer.getASMTable(), reverseDependencies); FMLLog.fine("Mod signature data"); for (ModContainer mod : getActiveModList()) { @@ -497,7 +498,16 @@ FMLLog.fine("No user mod signature data found"); } modController.transition(LoaderState.PREINITIALIZATION, false); - modController.distributeStateMessage(LoaderState.PREINITIALIZATION, disc.getASMTable(), canonicalConfigDir); + } + + public void preinitializeMods() + { + if (!modController.isInState(LoaderState.PREINITIALIZATION)) + { + FMLLog.warning("There were errors previously. Not beginning mod initialization phase"); + return; + } + modController.distributeStateMessage(LoaderState.PREINITIALIZATION, discoverer.getASMTable(), canonicalConfigDir); modController.transition(LoaderState.INITIALIZATION, false); } diff --git a/src/main/java/cpw/mods/fml/common/network/FMLIndexedMessageToMessageCodec.java b/src/main/java/cpw/mods/fml/common/network/FMLIndexedMessageToMessageCodec.java index bb0a405..07d1670 100644 --- a/src/main/java/cpw/mods/fml/common/network/FMLIndexedMessageToMessageCodec.java +++ b/src/main/java/cpw/mods/fml/common/network/FMLIndexedMessageToMessageCodec.java @@ -73,7 +73,7 @@ throw new NullPointerException("Undefined message for discriminator " + discriminator + " in channel " + msg.channel()); } A newMsg = clazz.newInstance(); - ctx.attr(INBOUNDPACKETTRACKER).get().set(new WeakReference(msg)); + ctx.attr(INBOUNDPACKETTRACKER).get().set(new WeakReference(msg)); decodeInto(ctx, payload.slice(), newMsg); out.add(newMsg); } diff --git a/src/main/java/cpw/mods/fml/common/network/handshake/NetworkDispatcher.java b/src/main/java/cpw/mods/fml/common/network/handshake/NetworkDispatcher.java index 1c4def8..274c0a0 100644 --- a/src/main/java/cpw/mods/fml/common/network/handshake/NetworkDispatcher.java +++ b/src/main/java/cpw/mods/fml/common/network/handshake/NetworkDispatcher.java @@ -31,7 +31,6 @@ import net.minecraft.util.ChatComponentText; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.FMLLog; -import cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec; import cpw.mods.fml.common.network.FMLNetworkEvent; import cpw.mods.fml.common.network.FMLNetworkException; import cpw.mods.fml.common.network.FMLOutboundHandler; @@ -230,14 +229,21 @@ private void kickWithMessage(String message) { final ChatComponentText chatcomponenttext = new ChatComponentText(message); - manager.scheduleOutboundPacket(new S40PacketDisconnect(chatcomponenttext), new GenericFutureListener>() + if (side == Side.CLIENT) { - @Override - public void operationComplete(Future result) + manager.closeChannel(chatcomponenttext); + } + else + { + manager.scheduleOutboundPacket(new S40PacketDisconnect(chatcomponenttext), new GenericFutureListener>() { - manager.closeChannel(chatcomponenttext); - } - }); + @Override + public void operationComplete(Future result) + { + manager.closeChannel(chatcomponenttext); + } + }); + } manager.channel().config().setAutoRead(false); } @@ -448,6 +454,7 @@ public void abortClientHandshake(String type) { + FMLCommonHandler.instance().waitForPlayClient(); completeClientSideConnection(ConnectionType.valueOf(type)); } @@ -462,7 +469,7 @@ super.exceptionCaught(ctx, cause); } - // if we add any attributes, we should force removal of them here so that + // if we add any attributes, we should force removal of them here so that //they do not hold references to the world and causes it to leak. private void cleanAttributes(ChannelHandlerContext ctx) { diff --git a/src/main/java/cpw/mods/fml/common/network/internal/NetworkModHolder.java b/src/main/java/cpw/mods/fml/common/network/internal/NetworkModHolder.java index 4ee6714..fa426d1 100644 --- a/src/main/java/cpw/mods/fml/common/network/internal/NetworkModHolder.java +++ b/src/main/java/cpw/mods/fml/common/network/internal/NetworkModHolder.java @@ -54,7 +54,7 @@ @Override public boolean check(Map remoteVersions, Side side) { - return remoteVersions.containsKey(container.getModId()) ? acceptVersion(remoteVersions.get(container.getModId())) : false; + return remoteVersions.containsKey(container.getModId()) ? acceptVersion(remoteVersions.get(container.getModId())) : side == Side.SERVER; } @Override public String toString() diff --git a/src/main/java/cpw/mods/fml/server/FMLServerHandler.java b/src/main/java/cpw/mods/fml/server/FMLServerHandler.java index 8365ca3..7057c96 100644 --- a/src/main/java/cpw/mods/fml/server/FMLServerHandler.java +++ b/src/main/java/cpw/mods/fml/server/FMLServerHandler.java @@ -85,6 +85,7 @@ { server = minecraftServer; Loader.instance().loadMods(); + Loader.instance().preinitializeMods(); } /** @@ -177,8 +178,7 @@ // rudimentary command processing, check for fml confirm/cancel and stop commands synchronized (dedServer.pendingCommandList) { - - for (Iterator it = GenericIterableFactory.newCastingIterable(dedServer.pendingCommandList, ServerCommand.class).iterator(); it.hasNext();) + for (Iterator it = GenericIterableFactory.newCastingIterable(dedServer.pendingCommandList, ServerCommand.class).iterator(); it.hasNext(); ) { String cmd = it.next().command.trim().toLowerCase(); diff --git a/src/main/resources/fmlversion.properties b/src/main/resources/fmlversion.properties index 90abe1c..517da03 100644 --- a/src/main/resources/fmlversion.properties +++ b/src/main/resources/fmlversion.properties @@ -1,6 +1,6 @@ fmlbuild.major.number=7 fmlbuild.minor.number=2 -fmlbuild.revision.number=172 -fmlbuild.build.number=33 +fmlbuild.revision.number=188 +fmlbuild.build.number=34 fmlbuild.mcversion=1.7.2 fmlbuild.mcpversion=9.03