Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.function.Predicate;

import customskinloader.CustomSkinLoader;
import customskinloader.fake.itf.FakeInterfaceManager;
import customskinloader.fake.texture.FakeBufferedImage;
import customskinloader.fake.texture.FakeImage;
import customskinloader.fake.texture.FakeNativeImage;
Expand All @@ -28,7 +29,9 @@ public static NativeImage processLegacySkin(NativeImage image, String url) {

FakeImage img = parseUserSkin0(new FakeNativeImage(image));
if (img instanceof FakeNativeImage) {
return FakeNativeImage.Extended.create((FakeNativeImage) img);
image = ((FakeNativeImage) img).getImage();
FakeInterfaceManager.NativeImage_setFakeImage(image, img);
return image;
}

CustomSkinLoader.logger.warning("Failed to parseUserSkin(downloadAndRegisterSkin).");
Expand Down
13 changes: 1 addition & 12 deletions Common/src/main/java/customskinloader/fake/FakeSkinManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,17 +52,6 @@ public static void setSkinCacheDir(Path skinCacheDirectory) {
HttpTextureUtil.defaultCacheDir = skinCacheDirectory.toFile();
}

/**
* 23w42a ~ 25w33a
* Invoked from {@link SkinManager#getOrLoad(GameProfile)}
*
* 25w34a+
* Invoked from {@link SkinManager#get(GameProfile)}
*/
public static Property createProperty(Property property) {
return property == null ? new Property(null, null) : property;
}

/**
* 1.20.1-
* Invoked from {@link SkinManager#loadSkin(MinecraftProfileTexture, MinecraftProfileTexture.Type, SkinManager$SkinAvailableCallback)}
Expand Down Expand Up @@ -234,7 +223,7 @@ public GameProfile profile() {
* Invoked from {@link SkinManager#get(GameProfile)}
*/
public static SkinManager$CacheKey createFakeCacheKey(UUID uuid, Property property, GameProfile profile) {
return new FakeCacheKey(uuid, property, profile);
return new FakeCacheKey(uuid, property == null ? new Property(null, null) : property, profile);
}

public static Object createMinecraftProfileTextures(Map<MinecraftProfileTexture.Type, MinecraftProfileTexture> textures) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import java.util.Optional;

import customskinloader.fake.FakeMinecraftProfileTexture;
import customskinloader.fake.texture.FakeNativeImage;
import net.minecraft.client.resources.IResource;
import net.minecraft.client.resources.IResourceManager;
import net.minecraft.util.ResourceLocation;
Expand Down Expand Up @@ -32,6 +33,14 @@ public static void NativeImage_setPixel(Object nativeImage, int x, int y, int co
((IFakeNativeImage) nativeImage).setPixel(x, y, color);
}

public static FakeNativeImage NativeImage_getFakeImage(Object nativeImage) {
return ((IFakeNativeImage) nativeImage).getFakeImage();
}

public static void NativeImage_setFakeImage(Object nativeImage, Object fakeImage) {
((IFakeNativeImage) nativeImage).setFakeImage((FakeNativeImage) fakeImage);
}

public static FakeMinecraftProfileTexture ResourceLocation_getTexture(Object location) {
return ((IFakeResourceLocation) location).getTexture();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package customskinloader.fake.itf;

import customskinloader.fake.texture.FakeNativeImage;
import net.minecraft.client.renderer.texture.NativeImage;

public interface IFakeNativeImage {
Expand All @@ -10,4 +11,8 @@ default int getPixel(int x, int y) {
default void setPixel(int x, int y, int color) {
((NativeImage) this).func_195700_a(x, y, color);
}

FakeNativeImage getFakeImage();

void setFakeImage(FakeNativeImage fakeImage);
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,22 +71,4 @@ public void copyArea(int x0, int y0, int dx, int dy, int width, int height, bool
public void close() {
image.close();
}

public static class Extended extends NativeImage {
public static NativeImage create(FakeNativeImage fakeImage) {
return new FakeNativeImage.Extended(fakeImage);
}

private final FakeNativeImage fakeImage;

public Extended(FakeNativeImage fakeImage) {
super(fakeImage.getWidth(), fakeImage.getHeight(), true);
this.func_195703_a(fakeImage.getImage());
this.fakeImage = fakeImage;
}

public FakeNativeImage getFakeImage() {
return this.fakeImage;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import java.util.function.Function;

import customskinloader.fake.FakeCapeBuffer;
import customskinloader.fake.FakeMinecraftProfileTexture;
import customskinloader.fake.FakeSkinBuffer;
import customskinloader.fake.FakeSkinManager;
import customskinloader.fake.itf.FakeInterfaceManager;
Expand Down Expand Up @@ -36,8 +37,10 @@ public static Function<NativeImage, CompletableFuture<?>> createTextureV2(Functi

public static Function<NativeImage, CompletableFuture<?>> createTexture(Function<NativeImage, CompletableFuture<?>> function, Function<NativeImage, Function<Object, Object>> cape, Object location, boolean bl) {
return bl ? _image -> {
if (FakeInterfaceManager.ResourceLocation_getTexture(location) != null && _image instanceof FakeNativeImage.Extended) {
FakeSkinManager.BaseBuffer.judgeType(FakeInterfaceManager.ResourceLocation_getTexture(location), () -> FakeSkinBuffer.judgeType0(((FakeNativeImage.Extended) _image).getFakeImage()));
FakeMinecraftProfileTexture texture = FakeInterfaceManager.ResourceLocation_getTexture(location);
FakeNativeImage image = FakeInterfaceManager.NativeImage_getFakeImage(_image);
if (texture != null && image != null) {
FakeSkinManager.BaseBuffer.judgeType(texture, () -> FakeSkinBuffer.judgeType0(image));
}
return function.apply(_image);
} : _image -> function.apply(_image).thenApply(cape.apply(_image));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,4 @@ public E poll(long timeout, TimeUnit unit) throws InterruptedException {
public E peek() {
return deque.peekFirst();
}
}
}
2 changes: 2 additions & 0 deletions Fabric/mixin.tsrg
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ net/minecraft/client/Minecraft net/minecraft/class_310
isIntegratedServerRunning ()Z method_1542
net/minecraft/client/entity/AbstractClientPlayer net/minecraft/class_742
net/minecraft/client/gui/Gui net/minecraft/class_332
net/minecraft/client/gui/GuiGraphicsExtractor net/minecraft/client/gui/GuiGraphicsExtractor
net/minecraft/client/gui/GuiPlayerTabOverlay net/minecraft/class_355
renderPlayerlist (ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V method_1919
renderPlayerlist (Lcom/mojang/blaze3d/matrix/MatrixStack;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V method_1919
renderPlayerlist (Lnet/minecraft/client/gui/Gui;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V method_1919
renderPlayerlist (Lnet/minecraft/client/gui/GuiGraphicsExtractor;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V extractRenderState
net/minecraft/client/model/ModelRenderer net/minecraft/class_630
net/minecraft/client/renderer/IImageBuffer net/minecraft/class_760
net/minecraft/client/renderer/IRenderTypeBuffer net/minecraft/class_4597
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public class DevEnvRemapper extends SimpleRemapper {
remappedClasses.put(
"net.minecraft.class_3300",
new AbstractMap.SimpleEntry<>(
Lists.newArrayList("customskinloader.fake.itf.IFakeIResourceManager"),
Lists.newArrayList("customskinloader.fake.itf.IFakeIResourceManager$V1", "customskinloader.fake.itf.IFakeIResourceManager$V2"),
Lists.newArrayList("customskinloader.fake.itf.FakeInterfaceManager")
)
);
Expand Down
1 change: 0 additions & 1 deletion Fabric/src/main/resources/customskinloader.accesswidener
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
accessWidener v2 intermediary
extendable class net/minecraft/class_1011 # 24w46a+
extendable class net/minecraft/class_1071$class_8686 # 23w31a+
extendable class net/minecraft/class_2960 # 24w46a+
accessible method net/minecraft/class_1071$class_8686 <init> (Ljava/util/UUID;Lcom/mojang/authlib/properties/Property;)V # 23w42a+
accessible method net/minecraft/class_2960 <init> (Ljava/lang/String;Ljava/lang/String;)V # 24w18a+
6 changes: 5 additions & 1 deletion Fabric/src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,9 @@
"mixins": [
"mixins.customskinloader.json"
],
"accessWidener": "customskinloader.accesswidener"
"accessWidener": "customskinloader.accesswidener",

"depends": {
"minecraft": "<=1.21.11"
}
}
14 changes: 7 additions & 7 deletions Forge/V2/src/main/resources/transformers.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,6 @@ function initializeCoreMod() {
if (node.getOpcode() === Opcodes.RETURN) {
mn.instructions.insertBefore(node, new VarInsnNode(Opcodes.ALOAD, 2));
mn.instructions.insertBefore(node, new MethodInsnNode(Opcodes.INVOKESTATIC, "customskinloader/fake/FakeSkinManager", "setSkinCacheDir", "(Ljava/nio/file/Path;)V", false));
} 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;")) {
mn.instructions.insertBefore(node, new MethodInsnNode(Opcodes.INVOKESTATIC, "customskinloader/fake/FakeSkinManager", "setCacheLoader", "(Lcom/google/common/cache/CacheLoader;)Lcom/google/common/cache/CacheLoader;", false));
}
}
} 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-
Expand Down Expand Up @@ -120,11 +118,13 @@ function initializeCoreMod() {
} else if (checkName(mn.name, "m_293351_") && mn.desc.equals("(Lcom/mojang/authlib/GameProfile;)Ljava/util/concurrent/CompletableFuture;")) { // 1.20.2+
for (var iterator = mn.instructions.iterator(); iterator.hasNext();) {
var node = iterator.next();
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")) {
mn.instructions.insertBefore(node, new MethodInsnNode(Opcodes.INVOKESTATIC, "customskinloader/fake/FakeSkinManager", "createProperty", "(Lcom/mojang/authlib/properties/Property;)Lcom/mojang/authlib/properties/Property;", false));
} 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;")) {
if (node.getOpcode() === Opcodes.NEW && node.desc.equals("net/minecraft/client/resources/SkinManager$CacheKey")) {
iterator.remove();
iterator.next(); // DUP
iterator.remove();
} 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")) {
mn.instructions.insertBefore(node, new VarInsnNode(Opcodes.ALOAD, 1));
mn.instructions.insertBefore(node, new MethodInsnNode(Opcodes.INVOKESTATIC, "customskinloader/fake/FakeSkinManager", "loadCache", "(Ljava/lang/Object;Lcom/mojang/authlib/GameProfile;)Ljava/lang/Object;", false));
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));
}
}
}
Expand Down Expand Up @@ -163,7 +163,7 @@ function initializeCoreMod() {
for (var iterator = mn.instructions.iterator(); iterator.hasNext();) {
var node = iterator.next();
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;")) {
mn.instructions.insertBefore(node, new VarInsnNode(Opcodes.ALOAD, 1));
mn.instructions.insertBefore(node, new VarInsnNode(Opcodes.ALOAD, 0));
mn.instructions.insert(node, new TypeInsnNode(Opcodes.CHECKCAST, "com/mojang/authlib/minecraft/MinecraftProfileTextures"));
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));
}
Expand Down
File renamed without changes.
File renamed without changes.
8 changes: 5 additions & 3 deletions Forge/V3/build.properties → Universal/build.properties
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
dependencies=Forge|1.20.6,1.21,1.21.1,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7,1.21.8,1.21.9,1.21.10,1.21.11;\
NeoForge|1.20.2,1.20.3,1.20.4,1.20.5,1.20.6,1.21,1.21.1,1.21.2,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7,1.21.8,1.21.9,1.21.10,1.21.11
dependencies=Fabric|26.1;\
Forge|1.20.6,1.21,1.21.1,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7,1.21.8,1.21.9,1.21.10,1.21.11,26.1;\
NeoForge|1.20.2,1.20.3,1.20.4,1.20.5,1.20.6,1.21,1.21.1,1.21.2,1.21.3,1.21.4,1.21.5,1.21.6,1.21.7,1.21.8,1.21.9,1.21.10,1.21.11,26.1;\
Quilt|26.1
java_full_versions=17,18,19,20,21,22
#forge gradle needs forge version
forge_mc_version=1.12.2
forge_version=14.23.5.2768
mappings_version=stable_39
srg_notch_map=Forge.tsrg
srg_notch_map=Universal.tsrg
2 changes: 2 additions & 0 deletions Forge/V3/mixin.tsrg → Universal/mixin.tsrg
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ net/minecraft/client/Minecraft net/minecraft/client/Minecraft
isIntegratedServerRunning ()Z isLocalServer
net/minecraft/client/entity/AbstractClientPlayer net/minecraft/client/player/AbstractClientPlayer
net/minecraft/client/gui/Gui net/minecraft/client/gui/GuiGraphics
net/minecraft/client/gui/GuiGraphicsExtractor net/minecraft/client/gui/GuiGraphicsExtractor
net/minecraft/client/gui/GuiPlayerTabOverlay net/minecraft/client/gui/components/PlayerTabOverlay
renderPlayerlist (ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V render
renderPlayerlist (Lcom/mojang/blaze3d/matrix/MatrixStack;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V render
renderPlayerlist (Lnet/minecraft/client/gui/Gui;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V render
renderPlayerlist (Lnet/minecraft/client/gui/GuiGraphicsExtractor;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V extractRenderState
net/minecraft/client/model/ModelRenderer net/minecraft/client/model/geom/ModelPart
net/minecraft/client/renderer/IImageBuffer net/minecraft/client/renderer/HttpTextureProcessor
net/minecraft/client/renderer/IRenderTypeBuffer net/minecraft/client/renderer/MultiBufferSource
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
public-f com.mojang.blaze3d.platform.NativeImage # 24w46a+
public-f net.minecraft.client.resources.SkinManager$CacheKey # 23w42a+
public-f net.minecraft.resources.ResourceLocation # 24w46a+
public net.minecraft.client.resources.SkinManager$CacheKey <init>(Ljava/util/UUID;Lcom/mojang/authlib/properties/Property;)V # 23w42a+
public net.minecraft.resources.ResourceLocation <init>(Ljava/lang/String;Ljava/lang/String;)V # 24w18a+
4 changes: 4 additions & 0 deletions Universal/src/main/resources/customskinloader.accesswidener
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
accessWidener v2 official
extendable class com/mojang/blaze3d/platform/NativeImage # 24w46a+
extendable class net/minecraft/client/resources/SkinManager$CacheKey # 23w31a+
accessible method net/minecraft/client/resources/SkinManager$CacheKey <init> (Ljava/util/UUID;Lcom/mojang/authlib/properties/Property;)V # 23w42a+
25 changes: 25 additions & 0 deletions Universal/src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"schemaVersion": 1,
"id": "customskinloader",
"version": "${modFullVersion}",

"name": "CustomSkinLoader",
"description": "Custom Skin Loader for Minecraft",
"authors": ["xfl03", "JLChnToZ", "ZekerZhayard"],
"contact": {
"homepage": "https://github.com/xfl03/MCCustomSkinLoader",
"issues": "https://github.com/xfl03/MCCustomSkinLoader/issues",
"sources": "https://github.com/xfl03/MCCustomSkinLoader"
},
"license": "GPL-3.0-only",

"environment": "client",
"mixins": [
"mixins.customskinloader.json"
],
"accessWidener": "customskinloader.accesswidener",

"depends": {
"minecraft": ">1.21.11"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ public abstract class MixinGuiPlayerTabOverlay {
method = {
"Lnet/minecraft/client/gui/GuiPlayerTabOverlay;renderPlayerlist(ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V", // 20w16a-
"Lnet/minecraft/client/gui/GuiPlayerTabOverlay;renderPlayerlist(Lcom/mojang/blaze3d/matrix/MatrixStack;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V", // 20w17a ~ 23w14a
"Lnet/minecraft/client/gui/GuiPlayerTabOverlay;renderPlayerlist(Lnet/minecraft/client/gui/Gui;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V" // 23w16a+
"Lnet/minecraft/client/gui/GuiPlayerTabOverlay;renderPlayerlist(Lnet/minecraft/client/gui/Gui;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V", // 23w16a ~ 26.1-snapshot-11
"Lnet/minecraft/client/gui/GuiPlayerTabOverlay;renderPlayerlist(Lnet/minecraft/client/gui/GuiGraphicsExtractor;ILnet/minecraft/scoreboard/Scoreboard;Lnet/minecraft/scoreboard/ScoreObjective;)V" // 26.1-pre-1+
},
at = @At(
value = "INVOKE",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
package customskinloader.mixin;

import customskinloader.fake.itf.IFakeNativeImage;
import customskinloader.fake.texture.FakeNativeImage;
import net.minecraft.client.renderer.texture.NativeImage;
import org.spongepowered.asm.mixin.Mixin;

@Mixin(NativeImage.class)
public abstract class MixinNativeImage implements IFakeNativeImage {
private FakeNativeImage fakeImage;

@Override
public FakeNativeImage getFakeImage() {
return this.fakeImage;
}

@Override
public void setFakeImage(FakeNativeImage fakeImage) {
this.fakeImage = fakeImage;
}
}
Loading
Loading