geforkt von Mirrors/Paper
93 Zeilen
5.3 KiB
Diff
93 Zeilen
5.3 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.
|
|
|
|
diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java
|
|
index 8bbf13a7aea1142b3154a1c76837a98aa5ed431d..9f0537799a3cae43fb120056b8fe805a4883cc4d 100644
|
|
--- a/src/main/java/net/minecraft/network/Connection.java
|
|
+++ b/src/main/java/net/minecraft/network/Connection.java
|
|
@@ -418,6 +418,26 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
|
|
this.getPacketListener().onDisconnect(new TranslatableComponent("multiplayer.disconnect.generic"));
|
|
}
|
|
this.queue.clear(); // Free up packet queue.
|
|
+ // Paper start - Add PlayerConnectionCloseEvent
|
|
+ final PacketListener packetListener = this.getPacketListener();
|
|
+ if (packetListener instanceof ServerGamePacketListenerImpl) {
|
|
+ /* Player was logged in */
|
|
+ final ServerGamePacketListenerImpl playerConnection = (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 ServerLoginPacketListenerImpl) {
|
|
+ /* Player is login stage */
|
|
+ final ServerLoginPacketListenerImpl loginListener = (ServerLoginPacketListenerImpl) packetListener;
|
|
+ switch (loginListener.getLoginState()) {
|
|
+ case READY_TO_ACCEPT:
|
|
+ case DELAY_ACCEPT:
|
|
+ case ACCEPTED:
|
|
+ final com.mojang.authlib.GameProfile profile = loginListener.getGameProfile(); /* 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
|
|
}
|
|
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
|
index a196ab2510a1c302ef1c946400c1a7c07619994a..46432534fddbbf78e3bf46385b9638d2f92c951f 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
|
@@ -56,10 +56,10 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener
|
|
private final byte[] nonce = new byte[4];
|
|
final MinecraftServer server;
|
|
public final Connection connection;
|
|
- ServerLoginPacketListenerImpl.State state;
|
|
+ ServerLoginPacketListenerImpl.State state; public final ServerLoginPacketListenerImpl.State getLoginState() { return this.state; }; // Paper - OBFHELPER
|
|
private int tick;
|
|
@Nullable
|
|
- GameProfile gameProfile;
|
|
+ GameProfile gameProfile; private void setGameProfile(final GameProfile profile) { this.gameProfile = profile; } public GameProfile getGameProfile() { return this.gameProfile; } // Paper - OBFHELPER
|
|
private final String serverId;
|
|
@Nullable
|
|
private ServerPlayer delayedAcceptPlayer;
|
|
@@ -441,7 +441,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener
|
|
return new GameProfile(uuid, profile.getName());
|
|
}
|
|
|
|
- private static enum State {
|
|
+ public static enum State { // Paper - make public
|
|
|
|
HELLO, KEY, AUTHENTICATING, NEGOTIATING, READY_TO_ACCEPT, DELAY_ACCEPT, ACCEPTED;
|
|
|