feat(core-bukkit): 为 lore 指令添加 \s 转换为空格的功能

This commit is contained in:
2023-11-06 18:02:59 +08:00
parent c8799a7c28
commit 71bf38d11f
8 changed files with 252 additions and 68 deletions

View File

@@ -19,6 +19,8 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitTask;
import org.jetbrains.annotations.NotNull;
import java.util.logging.Logger;
@@ -31,6 +33,28 @@ public class HamsterCorePlugin extends JavaPlugin {
return instance;
}
/**
* 在服务器主线程上执行一个任务
*
* @param runnable 任务内容
* @return 任务实例
*/
@SuppressWarnings("UnusedReturnValue")
public static BukkitTask sync(@NotNull Runnable runnable) {
return Bukkit.getScheduler().runTask(instance, runnable);
}
/**
* 在服务器主线程外异步执行一个任务
*
* @param runnable 任务内容
* @return 任务实例
*/
@SuppressWarnings("UnusedReturnValue")
public static BukkitTask async(@NotNull Runnable runnable) {
return Bukkit.getScheduler().runTaskAsynchronously(instance, runnable);
}
@Override
public void onLoad() {
long start = System.currentTimeMillis();
@@ -57,20 +81,20 @@ public class HamsterCorePlugin extends JavaPlugin {
logger.info("仓鼠核心正在启动");
audienceProvider = BukkitAudiences.create(this);
logger.info("已创建 AudienceProvider");
CoreCommand.INSTANCE.register();
LoreCommand.INSTANCE.register();
NBTCommand.INSTANCE.register();
Bukkit.getPluginManager().registerEvents(PageListener.INSTANCE, this);
logger.info("已注册 PageListener");
Bukkit.getPluginManager().registerEvents(CallbackListener.INSTANCE, this);
logger.info("已注册 CallbackListener");
Bukkit.getPluginManager().registerEvents(DebugListener.INSTANCE, this);
logger.info("已注册 DebugListener");
CoreCommand.INSTANCE.register();
LoreCommand.INSTANCE.register();
NBTCommand.INSTANCE.register();
long time = System.currentTimeMillis() - start;
Bukkit.getScheduler().runTaskLater(this, () -> {
sync(() -> {
PointAPI.reloadPlayerPointAPIHook();
VaultAPI.reloadVaultHook();
}, 1L);
});
logger.info("仓鼠核心启动完成,总计耗时 " + time + " ms");
}

View File

@@ -20,6 +20,7 @@ public final class LoreCommand extends ParentCommand {
addChildCommand(LoreCustomModelDataCommand.INSTANCE);
addChildCommand(LoreFlagCommand.INSTANCE);
addChildCommand(LoreInfoCommand.INSTANCE);
addChildCommand(LoreInsertCommand.INSTANCE);
}
@Override
@@ -36,6 +37,7 @@ public final class LoreCommand extends ParentCommand {
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
for (int i = 0; i < args.length; i++) {
args[i] = args[i].replace("&", "§");
args[i] = args[i].replace("\\s", " ");
}
return super.onCommand(sender, command, label, args);
}

View File

@@ -1,5 +1,6 @@
package cn.hamster3.mc.plugin.core.bukkit.command.lore.sub;
import cn.hamster3.mc.plugin.core.bukkit.HamsterCorePlugin;
import cn.hamster3.mc.plugin.core.bukkit.command.ChildCommand;
import cn.hamster3.mc.plugin.core.bukkit.constant.CoreMessage;
import cn.hamster3.mc.plugin.core.bukkit.util.CoreBukkitUtils;
@@ -12,6 +13,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class LoreAddCommand extends ChildCommand {
public static final LoreAddCommand INSTANCE = new LoreAddCommand();
@@ -39,34 +41,26 @@ public class LoreAddCommand extends ChildCommand {
return "为手持物品添加一条 lore";
}
@SuppressWarnings("deprecation")
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if (args.length < 1) {
CoreMessage.COMMAND_LORE_ADD_NOT_INPUT.show(sender);
return true;
}
if (!(sender instanceof Player)) {
CoreMessage.COMMAND_MUST_USED_BY_PLAYER.show(sender);
return true;
}
Player player = (Player) sender;
ItemStack stack = player.getItemInHand();
if (CoreBukkitUtils.isEmptyItemStack(stack)) {
CoreMessage.COMMAND_LORE_HAND_EMPTY.show(player);
if (args.length < 1) {
CoreMessage.COMMAND_LORE_ADD_WAIT_CHAT_TEXT.show(sender);
HamsterCorePlugin.async(() -> {
try {
String text = CoreBukkitUtils.getPlayerChat(player).get(15, TimeUnit.SECONDS);
HamsterCorePlugin.sync(() -> addLore(player, text));
} catch (Exception e) {
CoreMessage.COMMAND_LORE_ADD_TIMEOUT.show(player);
}
});
return true;
}
ItemMeta meta = stack.getItemMeta();
if (meta != null) {
List<String> lore = meta.getLore();
if (lore == null) {
lore = new ArrayList<>();
}
lore.add(String.join(" ", args));
meta.setLore(lore);
}
stack.setItemMeta(meta);
CoreMessage.COMMAND_LORE_ADD_SUCCESS.show(player);
addLore(player, String.join(" ", args));
return true;
}
@@ -74,4 +68,25 @@ public class LoreAddCommand extends ChildCommand {
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) {
return null;
}
@SuppressWarnings("deprecation")
private void addLore(@NotNull Player player, @NotNull String text) {
ItemStack stack = player.getItemInHand();
if (CoreBukkitUtils.isEmptyItemStack(stack)) {
CoreMessage.COMMAND_LORE_HAND_EMPTY.show(player);
return;
}
ItemMeta meta = stack.getItemMeta();
if (meta != null) {
List<String> lore = meta.getLore();
if (lore == null) {
lore = new ArrayList<>();
}
lore.add(text);
meta.setLore(lore);
}
stack.setItemMeta(meta);
player.getInventory().setItemInHand(stack);
CoreMessage.COMMAND_LORE_ADD_SUCCESS.show(player);
}
}

View File

@@ -46,7 +46,7 @@ public class LoreFlagCommand extends ChildCommand {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if (args.length < 1) {
CoreMessage.COMMAND_LORE_ADD_NOT_INPUT.show(sender);
CoreMessage.COMMAND_LORE_FLAG_NOT_INPUT.show(sender);
return true;
}
if (!(sender instanceof Player)) {

View File

@@ -0,0 +1,106 @@
package cn.hamster3.mc.plugin.core.bukkit.command.lore.sub;
import cn.hamster3.mc.plugin.core.bukkit.HamsterCorePlugin;
import cn.hamster3.mc.plugin.core.bukkit.command.ChildCommand;
import cn.hamster3.mc.plugin.core.bukkit.constant.CoreMessage;
import cn.hamster3.mc.plugin.core.bukkit.util.CoreBukkitUtils;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class LoreInsertCommand extends ChildCommand {
public static final LoreInsertCommand INSTANCE = new LoreInsertCommand();
private LoreInsertCommand() {
}
@Override
public @NotNull String getName() {
return "insert";
}
@Override
public @NotNull String getUsage() {
return "insert <line> <lore>";
}
@Override
public boolean hasPermission(@NotNull CommandSender sender) {
return true;
}
@Override
public @NotNull String getDescription() {
return "在指定行数后添加 lore";
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if (args.length < 1) {
CoreMessage.COMMAND_LORE_INSERT_NOT_INPUT_NUMBER.show(sender);
return true;
}
if (!(sender instanceof Player)) {
CoreMessage.COMMAND_MUST_USED_BY_PLAYER.show(sender);
return true;
}
int line = Integer.parseInt(args[0]);
if (line < 0) {
CoreMessage.COMMAND_LORE_INSERT_INPUT_NUMBER_ERROR.show(sender);
return true;
}
Player player = (Player) sender;
if (args.length < 2) {
CoreMessage.COMMAND_LORE_INSERT_WAIT_CHAT_TEXT.show(sender);
HamsterCorePlugin.async(() -> {
try {
String text = CoreBukkitUtils.getPlayerChat(player).get(15, TimeUnit.SECONDS);
HamsterCorePlugin.sync(() -> insertLore(player, line, text));
} catch (Exception e) {
CoreMessage.COMMAND_LORE_ADD_TIMEOUT.show(player);
}
});
return true;
}
args = Arrays.copyOfRange(args, 1, args.length);
insertLore(player, line, String.join(" ", args));
return true;
}
@Override
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) {
return null;
}
@SuppressWarnings("deprecation")
private void insertLore(@NotNull Player player, int line, @NotNull String text) {
ItemStack stack = player.getItemInHand();
if (CoreBukkitUtils.isEmptyItemStack(stack)) {
CoreMessage.COMMAND_LORE_HAND_EMPTY.show(player);
return;
}
ItemMeta meta = stack.getItemMeta();
if (meta != null) {
List<String> lore = meta.getLore();
if (lore == null) {
lore = new ArrayList<>();
}
if (lore.size() < line) {
CoreMessage.COMMAND_LORE_INSERT_INDEX_OUT_OF_RANGE.show(player);
return;
}
lore.add(line, text);
meta.setLore(lore);
}
stack.setItemMeta(meta);
CoreMessage.COMMAND_LORE_INSERT_SUCCESS.show(player);
}
}

View File

@@ -1,5 +1,6 @@
package cn.hamster3.mc.plugin.core.bukkit.command.lore.sub;
import cn.hamster3.mc.plugin.core.bukkit.HamsterCorePlugin;
import cn.hamster3.mc.plugin.core.bukkit.command.ChildCommand;
import cn.hamster3.mc.plugin.core.bukkit.constant.CoreMessage;
import cn.hamster3.mc.plugin.core.bukkit.util.CoreBukkitUtils;
@@ -11,6 +12,7 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class LoreNameCommand extends ChildCommand {
public static final LoreNameCommand INSTANCE = new LoreNameCommand();
@@ -38,29 +40,26 @@ public class LoreNameCommand extends ChildCommand {
return "更改手持物品的显示名称";
}
@SuppressWarnings("deprecation")
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if (args.length < 1) {
CoreMessage.COMMAND_LORE_NAME_NOT_INPUT.show(sender);
return true;
}
if (!(sender instanceof Player)) {
CoreMessage.COMMAND_MUST_USED_BY_PLAYER.show(sender);
return true;
}
Player player = (Player) sender;
ItemStack stack = player.getItemInHand();
if (CoreBukkitUtils.isEmptyItemStack(stack)) {
CoreMessage.COMMAND_LORE_HAND_EMPTY.show(player);
if (args.length < 1) {
CoreMessage.COMMAND_LORE_NAME_WAIT_CHAT_TEXT.show(sender);
HamsterCorePlugin.async(() -> {
try {
String text = CoreBukkitUtils.getPlayerChat(player).get(15, TimeUnit.SECONDS);
HamsterCorePlugin.sync(() -> setName(player, text));
} catch (Exception e) {
CoreMessage.COMMAND_LORE_NAME_TIMEOUT.show(player);
}
});
return true;
}
ItemMeta meta = stack.getItemMeta();
if (meta != null) {
meta.setDisplayName(String.join(" ", args));
}
stack.setItemMeta(meta);
CoreMessage.COMMAND_LORE_NAME_SUCCESS.show(player);
setName(player, String.join(" ", args));
return true;
}
@@ -68,4 +67,19 @@ public class LoreNameCommand extends ChildCommand {
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) {
return null;
}
@SuppressWarnings("deprecation")
private void setName(@NotNull Player player, @NotNull String name) {
ItemStack stack = player.getItemInHand();
if (CoreBukkitUtils.isEmptyItemStack(stack)) {
CoreMessage.COMMAND_LORE_HAND_EMPTY.show(player);
return;
}
ItemMeta meta = stack.getItemMeta();
if (meta != null) {
meta.setDisplayName(name);
}
stack.setItemMeta(meta);
CoreMessage.COMMAND_LORE_NAME_SUCCESS.show(player);
}
}

View File

@@ -1,5 +1,6 @@
package cn.hamster3.mc.plugin.core.bukkit.command.lore.sub;
import cn.hamster3.mc.plugin.core.bukkit.HamsterCorePlugin;
import cn.hamster3.mc.plugin.core.bukkit.command.ChildCommand;
import cn.hamster3.mc.plugin.core.bukkit.constant.CoreMessage;
import cn.hamster3.mc.plugin.core.bukkit.util.CoreBukkitUtils;
@@ -13,6 +14,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class LoreSetCommand extends ChildCommand {
public static final LoreSetCommand INSTANCE = new LoreSetCommand();
@@ -40,48 +42,36 @@ public class LoreSetCommand extends ChildCommand {
return "设置指定行数的 lore";
}
@SuppressWarnings("deprecation")
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if (args.length < 1) {
CoreMessage.COMMAND_LORE_SET_NOT_INPUT_NUMBER.show(sender);
return true;
}
if (args.length < 2) {
CoreMessage.COMMAND_LORE_SET_NOT_INPUT_TEXT.show(sender);
return true;
}
if (!(sender instanceof Player)) {
CoreMessage.COMMAND_MUST_USED_BY_PLAYER.show(sender);
return true;
}
int i = Integer.parseInt(args[0]);
if (i <= 0) {
int line = Integer.parseInt(args[0]);
if (line <= 0) {
CoreMessage.COMMAND_LORE_SET_INPUT_NUMBER_ERROR.show(sender);
return true;
}
Player player = (Player) sender;
ItemStack stack = player.getItemInHand();
if (CoreBukkitUtils.isEmptyItemStack(stack)) {
CoreMessage.COMMAND_LORE_HAND_EMPTY.show(player);
if (args.length < 2) {
CoreMessage.COMMAND_LORE_SET_WAIT_CHAT_TEXT.show(sender);
HamsterCorePlugin.async(() -> {
try {
String text = CoreBukkitUtils.getPlayerChat(player).get(15, TimeUnit.SECONDS);
HamsterCorePlugin.sync(() -> setLore(player, line, text));
} catch (Exception e) {
CoreMessage.COMMAND_LORE_ADD_TIMEOUT.show(player);
}
});
return true;
}
ItemMeta meta = stack.getItemMeta();
if (meta != null) {
List<String> lore = meta.getLore();
if (lore == null) {
lore = new ArrayList<>();
}
if (lore.size() < i) {
CoreMessage.COMMAND_LORE_SET_INDEX_OUT_OF_RANGE.show(player);
return true;
}
args = Arrays.copyOfRange(args, 1, args.length);
lore.set(i - 1, String.join(" ", args));
meta.setLore(lore);
}
stack.setItemMeta(meta);
CoreMessage.COMMAND_LORE_SET_SUCCESS.show(player);
args = Arrays.copyOfRange(args, 1, args.length);
setLore(player, line, String.join(" ", args));
return true;
}
@@ -89,4 +79,28 @@ public class LoreSetCommand extends ChildCommand {
public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) {
return null;
}
@SuppressWarnings("deprecation")
private void setLore(@NotNull Player player, int line, @NotNull String text) {
ItemStack stack = player.getItemInHand();
if (CoreBukkitUtils.isEmptyItemStack(stack)) {
CoreMessage.COMMAND_LORE_HAND_EMPTY.show(player);
return;
}
ItemMeta meta = stack.getItemMeta();
if (meta != null) {
List<String> lore = meta.getLore();
if (lore == null) {
lore = new ArrayList<>();
}
if (lore.size() < line) {
CoreMessage.COMMAND_LORE_SET_INDEX_OUT_OF_RANGE.show(player);
return;
}
lore.set(line - 1, text);
meta.setLore(lore);
}
stack.setItemMeta(meta);
CoreMessage.COMMAND_LORE_SET_SUCCESS.show(player);
}
}

View File

@@ -23,7 +23,8 @@ public enum CoreMessage {
COMMAND_LORE_HAND_EMPTY("§c你必须手持一个物品才能使用这个命令"),
COMMAND_LORE_ADD_NOT_INPUT("§c你没有输入 lore 文本"),
COMMAND_LORE_ADD_WAIT_CHAT_TEXT("§a请于 15 秒内在聊天框输入想要添加的 lore 文本"),
COMMAND_LORE_ADD_TIMEOUT("§a已取消添加 lore"),
COMMAND_LORE_ADD_SUCCESS("§a已成功添加 lore 文本"),
COMMAND_LORE_CLEAR_NOTHING("§c这个物品没有 lore 文本"),
@@ -33,11 +34,13 @@ public enum CoreMessage {
COMMAND_LORE_CMD_SET_INPUT_ERROR("§c设置物品的自定义模型失败: 模型 ID 必须是一个数字"),
COMMAND_LORE_CMD_SET_SUCCESS("§a已设置物品的自定义模型为: %data%"),
COMMAND_LORE_FLAG_NOT_INPUT("§c设置物品 flag 失败: 未输入任何文本"),
COMMAND_LORE_FLAG_SET_ERROR_INPUT("§c设置物品 flag 失败: 输入的 flag 有误"),
COMMAND_LORE_FLAG_REMOVE_SUCCESS("§a已移除物品的 flag: %flag%"),
COMMAND_LORE_FLAG_SET_SUCCESS("§a已设置物品的 flag: %flag%"),
COMMAND_LORE_NAME_NOT_INPUT("§c请输入物品名称"),
COMMAND_LORE_NAME_WAIT_CHAT_TEXT("§a请于 15 秒内在聊天框输入想要设置的物品名称"),
COMMAND_LORE_NAME_TIMEOUT("§c已取消设置物品名称"),
COMMAND_LORE_NAME_SUCCESS("§a已成功设置物品名称"),
COMMAND_LORE_REMOVE_INPUT_NUMBER_ERROR("§c行号必须是一个大于0的整数"),
@@ -48,9 +51,15 @@ public enum CoreMessage {
COMMAND_LORE_SET_NOT_INPUT_NUMBER("§c请输入要设置的行号"),
COMMAND_LORE_SET_INPUT_NUMBER_ERROR("§c行号必须是一个大于 0 的整数"),
COMMAND_LORE_SET_NOT_INPUT_TEXT("§c请输入要设置的 lore 文本"),
COMMAND_LORE_SET_WAIT_CHAT_TEXT("§c请于 15 秒内在聊天框输入要设置的 lore 文本"),
COMMAND_LORE_SET_INDEX_OUT_OF_RANGE("§c你的手持物品没有这么多行 lore 文本"),
COMMAND_LORE_SET_SUCCESS("§a已成功设置 lore 文本"),
COMMAND_LORE_INSERT_NOT_INPUT_NUMBER("§c请输入行号"),
COMMAND_LORE_INSERT_INPUT_NUMBER_ERROR("§c行号必须是一个大于等于 0 的整数"),
COMMAND_LORE_INSERT_WAIT_CHAT_TEXT("§a请于 15 秒内在聊天框输入想要设置的 lore 文本"),
COMMAND_LORE_INSERT_INDEX_OUT_OF_RANGE("§c你的手持物品没有这么多行 lore 文本"),
COMMAND_LORE_INSERT_SUCCESS("§a已成功设置 lore 文本"),
;
private DisplayMessage message;