Automatically detect mods that need models baked in advance

This commit is contained in:
embeddedt 2023-02-12 10:25:58 -05:00
parent 02d9311040
commit 318afbe3bf
No known key found for this signature in database
GPG Key ID: A69433EC199B5613
2 changed files with 62 additions and 1 deletions

View File

@ -14,6 +14,12 @@ import net.minecraft.profiler.IProfiler;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.Util;
import net.minecraft.util.math.vector.TransformationMatrix;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.EventBus;
import net.minecraftforge.eventbus.api.EventListenerHelper;
import net.minecraftforge.eventbus.api.IEventListener;
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
import net.minecraftforge.fml.loading.progress.StartupMessageManager;
import org.apache.commons.lang3.tuple.Triple;
import org.apache.logging.log4j.Logger;
@ -22,6 +28,7 @@ import org.embeddedt.modernfix.ModernFixClient;
import org.embeddedt.modernfix.core.config.ModernFixConfig;
import org.embeddedt.modernfix.duck.IExtendedModelBakery;
import org.embeddedt.modernfix.models.LazyBakedModel;
import org.embeddedt.modernfix.util.ModUtil;
import org.spongepowered.asm.mixin.*;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@ -84,9 +91,11 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
this.atlasSet = new SpriteMap(this.atlasPreparations.values().stream().map(Pair::getFirst).collect(Collectors.toList()));
IBakedModel missingModel = this.bake(MISSING_MODEL_LOCATION, ModelRotation.X0_Y0);
this.bakedTopLevelModels.put(MISSING_MODEL_LOCATION, missingModel);
Collection<String> modsListening = ModUtil.findAllModsListeningToEvent(ModelBakeEvent.class);
LOGGER.debug("Found ModelBakeEvent listeners: [" + String.join(", ", modsListening) + "]");
Set<String> incompatibleLazyBakedModels = ImmutableSet.<String>builder()
.addAll(ModernFixConfig.MODELS_TO_BAKE.get())
.add("betterfoliage")
.addAll(modsListening)
.build();
/* First, bake any incompatible models ahead of time (for mods that have custom models) */
this.unbakedCache.keySet().forEach(location -> {

View File

@ -0,0 +1,52 @@
package org.embeddedt.modernfix.util;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.EventBus;
import net.minecraftforge.eventbus.api.EventListenerHelper;
import net.minecraftforge.eventbus.api.IEventListener;
import net.minecraftforge.fml.ModContainer;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.ModLoader;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.embeddedt.modernfix.ModernFix;
import java.util.*;
import java.util.function.Supplier;
public class ModUtil {
private static final Set<Class<?>> erroredContexts = new HashSet<>();
private static boolean busListensToEvent(EventBus bus, Class<?> eventClazz) {
try {
int busID = ObfuscationReflectionHelper.getPrivateValue(EventBus.class, bus, "busID");
return EventListenerHelper.getListenerList(eventClazz).getListeners(busID).length > 0;
} catch(Exception e) {
ModernFix.LOGGER.error(e);
return false;
}
}
public static Collection<String> findAllModsListeningToEvent(Class<?> eventClazz) {
Set<String> modsListening = new HashSet<>();
ModList.get().forEachModContainer((modId, container) -> {
Supplier<?> languageExtensionSupplier = ObfuscationReflectionHelper.getPrivateValue(ModContainer.class, container, "contextExtension");
Object context = languageExtensionSupplier.get();
if(context == null)
return;
if(context instanceof FMLJavaModLoadingContext) {
if(busListensToEvent((EventBus)((FMLJavaModLoadingContext) context).getModEventBus(), eventClazz)) {
modsListening.add(modId);
}
} else {
synchronized(erroredContexts) {
if(!erroredContexts.contains(context.getClass())) {
ModernFix.LOGGER.warn("Unknown modloading context: " + context.getClass().getName());
erroredContexts.add(context.getClass());
}
}
}
});
return modsListening;
}
}