Paper/patches/api/0264-Expand-world-key-API.patch
Nassim Jahnke 71c84c8132
Updated Upstream (Bukkit/CraftBukkit/Spigot) (#10277)
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:
9a80d38c SPIGOT-336, SPIGOT-3366, SPIGOT-5768, SPIGOT-6409, SPIGOT-6861, PR-722: Add EntityRemoveEvent
258086d9 SPIGOT-7417, PR-967: Add Sign#getTargetSide and Sign#getAllowedEditor
ffaba051 SPIGOT-7584: Add missing Tag.ITEMS_NON_FLAMMABLE_WOOD

CraftBukkit Changes:
98b6c1ac7 SPIGOT-7589 Fix NullPointerException when bans expire
a2736ddb0 SPIGOT-336, SPIGOT-3366, SPIGOT-5768, SPIGOT-6409, SPIGOT-6861, PR-1008: Add EntityRemoveEvent
5bf12cb89 SPIGOT-7565: Throw a more descriptive error message when a developer tries to spawn an entity from a CraftBukkit class
76d95fe7e SPIGOT-7417, PR-1343: Add Sign#getTargetSide and Sign#getAllowedEditor

Spigot Changes:
e9ec5485 Rebuild patches
f1b62e0c Rebuild patches
2024-02-23 14:37:33 +01:00

190 lines
6.9 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Wed, 6 Jan 2021 00:34:10 -0800
Subject: [PATCH] Expand world key API
diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java
index b4341f5c9adcebd13a0f62ebc32d081a65d71ba4..7e049d9934df2259ea566aaa69ce118ce829529d 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
@@ -862,6 +862,18 @@ public final class Bukkit {
public static World getWorld(@NotNull UUID uid) {
return server.getWorld(uid);
}
+ // Paper start
+ /**
+ * Gets the world from the given NamespacedKey
+ *
+ * @param worldKey the NamespacedKey of the world to retrieve
+ * @return a world with the given NamespacedKey, or null if none exists
+ */
+ @Nullable
+ public static World getWorld(@NotNull NamespacedKey worldKey) {
+ return server.getWorld(worldKey);
+ }
+ // Paper end
/**
* Create a new virtual {@link WorldBorder}.
diff --git a/src/main/java/org/bukkit/RegionAccessor.java b/src/main/java/org/bukkit/RegionAccessor.java
index 27eff0826d5b5b48697fefd9571886e7bbce74b1..d8b1fa79dc24138dc71e32c14bda71c1d570ed88 100644
--- a/src/main/java/org/bukkit/RegionAccessor.java
+++ b/src/main/java/org/bukkit/RegionAccessor.java
@@ -18,7 +18,7 @@ import org.jetbrains.annotations.Nullable;
* A RegionAccessor gives access to getting, modifying and spawning {@link Biome}, {@link BlockState} and {@link Entity},
* as well as generating some basic structures.
*/
-public interface RegionAccessor {
+public interface RegionAccessor extends Keyed { // Paper
/**
* Gets the {@link Biome} at the given {@link Location}.
@@ -452,5 +452,14 @@ public interface RegionAccessor {
*/
@NotNull
io.papermc.paper.world.MoonPhase getMoonPhase();
+
+ /**
+ * Get the world's key
+ *
+ * @return the world's key
+ */
+ @NotNull
+ @Override
+ NamespacedKey getKey();
// Paper end
}
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
index 3c64eb18b7cb6ac371b094a581da8a033e90d00f..c3e0b40a845a30790f31a0cf591bfa7f0cd87fee 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
@@ -720,6 +720,17 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
@Nullable
public World getWorld(@NotNull UUID uid);
+ // Paper start
+ /**
+ * Gets the world from the given NamespacedKey
+ *
+ * @param worldKey the NamespacedKey of the world to retrieve
+ * @return a world with the given NamespacedKey, or null if none exists
+ */
+ @Nullable
+ public World getWorld(@NotNull NamespacedKey worldKey);
+ // Paper end
+
/**
* Create a new virtual {@link WorldBorder}.
* <p>
diff --git a/src/main/java/org/bukkit/UnsafeValues.java b/src/main/java/org/bukkit/UnsafeValues.java
index 86bb2a6f46c7c39e7ac1923c3454785a3dc76648..72a29fff4c497a2a66e2746ad42553bcb712e20d 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
@@ -162,5 +162,10 @@ public interface UnsafeValues {
* Use this when sending custom packets, so that there are no collisions on the client or server.
*/
public int nextEntityId();
+
+ /**
+ * Just don't use it.
+ */
+ @org.jetbrains.annotations.NotNull String getMainLevelName();
// Paper end
}
diff --git a/src/main/java/org/bukkit/WorldCreator.java b/src/main/java/org/bukkit/WorldCreator.java
index 27537aeabd3bd1b5383e6ecf775aa89e033aa2bc..afc0ce2eaa7cf48d1255fec7377103b1f7a99734 100644
--- a/src/main/java/org/bukkit/WorldCreator.java
+++ b/src/main/java/org/bukkit/WorldCreator.java
@@ -13,6 +13,7 @@ import org.jetbrains.annotations.Nullable;
* Represents various types of options that may be used to create a world.
*/
public class WorldCreator {
+ private final NamespacedKey key; // Paper
private final String name;
private long seed;
private World.Environment environment = World.Environment.NORMAL;
@@ -30,11 +31,80 @@ public class WorldCreator {
* @param name Name of the world that will be created
*/
public WorldCreator(@NotNull String name) {
- Preconditions.checkArgument(name != null, "World name cannot be null");
+ // Paper start
+ this(name, getWorldKey(name));
+ }
+
+ private static NamespacedKey getWorldKey(String name) {
+ final String mainLevelName = Bukkit.getUnsafe().getMainLevelName();
+ if (name.equals(mainLevelName)) {
+ return NamespacedKey.minecraft("overworld");
+ } else if (name.equals(mainLevelName + "_nether")) {
+ return NamespacedKey.minecraft("the_nether");
+ } else if (name.equals(mainLevelName + "_the_end")) {
+ return NamespacedKey.minecraft("the_end");
+ } else {
+ return NamespacedKey.minecraft(name.toLowerCase(java.util.Locale.ENGLISH).replace(" ", "_"));
+ }
+ }
- this.name = name;
+ /**
+ * Creates an empty WorldCreator for the given world name and key
+ *
+ * @param levelName LevelName of the world that will be created
+ * @param worldKey NamespacedKey of the world that will be created
+ */
+ public WorldCreator(@NotNull String levelName, @NotNull NamespacedKey worldKey) {
+ if (levelName == null || worldKey == null) {
+ throw new IllegalArgumentException("World name and key cannot be null");
+ }
+ this.name = levelName;
this.seed = (new Random()).nextLong();
+ this.key = worldKey;
+ }
+
+ /**
+ * Creates an empty WorldCreator for the given key.
+ * LevelName will be the Key part of the NamespacedKey.
+ *
+ * @param worldKey NamespacedKey of the world that will be created
+ */
+ public WorldCreator(@NotNull NamespacedKey worldKey) {
+ this(worldKey.getKey(), worldKey);
+ }
+
+ /**
+ * Gets the key for this WorldCreator
+ *
+ * @return the key
+ */
+ @NotNull
+ public NamespacedKey key() {
+ return key;
+ }
+
+ /**
+ * Creates an empty WorldCreator for the given world name and key
+ *
+ * @param levelName LevelName of the world that will be created
+ * @param worldKey NamespacedKey of the world that will be created
+ */
+ @NotNull
+ public static WorldCreator ofNameAndKey(@NotNull String levelName, @NotNull NamespacedKey worldKey) {
+ return new WorldCreator(levelName, worldKey);
+ }
+
+ /**
+ * Creates an empty WorldCreator for the given key.
+ * LevelName will be the Key part of the NamespacedKey.
+ *
+ * @param worldKey NamespacedKey of the world that will be created
+ */
+ @NotNull
+ public static WorldCreator ofKey(@NotNull NamespacedKey worldKey) {
+ return new WorldCreator(worldKey);
}
+ // Paper end
/**
* Copies the options from the specified world