feat: lore 相关指令

This commit is contained in:
2022-10-23 06:48:34 +08:00
parent b23f0bb1e7
commit a0326de479
13 changed files with 516 additions and 33 deletions

View File

@@ -4,6 +4,7 @@ import cn.hamster3.mc.plugin.core.bukkit.api.CoreBukkitAPI;
import cn.hamster3.mc.plugin.core.bukkit.command.ParentCommand;
import cn.hamster3.mc.plugin.core.bukkit.command.debug.BlockInfoCommand;
import cn.hamster3.mc.plugin.core.bukkit.command.debug.YamlCommand;
import cn.hamster3.mc.plugin.core.bukkit.command.lore.ParentLoreCommand;
import cn.hamster3.mc.plugin.core.bukkit.hook.PointAPI;
import cn.hamster3.mc.plugin.core.bukkit.hook.VaultAPI;
import cn.hamster3.mc.plugin.core.bukkit.listener.CallbackListener;
@@ -19,7 +20,7 @@ import java.util.List;
import java.util.logging.Logger;
public class HamsterCorePlugin extends JavaPlugin {
private static final ParentCommand COMMAND_EXECUTOR = new ParentCommand("core");
public static final ParentCommand COMMAND_EXECUTOR = new ParentCommand("core");
private static HamsterCorePlugin instance;
public static HamsterCorePlugin getInstance() {
@@ -56,6 +57,9 @@ public class HamsterCorePlugin extends JavaPlugin {
logger.info("已添加指令: " + BlockInfoCommand.INSTANCE.getName() + " .");
COMMAND_EXECUTOR.addChildCommand(YamlCommand.INSTANCE);
logger.info("已添加指令: " + YamlCommand.INSTANCE.getName() + " .");
COMMAND_EXECUTOR.addChildCommand(ParentLoreCommand.INSTANCE);
logger.info("已添加指令: " + ParentLoreCommand.INSTANCE.getName() + " .");
long time = System.currentTimeMillis() - start;
logger.info("仓鼠核心已启动,总计耗时 " + time + " ms.");
}

View File

@@ -1,8 +1,8 @@
package cn.hamster3.mc.plugin.core.bukkit.command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public abstract class ChildCommand implements TabExecutor {
@NotNull
@@ -11,8 +11,7 @@ public abstract class ChildCommand implements TabExecutor {
@NotNull
public abstract String getUsage();
@Nullable
public abstract String getPermission();
public abstract boolean hasPermission(@NotNull CommandSender sender);
@NotNull
public abstract String getDescription();

View File

@@ -3,17 +3,14 @@ package cn.hamster3.mc.plugin.core.bukkit.command;
import cn.hamster3.mc.plugin.core.bukkit.constant.CoreMessage;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
@SuppressWarnings("unused")
public class ParentCommand implements TabExecutor {
public class ParentCommand extends ChildCommand {
@NotNull
private final String name;
@Nullable
@@ -33,6 +30,11 @@ public class ParentCommand implements TabExecutor {
childCommands = new ArrayList<>();
}
@Override
public @NotNull String getName() {
return name;
}
@NotNull
public String getUsage() {
if (parent == null) {
@@ -41,30 +43,67 @@ public class ParentCommand implements TabExecutor {
return parent.getUsage() + " " + name;
}
@Override
public boolean hasPermission(@NotNull CommandSender sender) {
return true;
}
@Override
public @NotNull String getDescription() {
return "";
}
@NotNull
public List<ChildCommand> getChildCommands() {
return childCommands;
}
@NotNull
public List<ChildCommand> getEndChildCommands() {
ArrayList<ChildCommand> list = new ArrayList<>();
for (ChildCommand command : childCommands) {
if (command instanceof ParentCommand) {
list.addAll(((ParentCommand) command).getEndChildCommands());
} else {
list.add(command);
}
}
return list;
}
public void addChildCommand(@NotNull ChildCommand command) {
childCommands.add(command);
}
public Map<String, String> getCommandHelp(CommandSender sender) {
HashMap<String, String> map = new HashMap<>();
for (ChildCommand child : childCommands) {
if (!child.hasPermission(sender)) {
continue;
}
if (child instanceof ParentCommand) {
Map<String, String> childMap = ((ParentCommand) child).getCommandHelp(sender);
map.putAll(childMap);
continue;
}
map.put(getUsage() + " " + child.getUsage(), child.getDescription());
}
return map;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (args.length == 0) {
sender.sendMessage("§e==================== [" + name + "使用帮助] ====================");
int maxLength = childCommands.stream()
.filter(o -> o.getPermission() == null || sender.hasPermission(o.getPermission()))
.map(o -> o.getUsage().length())
Map<String, String> helpMap = getCommandHelp(sender);
int maxLength = helpMap.keySet().stream()
.map(String::length)
.max(Integer::compareTo)
.orElse(-1);
for (ChildCommand child : childCommands) {
String permission = child.getPermission();
if (permission != null && !sender.hasPermission(permission)) {
continue;
}
sender.sendMessage(String.format("§a%s %-" + maxLength + "s - %s", getUsage(), child.getUsage(), child.getDescription()));
ArrayList<Map.Entry<String, String>> list = new ArrayList<>(helpMap.entrySet());
list.sort(Map.Entry.comparingByKey());
for (Map.Entry<String, String> entry : list) {
sender.sendMessage(String.format("§a%-" + maxLength + "s - %s", entry.getKey(), entry.getValue()));
}
return true;
}
@@ -79,6 +118,11 @@ public class ParentCommand implements TabExecutor {
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
if (args.length == 0) {
return childCommands.stream()
.map(ChildCommand::getName)
.collect(Collectors.toList());
}
for (ChildCommand child : childCommands) {
if (args[0].equalsIgnoreCase(child.getName())) {
return child.onTabComplete(sender, command, alias, Arrays.copyOfRange(args, 1, args.length));

View File

@@ -7,7 +7,6 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.UUID;
@@ -30,8 +29,8 @@ public class BlockInfoCommand extends ChildCommand {
}
@Override
public @Nullable String getPermission() {
return null;
public boolean hasPermission(@NotNull CommandSender sender) {
return true;
}
@Override

View File

@@ -14,7 +14,6 @@ import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
@@ -39,8 +38,8 @@ public class YamlCommand extends ChildCommand {
}
@Override
public @Nullable String getPermission() {
return null;
public boolean hasPermission(@NotNull CommandSender sender) {
return true;
}
@Override

View File

@@ -0,0 +1,77 @@
package cn.hamster3.mc.plugin.core.bukkit.command.lore;
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.BukkitUtils;
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.List;
public class LoreAddCommand extends ChildCommand {
public static final LoreAddCommand INSTANCE = new LoreAddCommand();
private LoreAddCommand() {
}
@Override
public @NotNull String getName() {
return "add";
}
@Override
public @NotNull String getUsage() {
return "add <lore>";
}
@Override
public boolean hasPermission(@NotNull CommandSender sender) {
return true;
}
@Override
public @NotNull String getDescription() {
return "为手持物品添加一条 lore";
}
@SuppressWarnings("deprecation")
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (args.length < 1) {
CoreMessage.COMMAND_LORE_EMPTY_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 (BukkitUtils.isEmptyItemStack(stack)) {
CoreMessage.COMMAND_LORE_HAND_EMPTY.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);
return true;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
return null;
}
}

View File

@@ -0,0 +1,73 @@
package cn.hamster3.mc.plugin.core.bukkit.command.lore;
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.BukkitUtils;
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.List;
public class LoreClearCommand extends ChildCommand {
public static final LoreClearCommand INSTANCE = new LoreClearCommand();
private LoreClearCommand() {
}
@Override
public @NotNull String getName() {
return "clear";
}
@Override
public @NotNull String getUsage() {
return "clear";
}
@Override
public boolean hasPermission(@NotNull CommandSender sender) {
return true;
}
@Override
public @NotNull String getDescription() {
return "清除手持物品的所有 lore";
}
@SuppressWarnings("deprecation")
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player)) {
CoreMessage.COMMAND_MUST_USED_BY_PLAYER.show(sender);
return true;
}
Player player = (Player) sender;
ItemStack stack = player.getItemInHand();
if (BukkitUtils.isEmptyItemStack(stack)) {
CoreMessage.COMMAND_LORE_HAND_EMPTY.show(player);
return true;
}
ItemMeta meta = stack.getItemMeta();
if (meta != null) {
List<String> lore = meta.getLore();
if (lore == null || lore.isEmpty()) {
CoreMessage.COMMAND_LORE_CLEAR_NOTHING.show(player);
return true;
}
meta.setLore(new ArrayList<>());
}
stack.setItemMeta(meta);
CoreMessage.COMMAND_LORE_CLEAR_SUCCESS.show(player);
return true;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
return null;
}
}

View File

@@ -0,0 +1,71 @@
package cn.hamster3.mc.plugin.core.bukkit.command.lore;
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.BukkitUtils;
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.List;
public class LoreNameCommand extends ChildCommand {
public static final LoreNameCommand INSTANCE = new LoreNameCommand();
private LoreNameCommand() {
}
@Override
public @NotNull String getName() {
return "name";
}
@Override
public @NotNull String getUsage() {
return "name <name>";
}
@Override
public boolean hasPermission(@NotNull CommandSender sender) {
return true;
}
@Override
public @NotNull String getDescription() {
return "更改手持物品的显示名称";
}
@SuppressWarnings("deprecation")
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (args.length < 1) {
CoreMessage.COMMAND_LORE_EMPTY_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 (BukkitUtils.isEmptyItemStack(stack)) {
CoreMessage.COMMAND_LORE_HAND_EMPTY.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);
return true;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
return null;
}
}

View File

@@ -0,0 +1,86 @@
package cn.hamster3.mc.plugin.core.bukkit.command.lore;
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.BukkitUtils;
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.List;
public class LoreRemoveCommand extends ChildCommand {
public static final LoreRemoveCommand INSTANCE = new LoreRemoveCommand();
private LoreRemoveCommand() {
}
@Override
public @NotNull String getName() {
return "remove";
}
@Override
public @NotNull String getUsage() {
return "remove <line>";
}
@Override
public boolean hasPermission(@NotNull CommandSender sender) {
return true;
}
@Override
public @NotNull String getDescription() {
return "为手持物品删除一条 lore";
}
@SuppressWarnings("deprecation")
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (args.length < 1) {
CoreMessage.COMMAND_LORE_REMOVE_NOT_INPUT_NUMBER.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) {
CoreMessage.COMMAND_LORE_REMOVE_NOT_INPUT_NUMBER_ERROR.show(sender);
return true;
}
Player player = (Player) sender;
ItemStack stack = player.getItemInHand();
if (BukkitUtils.isEmptyItemStack(stack)) {
CoreMessage.COMMAND_LORE_HAND_EMPTY.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_REMOVE_INDEX_OUT_OF_RANGE.show(player);
return true;
}
lore.remove(i - 1);
meta.setLore(lore);
}
stack.setItemMeta(meta);
CoreMessage.COMMAND_LORE_REMOVE_SUCCESS.show(player);
return true;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
return null;
}
}

View File

@@ -0,0 +1,92 @@
package cn.hamster3.mc.plugin.core.bukkit.command.lore;
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.BukkitUtils;
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;
public class LoreSetCommand extends ChildCommand {
public static final LoreSetCommand INSTANCE = new LoreSetCommand();
private LoreSetCommand() {
}
@Override
public @NotNull String getName() {
return "set";
}
@Override
public @NotNull String getUsage() {
return "set <line> <lore>";
}
@Override
public boolean hasPermission(@NotNull CommandSender sender) {
return true;
}
@Override
public @NotNull String getDescription() {
return "设置指定行数的 lore";
}
@SuppressWarnings("deprecation")
@Override
public boolean onCommand(CommandSender sender, Command command, 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) {
CoreMessage.COMMAND_LORE_SET_NOT_INPUT_NUMBER_ERROR.show(sender);
return true;
}
Player player = (Player) sender;
ItemStack stack = player.getItemInHand();
if (BukkitUtils.isEmptyItemStack(stack)) {
CoreMessage.COMMAND_LORE_HAND_EMPTY.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);
return true;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
return null;
}
}

View File

@@ -0,0 +1,28 @@
package cn.hamster3.mc.plugin.core.bukkit.command.lore;
import cn.hamster3.mc.plugin.core.bukkit.HamsterCorePlugin;
import cn.hamster3.mc.plugin.core.bukkit.command.ParentCommand;
import cn.hamster3.mc.plugin.core.common.util.CommonUtils;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class ParentLoreCommand extends ParentCommand {
public static final ParentLoreCommand INSTANCE = new ParentLoreCommand("lore", HamsterCorePlugin.COMMAND_EXECUTOR);
private ParentLoreCommand(@NotNull String name, @Nullable ParentCommand parent) {
super(name, parent);
addChildCommand(LoreAddCommand.INSTANCE);
addChildCommand(LoreRemoveCommand.INSTANCE);
addChildCommand(LoreSetCommand.INSTANCE);
addChildCommand(LoreClearCommand.INSTANCE);
addChildCommand(LoreNameCommand.INSTANCE);
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
CommonUtils.replaceColorCode(args);
return super.onCommand(sender, command, label, args);
}
}

View File

@@ -8,7 +8,23 @@ public enum CoreMessage {
COMMAND_MUST_USED_BY_PLAYER,
COMMAND_DEBUG_BLOCK_INFO_ON,
COMMAND_DEBUG_BLOCK_INFO_OFF;
COMMAND_DEBUG_BLOCK_INFO_OFF,
COMMAND_LORE_HAND_EMPTY,
COMMAND_LORE_EMPTY_INPUT,
COMMAND_LORE_ADD_SUCCESS,
COMMAND_LORE_CLEAR_NOTHING,
COMMAND_LORE_CLEAR_SUCCESS,
COMMAND_LORE_NAME_SUCCESS,
COMMAND_LORE_REMOVE_NOT_INPUT_NUMBER,
COMMAND_LORE_REMOVE_NOT_INPUT_NUMBER_ERROR,
COMMAND_LORE_REMOVE_INDEX_OUT_OF_RANGE,
COMMAND_LORE_REMOVE_SUCCESS,
COMMAND_LORE_SET_NOT_INPUT_NUMBER,
COMMAND_LORE_SET_NOT_INPUT_NUMBER_ERROR,
COMMAND_LORE_SET_NOT_INPUT_TEXT,
COMMAND_LORE_SET_INDEX_OUT_OF_RANGE,
COMMAND_LORE_SET_SUCCESS;
public void show(CommandSender sender) {
sender.sendMessage(name());