Expand world key API

This commit is contained in:
Jake Potrebic 2021-01-06 00:34:10 -08:00
parent bcd78c9bf2
commit 07c1829d7f
5 changed files with 134 additions and 5 deletions

View file

@ -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}.

View file

@ -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
}

View file

@ -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>

View file

@ -175,5 +175,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
}

View file

@ -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,12 +31,81 @@ 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");
this.name = name;
this.seed = (new Random()).nextLong();
// 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(" ", "_"));
}
}
/**
* 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
*