diff --git a/pom.xml b/pom.xml index 4ebe5ca..31ad324 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cn.lunadeer NewbTitle - 0.34-alpha + 0.36-alpha jar NewbTitle diff --git a/src/main/java/cn/lunadeer/newbtitle/Shop.java b/src/main/java/cn/lunadeer/newbtitle/Shop.java index e8c520d..7349436 100644 --- a/src/main/java/cn/lunadeer/newbtitle/Shop.java +++ b/src/main/java/cn/lunadeer/newbtitle/Shop.java @@ -2,6 +2,7 @@ package cn.lunadeer.newbtitle; import cn.lunadeer.newbtitle.utils.Database; import cn.lunadeer.newbtitle.utils.Notification; +import cn.lunadeer.newbtitle.utils.STUI.Button; import cn.lunadeer.newbtitle.utils.STUI.Line; import cn.lunadeer.newbtitle.utils.STUI.View; import cn.lunadeer.newbtitle.utils.XLogger; @@ -26,18 +27,13 @@ public class Shop { return; } Player player = (Player) sender; - Line header = Line.create(); - header.set(Line.Slot.LEFT, "称号") - .set(Line.Slot.MIDDLE, "价格|天|剩余") - .set(Line.Slot.RIGHT, "操作"); int offset = (page - 1) * 4; if (offset >= titles.size() || offset < 0) { Notification.error(player, "页数超出范围"); return; } View view = View.create(); - view.title("|| 称号商店 ||") - .set(View.Slot.SUBTITLE, header); + view.title("称号商店"); for (int i = offset; i < offset + 4; i++) { if (i >= titles.size()) { break; @@ -46,23 +42,16 @@ public class Shop { 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 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.getAmount() < 0 ? "∞" : title.getAmount())) - .set(Line.Slot.RIGHT, buy_button); + Component button = Button.create("购买", "/nt buy " + title_sale_id); + line.append(idx) + .append(title.getTitle()) + .append("价格:" + title.getPrice() + " 有效期:" + title.getDays() + "天") + .append("售卖截止:" + title.getSaleEndAt()) + .append("剩余:" + ((title.getAmount() == -1) ? "无限" : title.getAmount())) + .append(button); view.set(i, line); } - Line action_bar = Line.create(); - TextComponent previous_button = Component.text("上一页") - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/nt shop " + (page - 1))); - TextComponent next_button = Component.text("下一页") - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/nt shop " + (page + 1))); - action_bar.set(Line.Slot.MIDDLE, previous_button) - .set(Line.Slot.RIGHT, next_button); - view.set(View.Slot.ACTIONBAR, action_bar); + view.set(View.Slot.ACTIONBAR, View.pagination(page, titles.size(), "/nt shop")); view.showOn(player); } diff --git a/src/main/java/cn/lunadeer/newbtitle/Title.java b/src/main/java/cn/lunadeer/newbtitle/Title.java index 1cb96fb..a338e54 100644 --- a/src/main/java/cn/lunadeer/newbtitle/Title.java +++ b/src/main/java/cn/lunadeer/newbtitle/Title.java @@ -68,35 +68,23 @@ public class Title { return; } Player player = (Player) sender; - Line header = Line.create(); - header.set(Line.Slot.LEFT, "ID") - .set(Line.Slot.MIDDLE, "称号"); int offset = (page - 1) * 4; if (offset >= titles.size() || offset < 0) { Notification.error(player, "页数超出范围"); return; } View view = View.create(); - view.title("|| 所有称号 ||") - .set(View.Slot.SUBTITLE, header); + view.title("所有称号"); for (int i = offset; i < offset + 4; i++) { if (i >= titles.size()) { break; } TextComponent idx = Component.text("[" + titles.get(i).getId() + "] "); Line line = Line.create(); - line.set(Line.Slot.LEFT, idx) - .set(Line.Slot.MIDDLE, (TextComponent) titles.get(i).getTitle()); + line.append(idx).append(titles.get(i).getTitle()); view.set(i, line); } - Line action_bar = Line.create(); - TextComponent previous_button = Component.text("上一页") - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/nt all " + (page - 1))); - TextComponent next_button = Component.text("下一页") - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/nt all " + (page + 1))); - action_bar.set(Line.Slot.MIDDLE, previous_button) - .set(Line.Slot.RIGHT, next_button); - view.set(View.Slot.ACTIONBAR, action_bar); + view.set(View.Slot.ACTIONBAR, View.pagination(page, titles.size(), "/nt listall")); view.showOn(player); } @@ -170,7 +158,11 @@ public class Title { components.add(Component.text(content, color.getStyle())); } components.add(suffix); - return Component.join(join, components).hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text(this._description))); + TextComponent.Builder title_component = Component.text(); + for (TextComponent component : components) { + title_component.append(component); + } + return title_component.build().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 469c2ca..d00e1f8 100644 --- a/src/main/java/cn/lunadeer/newbtitle/XPlayer.java +++ b/src/main/java/cn/lunadeer/newbtitle/XPlayer.java @@ -2,6 +2,7 @@ package cn.lunadeer.newbtitle; import cn.lunadeer.newbtitle.utils.Database; import cn.lunadeer.newbtitle.utils.Notification; +import cn.lunadeer.newbtitle.utils.STUI.Button; import cn.lunadeer.newbtitle.utils.STUI.Line; import cn.lunadeer.newbtitle.utils.STUI.View; import cn.lunadeer.newbtitle.utils.XLogger; @@ -38,11 +39,6 @@ public class XPlayer { } public void openBackpack(Integer page) { - Line header = Line.create(); - header.set(Line.Slot.LEFT, "称号") - .set(Line.Slot.MIDDLE, "到期时间") - .set(Line.Slot.RIGHT, "操作"); - Map titles = getTitles(_player.getUniqueId()); int offset = (page - 1) * 4; if (offset >= titles.size() || offset < 0) { @@ -50,8 +46,7 @@ public class XPlayer { return; } View view = View.create(); - view.title("|| 我的称号 ||") - .set(View.Slot.SUBTITLE, header); + view.title("我的称号"); for (int i = offset; i < offset + 4; i++) { if (i >= titles.size()) { break; @@ -61,21 +56,14 @@ public class XPlayer { 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, idx.append(title.getTitle())) - .set(Line.Slot.MIDDLE, title.getExpireAt()) - .set(Line.Slot.RIGHT, buy_button); + Component button = Button.create(is_using ? "卸下" : "使用", "/nt use " + (is_using ? -1 : title.getId())); + line.append(idx) + .append(title.getTitle()) + .append(Component.text("有效期至:" + title.getExpireAt())) + .append(button); view.set(i, line); } - Line action_bar = Line.create(); - TextComponent previous_button = Component.text("上一页") - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/nt list " + (page - 1))); - TextComponent next_button = Component.text("下一页") - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.RUN_COMMAND, "/nt list " + (page + 1))); - action_bar.set(Line.Slot.MIDDLE, previous_button) - .set(Line.Slot.RIGHT, next_button); - view.set(View.Slot.ACTIONBAR, action_bar); + view.set(View.Slot.ACTIONBAR, View.pagination(page, titles.size(), "/nt list")); view.showOn(_player); } diff --git a/src/main/java/cn/lunadeer/newbtitle/utils/STUI/Button.java b/src/main/java/cn/lunadeer/newbtitle/utils/STUI/Button.java new file mode 100644 index 0000000..d1d0ec7 --- /dev/null +++ b/src/main/java/cn/lunadeer/newbtitle/utils/STUI/Button.java @@ -0,0 +1,11 @@ +package cn.lunadeer.newbtitle.utils.STUI; + +import net.kyori.adventure.text.Component; + +public class Button { + + public static Component create(String text, String command) { + return Component.text("[" + text + "]", View.action_color) + .clickEvent(net.kyori.adventure.text.event.ClickEvent.clickEvent(net.kyori.adventure.text.event.ClickEvent.Action.RUN_COMMAND, command)); + } +} diff --git a/src/main/java/cn/lunadeer/newbtitle/utils/STUI/Line.java b/src/main/java/cn/lunadeer/newbtitle/utils/STUI/Line.java index 9980d12..a0c239c 100644 --- a/src/main/java/cn/lunadeer/newbtitle/utils/STUI/Line.java +++ b/src/main/java/cn/lunadeer/newbtitle/utils/STUI/Line.java @@ -3,64 +3,45 @@ package cn.lunadeer.newbtitle.utils.STUI; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; +import java.util.ArrayList; +import java.util.List; + public class Line { - public enum Slot { - LEFT, - MIDDLE, - RIGHT - } - private TextComponent left_elements; - private TextComponent middle_elements; - private TextComponent right_elements; + private List elements = new ArrayList<>(); + private TextComponent divider = Component.text(" - ", View.sub_color); public Line() { - this.left_elements = Component.text(" "); - this.middle_elements = Component.text(" "); - this.right_elements = Component.text(" "); } public TextComponent build() { - TextComponent gap = Component.text(" "); - return Component.text().append(left_elements) - .append(gap) - .append(middle_elements) - .append(gap) - .append(right_elements).build(); + TextComponent.Builder builder = Component.text(); + for (int i = 0; i < elements.size(); i++) { + builder.append(elements.get(i)); + if (i != elements.size() - 1) { + builder.append(divider); + } + } + return builder.build(); } public static Line create() { return new Line(); } - public Line set(Slot slot, TextComponent component) { - switch (slot) { - case LEFT: - this.left_elements = component; - break; - case MIDDLE: - this.middle_elements = component; - break; - case RIGHT: - this.right_elements = component; - break; - } + public Line append(TextComponent component) { + elements.add(component); return this; } - public Line set(Slot slot, String component) { - switch (slot) { - case LEFT: - this.left_elements = Component.text(component); - break; - case MIDDLE: - this.middle_elements = Component.text(component); - break; - case RIGHT: - this.right_elements = Component.text(component); - break; - } + public Line append(Component component) { + elements.add(component); + return this; + } + + public Line append(String component) { + elements.add(Component.text(component)); return this; } diff --git a/src/main/java/cn/lunadeer/newbtitle/utils/STUI/View.java b/src/main/java/cn/lunadeer/newbtitle/utils/STUI/View.java index bcb8499..da095f6 100644 --- a/src/main/java/cn/lunadeer/newbtitle/utils/STUI/View.java +++ b/src/main/java/cn/lunadeer/newbtitle/utils/STUI/View.java @@ -2,8 +2,13 @@ package cn.lunadeer.newbtitle.utils.STUI; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.format.TextColor; import org.bukkit.entity.Player; +import java.util.ArrayList; +import java.util.List; + public class View { public enum Slot { SUBTITLE, @@ -14,6 +19,14 @@ public class View { ACTIONBAR } + public static TextColor main_color = TextColor.color(0, 179, 255); + public static TextColor sub_color = TextColor.color(143, 143, 143); + public static TextColor action_color = TextColor.color(251, 255, 139); + + protected TextComponent title_decorate = Component.text("===========", main_color); + protected TextComponent sub_title_decorate = Component.text("=====", main_color); + protected TextComponent line_decorate = Component.text("- ", main_color); + protected TextComponent action_decorate = Component.text("> ", main_color); protected TextComponent title = Component.text(" "); protected TextComponent subtitle = Component.text(" "); protected TextComponent content_line1 = Component.text(" "); @@ -21,15 +34,43 @@ public class View { protected TextComponent content_line3 = Component.text(" "); protected TextComponent content_line4 = Component.text(" "); protected TextComponent actionbar = Component.text(" "); + protected TextComponent bottom_decorate = Component.text("=================================", main_color); + + public static TextComponent pagination(int page, int item_size, String command) { + // 第 x/y 页 [上一页] [下一页] + int page_size = 4; + int page_count = (int) Math.ceil((double) item_size / page_size); + if (page_count == 0) { + page_count = 1; + } + List componentList = new ArrayList<>(); + componentList.add(Component.text("第 ", main_color)); + componentList.add(Component.text(page, sub_color)); + componentList.add(Component.text("/", main_color)); + componentList.add(Component.text(page_count, sub_color)); + componentList.add(Component.text(" 页 ", main_color)); + if (page > 1) { + componentList.add(Button.create("[上一页]", command + " " + (page - 1))); + } + if (page < page_count) { + componentList.add(Button.create("[下一页]", command + " " + (page + 1))); + } + TextComponent.Builder builder = Component.text(); + for (Component component : componentList) { + builder.append(component); + } + return builder.build(); + } public void showOn(Player player) { - player.sendMessage(title); - player.sendMessage(subtitle); - player.sendMessage(content_line1); - player.sendMessage(content_line2); - player.sendMessage(content_line3); - player.sendMessage(content_line4); - player.sendMessage(actionbar); + player.sendMessage(Component.text().append(title_decorate).append(title).append(title_decorate).build()); + player.sendMessage(Component.text().append(sub_title_decorate).append(subtitle).build()); + player.sendMessage(Component.text().append(line_decorate).append(content_line1).build()); + player.sendMessage(Component.text().append(line_decorate).append(content_line2).build()); + player.sendMessage(Component.text().append(line_decorate).append(content_line3).build()); + player.sendMessage(Component.text().append(line_decorate).append(content_line4).build()); + player.sendMessage(Component.text().append(action_decorate).append(actionbar).build()); + player.sendMessage(bottom_decorate); } public static View create() {