diff --git a/pom.xml b/pom.xml index 5be3c8d..bff7a15 100644 --- a/pom.xml +++ b/pom.xml @@ -143,6 +143,23 @@ provided + + + + + + + + + + + + + + + + + me.clip placeholderapi diff --git a/src/main/java/cc/carm/plugin/scriptitems/Main.java b/src/main/java/cc/carm/plugin/scriptitems/Main.java index 7e4cf9f..3cdb40d 100644 --- a/src/main/java/cc/carm/plugin/scriptitems/Main.java +++ b/src/main/java/cc/carm/plugin/scriptitems/Main.java @@ -12,6 +12,9 @@ import cc.carm.plugin.scriptitems.listener.ProtectListener; import cc.carm.plugin.scriptitems.manager.ItemsManager; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.Method; public class Main extends EasyPlugin { @@ -108,4 +111,20 @@ public class Main extends EasyPlugin { return false; } } + + public static void execute(Runnable task) { + if (isFolia()) { + try { + Method getSchedulerMethod = Main.getInstance().getServer().getClass().getMethod("getGlobalRegionScheduler"); + Object scheduler = getSchedulerMethod.invoke(Main.getInstance().getServer()); + Method executeMethod = scheduler.getClass().getMethod("execute", Plugin.class, Runnable.class); + executeMethod.invoke(scheduler, Main.getInstance(), task); + } catch (Exception e) { + Main.severe("Failed to execute command on Folia"); + e.printStackTrace(); + } + } else { + Main.getInstance().getScheduler().run(task); + } + } } diff --git a/src/main/java/cc/carm/plugin/scriptitems/item/ScriptAction.java b/src/main/java/cc/carm/plugin/scriptitems/item/ScriptAction.java index f6f546e..d647633 100644 --- a/src/main/java/cc/carm/plugin/scriptitems/item/ScriptAction.java +++ b/src/main/java/cc/carm/plugin/scriptitems/item/ScriptAction.java @@ -1,5 +1,6 @@ package cc.carm.plugin.scriptitems.item; +import cc.carm.plugin.scriptitems.Main; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -22,8 +23,13 @@ public class ScriptAction { return actionContent; } - public boolean execute(Player player) { - return getType().execute(player, getActionContent()); + public void execute(Player player) { + try { + getType().execute(player, getActionContent()); + } catch (Exception ex) { + Main.severe("在为玩家执行 脚本动作 时发生错误: " + ex.getMessage()); + ex.printStackTrace(); + } } public static @Nullable ScriptAction read(@Nullable String actionString) { diff --git a/src/main/java/cc/carm/plugin/scriptitems/item/ScriptActionGroup.java b/src/main/java/cc/carm/plugin/scriptitems/item/ScriptActionGroup.java index 21964cc..dd2f6d2 100644 --- a/src/main/java/cc/carm/plugin/scriptitems/item/ScriptActionGroup.java +++ b/src/main/java/cc/carm/plugin/scriptitems/item/ScriptActionGroup.java @@ -1,5 +1,6 @@ package cc.carm.plugin.scriptitems.item; +import cc.carm.plugin.scriptitems.Main; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -17,7 +18,20 @@ public class ScriptActionGroup { } public void execute(Player player) { - actions.forEach(action -> action.execute(player)); + for (ScriptAction action : actions) { // Take actions first + if (action.getType() == ScriptActionType.TAKE) { + action.execute(player); + } + } + + Main.execute(() -> { + for (ScriptAction action : actions) { + if (action.getType() != ScriptActionType.TAKE) { + action.execute(player); + } + } + }); + } public static @NotNull ScriptActionGroup read(@NotNull List actionsString) { diff --git a/src/main/java/cc/carm/plugin/scriptitems/item/ScriptActionType.java b/src/main/java/cc/carm/plugin/scriptitems/item/ScriptActionType.java index 2d1d07d..047d985 100644 --- a/src/main/java/cc/carm/plugin/scriptitems/item/ScriptActionType.java +++ b/src/main/java/cc/carm/plugin/scriptitems/item/ScriptActionType.java @@ -1,6 +1,9 @@ package cc.carm.plugin.scriptitems.item; import cc.carm.lib.easyplugin.utils.MessageUtils; +import cc.carm.plugin.scriptitems.utils.ScriptExecutor; +import com.cryptomorin.xseries.XSound; +import com.cryptomorin.xseries.base.XModule; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.Sound; @@ -9,9 +12,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.function.BiFunction; public enum ScriptActionType { @@ -20,37 +20,24 @@ public enum ScriptActionType { * 若内容以 “/" 开头,则会以玩家身份执行命令。 */ CHAT((player, string) -> { - if (string == null) return true; //没有需要执行的 - List finalContents = MessageUtils.setPlaceholders(player, Collections.singletonList(string)); - boolean success = true; - for (String finalContent : finalContents) { - try { - player.chat(finalContent); - } catch (Exception ex) { - success = false; - } - } - return success; + if (string == null) return; //没有需要执行的 + String contents = MessageUtils.setPlaceholders(player, string); + if (contents == null || contents.isEmpty()) return; + player.chat(contents); }), /** * 让玩家以OP的身份执行命令 */ OP((player, string) -> { - if (string == null) return true; - List finalCommands = MessageUtils.setPlaceholders(player, Collections.singletonList(string)); - boolean success = true; + if (string == null) return; + String cmd = MessageUtils.setPlaceholders(player, string); + if (cmd == null || cmd.isEmpty()) return; + boolean opBefore = player.isOp(); player.setOp(true); - for (String finalCommand : finalCommands) { - try { - player.chat(finalCommand.startsWith("/") ? finalCommand : "/" + finalCommand); - } catch (Exception ex) { - success = false; - } - } + player.chat(cmd.startsWith("/") ? cmd : "/" + cmd); player.setOp(opBefore); - return success; }), /** @@ -58,27 +45,16 @@ public enum ScriptActionType { * 指令内容不需要以“/”开头。 */ CONSOLE((player, string) -> { - if (string == null) return true; - List finalCommands = MessageUtils.setPlaceholders(player, Collections.singletonList(string)); - boolean success = true; - for (String finalCommand : finalCommands) { - try { - String cmd = finalCommand.startsWith("/") ? finalCommand.substring(1) : finalCommand; - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), cmd); - } catch (Exception ex) { - success = false; - } - } - return success; + if (string == null) return; + String cmd = MessageUtils.setPlaceholders(player, string); + if (cmd == null || cmd.isEmpty()) return; + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), cmd.startsWith("/") ? cmd.substring(1) : cmd); }), /** * 向玩家发送消息。 */ - MESSAGE((sender, messages) -> { - MessageUtils.send(sender, messages); - return true; - }), + MESSAGE(MessageUtils::send), /** * 向玩家发送声音。 @@ -90,21 +66,15 @@ public enum ScriptActionType { * */ SOUND((player, string) -> { - if (string == null) return true; - try { - String[] args = string.contains(":") ? string.split(":") : new String[]{string}; - Sound sound = Arrays.stream(Sound.values()) - .filter(s -> s.name().equals(args[0])) - .findFirst().orElse(null); + if (string == null) return; + String[] args = string.contains(":") ? string.split(":") : new String[]{string}; + Sound sound = XSound.of(args[0].toUpperCase()).map(XModule::get).orElse(null); - if (sound == null) return true; - float volume = args.length > 1 ? Float.parseFloat(args[1]) : 1F; - float pitch = args.length > 2 ? Float.parseFloat(args[2]) : 1F; + if (sound == null) throw new IllegalArgumentException("不存在该声音类型: " + args[0]); + float volume = args.length > 1 ? Float.parseFloat(args[1]) : 1F; + float pitch = args.length > 2 ? Float.parseFloat(args[2]) : 1F; - player.playSound(player.getLocation(), sound, volume, pitch); - } catch (Exception ignored) { - } - return true; // 声音放不放无关紧要 + player.playSound(player.getLocation(), sound, volume, pitch); }), /** @@ -114,23 +84,23 @@ public enum ScriptActionType { if (player.getInventory().getItemInMainHand().getType() != Material.AIR) { int current = player.getInventory().getItemInMainHand().getAmount(); player.getInventory().getItemInMainHand().setAmount(current - 1); - return true; + } else { + throw new IllegalStateException("玩家手上没有物品可供拿取"); } - return false; }); - final BiFunction<@NotNull Player, @Nullable String, @NotNull Boolean> executor; + final @NotNull ScriptExecutor executor; - ScriptActionType(BiFunction<@NotNull Player, @Nullable String, @NotNull Boolean> executor) { + ScriptActionType(@NotNull ScriptExecutor executor) { this.executor = executor; } - public BiFunction getExecutor() { + public @NotNull ScriptExecutor getExecutor() { return executor; } - public boolean execute(@NotNull Player player, @Nullable String content) { - return getExecutor().apply(player, content); + public void execute(@NotNull Player player, @Nullable String content) throws Exception { + getExecutor().execute(player, content); } public static ScriptActionType read(String string) { diff --git a/src/main/java/cc/carm/plugin/scriptitems/utils/ScriptExecutor.java b/src/main/java/cc/carm/plugin/scriptitems/utils/ScriptExecutor.java new file mode 100644 index 0000000..9315693 --- /dev/null +++ b/src/main/java/cc/carm/plugin/scriptitems/utils/ScriptExecutor.java @@ -0,0 +1,12 @@ +package cc.carm.plugin.scriptitems.utils; + +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@FunctionalInterface +public interface ScriptExecutor { + + void execute(@NotNull Player player, @Nullable String content) throws Exception; + +}