From a584ac24012af8f3621749fd4c4d77a1315cd5a9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 10 Mar 2021 03:03:04 -0700 Subject: [PATCH] Bukkit command cleanup/fixes --- .../main/java/com/dfsek/terra/api/TerraPlugin.java | 11 +++++++++++ .../terra/commands/biome/BiomeLocateCommand.java | 2 +- .../com/dfsek/terra/bukkit/TerraBukkitPlugin.java | 5 +++++ .../terra/bukkit/command/BukkitCommandAdapter.java | 5 ++++- 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java b/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java index 6bd141802..fb9f87613 100644 --- a/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java +++ b/common/src/main/java/com/dfsek/terra/api/TerraPlugin.java @@ -53,4 +53,15 @@ public interface TerraPlugin extends LoaderRegistrar { default String getVersion() { return "@VERSION@"; } + + /** + * Runs a task that may or may not be thread safe, depending on platform. + *

+ * Allows platforms to define what code is safe to be run asynchronously. + * + * @param task Task to be run. + */ + default void runPossiblyUnsafeTask(Runnable task) { + task.run(); + } } diff --git a/common/src/main/java/com/dfsek/terra/commands/biome/BiomeLocateCommand.java b/common/src/main/java/com/dfsek/terra/commands/biome/BiomeLocateCommand.java index 09f20dde8..b6ef00483 100644 --- a/common/src/main/java/com/dfsek/terra/commands/biome/BiomeLocateCommand.java +++ b/common/src/main/java/com/dfsek/terra/commands/biome/BiomeLocateCommand.java @@ -69,7 +69,7 @@ public class BiomeLocateCommand implements CommandTemplate { if(location != null) { sender.sendMessage(String.format("The nearest %s is at [%d, ~, %d] (%.1f blocks away)", biome.getID().toLowerCase(Locale.ROOT), location.getBlockX(), location.getBlockZ(), location.add(new Vector3(0, player.getLocation().getY(), 0)).distance(player.getLocation().toVector()))); if(teleport) { - player.setLocation(new Location(player.getWorld(), location.getX(), player.getLocation().getY(), location.getZ())); + main.runPossiblyUnsafeTask(() -> player.setLocation(new Location(player.getWorld(), location.getX(), player.getLocation().getY(), location.getZ()))); } } else LangUtil.send("command.biome.unable-to-locate", sender); }, main), "Biome Location Thread").start(); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 7a4a3ed5b..b5a68974a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -134,6 +134,11 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { return eventManager; } + @Override + public void runPossiblyUnsafeTask(Runnable task) { + Bukkit.getScheduler().runTask(this, task); + } + @Override public void onDisable() { BukkitChunkGeneratorWrapper.saveAll(); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/BukkitCommandAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/BukkitCommandAdapter.java index e31fc0d75..7a4d1227e 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/BukkitCommandAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/BukkitCommandAdapter.java @@ -14,6 +14,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Locale; +import java.util.stream.Collectors; public class BukkitCommandAdapter implements CommandExecutor, TabCompleter { private final CommandManager manager; @@ -42,7 +44,8 @@ public class BukkitCommandAdapter implements CommandExecutor, TabCompleter { List argList = new ArrayList<>(Arrays.asList(args)); try { - return manager.tabComplete(argList.remove(0), BukkitAdapter.adapt(sender), argList); + return manager.tabComplete(argList.remove(0), BukkitAdapter.adapt(sender), argList).stream() + .filter(s -> s.toLowerCase(Locale.ROOT).startsWith(args[args.length - 1].toLowerCase(Locale.ROOT))).sorted(String::compareTo).collect(Collectors.toList()); } catch(CommandException e) { e.printStackTrace(); return Collections.emptyList();