29b17a892d
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: 5efeb7bd Also update compiler version c13b867a Update some Maven plugin versions deb28d9f PR-837: Add more bell API e938d62a PR-819: Allow Player#sendBlockDamage() to specify a source entity 0e75532c PR-818: Add more Guardian API, particularly for its laser a10155aa PR-839: Add BlockData#rotate and BlockData#mirror 77e690b4 PR-836: Add missing API for explosive minecarts 60722059 PR-832: Allow getting chunks without generating them and optimize chunk data request for ungenerated chunks 0a2c4b4b PR-834: Add Player#sendHurtAnimation() CraftBukkit Changes: be8682aa8 Also update compiler version 08e305f5b Update some Maven plugin versions 187bdd463 PR-1160: Add more bell API 2f8e5bc7c PR-1145: Allow Player#sendBlockDamage() to specify a source entity bcbb61b36 PR-1144: Add more Guardian API, particularly for its laser 722ddff6d PR-1162: Add BlockData#rotate and BlockData#mirror 80998277c PR-1159: Add missing API for explosive minecarts 1fddefce1 PR-1155: Allow getting chunks without generating them and optimize chunk data request for ungenerated chunks 20e8a486f PR-1157: Add Player#sendHurtAnimation() Spigot Changes: b31949f2 Rebuild patches
534 lines
24 KiB
Diff
534 lines
24 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Mon, 29 Feb 2016 17:43:33 -0600
|
|
Subject: [PATCH] Async Chunks API
|
|
|
|
Adds API's to load or generate chunks asynchronously.
|
|
|
|
Also adds utility methods to Entity to teleport asynchronously.
|
|
|
|
diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java
|
|
index fbfe1e0923eddefbb378c3e150f0bb08802fa812..4031b2c3b7d6870f649e76f47a72e31a0f300c00 100644
|
|
--- a/src/main/java/org/bukkit/World.java
|
|
+++ b/src/main/java/org/bukkit/World.java
|
|
@@ -980,6 +980,482 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient
|
|
}
|
|
return nearby;
|
|
}
|
|
+
|
|
+ /**
|
|
+ * This is the Legacy API before Java 8 was supported. Java 8 Consumer is provided,
|
|
+ * as well as future support
|
|
+ *
|
|
+ * Used by {@link World#getChunkAtAsync(Location,ChunkLoadCallback)} methods
|
|
+ * to request a {@link Chunk} to be loaded, with this callback receiving
|
|
+ * the chunk when it is finished.
|
|
+ *
|
|
+ * This callback will be executed on synchronously on the main thread.
|
|
+ *
|
|
+ * Timing and order this callback is fired is intentionally not defined and
|
|
+ * and subject to change.
|
|
+ *
|
|
+ * @deprecated Use either the Future or the Consumer based methods
|
|
+ */
|
|
+ @Deprecated
|
|
+ public static interface ChunkLoadCallback extends java.util.function.Consumer<Chunk> {
|
|
+ public void onLoad(@NotNull Chunk chunk);
|
|
+
|
|
+ // backwards compat to old api
|
|
+ @Override
|
|
+ default void accept(@NotNull Chunk chunk) {
|
|
+ onLoad(chunk);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given coordinates
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The {@link ChunkLoadCallback} will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ *
|
|
+ * @deprecated Use either the Future or the Consumer based methods
|
|
+ * @param x Chunk X-coordinate of the chunk - floor(world coordinate / 16)
|
|
+ * @param z Chunk Z-coordinate of the chunk - floor(world coordinate / 16)
|
|
+ * @param cb Callback to receive the chunk when it is loaded.
|
|
+ * will be executed synchronously
|
|
+ */
|
|
+ @Deprecated
|
|
+ public default void getChunkAtAsync(int x, int z, @NotNull ChunkLoadCallback cb) {
|
|
+ getChunkAtAsync(x, z, true).thenAccept(cb::onLoad).exceptionally((ex) -> {
|
|
+ Bukkit.getLogger().log(java.util.logging.Level.WARNING, "Exception in chunk load callback", ex);
|
|
+ return null;
|
|
+ });
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given {@link Location}
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The {@link ChunkLoadCallback} will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ *
|
|
+ * @deprecated Use either the Future or the Consumer based methods
|
|
+ * @param loc Location of the chunk
|
|
+ * @param cb Callback to receive the chunk when it is loaded.
|
|
+ * will be executed synchronously
|
|
+ */
|
|
+ @Deprecated
|
|
+ public default void getChunkAtAsync(@NotNull Location loc, @NotNull ChunkLoadCallback cb) {
|
|
+ getChunkAtAsync(loc, true).thenAccept(cb::onLoad).exceptionally((ex) -> {
|
|
+ Bukkit.getLogger().log(java.util.logging.Level.WARNING, "Exception in chunk load callback", ex);
|
|
+ return null;
|
|
+ });
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests {@link Chunk} to be loaded that contains the given {@link Block}
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The {@link ChunkLoadCallback} will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ *
|
|
+ * @deprecated Use either the Future or the Consumer based methods
|
|
+ * @param block Block to get the containing chunk from
|
|
+ * @param cb Callback to receive the chunk when it is loaded.
|
|
+ * will be executed synchronously
|
|
+ */
|
|
+ @Deprecated
|
|
+ public default void getChunkAtAsync(@NotNull Block block, @NotNull ChunkLoadCallback cb) {
|
|
+ getChunkAtAsync(block, true).thenAccept(cb::onLoad).exceptionally((ex) -> {
|
|
+ Bukkit.getLogger().log(java.util.logging.Level.WARNING, "Exception in chunk load callback", ex);
|
|
+ return null;
|
|
+ });
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given coordinates
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The {@link java.util.function.Consumer} will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ *
|
|
+ * @param x Chunk X-coordinate of the chunk - floor(world coordinate / 16)
|
|
+ * @param z Chunk Z-coordinate of the chunk - floor(world coordinate / 16)
|
|
+ * @param cb Callback to receive the chunk when it is loaded.
|
|
+ * will be executed synchronously
|
|
+ */
|
|
+ public default void getChunkAtAsync(int x, int z, @NotNull java.util.function.Consumer<Chunk> cb) {
|
|
+ getChunkAtAsync(x, z, true).thenAccept(cb).exceptionally((ex) -> {
|
|
+ Bukkit.getLogger().log(java.util.logging.Level.WARNING, "Exception in chunk load callback", ex);
|
|
+ return null;
|
|
+ });
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given coordinates
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The {@link java.util.function.Consumer} will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ *
|
|
+ * @param x Chunk X-coordinate of the chunk - floor(world coordinate / 16)
|
|
+ * @param z Chunk Z-coordinate of the chunk - floor(world coordinate / 16)
|
|
+ * @param gen Should we generate a chunk if it doesn't exist or not
|
|
+ * @param cb Callback to receive the chunk when it is loaded.
|
|
+ * will be executed synchronously
|
|
+ */
|
|
+ public default void getChunkAtAsync(int x, int z, boolean gen, @NotNull java.util.function.Consumer<Chunk> cb) {
|
|
+ getChunkAtAsync(x, z, gen).thenAccept(cb).exceptionally((ex) -> {
|
|
+ Bukkit.getLogger().log(java.util.logging.Level.WARNING, "Exception in chunk load callback", ex);
|
|
+ return null;
|
|
+ });
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given {@link Location}
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The {@link java.util.function.Consumer} will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ *
|
|
+ * @param loc Location of the chunk
|
|
+ * @param cb Callback to receive the chunk when it is loaded.
|
|
+ * will be executed synchronously
|
|
+ */
|
|
+ public default void getChunkAtAsync(@NotNull Location loc, @NotNull java.util.function.Consumer<Chunk> cb) {
|
|
+ getChunkAtAsync((int)Math.floor(loc.getX()) >> 4, (int)Math.floor(loc.getZ()) >> 4, true, cb);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given {@link Location}
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The {@link java.util.function.Consumer} will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ *
|
|
+ * @param loc Location of the chunk
|
|
+ * @param gen Should the chunk generate if it doesn't exist
|
|
+ * @param cb Callback to receive the chunk when it is loaded.
|
|
+ * will be executed synchronously
|
|
+ */
|
|
+ public default void getChunkAtAsync(@NotNull Location loc, boolean gen, @NotNull java.util.function.Consumer<Chunk> cb) {
|
|
+ getChunkAtAsync((int)Math.floor(loc.getX()) >> 4, (int)Math.floor(loc.getZ()) >> 4, gen, cb);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests {@link Chunk} to be loaded that contains the given {@link Block}
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The {@link java.util.function.Consumer} will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ *
|
|
+ * @param block Block to get the containing chunk from
|
|
+ * @param cb Callback to receive the chunk when it is loaded.
|
|
+ * will be executed synchronously
|
|
+ */
|
|
+ public default void getChunkAtAsync(@NotNull Block block, @NotNull java.util.function.Consumer<Chunk> cb) {
|
|
+ getChunkAtAsync(block.getX() >> 4, block.getZ() >> 4, true, cb);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests {@link Chunk} to be loaded that contains the given {@link Block}
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The {@link java.util.function.Consumer} will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ *
|
|
+ * @param block Block to get the containing chunk from
|
|
+ * @param gen Should the chunk generate if it doesn't exist
|
|
+ * @param cb Callback to receive the chunk when it is loaded.
|
|
+ * will be executed synchronously
|
|
+ */
|
|
+ public default void getChunkAtAsync(@NotNull Block block, boolean gen, @NotNull java.util.function.Consumer<Chunk> cb) {
|
|
+ getChunkAtAsync(block.getX() >> 4, block.getZ() >> 4, gen, cb);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given coordinates
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The future will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ * @param loc Location to load the corresponding chunk from
|
|
+ * @return Future that will resolve when the chunk is loaded
|
|
+ */
|
|
+ @NotNull
|
|
+ public default java.util.concurrent.CompletableFuture<Chunk> getChunkAtAsync(@NotNull Location loc) {
|
|
+ return getChunkAtAsync((int)Math.floor(loc.getX()) >> 4, (int)Math.floor(loc.getZ()) >> 4, true);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given coordinates
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The future will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ * @param loc Location to load the corresponding chunk from
|
|
+ * @param gen Should the chunk generate if it doesn't exist
|
|
+ * @return Future that will resolve when the chunk is loaded
|
|
+ */
|
|
+ @NotNull
|
|
+ public default java.util.concurrent.CompletableFuture<Chunk> getChunkAtAsync(@NotNull Location loc, boolean gen) {
|
|
+ return getChunkAtAsync((int)Math.floor(loc.getX()) >> 4, (int)Math.floor(loc.getZ()) >> 4, gen);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given coordinates
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The future will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ * @param block Block to load the corresponding chunk from
|
|
+ * @return Future that will resolve when the chunk is loaded
|
|
+ */
|
|
+ @NotNull
|
|
+ public default java.util.concurrent.CompletableFuture<Chunk> getChunkAtAsync(@NotNull Block block) {
|
|
+ return getChunkAtAsync(block.getX() >> 4, block.getZ() >> 4, true);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given coordinates
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The future will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ * @param block Block to load the corresponding chunk from
|
|
+ * @param gen Should the chunk generate if it doesn't exist
|
|
+ * @return Future that will resolve when the chunk is loaded
|
|
+ */
|
|
+ @NotNull
|
|
+ public default java.util.concurrent.CompletableFuture<Chunk> getChunkAtAsync(@NotNull Block block, boolean gen) {
|
|
+ return getChunkAtAsync(block.getX() >> 4, block.getZ() >> 4, gen);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given coordinates
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The future will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ *
|
|
+ * @param x Chunk X-coordinate of the chunk - floor(world coordinate / 16)
|
|
+ * @param z Chunk Z-coordinate of the chunk - floor(world coordinate / 16)
|
|
+ * @return Future that will resolve when the chunk is loaded
|
|
+ */
|
|
+ @NotNull
|
|
+ public default java.util.concurrent.CompletableFuture<Chunk> getChunkAtAsync(int x, int z) {
|
|
+ return getChunkAtAsync(x, z, true);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given coordinates
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The future will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ *
|
|
+ * @param x Chunk X-coordinate of the chunk - floor(world coordinate / 16)
|
|
+ * @param z Chunk Z-coordinate of the chunk - floor(world coordinate / 16)
|
|
+ * @param gen Should we generate a chunk if it doesn't exist or not
|
|
+ * @return Future that will resolve when the chunk is loaded
|
|
+ */
|
|
+ @NotNull
|
|
+ public default java.util.concurrent.CompletableFuture<Chunk> getChunkAtAsync(int x, int z, boolean gen) {
|
|
+ return getChunkAtAsync(x, z, gen, false);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given coordinates
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The future will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ * @param loc Location to load the corresponding chunk from
|
|
+ * @return Future that will resolve when the chunk is loaded
|
|
+ */
|
|
+ @NotNull
|
|
+ public default java.util.concurrent.CompletableFuture<Chunk> getChunkAtAsyncUrgently(@NotNull Location loc) {
|
|
+ return getChunkAtAsync((int)Math.floor(loc.getX()) >> 4, (int)Math.floor(loc.getZ()) >> 4, true, true);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given coordinates
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The future will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ * @param loc Location to load the corresponding chunk from
|
|
+ * @param gen Should the chunk generate if it doesn't exist
|
|
+ * @return Future that will resolve when the chunk is loaded
|
|
+ */
|
|
+ @NotNull
|
|
+ public default java.util.concurrent.CompletableFuture<Chunk> getChunkAtAsyncUrgently(@NotNull Location loc, boolean gen) {
|
|
+ return getChunkAtAsync((int)Math.floor(loc.getX()) >> 4, (int)Math.floor(loc.getZ()) >> 4, gen, true);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given coordinates
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The future will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ * @param block Block to load the corresponding chunk from
|
|
+ * @return Future that will resolve when the chunk is loaded
|
|
+ */
|
|
+ @NotNull
|
|
+ public default java.util.concurrent.CompletableFuture<Chunk> getChunkAtAsyncUrgently(@NotNull Block block) {
|
|
+ return getChunkAtAsync(block.getX() >> 4, block.getZ() >> 4, true, true);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given coordinates
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The future will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ * @param block Block to load the corresponding chunk from
|
|
+ * @param gen Should the chunk generate if it doesn't exist
|
|
+ * @return Future that will resolve when the chunk is loaded
|
|
+ */
|
|
+ @NotNull
|
|
+ public default java.util.concurrent.CompletableFuture<Chunk> getChunkAtAsyncUrgently(@NotNull Block block, boolean gen) {
|
|
+ return getChunkAtAsync(block.getX() >> 4, block.getZ() >> 4, gen, true);
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Requests a {@link Chunk} to be loaded at the given coordinates
|
|
+ *
|
|
+ * This method makes no guarantee on how fast the chunk will load,
|
|
+ * and will return the chunk to the callback at a later time.
|
|
+ *
|
|
+ * You should use this method if you need a chunk but do not need it
|
|
+ * immediately, and you wish to let the server control the speed
|
|
+ * of chunk loads, keeping performance in mind.
|
|
+ *
|
|
+ * The future will always be executed synchronously
|
|
+ * on the main Server Thread.
|
|
+ *
|
|
+ * @param x X Coord
|
|
+ * @param z Z Coord
|
|
+ * @return Future that will resolve when the chunk is loaded
|
|
+ */
|
|
+ @NotNull
|
|
+ public default java.util.concurrent.CompletableFuture<Chunk> getChunkAtAsyncUrgently(int x, int z) {
|
|
+ return getChunkAtAsync(x, z, true, true);
|
|
+ }
|
|
+
|
|
+ @NotNull
|
|
+ java.util.concurrent.CompletableFuture<Chunk> getChunkAtAsync(int x, int z, boolean gen, boolean urgent);
|
|
// Paper end
|
|
|
|
/**
|
|
diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java
|
|
index 17fd1322fcd76ac899f3db1d7fdd7fbdabe2209e..cd489dddec0b1ab50947a523c467ce3825961549 100644
|
|
--- a/src/main/java/org/bukkit/entity/Entity.java
|
|
+++ b/src/main/java/org/bukkit/entity/Entity.java
|
|
@@ -164,6 +164,33 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent
|
|
*/
|
|
public boolean teleport(@NotNull Entity destination, @NotNull TeleportCause cause);
|
|
|
|
+ // Paper start
|
|
+ /**
|
|
+ * Loads/Generates(in 1.13+) the Chunk asynchronously, and then teleports the entity when the chunk is ready.
|
|
+ * @param loc Location to teleport to
|
|
+ * @return A future that will be completed with the result of the teleport
|
|
+ */
|
|
+ @NotNull
|
|
+ public default java.util.concurrent.CompletableFuture<Boolean> teleportAsync(@NotNull Location loc) {
|
|
+ return teleportAsync(loc, TeleportCause.PLUGIN);
|
|
+ }
|
|
+ /**
|
|
+ * Loads/Generates(in 1.13+) the Chunk asynchronously, and then teleports the entity when the chunk is ready.
|
|
+ * @param loc Location to teleport to
|
|
+ * @param cause Reason for teleport
|
|
+ * @return A future that will be completed with the result of the teleport
|
|
+ */
|
|
+ @NotNull
|
|
+ public default java.util.concurrent.CompletableFuture<Boolean> teleportAsync(@NotNull Location loc, @NotNull TeleportCause cause) {
|
|
+ java.util.concurrent.CompletableFuture<Boolean> future = new java.util.concurrent.CompletableFuture<>();
|
|
+ loc.getWorld().getChunkAtAsyncUrgently(loc).thenAccept((chunk) -> future.complete(teleport(loc, cause))).exceptionally(ex -> {
|
|
+ future.completeExceptionally(ex);
|
|
+ return null;
|
|
+ });
|
|
+ return future;
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
/**
|
|
* Returns a list of entities within a bounding box centered around this
|
|
* entity
|