Hopefully final fix for the 1.19.4 "missing model" bug on Fabric
This commit is contained in:
parent
4a9cd78d1d
commit
830eb19420
|
|
@ -76,23 +76,26 @@ public abstract class ModelBakerImplMixin {
|
||||||
ModernFix.LOGGER.info("Baking {}", arg);
|
ModernFix.LOGGER.info("Baking {}", arg);
|
||||||
IExtendedModelBakery extendedBakery = (IExtendedModelBakery)this.field_40571;
|
IExtendedModelBakery extendedBakery = (IExtendedModelBakery)this.field_40571;
|
||||||
if(arg instanceof ModelResourceLocation && arg != ModelBakery.MISSING_MODEL_LOCATION) {
|
if(arg instanceof ModelResourceLocation && arg != ModelBakery.MISSING_MODEL_LOCATION) {
|
||||||
/* to emulate vanilla model loading, treat as top-level */
|
// synchronized because we use topLevelModels
|
||||||
Optional<Block> blockOpt = Objects.equals(((ModelResourceLocation)arg).getVariant(), "inventory") ? Optional.empty() : BuiltInRegistries.BLOCK.getOptional(new ResourceLocation(arg.getNamespace(), arg.getPath()));
|
synchronized (this.field_40571) {
|
||||||
if(blockOpt.isPresent()) {
|
/* to emulate vanilla model loading, treat as top-level */
|
||||||
/* load via lambda for mods that expect blockstate to get loaded */
|
Optional<Block> blockOpt = Objects.equals(((ModelResourceLocation)arg).getVariant(), "inventory") ? Optional.empty() : BuiltInRegistries.BLOCK.getOptional(new ResourceLocation(arg.getNamespace(), arg.getPath()));
|
||||||
for(BlockState state : extendedBakery.getBlockStatesForMRL(blockOpt.get().getStateDefinition(), (ModelResourceLocation)arg)) {
|
if(blockOpt.isPresent()) {
|
||||||
try {
|
/* load via lambda for mods that expect blockstate to get loaded */
|
||||||
blockStateLoaderHandle.invokeExact(this.field_40571, state);
|
for(BlockState state : extendedBakery.getBlockStatesForMRL(blockOpt.get().getStateDefinition(), (ModelResourceLocation)arg)) {
|
||||||
} catch(Throwable e) {
|
try {
|
||||||
ModernFix.LOGGER.error("Error loading model", e);
|
blockStateLoaderHandle.invokeExact(this.field_40571, state);
|
||||||
|
} catch(Throwable e) {
|
||||||
|
ModernFix.LOGGER.error("Error loading model", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
this.field_40571.loadTopLevel((ModelResourceLocation)arg);
|
||||||
}
|
}
|
||||||
} else {
|
cir.setReturnValue(this.field_40571.topLevelModels.getOrDefault(arg, extendedBakery.mfix$getUnbakedMissingModel()));
|
||||||
this.field_40571.loadTopLevel((ModelResourceLocation)arg);
|
// 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
|
} else
|
||||||
cir.setReturnValue(this.field_40571.getModel(arg));
|
cir.setReturnValue(this.field_40571.getModel(arg));
|
||||||
UnbakedModel toReplace = cir.getReturnValue();
|
UnbakedModel toReplace = cir.getReturnValue();
|
||||||
|
|
@ -106,14 +109,14 @@ public abstract class ModelBakerImplMixin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cir.setReturnValue(toReplace);
|
cir.setReturnValue(toReplace);
|
||||||
|
cir.getReturnValue().resolveParents(this.field_40571::getModel);
|
||||||
|
capturedModel = cir.getReturnValue();
|
||||||
if(cir.getReturnValue() == extendedBakery.mfix$getUnbakedMissingModel()) {
|
if(cir.getReturnValue() == extendedBakery.mfix$getUnbakedMissingModel()) {
|
||||||
if(arg != ModelBakery.MISSING_MODEL_LOCATION && debugDynamicModelLoading)
|
if(arg != ModelBakery.MISSING_MODEL_LOCATION && debugDynamicModelLoading)
|
||||||
ModernFix.LOGGER.warn("Model {} not present", arg);
|
ModernFix.LOGGER.warn("Model {} not present", arg);
|
||||||
wasMissingModel = true;
|
wasMissingModel = true;
|
||||||
} else
|
} else
|
||||||
wasMissingModel = false; /* sometimes this runs more than once e.g. for recursive model baking */
|
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;"))
|
@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;"))
|
||||||
|
|
|
||||||
|
|
@ -110,11 +110,6 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
|
||||||
this.bakedTopLevelModels = new DynamicBakedModelProvider((ModelBakery)(Object)this, bakedCache);
|
this.bakedTopLevelModels = new DynamicBakedModelProvider((ModelBakery)(Object)this, bakedCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
|
||||||
private void stopIgnore(CallbackInfo ci) {
|
|
||||||
this.ignoreModelLoad = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private <K, V> void onModelRemoved(RemovalNotification<K, V> notification) {
|
private <K, V> void onModelRemoved(RemovalNotification<K, V> notification) {
|
||||||
if(!debugDynamicModelLoading)
|
if(!debugDynamicModelLoading)
|
||||||
return;
|
return;
|
||||||
|
|
@ -174,6 +169,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
|
||||||
|
|
||||||
@Inject(method = "bakeModels", at = @At("HEAD"))
|
@Inject(method = "bakeModels", at = @At("HEAD"))
|
||||||
private void captureGetter(BiFunction<ResourceLocation, Material, TextureAtlasSprite> getter, CallbackInfo ci) {
|
private void captureGetter(BiFunction<ResourceLocation, Material, TextureAtlasSprite> getter, CallbackInfo ci) {
|
||||||
|
this.ignoreModelLoad = false;
|
||||||
textureGetter = getter;
|
textureGetter = getter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user