aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/api/0263-Expand-world-key-API.patch
blob: a6e79339f46c3a78fda9aaeb0952f5e38e80c807 (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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
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 e832c6a8a10bc29d9ab20cbdf394cf836eb2f6a5..4b3c91575f2609ad1b1177384f6f21151a535054 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 9477563308adc64fff065eb0a50654baa0d22b84..5bb94245c33105e57131b3d0867ef707c4aed79c 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 241cb853476ea35dad73d0234b2d030e9af23476..5de86f8cd3cc7f7e8ebc4a22d3921273378704f2 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
@@ -164,5 +164,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