From 37cb92a64f897423bab9fdf77ddc519fefc75589 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 8 Feb 2025 11:40:00 -0500 Subject: [PATCH] Add PreparableModelLoadingPlugin support Related: #522 --- .../DynamicModelProvider.java | 2 +- .../FabricDynamicModelHandler.java | 31 ++++++++++++++++--- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelProvider.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelProvider.java index d0cadc59..91d05577 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelProvider.java +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelProvider.java @@ -137,7 +137,7 @@ public class DynamicModelProvider { this.missingItemModel = new MissingItemModel(this.missingModel); try { Class.forName("net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin"); - pluginList.add(new FabricDynamicModelHandler(this)); + pluginList.add(new FabricDynamicModelHandler(this, this.resourceManager)); } catch(Exception ignored) { // Fabric API likely not present } diff --git a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/FabricDynamicModelHandler.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/FabricDynamicModelHandler.java index 590eb540..c44d5267 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/FabricDynamicModelHandler.java +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/FabricDynamicModelHandler.java @@ -3,6 +3,7 @@ package org.embeddedt.modernfix.dynamicresources; import net.fabricmc.fabric.api.client.model.loading.v1.BlockStateResolver; import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; import net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier; +import net.fabricmc.fabric.api.client.model.loading.v1.PreparableModelLoadingPlugin; import net.fabricmc.fabric.api.event.Event; import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.client.renderer.block.BlockModelShaper; @@ -13,19 +14,20 @@ import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.client.resources.model.ModelState; import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import org.embeddedt.modernfix.ModernFix; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.concurrent.CompletableFuture; public class FabricDynamicModelHandler implements DynamicModelProvider.DynamicModelPlugin { - private final List pluginList; - // Borrowed from Fabric API, this dispatching logic is extremely trivial private static final ResourceLocation[] MODEL_MODIFIER_PHASES = new ResourceLocation[] { ModelModifier.OVERRIDE_PHASE, ModelModifier.DEFAULT_PHASE, ModelModifier.WRAP_PHASE, ModelModifier.WRAP_LAST_PHASE }; @@ -99,12 +101,31 @@ public class FabricDynamicModelHandler implements DynamicModelProvider.DynamicMo return model; }, MODEL_MODIFIER_PHASES); - public FabricDynamicModelHandler(DynamicModelProvider provider) { - this.pluginList = ModelLoadingPlugin.getAll(); + record PreparablePluginData(CompletableFuture data, PreparableModelLoadingPlugin.Holder plugin) { + void initialize(ModelLoadingPlugin.Context context) { + plugin.plugin().initialize(data.join(), context); + } + } + + private PreparablePluginData makeDataRecord(ResourceManager manager, PreparableModelLoadingPlugin.Holder holder) { + return new PreparablePluginData<>(holder.loader().load(manager, ModernFix.resourceReloadExecutor()), holder); + } + + public FabricDynamicModelHandler(DynamicModelProvider provider, ResourceManager manager) { + List pluginList = new ArrayList<>(ModelLoadingPlugin.getAll()); + var preparablePluginData = new ArrayList>(); + for (var holder : PreparableModelLoadingPlugin.getAll()) { + preparablePluginData.add(makeDataRecord(manager, holder)); + } + // Wait for all the preparable plugins to finish loading + CompletableFuture.allOf(preparablePluginData.stream().map(PreparablePluginData::data).toArray(CompletableFuture[]::new)).join(); var context = new PluginContext(provider); - for (var plugin : this.pluginList) { + for (var plugin : pluginList) { plugin.initialize(context); } + for (var data : preparablePluginData) { + data.initialize(context); + } context.fireResolvers(); }