2021-06-11 14:02:28 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
|
|
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.
|
|
|
|
|
2022-11-20 00:53:20 +01:00
|
|
|
== AT ==
|
|
|
|
public net.minecraft.server.network.ServerLoginPacketListenerImpl$State
|
|
|
|
public net.minecraft.server.network.ServerLoginPacketListenerImpl state
|
|
|
|
|
2021-06-11 14:02:28 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java
|
2023-09-26 18:20:17 +02:00
|
|
|
index 6fcbf8205e1852d5193a42bfe1154f62ab01e7ad..25881c890c643ce90bdcda6b094d912bafb0ed75 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/network/Connection.java
|
|
|
|
+++ b/src/main/java/net/minecraft/network/Connection.java
|
2023-09-26 18:20:17 +02:00
|
|
|
@@ -644,6 +644,26 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
|
2023-09-22 00:26:51 +02:00
|
|
|
packetlistener1.onDisconnect(ichatbasecomponent);
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
2023-09-22 00:26:51 +02:00
|
|
|
this.pendingActions.clear(); // Free up packet queue.
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper start - Add PlayerConnectionCloseEvent
|
|
|
|
+ final PacketListener packetListener = this.getPacketListener();
|
2023-09-26 18:20:17 +02:00
|
|
|
+ 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(), ((java.net.InetSocketAddress)address).getAddress(), false).callEvent();
|
|
|
|
+ } else if (packetListener instanceof net.minecraft.server.network.ServerLoginPacketListenerImpl loginListener) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ /* Player is login stage */
|
2021-06-17 23:39:36 +02:00
|
|
|
+ switch (loginListener.state) {
|
2023-09-23 00:33:14 +02:00
|
|
|
+ case VERIFYING:
|
|
|
|
+ case WAITING_FOR_DUPE_DISCONNECT:
|
|
|
|
+ case PROTOCOL_SWITCHING:
|
2021-06-11 14:02:28 +02:00
|
|
|
+ case ACCEPTED:
|
2023-09-23 00:33:14 +02:00
|
|
|
+ final com.mojang.authlib.GameProfile profile = loginListener.authenticatedProfile; /* Should be non-null at this stage */
|
2021-06-11 14:02:28 +02:00
|
|
|
+ new com.destroystokyo.paper.event.player.PlayerConnectionCloseEvent(profile.getId(), profile.getName(),
|
|
|
|
+ ((java.net.InetSocketAddress)address).getAddress(), false).callEvent();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
|
2023-09-22 00:26:51 +02:00
|
|
|
}
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
2023-09-23 00:33:14 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
2023-12-05 23:21:44 +01:00
|
|
|
index 96ae1fd95956f5e5a1542dcce3fbd9d4b83d49ba..615fb00e50f3c434809f8e1b201d457b9beae8fd 100644
|
2023-09-23 00:33:14 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
2023-12-05 23:21:44 +01:00
|
|
|
@@ -60,7 +60,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
|
2023-09-23 00:33:14 +02:00
|
|
|
@Nullable
|
|
|
|
String requestedUsername;
|
|
|
|
@Nullable
|
|
|
|
- private GameProfile authenticatedProfile;
|
|
|
|
+ public GameProfile authenticatedProfile; // Paper - public
|
|
|
|
private final String serverId;
|
|
|
|
private ServerPlayer player; // CraftBukkit
|
|
|
|
|