From e5502384bcfafd29ed6905acd84f41cef7a72de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=BB=E9=AD=82=E5=9C=A3=E4=BD=BF?= Date: Thu, 26 Dec 2024 23:34:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=95=E5=85=A5set=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=EF=BC=8C=E5=85=81=E8=AE=B8=E6=B8=B8=E6=88=8F=E5=86=85=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=8E=A9=E5=AE=B6=E6=B2=99=E9=9B=95=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Commands/ZbCommand.java | 116 ++++++++++++------ .../data/Entity/TraverseEntity.java | 56 +++++++++ .../data/Entity/TraverseEntityInterface.java | 7 ++ .../data/Entity/TraverseEnum.java | 7 ++ .../Entity/TraverseLoginPlayerInterface.java | 7 ++ .../data/Entity/TraversePlayerInterface.java | 7 ++ .../coordinateRecorder/data/PlayerData.java | 11 ++ 7 files changed, 173 insertions(+), 38 deletions(-) create mode 100644 src/main/java/ling/coordinateRecorder/data/Entity/TraverseEntity.java create mode 100644 src/main/java/ling/coordinateRecorder/data/Entity/TraverseEntityInterface.java create mode 100644 src/main/java/ling/coordinateRecorder/data/Entity/TraverseEnum.java create mode 100644 src/main/java/ling/coordinateRecorder/data/Entity/TraverseLoginPlayerInterface.java create mode 100644 src/main/java/ling/coordinateRecorder/data/Entity/TraversePlayerInterface.java diff --git a/src/main/java/ling/coordinateRecorder/Commands/ZbCommand.java b/src/main/java/ling/coordinateRecorder/Commands/ZbCommand.java index 1588dec..f3224c7 100644 --- a/src/main/java/ling/coordinateRecorder/Commands/ZbCommand.java +++ b/src/main/java/ling/coordinateRecorder/Commands/ZbCommand.java @@ -4,6 +4,8 @@ import ling.coordinateRecorder.Config; import ling.coordinateRecorder.CoordinateRecorder; import ling.coordinateRecorder.Listener.PlayerMap; import ling.coordinateRecorder.data.CheatItemsData; +import ling.coordinateRecorder.data.Entity.TraverseEntity; +import ling.coordinateRecorder.data.Entity.TraverseEnum; import ling.coordinateRecorder.data.PlayerData; import ling.coordinateRecorder.data.TransmitData; import ling.database.tables.records.LocationnotepadPO; @@ -16,7 +18,6 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BookMeta; @@ -40,8 +41,8 @@ import static ling.database.tables.PlayersettingsTB.PLAYERSETTINGS; public class ZbCommand implements CommandExecutor, TabCompleter { protected final static List TAB_1 = Arrays.asList("add", "remove", "help", "reload", "list", "fixed", - "unfixed", "unlock", "sb", "tp", "yes", "no", "setting" - , "give"); + "unfixed", "unlock", "sb", "tp", "yes", "no", "setting", + "give", "set"); public ZbCommand() { @@ -163,36 +164,24 @@ public class ZbCommand implements CommandExecutor, TabCompleter { } /// 查看玩家沙雕值 - protected void sb(Player player, String[] strings) { + protected void sb(CommandSender command, String[] strings) { if (strings.length < 2) { - player.sendMessage(ChatColor.RED + "需要 [目标]"); + command.sendMessage(ChatColor.RED + "需要 [目标]"); return; } if (strings.length > 2) { - player.sendMessage(ChatColor.RED + "命令过长"); + command.sendMessage(ChatColor.RED + "命令过长"); return; } - try { - List list = Bukkit.selectEntities(player, strings[1]); - if (list.isEmpty()) { - player.sendMessage("没有选中任何玩家"); - return; - } - for (Entity entity : list) { - if (entity instanceof Player target) { - PlayerData data = PlayerMap.getCurrent().getPlayerData(target); - if (data == null) { - player.sendMessage(ChatColor.RED + "玩家 " + target.getName() + " 没有登录,跳过处理"); - continue; - } - player.sendMessage("玩家 " + target.getName() + " 拥有 " + data.getFraction() + " 沙雕值"); - } else { - player.sendMessage( - entity.getCustomName() != null ? entity.getCustomName() : entity.getName() + " 不是玩家"); - } - } - } catch (IllegalArgumentException e) { - player.sendMessage(ChatColor.RED + "无法解析实体"); + + TraverseEnum isSuccess = TraverseEntity.traverseLoginPlayer(command, strings[1], data -> { + command.sendMessage("玩家 " + data.getPlayer().getName() + " 拥有" + Config.getFractionTimeMessage( + data.getFraction()) + "沙雕值"); + }); + if (isSuccess == TraverseEnum.EMPTY) { + command.sendMessage("没有选中任何实体"); + } else if (isSuccess == TraverseEnum.ERROR) { + command.sendMessage(ChatColor.RED + "无法解析实体"); } } @@ -411,10 +400,8 @@ public class ZbCommand implements CommandExecutor, TabCompleter { return; } boolean isTp; - if (strings[2].equals("true")) - isTp = true; - else if (strings[2].equals("false")) - isTp = false; + if (strings[2].equals("true")) isTp = true; + else if (strings[2].equals("false")) isTp = false; else { player.sendMessage(ChatColor.RED + "语法错误,在" + strings[2] + "上"); return; @@ -426,8 +413,7 @@ public class ZbCommand implements CommandExecutor, TabCompleter { try { var ctx = CoordinateRecorder.getDatabase().getDSL(); UpdateSetMoreStep update = ctx.update(PLAYERSETTINGS).set(PLAYERSETTINGS.TPME, isTp); - if (message != null) - update = update.set(PLAYERSETTINGS.SETTINGSREJECTTPMESSAGE, message); + if (message != null) update = update.set(PLAYERSETTINGS.SETTINGSREJECTTPMESSAGE, message); update.where(PLAYERSETTINGS.UID.eq(player.getUniqueId().toString())).execute(); data.loadPlayerSettings(); player.sendMessage("设置已经成功更新!"); @@ -478,8 +464,7 @@ public class ZbCommand implements CommandExecutor, TabCompleter { meta.addEnchant(Enchantment.VANISHING_CURSE, 1, true); meta.setDisplayName(ChatColor.YELLOW + "指令之剑"); meta.setLore(Arrays.asList(ChatColor.YELLOW + "蕴含管理员权柄的命令武器", - ChatColor.YELLOW + "由 " + player.getName() + " 召唤", - ChatColor.RED + "仅限玩家!")); + ChatColor.YELLOW + "由 " + player.getName() + " 召唤", ChatColor.RED + "仅限玩家!")); //设置修订次数,阻止玩家修复耐久,以及附加其他附魔 ((Repairable) meta).setRepairCost(100); meta.setDamage(sword.getType().getMaxDurability() - 3); @@ -497,6 +482,44 @@ public class ZbCommand implements CommandExecutor, TabCompleter { Bukkit.spigot().broadcast(message); } + protected void set(CommandSender command, String[] strings) { + if (strings.length != 3) { + command.sendMessage(ChatColor.RED + "命令过短"); + return; + } + if (!command.isOp()) { + command.sendMessage(ChatColor.RED + "该命令需要管理员权限!"); + return; + } + int fraction = 0; + try { + fraction = Integer.parseInt(strings[2]); + } catch (NumberFormatException e) { + command.sendMessage(ChatColor.RED + "无法解析的参数:" + strings[2]); + return; + } + + int finalFraction = fraction; + TraverseEnum isSuccess = TraverseEntity.traverseLoginPlayer(command, strings[1], data -> { + try { + data.setFraction(finalFraction); + PlayerMap.getCurrent().broadcastScore(data); + command.sendMessage(data.getPlayer().getName() + " 沙雕值已更新"); + data.getPlayer().sendMessage( + "沙雕值被管理员更新为 " + Config.getFractionTimeMessage(data.getFraction())); + } catch (SQLException e) { + command.sendMessage(ChatColor.RED + data.getPlayer().getName() + " 更新失败"); + } + }); + if (isSuccess == TraverseEnum.SUCCESS) { + command.sendMessage("命令已经成功执行"); + } else if (isSuccess == TraverseEnum.EMPTY) { + command.sendMessage("没有选中任何实体"); + } else { + command.sendMessage(ChatColor.RED + "更新失败:参数错误!"); + } + } + protected boolean execute(Player player, String[] strings) { if (strings.length < 1) { player.sendMessage(ChatColor.RED + "语法错误:需要 [选项]"); @@ -528,9 +551,6 @@ public class ZbCommand implements CommandExecutor, TabCompleter { case "unlock": unlock(player, strings); break; - case "sb": - sb(player, strings); - break; case "tp": tp(player, strings); break; @@ -559,6 +579,16 @@ public class ZbCommand implements CommandExecutor, TabCompleter { public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) { assert s.equals("zb"); + if (strings.length >= 1) { + switch (strings[0]) { + case "set": + set(commandSender, strings); + return true; + case "sb": + sb(commandSender, strings); + return true; + } + } if (!(commandSender instanceof Player player)) { System.out.println("该命令只能由玩家执行"); return false; @@ -629,6 +659,13 @@ public class ZbCommand implements CommandExecutor, TabCompleter { return List.of(); } + protected List onResetTab(Player player, String latest, String[] strings) { + if (strings.length == 2) { + return onSbTab(player, latest, strings); + } + return List.of("<沙雕值>"); + } + @Override public List onTabComplete(CommandSender commandSender, Command command, String s, String[] strings) { if (!(commandSender instanceof Player player)) { @@ -667,6 +704,9 @@ public class ZbCommand implements CommandExecutor, TabCompleter { if (strings[0].equals("setting")) { return onSettingTab(player, latest, strings); } + if (strings[0].equals("set")) { + return onResetTab(player, latest, strings); + } return List.of(); } diff --git a/src/main/java/ling/coordinateRecorder/data/Entity/TraverseEntity.java b/src/main/java/ling/coordinateRecorder/data/Entity/TraverseEntity.java new file mode 100644 index 0000000..0aa4b9b --- /dev/null +++ b/src/main/java/ling/coordinateRecorder/data/Entity/TraverseEntity.java @@ -0,0 +1,56 @@ +package ling.coordinateRecorder.data.Entity; + +import ling.coordinateRecorder.Listener.PlayerMap; +import ling.coordinateRecorder.data.PlayerData; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.TranslatableComponent; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; + +import java.util.List; + +/// 遍历实体 +public class TraverseEntity { + public static TraverseEnum traverse(CommandSender command, String target, TraverseEntityInterface on) { + try { + List list = Bukkit.selectEntities(command, target); + if (list.isEmpty()) { + return TraverseEnum.EMPTY; + } + for (Entity entity : list) { + on.onEntity(entity); + } + } catch (IllegalArgumentException e) { + return TraverseEnum.ERROR; + } + return TraverseEnum.SUCCESS; + } + + /// 遍历玩家 + public static TraverseEnum traversePlayer(CommandSender command, String target, TraversePlayerInterface on) { + return traverse(command, target, (entity -> { + if (entity instanceof Player player) { + on.onPlayer(player); + } else { + BaseComponent message = + new TranslatableComponent("item.minecraft." + entity.getType().name().toLowerCase()); + message.addExtra(" 不是玩家!"); + command.spigot().sendMessage(message); + } + })); + } + + /// 遍历已登录玩家 + public static TraverseEnum traverseLoginPlayer(CommandSender command, String target, TraverseLoginPlayerInterface on) { + return traversePlayer(command, target, player -> { + PlayerData data = PlayerMap.getCurrent().getPlayerData(player); + if (data == null) { + command.sendMessage(player.getName() + " 没有登录"); + return; + } + on.onLoginPlayer(data); + }); + } +} diff --git a/src/main/java/ling/coordinateRecorder/data/Entity/TraverseEntityInterface.java b/src/main/java/ling/coordinateRecorder/data/Entity/TraverseEntityInterface.java new file mode 100644 index 0000000..47b5315 --- /dev/null +++ b/src/main/java/ling/coordinateRecorder/data/Entity/TraverseEntityInterface.java @@ -0,0 +1,7 @@ +package ling.coordinateRecorder.data.Entity; + +import org.bukkit.entity.Entity; + +public interface TraverseEntityInterface { + void onEntity(Entity entity); +} diff --git a/src/main/java/ling/coordinateRecorder/data/Entity/TraverseEnum.java b/src/main/java/ling/coordinateRecorder/data/Entity/TraverseEnum.java new file mode 100644 index 0000000..c5a2016 --- /dev/null +++ b/src/main/java/ling/coordinateRecorder/data/Entity/TraverseEnum.java @@ -0,0 +1,7 @@ +package ling.coordinateRecorder.data.Entity; + +public enum TraverseEnum { + SUCCESS, + EMPTY, + ERROR, +} diff --git a/src/main/java/ling/coordinateRecorder/data/Entity/TraverseLoginPlayerInterface.java b/src/main/java/ling/coordinateRecorder/data/Entity/TraverseLoginPlayerInterface.java new file mode 100644 index 0000000..8b14ce0 --- /dev/null +++ b/src/main/java/ling/coordinateRecorder/data/Entity/TraverseLoginPlayerInterface.java @@ -0,0 +1,7 @@ +package ling.coordinateRecorder.data.Entity; + +import ling.coordinateRecorder.data.PlayerData; + +public interface TraverseLoginPlayerInterface { + void onLoginPlayer(PlayerData data); +} diff --git a/src/main/java/ling/coordinateRecorder/data/Entity/TraversePlayerInterface.java b/src/main/java/ling/coordinateRecorder/data/Entity/TraversePlayerInterface.java new file mode 100644 index 0000000..dd0e53c --- /dev/null +++ b/src/main/java/ling/coordinateRecorder/data/Entity/TraversePlayerInterface.java @@ -0,0 +1,7 @@ +package ling.coordinateRecorder.data.Entity; + +import org.bukkit.entity.Player; + +public interface TraversePlayerInterface { + void onPlayer(Player player); +} diff --git a/src/main/java/ling/coordinateRecorder/data/PlayerData.java b/src/main/java/ling/coordinateRecorder/data/PlayerData.java index c581f78..9f2b7e2 100644 --- a/src/main/java/ling/coordinateRecorder/data/PlayerData.java +++ b/src/main/java/ling/coordinateRecorder/data/PlayerData.java @@ -276,6 +276,17 @@ public class PlayerData { return rows == 1; } + /// 设置玩家分数 + public boolean setFraction(int fraction) throws SQLException { + if (fraction < 0) + fraction = 0; + var ctx = CoordinateRecorder.getDatabase().getDSL(); + int rows = ctx.update(PLAYERSETTINGS).set(PLAYERSETTINGS.FRACTION, Long.valueOf(fraction)) + .where(PLAYERSETTINGS.UID.eq(player.getUniqueId().toString())).execute(); + loadPlayerSettings(); + return rows == 1; + } + /// 删除一个地标 public boolean removeLocation(String name) throws SQLException { var ctx = CoordinateRecorder.getDatabase().getDSL();