Skip to content

Commit 4cffdc3

Browse files
authored
Fix crash on forge 1.20.4. (#360)
1 parent 73beb4c commit 4cffdc3

File tree

5 files changed

+10
-36
lines changed

5 files changed

+10
-36
lines changed

Common/src/main/java/customskinloader/fake/FakeSkinManager.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,6 @@ public static void setSkinCacheDir(Path skinCacheDirectory) {
5252
HttpTextureUtil.defaultCacheDir = skinCacheDirectory.toFile();
5353
}
5454

55-
/**
56-
* 23w42a ~ 25w33a
57-
* Invoked from {@link SkinManager#getOrLoad(GameProfile)}
58-
*
59-
* 25w34a+
60-
* Invoked from {@link SkinManager#get(GameProfile)}
61-
*/
62-
public static Property createProperty(Property property) {
63-
return property == null ? new Property(null, null) : property;
64-
}
65-
6655
/**
6756
* 1.20.1-
6857
* Invoked from {@link SkinManager#loadSkin(MinecraftProfileTexture, MinecraftProfileTexture.Type, SkinManager$SkinAvailableCallback)}
@@ -234,7 +223,7 @@ public GameProfile profile() {
234223
* Invoked from {@link SkinManager#get(GameProfile)}
235224
*/
236225
public static SkinManager$CacheKey createFakeCacheKey(UUID uuid, Property property, GameProfile profile) {
237-
return new FakeCacheKey(uuid, property, profile);
226+
return new FakeCacheKey(uuid, property == null ? new Property(null, null) : property, profile);
238227
}
239228

240229
public static Object createMinecraftProfileTextures(Map<MinecraftProfileTexture.Type, MinecraftProfileTexture> textures) {

Common/src/main/java/customskinloader/utils/LIFOBlockingQueue.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,4 @@ public E poll(long timeout, TimeUnit unit) throws InterruptedException {
4747
public E peek() {
4848
return deque.peekFirst();
4949
}
50-
}
50+
}

Fabric/src/main/java/customskinloader/fabric/DevEnvRemapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public class DevEnvRemapper extends SimpleRemapper {
5252
remappedClasses.put(
5353
"net.minecraft.class_3300",
5454
new AbstractMap.SimpleEntry<>(
55-
Lists.newArrayList("customskinloader.fake.itf.IFakeIResourceManager"),
55+
Lists.newArrayList("customskinloader.fake.itf.IFakeIResourceManager$V1", "customskinloader.fake.itf.IFakeIResourceManager$V2"),
5656
Lists.newArrayList("customskinloader.fake.itf.FakeInterfaceManager")
5757
)
5858
);

Forge/V2/src/main/resources/transformers.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ function initializeCoreMod() {
4949
if (node.getOpcode() === Opcodes.RETURN) {
5050
mn.instructions.insertBefore(node, new VarInsnNode(Opcodes.ALOAD, 2));
5151
mn.instructions.insertBefore(node, new MethodInsnNode(Opcodes.INVOKESTATIC, "customskinloader/fake/FakeSkinManager", "setSkinCacheDir", "(Ljava/nio/file/Path;)V", false));
52-
} else if (node.getOpcode() === Opcodes.INVOKEVIRTUAL && node.owner.equals("com/google/common/cache/CacheBuilder") && checkName(node.name, "build") && node.desc.equals("(Lcom/google/common/cache/CacheLoader;)Lcom/google/common/cache/LoadingCache;")) {
53-
mn.instructions.insertBefore(node, new MethodInsnNode(Opcodes.INVOKESTATIC, "customskinloader/fake/FakeSkinManager", "setCacheLoader", "(Lcom/google/common/cache/CacheLoader;)Lcom/google/common/cache/CacheLoader;", false));
5452
}
5553
}
5654
} else if (checkName(mn.name, "m_118828_") && mn.desc.equals("(Lcom/mojang/authlib/minecraft/MinecraftProfileTexture;Lcom/mojang/authlib/minecraft/MinecraftProfileTexture$Type;Lnet/minecraft/client/resources/SkinManager$SkinTextureCallback;)Lnet/minecraft/resources/ResourceLocation;")) { // 1.20.1-
@@ -120,11 +118,13 @@ function initializeCoreMod() {
120118
} else if (checkName(mn.name, "m_293351_") && mn.desc.equals("(Lcom/mojang/authlib/GameProfile;)Ljava/util/concurrent/CompletableFuture;")) { // 1.20.2+
121119
for (var iterator = mn.instructions.iterator(); iterator.hasNext();) {
122120
var node = iterator.next();
123-
if (node.getOpcode() === Opcodes.INVOKESPECIAL && node.owner.equals("net/minecraft/client/resources/SkinManager$CacheKey") && checkName(node.name, "<init>") && node.desc.equals("(Ljava/util/UUID;Lcom/mojang/authlib/properties/Property;)V")) {
124-
mn.instructions.insertBefore(node, new MethodInsnNode(Opcodes.INVOKESTATIC, "customskinloader/fake/FakeSkinManager", "createProperty", "(Lcom/mojang/authlib/properties/Property;)Lcom/mojang/authlib/properties/Property;", false));
125-
} else if (node.getOpcode() === Opcodes.INVOKEINTERFACE && node.owner.equals("com/google/common/cache/LoadingCache") && checkName(node.name, "getUnchecked") && node.desc.equals("(Ljava/lang/Object;)Ljava/lang/Object;")) {
121+
if (node.getOpcode() === Opcodes.NEW && node.desc.equals("net/minecraft/client/resources/SkinManager$CacheKey")) {
122+
iterator.remove();
123+
iterator.next(); // DUP
124+
iterator.remove();
125+
} else if (node.getOpcode() === Opcodes.INVOKESPECIAL && node.owner.equals("net/minecraft/client/resources/SkinManager$CacheKey") && checkName(node.name, "<init>") && node.desc.equals("(Ljava/util/UUID;Lcom/mojang/authlib/properties/Property;)V")) {
126126
mn.instructions.insertBefore(node, new VarInsnNode(Opcodes.ALOAD, 1));
127-
mn.instructions.insertBefore(node, new MethodInsnNode(Opcodes.INVOKESTATIC, "customskinloader/fake/FakeSkinManager", "loadCache", "(Ljava/lang/Object;Lcom/mojang/authlib/GameProfile;)Ljava/lang/Object;", false));
127+
mn.instructions.set(node, new MethodInsnNode(Opcodes.INVOKESTATIC, "customskinloader/fake/FakeSkinManager$FakeCacheKey", "createFakeCacheKey", "(Ljava/util/UUID;Lcom/mojang/authlib/properties/Property;Lcom/mojang/authlib/GameProfile;)Lnet/minecraft/client/resources/SkinManager$CacheKey;", false));
128128
}
129129
}
130130
}
@@ -163,7 +163,7 @@ function initializeCoreMod() {
163163
for (var iterator = mn.instructions.iterator(); iterator.hasNext();) {
164164
var node = iterator.next();
165165
if (node.getOpcode() === Opcodes.INVOKEINTERFACE && node.owner.equals("com/mojang/authlib/minecraft/MinecraftSessionService") && checkName(node.name, "unpackTextures") && node.desc.equals("(Lcom/mojang/authlib/properties/Property;)Lcom/mojang/authlib/minecraft/MinecraftProfileTextures;")) {
166-
mn.instructions.insertBefore(node, new VarInsnNode(Opcodes.ALOAD, 1));
166+
mn.instructions.insertBefore(node, new VarInsnNode(Opcodes.ALOAD, 0));
167167
mn.instructions.insert(node, new TypeInsnNode(Opcodes.CHECKCAST, "com/mojang/authlib/minecraft/MinecraftProfileTextures"));
168168
mn.instructions.set(node, new MethodInsnNode(Opcodes.INVOKESTATIC, "customskinloader/fake/FakeSkinManager", "loadSkinFromCache", "(Lcom/mojang/authlib/minecraft/MinecraftSessionService;Lcom/mojang/authlib/properties/Property;Lnet/minecraft/client/resources/SkinManager$CacheKey;)Ljava/lang/Object;", false));
169169
}

Vanilla/Common/src/main/java/customskinloader/mixin/MixinSkinManager.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.spongepowered.asm.mixin.injection.Coerce;
2323
import org.spongepowered.asm.mixin.injection.Group;
2424
import org.spongepowered.asm.mixin.injection.Inject;
25-
import org.spongepowered.asm.mixin.injection.ModifyArg;
2625
import org.spongepowered.asm.mixin.injection.ModifyArgs;
2726
import org.spongepowered.asm.mixin.injection.Redirect;
2827
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@@ -242,20 +241,6 @@ private ImmutableList<MinecraftProfileTexture.Type> redirect_func_229297_b_(Obje
242241
// 23w42a+
243242
@Mixin(SkinManager.class)
244243
public abstract static class V3 {
245-
@ModifyArg(
246-
method = {
247-
"Lnet/minecraft/client/resources/SkinManager;getOrLoad(Lcom/mojang/authlib/GameProfile;)Ljava/util/concurrent/CompletableFuture;", // 23w42a ~ 25w33a
248-
"Lnet/minecraft/client/resources/SkinManager;get(Lcom/mojang/authlib/GameProfile;)Ljava/util/concurrent/CompletableFuture;" // 25w34a+
249-
},
250-
at = @At(
251-
value = "INVOKE",
252-
target = "Lnet/minecraft/client/resources/SkinManager$CacheKey;<init>(Ljava/util/UUID;Lcom/mojang/authlib/properties/Property;)V"
253-
)
254-
)
255-
private Property modifyArg_getOrLoad(Property property) {
256-
return FakeSkinManager.createProperty(property);
257-
}
258-
259244
@Redirect(
260245
method = {
261246
"Lnet/minecraft/client/resources/SkinManager;getOrLoad(Lcom/mojang/authlib/GameProfile;)Ljava/util/concurrent/CompletableFuture;", // 23w42a ~ 25w33a

0 commit comments

Comments
 (0)