From 7afae7f46547c9f37679f8f641ee490de2a5e293 Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Sun, 9 Mar 2025 18:14:44 +0100 Subject: [PATCH] Add client tick end event (#12199) --- .../event/packet/ClientTickEndEvent.java | 29 +++++++++++++++++++ .../ServerGamePacketListenerImpl.java.patch | 11 +++++-- 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 paper-api/src/main/java/io/papermc/paper/event/packet/ClientTickEndEvent.java diff --git a/paper-api/src/main/java/io/papermc/paper/event/packet/ClientTickEndEvent.java b/paper-api/src/main/java/io/papermc/paper/event/packet/ClientTickEndEvent.java new file mode 100644 index 000000000..78227fd5f --- /dev/null +++ b/paper-api/src/main/java/io/papermc/paper/event/packet/ClientTickEndEvent.java @@ -0,0 +1,29 @@ +package io.papermc.paper.event.packet; + +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; + +/** + * Called when a {@code minecraft:client_tick_end} packet is received by the server. + */ +@NullMarked +public class ClientTickEndEvent extends PlayerEvent { + private static final HandlerList HANDLER_LIST = new HandlerList(); + + @ApiStatus.Internal + public ClientTickEndEvent(final Player player) { + super(player); + } + + @Override + public HandlerList getHandlers() { + return HANDLER_LIST; + } + + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } +} diff --git a/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch b/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch index 8589a3b4e..ba6e737d4 100644 --- a/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch @@ -70,7 +70,7 @@ private double firstGoodX; private double firstGoodY; private double firstGoodZ; -@@ -236,22 +_,39 @@ +@@ -236,22 +_,41 @@ private int receivedMovePacketCount; private int knownMovePacketCount; private boolean receivedMovementThisTick; @@ -98,6 +98,7 @@ private final FutureChain chatMessageChain; private boolean waitingForSwitchToConfig; + private static final int MAX_SIGN_LINE_LENGTH = Integer.getInteger("Paper.maxSignLength", 80); // Paper - Limit client sign length ++ private final io.papermc.paper.event.packet.ClientTickEndEvent tickEndEvent; // Paper - add client tick end event public ServerGamePacketListenerImpl(MinecraftServer server, Connection connection, ServerPlayer player, CommonListenerCookie cookie) { - super(server, connection, cookie); @@ -109,6 +110,7 @@ this.signedMessageDecoder = SignedMessageChain.Decoder.unsigned(player.getUUID(), server::enforceSecureProfile); - this.chatMessageChain = new FutureChain(server); + this.chatMessageChain = new FutureChain(server.chatExecutor); // CraftBukkit - async chat ++ this.tickEndEvent = new io.papermc.paper.event.packet.ClientTickEndEvent(player.getBukkitEntity()); // Paper - add client tick end event } @Override @@ -2598,7 +2600,7 @@ this.signedMessageDecoder = chatSession.createMessageDecoder(this.player.getUUID()); this.chatMessageChain .append( -@@ -1919,15 +_,17 @@ +@@ -1919,19 +_,22 @@ this.server .getPlayerList() .broadcastAll( @@ -2620,6 +2622,11 @@ @Override public void handleClientTickEnd(ServerboundClientTickEndPacket packet) { + PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); ++ this.tickEndEvent.callEvent(); // Paper - add client tick end event + if (!this.receivedMovementThisTick) { + this.player.setKnownMovement(Vec3.ZERO); + } @@ -1957,4 +_,17 @@ interface EntityInteraction { InteractionResult run(ServerPlayer player, Entity entity, InteractionHand hand);