From 6c159d6aa21e65620895c470d505fbc3d0154c3a Mon Sep 17 00:00:00 2001 From: Lionarius Date: Fri, 30 May 2025 21:29:42 +0300 Subject: [PATCH 1/4] remove shadow of public method getPlayers --- .../net/lionarius/skinrestorer/mixin/PlayerListMixin.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/common/src/main/java/net/lionarius/skinrestorer/mixin/PlayerListMixin.java b/common/src/main/java/net/lionarius/skinrestorer/mixin/PlayerListMixin.java index ccaed02..53c81d7 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/mixin/PlayerListMixin.java +++ b/common/src/main/java/net/lionarius/skinrestorer/mixin/PlayerListMixin.java @@ -20,9 +20,6 @@ import java.util.List; @Mixin(PlayerList.class) public abstract class PlayerListMixin { - @Shadow - public abstract List getPlayers(); - @Shadow @Final private MinecraftServer server; @@ -33,7 +30,7 @@ public abstract class PlayerListMixin { @Inject(method = "removeAll", at = @At("HEAD")) private void removeAll(CallbackInfo ci) { - for (var player : getPlayers()) { + for (var player : ((PlayerList) (Object) this).getPlayers()) { SkinRestorer.Events.onPlayerDisconnect(player); } } From 8119a08c80ae3536e34d3ebc12f1953b235bab47 Mon Sep 17 00:00:00 2001 From: Lionarius Date: Fri, 30 May 2025 21:46:42 +0300 Subject: [PATCH 2/4] remove shadow of server from PlayerListMixin --- .../net/lionarius/skinrestorer/mixin/PlayerListMixin.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/common/src/main/java/net/lionarius/skinrestorer/mixin/PlayerListMixin.java b/common/src/main/java/net/lionarius/skinrestorer/mixin/PlayerListMixin.java index 53c81d7..6f49c96 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/mixin/PlayerListMixin.java +++ b/common/src/main/java/net/lionarius/skinrestorer/mixin/PlayerListMixin.java @@ -6,23 +6,16 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.server.players.PlayerList; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Collections; -import java.util.List; @Mixin(PlayerList.class) public abstract class PlayerListMixin { - - @Shadow @Final - private MinecraftServer server; - @Inject(method = "remove", at = @At("TAIL")) private void remove(ServerPlayer player, CallbackInfo ci) { SkinRestorer.Events.onPlayerDisconnect(player); @@ -37,6 +30,7 @@ public abstract class PlayerListMixin { @Inject(method = "placeNewPlayer", at = @At("HEAD")) private void placeNewPlayer(Connection connection, ServerPlayer player, CommonListenerCookie cookie, CallbackInfo ci) { + var server = ((PlayerList) (Object) this).getServer(); var delay = SkinRestorer.getConfig().skinApplyDelayOnJoin(); if (delay <= 0) { From 5b384c32d6cb3b075876d21544087fa6926b0a38 Mon Sep 17 00:00:00 2001 From: Lionarius Date: Fri, 30 May 2025 22:35:56 +0300 Subject: [PATCH 3/4] remove shadow from ServerLoginPacketListenerImplMixin --- .../skinrestorer/mixin/PlayerListMixin.java | 1 + ...erverLoginPacketListenerImplAccessorInvoker.java | 13 +++++++++++++ .../mixin/ServerLoginPacketListenerImplMixin.java | 7 +------ common/src/main/resources/skinrestorer.mixins.json | 1 + 4 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplAccessorInvoker.java diff --git a/common/src/main/java/net/lionarius/skinrestorer/mixin/PlayerListMixin.java b/common/src/main/java/net/lionarius/skinrestorer/mixin/PlayerListMixin.java index 6f49c96..92982ab 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/mixin/PlayerListMixin.java +++ b/common/src/main/java/net/lionarius/skinrestorer/mixin/PlayerListMixin.java @@ -16,6 +16,7 @@ import java.util.Collections; @Mixin(PlayerList.class) public abstract class PlayerListMixin { + @Inject(method = "remove", at = @At("TAIL")) private void remove(ServerPlayer player, CallbackInfo ci) { SkinRestorer.Events.onPlayerDisconnect(player); diff --git a/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplAccessorInvoker.java b/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplAccessorInvoker.java new file mode 100644 index 0000000..aab07c3 --- /dev/null +++ b/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplAccessorInvoker.java @@ -0,0 +1,13 @@ +package net.lionarius.skinrestorer.mixin; + +import com.mojang.authlib.GameProfile; +import net.minecraft.server.network.ServerLoginPacketListenerImpl; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ServerLoginPacketListenerImpl.class) +public interface ServerLoginPacketListenerImplAccessorInvoker { + + @Accessor + GameProfile getAuthenticatedProfile(); +} diff --git a/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplMixin.java b/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplMixin.java index 28e588e..5ce9df9 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplMixin.java +++ b/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplMixin.java @@ -7,9 +7,7 @@ import net.lionarius.skinrestorer.skin.provider.SkinProviderContext; import net.lionarius.skinrestorer.util.PlayerUtils; import net.lionarius.skinrestorer.util.Result; import net.minecraft.server.network.ServerLoginPacketListenerImpl; -import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -20,9 +18,6 @@ import java.util.concurrent.CompletableFuture; @Mixin(ServerLoginPacketListenerImpl.class) public abstract class ServerLoginPacketListenerImplMixin { - @Shadow @Nullable - private GameProfile authenticatedProfile; - @Unique private CompletableFuture skinrestorer$pendingSkin; @@ -32,7 +27,7 @@ public abstract class ServerLoginPacketListenerImplMixin { public void waitForSkin(CallbackInfo ci) { if (skinrestorer$pendingSkin == null) { skinrestorer$pendingSkin = CompletableFuture.supplyAsync(() -> { - final var profile = authenticatedProfile; + final var profile = ((ServerLoginPacketListenerImplAccessorInvoker) this).getAuthenticatedProfile(); assert profile != null; var originalSkin = PlayerUtils.getPlayerSkin(profile); diff --git a/common/src/main/resources/skinrestorer.mixins.json b/common/src/main/resources/skinrestorer.mixins.json index 224662d..939d827 100644 --- a/common/src/main/resources/skinrestorer.mixins.json +++ b/common/src/main/resources/skinrestorer.mixins.json @@ -8,6 +8,7 @@ "mixins": [ "ChunkMapAccessor", "PlayerListMixin", + "ServerLoginPacketListenerImplAccessorInvoker", "ServerLoginPacketListenerImplMixin", "TrackedEntityAccessorInvoker" ], From 56655bca36697b3b30fd1e6c1e93d240c9ccfcce Mon Sep 17 00:00:00 2001 From: Lionarius Date: Fri, 30 May 2025 22:39:37 +0300 Subject: [PATCH 4/4] backport to 1.20 --- .../ServerLoginPacketListenerImplAccessorInvoker.java | 6 +++++- .../mixin/ServerLoginPacketListenerImplMixin.java | 7 ++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplAccessorInvoker.java b/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplAccessorInvoker.java index aab07c3..c637634 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplAccessorInvoker.java +++ b/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplAccessorInvoker.java @@ -4,10 +4,14 @@ import com.mojang.authlib.GameProfile; import net.minecraft.server.network.ServerLoginPacketListenerImpl; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; @Mixin(ServerLoginPacketListenerImpl.class) public interface ServerLoginPacketListenerImplAccessorInvoker { @Accessor - GameProfile getAuthenticatedProfile(); + GameProfile getGameProfile(); + + @Invoker + GameProfile invokeCreateFakeProfile(GameProfile original); } diff --git a/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplMixin.java b/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplMixin.java index 18504e8..fbcf3c1 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplMixin.java +++ b/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplMixin.java @@ -23,18 +23,15 @@ public abstract class ServerLoginPacketListenerImplMixin { @Unique private CompletableFuture skinrestorer$pendingSkin; - @Shadow - protected abstract GameProfile createFakeProfile(GameProfile original); - @Inject(method = "handleAcceptedLogin", at = @At(value = "HEAD"), cancellable = true) public void waitForSkin(CallbackInfo ci) { if (skinrestorer$pendingSkin == null) { skinrestorer$pendingSkin = CompletableFuture.supplyAsync(() -> { - var profile = gameProfile; + var profile = ((ServerLoginPacketListenerImplAccessorInvoker) this).getGameProfile(); assert profile != null; if (!profile.isComplete()) - profile = createFakeProfile(profile); + profile = ((ServerLoginPacketListenerImplAccessorInvoker) this).invokeCreateFakeProfile(profile); var originalSkin = PlayerUtils.getPlayerSkin(profile);