* Re-arrange most chunk system patches to front Co-authored-by: Spottedleaf <Spottedleaf@users.noreply.github.com>
		
			
				
	
	
		
			66 lines
		
	
	
	
		
			3.9 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
	
		
			3.9 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 07fd527dd5b72ecc66311c1b81e578158e12a35c..527acbc15f3fe30541eef555480e158ab83a6130 100644
 | 
						|
--- a/src/main/java/net/minecraft/network/Connection.java
 | 
						|
+++ b/src/main/java/net/minecraft/network/Connection.java
 | 
						|
@@ -439,6 +439,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 net.minecraft.server.network.ServerGamePacketListenerImpl) {
 | 
						|
+                    /* Player was logged in */
 | 
						|
+                    final net.minecraft.server.network.ServerGamePacketListenerImpl playerConnection = (net.minecraft.server.network.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 net.minecraft.server.network.ServerLoginPacketListenerImpl) {
 | 
						|
+                    /* Player is login stage */
 | 
						|
+                    final net.minecraft.server.network.ServerLoginPacketListenerImpl loginListener = (net.minecraft.server.network.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
 | 
						|
             }
 | 
						|
 
 | 
						|
         }
 |