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);