make command tab more beautiful

This commit is contained in:
zhangyuheng 2024-01-10 11:36:44 +08:00
parent 2e293d89ad
commit ae252cb6ab
4 changed files with 221 additions and 107 deletions

View File

@ -6,7 +6,7 @@
<groupId>cn.lunadeer</groupId> <groupId>cn.lunadeer</groupId>
<artifactId>MiniPlayerTitle</artifactId> <artifactId>MiniPlayerTitle</artifactId>
<version>1.13-beta</version> <version>1.14-beta</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>MiniPlayerTitle</name> <name>MiniPlayerTitle</name>

View File

@ -44,33 +44,53 @@ public class Commands implements TabExecutor {
} }
switch (args[0]) { switch (args[0]) {
case "use": case "use":
return use(sender, args); use(sender, args);
return true;
case "list": case "list":
return list(sender, args); list(sender, args);
return true;
case "shop": case "shop":
return shop(sender, args); shop(sender, args);
return true;
case "buy": case "buy":
return buy(sender, args); buy(sender, args);
return true;
case "create": case "create":
return AdminCommands.createTitle(sender, args); AdminCommands.createTitle(sender, args);
return true;
case "delete": case "delete":
return AdminCommands.deleteTitle(sender, args); AdminCommands.deleteTitle(sender, args);
return true;
case "setdesc": case "setdesc":
return AdminCommands.setTitleDescription(sender, args); AdminCommands.setTitleDescription(sender, args);
return true;
case "setname": case "setname":
return AdminCommands.setTitleName(sender, args); AdminCommands.setTitleName(sender, args);
return true;
case "addshop": case "addshop":
return AdminCommands.addShop(sender, args); AdminCommands.addShop(sender, args);
return true;
case "removeshop": case "removeshop":
return AdminCommands.removeShop(sender, args); AdminCommands.removeShop(sender, args);
return true;
case "setprice": case "setprice":
return AdminCommands.setPrice(sender, args); AdminCommands.setPrice(sender, args);
return true;
case "setamount": case "setamount":
return AdminCommands.setAmount(sender, args); AdminCommands.setAmount(sender, args);
return true;
case "setendat": case "setendat":
return AdminCommands.setSaleEndAt(sender, args); AdminCommands.setSaleEndAt(sender, args);
return true;
case "listall": case "listall":
return AdminCommands.listAllTitle(sender, args); AdminCommands.listAllTitle(sender, args);
return true;
case "addcoin":
AdminCommands.addCoin(sender, args);
return true;
case "setcoin":
AdminCommands.setCoin(sender, args);
return true;
default: default:
printHelp(sender); printHelp(sender);
return true; return true;
@ -93,8 +113,8 @@ public class Commands implements TabExecutor {
} }
} }
private void home_view(CommandSender sender){ private void home_view(CommandSender sender) {
if (!(sender instanceof Player)){ if (!(sender instanceof Player)) {
printHelp(sender); printHelp(sender);
return; return;
} }
@ -125,7 +145,7 @@ public class Commands implements TabExecutor {
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (args.length == 1) { if (args.length == 1) {
String[] player_cmd = {"use", "list", "shop", "buy"}; String[] player_cmd = {"use", "list", "shop", "buy"};
String[] admin_cmd = {"create", "delete", "setdesc", "setname", "addshop", "removeshop", "setprice", "setamount", "setendat", "listall"}; String[] admin_cmd = {"create", "delete", "setdesc", "setname", "addshop", "removeshop", "setprice", "setamount", "setendat", "listall", "addcoin", "setcoin"};
List<String> res = new ArrayList<>(); List<String> res = new ArrayList<>();
if (sender instanceof Player) { if (sender instanceof Player) {
Player player = (Player) sender; Player player = (Player) sender;
@ -141,35 +161,69 @@ public class Commands implements TabExecutor {
} }
return res; return res;
} }
switch (args[0]) { if (args.length == 2) {
case "use": switch (args[0]) {
return Collections.singletonList("要使用的称号ID"); case "use":
case "list": return Collections.singletonList("要使用的称号ID");
case "shop": case "list":
return Collections.singletonList("页数(可选)"); case "shop":
case "buy": case "listall":
return Collections.singletonList("要购买的条目ID"); return Collections.singletonList("页数(可选)");
case "create": case "buy":
return Collections.singletonList("<称号名称> <称号描述>"); return Collections.singletonList("要购买的条目ID");
case "delete": case "create":
case "addshop": return Collections.singletonList("<称号名称> <称号描述>");
return Collections.singletonList("<称号ID>"); case "delete":
case "setdesc": case "addshop":
return Collections.singletonList("<称号ID> <称号描述>"); return Collections.singletonList("<称号ID>");
case "setname": case "setdesc":
return Collections.singletonList("<称号ID> <称号名称>"); return Collections.singletonList("<称号ID> <称号描述>");
case "removeshop": case "setname":
return Collections.singletonList("<商品ID>"); return Collections.singletonList("<称号ID> <称号名称>");
case "setprice": case "removeshop":
return Collections.singletonList("<商品ID> <价格> <天数>(-1为永久)"); return Collections.singletonList("<商品ID>");
case "setamount": case "setprice":
return Collections.singletonList("<商品ID> <数量> (-1为无限)"); return Collections.singletonList("<商品ID> <价格> <天数>(-1为永久)");
case "setendat": case "setamount":
return Collections.singletonList("<商品ID> <结束时间YYYYMMDD>(-1为永久)"); return Collections.singletonList("<商品ID> <数量>(-1为无限)");
default: case "setendat":
return Arrays.asList("use", "list", "shop", "buy"); return Collections.singletonList("<商品ID> <结束时间YYYYMMDD>(-1为永久)");
case "addcoin":
case "setcoin":
// return player list
List<String> res = new ArrayList<>();
for (Player player : MiniPlayerTitle.instance.getServer().getOnlinePlayers()) {
res.add(player.getName());
}
return res;
default:
return Arrays.asList("use", "list", "shop", "buy");
}
} }
if (args.length == 3) {
switch (args[0]) {
case "addcoin":
case "setcoin":
return Collections.singletonList("<金币数量>");
case "create":
case "setdesc":
return Collections.singletonList("<称号描述>");
case "setname":
return Collections.singletonList("<称号名称>");
case "setprice":
return Collections.singletonList("<价格> <天数>(-1为永久)");
case "setamount":
return Collections.singletonList("<数量>(-1为无限)");
case "setendat":
return Collections.singletonList("<结束时间YYYYMMDD>(-1为永久)");
}
}
if (args.length == 4) {
if (args[0].equals("setprice")) {
return Collections.singletonList("<天数>(-1为永久)");
}
}
return Arrays.asList("use", "list", "shop", "buy");
} }

View File

@ -2,50 +2,56 @@ package cn.lunadeer.miniplayertitle.commands;
import cn.lunadeer.miniplayertitle.SaleTitle; import cn.lunadeer.miniplayertitle.SaleTitle;
import cn.lunadeer.miniplayertitle.Title; import cn.lunadeer.miniplayertitle.Title;
import cn.lunadeer.miniplayertitle.XPlayer;
import cn.lunadeer.miniplayertitle.utils.Notification; import cn.lunadeer.miniplayertitle.utils.Notification;
import cn.lunadeer.miniplayertitle.utils.XLogger; import cn.lunadeer.miniplayertitle.utils.XLogger;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
public class AdminCommands { public class AdminCommands {
public static boolean createTitle(CommandSender sender, String[] args) { public static void createTitle(CommandSender sender, String[] args) {
if (sender instanceof org.bukkit.entity.Player) { if (sender instanceof org.bukkit.entity.Player) {
Player player = (org.bukkit.entity.Player) sender; Player player = (org.bukkit.entity.Player) sender;
if (!player.isOp()) { if (!player.isOp()) {
XLogger.warn(player, "你没有权限执行该命令"); XLogger.warn(player, "你没有权限执行该命令");
return true; return;
} }
} }
if (args.length != 3) { if (args.length != 3) {
Notification.warn(sender, "用法: /mplt create <称号名称> <称号描述>"); Notification.warn(sender, "用法: /mplt create <称号名称> <称号描述>");
return true; return;
}
Title title = Title.create(args[1], args[2]);
if (title != null) {
Notification.info(sender, Component.text("成功创建称号: [" + title.getId() + "]").append(title.getTitle()));
} else {
Notification.error(sender, "创建称号失败");
} }
Title.create(args[1], args[2]);
return true;
} }
public static boolean deleteTitle(CommandSender sender, String[] args) { public static void deleteTitle(CommandSender sender, String[] args) {
if (sender instanceof org.bukkit.entity.Player) { if (sender instanceof org.bukkit.entity.Player) {
Player player = (org.bukkit.entity.Player) sender; Player player = (org.bukkit.entity.Player) sender;
if (!player.isOp()) { if (!player.isOp()) {
XLogger.warn(player, "你没有权限执行该命令"); XLogger.warn(player, "你没有权限执行该命令");
return true; return;
} }
} }
if (args.length != 2) { if (args.length != 2) {
Notification.warn(sender, "用法: /mplt delete <称号ID>"); Notification.warn(sender, "用法: /mplt delete <称号ID>");
return true; return;
} }
Title.delete(Integer.parseInt(args[1])); Title.delete(Integer.parseInt(args[1]));
return true; Notification.info(sender, "已删除称号");
} }
public static boolean listAllTitle(CommandSender sender, String[] args) { public static void listAllTitle(CommandSender sender, String[] args) {
if (sender instanceof Player) { if (sender instanceof Player) {
Player player = (Player) sender; Player player = (Player) sender;
if (!player.isOp()) { if (!player.isOp()) {
XLogger.warn(player, "你没有权限执行该命令"); XLogger.warn(player, "你没有权限执行该命令");
return true; return;
} }
} }
int page = 1; int page = 1;
@ -54,58 +60,57 @@ public class AdminCommands {
page = Integer.parseInt(args[1]); page = Integer.parseInt(args[1]);
} catch (Exception e) { } catch (Exception e) {
Notification.error(sender, "页数格式错误"); Notification.error(sender, "页数格式错误");
return true; return;
} }
} }
Title.listAllTitle(sender, page); Title.listAllTitle(sender, page);
return true;
} }
public static boolean setTitleDescription(CommandSender sender, String[] args) { public static void setTitleDescription(CommandSender sender, String[] args) {
if (sender instanceof org.bukkit.entity.Player) { if (sender instanceof org.bukkit.entity.Player) {
Player player = (org.bukkit.entity.Player) sender; Player player = (org.bukkit.entity.Player) sender;
if (!player.isOp()) { if (!player.isOp()) {
XLogger.warn(player, "你没有权限执行该命令"); XLogger.warn(player, "你没有权限执行该命令");
return true; return;
} }
} }
if (args.length != 3) { if (args.length != 3) {
Notification.warn(sender, "用法: /mplt setdesc <称号ID> <称号描述>"); Notification.warn(sender, "用法: /mplt setdesc <称号ID> <称号描述>");
return true; return;
} }
Title title = new Title(Integer.parseInt(args[1])); Title title = new Title(Integer.parseInt(args[1]));
title.setDescription(args[2]); title.setDescription(args[2]);
return true; Notification.info(sender, "已设置称号描述");
} }
public static boolean setTitleName(CommandSender sender, String[] args) { public static void setTitleName(CommandSender sender, String[] args) {
if (sender instanceof org.bukkit.entity.Player) { if (sender instanceof org.bukkit.entity.Player) {
Player player = (org.bukkit.entity.Player) sender; Player player = (org.bukkit.entity.Player) sender;
if (!player.isOp()) { if (!player.isOp()) {
XLogger.warn(player, "你没有权限执行该命令"); XLogger.warn(player, "你没有权限执行该命令");
return true; return;
} }
} }
if (args.length != 3) { if (args.length != 3) {
Notification.warn(sender, "用法: /mplt setname <称号ID> <称号名称>"); Notification.warn(sender, "用法: /mplt setname <称号ID> <称号名称>");
return true; return;
} }
Title title = new Title(Integer.parseInt(args[1])); Title title = new Title(Integer.parseInt(args[1]));
title.setTitle(args[2]); title.setTitle(args[2]);
return true; Notification.info(sender, "已设置称号名称");
} }
public static boolean addShop(CommandSender sender, String[] args) { public static void addShop(CommandSender sender, String[] args) {
if (sender instanceof org.bukkit.entity.Player) { if (sender instanceof org.bukkit.entity.Player) {
Player player = (org.bukkit.entity.Player) sender; Player player = (org.bukkit.entity.Player) sender;
if (!player.isOp()) { if (!player.isOp()) {
XLogger.warn(player, "你没有权限执行该命令"); XLogger.warn(player, "你没有权限执行该命令");
return true; return;
} }
} }
if (args.length != 2) { if (args.length != 2) {
Notification.warn(sender, "用法: /mplt addshop <称号ID>"); Notification.warn(sender, "用法: /mplt addshop <称号ID>");
return true; return;
} }
SaleTitle title = SaleTitle.create(Integer.parseInt(args[1])); SaleTitle title = SaleTitle.create(Integer.parseInt(args[1]));
if (title == null) { if (title == null) {
@ -114,79 +119,134 @@ public class AdminCommands {
Notification.info(sender, "已添加称号到商店, 商品ID: " + title.getId()); Notification.info(sender, "已添加称号到商店, 商品ID: " + title.getId());
Notification.info(sender, title.getTitle()); Notification.info(sender, title.getTitle());
} }
return true;
} }
public static boolean removeShop(CommandSender sender, String[] args) { public static void removeShop(CommandSender sender, String[] args) {
if (sender instanceof org.bukkit.entity.Player) { if (sender instanceof org.bukkit.entity.Player) {
Player player = (org.bukkit.entity.Player) sender; Player player = (org.bukkit.entity.Player) sender;
if (!player.isOp()) { if (!player.isOp()) {
XLogger.warn(player, "你没有权限执行该命令"); XLogger.warn(player, "你没有权限执行该命令");
return true; return;
} }
} }
if (args.length != 2) { if (args.length != 2) {
Notification.warn(sender, "用法: /mplt removeshop <商品ID>"); Notification.warn(sender, "用法: /mplt removeshop <商品ID>");
return true; return;
} }
SaleTitle.delete(Integer.parseInt(args[1])); SaleTitle.delete(Integer.parseInt(args[1]));
return true; Notification.info(sender, "已从商店移除商品");
} }
public static boolean setPrice(CommandSender sender, String[] args) { public static void setPrice(CommandSender sender, String[] args) {
if (sender instanceof org.bukkit.entity.Player) { if (sender instanceof org.bukkit.entity.Player) {
Player player = (org.bukkit.entity.Player) sender; Player player = (org.bukkit.entity.Player) sender;
if (!player.isOp()) { if (!player.isOp()) {
XLogger.warn(player, "你没有权限执行该命令"); XLogger.warn(player, "你没有权限执行该命令");
return true; return;
} }
} }
if (args.length != 4) { if (args.length != 4) {
Notification.warn(sender, "用法: /mplt setprice <商品ID> <价格> <天数>(-1为永久)"); Notification.warn(sender, "用法: /mplt setprice <商品ID> <价格> <天数>(-1为永久)");
return true; return;
} }
SaleTitle.setPrice(Integer.parseInt(args[1]), Integer.parseInt(args[2])); SaleTitle.setPrice(Integer.parseInt(args[1]), Integer.parseInt(args[2]));
SaleTitle.setDays(Integer.parseInt(args[1]), Integer.parseInt(args[3])); SaleTitle.setDays(Integer.parseInt(args[1]), Integer.parseInt(args[3]));
return true; Notification.info(sender, "已设置商品价格");
} }
public static boolean setAmount(CommandSender sender, String[] args) { public static void setAmount(CommandSender sender, String[] args) {
if (sender instanceof org.bukkit.entity.Player) { if (sender instanceof org.bukkit.entity.Player) {
Player player = (org.bukkit.entity.Player) sender; Player player = (org.bukkit.entity.Player) sender;
if (!player.isOp()) { if (!player.isOp()) {
XLogger.warn(player, "你没有权限执行该命令"); XLogger.warn(player, "你没有权限执行该命令");
return true; return;
} }
} }
if (args.length != 3) { if (args.length != 3) {
Notification.warn(sender, "用法: /mplt setamount <商品ID> <数量>(-1为无限)"); Notification.warn(sender, "用法: /mplt setamount <商品ID> <数量>(-1为无限)");
return true; return;
} }
SaleTitle.setAmount(Integer.parseInt(args[1]), Integer.parseInt(args[2])); SaleTitle.setAmount(Integer.parseInt(args[1]), Integer.parseInt(args[2]));
return true; Notification.info(sender, "已设置商品数量");
} }
public static boolean setSaleEndAt(CommandSender sender, String[] args) { public static void setSaleEndAt(CommandSender sender, String[] args) {
if (sender instanceof org.bukkit.entity.Player) { if (sender instanceof org.bukkit.entity.Player) {
Player player = (org.bukkit.entity.Player) sender; Player player = (org.bukkit.entity.Player) sender;
if (!player.isOp()) { if (!player.isOp()) {
XLogger.warn(player, "你没有权限执行该命令"); XLogger.warn(player, "你没有权限执行该命令");
return true; return;
} }
} }
if (args.length != 3) { if (args.length != 3) {
Notification.warn(sender, "用法: /mplt setendat <商品ID> <时间YYYYMMDD>(-1为永久)"); Notification.warn(sender, "用法: /mplt setendat <商品ID> <时间YYYYMMDD>(-1为永久)");
return true; return;
} }
long time_stamp; long time_stamp;
try { try {
time_stamp = Long.parseLong(args[2]); time_stamp = Long.parseLong(args[2]);
} catch (Exception e) { } catch (Exception e) {
Notification.error(sender, "时间格式错误"); Notification.error(sender, "时间格式错误");
return true; return;
} }
SaleTitle.setSaleEndAt(Integer.parseInt(args[1]), time_stamp); SaleTitle.setSaleEndAt(Integer.parseInt(args[1]), time_stamp);
return true; Notification.info(sender, "已设置商品结束时间");
}
public static void addCoin(CommandSender sender, String[] args) {
if (sender instanceof Player) {
Player player = (Player) sender;
if (!player.isOp()) {
XLogger.warn(player, "你没有权限执行该命令");
return;
}
}
if (args.length != 3) {
Notification.warn(sender, "用法: /mplt addcoin <玩家> <数量>");
return;
}
Player target = sender.getServer().getPlayer(args[1]);
if (target == null) {
Notification.error(sender, "玩家不在线");
return;
}
int amount;
try {
amount = Integer.parseInt(args[2]);
} catch (Exception e) {
Notification.error(sender, "数量格式错误");
return;
}
new XPlayer(target).add_coin(amount);
Notification.info(sender, "已给予玩家 " + target.getName() + " " + amount + " 称号币");
}
public static void setCoin(CommandSender sender, String[] args) {
if (sender instanceof Player) {
Player player = (Player) sender;
if (!player.isOp()) {
XLogger.warn(player, "你没有权限执行该命令");
return;
}
}
if (args.length != 3) {
Notification.warn(sender, "用法: /mplt setcoin <玩家> <数量>");
return;
}
Player target = sender.getServer().getPlayer(args[1]);
if (target == null) {
Notification.error(sender, "玩家不在线");
return;
}
int amount;
try {
amount = Integer.parseInt(args[2]);
} catch (Exception e) {
Notification.error(sender, "数量格式错误");
return;
}
new XPlayer(target).set_coin(amount);
Notification.info(sender, "已设置玩家 " + target.getName() + " 称号币为 " + amount);
} }
} }

