From 882d89d0e67e7a5db99069d2153d5ee84869e2f9 Mon Sep 17 00:00:00 2001 From: kirillsaint Date: Tue, 16 Jan 2024 18:26:16 +0600 Subject: [PATCH] (vanilla fix) resolve NPE in NetHandlerPlayClient#handleSpawnPlayer --- .../mixins/NetHandlerPlayClientMixin.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/silentclient/client/mixin/mixins/NetHandlerPlayClientMixin.java b/src/main/java/net/silentclient/client/mixin/mixins/NetHandlerPlayClientMixin.java index 844b870..34a4e49 100644 --- a/src/main/java/net/silentclient/client/mixin/mixins/NetHandlerPlayClientMixin.java +++ b/src/main/java/net/silentclient/client/mixin/mixins/NetHandlerPlayClientMixin.java @@ -4,7 +4,9 @@ import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.network.NetHandlerPlayClient; +import net.minecraft.client.network.NetworkPlayerInfo; import net.minecraft.network.play.server.S01PacketJoinGame; +import net.minecraft.network.play.server.S0CPacketSpawnPlayer; import net.minecraft.network.play.server.S19PacketEntityStatus; import net.minecraft.network.play.server.S48PacketResourcePackSend; import net.minecraft.util.IChatComponent; @@ -16,9 +18,28 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.UUID; + @Mixin(NetHandlerPlayClient.class) -public class NetHandlerPlayClientMixin { +public abstract class NetHandlerPlayClientMixin { @Shadow private WorldClient clientWorldController; + @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(); + } + } @Inject(method = "handleEntityStatus", at = @At("RETURN")) public void callEntityDamageEvent(S19PacketEntityStatus packetIn, CallbackInfo ci) {