引入sb子命令,重写帮助手册

This commit is contained in:
2024-12-21 04:58:44 +08:00
parent 83429b6230
commit fefae68bec
3 changed files with 169 additions and 30 deletions

View File

@@ -0,0 +1,92 @@
package ling.coordinateRecorder.Commands;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/// 帮助信息
public class Help {
protected static final String[] HELP_LIST = {
"欢迎使用坐标管理器!你好,%s\n\n本书将向你介绍如何使用指令记录曾探索过的地点以避免迷路\n\n如果需要再次查看帮助信息请使用\n/zb help",
"""
添加地标
/zb add <地点名称> <固定>
记录当前地点到数据库中,例如
/zb add Home
将会记录当前的位置取名为Home并固定到屏幕右侧
如果不想固定到屏幕右侧,可以像这样使用
/zb add Home false""",
"""
查看已保存地标
/zb list <Page>
这将列出已经记录的地标,使用 Page 参数指定页码,例如显示第三页地标内容可以像这样使用:
/zb list 3
""",
"""
删除地标
/zb remove <Name>
使用remove子命令可以删除一个已经保存的地标例如
/zb remove Home
""",
"""
固定和取消固定
/zb fixed <Name>
/zb unfixed <Name>
如果你想将一个地标固定显示在屏幕右侧,使用 fixed。要取消固定使用unfixed
/zb fixed Home
/zb unfixed Home
""",
"""
重新载入数据
/zb reload
如果你的各项数据不是最新,请使用此命令重新载入。
注意!滥用此功能可能被服务器列入不受欢迎名单!
""",
"""
物品保护
玩家死亡后,将在原地生成一个上锁的箱子,收纳你的凋落物,我们称之为“墓碑”。
墓碑将上锁,只有你自己可以解锁(存在例外情况,下文介绍),墓碑解锁后就和普通箱子没有区别了。
解锁墓碑将增加玩家“沙雕值”,沙雕值过高将无法解锁墓碑。
""",
"""
你可以付出更多的沙雕值来解锁由你击败的玩家的墓碑!
""",
"""
沙雕值
一种具备惩罚性质的数据沙雕值过高将获得一系列debuff。
使用此命令检查玩家沙雕值:
/zb sb <Name>
""",
"""
PVP惩罚
当你击败其他玩家后,将获得沙雕值,另外,你将有机会解锁该玩家本次生成的墓碑。
如果被其他玩家击败你可以复仇复仇不会面临PVP惩罚而且可以免费解锁该玩家的墓碑。
"""
};
public static List<String> getHelp(Player player) {
List<String> help = Arrays.asList(HELP_LIST);
List<String> list = new ArrayList<>(help);
list.removeFirst();
list.addFirst(String.format(HELP_LIST[0], player.getName()));
return list;
}
}

View File

