Fix registry progress bar on 1.21

This commit is contained in:
embeddedt 2024-07-27 13:33:08 -04:00
parent 1daea1f5e3
commit 631ad0528b
No known key found for this signature in database
GPG Key ID: A69433EC199B5613

View File

@ -3,52 +3,38 @@ package org.embeddedt.modernfix.neoforge.mixin.feature.registry_event_progress;
import net.neoforged.bus.api.Event; import net.neoforged.bus.api.Event;
import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.EventPriority;
import net.neoforged.fml.ModList; import net.neoforged.fml.ModList;
import net.neoforged.fml.ModLoader;
import net.neoforged.fml.ModLoadingContext; import net.neoforged.fml.ModLoadingContext;
import net.neoforged.fml.event.IModBusEvent; import net.neoforged.fml.event.IModBusEvent;
import net.neoforged.fml.loading.progress.StartupNotificationManager; import net.neoforged.fml.loading.progress.StartupNotificationManager;
import net.neoforged.neoforge.registries.GameData; import net.neoforged.neoforge.registries.GameData;
import net.neoforged.neoforge.registries.RegisterEvent; import net.neoforged.neoforge.registries.RegisterEvent;
import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
import org.embeddedt.modernfix.neoforge.util.AsyncLoadingScreen;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(value = GameData.class, remap = false) @Mixin(value = GameData.class, remap = false)
@ClientOnlyMixin @ClientOnlyMixin
public class GameDataMixin { public class GameDataMixin {
private static AsyncLoadingScreen mfix$asyncScreen;
@Inject(method = "postRegisterEvents", at = @At(value = "INVOKE", target = "Ljava/util/Set;iterator()Ljava/util/Iterator;", ordinal = 0))
private static void createAsyncScreen(CallbackInfo ci) {
mfix$asyncScreen = new AsyncLoadingScreen();
}
@Inject(method = "postRegisterEvents", at = @At(value = "INVOKE", target = "Ljava/lang/RuntimeException;getSuppressed()[Ljava/lang/Throwable;", ordinal = 0))
private static void closeAsyncScreen(CallbackInfo ci) {
mfix$asyncScreen.close();
mfix$asyncScreen = null;
}
@Redirect(method = "postRegisterEvents", at = @At(value = "INVOKE", target = "Lnet/neoforged/fml/ModLoader;postEventWrapContainerInModOrder(Lnet/neoforged/bus/api/Event;)V")) @Redirect(method = "postRegisterEvents", at = @At(value = "INVOKE", target = "Lnet/neoforged/fml/ModLoader;postEventWrapContainerInModOrder(Lnet/neoforged/bus/api/Event;)V"))
private static <T extends Event & IModBusEvent> void swapThreadAndPost(T event) { private static <T extends Event & IModBusEvent> void postWithProgressBar(T event) {
if(ModLoader.hasErrors()) {
return;
}
RegisterEvent registryEvent = (RegisterEvent)event; RegisterEvent registryEvent = (RegisterEvent)event;
// We control phases ourselves so we can make a separate progress bar for each phase. // We control phases ourselves so we can make a separate progress bar for each phase.
String registryName = registryEvent.getRegistryKey().location().toString(); String registryName = registryEvent.getRegistryKey().location().toString();
for(EventPriority phase : EventPriority.values()) { for(EventPriority phase : EventPriority.values()) {
var pb = StartupNotificationManager.addProgressBar(registryName, ModList.get().size()); // FIXME need to use prepend rather than append for it to be visible for now
var pb = StartupNotificationManager.prependProgressBar(registryName, ModList.get().size());
try { try {
ModList.get().forEachModInOrder(mc -> { ModList.get().forEachModInOrder(mc -> {
ModLoadingContext.get().setActiveContainer(mc); ModLoadingContext.get().setActiveContainer(mc);
pb.label(pb.name() + " - " + mc.getModInfo().getDisplayName()); pb.label(pb.name() + " - " + mc.getModInfo().getDisplayName());
pb.increment(); pb.increment();
var bus = mc.getEventBus(); mc.acceptEvent(phase, event);
if(bus != null) {
bus.post(phase, event);
}
ModLoadingContext.get().setActiveContainer(null); ModLoadingContext.get().setActiveContainer(null);
}); });
} finally { } finally {