From cabf81319833df466cb0fd0c45bfea1441fc05b1 Mon Sep 17 00:00:00 2001 From: tanyaofei Date: Sat, 5 Oct 2024 21:01:03 +0800 Subject: [PATCH] Fix fake players do not knockback when kiting --- .../FakeServerGamePacketListenerImpl.java | 17 +++++++++++++++-- .../FakeServerGamePacketListenerImpl.java | 15 +++++++++++++++ .../FakeServerGamePacketListenerImpl.java | 17 ++++++++++++++++- .../FakeServerGamePacketListenerImpl.java | 17 ++++++++++++++++- .../FakeServerGamePacketListenerImpl.java | 15 +++++++++++++++ 5 files changed, 77 insertions(+), 4 deletions(-) diff --git a/fakeplayer-v1_20_1/src/main/java/io/github/hello09x/fakeplayer/v1_20_1/network/FakeServerGamePacketListenerImpl.java b/fakeplayer-v1_20_1/src/main/java/io/github/hello09x/fakeplayer/v1_20_1/network/FakeServerGamePacketListenerImpl.java index e70a6bb..9c0875a 100644 --- a/fakeplayer-v1_20_1/src/main/java/io/github/hello09x/fakeplayer/v1_20_1/network/FakeServerGamePacketListenerImpl.java +++ b/fakeplayer-v1_20_1/src/main/java/io/github/hello09x/fakeplayer/v1_20_1/network/FakeServerGamePacketListenerImpl.java @@ -6,6 +6,7 @@ import io.github.hello09x.fakeplayer.core.manager.FakeplayerManager; import net.minecraft.network.Connection; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientboundCustomPayloadPacket; +import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; @@ -34,9 +35,21 @@ public class FakeServerGamePacketListenerImpl extends ServerGamePacketListenerIm @Override public void send(Packet packet) { if (packet instanceof ClientboundCustomPayloadPacket p) { - // 接收到自定义的数据包,由于假人没有连接导致 BungeeCord 的插件消息无法正确通过 Proxy 发送 - // 因此将该数据包通过真实的玩家重新发送一份 this.handleCustomPayloadPacket(p); + } else if (packet instanceof ClientboundSetEntityMotionPacket p) { + this.handleClientboundSetEntityMotionPacket(p); + } + } + + /** + * 玩家被击退的动作由客户端完成, 假人没有客户端因此手动完成这个动作 + */ + public void handleClientboundSetEntityMotionPacket(@NotNull ClientboundSetEntityMotionPacket packet) { + if (packet.getId() == this.player.getId() && this.player.hurtMarked) { + Bukkit.getScheduler().runTask(Main.getInstance(), () -> { + this.player.hurtMarked = true; + this.player.lerpMotion(packet.getXa(), packet.getYa(), packet.getZa()); + }); } } diff --git a/fakeplayer-v1_20_2/src/main/java/io/github/hello09x/fakeplayer/v1_20_2/network/FakeServerGamePacketListenerImpl.java b/fakeplayer-v1_20_2/src/main/java/io/github/hello09x/fakeplayer/v1_20_2/network/FakeServerGamePacketListenerImpl.java index 896da8c..5cbfd9c 100644 --- a/fakeplayer-v1_20_2/src/main/java/io/github/hello09x/fakeplayer/v1_20_2/network/FakeServerGamePacketListenerImpl.java +++ b/fakeplayer-v1_20_2/src/main/java/io/github/hello09x/fakeplayer/v1_20_2/network/FakeServerGamePacketListenerImpl.java @@ -9,6 +9,7 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; @@ -39,6 +40,20 @@ public class FakeServerGamePacketListenerImpl extends ServerGamePacketListenerIm public void send(Packet packet) { if (packet instanceof ClientboundCustomPayloadPacket p) { this.handleCustomPayloadPacket(p.payload()); + } else if (packet instanceof ClientboundSetEntityMotionPacket p) { + this.handleClientboundSetEntityMotionPacket(p); + } + } + + /** + * 玩家被击退的动作由客户端完成, 假人没有客户端因此手动完成这个动作 + */ + public void handleClientboundSetEntityMotionPacket(@NotNull ClientboundSetEntityMotionPacket packet) { + if (packet.getId() == this.player.getId() && this.player.hurtMarked) { + Bukkit.getScheduler().runTask(Main.getInstance(), () -> { + this.player.hurtMarked = true; + this.player.lerpMotion(packet.getXa(), packet.getYa(), packet.getZa()); + }); } } diff --git a/fakeplayer-v1_20_4/src/main/java/io/github/hello09x/fakeplayer/v1_20_4/network/FakeServerGamePacketListenerImpl.java b/fakeplayer-v1_20_4/src/main/java/io/github/hello09x/fakeplayer/v1_20_4/network/FakeServerGamePacketListenerImpl.java index 87c9bb4..b24a457 100644 --- a/fakeplayer-v1_20_4/src/main/java/io/github/hello09x/fakeplayer/v1_20_4/network/FakeServerGamePacketListenerImpl.java +++ b/fakeplayer-v1_20_4/src/main/java/io/github/hello09x/fakeplayer/v1_20_4/network/FakeServerGamePacketListenerImpl.java @@ -9,6 +9,7 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; @@ -35,10 +36,24 @@ public class FakeServerGamePacketListenerImpl extends ServerGamePacketListenerIm .ifPresent(p -> p.addChannel(BUNGEE_CORD_CORRECTED_CHANNEL)); } - @Override + @Override public void send(Packet packet) { if (packet instanceof ClientboundCustomPayloadPacket p) { this.handleCustomPayloadPacket(p.payload()); + } else if (packet instanceof ClientboundSetEntityMotionPacket p) { + this.handleClientboundSetEntityMotionPacket(p); + } + } + + /** + * 玩家被击退的动作由客户端完成, 假人没有客户端因此手动完成这个动作 + */ + public void handleClientboundSetEntityMotionPacket(@NotNull ClientboundSetEntityMotionPacket packet) { + if (packet.getId() == this.player.getId() && this.player.hurtMarked) { + Bukkit.getScheduler().runTask(Main.getInstance(), () -> { + this.player.hurtMarked = true; + this.player.lerpMotion(packet.getXa(), packet.getYa(), packet.getZa()); + }); } } diff --git a/fakeplayer-v1_20_6/src/main/java/io/github/hello09x/fakeplayer/v1_20_6/network/FakeServerGamePacketListenerImpl.java b/fakeplayer-v1_20_6/src/main/java/io/github/hello09x/fakeplayer/v1_20_6/network/FakeServerGamePacketListenerImpl.java index 5dc0afb..51dc7a4 100644 --- a/fakeplayer-v1_20_6/src/main/java/io/github/hello09x/fakeplayer/v1_20_6/network/FakeServerGamePacketListenerImpl.java +++ b/fakeplayer-v1_20_6/src/main/java/io/github/hello09x/fakeplayer/v1_20_6/network/FakeServerGamePacketListenerImpl.java @@ -7,6 +7,7 @@ import net.minecraft.network.Connection; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket; import net.minecraft.network.protocol.common.custom.DiscardedPayload; +import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; @@ -35,10 +36,24 @@ public class FakeServerGamePacketListenerImpl extends ServerGamePacketListenerIm .ifPresent(p -> p.addChannel(BUNGEE_CORD_CORRECTED_CHANNEL)); } - @Override + @Override public void send(Packet packet) { if (packet instanceof ClientboundCustomPayloadPacket p) { this.handleCustomPayloadPacket(p); + } else if (packet instanceof ClientboundSetEntityMotionPacket p) { + this.handleClientboundSetEntityMotionPacket(p); + } + } + + /** + * 玩家被击退的动作由客户端完成, 假人没有客户端因此手动完成这个动作 + */ + public void handleClientboundSetEntityMotionPacket(@NotNull ClientboundSetEntityMotionPacket packet) { + if (packet.getId() == this.player.getId() && this.player.hurtMarked) { + Bukkit.getScheduler().runTask(Main.getInstance(), () -> { + this.player.hurtMarked = true; + this.player.lerpMotion(packet.getXa(), packet.getYa(), packet.getZa()); + }); } } diff --git a/fakeplayer-v1_21/src/main/java/io/github/hello09x/fakeplayer/v1_21/network/FakeServerGamePacketListenerImpl.java b/fakeplayer-v1_21/src/main/java/io/github/hello09x/fakeplayer/v1_21/network/FakeServerGamePacketListenerImpl.java index f28910a..81f3fde 100644 --- a/fakeplayer-v1_21/src/main/java/io/github/hello09x/fakeplayer/v1_21/network/FakeServerGamePacketListenerImpl.java +++ b/fakeplayer-v1_21/src/main/java/io/github/hello09x/fakeplayer/v1_21/network/FakeServerGamePacketListenerImpl.java @@ -7,6 +7,7 @@ import net.minecraft.network.Connection; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket; import net.minecraft.network.protocol.common.custom.DiscardedPayload; +import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; @@ -39,6 +40,20 @@ public class FakeServerGamePacketListenerImpl extends ServerGamePacketListenerIm public void send(Packet packet) { if (packet instanceof ClientboundCustomPayloadPacket p) { this.handleCustomPayloadPacket(p); + } else if (packet instanceof ClientboundSetEntityMotionPacket p) { + this.handleClientboundSetEntityMotionPacket(p); + } + } + + /** + * 玩家被击退的动作由客户端完成, 假人没有客户端因此手动完成这个动作 + */ + public void handleClientboundSetEntityMotionPacket(@NotNull ClientboundSetEntityMotionPacket packet) { + if (packet.getId() == this.player.getId() && this.player.hurtMarked) { + Bukkit.getScheduler().runTask(Main.getInstance(), () -> { + this.player.hurtMarked = true; + this.player.lerpMotion(packet.getXa(), packet.getYa(), packet.getZa()); + }); } }