55import net .minecraft .client .renderer .block .dispatch .BlockStateModel ;
66import net .minecraft .client .resources .model .BlockStateModelLoader ;
77import net .minecraft .client .resources .model .ClientItemInfoLoader ;
8+ import net .minecraft .client .resources .model .ModelDiscovery ;
89import net .minecraft .client .resources .model .ModelManager ;
10+ import net .minecraft .client .resources .model .ResolvedModel ;
911import net .minecraft .client .resources .model .UnbakedModel ;
12+ import net .minecraft .client .resources .model .cuboid .ItemModelGenerator ;
1013import net .minecraft .resources .Identifier ;
1114import net .minecraft .server .packs .resources .Resource ;
1215import net .minecraft .world .level .block .state .BlockState ;
16+ import net .neoforged .neoforge .client .model .standalone .StandaloneModelLoader ;
1317import org .embeddedt .modernfix .annotation .ClientOnlyMixin ;
1418import org .embeddedt .modernfix .dynresources .BlockStateModelMap ;
1519import org .embeddedt .modernfix .dynresources .DynamicModelSystem ;
1620import org .spongepowered .asm .mixin .Mixin ;
1721import org .spongepowered .asm .mixin .Overwrite ;
1822import org .spongepowered .asm .mixin .injection .At ;
1923import org .spongepowered .asm .mixin .injection .ModifyArg ;
24+ import org .spongepowered .asm .mixin .injection .Redirect ;
2025
26+ import java .util .Collection ;
2127import java .util .Map ;
2228import java .util .concurrent .CompletableFuture ;
2329import java .util .concurrent .CompletionStage ;
30+ import java .util .function .Consumer ;
2431import java .util .function .Function ;
2532
2633@ Mixin (ModelManager .class )
@@ -38,13 +45,38 @@ public class MixinModelManager {
3845
3946 /**
4047 * @author embeddedt
41- * @reason Model resolution is not necessary, because we dynamically find models as they are referenced
48+ * @reason Stop all models from being loaded at startup by the model resolution logic.
4249 */
43- @ Overwrite
44- private static ModelManager .ResolvedModels discoverModelDependencies (
45- Map <Identifier , UnbakedModel > inputModels , BlockStateModelLoader .LoadedModels loadedModels , ClientItemInfoLoader .LoadedClientInfos loadedClientInfos , net .neoforged .neoforge .client .model .standalone .StandaloneModelLoader .LoadedModels standaloneModels
50+ @ Redirect (
51+ method = "discoverModelDependencies(Ljava/util/Map;Lnet/minecraft/client/resources/model/BlockStateModelLoader$LoadedModels;Lnet/minecraft/client/resources/model/ClientItemInfoLoader$LoadedClientInfos;Lnet/neoforged/neoforge/client/model/standalone/StandaloneModelLoader$LoadedModels;)Lnet/minecraft/client/resources/model/ModelManager$ResolvedModels;" ,
52+ at = @ At (value = "INVOKE" , target = "Ljava/util/Collection;forEach(Ljava/util/function/Consumer;)V" ))
53+ private static <T > void skipAddingRoot (Collection <T > instance , Consumer <T > consumer ) {
54+ }
55+
56+ /**
57+ * @author embeddedt, coredex
58+ * @reason Divert to our dynamic resolver. It is cleaner to overwrite the whole method, but this seems to cause
59+ * a conflict with Sodium.
60+ */
61+ @ Redirect (
62+ method = "discoverModelDependencies(Ljava/util/Map;Lnet/minecraft/client/resources/model/BlockStateModelLoader$LoadedModels;Lnet/minecraft/client/resources/model/ClientItemInfoLoader$LoadedClientInfos;Lnet/neoforged/neoforge/client/model/standalone/StandaloneModelLoader$LoadedModels;)Lnet/minecraft/client/resources/model/ModelManager$ResolvedModels;" ,
63+ at = @ At (value = "INVOKE" , target = "Lnet/minecraft/client/resources/model/ModelDiscovery;resolve()Ljava/util/Map;" )
64+ )
65+ private static Map <Identifier , ResolvedModel > useDynamicResolverMap (
66+ ModelDiscovery discovery ,
67+ Map <Identifier , UnbakedModel > allModels ,
68+ BlockStateModelLoader .LoadedModels blockStateModels ,
69+ ClientItemInfoLoader .LoadedClientInfos itemInfos ,
70+ StandaloneModelLoader .LoadedModels standaloneModels
4671 ) {
47- return new DynamicModelSystem .DynamicResolver (inputModels , loadedModels , loadedClientInfos , standaloneModels ).resolvedModels ();
72+ UnbakedModel generatedItemModel ;
73+ var generatedItemWrapper = ((ModelDiscoveryAccessor ) discovery ).mfix$getModelWrappers ().get (ItemModelGenerator .GENERATED_ITEM_MODEL_ID );
74+ if (generatedItemWrapper != null ) {
75+ generatedItemModel = generatedItemWrapper .wrapped ();
76+ } else {
77+ generatedItemModel = new ItemModelGenerator ();
78+ }
79+ return new DynamicModelSystem .DynamicResolver (allModels , blockStateModels , itemInfos , standaloneModels , generatedItemModel ).resolvedModelsMap ();
4880 }
4981
5082 /**
0 commit comments