From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> Date: Mon, 1 Nov 2077 00:00:00 +0800 Subject: [PATCH] Async structure locate api This patch depends on Asynchronous locator patch. Added some asynchronous structure locate methods in World, requires async-locator to be enabled in Leaf config, or else it will fall back to sync methods. diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java index d0c2ff65893c1fd3903633ebc24aae879dc91f10..000ed0527609690b01a32053557b74049beed73c 100644 --- a/src/main/java/org/bukkit/World.java +++ b/src/main/java/org/bukkit/World.java @@ -4084,6 +4084,60 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient @Nullable StructureSearchResult locateNearestStructure(@NotNull Location origin, @NotNull Structure structure, int radius, boolean findUnexplored); + // Leaf start - Async structure locate api + /** + * Find the closest nearby structure of a given {@link StructureType} asynchronously. + *

+ * The {@code radius} is not a rigid square radius. Each structure may alter + * how many chunks to check for each iteration. Do not assume that only a + * radius x radius chunk area will be checked. For example, + * {@link StructureType#WOODLAND_MANSION} can potentially check up to 20,000 + * blocks away (or more) regardless of the radius used. + *

+ * This will not load or generate chunks. + *

+ * The difference between searching for a {@link StructureType} and a + * {@link Structure} is, that a {@link StructureType} can refer to multiple + * {@link Structure Structures} while searching for a {@link Structure} + * while only search for the given {@link Structure}. + * + * @param origin where to start looking for a structure + * @param structureType the type of structure to find + * @param radius the radius, in chunks, around which to search + * @param findUnexplored true to only find unexplored structures + * @param afterComplete the action to perform once the search is complete. + * @see #locateNearestStructureAsync(Location, Structure, int, boolean, Consumer) + */ + @org.jetbrains.annotations.ApiStatus.Experimental + void locateNearestStructureAsync(@NotNull Location origin, @NotNull StructureType structureType, int radius, boolean findUnexplored, @NotNull Consumer<@Nullable StructureSearchResult> afterComplete); + + /** + * Find the closest nearby structure of a given {@link Structure} asynchronously. + *

+ * The {@code radius} is not a rigid square radius. Each structure may alter + * how many chunks to check for each iteration. Do not assume that only a + * radius x radius chunk area will be checked. For example, + * {@link Structure#MANSION} can potentially check up to 20,000 blocks away + * (or more) regardless of the radius used. + *

+ * This will not load or generate chunks. + *

+ * The difference between searching for a {@link StructureType} and a + * {@link Structure} is, that a {@link StructureType} can refer to multiple + * {@link Structure Structures} while searching for a {@link Structure} + * while only search for the given {@link Structure}. + * + * @param origin where to start looking for a structure + * @param structure the structure to find + * @param radius the radius, in chunks, around which to search + * @param findUnexplored true to only find unexplored structures + * @param afterComplete the action to perform on server thread once the search is complete. + * @see #locateNearestStructureAsync(Location, StructureType, int, boolean, Consumer) + */ + @org.jetbrains.annotations.ApiStatus.Experimental + void locateNearestStructureAsync(@NotNull Location origin, @NotNull Structure structure, int radius, boolean findUnexplored, @NotNull Consumer<@Nullable StructureSearchResult> afterComplete); + // Leaf end - Async structure locate api + // Paper start /** * Locates the nearest biome based on an origin, biome type, and radius to search.