From 083664d858b8de6baa61e27744fbb313b2e3c5bf Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 12 Jul 2023 20:13:50 -0400 Subject: [PATCH 1/3] Support the new Fabric Model Loading API v1 --- fabric/build.gradle | 15 ++++++++++++++- .../LoaderInstanceMixin.java | 19 ------------------- .../dynamic_resources/ModelBakeryMixin.java | 8 ++++++++ 3 files changed, 22 insertions(+), 20 deletions(-) delete mode 100644 fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/LoaderInstanceMixin.java diff --git a/fabric/build.gradle b/fabric/build.gradle index bec736e5..8e839970 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -29,6 +29,18 @@ configurations { } } +// TODO remove + +repositories { + maven { + name = "Technici4n" + url = "https://raw.githubusercontent.com/Technici4n/Technici4n-maven/master/" + content { + includeGroup "net.fabricmc.fabric-api" + } + } +} + dependencies { modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" testImplementation "net.fabricmc:fabric-loader-junit:${rootProject.fabric_loader_version}" @@ -37,7 +49,8 @@ dependencies { modIncludeImplementation(fabricApi.module("fabric-lifecycle-events-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } modIncludeImplementation(fabricApi.module("fabric-screen-api-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } modIncludeImplementation(fabricApi.module("fabric-command-api-v2", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } - modIncludeImplementation(fabricApi.module("fabric-models-v0", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } + modImplementation("net.fabricmc.fabric-api:fabric-models-v0:0.42.42+db7ad43d77") { exclude group: 'net.fabricmc', module: 'fabric-loader' } + modIncludeImplementation("net.fabricmc.fabric-api:fabric-model-loading-api-v1:1.0.0+5544c20277") { exclude group: 'net.fabricmc', module: 'fabric-loader' } modImplementation(fabricApi.module("fabric-resource-loader-v0", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } modImplementation(fabricApi.module("fabric-data-generation-api-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } modImplementation("com.terraformersmc:modmenu:${rootProject.modmenu_version}") { transitive false } diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/LoaderInstanceMixin.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/LoaderInstanceMixin.java deleted file mode 100644 index 5ab99015..00000000 --- a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/LoaderInstanceMixin.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.embeddedt.modernfix.fabric.mixin.perf.dynamic_resources; - -import net.fabricmc.fabric.impl.client.model.ModelLoadingRegistryImpl; -import net.minecraft.client.resources.model.ModelBakery; -import org.embeddedt.modernfix.annotation.ClientOnlyMixin; -import org.embeddedt.modernfix.annotation.RequiresMod; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(ModelLoadingRegistryImpl.LoaderInstance.class) -@RequiresMod("fabric-models-v0") -@ClientOnlyMixin -public class LoaderInstanceMixin { - @Redirect(method = "finish", at = @At(value = "FIELD", target = "Lnet/fabricmc/fabric/impl/client/model/ModelLoadingRegistryImpl$LoaderInstance;loader:Lnet/minecraft/client/resources/model/ModelBakery;")) - private void keepLoader(ModelLoadingRegistryImpl.LoaderInstance instance, ModelBakery value) { - /* allow loading models to happen later */ - } -} \ No newline at end of file diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java index 5fc086a7..2128c949 100644 --- a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -20,6 +20,7 @@ import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration; import org.embeddedt.modernfix.duck.IExtendedModelBakery; import org.embeddedt.modernfix.dynamicresources.DynamicBakedModelProvider; import org.embeddedt.modernfix.dynamicresources.ModelBakeryHelpers; +import org.embeddedt.modernfix.util.CommonModUtil; import org.objectweb.asm.Opcodes; import org.slf4j.Logger; import org.spongepowered.asm.mixin.Final; @@ -34,6 +35,7 @@ import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import java.lang.reflect.Field; import java.util.*; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; @@ -79,6 +81,12 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { @Redirect(method = "", at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/client/resources/model/ModelBakery;blockColors:Lnet/minecraft/client/color/block/BlockColors;")) private void replaceTopLevelBakedModels(ModelBakery bakery, BlockColors val) { + // TODO remove terrible reflection hack + CommonModUtil.runWithoutCrash(() -> { + Field f = ModelBakery.class.getDeclaredField("fabric_guardGetOrLoadModel"); + f.setAccessible(true); + f.setInt((Object)this, -1000); + }, "reflection hack to remove recursion exception"); this.blockColors = val; this.ignoreModelLoad = true; this.loadedBakedModels = CacheBuilder.newBuilder() From 804cd047789750f6be465a394f0181949f503878 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 12 Jul 2023 20:37:53 -0400 Subject: [PATCH 2/3] Explicitly depend on fabric-model-loading-api-v1 so it gets JiJed --- fabric/src/main/resources/fabric.mod.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index c1c41291..0e54a3da 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -36,7 +36,7 @@ "fabric-lifecycle-events-v1": "*", "fabric-screen-api-v1": "*", "fabric-command-api-v2": "*", - "fabric-models-v0": "*", + "fabric-model-loading-api-v1": "*", "minecraft": ">=1.16.2" }, "breaks": { From ad1df59c1851bbbea3ec32210b52c5b78e63e22e Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Thu, 13 Jul 2023 11:52:23 -0400 Subject: [PATCH 3/3] Update --- fabric/build.gradle | 2 +- .../perf/dynamic_resources/ModelBakeryMixin.java | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/fabric/build.gradle b/fabric/build.gradle index 8e839970..077fdeb7 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -50,7 +50,7 @@ dependencies { modIncludeImplementation(fabricApi.module("fabric-screen-api-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } modIncludeImplementation(fabricApi.module("fabric-command-api-v2", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } modImplementation("net.fabricmc.fabric-api:fabric-models-v0:0.42.42+db7ad43d77") { exclude group: 'net.fabricmc', module: 'fabric-loader' } - modIncludeImplementation("net.fabricmc.fabric-api:fabric-model-loading-api-v1:1.0.0+5544c20277") { exclude group: 'net.fabricmc', module: 'fabric-loader' } + modIncludeImplementation("net.fabricmc.fabric-api:fabric-model-loading-api-v1:1.0.0+97993eed77") { exclude group: 'net.fabricmc', module: 'fabric-loader' } modImplementation(fabricApi.module("fabric-resource-loader-v0", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } modImplementation(fabricApi.module("fabric-data-generation-api-v1", rootProject.fabric_api_version)) { exclude group: 'net.fabricmc', module: 'fabric-loader' } modImplementation("com.terraformersmc:modmenu:${rootProject.modmenu_version}") { transitive false } diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java index 2128c949..ed026866 100644 --- a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -20,7 +20,6 @@ import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration; import org.embeddedt.modernfix.duck.IExtendedModelBakery; import org.embeddedt.modernfix.dynamicresources.DynamicBakedModelProvider; import org.embeddedt.modernfix.dynamicresources.ModelBakeryHelpers; -import org.embeddedt.modernfix.util.CommonModUtil; import org.objectweb.asm.Opcodes; import org.slf4j.Logger; import org.spongepowered.asm.mixin.Final; @@ -35,7 +34,6 @@ import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.lang.reflect.Field; import java.util.*; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; @@ -78,15 +76,15 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { private boolean ignoreModelLoad; + // disable fabric recursion + @SuppressWarnings("unused") + private boolean fabric_enableGetOrLoadModelGuard; + @Redirect(method = "", at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/client/resources/model/ModelBakery;blockColors:Lnet/minecraft/client/color/block/BlockColors;")) private void replaceTopLevelBakedModels(ModelBakery bakery, BlockColors val) { - // TODO remove terrible reflection hack - CommonModUtil.runWithoutCrash(() -> { - Field f = ModelBakery.class.getDeclaredField("fabric_guardGetOrLoadModel"); - f.setAccessible(true); - f.setInt((Object)this, -1000); - }, "reflection hack to remove recursion exception"); + // we can handle recursion in getModel without issues + fabric_enableGetOrLoadModelGuard = false; this.blockColors = val; this.ignoreModelLoad = true; this.loadedBakedModels = CacheBuilder.newBuilder()