Skip to content

Commit 37cb92a

Browse files
committed
Add PreparableModelLoadingPlugin support
Related: #522
1 parent 95ffcb3 commit 37cb92a

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicModelProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ public TextureAtlasSprite reportMissingReference(ModelDebugName modelDebugName,
137137
this.missingItemModel = new MissingItemModel(this.missingModel);
138138
try {
139139
Class.forName("net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin");
140-
pluginList.add(new FabricDynamicModelHandler(this));
140+
pluginList.add(new FabricDynamicModelHandler(this, this.resourceManager));
141141
} catch(Exception ignored) {
142142
// Fabric API likely not present
143143
}

common/src/main/java/org/embeddedt/modernfix/dynamicresources/FabricDynamicModelHandler.java

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import net.fabricmc.fabric.api.client.model.loading.v1.BlockStateResolver;
44
import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin;
55
import net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier;
6+
import net.fabricmc.fabric.api.client.model.loading.v1.PreparableModelLoadingPlugin;
67
import net.fabricmc.fabric.api.event.Event;
78
import net.fabricmc.fabric.api.event.EventFactory;
89
import net.minecraft.client.renderer.block.BlockModelShaper;
@@ -13,19 +14,20 @@
1314
import net.minecraft.client.resources.model.ModelState;
1415
import net.minecraft.client.resources.model.UnbakedModel;
1516
import net.minecraft.resources.ResourceLocation;
17+
import net.minecraft.server.packs.resources.ResourceManager;
1618
import net.minecraft.world.level.block.Block;
1719
import net.minecraft.world.level.block.state.BlockState;
1820
import org.embeddedt.modernfix.ModernFix;
1921

22+
import java.util.ArrayList;
2023
import java.util.Collection;
2124
import java.util.HashMap;
2225
import java.util.List;
2326
import java.util.Map;
2427
import java.util.Optional;
28+
import java.util.concurrent.CompletableFuture;
2529

2630
public class FabricDynamicModelHandler implements DynamicModelProvider.DynamicModelPlugin {
27-
private final List<ModelLoadingPlugin> pluginList;
28-
2931
// Borrowed from Fabric API, this dispatching logic is extremely trivial
3032

3133
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
99101
return model;
100102
}, MODEL_MODIFIER_PHASES);
101103

102-
public FabricDynamicModelHandler(DynamicModelProvider provider) {
103-
this.pluginList = ModelLoadingPlugin.getAll();
104+
record PreparablePluginData<T>(CompletableFuture<T> data, PreparableModelLoadingPlugin.Holder<T> plugin) {
105+
void initialize(ModelLoadingPlugin.Context context) {
106+
plugin.plugin().initialize(data.join(), context);
107+
}
108+
}
109+
110+
private <T> PreparablePluginData<T> makeDataRecord(ResourceManager manager, PreparableModelLoadingPlugin.Holder<T> holder) {
111+
return new PreparablePluginData<>(holder.loader().load(manager, ModernFix.resourceReloadExecutor()), holder);
112+
}
113+
114+
public FabricDynamicModelHandler(DynamicModelProvider provider, ResourceManager manager) {
115+
List<ModelLoadingPlugin> pluginList = new ArrayList<>(ModelLoadingPlugin.getAll());
116+
var preparablePluginData = new ArrayList<PreparablePluginData<?>>();
117+
for (var holder : PreparableModelLoadingPlugin.getAll()) {
118+
preparablePluginData.add(makeDataRecord(manager, holder));
119+
}
120+
// Wait for all the preparable plugins to finish loading
121+
CompletableFuture.allOf(preparablePluginData.stream().map(PreparablePluginData::data).toArray(CompletableFuture[]::new)).join();
104122
var context = new PluginContext(provider);
105-
for (var plugin : this.pluginList) {
123+
for (var plugin : pluginList) {
106124
plugin.initialize(context);
107125
}
126+
for (var data : preparablePluginData) {
127+
data.initialize(context);
128+
}
108129
context.fireResolvers();
109130
}
110131

0 commit comments

Comments
 (0)