From dda939b7b7fd9cd294f9dd64438e74ecca62def3 Mon Sep 17 00:00:00 2001
From: Nassim Jahnke <nassim@njahnke.dev>
Date: Wed, 2 Mar 2022 10:21:30 +0100
Subject: [PATCH] Force close world loading screen on join (#7529)

Fixes infinite loading screens for dead players due to async chunk loading and player chunk loading patches and prevents players from missing messages and similar if chunk loading is slow
---
 .../Force-close-world-loading-screen.patch    | 29 +++++++++++++++++++
 1 file changed, 29 insertions(+)
 create mode 100644 patches/server/Force-close-world-loading-screen.patch

diff --git a/patches/server/Force-close-world-loading-screen.patch b/patches/server/Force-close-world-loading-screen.patch
new file mode 100644
index 0000000000..90d71cb431
--- /dev/null
+++ b/patches/server/Force-close-world-loading-screen.patch
@@ -0,0 +1,29 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Nassim Jahnke <nassim@njahnke.dev>
+Date: Wed, 2 Mar 2022 09:45:56 +0100
+Subject: [PATCH] Force close world loading screen
+
+Dead players would be stuck in the world loading screen and other players may
+miss messages and similar sent in the join event if chunk loading is slow.
+Paper already circumvents falling through the world before chunks are loaded,
+so we do not need that. The client only needs the chunk it is currently in to
+be loaded to close the loading screen, so we just send an empty one.
+
+diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/players/PlayerList.java
++++ b/src/main/java/net/minecraft/server/players/PlayerList.java
+@@ -0,0 +0,0 @@ public abstract class PlayerList {
+ 
+         // Paper start - move vehicle into method so it can be called above - short circuit around that code
+         onPlayerJoinFinish(player, worldserver1, s1);
++        // Send empty chunk, so players aren't stuck in the world loading screen
++        net.minecraft.core.Holder<net.minecraft.world.level.biome.Biome> plains = worldserver1.registryAccess().registryOrThrow(net.minecraft.core.Registry.BIOME_REGISTRY)
++            .getHolderOrThrow(net.minecraft.world.level.biome.Biomes.PLAINS);
++        player.connection.send(new net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket(
++            new net.minecraft.world.level.chunk.EmptyLevelChunk(worldserver1, player.chunkPosition(), plains),
++            worldserver1.getLightEngine(), null, null, true, false)
++        );
+     }
+     private void mountSavedVehicle(ServerPlayer player, ServerLevel worldserver1, CompoundTag nbttagcompound) {
+         // Paper end