Skip to content

Commit 988ecd3

Browse files
5.27.0 - commit.3
- Optimize MixinClientItemInfoLoader
1 parent 7217340 commit 988ecd3

1 file changed

Lines changed: 21 additions & 39 deletions

File tree

src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/MixinClientItemInfoLoader.java

Lines changed: 21 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package org.embeddedt.modernfix.common.mixin.perf.dynamic_resources;
22

33
import com.llamalad7.mixinextras.sugar.Local;
4+
import com.mojang.serialization.JsonOps;
45
import net.minecraft.client.renderer.item.ClientItem;
56
import net.minecraft.client.resources.model.ClientItemInfoLoader;
67
import net.minecraft.core.RegistryAccess;
8+
import net.minecraft.resources.FileToIdConverter;
79
import net.minecraft.resources.Identifier;
810
import net.minecraft.server.packs.resources.Resource;
11+
import net.minecraft.util.PlaceholderLookupProvider;
12+
import net.minecraft.util.StrictJsonParser;
913
import org.embeddedt.modernfix.ModernFix;
1014
import org.embeddedt.modernfix.annotation.ClientOnlyMixin;
1115
import org.embeddedt.modernfix.dynresources.DynamicModelSystem;
@@ -14,8 +18,6 @@
1418
import org.spongepowered.asm.mixin.injection.At;
1519
import org.spongepowered.asm.mixin.injection.ModifyArg;
1620

17-
import java.lang.reflect.Method;
18-
import java.lang.reflect.Modifier;
1921
import java.util.Map;
2022
import java.util.concurrent.CompletableFuture;
2123
import java.util.concurrent.CompletionStage;
@@ -25,38 +27,29 @@
2527
@ClientOnlyMixin
2628
public 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

Comments
 (0)