|
3 | 3 | import net.fabricmc.fabric.api.client.model.loading.v1.BlockStateResolver; |
4 | 4 | import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; |
5 | 5 | import net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier; |
| 6 | +import net.fabricmc.fabric.api.client.model.loading.v1.PreparableModelLoadingPlugin; |
6 | 7 | import net.fabricmc.fabric.api.event.Event; |
7 | 8 | import net.fabricmc.fabric.api.event.EventFactory; |
8 | 9 | import net.minecraft.client.renderer.block.BlockModelShaper; |
|
13 | 14 | import net.minecraft.client.resources.model.ModelState; |
14 | 15 | import net.minecraft.client.resources.model.UnbakedModel; |
15 | 16 | import net.minecraft.resources.ResourceLocation; |
| 17 | +import net.minecraft.server.packs.resources.ResourceManager; |
16 | 18 | import net.minecraft.world.level.block.Block; |
17 | 19 | import net.minecraft.world.level.block.state.BlockState; |
18 | 20 | import org.embeddedt.modernfix.ModernFix; |
19 | 21 |
|
| 22 | +import java.util.ArrayList; |
20 | 23 | import java.util.Collection; |
21 | 24 | import java.util.HashMap; |
22 | 25 | import java.util.List; |
23 | 26 | import java.util.Map; |
24 | 27 | import java.util.Optional; |
| 28 | +import java.util.concurrent.CompletableFuture; |
25 | 29 |
|
26 | 30 | public class FabricDynamicModelHandler implements DynamicModelProvider.DynamicModelPlugin { |
27 | | - private final List<ModelLoadingPlugin> pluginList; |
28 | | - |
29 | 31 | // Borrowed from Fabric API, this dispatching logic is extremely trivial |
30 | 32 |
|
31 | 33 | 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 |
99 | 101 | return model; |
100 | 102 | }, MODEL_MODIFIER_PHASES); |
101 | 103 |
|
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(); |
104 | 122 | var context = new PluginContext(provider); |
105 | | - for (var plugin : this.pluginList) { |
| 123 | + for (var plugin : pluginList) { |
106 | 124 | plugin.initialize(context); |
107 | 125 | } |
| 126 | + for (var data : preparablePluginData) { |
| 127 | + data.initialize(context); |
| 128 | + } |
108 | 129 | context.fireResolvers(); |
109 | 130 | } |
110 | 131 |
|
|
0 commit comments