geforkt von Mirrors/Paper
01a13871de
Patch documentation to come Issues with the old system that are fixed now: - World generation does not scale with cpu cores effectively. - Relies on the main thread for scheduling and maintaining chunk state, dropping chunk load/generate rates at lower tps. - Unreliable prioritisation of chunk gen/load calls that block the main thread. - Shutdown logic is utterly unreliable, as it has to wait for all chunks to unload - is it guaranteed that the chunk system is in a state on shutdown that it can reliably do this? Watchdog shutdown also typically failed due to thread checks, which is now resolved. - Saving of data is not unified (i.e can save chunk data without saving entity data, poses problems for desync if shutdown is really abnormal. - Entities are not loaded with chunks. This caused quite a bit of headache for Chunk#getEntities API, but now the new chunk system loads entities with chunks so that they are ready whenever the chunk loads in. Effectively brings the behavior back to 1.16 era, but still storing entities in their own separate regionfiles. The above list is not complete. The patch documentation will complete it. New chunk system hard relies on starlight and dataconverter, and most importantly the new concurrent utilities in ConcurrentUtil. Some of the old async chunk i/o interface (i.e the old file io thread reroutes _some_ calls to the new file io thread) is kept for plugin compat reasons. It will be removed in the next major version of minecraft. The old legacy chunk system patches have been moved to the removed folder in case we need them again.
67 Zeilen
3.9 KiB
Diff
67 Zeilen
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 870badca869aca1ad293542b345a038ddf715135..dd9c03611e410e601ba4a7769474fada8c28c104 100644
|
|
--- a/src/main/java/net/minecraft/network/Connection.java
|
|
+++ b/src/main/java/net/minecraft/network/Connection.java
|
|
@@ -468,6 +468,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
|
|
}
|
|
|
|
}
|