From 17fdccddfed8773ac8d7827671a0bf8dd1f534de Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 2 Jan 2024 09:52:17 -0500 Subject: [PATCH] Allow missing models on item overrides Please ask your servers to stop shipping the client invalid model files. Related: #343 --- .../dynamic_resources/ItemOverridesMixin.java | 26 ++++++++++++++ .../modernfix/duck/IExtendedModelBaker.java | 3 +- .../ItemOverridesFabricMixin.java | 31 +++++++++++++++++ .../ModelBakerImplMixin.java | 6 ++-- .../dynamic_resources/ModelBakeryMixin.java | 2 +- .../ItemOverridesForgeMixin.java | 34 +++++++++++++++++++ .../ModelBakerImplMixin.java | 6 ++-- 7 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemOverridesMixin.java create mode 100644 fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ItemOverridesFabricMixin.java create mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ItemOverridesForgeMixin.java diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemOverridesMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemOverridesMixin.java new file mode 100644 index 00000000..5de98b42 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ItemOverridesMixin.java @@ -0,0 +1,26 @@ +package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.client.renderer.block.model.ItemOverrides; +import net.minecraft.client.resources.model.ModelBaker; +import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.resources.ResourceLocation; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.duck.IExtendedModelBaker; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(ItemOverrides.class) +@ClientOnlyMixin +public class ItemOverridesMixin { + @WrapOperation(method = "bakeModel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/ModelBaker;getModel(Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/resources/model/UnbakedModel;")) + private UnbakedModel preventThrowForMissing(ModelBaker instance, ResourceLocation resourceLocation, Operation original) { + boolean prevState = ((IExtendedModelBaker)instance).throwOnMissingModel(false); + try { + return original.call(instance, resourceLocation); + } finally { + ((IExtendedModelBaker)instance).throwOnMissingModel(prevState); + } + } +} diff --git a/common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBaker.java b/common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBaker.java index 5a26ed55..b50f65d4 100644 --- a/common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBaker.java +++ b/common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBaker.java @@ -3,6 +3,7 @@ package org.embeddedt.modernfix.duck; public interface IExtendedModelBaker { /** * Causes the ModelBaker to throw when it finds a missing model instead of proceeding with the bake. + * @return the previous value of this flag */ - void throwOnMissingModel(); + boolean throwOnMissingModel(boolean flag); } diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ItemOverridesFabricMixin.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ItemOverridesFabricMixin.java new file mode 100644 index 00000000..140f0737 --- /dev/null +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ItemOverridesFabricMixin.java @@ -0,0 +1,31 @@ +package org.embeddedt.modernfix.fabric.mixin.perf.dynamic_resources; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.client.renderer.block.model.ItemOverrides; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.ModelBaker; +import net.minecraft.client.resources.model.ModelState; +import net.minecraft.resources.ResourceLocation; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.duck.IExtendedModelBaker; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(ItemOverrides.class) +@ClientOnlyMixin +public class ItemOverridesFabricMixin { + /** + * @author embeddedt + * @reason servers insist on generating invalid item overrides that have missing models + */ + @WrapOperation(method = "bakeModel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/ModelBaker;bake(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/resources/model/ModelState;)Lnet/minecraft/client/resources/model/BakedModel;")) + private BakedModel bake(ModelBaker instance, ResourceLocation resourceLocation, ModelState modelState, Operation original) { + boolean prevState = ((IExtendedModelBaker)instance).throwOnMissingModel(false); + try { + return original.call(instance, resourceLocation, modelState); + } finally { + ((IExtendedModelBaker)instance).throwOnMissingModel(prevState); + } + } +} diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakerImplMixin.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakerImplMixin.java index 5d88e0ec..2324eda4 100644 --- a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakerImplMixin.java +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakerImplMixin.java @@ -59,8 +59,10 @@ public abstract class ModelBakerImplMixin implements IExtendedModelBaker { private boolean throwIfMissing; @Override - public void throwOnMissingModel() { - throwIfMissing = true; + public boolean throwOnMissingModel(boolean flag) { + boolean old = throwIfMissing; + throwIfMissing = flag; + return old; } @Inject(method = "getModel", at = @At("HEAD"), cancellable = true) 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 fd51fc97..39ac1fb3 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 @@ -310,7 +310,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { return m; ModelBakery self = (ModelBakery) (Object) this; ModelBaker theBaker = self.new ModelBakerImpl(textureGetter, modelLocation); - ((IExtendedModelBaker)theBaker).throwOnMissingModel(); + ((IExtendedModelBaker)theBaker).throwOnMissingModel(true); synchronized(this) { m = theBaker.bake(modelLocation, state); } if(m != null) loadedBakedModels.put(key, m); diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ItemOverridesForgeMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ItemOverridesForgeMixin.java new file mode 100644 index 00000000..12c35328 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ItemOverridesForgeMixin.java @@ -0,0 +1,34 @@ +package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.client.renderer.block.model.ItemOverrides; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.ModelBaker; +import net.minecraft.client.resources.model.ModelState; +import net.minecraft.resources.ResourceLocation; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.duck.IExtendedModelBaker; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.function.Function; + +@Mixin(ItemOverrides.class) +@ClientOnlyMixin +public class ItemOverridesForgeMixin { + /** + * @author embeddedt + * @reason servers insist on generating invalid item overrides that have missing models + */ + @WrapOperation(method = "bakeModel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/ModelBaker;bake(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/resources/model/ModelState;Ljava/util/function/Function;)Lnet/minecraft/client/resources/model/BakedModel;")) + private BakedModel bake(ModelBaker instance, ResourceLocation resourceLocation, ModelState modelState, Function spriteGetter, Operation original) { + boolean prevState = ((IExtendedModelBaker)instance).throwOnMissingModel(false); + try { + return original.call(instance, resourceLocation, modelState, spriteGetter); + } finally { + ((IExtendedModelBaker)instance).throwOnMissingModel(prevState); + } + } +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakerImplMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakerImplMixin.java index e55ffc39..11036e83 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakerImplMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakerImplMixin.java @@ -41,8 +41,10 @@ public abstract class ModelBakerImplMixin implements IModelBakerImpl, IExtendedM private boolean throwIfMissing; @Override - public void throwOnMissingModel() { - throwIfMissing = true; + public boolean throwOnMissingModel(boolean flag) { + boolean old = throwIfMissing; + throwIfMissing = flag; + return old; } @Inject(method = "getModel", at = @At("HEAD"), cancellable = true)