From 830eb19420931a2c550bde61e4523e7895c3f676 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 30 May 2023 11:18:27 -0400 Subject: [PATCH] Hopefully final fix for the 1.19.4 "missing model" bug on Fabric --- .../ModelBakerImplMixin.java | 35 ++++++++++--------- .../dynamic_resources/ModelBakeryMixin.java | 6 +--- 2 files changed, 20 insertions(+), 21 deletions(-) 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 22f450e6..c7cc45fb 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 @@ -76,23 +76,26 @@ public abstract class ModelBakerImplMixin { ModernFix.LOGGER.info("Baking {}", arg); IExtendedModelBakery extendedBakery = (IExtendedModelBakery)this.field_40571; if(arg instanceof ModelResourceLocation && arg != ModelBakery.MISSING_MODEL_LOCATION) { - /* to emulate vanilla model loading, treat as top-level */ - Optional blockOpt = Objects.equals(((ModelResourceLocation)arg).getVariant(), "inventory") ? Optional.empty() : BuiltInRegistries.BLOCK.getOptional(new ResourceLocation(arg.getNamespace(), arg.getPath())); - if(blockOpt.isPresent()) { - /* load via lambda for mods that expect blockstate to get loaded */ - for(BlockState state : extendedBakery.getBlockStatesForMRL(blockOpt.get().getStateDefinition(), (ModelResourceLocation)arg)) { - try { - blockStateLoaderHandle.invokeExact(this.field_40571, state); - } catch(Throwable e) { - ModernFix.LOGGER.error("Error loading model", e); + // synchronized because we use topLevelModels + synchronized (this.field_40571) { + /* to emulate vanilla model loading, treat as top-level */ + Optional blockOpt = Objects.equals(((ModelResourceLocation)arg).getVariant(), "inventory") ? Optional.empty() : BuiltInRegistries.BLOCK.getOptional(new ResourceLocation(arg.getNamespace(), arg.getPath())); + if(blockOpt.isPresent()) { + /* load via lambda for mods that expect blockstate to get loaded */ + for(BlockState state : extendedBakery.getBlockStatesForMRL(blockOpt.get().getStateDefinition(), (ModelResourceLocation)arg)) { + try { + blockStateLoaderHandle.invokeExact(this.field_40571, state); + } catch(Throwable e) { + ModernFix.LOGGER.error("Error loading model", e); + } } + } else { + this.field_40571.loadTopLevel((ModelResourceLocation)arg); } - } else { - this.field_40571.loadTopLevel((ModelResourceLocation)arg); + cir.setReturnValue(this.field_40571.topLevelModels.getOrDefault(arg, extendedBakery.mfix$getUnbakedMissingModel())); + // avoid leaks + this.field_40571.topLevelModels.clear(); } - cir.setReturnValue(this.field_40571.topLevelModels.getOrDefault(arg, extendedBakery.mfix$getUnbakedMissingModel())); - // avoid leaks - this.field_40571.topLevelModels.clear(); } else cir.setReturnValue(this.field_40571.getModel(arg)); UnbakedModel toReplace = cir.getReturnValue(); @@ -106,14 +109,14 @@ public abstract class ModelBakerImplMixin { } } cir.setReturnValue(toReplace); + 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); wasMissingModel = true; } else wasMissingModel = false; /* sometimes this runs more than once e.g. for recursive model baking */ - cir.getReturnValue().resolveParents(this.field_40571::getModel); - capturedModel = cir.getReturnValue(); } @ModifyVariable(method = "bake", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/client/resources/model/UnbakedModel;bake(Lnet/minecraft/client/resources/model/ModelBaker;Ljava/util/function/Function;Lnet/minecraft/client/resources/model/ModelState;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/client/resources/model/BakedModel;")) 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 f19e1863..36ef4dda 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 @@ -110,11 +110,6 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { this.bakedTopLevelModels = new DynamicBakedModelProvider((ModelBakery)(Object)this, bakedCache); } - @Inject(method = "", at = @At("RETURN")) - private void stopIgnore(CallbackInfo ci) { - this.ignoreModelLoad = false; - } - private void onModelRemoved(RemovalNotification notification) { if(!debugDynamicModelLoading) return; @@ -174,6 +169,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { @Inject(method = "bakeModels", at = @At("HEAD")) private void captureGetter(BiFunction getter, CallbackInfo ci) { + this.ignoreModelLoad = false; textureGetter = getter; }