diff --git a/build.gradle b/build.gradle index 22bee8c9..73059cc0 100644 --- a/build.gradle +++ b/build.gradle @@ -96,6 +96,7 @@ dependencies { modCompileOnly("dev.latvian.mods:kubejs-forge:${kubejs_version}") modRuntimeOnly("curse.maven:ferritecore-429235:4074294") modCompileOnly("team.chisel.ctm:CTM:${ctm_version}") + modCompileOnly("curse.maven:supermartijncore-454372:4455378") } tasks.withType(JavaCompile) { 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 e7666883..8bb5f32f 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -46,6 +46,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",