@@ -4,6 +4,7 @@ import ling.coordinateRecorder.CoordinateRecorder;
import ling.coordinateRecorder.Listener.PlayerMap;
import ling.coordinateRecorder.data.PlayerData;
import ling.database.tables.records.LocationnotepadPO;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
@@ -11,6 +12,7 @@ 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;
@@ -28,7 +30,7 @@ import static ling.database.tables.LocationnotepadTB.LOCATIONNOTEPAD;
public class ZbCommand implements CommandExecutor, TabCompleter {
protected final static List<String> TAB_1 = Arrays.asList("add", "remove", "help", "reload", "list", "fixed",
"unfixed", "unlock");
"unfixed", "unlock", "sb");
public ZbCommand() {
@@ -58,8 +60,7 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
return;
}
try {
if (data.addLocation(name, isFixed))
player.sendMessage("坐标记录完毕!");
if (data.addLocation(name, isFixed)) player.sendMessage("坐标记录完毕!");
} catch (SQLException e) {
CoordinateRecorder.getCurrent().getLogger().severe("记录坐标出错:" + e.getMessage());
player.sendMessage(ChatColor.RED + "服务器内部错误:记录数据失败");
@@ -92,9 +93,8 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
//开始查询数据
var ctx = CoordinateRecorder.getDatabase().getDSL();
Integer count = ctx.select(DSL.count()).from(LOCATIONNOTEPAD)
.where(LOCATIONNOTEPAD.UID.eq(player.getUniqueId().toString())
.and(LOCATIONNOTEPAD.ISDELETE.eq(false)))
Integer count = ctx.select(DSL.count()).from(LOCATIONNOTEPAD).where(
LOCATIONNOTEPAD.UID.eq(player.getUniqueId().toString()).and(LOCATIONNOTEPAD.ISDELETE.eq(false)))
.fetchOne(DSL.count());
assert count != null;
int pageCount = (count / PAGE_SIZE) + (count % PAGE_SIZE == 0 ? 0 : 1);
@@ -104,10 +104,10 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
return;
}
List<LocationnotepadPO> result = ctx.select().from(LOCATIONNOTEPAD)
.where(LOCATIONNOTEPAD.UID.eq(player.getUniqueId().toString()).and(LOCATIONNOTEPAD.ISDELETE.eq(false)))
.orderBy(LOCATIONNOTEPAD.ID.asc())
.limit(PAGE_SIZE).offset(PAGE_SIZE * (page - 1)).fetch().into(LocationnotepadPO.class);
List<LocationnotepadPO> result = ctx.select().from(LOCATIONNOTEPAD).where(
LOCATIONNOTEPAD.UID.eq(player.getUniqueId().toString()).and(LOCATIONNOTEPAD.ISDELETE.eq(false)))
.orderBy(LOCATIONNOTEPAD.ID.asc()).limit(PAGE_SIZE).offset(PAGE_SIZE * (page - 1)).fetch().into(
LocationnotepadPO.class);
player.sendMessage("共查询到" + result.size() + "条结果:");
for (LocationnotepadPO po : result) {
player.sendMessage(po.getName() + " X " + po.getX() + " Y " + po.getY() + " Z " + po.getZ());
@@ -151,6 +151,40 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
}
}
/// 查看玩家沙雕值
protected void sb(Player player, String[] strings) {
if (strings.length < 2) {
player.sendMessage(ChatColor.RED + "需要 [目标]");
return;
}
if (strings.length > 2) {
player.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 + "无法解析实体");
}
}
/// 显示帮助
protected void help(Player player, String[] strings) {
if (strings.length > 2) {
@@ -166,12 +200,9 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
BookMeta bookMeta = getHelpBookMeta(player, book);
book.setItemMeta(bookMeta);
if (op.equals("open"))
player.openBook(book);
else if (op.equals("give"))
player.getInventory().addItem(book);
else
player.sendMessage(ChatColor.RED + "语法错误:无法解析的参数:" + op);
if (op.equals("open")) player.openBook(book);
else if (op.equals("give")) player.getInventory().addItem(book);
else player.sendMessage(ChatColor.RED + "语法错误:无法解析的参数:" + op);
}
private static @NotNull BookMeta getHelpBookMeta(Player player, ItemStack book) {
@@ -180,10 +211,7 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
bookMeta.setGeneration(BookMeta.Generation.COPY_OF_COPY);
bookMeta.setTitle("帮助信息");
bookMeta.setAuthor("StarPoles");
bookMeta.addPage(
"欢迎使用坐标管理器!你好," + player.getName() + "\n\n" + "本书将向你介绍如何使用指令记录曾探索过的地点,以避免迷路\n" + "如果需要再次查看帮助信息,请使用 /zb help\n",
"/zb add <地点名称> <固定到侧边栏> \n" + "记录当前地点到数据库中,例如\n" + "/zb add Home\n" + "将会记录当前的位置,取名为 Home并固定到屏幕右侧\n",
"如果不想固定到屏幕右侧,可以像这样使用\n" + "/zb add Home false\n" + "然后,你可以使用/zb list来查看已经保存的位置\n" + "使用/zb fixed <Name> 来将地点固定到屏幕右侧\n" + "使用/zb unfixed <Name> 来取消固定。\n");
bookMeta.setPages(Help.getHelp(player));
bookMeta.addEnchant(Enchantment.VANISHING_CURSE, 1, true);
return bookMeta;
}
@@ -223,11 +251,9 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
return;
}
var ctx = CoordinateRecorder.getDatabase().getDSL();
int rows = ctx.update(LOCATIONNOTEPAD).set(LOCATIONNOTEPAD.ISFIXED, true)
.where(LOCATIONNOTEPAD.UID.eq(player.getUniqueId().toString())
.and(LOCATIONNOTEPAD.NAME.eq(name))
.and(LOCATIONNOTEPAD.ISDELETE.eq(false)))
.execute();
int rows = ctx.update(LOCATIONNOTEPAD).set(LOCATIONNOTEPAD.ISFIXED, true).where(LOCATIONNOTEPAD.UID.eq(
player.getUniqueId().toString()).and(LOCATIONNOTEPAD.NAME.eq(name)).and(LOCATIONNOTEPAD.ISDELETE.eq(
false))).execute();
if (rows == 0) {
player.sendMessage(ChatColor.RED + "操作失败:记录不存在");
return;
@@ -253,11 +279,9 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
return;
}
var ctx = CoordinateRecorder.getDatabase().getDSL();
int rows = ctx.update(LOCATIONNOTEPAD).set(LOCATIONNOTEPAD.ISFIXED, false)
.where(LOCATIONNOTEPAD.UID.eq(player.getUniqueId().toString())
.and(LOCATIONNOTEPAD.NAME.eq(name))
.and(LOCATIONNOTEPAD.ISDELETE.eq(false)))
.execute();
int rows = ctx.update(LOCATIONNOTEPAD).set(LOCATIONNOTEPAD.ISFIXED, false).where(LOCATIONNOTEPAD.UID.eq(
player.getUniqueId().toString()).and(LOCATIONNOTEPAD.NAME.eq(name)).and(LOCATIONNOTEPAD.ISDELETE.eq(
false))).execute();
if (rows == 0) {
player.sendMessage(ChatColor.RED + "操作失败:记录不存在");
return;
@@ -297,6 +321,12 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
case "unlock":
unlock(player, strings);
break;
case "sb":
sb(player, strings);
break;
default:
player.sendMessage(ChatColor.RED + "未知的选项:" + strings[0]);
break;
}
} catch (SQLException e) {
player.sendMessage(ChatColor.RED + "服务器内部错误,请联系管理员");
@@ -340,6 +370,16 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
return List.of();
}
protected List<String> onSbTab(Player player, String latest, String[] strings) {
List<String> list = new ArrayList<>();
Bukkit.getOnlinePlayers().forEach(player1 -> {
list.add(player1.getName());
});
filter(latest, list);
list.addAll(Arrays.asList("@a", "@s", "@p", "@e"));
return list;
}
@Override
public List<String> onTabComplete(CommandSender commandSender, Command command, String s, String[] strings) {
if (!(commandSender instanceof Player player)) {
@@ -364,6 +404,9 @@ public class ZbCommand implements CommandExecutor, TabCompleter {
case "help" -> {
return filter(latest, new ArrayList<>(Arrays.asList("give", "open")));
}
case "sb" -> {
return onSbTab(player, latest, strings);
}
}
}
if (strings[0].equals("add")) {

View File

@@ -58,6 +58,10 @@ public class PlayerData {
this.fractionTime = fractionTime;
}
public long getFraction() {
return settings.getFraction();
}
public void setTombstoneBlock(Block tombstone) {
this.tombstoneBlock = tombstone;
}