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 049ccda..f5d879d 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/mixin/PlayerListMixin.java +++ b/common/src/main/java/net/lionarius/skinrestorer/mixin/PlayerListMixin.java @@ -5,26 +5,17 @@ import net.minecraft.network.Connection; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; 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 - public abstract List getPlayers(); - - @Shadow @Final - private MinecraftServer server; - @Inject(method = "remove", at = @At("TAIL")) private void remove(ServerPlayer player, CallbackInfo ci) { SkinRestorer.Events.onPlayerDisconnect(player); @@ -32,13 +23,14 @@ 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); } } @Inject(method = "placeNewPlayer", at = @At("HEAD")) private void placeNewPlayer(Connection connection, ServerPlayer player, CallbackInfo ci) { + var server = ((PlayerList) (Object) this).getServer(); var delay = SkinRestorer.getConfig().skinApplyDelayOnJoin(); if (delay <= 0) { 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..c637634 --- /dev/null +++ b/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplAccessorInvoker.java @@ -0,0 +1,17 @@ +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; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(ServerLoginPacketListenerImpl.class) +public interface ServerLoginPacketListenerImplAccessorInvoker { + + @Accessor + 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 e76f684..fbcf3c1 100644 --- a/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplMixin.java +++ b/common/src/main/java/net/lionarius/skinrestorer/mixin/ServerLoginPacketListenerImplMixin.java @@ -20,24 +20,18 @@ import java.util.concurrent.CompletableFuture; @Mixin(ServerLoginPacketListenerImpl.class) public abstract class ServerLoginPacketListenerImplMixin { - @Shadow @Nullable - private GameProfile gameProfile; - @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); 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" ],