31699ae9a8
* Updated Upstream (Bukkit/CraftBukkit) Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: a6a9d2a4 Remove some old ApiStatus.Experimental annotations be72314c SPIGOT-7300, PR-829: Add new DamageSource API providing enhanced information about entity damage b252cf05 SPIGOT-7576, PR-970: Add methods in MushroomCow to change stew effects b1c689bd PR-902: Add Server#isLoggingIPs to get log-ips configuration 08f86d1c PR-971: Add Player methods for client-side potion effects 2e3024a9 PR-963: Add API for in-world structures a23292a7 SPIGOT-7530, PR-948: Improve Resource Pack API with new 1.20.3 functionality 1851857b SPIGOT-3071, PR-969: Add entity spawn method with spawn reason cde4c52a SPIGOT-5553, PR-964: Add EntityKnockbackEvent CraftBukkit Changes: 38fd4bd50 Fix accidentally renamed internal damage method 80f0ce4be SPIGOT-7300, PR-1180: Add new DamageSource API providing enhanced information about entity damage 7e43f3b16 SPIGOT-7581: Fix typo in BlockMushroom ea14b7d90 SPIGOT-7576, PR-1347: Add methods in MushroomCow to change stew effects 4c687f243 PR-1259: Add Server#isLoggingIPs to get log-ips configuration 22a541a29 Improve support for per-world game rules cb7dccce2 PR-1348: Add Player methods for client-side potion effects b8d6109f0 PR-1335: Add API for in-world structures 4398a1b5b SPIGOT-7577: Make CraftWindCharge#explode discard the entity e74107678 Fix Crafter maximum stack size 0bb0f4f6a SPIGOT-7530, PR-1314: Improve Resource Pack API with new 1.20.3 functionality 4949f556d SPIGOT-3071, PR-1345: Add entity spawn method with spawn reason 20ac73ca2 PR-1353: Fix Structure#place not working as documented with 0 palette 3c1b77871 SPIGOT-6911, PR-1349: Change max book length in CraftMetaBook 333701839 SPIGOT-7572: Bee nests generated without bees f48f4174c SPIGOT-5553, PR-1336: Add EntityKnockbackEvent
123 Zeilen
7.1 KiB
Diff
123 Zeilen
7.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: 2277 <38501234+2277@users.noreply.github.com>
|
|
Date: Tue, 31 Mar 2020 10:33:55 +0100
|
|
Subject: [PATCH] Move player to spawn point if spawn in unloaded world
|
|
|
|
If the playerdata contains an invalid world (missing, unloaded, invalid,
|
|
etc.), spawn the player at the spawn point of the main world.
|
|
|
|
Co-authored-by: Wyatt Childers <wchilders@nearce.com>
|
|
Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
|
|
index 16d43da0144eb3f77f639568a82e3c9d1bb7e260..54aba3118157f72491cb8c3d5fb5c63750ea6878 100644
|
|
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
|
|
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
|
|
@@ -194,7 +194,7 @@ public abstract class PlayerList {
|
|
}
|
|
|
|
CompoundTag nbttagcompound = this.load(player);
|
|
- ResourceKey resourcekey;
|
|
+ ResourceKey<Level> resourcekey = null; // Paper
|
|
// CraftBukkit start - Better rename detection
|
|
if (nbttagcompound != null && nbttagcompound.contains("bukkit")) {
|
|
CompoundTag bukkit = nbttagcompound.getCompound("bukkit");
|
|
@@ -202,15 +202,42 @@ public abstract class PlayerList {
|
|
}
|
|
// CraftBukkit end
|
|
|
|
+ // Paper start - move logic in Entity to here, to use bukkit supplied world UUID & reset to main world spawn if no valid world is found
|
|
+ boolean invalidPlayerWorld = false;
|
|
+ bukkitData: if (nbttagcompound != null) {
|
|
+ // The main way for bukkit worlds to store the world is the world UUID despite mojang adding custom worlds
|
|
+ final org.bukkit.World bWorld;
|
|
+ if (nbttagcompound.contains("WorldUUIDMost") && nbttagcompound.contains("WorldUUIDLeast")) {
|
|
+ bWorld = org.bukkit.Bukkit.getServer().getWorld(new UUID(nbttagcompound.getLong("WorldUUIDMost"), nbttagcompound.getLong("WorldUUIDLeast")));
|
|
+ } else if (nbttagcompound.contains("world", net.minecraft.nbt.Tag.TAG_STRING)) { // Paper - legacy bukkit world name
|
|
+ bWorld = org.bukkit.Bukkit.getServer().getWorld(nbttagcompound.getString("world"));
|
|
+ } else {
|
|
+ break bukkitData; // if neither of the bukkit data points exist, proceed to the vanilla migration section
|
|
+ }
|
|
+ if (bWorld != null) {
|
|
+ resourcekey = ((CraftWorld) bWorld).getHandle().dimension();
|
|
+ } else {
|
|
+ resourcekey = Level.OVERWORLD;
|
|
+ invalidPlayerWorld = true;
|
|
+ }
|
|
+ }
|
|
+ if (resourcekey == null) { // only run the vanilla logic if we haven't found a world from the bukkit data
|
|
+ // Below is the vanilla way of getting the dimension, this is for migration from vanilla servers
|
|
+ // Paper end
|
|
if (nbttagcompound != null) {
|
|
DataResult<ResourceKey<Level>> dataresult = DimensionType.parseLegacy(new Dynamic(NbtOps.INSTANCE, nbttagcompound.get("Dimension"))); // CraftBukkit - decompile error
|
|
Logger logger = PlayerList.LOGGER;
|
|
|
|
Objects.requireNonNull(logger);
|
|
- resourcekey = (ResourceKey) dataresult.resultOrPartial(logger::error).orElse(player.serverLevel().dimension()); // CraftBukkit - SPIGOT-7507: If no dimension, fall back to existing dimension loaded from "WorldUUID", which in turn defaults to World.OVERWORLD
|
|
+ // Paper start - reset to main world spawn if no valid world is found
|
|
+ final Optional<ResourceKey<Level>> result = dataresult.resultOrPartial(logger::error);
|
|
+ invalidPlayerWorld = result.isEmpty();
|
|
+ resourcekey = result.orElse(Level.OVERWORLD);
|
|
+ // Paper end
|
|
} else {
|
|
- resourcekey = player.serverLevel().dimension(); // CraftBukkit - SPIGOT-7507: If no dimension, fall back to existing dimension loaded from "WorldUUID", which in turn defaults to World.OVERWORLD
|
|
+ resourcekey = Level.OVERWORLD; // Paper - revert to vanilla default main world, this isn't an "invalid world" since no player data existed
|
|
}
|
|
+ } // Paper
|
|
|
|
ResourceKey<Level> resourcekey1 = resourcekey;
|
|
ServerLevel worldserver = this.server.getLevel(resourcekey1);
|
|
@@ -219,6 +246,7 @@ public abstract class PlayerList {
|
|
if (worldserver == null) {
|
|
PlayerList.LOGGER.warn("Unknown respawn dimension {}, defaulting to overworld", resourcekey1);
|
|
worldserver1 = this.server.overworld();
|
|
+ invalidPlayerWorld = true; // Paper - reset to main world if no world with parsed value is found
|
|
} else {
|
|
worldserver1 = worldserver;
|
|
}
|
|
@@ -226,6 +254,10 @@ public abstract class PlayerList {
|
|
// Paper start - Entity#getEntitySpawnReason
|
|
if (nbttagcompound == null) {
|
|
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 (nbttagcompound == null || invalidPlayerWorld) {
|
|
+ // Paper end - reset to main world spawn if first spawn or invalid world
|
|
player.fudgeSpawnLocation(worldserver1); // Paper - Don't move existing players to world spawn
|
|
}
|
|
// Paper end - Entity#getEntitySpawnReason
|
|
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
index fa0f57779251ea785dfa4fe299c1505e46aa1446..828ffad0902d28c0dc86995f5f7270c54cd9d32c 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
@@ -2273,27 +2273,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
|
|
}
|
|
// CraftBukkit end
|
|
|
|
- // CraftBukkit start - Reset world
|
|
- if (this instanceof ServerPlayer) {
|
|
- Server server = Bukkit.getServer();
|
|
- org.bukkit.World bworld = null;
|
|
-
|
|
- // TODO: Remove World related checks, replaced with WorldUID
|
|
- String worldName = nbt.getString("world");
|
|
-
|
|
- if (nbt.contains("WorldUUIDMost") && nbt.contains("WorldUUIDLeast")) {
|
|
- UUID uid = new UUID(nbt.getLong("WorldUUIDMost"), nbt.getLong("WorldUUIDLeast"));
|
|
- bworld = server.getWorld(uid);
|
|
- } else {
|
|
- bworld = server.getWorld(worldName);
|
|
- }
|
|
-
|
|
- if (bworld == null) {
|
|
- bworld = ((org.bukkit.craftbukkit.CraftServer) server).getServer().getLevel(Level.OVERWORLD).getWorld();
|
|
- }
|
|
-
|
|
- ((ServerPlayer) this).setLevel(bworld == null ? null : ((CraftWorld) bworld).getHandle());
|
|
- }
|
|
+ // CraftBukkit start
|
|
+ // Paper - move world parsing/loading to PlayerList#placeNewPlayer
|
|
this.getBukkitEntity().readBukkitValues(nbt);
|
|
if (nbt.contains("Bukkit.invisible")) {
|
|
boolean bukkitInvisible = nbt.getBoolean("Bukkit.invisible");
|