View File

@ -8,27 +8,27 @@ import cn.lunadeer.miniplayertitle.utils.XLogger;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
public class PlayerCommands { public class PlayerCommands {
public static boolean use(CommandSender sender, String[] args) { public static void use(CommandSender sender, String[] args) {
if (!(sender instanceof org.bukkit.entity.Player)) { if (!(sender instanceof org.bukkit.entity.Player)) {
XLogger.warn("该命令只能由玩家执行"); XLogger.warn("该命令只能由玩家执行");
return true; return;
} }
org.bukkit.entity.Player player = (org.bukkit.entity.Player) sender; org.bukkit.entity.Player player = (org.bukkit.entity.Player) sender;
if (args.length != 2) { if (args.length != 2) {
Notification.warn(player, "用法: /mplt use <称号ID>"); Notification.warn(player, "用法: /mplt use <称号ID>");
return true; return;
} }
XPlayer xPlayer = new XPlayer(player); XPlayer xPlayer = new XPlayer(player);
Integer title_id = Integer.parseInt(args[1]); Integer title_id = Integer.parseInt(args[1]);
xPlayer.updateUsingTitle(title_id); xPlayer.updateUsingTitle(title_id);
return true; return;
} }
public static boolean list(CommandSender sender, String[] args) { public static void list(CommandSender sender, String[] args) {
if (!(sender instanceof org.bukkit.entity.Player)) { if (!(sender instanceof org.bukkit.entity.Player)) {
XLogger.warn("该命令只能由玩家执行"); XLogger.warn("该命令只能由玩家执行");
return true; return;
} }
org.bukkit.entity.Player player = (org.bukkit.entity.Player) sender; org.bukkit.entity.Player player = (org.bukkit.entity.Player) sender;
int page = 1; int page = 1;
@ -37,15 +37,15 @@ public class PlayerCommands {
page = Integer.parseInt(args[1]); page = Integer.parseInt(args[1]);
} catch (Exception e) { } catch (Exception e) {
Notification.error(player, "页数格式错误"); Notification.error(player, "页数格式错误");
return true; return;
} }
} }
XPlayer xPlayer = new XPlayer(player); XPlayer xPlayer = new XPlayer(player);
xPlayer.openBackpack(page); xPlayer.openBackpack(page);
return true; return;
} }
public static boolean shop(CommandSender sender, String[] args) { public static void shop(CommandSender sender, String[] args) {
int page = 1; int page = 1;
if (args.length == 2) { if (args.length == 2) {
try { try {
@ -54,45 +54,45 @@ public class PlayerCommands {
} }
} }
Shop.open(sender, page); Shop.open(sender, page);
return true; return;
} }
public static boolean buy(CommandSender sender, String[] args) { public static void buy(CommandSender sender, String[] args) {
if (!(sender instanceof org.bukkit.entity.Player)) { if (!(sender instanceof org.bukkit.entity.Player)) {
XLogger.warn("该命令只能由玩家执行"); XLogger.warn("该命令只能由玩家执行");
return true; return;
} }
org.bukkit.entity.Player player = (org.bukkit.entity.Player) sender; org.bukkit.entity.Player player = (org.bukkit.entity.Player) sender;
if (args.length != 2) { if (args.length != 2) {
Notification.warn(player, "用法: /mplt buy <称号ID>"); Notification.warn(player, "用法: /mplt buy <称号ID>");
return true; return;
} }
XPlayer xPlayer = new XPlayer(player); XPlayer xPlayer = new XPlayer(player);
Integer sale_id = Integer.parseInt(args[1]); Integer sale_id = Integer.parseInt(args[1]);
SaleTitle saleTitle = Shop.getSaleTitles().get(sale_id); SaleTitle saleTitle = Shop.getSaleTitles().get(sale_id);
if (saleTitle == null) { if (saleTitle == null) {
Notification.error(player, "该称号不存在"); Notification.error(player, "该称号不存在");
return true; return;
} }
xPlayer.buyTitle(saleTitle); xPlayer.buyTitle(saleTitle);
return true; return;
} }
public static boolean custom(CommandSender sender, String[] args) { public static void custom(CommandSender sender, String[] args) {
if (!(sender instanceof org.bukkit.entity.Player)) { if (!(sender instanceof org.bukkit.entity.Player)) {
XLogger.warn("该命令只能由玩家执行"); XLogger.warn("该命令只能由玩家执行");
return true; return;
} }
org.bukkit.entity.Player player = (org.bukkit.entity.Player) sender; org.bukkit.entity.Player player = (org.bukkit.entity.Player) sender;
if (args.length != 2) { if (args.length != 2) {
Notification.warn(player, "用法: /mplt custom <称号>"); Notification.warn(player, "用法: /mplt custom <称号>");
return true; return;
} }
// todo add custom title // todo add custom title
// add title // add title
// description = player.getDisplayName() + "的自定义称号"; // description = player.getDisplayName() + "的自定义称号";
// add player title // add player title
// expire_at = -1 // expire_at = -1
return true; return;
} }
} }