引入set命令,允许游戏内修改玩家沙雕值

This commit is contained in:
2024-12-26 23:34:34 +08:00
parent 83db8d61e9
commit e5502384bc
7 changed files with 173 additions and 38 deletions

View File

@@ -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<String> 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<Entity> 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<PlayersettingsPO> 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<String> onResetTab(Player player, String latest, String[] strings) {
if (strings.length == 2) {
return onSbTab(player, latest, strings);
}
return List.of("<沙雕值>");
}
@Override
public List<String> 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();
}

View File

@@ -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<Entity> 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);
});
}
}

View File

@@ -0,0 +1,7 @@
package ling.coordinateRecorder.data.Entity;
import org.bukkit.entity.Entity;
public interface TraverseEntityInterface {
void onEntity(Entity entity);
}

View File

@@ -0,0 +1,7 @@
package ling.coordinateRecorder.data.Entity;
public enum TraverseEnum {
SUCCESS,
EMPTY,
ERROR,
}

View File

@@ -0,0 +1,7 @@
package ling.coordinateRecorder.data.Entity;
import ling.coordinateRecorder.data.PlayerData;
public interface TraverseLoginPlayerInterface {
void onLoginPlayer(PlayerData data);
}

View File

@@ -0,0 +1,7 @@
package ling.coordinateRecorder.data.Entity;
import org.bukkit.entity.Player;
public interface TraversePlayerInterface {
void onPlayer(Player player);
}

View File

@@ -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();