Shut down all other mod handlers if the loading cycle errors.

This prevents other mods from throwing errors and being blamed for initial cause.
This is a temporary hack until cpw re-writes the mod event dispatcher.
This commit is contained in:
LexManos 2020-07-28 14:39:53 -07:00
parent 30bad1e26d
commit 7592bbe87e
3 changed files with 10 additions and 0 deletions

View File

@ -104,6 +104,7 @@ public abstract class ModContainer
*/
public final void transitionState(LifecycleEventProvider.LifecycleEvent event, Consumer<List<ModLoadingException>> errorHandler)
{
if (shutdown) return; //TODO: Remove
if (modLoadingStage == event.fromStage())
{
try
@ -165,4 +166,11 @@ public abstract class ModContainer
* @param e Event to accept
*/
protected void acceptEvent(Event e) {}
//TEMPORARY INTERNAL FUNCTION UNTIL net.minecraftforge.fml.ModList.dispatchParallelEvent is fixed.
@Deprecated protected boolean shutdown = false;
@Deprecated protected void shutdown()
{
this.shutdown = true;
}
}

View File

@ -141,6 +141,7 @@ public class ModList
catch (InterruptedException | ExecutionException e)
{
LOGGER.error(LOADING, "Encountered an exception during parallel processing - sleeping 10 seconds to wait for jobs to finish", e);
this.mods.forEach(ModContainer::shutdown); //Prevent all future events from being sent out.
errorHandler.accept(Collections.singletonList(new UncaughtModLoadingException(lifecycleEvent.fromStage(), e)));
modLoadingThreadPool.awaitQuiescence(10, TimeUnit.SECONDS);
if (!modLoadingThreadPool.isQuiescent()) {

View File

@ -171,6 +171,7 @@ public class FMLModContainer extends ModContainer
@Override
protected void acceptEvent(final Event e)
{
if (this.shutdown) return;
this.eventBus.post(e);
}