diff --git a/build.gradle b/build.gradle index a5137485..8da9a28b 100644 --- a/build.gradle +++ b/build.gradle @@ -95,6 +95,7 @@ dependencies { modCompileOnly("dev.latvian.mods:kubejs-forge:${kubejs_version}") modRuntimeOnly("curse.maven:ferritecore-429235:4117906") modCompileOnly("team.chisel.ctm:CTM:${ctm_version}") + modCompileOnly("curse.maven:supermartijncore-454372:4455384") } tasks.withType(JavaCompile) { diff --git a/src/main/java/org/embeddedt/modernfix/entity/EntityDataIDSyncHandler.java b/src/main/java/org/embeddedt/modernfix/entity/EntityDataIDSyncHandler.java index 7be0a5ff..ae97f71d 100644 --- a/src/main/java/org/embeddedt/modernfix/entity/EntityDataIDSyncHandler.java +++ b/src/main/java/org/embeddedt/modernfix/entity/EntityDataIDSyncHandler.java @@ -42,19 +42,23 @@ public class EntityDataIDSyncHandler { List fieldsToSync = new ArrayList<>(); for(Class eClass : entityPoolMap.keySet()) { fieldsToSync.clear(); - Field[] classFields = eClass.getDeclaredFields(); - for(Field field : classFields) { - if(!Modifier.isStatic(field.getModifiers())) - continue; - field.setAccessible(true); - Object o = field.get(null); - if(o != null && EntityDataAccessor.class.isAssignableFrom(o.getClass())) { - fieldsToSync.add(field); + try { + Field[] classFields = eClass.getDeclaredFields(); + for(Field field : classFields) { + if(!Modifier.isStatic(field.getModifiers())) + continue; + field.setAccessible(true); + Object o = field.get(null); + if(o != null && EntityDataAccessor.class.isAssignableFrom(o.getClass())) { + fieldsToSync.add(field); + } } - } - for(Field field : fieldsToSync) { - int id = ((EntityDataAccessor)field.get(null)).id; - fieldsToSyncMap.computeIfAbsent(eClass, k -> new ArrayList<>()).add(Pair.of(field.getName(), id)); + for(Field field : fieldsToSync) { + int id = ((EntityDataAccessor)field.get(null)).id; + fieldsToSyncMap.computeIfAbsent(eClass, k -> new ArrayList<>()).add(Pair.of(field.getName(), id)); + } + } catch(Throwable e) { + ModernFix.LOGGER.error("Skipping entity ID sync for {}: {}", eClass.getName(), e); } } } diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/supermartijncore/ClientRegistrationHandlerMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/supermartijncore/ClientRegistrationHandlerMixin.java new file mode 100644 index 00000000..807f91a2 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/supermartijncore/ClientRegistrationHandlerMixin.java @@ -0,0 +1,56 @@ +package org.embeddedt.modernfix.mixin.perf.dynamic_resources.supermartijncore; + +import com.supermartijn642.core.registry.ClientRegistrationHandler; +import com.supermartijn642.core.util.Pair; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import org.embeddedt.modernfix.dynamicresources.DynamicModelBakeEvent; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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.callback.CallbackInfo; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Stream; + +@Mixin(ClientRegistrationHandler.class) +public class ClientRegistrationHandlerMixin { + @Shadow @Final private List>, Function>> modelOverwrites; + + private Map> modelOverwritesByLocation = new Object2ObjectOpenHashMap<>(); + + @Redirect(method = "handleModelBakeEvent", at = @At(value = "FIELD", target = "Lcom/supermartijn642/core/registry/ClientRegistrationHandler;modelOverwrites:Ljava/util/List;"), remap = false) + private List skipModelOverwrites(ClientRegistrationHandler h) { + modelOverwritesByLocation.clear(); + for(Pair>, Function> pair : this.modelOverwrites) { + Stream locationStream = pair.left().get(); + Function swapper = pair.right(); + locationStream.forEach(l -> { + modelOverwritesByLocation.put(l, swapper); + }); + } + return Collections.emptyList(); + } + + @Inject(method = "", at = @At("RETURN")) + private void registerDynBake(String modid, CallbackInfo ci) { + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onDynamicModelBake); + } + + @SubscribeEvent + public void onDynamicModelBake(DynamicModelBakeEvent event) { + Function replacer = modelOverwritesByLocation.get(event.getLocation()); + if(replacer != null) + event.setModel(replacer.apply(event.getModel())); + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index 97e8fa1d..3b6ac872 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -45,6 +45,7 @@ "perf.dynamic_resources.ModelBakeryMixin", "perf.dynamic_resources.ctm.TextureMetadataHandlerMixin", "perf.dynamic_resources.ctm.CTMPackReloadListenerMixin", + "perf.dynamic_resources.supermartijncore.ClientRegistrationHandlerMixin", "perf.model_optimizations.OBJLoaderMixin", "perf.model_optimizations.SelectorMixin", "perf.model_optimizations.TransformationMatrixMixin",