finish user operate

/nt <use|list|shop|buy>
This commit is contained in:
zhangyuheng 2024-01-06 00:25:52 +08:00
parent 52d1e19501
commit ecb3757c98
6 changed files with 184 additions and 13 deletions

View File

@ -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 <use|list|shop|buy>");
} else {
XLogger.info("用法: /nt <use|list|shop|buy>");
}
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 <use|list|shop|buy>");
} else {
XLogger.info("用法: /nt <use|list|shop|buy>");
}
return true;
}
default:
return false;
}
}
/**
@ -41,6 +75,101 @@ public class Commands implements TabExecutor {
*/
@Override
public @Nullable List<String> 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;
}
}

View File

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

View File

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

View File

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

View File

@ -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) {

View File

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