From d46d24542fc53dbc83211f56bda7fa77a40322aa Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 18 Jun 2024 21:49:23 -0400 Subject: [PATCH] Update NeoForge, adjust dynamic resources for NF API --- .../dynamic_resources/ModelBakeryMixin.java | 36 +++++++++++++------ .../modernfix/duck/IExtendedModelBakery.java | 5 +++ gradle.properties | 2 +- .../ModelBakerImplMixin.java | 28 +++++++++++++++ .../resources/META-INF/neoforge.mods.toml | 2 +- 5 files changed, 60 insertions(+), 13 deletions(-) create mode 100644 neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/perf/dynamic_resources/ModelBakerImplMixin.java diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ModelBakeryMixin.java index e5b0b549..e54eaf8e 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -75,20 +75,34 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { private final Map mfix$emulatedBakedRegistry = new DynamicOverridableMap<>(this::loadBakedModelDynamic); - @Unique - private UnbakedModel loadUnbakedModelDynamic(ModelResourceLocation location) { + @Override + public UnbakedModel mfix$loadUnbakedModelDynamic(ModelResourceLocation location) { if(location.equals(MISSING_MODEL_VARIANT)) { return missingModel; } - if(DEBUG_MODEL_LOADS) { - ModernFix.LOGGER.info("Loading model {}", location); + modelBakeryLock.lock(); + try { + UnbakedModel existing = this.topLevelModels.get(location); + if (existing != null) { + return existing; + } + if(DEBUG_MODEL_LOADS) { + ModernFix.LOGGER.info("Loading model {}", location); + } + if(location.variant().equals("inventory")) { + this.loadItemModelAndDependencies(location.id()); + } else { + ((IBlockStateModelLoader)dynamicLoader).loadSpecificBlock(location); + } + return this.topLevelModels.getOrDefault(location, this.missingModel); + } finally { + modelBakeryLock.unlock(); } - if(location.variant().equals("inventory")) { - this.loadItemModelAndDependencies(location.id()); - } else { - ((IBlockStateModelLoader)dynamicLoader).loadSpecificBlock(location); - } - return this.topLevelModels.getOrDefault(location, this.missingModel); + } + + @Override + public UnbakedModel mfix$getMissingModel() { + return missingModel; } @Unique @@ -101,7 +115,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { try { model = bakedTopLevelModels.get(location); if(model == null) { - UnbakedModel prototype = loadUnbakedModelDynamic(location); + UnbakedModel prototype = mfix$loadUnbakedModelDynamic(location); prototype.resolveParents(this::getModel); if(DEBUG_MODEL_LOADS) { ModernFix.LOGGER.info("Baking model {}", location); 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 634418a1..cca44ea0 100644 --- a/common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBakery.java +++ b/common/src/main/java/org/embeddedt/modernfix/duck/IExtendedModelBakery.java @@ -1,6 +1,11 @@ package org.embeddedt.modernfix.duck; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.client.resources.model.UnbakedModel; + public interface IExtendedModelBakery { void mfix$tick(); void mfix$finishLoading(); + UnbakedModel mfix$loadUnbakedModelDynamic(ModelResourceLocation location); + UnbakedModel mfix$getMissingModel(); } diff --git a/gradle.properties b/gradle.properties index edb6a842..d84ef181 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ mixinextras_version=0.3.2 mod_id=modernfix minecraft_version=1.21 enabled_platforms=fabric,neoforge -forge_version=21.0.0-beta +forge_version=21.0.18-beta # parchment_version=2023.07.09 refined_storage_version=4392788 jei_version=16.0.0.28 diff --git a/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/perf/dynamic_resources/ModelBakerImplMixin.java b/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/perf/dynamic_resources/ModelBakerImplMixin.java new file mode 100644 index 00000000..2d71dbed --- /dev/null +++ b/neoforge/src/main/java/org/embeddedt/modernfix/neoforge/mixin/perf/dynamic_resources/ModelBakerImplMixin.java @@ -0,0 +1,28 @@ +package org.embeddedt.modernfix.neoforge.mixin.perf.dynamic_resources; + +import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.client.resources.model.UnbakedModel; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.duck.IExtendedModelBakery; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(targets = {"net/minecraft/client/resources/model/ModelBakery$ModelBakerImpl"}) +@ClientOnlyMixin +public class ModelBakerImplMixin { + @Shadow @Final private ModelBakery field_40571; + + /** + * @author embeddedt + * @reason Handle dynamic model loading + */ + @Overwrite(remap = false) + public UnbakedModel getTopLevelModel(ModelResourceLocation location) { + IExtendedModelBakery bakery = (IExtendedModelBakery)this.field_40571; + UnbakedModel model = bakery.mfix$loadUnbakedModelDynamic(location); + return model == bakery.mfix$getMissingModel() ? null : model; + } +} diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 70ff2739..68a7138b 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -47,7 +47,7 @@ modId = "neoforge" #mandatory # Does this dependency have to exist - if not, ordering below must be specified type = "required" #mandatory # The version range of the dependency -versionRange = "[21.0.0-alpha,)" #mandatory +versionRange = "[21.0.17-beta,)" #mandatory # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory ordering = "NONE" # Side this dependency is applied on - BOTH, CLIENT or SERVER