From 2f1c6f35d6dcbc87c44b940e47713ce945854b3c Mon Sep 17 00:00:00 2001 From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com> Date: Sat, 14 Jun 2025 18:18:50 +0200 Subject: [PATCH] do not teleport player twice on first spawn Mojang moved the adjustSpawnLocation call from the ServerPlayer constructor to where we do it normally making it duplicate --- paper-server/patches/features/0004-Anti-Xray.patch | 6 +++--- .../0016-Moonrise-optimisation-patches.patch | 6 +++--- .../0024-Incremental-chunk-and-player-saving.patch | 6 +++--- .../minecraft/server/players/PlayerList.java.patch | 12 +++++------- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/paper-server/patches/features/0004-Anti-Xray.patch b/paper-server/patches/features/0004-Anti-Xray.patch index 91378ccf6e..cd8fa3d530 100644 --- a/paper-server/patches/features/0004-Anti-Xray.patch +++ b/paper-server/patches/features/0004-Anti-Xray.patch @@ -186,10 +186,10 @@ index 8cd7363704d4532c926dbf4778eb4dfec5fdf8bc..0376a10ee0544b13e8fd629a7b13f788 if (io.papermc.paper.event.packet.PlayerChunkLoadEvent.getHandlerList().getRegisteredListeners().length > 0) { new io.papermc.paper.event.packet.PlayerChunkLoadEvent(new org.bukkit.craftbukkit.CraftChunk(chunk), packetListener.getPlayer().getBukkitEntity()).callEvent(); diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 3a4cbe6e26c7337cc1132b479d4a050b62b4e4c8..57a746121696c7f7b39aa0b376d00dbaa14d3ca3 100644 +index b595fc3bd844eaf2a56f70f166523ee6254386b6..891d3e13057c6034c59a78e594935c433921de04 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -413,7 +413,7 @@ public abstract class PlayerList { +@@ -408,7 +408,7 @@ public abstract class PlayerList { .getOrThrow(net.minecraft.world.level.biome.Biomes.PLAINS); player.connection.send(new net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket( new net.minecraft.world.level.chunk.EmptyLevelChunk(serverLevel, player.chunkPosition(), plains), @@ -199,7 +199,7 @@ index 3a4cbe6e26c7337cc1132b479d4a050b62b4e4c8..57a746121696c7f7b39aa0b376d00dba } // Paper end - Send empty chunk diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index bab28e7afb7b1249d40631aabff16fc18cf95ea0..fa56dd1bdca53f7667dc6b4b2c8634483bae5262 100644 +index 980eaba27ce2616c1573a4760cf4acc2dd251190..1eb8cb187d33510a4e99d229e721a2e7db4012ad 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java @@ -132,6 +132,7 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl diff --git a/paper-server/patches/features/0016-Moonrise-optimisation-patches.patch b/paper-server/patches/features/0016-Moonrise-optimisation-patches.patch index 1ab183c528..109c81a779 100644 --- a/paper-server/patches/features/0016-Moonrise-optimisation-patches.patch +++ b/paper-server/patches/features/0016-Moonrise-optimisation-patches.patch @@ -28238,10 +28238,10 @@ index b30f56fbc1fd17259a1d05dc9155fffcab292ca1..11fed81a4696ba18440e755c3b8a5ca3 this.generatingStep = generatingStep; this.cache = cache; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index affad1f921b5960f2216d4237515299b0d622482..d7ca447747822c8e1a471cb17bcd45ad47cf45a7 100644 +index 891d3e13057c6034c59a78e594935c433921de04..a3aa852b04e6deccccf995cfc57f95fa79860c04 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1333,7 +1333,7 @@ public abstract class PlayerList { +@@ -1328,7 +1328,7 @@ public abstract class PlayerList { public void setViewDistance(int viewDistance) { this.viewDistance = viewDistance; @@ -28250,7 +28250,7 @@ index affad1f921b5960f2216d4237515299b0d622482..d7ca447747822c8e1a471cb17bcd45ad for (ServerLevel serverLevel : this.server.getAllLevels()) { if (serverLevel != null) { -@@ -1344,7 +1344,7 @@ public abstract class PlayerList { +@@ -1339,7 +1339,7 @@ public abstract class PlayerList { public void setSimulationDistance(int simulationDistance) { this.simulationDistance = simulationDistance; diff --git a/paper-server/patches/features/0024-Incremental-chunk-and-player-saving.patch b/paper-server/patches/features/0024-Incremental-chunk-and-player-saving.patch index 70e68b971c..197e61f563 100644 --- a/paper-server/patches/features/0024-Incremental-chunk-and-player-saving.patch +++ b/paper-server/patches/features/0024-Incremental-chunk-and-player-saving.patch @@ -95,10 +95,10 @@ index c0b74d408340101bc3aac4cb4b7232c5cc78b08a..b70929df38389d789dad46c0a6d94f6c private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_Y = 10; private static final int FLY_STAT_RECORDING_SPEED = 25; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index d7ca447747822c8e1a471cb17bcd45ad47cf45a7..244ee2b7aae6f5ef48657fb4d69d66bf4538a7f7 100644 +index a3aa852b04e6deccccf995cfc57f95fa79860c04..b1524279c02cd3be82338a6bd0320cb125a134d5 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -494,6 +494,7 @@ public abstract class PlayerList { +@@ -489,6 +489,7 @@ public abstract class PlayerList { protected void save(ServerPlayer player) { if (!player.getBukkitEntity().isPersistent()) return; // CraftBukkit @@ -106,7 +106,7 @@ index d7ca447747822c8e1a471cb17bcd45ad47cf45a7..244ee2b7aae6f5ef48657fb4d69d66bf this.playerIo.save(player); ServerStatsCounter serverStatsCounter = player.getStats(); // CraftBukkit if (serverStatsCounter != null) { -@@ -1080,9 +1081,23 @@ public abstract class PlayerList { +@@ -1075,9 +1076,23 @@ public abstract class PlayerList { } public void saveAll() { diff --git a/paper-server/patches/sources/net/minecraft/server/players/PlayerList.java.patch b/paper-server/patches/sources/net/minecraft/server/players/PlayerList.java.patch index 458473dd85..35cfaca434 100644 --- a/paper-server/patches/sources/net/minecraft/server/players/PlayerList.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/players/PlayerList.java.patch @@ -47,7 +47,7 @@ GameProfile gameProfile = player.getGameProfile(); GameProfileCache profileCache = this.server.getProfileCache(); String string; -@@ -149,18 +_,69 @@ +@@ -149,20 +_,66 @@ } try (ProblemReporter.ScopedCollector scopedCollector = new ProblemReporter.ScopedCollector(player.problemPath(), LOGGER)) { @@ -110,16 +110,14 @@ + // Paper start - Entity#getEntitySpawnReason + if (loadedPlayerData.isEmpty()) { + player.spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT; // set Player SpawnReason to DEFAULT on first login -+ // Paper start - reset to main world spawn if first spawn or invalid world -+ } -+ if (loadedPlayerData.isEmpty() || invalidPlayerWorld[0]) { -+ // Paper end - reset to main world spawn if first spawn or invalid world -+ player.snapTo(player.adjustSpawnLocation(serverLevel, serverLevel.getSharedSpawnPos()).getBottomCenter(), serverLevel.getSharedSpawnAngle(), 0.0F); // Paper - MC-200092 - fix first spawn pos yaw being ignored + } + // Paper end - Entity#getEntitySpawnReason player.setServerLevel(serverLevel); - if (optional1.isEmpty()) { +- if (optional1.isEmpty()) { ++ if (loadedPlayerData.isEmpty() || invalidPlayerWorld[0]) { // Paper - reset to main world spawn if first spawn or invalid world player.snapTo( + player.adjustSpawnLocation(serverLevel, serverLevel.getSharedSpawnPos()).getBottomCenter(), serverLevel.getSharedSpawnAngle(), 0.0F + ); @@ -170,15 +_,29 @@ serverLevel.waitForChunkAndEntities(player.chunkPosition(), 1);