diff --git a/pom.xml b/pom.xml
index a2800f8..ad52f3e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -64,7 +64,7 @@
lunadeer-repo
- https://ssl.lunadeer.cn:14454/repository/maven-public/
+ https://ssl.lunadeer.cn:14454/repository/maven-snapshots/
@@ -78,7 +78,7 @@
cn.lunadeer
MinecraftPluginUtils
- 1.1.8
+ 1.2.0-SNAPSHOT
diff --git a/src/main/java/cn/lunadeer/miniplayertitle/commands/Apis.java b/src/main/java/cn/lunadeer/miniplayertitle/commands/Apis.java
index bcccb29..5d6f728 100644
--- a/src/main/java/cn/lunadeer/miniplayertitle/commands/Apis.java
+++ b/src/main/java/cn/lunadeer/miniplayertitle/commands/Apis.java
@@ -21,7 +21,7 @@ public class Apis {
}
public static void updateName(Player player, @Nullable TitleDTO title) {
- if (title == null) {
+ if (title == null || title.getId() == -1) {
Component newDisplayName = Component.text()
.append(Component.text("<"))
.append(player.name())
diff --git a/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleManage.java b/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleManage.java
index dab76a9..04fd479 100644
--- a/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleManage.java
+++ b/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleManage.java
@@ -3,6 +3,7 @@ package cn.lunadeer.miniplayertitle.commands;
import cn.lunadeer.miniplayertitle.MiniPlayerTitle;
import cn.lunadeer.miniplayertitle.dtos.PlayerInfoDTO;
import cn.lunadeer.miniplayertitle.dtos.TitleDTO;
+import cn.lunadeer.miniplayertitle.tuis.AllTitles;
import cn.lunadeer.miniplayertitle.tuis.MyTitles;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
@@ -43,12 +44,16 @@ public class TitleManage {
public static void deleteTitle(CommandSender sender, String[] args) {
try {
if (notOpOrConsole(sender)) return;
- if (args.length != 2) {
+ if (args.length < 2) {
MiniPlayerTitle.notification.warn(sender, "用法: /mplt delete_title <称号ID>");
return;
}
TitleDTO.delete(Integer.parseInt(args[1]));
MiniPlayerTitle.notification.info(sender, "已删除称号");
+ if (args.length == 3) {
+ int page = Integer.parseInt(args[2]);
+ AllTitles.show(sender, new String[]{"all_titles", String.valueOf(page)});
+ }
} catch (Exception e) {
MiniPlayerTitle.notification.error(sender, e.getMessage());
}
diff --git a/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleShopSale.java b/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleShopSale.java
index 6f5dc16..a6d822c 100644
--- a/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleShopSale.java
+++ b/src/main/java/cn/lunadeer/miniplayertitle/commands/TitleShopSale.java
@@ -7,6 +7,8 @@ import cn.lunadeer.miniplayertitle.dtos.TitleDTO;
import cn.lunadeer.miniplayertitle.dtos.TitleShopDTO;
import cn.lunadeer.miniplayertitle.tuis.MyTitles;
import cn.lunadeer.miniplayertitle.tuis.SaleInfo;
+import cn.lunadeer.miniplayertitle.tuis.Shop;
+import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -15,6 +17,7 @@ import java.util.List;
import java.util.Objects;
import static cn.lunadeer.miniplayertitle.commands.Apis.notOpOrConsole;
+import static cn.lunadeer.miniplayertitle.tuis.Apis.getArgPage;
import static cn.lunadeer.miniplayertitle.tuis.Apis.getLastArgsPage;
public class TitleShopSale {
@@ -119,8 +122,7 @@ public class TitleShopSale {
}
if (args.length == 3) {
- int page = getLastArgsPage(args);
- SaleInfo.show(sender, new String[]{"sale_info", args[1], String.valueOf(page)});
+ Shop.show(sender, new String[]{"shop"});
}
}
@@ -128,8 +130,8 @@ public class TitleShopSale {
* 购买商品
* mplt buy_sale <商品ID>
*
- * @param sender
- * @param args
+ * @param sender CommandSender
+ * @param args String[]
*/
public static void buySale(CommandSender sender, String[] args) {
if (!(sender instanceof Player)) {
@@ -171,23 +173,25 @@ public class TitleShopSale {
}
if (had == null) {
- had = PlayerTitleDTO.create(player.getUniqueId(), titleShop.getTitle(), LocalDateTime.now().plusDays(titleShop.getDays()));
+ had = PlayerTitleDTO.create(player.getUniqueId(), titleShop.getTitle(), titleShop.getDays() == -1 ? null : LocalDateTime.now().plusDays(titleShop.getDays()));
if (had == null) {
MiniPlayerTitle.notification.error(player, "购买称号时出现错误,详情请查看控制台日志");
return;
}
- MiniPlayerTitle.notification.info(player, "成功购买称号: " + had.getTitle().getTitleColored());
+ titleShop.setAmount(titleShop.getAmount() - 1);
+ playerInfo.setCoin(playerInfo.getCoin() - titleShop.getPrice());
+ MiniPlayerTitle.notification.info(player, Component.text("成功购买称号: ").append(had.getTitle().getTitleColored()));
} else if (!had.isExpired()) {
MiniPlayerTitle.notification.warn(player, "你已拥有此称号,在过期前无法再次购买");
} else {
- had.setExpireAt(LocalDateTime.now().plusDays(titleShop.getDays()));
- MiniPlayerTitle.notification.info(player, "成功续续期称号: " + had.getTitle().getTitleColored());
+ had.setExpireAt(titleShop.getDays() == -1 ? null : LocalDateTime.now().plusDays(titleShop.getDays()));
+ titleShop.setAmount(titleShop.getAmount() - 1);
+ playerInfo.setCoin(playerInfo.getCoin() - titleShop.getPrice());
+ MiniPlayerTitle.notification.info(player, Component.text("成功续续期称号: ").append(had.getTitle().getTitleColored()));
}
- if (args.length == 2) {
- int page = getLastArgsPage(args);
- MyTitles.show(sender, new String[]{"my_titles", String.valueOf(page)});
- }
+ int page = getArgPage(args, 3);
+ MyTitles.show(sender, new String[]{"my_titles", String.valueOf(page)});
}
}
diff --git a/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerInfoDTO.java b/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerInfoDTO.java
index 5445029..9eaaf8d 100644
--- a/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerInfoDTO.java
+++ b/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerInfoDTO.java
@@ -27,11 +27,9 @@ public class PlayerInfoDTO {
String sql = "";
sql = "INSERT INTO mplt_player_info (uuid, coin) " +
"VALUES ('" + uuid.toString() + "', " + MiniPlayerTitle.config.getDefaultCoin() + ") " +
- "RETURNING " +
- "uuid, coin, using_title_id " +
- "ON CONFLICT (uuid) DO NOTHING;";
+ "ON CONFLICT DO NOTHING;";
try (ResultSet rs = MiniPlayerTitle.database.query(sql)) {
- if (rs.next()) return getPlayerInfoDTO(rs);
+ return get(uuid);
} catch (Exception e) {
MiniPlayerTitle.database.handleDatabaseError("创建玩家信息失败", e, sql);
}
@@ -58,10 +56,7 @@ public class PlayerInfoDTO {
String sql = "";
sql = "UPDATE mplt_player_info SET using_title_id = " + title.getId() + " WHERE uuid = '" + uuid.toString() + "';";
try (ResultSet rs = MiniPlayerTitle.database.query(sql)) {
- if (rs != null && rs.next()) {
- using_title = title;
- return true;
- }
+ return true;
} catch (Exception e) {
MiniPlayerTitle.database.handleDatabaseError("设置玩家使用称号失败", e, sql);
}
@@ -76,10 +71,8 @@ public class PlayerInfoDTO {
String sql = "";
sql = "UPDATE mplt_player_info SET coin = " + coin + " WHERE uuid = '" + uuid.toString() + "';";
try (ResultSet rs = MiniPlayerTitle.database.query(sql)) {
- if (rs != null && rs.next()) {
- this.coin = coin;
- return true;
- }
+ this.coin = coin;
+ return true;
} catch (Exception e) {
MiniPlayerTitle.database.handleDatabaseError("设置玩家金币失败", e, sql);
}
diff --git a/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerTitleDTO.java b/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerTitleDTO.java
index e4f115e..d8fb9ca 100644
--- a/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerTitleDTO.java
+++ b/src/main/java/cn/lunadeer/miniplayertitle/dtos/PlayerTitleDTO.java
@@ -2,6 +2,7 @@ package cn.lunadeer.miniplayertitle.dtos;
import cn.lunadeer.miniplayertitle.MiniPlayerTitle;
+import javax.annotation.Nullable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDateTime;
@@ -33,8 +34,11 @@ public class PlayerTitleDTO {
public boolean setExpireAt(LocalDateTime dateTime) {
String sql = "";
- sql += "UPDATE mplt_player_title SET expire_at_y = " + dateTime.getYear() + ", expire_at_m = " + dateTime.getMonthValue() + ", expire_at_d = " + dateTime.getDayOfMonth() + " " +
- "WHERE id = " + id + ";";
+ if (dateTime == null) {
+ sql += "UPDATE mplt_player_title SET expire_at_y = -1, expire_at_m = -1, expire_at_d = -1 WHERE id = " + id + ";";
+ } else {
+ sql += "UPDATE mplt_player_title SET expire_at_y = " + dateTime.getYear() + ", expire_at_m = " + dateTime.getMonthValue() + ", expire_at_d = " + dateTime.getDayOfMonth() + " WHERE id = " + id + ";";
+ }
try (ResultSet rs = MiniPlayerTitle.database.query(sql)) {
return true;
} catch (Exception e) {
@@ -43,11 +47,16 @@ public class PlayerTitleDTO {
return false;
}
- public static PlayerTitleDTO create(UUID player_uuid, TitleDTO title, LocalDateTime expire_at) {
+ public static PlayerTitleDTO create(UUID player_uuid, TitleDTO title, @Nullable LocalDateTime expire_at) {
String sql = "";
- sql += "INSERT INTO mplt_player_title (player_uuid, title_id, expire_at_y, expire_at_m, expire_at_d) " +
- "VALUES ('" + player_uuid.toString() + "', " + title.getId() + ", " + expire_at.getYear() + ", " + expire_at.getMonthValue() + ", " + expire_at.getDayOfMonth() + ") " +
- "RETURNING " +
+ sql += "INSERT INTO mplt_player_title (player_uuid, title_id, expire_at_y, expire_at_m, expire_at_d) ";
+
+ if (expire_at == null) {
+ sql += "VALUES ('" + player_uuid.toString() + "', " + title.getId() + ", -1, -1, -1) ";
+ } else {
+ sql += "VALUES ('" + player_uuid.toString() + "', " + title.getId() + ", " + expire_at.getYear() + ", " + expire_at.getMonthValue() + ", " + expire_at.getDayOfMonth() + ") ";
+ }
+ sql += "RETURNING " +
"id, player_uuid, title_id, expire_at_y, expire_at_m, expire_at_d;";
try (ResultSet rs = MiniPlayerTitle.database.query(sql)) {
if (rs.next()) {
diff --git a/src/main/java/cn/lunadeer/miniplayertitle/dtos/TitleShopDTO.java b/src/main/java/cn/lunadeer/miniplayertitle/dtos/TitleShopDTO.java
index bdfb6bb..eefe554 100644
--- a/src/main/java/cn/lunadeer/miniplayertitle/dtos/TitleShopDTO.java
+++ b/src/main/java/cn/lunadeer/miniplayertitle/dtos/TitleShopDTO.java
@@ -96,7 +96,8 @@ public class TitleShopDTO {
public static TitleShopDTO get(Integer id) {
String sql = "";
- sql += "SELECT id, title_id, price, days, amount, sale_end_at FROM mplt_title_shop WHERE id = " + id + ";";
+ sql += "SELECT id, title_id, price, days, amount, sale_end_at_y, sale_end_at_m, sale_end_at_d " +
+ "FROM mplt_title_shop WHERE id = " + id + ";";
try (ResultSet rs = MiniPlayerTitle.database.query(sql)) {
if (rs.next()) {
return getTitleShop(rs);
@@ -109,7 +110,8 @@ public class TitleShopDTO {
public static List getAll() {
String sql = "";
- sql += "SELECT id, title_id, price, days, amount, sale_end_at FROM mplt_title_shop;";
+ sql += "SELECT id, title_id, price, days, amount, sale_end_at_y, sale_end_at_m, sale_end_at_d " +
+ "FROM mplt_title_shop;";
List titleShops = new ArrayList<>();
try (ResultSet rs = MiniPlayerTitle.database.query(sql)) {
while (rs != null && rs.next()) {
diff --git a/src/main/java/cn/lunadeer/miniplayertitle/tuis/AllTitles.java b/src/main/java/cn/lunadeer/miniplayertitle/tuis/AllTitles.java
index 5be372a..35e8796 100644
--- a/src/main/java/cn/lunadeer/miniplayertitle/tuis/AllTitles.java
+++ b/src/main/java/cn/lunadeer/miniplayertitle/tuis/AllTitles.java
@@ -26,6 +26,9 @@ public class AllTitles {
.append("所有称号"));
for (TitleDTO title : titles) {
+ if (title.getId() == -1){
+ continue;
+ }
Line line = Line.create()
.append(title.getId().toString())
.append(title.getTitleColored());
diff --git a/src/main/java/cn/lunadeer/miniplayertitle/tuis/MyTitles.java b/src/main/java/cn/lunadeer/miniplayertitle/tuis/MyTitles.java
index ccf676d..11cc344 100644
--- a/src/main/java/cn/lunadeer/miniplayertitle/tuis/MyTitles.java
+++ b/src/main/java/cn/lunadeer/miniplayertitle/tuis/MyTitles.java
@@ -38,8 +38,12 @@ public class MyTitles {
continue;
}
Line line = Line.create()
- .append(title.getTitle().getTitleColored())
- .append("有效期至: " + title.getExpireAt().getYear() + "年" + title.getExpireAt().getMonthValue() + "月" + title.getExpireAt().getDayOfMonth() + "日");
+ .append(title.getTitle().getTitleColored());
+ if (title.getExpireAt() == null) {
+ line.append("永久");
+ } else {
+ line.append("有效期至: " + title.getExpireAt().getYear() + "年" + title.getExpireAt().getMonthValue() + "月" + title.getExpireAt().getDayOfMonth() + "日");
+ }
if (Objects.equals(playerInfo.getUsingTitle().getId(), title.getId())) {
line.append(Button.createRed("卸下").setExecuteCommand("/mplt use_title -1 " + page).build());
} else {
diff --git a/src/main/java/cn/lunadeer/miniplayertitle/tuis/SaleInfo.java b/src/main/java/cn/lunadeer/miniplayertitle/tuis/SaleInfo.java
index 9300577..40b9296 100644
--- a/src/main/java/cn/lunadeer/miniplayertitle/tuis/SaleInfo.java
+++ b/src/main/java/cn/lunadeer/miniplayertitle/tuis/SaleInfo.java
@@ -99,11 +99,11 @@ public class SaleInfo {
}
} else {
if (player.isOp()) {
- end_at.append(Button.create("<<").setHoverText("提前10天").setExecuteCommand("/mplt set_sale less_end_at " + titleShop.getId() + " 10 " + page).build());
- end_at.append(Button.create("-").setHoverText("提前1天").setExecuteCommand("/mplt set_sale less_end_at " + titleShop.getId() + " 1 " + page).build());
+ end_at.append(Button.create("<<").setPreSufIx("", "").setHoverText("提前10天").setExecuteCommand("/mplt set_sale less_end_at " + titleShop.getId() + " 10 " + page).build());
+ end_at.append(Button.create("-").setPreSufIx("", "").setHoverText("提前1天").setExecuteCommand("/mplt set_sale less_end_at " + titleShop.getId() + " 1 " + page).build());
end_at.append(titleShop.getSaleEndAt().getYear() + "年" + titleShop.getSaleEndAt().getMonthValue() + "月" + titleShop.getSaleEndAt().getDayOfMonth() + "日");
- end_at.append(Button.create("+").setHoverText("延后1天").setExecuteCommand("/mplt set_sale more_end_at " + titleShop.getId() + " 1 " + page).build());
- end_at.append(Button.create(">>").setHoverText("延后10天").setExecuteCommand("/mplt set_sale more_end_at " + titleShop.getId() + " 10 " + page).build());
+ end_at.append(Button.create("+").setPreSufIx("", "").setHoverText("延后1天").setExecuteCommand("/mplt set_sale more_end_at " + titleShop.getId() + " 1 " + page).build());
+ end_at.append(Button.create(">>").setPreSufIx("", "").setHoverText("延后10天").setExecuteCommand("/mplt set_sale more_end_at " + titleShop.getId() + " 10 " + page).build());
end_at.append(Button.create("转为常驻").setExecuteCommand("/mplt set_sale end_at " + titleShop.getId() + " -1:-1:-1 " + page).build());
} else {
end_at.append(titleShop.getSaleEndAt().getYear() + "年" + titleShop.getSaleEndAt().getMonthValue() + "月" + titleShop.getSaleEndAt().getDayOfMonth() + "日");
@@ -120,8 +120,10 @@ public class SaleInfo {
operate.append(Button.createGreen("购买").setExecuteCommand("/mplt buy_sale " + titleShop.getId()).build());
}
if (player.isOp()) {
- operate.append(Button.create("删除").setExecuteCommand("/mplt delete_sale " + args[1] + " " + page).build());
+ operate.append(Button.create("删除").setExecuteCommand("/mplt delete_sale " + args[1] + " b").build());
}
+ view.add(Line.create().append("---------------------"));
+ view.add(operate);
view.showOn(player, page);
}
}
diff --git a/src/main/java/cn/lunadeer/miniplayertitle/utils/DatabaseTables.java b/src/main/java/cn/lunadeer/miniplayertitle/utils/DatabaseTables.java
index 4240c62..4a60ba6 100644
--- a/src/main/java/cn/lunadeer/miniplayertitle/utils/DatabaseTables.java
+++ b/src/main/java/cn/lunadeer/miniplayertitle/utils/DatabaseTables.java
@@ -56,23 +56,6 @@ public class DatabaseTables {
");";
MiniPlayerTitle.database.query(sql);
- sql = "INSERT INTO mplt_title (" +
- "id, " +
- "title, " +
- "description," +
- "enabled, " +
- "created_at, " +
- "updated_at " +
- ") VALUES (" +
- "-1, " +
- "'default', " +
- "'default', " +
- "TRUE, " +
- "CURRENT_TIMESTAMP, " +
- "CURRENT_TIMESTAMP " +
- ") ON CONFLICT (id) DO NOTHING;";
- MiniPlayerTitle.database.query(sql);
-
MiniPlayerTitle.database.deleteColumnIfExists("mplt_title", "created_at");
MiniPlayerTitle.database.deleteColumnIfExists("mplt_title", "updated_at");
MiniPlayerTitle.database.deleteColumnIfExists("mplt_title", "enabled");
@@ -89,24 +72,39 @@ public class DatabaseTables {
MiniPlayerTitle.database.addColumnIfNotExists("mplt_title_shop", "sale_end_at_y", "INTEGER NOT NULL DEFAULT -1");
MiniPlayerTitle.database.addColumnIfNotExists("mplt_title_shop", "sale_end_at_m", "INTEGER NOT NULL DEFAULT -1");
MiniPlayerTitle.database.addColumnIfNotExists("mplt_title_shop", "sale_end_at_d", "INTEGER NOT NULL DEFAULT -1");
- // convert sale_end_at(YYYYMMDD) to sale_end_at_y, sale_end_at_m, sale_end_at_d
- sql = "UPDATE mplt_title_shop SET " +
- "sale_end_at_y = (sale_end_at / 10000), " +
- "sale_end_at_m = (sale_end_at % 10000 / 100), " +
- "sale_end_at_d = (sale_end_at % 100) " +
- "WHERE sale_end_at != -1;";
- MiniPlayerTitle.database.query(sql);
+ // convert sale_end_at(YYYYMMDD) to sale_end_at_y, sale_end_at_m, sale_end_at_d if sale_end_at column exists
+ if (MiniPlayerTitle.database.isColumnExist("mplt_title_shop", "sale_end_at")) {
+ sql = "UPDATE mplt_title_shop SET " +
+ "sale_end_at_y = (sale_end_at / 10000), " +
+ "sale_end_at_m = (sale_end_at % 10000 / 100), " +
+ "sale_end_at_d = (sale_end_at % 100) " +
+ "WHERE sale_end_at != -1;";
+ MiniPlayerTitle.database.query(sql);
+ }
MiniPlayerTitle.database.deleteColumnIfExists("mplt_title_shop", "sale_end_at");
MiniPlayerTitle.database.addColumnIfNotExists("mplt_player_title", "expire_at_y", "INTEGER NOT NULL DEFAULT -1");
MiniPlayerTitle.database.addColumnIfNotExists("mplt_player_title", "expire_at_m", "INTEGER NOT NULL DEFAULT -1");
MiniPlayerTitle.database.addColumnIfNotExists("mplt_player_title", "expire_at_d", "INTEGER NOT NULL DEFAULT -1");
- sql = "UPDATE mplt_player_title SET " +
- "expire_at_y = (expire_at / 10000), " +
- "expire_at_m = (expire_at % 10000 / 100), " +
- "expire_at_d = (expire_at % 100) " +
- "WHERE expire_at != -1;";
- MiniPlayerTitle.database.query(sql);
+ if (MiniPlayerTitle.database.isColumnExist("mplt_player_title", "expire_at")) {
+ sql = "UPDATE mplt_player_title SET " +
+ "expire_at_y = (expire_at / 10000), " +
+ "expire_at_m = (expire_at % 10000 / 100), " +
+ "expire_at_d = (expire_at % 100) " +
+ "WHERE expire_at != -1;";
+ MiniPlayerTitle.database.query(sql);
+ }
MiniPlayerTitle.database.deleteColumnIfExists("mplt_player_title", "expire_at");
+
+ sql = "INSERT INTO mplt_title (" +
+ "id, " +
+ "title, " +
+ "description " +
+ ") VALUES (" +
+ "-1, " +
+ "'default', " +
+ "'default' " +
+ ") ON CONFLICT (id) DO NOTHING;";
+ MiniPlayerTitle.database.query(sql);
}
}