geforkt von Mirrors/Paper
41647af74c
We cannot put blocking network I/O onto the worldgen threads, this will crash the server if it stalls
67 Zeilen
3.8 KiB
Diff
67 Zeilen
3.8 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 8e7f7c7ad159c75d8066aa47aa5d8dd2add201eb..58e50b56b0e3f1388826c73c4616a1e24852bdbd 100644
|
|
--- a/src/main/java/net/minecraft/network/Connection.java
|
|
+++ b/src/main/java/net/minecraft/network/Connection.java
|
|
@@ -430,6 +430,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 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.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
|
|
}
|
|
|
|
}
|