aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0271-Add-PlayerConnectionCloseEvent.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0271-Add-PlayerConnectionCloseEvent.patch')
-rw-r--r--patches/server/0271-Add-PlayerConnectionCloseEvent.patch83
1 files changed, 83 insertions, 0 deletions
diff --git a/patches/server/0271-Add-PlayerConnectionCloseEvent.patch b/patches/server/0271-Add-PlayerConnectionCloseEvent.patch
new file mode 100644
index 0000000000..5c63a589af
--- /dev/null
+++ b/patches/server/0271-Add-PlayerConnectionCloseEvent.patch
@@ -0,0 +1,83 @@
+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.
+
+== AT ==
+public net.minecraft.server.network.ServerLoginPacketListenerImpl$State
+public net.minecraft.server.network.ServerLoginPacketListenerImpl state
+
+diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java
+index c45b8b2c89ffec7bd6a6875963c61f11185d3ee1..38947f40864f3661df2eb4baa0aef5740b82f9d9 100644
+--- a/src/main/java/net/minecraft/network/Connection.java
++++ b/src/main/java/net/minecraft/network/Connection.java
+@@ -692,6 +692,26 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
+ packetlistener1.onDisconnect(disconnectiondetails);
+ }
+ this.pendingActions.clear(); // Free up packet queue.
++ // Paper start - Add PlayerConnectionCloseEvent
++ final PacketListener packetListener = this.getPacketListener();
++ if (packetListener instanceof net.minecraft.server.network.ServerCommonPacketListenerImpl commonPacketListener) {
++ /* Player was logged in, either game listener or configuration listener */
++ final com.mojang.authlib.GameProfile profile = commonPacketListener.getOwner();
++ new com.destroystokyo.paper.event.player.PlayerConnectionCloseEvent(profile.getId(),
++ profile.getName(), ((InetSocketAddress) this.address).getAddress(), false).callEvent();
++ } else if (packetListener instanceof net.minecraft.server.network.ServerLoginPacketListenerImpl loginListener) {
++ /* Player is login stage */
++ switch (loginListener.state) {
++ case VERIFYING:
++ case WAITING_FOR_DUPE_DISCONNECT:
++ case PROTOCOL_SWITCHING:
++ case ACCEPTED:
++ final com.mojang.authlib.GameProfile profile = loginListener.authenticatedProfile; /* Should be non-null at this stage */
++ new com.destroystokyo.paper.event.player.PlayerConnectionCloseEvent(profile.getId(), profile.getName(),
++ ((InetSocketAddress) this.address).getAddress(), false).callEvent();
++ }
++ }
++ // Paper end - Add PlayerConnectionCloseEvent
+
+ }
+ }
+diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
+index b31f00f2f0b7cec59301afe36c9dd7cdc120fc9d..53b1fd2d1328bde3fe195964ce39ff5c0f5a7c05 100644
+--- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
+@@ -81,7 +81,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
+ @Nullable
+ String requestedUsername;
+ @Nullable
+- private GameProfile authenticatedProfile;
++ public GameProfile authenticatedProfile; // Paper - public
+ private final String serverId;
+ private final boolean transferred;
+ private ServerPlayer player; // CraftBukkit