aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0291-Add-PlayerConnectionCloseEvent.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0291-Add-PlayerConnectionCloseEvent.patch')
-rw-r--r--patches/server/0291-Add-PlayerConnectionCloseEvent.patch66
1 files changed, 66 insertions, 0 deletions
diff --git a/patches/server/0291-Add-PlayerConnectionCloseEvent.patch b/patches/server/0291-Add-PlayerConnectionCloseEvent.patch
new file mode 100644
index 0000000000..eade64b652
--- /dev/null
+++ b/patches/server/0291-Add-PlayerConnectionCloseEvent.patch
@@ -0,0 +1,66 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Spottedleaf <[email protected]>
+Date: Sun, 7 Oct 2018 12:05:28 -0700
+Subject: [PATCH] Add PlayerConnectionCloseEvent
+
+This event is invoked when a player has disconnected. It is guaranteed that,
+if the server is in online-mode, that the provided uuid and username have been
+validated.
+
+The event is invoked for players who have not yet logged into the world, whereas
+PlayerQuitEvent is only invoked on players who have logged into the world.
+
+The event is invoked for players who have already logged into the world,
+although whether or not the player exists in the world at the time of
+firing is undefined. (That is, whether the plugin can retrieve a Player object
+using the event parameters is undefined). However, it is guaranteed that this
+event is invoked AFTER PlayerQuitEvent, if the player has already logged into
+the world.
+
+This event is guaranteed to never fire unless AsyncPlayerPreLoginEvent has
+been called beforehand, and this event may not be called in parallel with
+AsyncPlayerPreLoginEvent for the same connection.
+
+Cancelling the AsyncPlayerPreLoginEvent guarantees the corresponding
+PlayerConnectionCloseEvent is never called.
+
+The event may be invoked asynchronously or synchronously. As it stands,
+it is never invoked asynchronously. However, plugins should check
+Event#isAsynchronous to be future-proof.
+
+On purpose, the deprecated PlayerPreLoginEvent event is left out of the
+API spec for this event. Plugins should not be using that event, and
+how PlayerPreLoginEvent interacts with PlayerConnectionCloseEvent
+is undefined.
+
+diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java
+index 870badca869aca1ad293542b345a038ddf715135..dd9c03611e410e601ba4a7769474fada8c28c104 100644
+--- a/src/main/java/net/minecraft/network/Connection.java
++++ b/src/main/java/net/minecraft/network/Connection.java
+@@ -468,6 +468,26 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
+ this.getPacketListener().onDisconnect(Component.translatable("multiplayer.disconnect.generic"));
+ }
+ this.queue.clear(); // Free up packet queue.
++ // Paper start - Add PlayerConnectionCloseEvent
++ final PacketListener packetListener = this.getPacketListener();
++ if (packetListener instanceof net.minecraft.server.network.ServerGamePacketListenerImpl) {
++ /* Player was logged in */
++ final net.minecraft.server.network.ServerGamePacketListenerImpl playerConnection = (net.minecraft.server.network.ServerGamePacketListenerImpl) packetListener;
++ new com.destroystokyo.paper.event.player.PlayerConnectionCloseEvent(playerConnection.player.getUUID(),
++ playerConnection.player.getScoreboardName(), ((java.net.InetSocketAddress)address).getAddress(), false).callEvent();
++ } else if (packetListener instanceof net.minecraft.server.network.ServerLoginPacketListenerImpl) {
++ /* Player is login stage */
++ final net.minecraft.server.network.ServerLoginPacketListenerImpl loginListener = (net.minecraft.server.network.ServerLoginPacketListenerImpl) packetListener;
++ switch (loginListener.state) {
++ case READY_TO_ACCEPT:
++ case DELAY_ACCEPT:
++ case ACCEPTED:
++ final com.mojang.authlib.GameProfile profile = loginListener.gameProfile; /* Should be non-null at this stage */
++ new com.destroystokyo.paper.event.player.PlayerConnectionCloseEvent(profile.getId(), profile.getName(),
++ ((java.net.InetSocketAddress)address).getAddress(), false).callEvent();
++ }
++ }
++ // Paper end
+ }
+
+ }