From 7be382a3cedadf1665cf030ff2fbef5161ae7d5b Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Thu, 23 Nov 2023 10:14:48 -0500 Subject: [PATCH 1/3] More ClientOnlyMixin --- .../bugfix/world_screen_skipped/WorldSelectionListMixin.java | 2 ++ .../mixin/perf/cache_profile_texture_url/SkinManagerMixin.java | 2 ++ .../modernfix/fabric/mixin/safety/DynamicTextureMixin.java | 2 ++ .../extra_experimental_screen/CreateWorldScreenMixin.java | 2 ++ 4 files changed, 8 insertions(+) diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/world_screen_skipped/WorldSelectionListMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/world_screen_skipped/WorldSelectionListMixin.java index 27f67f7a..7d816acd 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/world_screen_skipped/WorldSelectionListMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/world_screen_skipped/WorldSelectionListMixin.java @@ -3,6 +3,7 @@ package org.embeddedt.modernfix.common.mixin.bugfix.world_screen_skipped; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.worldselection.CreateWorldScreen; import net.minecraft.client.gui.screens.worldselection.WorldSelectionList; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -11,6 +12,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(WorldSelectionList.WorldListEntry.class) +@ClientOnlyMixin public class WorldSelectionListMixin { @Shadow @Final private Minecraft minecraft; diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_profile_texture_url/SkinManagerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_profile_texture_url/SkinManagerMixin.java index 2b4047d6..2b2dd449 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_profile_texture_url/SkinManagerMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/cache_profile_texture_url/SkinManagerMixin.java @@ -4,6 +4,7 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.mojang.authlib.minecraft.MinecraftProfileTexture; import net.minecraft.client.resources.SkinManager; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -13,6 +14,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; @Mixin(SkinManager.class) +@ClientOnlyMixin public class SkinManagerMixin { @Unique private final Cache mfix$hashCache = CacheBuilder.newBuilder() diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/safety/DynamicTextureMixin.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/safety/DynamicTextureMixin.java index 5cc7f1ac..e120bc91 100644 --- a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/safety/DynamicTextureMixin.java +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/safety/DynamicTextureMixin.java @@ -3,6 +3,7 @@ package org.embeddedt.modernfix.fabric.mixin.safety; import com.mojang.blaze3d.platform.NativeImage; import net.minecraft.client.renderer.texture.DynamicTexture; import org.embeddedt.modernfix.ModernFix; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -11,6 +12,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(DynamicTexture.class) +@ClientOnlyMixin public class DynamicTextureMixin { @Shadow @Nullable private NativeImage pixels; diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/extra_experimental_screen/CreateWorldScreenMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/extra_experimental_screen/CreateWorldScreenMixin.java index f83a8e11..569a6ca1 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/extra_experimental_screen/CreateWorldScreenMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/extra_experimental_screen/CreateWorldScreenMixin.java @@ -4,11 +4,13 @@ import com.mojang.serialization.Lifecycle; import net.minecraft.client.gui.screens.worldselection.CreateWorldScreen; import net.minecraft.world.level.storage.PrimaryLevelData; import net.minecraft.world.level.storage.WorldData; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; @Mixin(CreateWorldScreen.class) +@ClientOnlyMixin public class CreateWorldScreenMixin { /** * Fix experimental world dialog still being shown the first time you reopen a world that was created From 2e9166c7df906d43b773a89afd66bb626eb97d88 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 27 Nov 2023 07:38:53 -0500 Subject: [PATCH 2/3] Rewrite missing model emulation functionality for 1.20+ dynres implementation Fixes #308 --- .../modernfix/duck/IExtendedModelBaker.java | 8 ++++++ .../modernfix/duck/IExtendedModelBakery.java | 2 -- .../ModelMissingException.java | 5 ++++ .../ModelBakerImplMixin.java | 26 ++++++++++++------- .../dynamic_resources/ModelBakeryMixin.java | 12 ++------- .../ModelBakerImplMixin.java | 19 +++++++++++--- .../dynamic_resources/ModelBakeryMixin.java | 2 ++ 7 files changed, 49 insertions(+), 25 deletions(-) create mode 100644 common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBaker.java create mode 100644 common/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelMissingException.java diff --git a/common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBaker.java b/common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBaker.java new file mode 100644 index 00000000..5a26ed55 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBaker.java @@ -0,0 +1,8 @@ +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. + */ + void throwOnMissingModel(); +} diff --git a/common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBakery.java b/common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBakery.java index 4cabb89b..b6fb8947 100644 --- a/common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBakery.java +++ b/common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBakery.java @@ -13,7 +13,5 @@ import net.minecraft.world.level.block.state.StateDefinition; public interface IExtendedModelBakery { ImmutableList getBlockStatesForMRL(StateDefinition stateDefinition, ModelResourceLocation location); BakedModel bakeDefault(ResourceLocation modelLocation, ModelState state); - BakedModel getBakedMissingModel(); - void setBakedMissingModel(BakedModel m); UnbakedModel mfix$getUnbakedMissingModel(); } diff --git a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelMissingException.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelMissingException.java new file mode 100644 index 00000000..a8a881b7 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/ModelMissingException.java @@ -0,0 +1,5 @@ +package org.embeddedt.modernfix.dynamicresources; + +public class ModelMissingException extends RuntimeException { + +} 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 f5c15b18..99d881d7 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 @@ -10,8 +10,10 @@ import net.minecraft.world.level.block.state.BlockState; import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.ModernFixClient; import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration; +import org.embeddedt.modernfix.duck.IExtendedModelBaker; import org.embeddedt.modernfix.duck.IExtendedModelBakery; import org.embeddedt.modernfix.dynamicresources.DynamicBakedModelProvider; +import org.embeddedt.modernfix.dynamicresources.ModelMissingException; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -27,7 +29,7 @@ import java.util.Optional; import java.util.function.Function; @Mixin(value = ModelBakery.ModelBakerImpl.class, priority = 600) -public abstract class ModelBakerImplMixin { +public abstract class ModelBakerImplMixin implements IExtendedModelBaker { private static final boolean debugDynamicModelLoading = Boolean.getBoolean("modernfix.debugDynamicModelLoading"); @Shadow @Final private ModelBakery field_40571; @@ -52,17 +54,17 @@ public abstract class ModelBakerImplMixin { } } - private void createBakedMissingModelIfNeeded(IExtendedModelBakery extendedBakery, UnbakedModel iunbakedmodel, ModelState arg2, ResourceLocation arg) { - if(extendedBakery.getBakedMissingModel() == null) { - extendedBakery.setBakedMissingModel(iunbakedmodel.bake((ModelBaker)this, this.modelTextureGetter, arg2, arg)); - ((DynamicBakedModelProvider)this.field_40571.getBakedTopLevelModels()).setMissingModel(extendedBakery.getBakedMissingModel()); - } - } - private ResourceLocation capturedLocation; private UnbakedModel capturedModel; private ModelState capturedState; + private boolean throwIfMissing; + + @Override + public void throwOnMissingModel() { + throwIfMissing = true; + } + @Inject(method = "bake", at = @At("HEAD")) private void captureState(ResourceLocation rl, ModelState state, CallbackInfoReturnable cir) { capturedState = state; @@ -111,8 +113,12 @@ public abstract class ModelBakerImplMixin { cir.getReturnValue().resolveParents(this.field_40571::getModel); capturedModel = cir.getReturnValue(); if(cir.getReturnValue() == extendedBakery.mfix$getUnbakedMissingModel()) { - if(arg != ModelBakery.MISSING_MODEL_LOCATION && debugDynamicModelLoading) - ModernFix.LOGGER.warn("Model {} not present", arg); + if(arg != ModelBakery.MISSING_MODEL_LOCATION) { + if(debugDynamicModelLoading) + ModernFix.LOGGER.warn("Model {} not present", arg); + if(throwIfMissing) + throw new ModelMissingException(); + } } } 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 a43c58b8..fd51fc97 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 @@ -18,6 +18,7 @@ import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.ModernFixClient; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration; +import org.embeddedt.modernfix.duck.IExtendedModelBaker; import org.embeddedt.modernfix.duck.IExtendedModelBakery; import org.embeddedt.modernfix.dynamicresources.DynamicBakedModelProvider; import org.embeddedt.modernfix.dynamicresources.ModelBakeryHelpers; @@ -309,6 +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(); synchronized(this) { m = theBaker.bake(modelLocation, state); } if(m != null) loadedBakedModels.put(key, m); @@ -320,16 +322,6 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { return loadOnlyRelevantBlockState(stateDefinition, location); } - private BakedModel bakedMissingModel = null; - - public void setBakedMissingModel(BakedModel m) { - bakedMissingModel = m; - } - - public BakedModel getBakedMissingModel() { - return bakedMissingModel; - } - public UnbakedModel mfix$getUnbakedMissingModel() { return missingModel; } 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 3ef54682..7b68311a 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 @@ -7,7 +7,9 @@ import net.minecraft.resources.ResourceLocation; import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.ModernFixClient; import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration; +import org.embeddedt.modernfix.duck.IExtendedModelBaker; import org.embeddedt.modernfix.duck.IExtendedModelBakery; +import org.embeddedt.modernfix.dynamicresources.ModelMissingException; import org.embeddedt.modernfix.forge.dynresources.IModelBakerImpl; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -19,7 +21,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.function.Function; @Mixin(value = ModelBakery.ModelBakerImpl.class, priority = 600) -public abstract class ModelBakerImplMixin implements IModelBakerImpl { +public abstract class ModelBakerImplMixin implements IModelBakerImpl, IExtendedModelBaker { private static final boolean debugDynamicModelLoading = Boolean.getBoolean("modernfix.debugDynamicModelLoading"); @Shadow @Final private ModelBakery field_40571; @@ -36,6 +38,13 @@ public abstract class ModelBakerImplMixin implements IModelBakerImpl { private UnbakedModel capturedModel; private ModelState capturedState; + private boolean throwIfMissing; + + @Override + public void throwOnMissingModel() { + throwIfMissing = true; + } + @Inject(method = "bake(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/resources/model/ModelState;Ljava/util/function/Function;)Lnet/minecraft/client/resources/model/BakedModel;", at = @At("HEAD"), remap = false) private void captureState(ResourceLocation arg, ModelState state, Function sprites, CallbackInfoReturnable cir) { capturedState = state; @@ -71,8 +80,12 @@ public abstract class ModelBakerImplMixin implements IModelBakerImpl { cir.getReturnValue().resolveParents(this.field_40571::getModel); capturedModel = cir.getReturnValue(); if(cir.getReturnValue() == extendedBakery.mfix$getUnbakedMissingModel()) { - if(arg != ModelBakery.MISSING_MODEL_LOCATION && debugDynamicModelLoading) - ModernFix.LOGGER.warn("Model {} not present", arg); + if(arg != ModelBakery.MISSING_MODEL_LOCATION) { + if(debugDynamicModelLoading) + ModernFix.LOGGER.warn("Model {} not present", arg); + if(throwIfMissing) + throw new ModelMissingException(); + } } } diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java index efc88cd8..2f36b941 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -18,6 +18,7 @@ import net.minecraft.world.level.block.state.properties.Property; import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.ModernFixClient; import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration; +import org.embeddedt.modernfix.duck.IExtendedModelBaker; import org.embeddedt.modernfix.dynamicresources.DynamicBakedModelProvider; import org.embeddedt.modernfix.duck.IExtendedModelBakery; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; @@ -315,6 +316,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { return m; ModelBakery self = (ModelBakery) (Object) this; ModelBaker theBaker = self.new ModelBakerImpl(textureGetter, modelLocation); + ((IExtendedModelBaker)theBaker).throwOnMissingModel(); synchronized(this) { m = theBaker.bake(modelLocation, state, theBaker.getModelTextureGetter()); } if(m != null) loadedBakedModels.put(key, m); From 2c577da8fda7e3973d0bb582379df889aa6b0a97 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 27 Nov 2023 07:41:43 -0500 Subject: [PATCH 3/3] Spotless --- .../fabric/mixin/perf/dynamic_resources/ModelBakerImplMixin.java | 1 - 1 file changed, 1 deletion(-) 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 99d881d7..54eadc7e 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 @@ -12,7 +12,6 @@ import org.embeddedt.modernfix.ModernFixClient; import org.embeddedt.modernfix.api.entrypoint.ModernFixClientIntegration; import org.embeddedt.modernfix.duck.IExtendedModelBaker; import org.embeddedt.modernfix.duck.IExtendedModelBakery; -import org.embeddedt.modernfix.dynamicresources.DynamicBakedModelProvider; import org.embeddedt.modernfix.dynamicresources.ModelMissingException; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin;