From 4090c177f01cff0e3adff47e97862b2eb03e82d3 Mon Sep 17 00:00:00 2001 From: Alexdoru <57050655+Alexdoru@users.noreply.github.com> Date: Wed, 12 Jul 2023 16:47:20 +0200 Subject: [PATCH] new: resolve NPE in NetHandlerPlayClient#handleSpawnPlayer (#152) --- ...lerPlayClient_FixHandleSpawnPlayerNPE.java | 35 +++++++++++++++++++ src/main/resources/patcher.mixins.json | 1 + versions/1.12.2-1.8.9.txt | 1 + 3 files changed, 37 insertions(+) create mode 100644 src/main/java/club/sk1er/patcher/mixins/bugfixes/NetHandlerPlayClient_FixHandleSpawnPlayerNPE.java diff --git a/src/main/java/club/sk1er/patcher/mixins/bugfixes/NetHandlerPlayClient_FixHandleSpawnPlayerNPE.java b/src/main/java/club/sk1er/patcher/mixins/bugfixes/NetHandlerPlayClient_FixHandleSpawnPlayerNPE.java new file mode 100644 index 000000000..40119c6ae --- /dev/null +++ b/src/main/java/club/sk1er/patcher/mixins/bugfixes/NetHandlerPlayClient_FixHandleSpawnPlayerNPE.java @@ -0,0 +1,35 @@ +package club.sk1er.patcher.mixins.bugfixes; + +import net.minecraft.client.network.NetHandlerPlayClient; +import net.minecraft.client.network.NetworkPlayerInfo; +import net.minecraft.network.play.server.S0CPacketSpawnPlayer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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.UUID; + +@Mixin(NetHandlerPlayClient.class) +public abstract class NetHandlerPlayClient_FixHandleSpawnPlayerNPE { + + @Shadow + public abstract NetworkPlayerInfo getPlayerInfo(UUID p_175102_1_); + + @Inject( + method = "handleSpawnPlayer", + cancellable = true, + at = + @At( + value = "INVOKE", + target = "Lnet/minecraft/network/PacketThreadUtil;checkThreadAndEnqueue(Lnet/minecraft/network/Packet;Lnet/minecraft/network/INetHandler;Lnet/minecraft/util/IThreadListener;)V", + shift = At.Shift.AFTER + )) + private void patcher$fixHandleSpawnPlayerNPE(S0CPacketSpawnPlayer packetIn, CallbackInfo ci) { + if (this.getPlayerInfo(packetIn.getPlayer()) == null) { + ci.cancel(); + } + } + +} diff --git a/src/main/resources/patcher.mixins.json b/src/main/resources/patcher.mixins.json index 454a91bc2..cbf348af7 100644 --- a/src/main/resources/patcher.mixins.json +++ b/src/main/resources/patcher.mixins.json @@ -68,6 +68,7 @@ "bugfixes.MinecraftMixin_FixScreenState", "bugfixes.MinecraftMixin_ForeignKeyboards", "bugfixes.MinecraftMixin_PersistentShaders", + "bugfixes.NetHandlerPlayClient_FixHandleSpawnPlayerNPE", "bugfixes.RenderPlayerMixin_ArmPosition", "bugfixes.ScoreboardMixin_FixLogSpam", "bugfixes.SoundManagerMixin_DuplicatedSounds", diff --git a/versions/1.12.2-1.8.9.txt b/versions/1.12.2-1.8.9.txt index 862196177..b47904232 100644 --- a/versions/1.12.2-1.8.9.txt +++ b/versions/1.12.2-1.8.9.txt @@ -41,6 +41,7 @@ net.minecraft.network.play.server.SPacketEntityHeadLook net.minecraft.network.pl net.minecraft.network.play.server.SPacketEntityStatus net.minecraft.network.play.server.S19PacketEntityStatus net.minecraft.network.play.server.SPacketCloseWindow net.minecraft.network.play.server.S2EPacketCloseWindow net.minecraft.network.play.server.SPacketCustomPayload net.minecraft.network.play.server.S3FPacketCustomPayload +net.minecraft.network.play.server.SPacketSpawnPlayer net.minecraft.network.play.server.S0CPacketSpawnPlayer net.minecraft.network.status.client.CPacketServerQuery net.minecraft.network.status.client.C00PacketServerQuery net.minecraft.network.status.server.SPacketServerInfo net.minecraft.network.status.server.S00PacketServerInfo net.minecraft.network.status.server.SPacketPong net.minecraft.network.status.server.S01PacketPong