diff --git a/build.gradle b/build.gradle index c4d6480f..f5df1f37 100644 --- a/build.gradle +++ b/build.gradle @@ -102,6 +102,7 @@ dependencies { modCompileOnly("curse.maven:supermartijncore-454372:4455378") modCompileOnly("curse.maven:valhesiastructures-347488:3476252") modCompileOnly files("deps/starlight-1.2.jar") + modCompileOnly("appeng:appliedenergistics2:8.4.7") } tasks.withType(JavaCompile) { diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ae2/RegistrationMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ae2/RegistrationMixin.java new file mode 100644 index 00000000..a04946a8 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ae2/RegistrationMixin.java @@ -0,0 +1,58 @@ +package org.embeddedt.modernfix.mixin.perf.dynamic_resources.ae2; + +import appeng.bootstrap.components.IModelBakeComponent; +import appeng.bootstrap.components.ModelOverrideComponent; +import appeng.core.Api; +import appeng.core.AppEng; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; +import org.embeddedt.modernfix.ModernFix; +import org.embeddedt.modernfix.dynamicresources.DynamicModelBakeEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.lang.reflect.Field; +import java.util.Map; +import java.util.function.BiFunction; + +@Mixin(targets = { "appeng/core/Registration" }) +public class RegistrationMixin { + private static Field customizerField; + @Inject(method = "registerClientEvents", at = @At("TAIL"), remap = false) + private void doRegisterDynBake(CallbackInfo ci) { + MinecraftForge.EVENT_BUS.addListener(this::onDynamicModelBake); + customizerField = ObfuscationReflectionHelper.findField(ModelOverrideComponent.class, "customizer"); + } + + private void onDynamicModelBake(DynamicModelBakeEvent event) { + if (!event.getLocation().getNamespace().equals(AppEng.MOD_ID)) { + return; + } + BakedModel missing = event.getModelLoader().getBakedTopLevelModels().get(ModelBakery.MISSING_MODEL_LOCATION); + if(event.getModel() == missing) + return; + Api.INSTANCE.definitions().getRegistry().getBootstrapComponents(IModelBakeComponent.class).forEachRemaining(c -> { + if(c instanceof ModelOverrideComponent) + handleModelOverride((ModelOverrideComponent)c, event); + }); + } + + private void handleModelOverride(ModelOverrideComponent c, DynamicModelBakeEvent event) { + Map> customizer; + try { + customizer = (Map>)customizerField.get(c); + } catch(ReflectiveOperationException e) { + ModernFix.LOGGER.error("Can't replace model", e); + return; + } + BiFunction fn = customizer.get(event.getLocation().getPath()); + if(fn != null) { + event.setModel(fn.apply(event.getLocation(), event.getModel())); + } + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index 5be112b9..81f58eb4 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -86,6 +86,7 @@ "perf.dynamic_resources.BlockModelShaperMixin", "perf.dynamic_resources.ItemModelShaperMixin", "perf.dynamic_resources.ModelBakeryMixin", + "perf.dynamic_resources.ae2.RegistrationMixin", "perf.dynamic_resources.ctm.TextureMetadataHandlerMixin", "perf.dynamic_resources.ctm.CTMPackReloadListenerMixin", "perf.dynamic_resources.supermartijncore.ClientRegistrationHandlerMixin",