Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-15 02:50:09 +01:00
84 Zeilen
4.7 KiB
Diff
84 Zeilen
4.7 KiB
Diff
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.
|
|
|
|
== 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 42c0723e2fe43e1f268119a16067e8bdfb971208..9885dec92cd26dec61c303dda687b0f910d49749 100644
|
|
--- a/src/main/java/net/minecraft/network/Connection.java
|
|
+++ b/src/main/java/net/minecraft/network/Connection.java
|
|
@@ -680,6 +680,26 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
|
|
packetlistener1.onDisconnect(ichatbasecomponent);
|
|
}
|
|
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 2ca467bd9c53a59f1ca9b8e1c2cf683182a71910..5bb7b0ab8a1e566f07f7f39bf072abcbe44e73d2 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
|
@@ -79,7 +79,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
|