11package org .embeddedt .modernfix .common .mixin .perf .dynamic_resources ;
22
33import com .llamalad7 .mixinextras .sugar .Local ;
4+ import com .mojang .serialization .JsonOps ;
45import net .minecraft .client .renderer .item .ClientItem ;
56import net .minecraft .client .resources .model .ClientItemInfoLoader ;
67import net .minecraft .core .RegistryAccess ;
8+ import net .minecraft .resources .FileToIdConverter ;
79import net .minecraft .resources .Identifier ;
810import net .minecraft .server .packs .resources .Resource ;
11+ import net .minecraft .util .PlaceholderLookupProvider ;
12+ import net .minecraft .util .StrictJsonParser ;
913import org .embeddedt .modernfix .ModernFix ;
1014import org .embeddedt .modernfix .annotation .ClientOnlyMixin ;
1115import org .embeddedt .modernfix .dynresources .DynamicModelSystem ;
1418import org .spongepowered .asm .mixin .injection .At ;
1519import org .spongepowered .asm .mixin .injection .ModifyArg ;
1620
17- import java .lang .reflect .Method ;
18- import java .lang .reflect .Modifier ;
1921import java .util .Map ;
2022import java .util .concurrent .CompletableFuture ;
2123import java .util .concurrent .CompletionStage ;
2527@ ClientOnlyMixin
2628public abstract class MixinClientItemInfoLoader {
2729 @ Unique
28- private static final Method MFIX$LOAD_PENDING ;
29-
30- @ Unique
31- private static final Method MFIX$GET_CLIENT_ITEM_INFO ;
30+ private static final FileToIdConverter MFIX$ITEM_LISTER = FileToIdConverter .json ("items" );
3231
3332 @ Unique
3433 private static volatile boolean MFIX$DYNAMIC_CLIENT_ITEMS_ENABLED = true ;
3534
3635 @ Unique
3736 private static volatile boolean MFIX$DYNAMIC_CLIENT_ITEMS_FAILURE_LOGGED = false ;
3837
39- static {
40- Method loadPending = null ;
41- Method getClientInfo = null ;
42- try {
43- for (Method method : ClientItemInfoLoader .class .getDeclaredMethods ()) {
44- if (method .getName ().equals ("lambda$scheduleLoad$3" )
45- && Modifier .isStatic (method .getModifiers ())
46- && method .getParameterCount () == 3 ) {
47- method .setAccessible (true );
48- loadPending = method ;
49- Class <?> pendingType = method .getReturnType ();
50- Method clientItemAccessor = pendingType .getDeclaredMethod ("clientItemInfo" );
51- clientItemAccessor .setAccessible (true );
52- getClientInfo = clientItemAccessor ;
53- break ;
54- }
55- }
56- } catch (ReflectiveOperationException ignored ) {
38+ @ Unique
39+ private static ClientItem mfix$loadSingleClientItemInfo (Identifier resourceFileId , Resource resource , RegistryAccess .Frozen staticRegistries ) {
40+ Identifier itemId = MFIX$ITEM_LISTER .fileToId (resourceFileId );
41+ try (var reader = resource .openAsReader ()) {
42+ PlaceholderLookupProvider placeholderLookupProvider = new PlaceholderLookupProvider (staticRegistries );
43+ var context = placeholderLookupProvider .createSerializationContext (JsonOps .INSTANCE );
44+ return ClientItem .CODEC .parse (context , StrictJsonParser .parse (reader ))
45+ .ifError (error -> ModernFix .LOGGER .error ("Couldn't parse item model '{}' from pack '{}': {}" , itemId , resource .sourcePackId (), error .message ()))
46+ .result ()
47+ .map (clientItem -> placeholderLookupProvider .hasRegisteredPlaceholders () ? clientItem .withRegistrySwapper (placeholderLookupProvider .createSwapper ()) : clientItem )
48+ .orElse (null );
49+ } catch (Exception e ) {
50+ ModernFix .LOGGER .error ("Failed to open item model {} from pack '{}'" , resourceFileId , resource .sourcePackId (), e );
51+ return null ;
5752 }
58- MFIX$LOAD_PENDING = loadPending ;
59- MFIX$GET_CLIENT_ITEM_INFO = getClientInfo ;
6053 }
6154
6255 /**
@@ -67,26 +60,15 @@ public abstract class MixinClientItemInfoLoader {
6760 private static Function <Map <Identifier , Resource >, ? extends CompletionStage <ClientItemInfoLoader .LoadedClientInfos >> skipAOTClientItemLoad (
6861 Function <Map <Identifier , Resource >, ? extends CompletionStage <ClientItemInfoLoader .LoadedClientInfos >> original ,
6962 @ Local (ordinal = 0 ) RegistryAccess .Frozen staticRegistries ) {
70- if (!MFIX$DYNAMIC_CLIENT_ITEMS_ENABLED || MFIX$LOAD_PENDING == null || MFIX$GET_CLIENT_ITEM_INFO == null ) {
63+ if (!MFIX$DYNAMIC_CLIENT_ITEMS_ENABLED ) {
7164 return original ;
7265 }
7366 return resourceMap -> CompletableFuture .completedFuture (DynamicModelSystem .createDynamicClientInfos (resourceMap , (resourceFileId , resource ) -> {
7467 if (!MFIX$DYNAMIC_CLIENT_ITEMS_ENABLED ) {
7568 return null ;
7669 }
7770 try {
78- Object pendingLoad = MFIX$LOAD_PENDING .invoke (null , resourceFileId , resource , staticRegistries );
79- if (pendingLoad == null ) {
80- return null ;
81- }
82- return (ClientItem )MFIX$GET_CLIENT_ITEM_INFO .invoke (pendingLoad );
83- } catch (ReflectiveOperationException e ) {
84- MFIX$DYNAMIC_CLIENT_ITEMS_ENABLED = false ;
85- if (!MFIX$DYNAMIC_CLIENT_ITEMS_FAILURE_LOGGED ) {
86- MFIX$DYNAMIC_CLIENT_ITEMS_FAILURE_LOGGED = true ;
87- ModernFix .LOGGER .warn ("Disabling dynamic client item info loading due to reflection failure" , e );
88- }
89- return null ;
71+ return mfix$loadSingleClientItemInfo (resourceFileId , resource , staticRegistries );
9072 } catch (RuntimeException e ) {
9173 MFIX$DYNAMIC_CLIENT_ITEMS_ENABLED = false ;
9274 if (!MFIX$DYNAMIC_CLIENT_ITEMS_FAILURE_LOGGED ) {
0 commit comments