diff --git a/src/main/java/cn/lunadeer/newbtitle/Commands.java b/src/main/java/cn/lunadeer/newbtitle/Commands.java index deb2a37..0d26e98 100644 --- a/src/main/java/cn/lunadeer/newbtitle/Commands.java +++ b/src/main/java/cn/lunadeer/newbtitle/Commands.java @@ -1,12 +1,15 @@ package cn.lunadeer.newbtitle; +import cn.lunadeer.newbtitle.utils.Notification; +import cn.lunadeer.newbtitle.utils.XLogger; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.List; +import java.util.*; public class Commands implements TabExecutor { /** @@ -23,7 +26,38 @@ public class Commands implements TabExecutor { */ @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - return false; + switch (label) { + case "nt": + if (args.length == 0) { + if (sender instanceof Player) { + Player player = (Player) sender; + Notification.warn(player, "用法: /nt "); + } else { + XLogger.info("用法: /nt "); + } + return true; + } + switch (args[0]) { + case "use": + return use(sender, args); + case "list": + return list(sender, args); + case "shop": + return shop(sender, args); + case "buy": + return buy(sender, args); + default: + if (sender instanceof Player) { + Player player = (Player) sender; + Notification.warn(player, "用法: /nt "); + } else { + XLogger.info("用法: /nt "); + } + return true; + } + default: + return false; + } } /** @@ -41,6 +75,101 @@ public class Commands implements TabExecutor { */ @Override public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - return null; + switch (label) { + case "nt": + if (args.length == 0) { + return Arrays.asList("use", "list", "shop", "buy"); + } + switch (args[0]) { + case "use": + return Collections.singletonList("要使用的称号ID"); + case "list": + return Collections.singletonList("页数(可选)"); + case "shop": + return Collections.singletonList("页数(可选)"); + case "buy": + return Collections.singletonList("要购买的条目ID"); + default: + return Arrays.asList("use", "list", "shop", "buy"); + } + default: + return null; + } + } + + private static boolean use(CommandSender sender, String[] args) { + if (!(sender instanceof Player)) { + XLogger.warn("该命令只能由玩家执行"); + return true; + } + Player player = (Player) sender; + if (args.length == 0) { + Notification.warn(player, "用法: /nt use <称号ID>"); + return true; + } + XPlayer xPlayer = new XPlayer(player); + Integer title_id = Integer.parseInt(args[0]); + xPlayer.updateUsingTitle(title_id); + return true; + } + + private static boolean list(CommandSender sender, String[] args) { + if (!(sender instanceof Player)) { + XLogger.warn("该命令只能由玩家执行"); + return true; + } + Player player = (Player) sender; + int page = 1; + if (args.length != 0) { + try { + page = Integer.parseInt(args[0]); + } catch (Exception e) { + Notification.warn(player, "用法: /nt list <页数>"); + return true; + } + } + XPlayer xPlayer = new XPlayer(player); + xPlayer.openBackpack(page); + return true; + } + + private static boolean shop(CommandSender sender, String[] args) { + if (!(sender instanceof Player)) { + XLogger.warn("该命令只能由玩家执行"); + return true; + } + Player player = (Player) sender; + int page = 1; + if (args.length != 0) { + try { + page = Integer.parseInt(args[0]); + } catch (Exception e) { + Notification.warn(player, "用法: /nt shop <页数>"); + return true; + } + } + Shop.open(player, page); + return true; + } + + private static boolean buy(CommandSender sender, String[] args) { + if (!(sender instanceof Player)) { + XLogger.warn("该命令只能由玩家执行"); + return true; + } + Player player = (Player) sender; + if (args.length == 0) { + Notification.warn(player, "用法: /nt buy <称号ID>"); + return true; + } + XPlayer xPlayer = new XPlayer(player); + Integer sale_id = Integer.parseInt(args[0]); + SaleTitle saleTitle = Shop.getSaleTitle(sale_id); + if (saleTitle == null) { + Notification.error(player, "该称号不存在"); + return true; + } + xPlayer.buyTitle(saleTitle); + return true; } } diff --git a/src/main/java/cn/lunadeer/newbtitle/Events.java b/src/main/java/cn/lunadeer/newbtitle/Events.java index 3832aa6..67e7a38 100644 --- a/src/main/java/cn/lunadeer/newbtitle/Events.java +++ b/src/main/java/cn/lunadeer/newbtitle/Events.java @@ -1,6 +1,14 @@ package cn.lunadeer.newbtitle; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; public class Events implements Listener { + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + new XPlayer(event.getPlayer()); + } } diff --git a/src/main/java/cn/lunadeer/newbtitle/NewbTitle.java b/src/main/java/cn/lunadeer/newbtitle/NewbTitle.java index ec9fb7d..4d17355 100644 --- a/src/main/java/cn/lunadeer/newbtitle/NewbTitle.java +++ b/src/main/java/cn/lunadeer/newbtitle/NewbTitle.java @@ -1,6 +1,7 @@ package cn.lunadeer.newbtitle; import cn.lunadeer.newbtitle.utils.ConfigManager; +import cn.lunadeer.newbtitle.utils.Database; import cn.lunadeer.newbtitle.utils.XLogger; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -15,6 +16,7 @@ public final class NewbTitle extends JavaPlugin { // Plugin startup logic instance = this; config = new ConfigManager(instance); + Database.migrate(); Bukkit.getPluginManager().registerEvents(new Events(), this); Objects.requireNonNull(Bukkit.getPluginCommand("NewbTitle")).setExecutor(new Commands()); diff --git a/src/main/java/cn/lunadeer/newbtitle/Shop.java b/src/main/java/cn/lunadeer/newbtitle/Shop.java index 10c6984..a91bfa9 100644 --- a/src/main/java/cn/lunadeer/newbtitle/Shop.java +++ b/src/main/java/cn/lunadeer/newbtitle/Shop.java @@ -34,13 +34,15 @@ public class Shop { if (i >= titles.size()) { break; } - SaleTitle title = titles.get(i); + Integer title_sale_id = (Integer) titles.keySet().toArray()[i]; + TextComponent idx = Component.text("[" + title_sale_id + "] "); + SaleTitle title = titles.get(title_sale_id); Line line = Line.create(); TextComponent buy_button = Component.text("购买") - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/nt shop buy " + title.getId())); - line.set(Line.Slot.LEFT, (TextComponent) title.getTitle()) + .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/nt shop buy " + title_sale_id)); + line.set(Line.Slot.LEFT, idx.append(title.getTitle())) .set(Line.Slot.MIDDLE, title.getPrice() + "|" + - (title.getDays() < 0 ?"∞" : title.getDays()) + "|" + + (title.getDays() < 0 ? "∞" : title.getDays()) + "|" + (title.getAmount() < 0 ? "∞" : title.getAmount())) .set(Line.Slot.RIGHT, buy_button); view.set(View.Slot.LINE_1, line); @@ -106,4 +108,32 @@ public class Shop { } return titles; } + + public static SaleTitle getSaleTitle(Integer sale_id) { + String sql = ""; + sql += "SELECT "; + sql += "id, "; + sql += "title_id, "; + sql += "price, "; + sql += "days, "; + sql += "amount, "; + sql += "sale_end_at"; + sql += "FROM nt_title_shop "; + sql += "WHERE id = " + sale_id + ";"; + ResultSet rs = Database.query(sql); + try { + if (rs != null && rs.next()) { + Integer id = rs.getInt("id"); + Integer title_id = rs.getInt("title_id"); + Integer price = rs.getInt("price"); + Integer days = rs.getInt("days"); + Integer amount = rs.getInt("amount"); + Long sale_end_at = rs.getLong("sale_end_at"); + return new SaleTitle(id, title_id, price, days, amount, sale_end_at); + } + } catch (Exception e) { + XLogger.err("XPlayer getTitles failed: " + e.getMessage()); + } + return null; + } } diff --git a/src/main/java/cn/lunadeer/newbtitle/Title.java b/src/main/java/cn/lunadeer/newbtitle/Title.java index b455dfe..d49ffeb 100644 --- a/src/main/java/cn/lunadeer/newbtitle/Title.java +++ b/src/main/java/cn/lunadeer/newbtitle/Title.java @@ -6,6 +6,7 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentLike; import net.kyori.adventure.text.JoinConfiguration; import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.event.HoverEvent; import java.sql.ResultSet; @@ -79,7 +80,7 @@ public class Title { public Component getTitle() { String[] parts = this._title.split("&#"); TextComponent[] components = new TextComponent[parts.length]; - if (parts[0].length() > 0) { + if (!parts[0].isEmpty()) { components[0] = Component.text(parts[0]); } for (int i = 1; i < parts.length; i++) { @@ -93,7 +94,7 @@ public class Title { TextComponent suffix = Component.text(NewbTitle.config.getSuffix()); components[0] = prefix.append(components[0]); components[parts.length - 1] = components[parts.length - 1].append(suffix); - return Component.join(join, components); + return Component.join(join, components).hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text(this._description))); } public void setTitle(String title) { diff --git a/src/main/java/cn/lunadeer/newbtitle/XPlayer.java b/src/main/java/cn/lunadeer/newbtitle/XPlayer.java index 8f7f67a..1e8418a 100644 --- a/src/main/java/cn/lunadeer/newbtitle/XPlayer.java +++ b/src/main/java/cn/lunadeer/newbtitle/XPlayer.java @@ -49,12 +49,14 @@ public class XPlayer { if (i >= titles.size()) { break; } - PlayerTitle title = titles.get(i); + int title_id = (int) titles.keySet().toArray()[i]; + TextComponent idx = Component.text("[" + title_id + "] "); + PlayerTitle title = titles.get(title_id); Line line = Line.create(); boolean is_using = Objects.equals(title.getId(), _current_title_id); TextComponent buy_button = Component.text(is_using ? "卸下" : "使用") .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/nt use " + (is_using ? -1 : title.getId()))); - line.set(Line.Slot.LEFT, (TextComponent) title.getTitle()) + line.set(Line.Slot.LEFT, idx.append(title.getTitle())) .set(Line.Slot.MIDDLE, title.getExpireAt()) .set(Line.Slot.RIGHT, buy_button); view.set(View.Slot.LINE_1, line); @@ -75,11 +77,10 @@ public class XPlayer { applyCurrentTitle(); String sql = ""; sql += "UPDATE nt_player_using_title "; - sql += "SET title_id = " + title_id + ", "; + sql += "SET title_id = " + _current_title_id + ", "; sql += "updated_at = CURRENT_TIMESTAMP "; sql += "WHERE uuid = '" + _player.getUniqueId().toString() + "';"; Database.query(sql); - _current_title_id = title_id; Notification.info(_player, "成功使用称号: " + _titles.get(title_id).getTitle()); }