aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0707-Fix-OfflinePlayer-getBedSpawnLocation.patch
blob: 61c9b7dd075cf15b2238a76d4bd79aff488c602d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Mon, 30 May 2022 16:03:36 -0700
Subject: [PATCH] Fix OfflinePlayer#getBedSpawnLocation

When calling getBedSpawnLocation on an
instance of CraftOfflinePlayer the world was incorrect
due to the logic for reading the NBT not being up-to-date.

diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
index 411b280ac3e27e72091db813c0c9b69b62df6097..8caee0181f256e2ffd4e880274859eaf5f81ae96 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
@@ -37,6 +37,7 @@ import org.bukkit.profile.PlayerProfile;
 
 @SerializableAs("Player")
 public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializable {
+    private static final org.slf4j.Logger LOGGER = com.mojang.logging.LogUtils.getLogger(); // Paper
     private final GameProfile profile;
     private final CraftServer server;
     private final PlayerDataStorage storage;
@@ -361,11 +362,20 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa
         if (data == null) return null;
 
         if (data.contains("SpawnX") && data.contains("SpawnY") && data.contains("SpawnZ")) {
-            String spawnWorld = data.getString("SpawnWorld");
-            if (spawnWorld.equals("")) {
-                spawnWorld = this.server.getWorlds().get(0).getName();
+            // Paper start - fix wrong world
+            final float respawnAngle = data.getFloat("SpawnAngle");
+            org.bukkit.World spawnWorld = this.server.getWorld(data.getString("SpawnWorld")); // legacy
+            if (data.contains("SpawnDimension")) {
+                com.mojang.serialization.DataResult<net.minecraft.resources.ResourceKey<net.minecraft.world.level.Level>> result = net.minecraft.world.level.Level.RESOURCE_KEY_CODEC.parse(net.minecraft.nbt.NbtOps.INSTANCE, data.get("SpawnDimension"));
+                net.minecraft.resources.ResourceKey<net.minecraft.world.level.Level> levelKey = result.resultOrPartial(LOGGER::error).orElse(net.minecraft.world.level.Level.OVERWORLD);
+                net.minecraft.server.level.ServerLevel level = this.server.console.getLevel(levelKey);
+                spawnWorld = level != null ? level.getWorld() : spawnWorld;
             }
-            return new Location(this.server.getWorld(spawnWorld), data.getInt("SpawnX"), data.getInt("SpawnY"), data.getInt("SpawnZ"));
+            if (spawnWorld == null) {
+                return null;
+            }
+            return new Location(spawnWorld, data.getInt("SpawnX"), data.getInt("SpawnY"), data.getInt("SpawnZ"), respawnAngle, 0);
+            // Paper end
         }
         return null;
     }