aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/api/0253-Expand-world-key-API.patch
blob: 2436c924af194177bdd868ebaf2205371b38fcf3 (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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
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 fbe14c327ee9c1ac07893853ca7c699e81225281..b558fa73dbcf3747690933e6aadf7061a0de2630 100644
--- a/src/main/java/org/bukkit/Bukkit.java
+++ b/src/main/java/org/bukkit/Bukkit.java
@@ -865,6 +865,29 @@ 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);
+    }
+
+    /**
+     * Gets the world from the given Key
+     *
+     * @param worldKey the Key of the world to retrieve
+     * @return a world with the given Key, or null if none exists
+     */
+    @Nullable
+    public static World getWorld(@NotNull net.kyori.adventure.key.Key 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 943f8881ea23481ea5d5125b6ec7c9c6f763f0b0..42930006b6425b5d82233e4ffe7025ce5397b277 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
@@ -726,6 +726,28 @@ 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
+    default World getWorld(@NotNull NamespacedKey worldKey) {
+        return getWorld((net.kyori.adventure.key.Key) worldKey);
+    }
+
+    /**
+     * Gets the world from the given Key
+     *
+     * @param worldKey the Key of the world to retrieve
+     * @return a world with the given Key, or null if none exists
+     */
+    @Nullable
+    World getWorld(@NotNull net.kyori.adventure.key.Key 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 64be4e60a03cb7cdc21013837d241d288695b69d..0231b79d96d535e0ae37296b3e806844740783ca 100644
--- a/src/main/java/org/bukkit/UnsafeValues.java
+++ b/src/main/java/org/bukkit/UnsafeValues.java
@@ -181,5 +181,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