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