diff --git a/pom.xml b/pom.xml
index ef4224f..03d487d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -115,7 +115,6 @@
org.apache.commons
commons-compress
1.27.1
- provided
com.fasterxml.jackson.core
diff --git a/src/main/java/com/io/yutian/elementoriginlib/ElementOriginLib.java b/src/main/java/com/io/yutian/elementoriginlib/ElementOriginLib.java
index 525f735..6760981 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/ElementOriginLib.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/ElementOriginLib.java
@@ -18,9 +18,7 @@ public final class ElementOriginLib extends JavaPlugin {
private static Logger logger = Logger.getLogger(ElementOriginLib.class);
- private static RedisIO redisIO;
-
- private static CommandManager commandManager;
+ private RedisIO redisIO;
@Override
public void onEnable() {
@@ -31,11 +29,9 @@ public final class ElementOriginLib extends JavaPlugin {
new GuiHandlerListener(this);
new PlayerChatInputListener(this);
- commandManager = new CommandManager(this);
- commandManager.registerPluginCommand("elementoriginlib");
+ CommandManager.INSTANCE.registerPluginCommand("elementoriginlib");
- Lang.registerLangFile(this);
- Lang.reload();
+ reload();
redisIO = new RedisIO();
redisIO.init(this);
@@ -49,11 +45,12 @@ public final class ElementOriginLib extends JavaPlugin {
LibraryManager libraryManager = new BukkitLibraryManager(this);
libraryManager.addMavenCentral();
libraryManager.setLogLevel(LogLevel.WARN);
-// libraryManager.loadLibrary(Library.builder().groupId("org{}apache{}commons").artifactId("commons-compress").version("1.27.1").build());
-// libraryManager.loadLibrary(Library.builder().groupId("com{}github{}luben").artifactId("zstd-jni").version("1.5.6-9").build());
+ libraryManager.loadLibrary(Library.builder().groupId("org{}apache{}commons").artifactId("commons-compress").version("1.27.1").build());
+ libraryManager.loadLibrary(Library.builder().groupId("com{}github{}luben").artifactId("zstd-jni").version("1.5.6-9").build());
+ libraryManager.loadLibrary(Library.builder().groupId("com{}fasterxml{}jackson{}core").artifactId("jackson-databind").version("2.18.2").build());
// libraryManager.loadLibrary(Library.builder().groupId("com{}zaxxer").artifactId("HikariCP").version("6.2.1").build());
// libraryManager.loadLibrary(Library.builder().groupId("org{}xerial").artifactId("sqlite-jdbc").version("3.46.0.0").build());
-// libraryManager.loadLibrary(Library.builder().groupId("redis{}clients").id("jedis").artifactId("jedis").version("5.2.0").build());
+ libraryManager.loadLibrary(Library.builder().groupId("redis{}clients").id("jedis").artifactId("jedis").version("5.2.0").build());
logger.info("Successfully loaded libraries.");
}
@@ -61,7 +58,12 @@ public final class ElementOriginLib extends JavaPlugin {
public void onDisable() {
}
- public static RedisIO getRedisIO() {
+ public void reload() {
+ Lang.registerLangFile(this);
+ Lang.reload();
+ }
+
+ public RedisIO getRedisIO() {
return redisIO;
}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/command/SimpleCommandManager.java b/src/main/java/com/io/yutian/elementoriginlib/command/SimpleCommandManager.java
index 1a66772..81889c5 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/command/SimpleCommandManager.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/command/SimpleCommandManager.java
@@ -4,7 +4,6 @@ import com.io.yutian.elementoriginlib.command.handler.CommandHandler;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandMap;
-import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Method;
@@ -18,7 +17,6 @@ public class SimpleCommandManager implements ICommandManager {
protected static Map bukkitCommandMap = new HashMap<>();
protected static CommandMap commandMap;
- private final Plugin plugin;
private final String name;
@NotNull
@@ -27,8 +25,7 @@ public class SimpleCommandManager implements ICommandManager {
private List commandEntities = new ArrayList<>();
- public SimpleCommandManager(@NotNull Plugin plugin, @NotNull String name) {
- this.plugin = plugin;
+ public SimpleCommandManager(@NotNull String name) {
this.name = name;
}
@@ -62,10 +59,6 @@ public class SimpleCommandManager implements ICommandManager {
Bukkit.getPluginCommand(commandName).setExecutor(new CommandHandler(this));
}
- public Plugin getPlugin() {
- return plugin;
- }
-
@NotNull
@Override
public String getName() {
diff --git a/src/main/java/com/io/yutian/elementoriginlib/command/handler/CommandHandler.java b/src/main/java/com/io/yutian/elementoriginlib/command/handler/CommandHandler.java
index 4987c8a..75f596e 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/command/handler/CommandHandler.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/command/handler/CommandHandler.java
@@ -171,10 +171,6 @@ public class CommandHandler implements CommandExecutor, TabCompleter {
int depth = args.length;
String currentArg = args[depth - 1];
-// int index = depth - 1;
-// if (commandEntity.getChildrens().size() == 1 && commandEntity.getChildrens().get(0).isNodal()) {
-// index = depth - 2;
-// }
return getSuggestions(sender, entries, args, 0, depth - 1, currentArg);
}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/command/list/CommandHelp.java b/src/main/java/com/io/yutian/elementoriginlib/command/list/CommandHelp.java
index a579c67..8246a4b 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/command/list/CommandHelp.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/command/list/CommandHelp.java
@@ -3,12 +3,12 @@ package com.io.yutian.elementoriginlib.command.list;
import com.io.yutian.elementoriginlib.command.CommandContext;
import com.io.yutian.elementoriginlib.command.CommandEntity;
import com.io.yutian.elementoriginlib.command.CommandEntry;
+import com.io.yutian.elementoriginlib.command.ICommandManager;
import com.io.yutian.elementoriginlib.command.interfaces.Command;
import com.io.yutian.elementoriginlib.command.interfaces.Parameter;
import com.io.yutian.elementoriginlib.command.interfaces.SubCommand;
import com.io.yutian.elementoriginlib.lang.Lang;
import com.io.yutian.elementoriginlib.list.PageList;
-import com.io.yutian.elementoriginlib.manager.CommandManager;
import com.io.yutian.elementoriginlib.util.ComponentBuilder;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent;
@@ -25,17 +25,16 @@ public class CommandHelp {
private final static int MAX_PAGE_SIZE = 8;
- private final CommandManager commandManager;
- private final String alias;
+ private final ICommandManager commandManager;
- public CommandHelp(CommandManager commandManager, String alias) {
+ public CommandHelp(ICommandManager commandManager) {
this.commandManager = commandManager;
- this.alias = alias;
}
@SubCommand(nodal = true)
public void help(CommandContext commandContext, @Parameter(required = false, defaultValue = "1") int page) {
+ String alias = commandContext.getLabel();
String commandAlias = alias != null ? alias : commandContext.getLabel();
CommandSender sender = commandContext.getSender();
if (page <= 0) {
@@ -81,11 +80,12 @@ public class CommandHelp {
private StringBuilder getCommandInfo(CommandEntity command, String commandAlias) {
StringBuilder stringBuilder = new StringBuilder("§6/"+ commandAlias +" "+ command.getCommand());
stringBuilder.append("§f");
- System.out.println(commandAlias);
if (command.getChildrens().size() > 0) {
+ if (!(command.getChildrens().size() == 1 && command.getChildrens().get(0).isNodal())) {
+ for (CommandEntry child : command.getChildrens()) {
- } else {
-
+ }
+ }
}
Optional optional = Lang.getOptional("command."+command.getCommand()+".description");
if (optional.isPresent()) {
diff --git a/src/main/java/com/io/yutian/elementoriginlib/command/list/CommandReload.java b/src/main/java/com/io/yutian/elementoriginlib/command/list/CommandReload.java
new file mode 100644
index 0000000..ffde75e
--- /dev/null
+++ b/src/main/java/com/io/yutian/elementoriginlib/command/list/CommandReload.java
@@ -0,0 +1,20 @@
+package com.io.yutian.elementoriginlib.command.list;
+
+import com.io.yutian.elementoriginlib.ElementOriginLib;
+import com.io.yutian.elementoriginlib.command.CommandContext;
+import com.io.yutian.elementoriginlib.command.interfaces.Command;
+import com.io.yutian.elementoriginlib.command.interfaces.SubCommand;
+import com.io.yutian.elementoriginlib.lang.Lang;
+import org.bukkit.command.CommandSender;
+
+@Command("reload")
+public class CommandReload {
+
+ @SubCommand(value = "reload", nodal = true)
+ public void reload(CommandContext context) {
+ CommandSender sender = context.getSender();
+ ElementOriginLib.inst().reload();
+ sender.sendMessage(Lang.get("command.reload.success"));
+ }
+
+}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/command/list/CommandTest.java b/src/main/java/com/io/yutian/elementoriginlib/command/list/CommandTest.java
deleted file mode 100644
index ee34396..0000000
--- a/src/main/java/com/io/yutian/elementoriginlib/command/list/CommandTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.io.yutian.elementoriginlib.command.list;
-
-import com.io.yutian.elementoriginlib.command.CommandContext;
-import com.io.yutian.elementoriginlib.command.interfaces.Command;
-import com.io.yutian.elementoriginlib.command.interfaces.SubCommand;
-import com.io.yutian.elementoriginlib.command.interfaces.Parameter;
-import com.io.yutian.elementoriginlib.item.OriginItem;
-import com.io.yutian.elementoriginlib.item.stat.ItemStats;
-import com.io.yutian.elementoriginlib.item.stat.data.StringData;
-import com.io.yutian.elementoriginlib.item.stat.list.IdStat;
-import org.bukkit.Material;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-@Command("test")
-public class CommandTest {
-
- @SubCommand("list")
- public void list(CommandContext context, @Parameter(required = false, defaultValue = "1") int page) {
- System.out.println(context.getSender());
- System.out.println("list:"+page);
- }
-
- @SubCommand("item.get")
- public void item_get(CommandContext context) {
- Player player = (Player) context.getSender();
-
- OriginItem originItem = new OriginItem(new ItemStack(Material.IRON_AXE));
- originItem.setStatData(ItemStats.getItemStat(IdStat.class), new StringData("test"));
- player.getInventory().addItem(originItem.getItemStack());
- }
-
- @SubCommand("item.load")
- public void item_load(CommandContext context) {
- Player player = (Player) context.getSender();
- ItemStack itemStack = player.getInventory().getItemInMainHand();
- if (itemStack == null || itemStack.getType() == Material.AIR) {
- return;
- }
- OriginItem originItem = new OriginItem(itemStack);
- System.out.println(originItem.getStats());
- }
-
- @SubCommand("item.test")
- public void item_test(@Parameter String id) {
- System.out.println(id);
- }
-}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/datasync/DataSyncHelper.java b/src/main/java/com/io/yutian/elementoriginlib/datasync/DataSyncHelper.java
index a0bc651..e1b303c 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/datasync/DataSyncHelper.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/datasync/DataSyncHelper.java
@@ -8,13 +8,13 @@ public class DataSyncHelper {
public static void saveData(String key, Object value) {
String strValue = SerializeHelper.serialize(value);
- try (Jedis jedis = ElementOriginLib.getRedisIO().getJedisPool().getResource()) {
+ try (Jedis jedis = ElementOriginLib.inst().getRedisIO().getJedisPool().getResource()) {
jedis.set(key, strValue);
}
}
public static T getData(String key, Class clazz) {
- try (Jedis jedis = ElementOriginLib.getRedisIO().getJedisPool().getResource()) {
+ try (Jedis jedis = ElementOriginLib.inst().getRedisIO().getJedisPool().getResource()) {
if (!jedis.exists(key)) {
return null;
}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/exception/itemstat/ItemStatDataLoadException.java b/src/main/java/com/io/yutian/elementoriginlib/exception/itemstat/ItemStatDataLoadException.java
new file mode 100644
index 0000000..ae0f176
--- /dev/null
+++ b/src/main/java/com/io/yutian/elementoriginlib/exception/itemstat/ItemStatDataLoadException.java
@@ -0,0 +1,21 @@
+package com.io.yutian.elementoriginlib.exception.itemstat;
+
+public class ItemStatDataLoadException extends RuntimeException {
+
+ public ItemStatDataLoadException() {
+ super();
+ }
+
+ public ItemStatDataLoadException(String s) {
+ super(s);
+ }
+
+ public ItemStatDataLoadException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public ItemStatDataLoadException(Throwable cause) {
+ super(cause);
+ }
+
+}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/OriginItem.java b/src/main/java/com/io/yutian/elementoriginlib/item/TagStatItem.java
similarity index 84%
rename from src/main/java/com/io/yutian/elementoriginlib/item/OriginItem.java
rename to src/main/java/com/io/yutian/elementoriginlib/item/TagStatItem.java
index a72bbdc..eba7be4 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/item/OriginItem.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/TagStatItem.java
@@ -9,19 +9,19 @@ import org.jetbrains.annotations.NotNull;
import java.util.*;
-public class OriginItem {
+public class TagStatItem {
private ItemStack itemStack;
private ItemProxy itemProxy;
private Map stats = new HashMap<>();
- private OriginItemStackBuilder builder;
+ private TagStatItemStackBuilder builder;
- public OriginItem(ItemStack itemStack) {
+ public TagStatItem(ItemStack itemStack) {
this.itemStack = itemStack;
this.itemProxy = new ItemProxy(itemStack);
- this.builder = new OriginItemStackBuilder(this);
+ this.builder = new TagStatItemStackBuilder(this);
}
public void setStatData(@NotNull ItemStat stat, @NotNull StatData data) {
@@ -53,7 +53,7 @@ public class OriginItem {
}
@NotNull
- public OriginItemStackBuilder builder() {
+ public TagStatItemStackBuilder builder() {
return this.builder;
}
@@ -85,14 +85,14 @@ public class OriginItem {
}
@Override
- public OriginItem clone() {
- OriginItem originItem = new OriginItem(itemStack.clone());
+ public TagStatItem clone() {
+ TagStatItem tagStatItem = new TagStatItem(itemStack.clone());
Iterator iterator = this.stats.keySet().iterator();
while(iterator.hasNext()) {
ItemStat itemStat = (ItemStat) iterator.next();
- originItem.stats.put(itemStat, this.stats.get(itemStat));
+ tagStatItem.stats.put(itemStat, this.stats.get(itemStat));
}
- return originItem;
+ return tagStatItem;
}
}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/OriginItemStackBuilder.java b/src/main/java/com/io/yutian/elementoriginlib/item/TagStatItemStackBuilder.java
similarity index 51%
rename from src/main/java/com/io/yutian/elementoriginlib/item/OriginItemStackBuilder.java
rename to src/main/java/com/io/yutian/elementoriginlib/item/TagStatItemStackBuilder.java
index f0d86e1..3404c36 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/item/OriginItemStackBuilder.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/TagStatItemStackBuilder.java
@@ -1,28 +1,33 @@
package com.io.yutian.elementoriginlib.item;
-import com.io.yutian.elementoriginlib.item.stat.StatData;
import com.io.yutian.elementoriginlib.tag.ItemProxy;
+import com.io.yutian.elementoriginlib.tag.TagCompound;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
+import java.util.function.Consumer;
-public class OriginItemStackBuilder {
+public class TagStatItemStackBuilder {
- private final OriginItem originItem;
+ private final TagStatItem tagStatItem;
protected ItemStack itemStack;
protected ItemMeta itemMeta;
protected ItemProxy itemProxy;
- public OriginItemStackBuilder(OriginItem originItem) {
- this.originItem = originItem;
- this.itemStack = originItem.getItemStack();
+ public TagStatItemStackBuilder(TagStatItem tagStatItem) {
+ this.tagStatItem = tagStatItem;
+ this.itemStack = tagStatItem.getItemStack();
this.itemMeta = itemStack.getItemMeta();
- this.itemProxy = originItem.getItemProxy();
+ this.itemProxy = tagStatItem.getItemProxy();
+ }
+
+ public void editTag(Consumer tagCompoundConsumer) {
+ itemProxy.editTag(tagCompoundConsumer);
}
@NotNull
@@ -37,23 +42,23 @@ public class OriginItemStackBuilder {
}
private void buildCompounds() {
- originItem.getStats().forEach((stat, statData) -> stat.whenApplied(this, statData));
+ tagStatItem.getStats().forEach((stat, statData) -> stat.whenApplied(this, statData));
itemStack = itemProxy.getItemStack();
itemMeta = itemStack.getItemMeta();
- originItem.getStats().forEach((stat, statData) -> stat.applyMeta(this, statData));
+ tagStatItem.getStats().forEach((stat, statData) -> stat.applyMeta(this, statData));
itemStack.setItemMeta(itemMeta);
List lores = itemMeta.hasLore() ? itemMeta.getLore() : new ArrayList<>();
- originItem.getStats().forEach((stat, statData) -> stat.whenApplyLore(this, statData, lores));
+ tagStatItem.getStats().forEach((stat, statData) -> stat.whenApplyLore(this, statData, lores));
itemStack.setLore(lores);
}
@NotNull
- public ItemProxy getNBTItem() {
+ public ItemProxy getItemProxy() {
return itemProxy;
}
- public OriginItem getOriginItem() {
- return originItem;
+ public TagStatItem getOriginItem() {
+ return tagStatItem;
}
}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/ItemStat.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/ItemStat.java
index 3f45040..849edc6 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/item/stat/ItemStat.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/ItemStat.java
@@ -1,7 +1,8 @@
package com.io.yutian.elementoriginlib.item.stat;
-import com.io.yutian.elementoriginlib.item.OriginItem;
-import com.io.yutian.elementoriginlib.item.OriginItemStackBuilder;
+import com.io.yutian.elementoriginlib.exception.itemstat.ItemStatDataLoadException;
+import com.io.yutian.elementoriginlib.item.TagStatItem;
+import com.io.yutian.elementoriginlib.item.TagStatItemStackBuilder;
import com.io.yutian.elementoriginlib.tag.ItemProxy;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -13,28 +14,33 @@ public abstract class ItemStat {
@NotNull
private final String id;
@NotNull
- private final String nbtPath;
+ private final String tagPath;
public ItemStat(@NotNull String id, @NotNull String path) {
this.id = id;
- this.nbtPath = path;
+ this.tagPath = path;
}
- public abstract void whenApplied(@NotNull OriginItemStackBuilder itemStackBuilder, @NotNull S statData);
+ public abstract void whenApplied(@NotNull TagStatItemStackBuilder itemStackBuilder, @NotNull S statData);
- public void applyMeta(@NotNull OriginItemStackBuilder itemStackBuilder, @NotNull S statData) {
+ public abstract S loadAsObject(@NotNull Object value) throws ItemStatDataLoadException;
+
+ public void applyMeta(@NotNull TagStatItemStackBuilder itemStackBuilder, @NotNull S statData) {
}
- public void whenApplyLore(@NotNull OriginItemStackBuilder itemStackBuilder, @NotNull S statData, @NotNull List lores) {
+ public void whenApplyLore(@NotNull TagStatItemStackBuilder itemStackBuilder, @NotNull S statData, @NotNull List lores) {
}
@Nullable
- public abstract S getLoadedNBT(@NotNull ItemProxy itemProxy);
+ public abstract S getLoadedTag(@NotNull ItemProxy itemProxy);
- public void load(@NotNull OriginItem originItem) {
- S loadedNBT = getLoadedNBT(originItem.getItemProxy());
- if (loadedNBT != null) {
- originItem.setStatData(this, loadedNBT);
+ public void load(@NotNull TagStatItem tagStatItem) {
+ if (!tagStatItem.getItemProxy().has(getTagPath())) {
+ return;
+ }
+ S loadedTag = getLoadedTag(tagStatItem.getItemProxy());
+ if (loadedTag != null) {
+ tagStatItem.setStatData(this, loadedTag);
}
}
@@ -44,8 +50,8 @@ public abstract class ItemStat {
}
@NotNull
- public String getNBTPath() {
- return nbtPath;
+ public String getTagPath() {
+ return tagPath;
}
@Override
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/ItemStats.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/ItemStats.java
index 844942a..564447b 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/item/stat/ItemStats.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/ItemStats.java
@@ -16,12 +16,13 @@ public class ItemStats {
private static Map, ItemStat>> itemStats = new HashMap<>();
static {
- register(IdStat.class, new IdStat());
+ register(new IdStat());
}
- public static void register(Class clazz, I itemStat) {
+ public static void register(ItemStat itemStat) {
+ Class extends ItemStat> clazz = itemStat.getClass();
if (itemStats.containsKey(itemStat.getId())) {
- LOGGER.warn("ItemStat "+clazz.getName()+" 已经注册过了");
+ LOGGER.warn("ItemStat "+clazz.getName()+" 已存在");
return;
}
itemStats.put(clazz, itemStat);
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/StatData.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/StatData.java
index a5b64fa..a34629e 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/item/stat/StatData.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/StatData.java
@@ -1,6 +1,6 @@
package com.io.yutian.elementoriginlib.item.stat;
-public interface StatData {
+public interface StatData {
default boolean isEmpty() {
return true;
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/DoubleData.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/DoubleData.java
index d8a0b31..d1b0885 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/DoubleData.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/DoubleData.java
@@ -1,5 +1,6 @@
package com.io.yutian.elementoriginlib.item.stat.data;
+import com.io.yutian.elementoriginlib.exception.itemstat.ItemStatDataLoadException;
import com.io.yutian.elementoriginlib.item.stat.Mergeable;
import com.io.yutian.elementoriginlib.item.stat.StatData;
import org.jetbrains.annotations.NotNull;
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/DoubleListData.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/DoubleListData.java
new file mode 100644
index 0000000..8d2215f
--- /dev/null
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/DoubleListData.java
@@ -0,0 +1,11 @@
+package com.io.yutian.elementoriginlib.item.stat.data;
+
+import java.util.List;
+
+public class DoubleListData extends ListData {
+
+ public DoubleListData(List list) {
+ super(list);
+ }
+
+}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/EnumData.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/EnumData.java
new file mode 100644
index 0000000..bd9af2b
--- /dev/null
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/EnumData.java
@@ -0,0 +1,48 @@
+package com.io.yutian.elementoriginlib.item.stat.data;
+
+import com.io.yutian.elementoriginlib.item.stat.StatData;
+
+import java.util.Objects;
+
+public class EnumData implements StatData {
+
+ private E value;
+
+ public EnumData(E value) {
+ this.value = value;
+ }
+
+ public E getValue() {
+ return value;
+ }
+
+ public void setValue(E value) {
+ this.value = value;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return value == null;
+ }
+
+ @Override
+ public String toString() {
+ return "EnumData{" +
+ "value=" + value +
+ '}';
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+
+ EnumData> enumData = (EnumData>) o;
+ return Objects.equals(value, enumData.value);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(value);
+ }
+}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/EnumListData.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/EnumListData.java
new file mode 100644
index 0000000..a09402e
--- /dev/null
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/EnumListData.java
@@ -0,0 +1,13 @@
+package com.io.yutian.elementoriginlib.item.stat.data;
+
+import com.io.yutian.elementoriginlib.item.stat.StatData;
+
+import java.util.List;
+
+public class EnumListData extends ListData {
+
+ public EnumListData(List list) {
+ super(list);
+ }
+
+}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/IntListData.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/IntListData.java
new file mode 100644
index 0000000..46da5d9
--- /dev/null
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/IntListData.java
@@ -0,0 +1,11 @@
+package com.io.yutian.elementoriginlib.item.stat.data;
+
+import java.util.List;
+
+public class IntListData extends ListData {
+
+ public IntListData(List list) {
+ super(list);
+ }
+
+}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/ListData.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/ListData.java
new file mode 100644
index 0000000..5b60ee5
--- /dev/null
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/ListData.java
@@ -0,0 +1,41 @@
+package com.io.yutian.elementoriginlib.item.stat.data;
+
+import com.io.yutian.elementoriginlib.item.stat.Mergeable;
+import com.io.yutian.elementoriginlib.item.stat.StatData;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+public class ListData implements StatData, Mergeable> {
+
+ private List list;
+
+ public ListData(List list) {
+ this.list = list;
+ }
+
+ public List getList() {
+ return list;
+ }
+
+ public void add(V value) {
+ this.list.add(value);
+ }
+
+ @Override
+ public void merge(ListData var1) {
+ this.list.addAll(var1.getList());
+ }
+
+ @NotNull
+ @Override
+ public ListData cloneData() {
+ return new ListData(list);
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return list.isEmpty();
+ }
+
+}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/MapData.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/MapData.java
new file mode 100644
index 0000000..bc4f178
--- /dev/null
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/MapData.java
@@ -0,0 +1,56 @@
+package com.io.yutian.elementoriginlib.item.stat.data;
+
+import com.io.yutian.elementoriginlib.item.stat.Mergeable;
+import com.io.yutian.elementoriginlib.item.stat.StatData;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Map;
+
+public class MapData implements StatData, Mergeable {
+
+ private Map map;
+
+ public MapData(Map map) {
+ this.map = map;
+ }
+
+ public Object get(String key) {
+ return map.get(key);
+ }
+
+ public Object getOrDefault(String key, Object defaultValue) {
+ return map.getOrDefault(key, defaultValue);
+ }
+
+ public void put(String key, Object value) {
+ map.put(key, value);
+ }
+
+ public void remove(String key) {
+ map.remove(key);
+ }
+
+ public boolean containsKey(String key) {
+ return map.containsKey(key);
+ }
+
+ public Map getMap() {
+ return map;
+ }
+
+ @Override
+ public void merge(MapData var1) {
+ this.map.putAll(var1.map);
+ }
+
+ @Override
+ public @NotNull MapData cloneData() {
+ return new MapData(this.map);
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return map.isEmpty();
+ }
+
+}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/StringListData.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/StringListData.java
index e8c6c54..751d775 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/StringListData.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/data/StringListData.java
@@ -6,36 +6,10 @@ import org.jetbrains.annotations.NotNull;
import java.util.List;
-public class StringListData implements StatData, Mergeable {
-
- private List list;
+public class StringListData extends ListData {
public StringListData(List list) {
- this.list = list;
- }
-
- public List getList() {
- return list;
- }
-
- public void add(String str) {
- this.list.add(str);
- }
-
- @Override
- public void merge(StringListData var1) {
- this.list.addAll(var1.getList());
- }
-
- @NotNull
- @Override
- public StringListData cloneData() {
- return new StringListData(list);
- }
-
- @Override
- public boolean isEmpty() {
- return list.isEmpty();
+ super(list);
}
}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/BooleanStat.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/BooleanStat.java
index afe0c05..e2491f0 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/BooleanStat.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/BooleanStat.java
@@ -1,6 +1,7 @@
package com.io.yutian.elementoriginlib.item.stat.type;
-import com.io.yutian.elementoriginlib.item.OriginItemStackBuilder;
+import com.io.yutian.elementoriginlib.exception.itemstat.ItemStatDataLoadException;
+import com.io.yutian.elementoriginlib.item.TagStatItemStackBuilder;
import com.io.yutian.elementoriginlib.item.stat.ItemStat;
import com.io.yutian.elementoriginlib.item.stat.data.BooleanData;
import com.io.yutian.elementoriginlib.tag.TagByte;
@@ -8,6 +9,8 @@ import com.io.yutian.elementoriginlib.tag.ItemProxy;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.Objects;
+
public abstract class BooleanStat extends ItemStat {
public BooleanStat(@NotNull String id, @NotNull String path) {
@@ -15,15 +18,41 @@ public abstract class BooleanStat extends ItemStat {
}
@Override
- public void whenApplied(@NotNull OriginItemStackBuilder itemStackBuilder, @NotNull BooleanData statData) {
- ItemProxy itemProxy = itemStackBuilder.getNBTItem();
- itemProxy.editTag(nbtCompound -> nbtCompound.putByte(getNBTPath(), (byte) (statData.getValue() ? 1 : 0)));
+ public void whenApplied(@NotNull TagStatItemStackBuilder itemStackBuilder, @NotNull BooleanData statData) {
+ ItemProxy itemProxy = itemStackBuilder.getItemProxy();
+ itemProxy.editTag(tagCompound1 -> tagCompound1.putByte(getTagPath(), (byte) (statData.getValue() ? 1 : 0)));
+ }
+
+ @Override
+ public BooleanData loadAsObject(@NotNull Object value) throws ItemStatDataLoadException {
+ if (Objects.isNull(value)) {
+ throw new ItemStatDataLoadException("Invalid value: null");
+ }
+ try {
+ if (value instanceof Boolean bool) {
+ return new BooleanData(bool);
+ } else if (value instanceof String arg) {
+ boolean parsed = Boolean.parseBoolean(arg);
+ if (!arg.equalsIgnoreCase("true") && !arg.equalsIgnoreCase("false")) {
+ throw new ItemStatDataLoadException("Invalid boolean string: " + arg);
+ }
+ return new BooleanData(parsed);
+ } else if (value instanceof Byte b) {
+ return new BooleanData(b == 1);
+ } else if (value instanceof Integer i) {
+ return new BooleanData(i == 1);
+ } else {
+ throw new ItemStatDataLoadException("Invalid boolean value: " + value);
+ }
+ } catch (ClassCastException e) {
+ throw new ItemStatDataLoadException("Invalid type: " + value.getClass(), e);
+ }
}
@Nullable
@Override
- public BooleanData getLoadedNBT(@NotNull ItemProxy itemProxy) {
- return new BooleanData(((TagByte) itemProxy.get(getNBTPath())).getByte() == 1);
+ public BooleanData getLoadedTag(@NotNull ItemProxy itemProxy) {
+ return new BooleanData(((TagByte) itemProxy.get(getTagPath())).getByte() == 1);
}
}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/DoubleListStat.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/DoubleListStat.java
new file mode 100644
index 0000000..468c92f
--- /dev/null
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/DoubleListStat.java
@@ -0,0 +1,98 @@
+package com.io.yutian.elementoriginlib.item.stat.type;
+
+import com.io.yutian.elementoriginlib.exception.itemstat.ItemStatDataLoadException;
+import com.io.yutian.elementoriginlib.item.TagStatItemStackBuilder;
+import com.io.yutian.elementoriginlib.item.stat.ItemStat;
+import com.io.yutian.elementoriginlib.item.stat.data.DoubleListData;
+import com.io.yutian.elementoriginlib.tag.ItemProxy;
+import com.io.yutian.elementoriginlib.tag.TagDouble;
+import com.io.yutian.elementoriginlib.tag.TagList;
+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.Objects;
+
+public abstract class DoubleListStat extends ItemStat {
+
+ public DoubleListStat(@NotNull String id, @NotNull String path) {
+ super(id, path);
+ }
+
+ @Override
+ public void whenApplied(@NotNull TagStatItemStackBuilder itemStackBuilder, @NotNull DoubleListData statData) {
+ ItemProxy itemProxy = itemStackBuilder.getItemProxy();
+ TagList tagList = new TagList<>();
+ statData.getList().forEach(s -> tagList.add(new TagDouble(s)));
+ itemProxy.editTag(tagCompound1 -> tagCompound1.put(getTagPath(), tagList));
+ }
+
+ @Override
+ public DoubleListData loadAsObject(@NotNull Object value) throws ItemStatDataLoadException {
+ if (Objects.isNull(value)) {
+ throw new ItemStatDataLoadException("Invalid value: null");
+ }
+ try {
+ if (value instanceof List> list) {
+ List doubleList = new ArrayList<>();
+ for (Object item : list) {
+ if (item instanceof Double d) {
+ doubleList.add(d);
+ } else if (item instanceof String str) {
+ // 如果是 String,尝试将其解析为 Double
+ try {
+ doubleList.add(Double.parseDouble(str));
+ } catch (NumberFormatException e) {
+ throw new ItemStatDataLoadException("Invalid string value for Double: " + str, e);
+ }
+ } else {
+ throw new ItemStatDataLoadException("List contains non-double element: " + item);
+ }
+ }
+ return new DoubleListData(doubleList);
+ } else if (value instanceof double[] array) {
+ List doubleList = new ArrayList<>();
+ for (double d : array) {
+ doubleList.add(d);
+ }
+ return new DoubleListData(doubleList);
+ } else if (value instanceof Double[] array) {
+ List doubleList = new ArrayList<>(Arrays.asList(array));
+ return new DoubleListData(doubleList);
+ } else if (value instanceof String str) {
+ List doubleList = new ArrayList<>();
+ String[] items = str.split(",");
+ for (String item : items) {
+ try {
+ doubleList.add(Double.parseDouble(item.trim()));
+ } catch (NumberFormatException e) {
+ throw new ItemStatDataLoadException("Invalid number format in string: " + item, e);
+ }
+ }
+ return new DoubleListData(doubleList);
+ } else {
+ throw new ItemStatDataLoadException("Invalid value type for DoubleListData: " + value);
+ }
+ } catch (Exception e) {
+ throw new ItemStatDataLoadException(e);
+ }
+ }
+
+
+ @Nullable
+ @Override
+ public DoubleListData getLoadedTag(@NotNull ItemProxy itemProxy) {
+ if (!itemProxy.has(getTagPath(), TagList.TYPE_ID)) {
+ return new DoubleListData(new ArrayList<>());
+ }
+ TagList tagList = (TagList) itemProxy.get(getTagPath());
+ List list = new ArrayList<>();
+ for (int i = 0; i < tagList.size(); i++) {
+ list.add(tagList.get(i).getDouble());
+ }
+ return new DoubleListData(list);
+ }
+
+}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/DoubleStat.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/DoubleStat.java
index 83de709..c61ea66 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/DoubleStat.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/DoubleStat.java
@@ -1,6 +1,7 @@
package com.io.yutian.elementoriginlib.item.stat.type;
-import com.io.yutian.elementoriginlib.item.OriginItemStackBuilder;
+import com.io.yutian.elementoriginlib.exception.itemstat.ItemStatDataLoadException;
+import com.io.yutian.elementoriginlib.item.TagStatItemStackBuilder;
import com.io.yutian.elementoriginlib.item.stat.ItemStat;
import com.io.yutian.elementoriginlib.item.stat.data.DoubleData;
import com.io.yutian.elementoriginlib.tag.TagDouble;
@@ -8,6 +9,8 @@ import com.io.yutian.elementoriginlib.tag.ItemProxy;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.Objects;
+
public abstract class DoubleStat extends ItemStat {
public DoubleStat(@NotNull String id, @NotNull String path) {
@@ -15,15 +18,43 @@ public abstract class DoubleStat extends ItemStat {
}
@Override
- public void whenApplied(@NotNull OriginItemStackBuilder itemStackBuilder, @NotNull DoubleData statData) {
- ItemProxy itemProxy = itemStackBuilder.getNBTItem();
- itemProxy.editTag(nbtCompound -> nbtCompound.putDouble(getNBTPath(), statData.getValue()));
+ public void whenApplied(@NotNull TagStatItemStackBuilder itemStackBuilder, @NotNull DoubleData statData) {
+ ItemProxy itemProxy = itemStackBuilder.getItemProxy();
+ itemProxy.editTag(tagCompound1 -> tagCompound1.putDouble(getTagPath(), statData.getValue()));
+ }
+
+ @Override
+ public DoubleData loadAsObject(@NotNull Object value) throws ItemStatDataLoadException {
+ if (Objects.isNull(value)) {
+ throw new ItemStatDataLoadException("Invalid value: null");
+ }
+ try {
+ if (value instanceof Double d) {
+ return new DoubleData(d);
+ } else if (value instanceof String arg) {
+ try {
+ return new DoubleData(Double.parseDouble(arg));
+ } catch (NumberFormatException e) {
+ throw new ItemStatDataLoadException("Invalid double string: " + arg, e);
+ }
+ } else if (value instanceof Byte b) {
+ return new DoubleData((double) b);
+ } else if (value instanceof Integer i) {
+ return new DoubleData((double) i);
+ } else if (value instanceof Long l) {
+ return new DoubleData((double) l);
+ } else {
+ throw new ItemStatDataLoadException("Invalid double value: " + value);
+ }
+ } catch (Exception e) {
+ throw new ItemStatDataLoadException(e);
+ }
}
@Nullable
@Override
- public DoubleData getLoadedNBT(@NotNull ItemProxy itemProxy) {
- return new DoubleData(((TagDouble) itemProxy.get(getNBTPath())).getDouble());
+ public DoubleData getLoadedTag(@NotNull ItemProxy itemProxy) {
+ return new DoubleData(((TagDouble) itemProxy.get(getTagPath())).getDouble());
}
}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/EnumListStat.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/EnumListStat.java
new file mode 100644
index 0000000..7148e8b
--- /dev/null
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/EnumListStat.java
@@ -0,0 +1,97 @@
+package com.io.yutian.elementoriginlib.item.stat.type;
+
+import com.io.yutian.elementoriginlib.exception.itemstat.ItemStatDataLoadException;
+import com.io.yutian.elementoriginlib.item.TagStatItemStackBuilder;
+import com.io.yutian.elementoriginlib.item.stat.ItemStat;
+import com.io.yutian.elementoriginlib.item.stat.data.EnumListData;
+import com.io.yutian.elementoriginlib.tag.ItemProxy;
+import com.io.yutian.elementoriginlib.tag.TagList;
+import com.io.yutian.elementoriginlib.tag.TagString;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+
+public abstract class EnumListStat extends ItemStat> {
+
+ private Class clazz;
+
+ public EnumListStat(@NotNull String id, @NotNull String path, Class clazz) {
+ super(id, path);
+ this.clazz = clazz;
+ }
+
+ @Override
+ public void whenApplied(@NotNull TagStatItemStackBuilder itemStackBuilder, @NotNull EnumListData statData) {
+ ItemProxy itemProxy = itemStackBuilder.getItemProxy();
+ TagList tagList = new TagList<>();
+ statData.getList().forEach(s -> tagList.add(new TagString(s.name())));
+ itemProxy.editTag(tagCompound1 -> tagCompound1.put(getTagPath(), tagList));
+ }
+
+ @Override
+ public EnumListData loadAsObject(@NotNull Object value) throws ItemStatDataLoadException {
+ if (Objects.isNull(value)) {
+ throw new ItemStatDataLoadException("Invalid value: null");
+ }
+ try {
+ if (value instanceof List> list) {
+ List enumList = new ArrayList<>();
+ for (Object item : list) {
+ if (item instanceof String str) {
+ try {
+ E enumConstant = (E) Enum.valueOf(clazz, str);
+ enumList.add(enumConstant);
+ } catch (IllegalArgumentException e) {
+ throw new ItemStatDataLoadException("Invalid enum string: " + str, e);
+ }
+ } else if (item instanceof Integer i) {
+ E[] enumConstants = clazz.getEnumConstants();
+ if (i < 0 || i >= enumConstants.length) {
+ throw new ItemStatDataLoadException("Invalid enum ordinal: " + i);
+ }
+ enumList.add(enumConstants[i]);
+ } else if (item instanceof Enum> enumItem) {
+ enumList.add((E) enumItem);
+ } else {
+ throw new ItemStatDataLoadException("Invalid list element type: " + item);
+ }
+ }
+ return new EnumListData<>(enumList);
+ } else if (value instanceof String str) {
+ List enumList = new ArrayList<>();
+ String[] enumNames = str.split(",");
+ for (String enumName : enumNames) {
+ try {
+ E enumConstant = (E) Enum.valueOf(clazz, enumName.trim());
+ enumList.add(enumConstant);
+ } catch (IllegalArgumentException e) {
+ throw new ItemStatDataLoadException("Invalid enum string: " + enumName, e);
+ }
+ }
+ return new EnumListData<>(enumList);
+ } else {
+ throw new ItemStatDataLoadException("Invalid value type for EnumListData: " + value);
+ }
+ } catch (Exception e) {
+ throw new ItemStatDataLoadException(e);
+ }
+ }
+
+ @Override
+ public @Nullable EnumListData getLoadedTag(@NotNull ItemProxy itemProxy) {
+ if (!itemProxy.has(getTagPath(), TagList.TYPE_ID)) {
+ return new EnumListData<>(new ArrayList<>());
+ }
+ TagList tagList = (TagList) itemProxy.get(getTagPath());
+ List list = new ArrayList<>();
+ for (int i = 0; i < tagList.size(); i++) {
+ list.add(Enum.valueOf(clazz, tagList.get(i).getString()));
+ }
+ return new EnumListData(list);
+ }
+
+}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/EnumStat.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/EnumStat.java
new file mode 100644
index 0000000..07630f9
--- /dev/null
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/EnumStat.java
@@ -0,0 +1,63 @@
+package com.io.yutian.elementoriginlib.item.stat.type;
+
+import com.io.yutian.elementoriginlib.exception.itemstat.ItemStatDataLoadException;
+import com.io.yutian.elementoriginlib.item.TagStatItemStackBuilder;
+import com.io.yutian.elementoriginlib.item.stat.ItemStat;
+import com.io.yutian.elementoriginlib.item.stat.data.EnumData;
+import com.io.yutian.elementoriginlib.tag.ItemProxy;
+import com.io.yutian.elementoriginlib.tag.TagString;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Objects;
+
+public abstract class EnumStat extends ItemStat> {
+
+ private Class clazz;
+
+ public EnumStat(@NotNull String id, @NotNull String path, Class clazz) {
+ super(id, path);
+ this.clazz = clazz;
+ }
+
+ @Override
+ public void whenApplied(@NotNull TagStatItemStackBuilder itemStackBuilder, @NotNull EnumData statData) {
+ ItemProxy itemProxy = itemStackBuilder.getItemProxy();
+ itemProxy.editTag(tagCompound1 -> tagCompound1.putString(getTagPath(), statData.getValue().name()));
+ }
+
+ @Override
+ public EnumData loadAsObject(@NotNull Object value) throws ItemStatDataLoadException {
+ if (Objects.isNull(value)) {
+ throw new ItemStatDataLoadException("Invalid value: null");
+ }
+ try {
+ if (value instanceof Enum> enumValue) {
+ return new EnumData<>((E) enumValue);
+ } else if (value instanceof String str) {
+ try {
+ E enumConstant = (E) Enum.valueOf(clazz, str);
+ return new EnumData<>(enumConstant);
+ } catch (IllegalArgumentException e) {
+ throw new ItemStatDataLoadException("Invalid enum string: " + str, e);
+ }
+ } else if (value instanceof Integer i) {
+ E[] enumConstants = clazz.getEnumConstants();
+ if (i < 0 || i >= enumConstants.length) {
+ throw new ItemStatDataLoadException("Invalid enum ordinal: " + i);
+ }
+ return new EnumData<>(enumConstants[i]);
+ } else {
+ throw new ItemStatDataLoadException("Invalid value type for EnumData: " + value);
+ }
+ } catch (Exception e) {
+ throw new ItemStatDataLoadException(e);
+ }
+ }
+
+ @Override
+ public @Nullable EnumData getLoadedTag(@NotNull ItemProxy itemProxy) {
+ return new EnumData(Enum.valueOf(clazz, ((TagString) itemProxy.get(getTagPath())).getString()));
+ }
+
+}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/IntListStat.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/IntListStat.java
new file mode 100644
index 0000000..cb27346
--- /dev/null
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/IntListStat.java
@@ -0,0 +1,86 @@
+package com.io.yutian.elementoriginlib.item.stat.type;
+
+import com.io.yutian.elementoriginlib.exception.itemstat.ItemStatDataLoadException;
+import com.io.yutian.elementoriginlib.item.TagStatItemStackBuilder;
+import com.io.yutian.elementoriginlib.item.stat.ItemStat;
+import com.io.yutian.elementoriginlib.item.stat.data.IntListData;
+import com.io.yutian.elementoriginlib.tag.ItemProxy;
+import com.io.yutian.elementoriginlib.tag.TagInt;
+import com.io.yutian.elementoriginlib.tag.TagList;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+public abstract class IntListStat extends ItemStat {
+
+ public IntListStat(@NotNull String id, @NotNull String path) {
+ super(id, path);
+ }
+
+ @Override
+ public void whenApplied(@NotNull TagStatItemStackBuilder itemStackBuilder, @NotNull IntListData statData) {
+ ItemProxy itemProxy = itemStackBuilder.getItemProxy();
+ TagList tagList = new TagList<>();
+ statData.getList().forEach(s -> tagList.add(new TagInt(s)));
+ itemProxy.editTag(tagCompound1 -> tagCompound1.put(getTagPath(), tagList));
+ }
+
+ @Override
+ public IntListData loadAsObject(@NotNull Object value) throws ItemStatDataLoadException {
+ if (Objects.isNull(value)) {
+ throw new ItemStatDataLoadException("Invalid value: null");
+ }
+ try {
+ if (value instanceof List> list) {
+ List intList = new ArrayList<>();
+ for (Object item : list) {
+ if (item instanceof Integer i) {
+ intList.add(i);
+ } else {
+ throw new ItemStatDataLoadException("List contains non-integer element: " + item);
+ }
+ }
+ return new IntListData(intList);
+ } else if (value instanceof int[] array) {
+ List intList = new ArrayList<>();
+ for (int i : array) {
+ intList.add(i);
+ }
+ return new IntListData(intList);
+ } else if (value instanceof String str) {
+ try {
+ List intList = new ArrayList<>();
+ String[] items = str.split(",");
+ for (String item : items) {
+ intList.add(Integer.parseInt(item.trim()));
+ }
+ return new IntListData(intList);
+ } catch (NumberFormatException e) {
+ throw new ItemStatDataLoadException("Invalid integer string: " + str, e);
+ }
+ } else {
+ throw new ItemStatDataLoadException("Invalid value type for IntListData: " + value);
+ }
+ } catch (Exception e) {
+ throw new ItemStatDataLoadException(e);
+ }
+ }
+
+ @Nullable
+ @Override
+ public IntListData getLoadedTag(@NotNull ItemProxy itemProxy) {
+ if (!itemProxy.has(getTagPath(), TagList.TYPE_ID)) {
+ return new IntListData(new ArrayList<>());
+ }
+ TagList tagList = (TagList) itemProxy.get(getTagPath());
+ List list = new ArrayList<>();
+ for (int i = 0; i < tagList.size(); i++) {
+ list.add(tagList.get(i).getInt());
+ }
+ return new IntListData(list);
+ }
+
+}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/IntStat.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/IntStat.java
index 957fd5f..24aba83 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/IntStat.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/IntStat.java
@@ -1,6 +1,7 @@
package com.io.yutian.elementoriginlib.item.stat.type;
-import com.io.yutian.elementoriginlib.item.OriginItemStackBuilder;
+import com.io.yutian.elementoriginlib.exception.itemstat.ItemStatDataLoadException;
+import com.io.yutian.elementoriginlib.item.TagStatItemStackBuilder;
import com.io.yutian.elementoriginlib.item.stat.ItemStat;
import com.io.yutian.elementoriginlib.item.stat.data.IntData;
import com.io.yutian.elementoriginlib.tag.TagInt;
@@ -8,6 +9,8 @@ import com.io.yutian.elementoriginlib.tag.ItemProxy;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.Objects;
+
public abstract class IntStat extends ItemStat {
public IntStat(@NotNull String id, @NotNull String path) {
@@ -15,15 +18,57 @@ public abstract class IntStat extends ItemStat {
}
@Override
- public void whenApplied(@NotNull OriginItemStackBuilder itemStackBuilder, @NotNull IntData statData) {
- ItemProxy itemProxy = itemStackBuilder.getNBTItem();
- itemProxy.editTag(nbtCompound -> nbtCompound.putInt(getNBTPath(), statData.getInt()));
+ public void whenApplied(@NotNull TagStatItemStackBuilder itemStackBuilder, @NotNull IntData statData) {
+ ItemProxy itemProxy = itemStackBuilder.getItemProxy();
+ itemProxy.editTag(tagCompound1 -> tagCompound1.putInt(getTagPath(), statData.getInt()));
}
+ @Override
+ public IntData loadAsObject(@NotNull Object value) throws ItemStatDataLoadException {
+ if (Objects.isNull(value)) {
+ throw new ItemStatDataLoadException("Invalid value: null");
+ }
+ try {
+ if (value instanceof Integer i) {
+ return new IntData(i);
+ } else if (value instanceof String arg) {
+ try {
+ return new IntData(Integer.parseInt(arg));
+ } catch (NumberFormatException e) {
+ throw new ItemStatDataLoadException("Invalid integer string: " + arg, e);
+ }
+ } else if (value instanceof Byte b) {
+ return new IntData((int) b);
+ } else if (value instanceof Long l) {
+ if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE) {
+ throw new ItemStatDataLoadException("Long value out of range for integer: " + l);
+ }
+ return new IntData(l.intValue());
+ } else if (value instanceof Double d) {
+ if (d < Integer.MIN_VALUE || d > Integer.MAX_VALUE) {
+ throw new ItemStatDataLoadException("Double value out of range for integer: " + d);
+ }
+ return new IntData((int) d.doubleValue());
+ } else if (value instanceof Float f) {
+ if (f < Integer.MIN_VALUE || f > Integer.MAX_VALUE) {
+ throw new ItemStatDataLoadException("Float value out of range for integer: " + f);
+ }
+ return new IntData((int) f.floatValue());
+ } else {
+ throw new ItemStatDataLoadException("Invalid integer value: " + value);
+ }
+ } catch (Exception e) {
+ throw new ItemStatDataLoadException(e);
+ }
+ }
+
+
+
+
@Nullable
@Override
- public IntData getLoadedNBT(@NotNull ItemProxy itemProxy) {
- return new IntData(((TagInt) itemProxy.get(getNBTPath())).getInt());
+ public IntData getLoadedTag(@NotNull ItemProxy itemProxy) {
+ return new IntData(((TagInt) itemProxy.get(getTagPath())).getInt());
}
}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/MapStat.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/MapStat.java
new file mode 100644
index 0000000..54c5c36
--- /dev/null
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/MapStat.java
@@ -0,0 +1,68 @@
+package com.io.yutian.elementoriginlib.item.stat.type;
+
+import com.io.yutian.elementoriginlib.exception.itemstat.ItemStatDataLoadException;
+import com.io.yutian.elementoriginlib.item.TagStatItemStackBuilder;
+import com.io.yutian.elementoriginlib.item.stat.ItemStat;
+import com.io.yutian.elementoriginlib.item.stat.data.MapData;
+import com.io.yutian.elementoriginlib.tag.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+public class MapStat extends ItemStat {
+
+ public MapStat(@NotNull String id, @NotNull String path) {
+ super(id, path);
+ }
+
+ @Override
+ public void whenApplied(@NotNull TagStatItemStackBuilder itemStackBuilder, @NotNull MapData statData) {
+ ItemProxy itemProxy = itemStackBuilder.getItemProxy();
+ TagCompound tagCompound = new TagCompound();
+ for (Map.Entry entry : statData.getMap().entrySet()) {
+ tagCompound.put(entry.getKey(), ITag.asObject(entry.getValue()));
+ }
+ itemProxy.editTag(tagCompound1 -> tagCompound1.put(getTagPath(), tagCompound));
+ }
+
+ @Override
+ public MapData loadAsObject(@NotNull Object value) throws ItemStatDataLoadException {
+ if (Objects.isNull(value)) {
+ throw new ItemStatDataLoadException("Invalid value: null");
+ }
+ try {
+ if (value instanceof Map, ?> map) {
+ Map resultMap = new HashMap<>();
+ for (Map.Entry, ?> entry : map.entrySet()) {
+ if (entry.getKey() instanceof String key) {
+ resultMap.put(key, entry.getValue());
+ } else {
+ throw new ItemStatDataLoadException("Map key is not a String: " + entry.getKey());
+ }
+ }
+ return new MapData(resultMap);
+ } else {
+ throw new ItemStatDataLoadException("Invalid value type for MapData: " + value);
+ }
+ } catch (Exception e) {
+ throw new ItemStatDataLoadException(e);
+ }
+ }
+
+ @Override
+ public @Nullable MapData getLoadedTag(@NotNull ItemProxy itemProxy) {
+ if (!itemProxy.has(getTagPath(), TagCompound.TYPE_ID)) {
+ return new MapData(new HashMap<>());
+ }
+ TagCompound tagCompound = (TagCompound) itemProxy.get(getTagPath());
+ Map map = new HashMap<>();
+ for (Map.Entry entry : tagCompound.getMap().entrySet()) {
+ map.put(entry.getKey(), entry.getValue().getValue());
+ }
+ return new MapData(map);
+ }
+
+}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/StringListStat.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/StringListStat.java
index 8ffe9b6..f8149c1 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/StringListStat.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/StringListStat.java
@@ -1,6 +1,7 @@
package com.io.yutian.elementoriginlib.item.stat.type;
-import com.io.yutian.elementoriginlib.item.OriginItemStackBuilder;
+import com.io.yutian.elementoriginlib.exception.itemstat.ItemStatDataLoadException;
+import com.io.yutian.elementoriginlib.item.TagStatItemStackBuilder;
import com.io.yutian.elementoriginlib.item.stat.ItemStat;
import com.io.yutian.elementoriginlib.item.stat.data.StringListData;
import com.io.yutian.elementoriginlib.tag.ItemProxy;
@@ -10,7 +11,9 @@ 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.Objects;
public abstract class StringListStat extends ItemStat {
@@ -19,20 +22,52 @@ public abstract class StringListStat extends ItemStat {
}
@Override
- public void whenApplied(@NotNull OriginItemStackBuilder itemStackBuilder, @NotNull StringListData statData) {
- ItemProxy itemProxy = itemStackBuilder.getNBTItem();
+ public void whenApplied(@NotNull TagStatItemStackBuilder itemStackBuilder, @NotNull StringListData statData) {
+ ItemProxy itemProxy = itemStackBuilder.getItemProxy();
TagList tagList = new TagList<>();
statData.getList().forEach(s -> tagList.add(new TagString(s)));
- itemProxy.editTag(nbtCompound -> nbtCompound.put(getNBTPath(), tagList));
+ itemProxy.editTag(tagCompound1 -> tagCompound1.put(getTagPath(), tagList));
}
+ @Override
+ public StringListData loadAsObject(@NotNull Object value) throws ItemStatDataLoadException {
+ if (Objects.isNull(value)) {
+ throw new ItemStatDataLoadException("Invalid value: null");
+ }
+ try {
+ if (value instanceof List> list) {
+ List stringList = new ArrayList<>();
+ for (Object item : list) {
+ if (item instanceof String str) {
+ stringList.add(str);
+ } else {
+ throw new ItemStatDataLoadException("List contains non-string element: " + item);
+ }
+ }
+ return new StringListData(stringList);
+ } else if (value instanceof String[] array) {
+ // 处理 String[] 类型
+ return new StringListData(Arrays.asList(array));
+ } else if (value instanceof String str) {
+ List stringList = new ArrayList<>();
+ stringList.add(str);
+ return new StringListData(stringList);
+ } else {
+ throw new ItemStatDataLoadException("Invalid value type for StringListData: " + value);
+ }
+ } catch (Exception e) {
+ throw new ItemStatDataLoadException(e);
+ }
+ }
+
+
@Nullable
@Override
- public StringListData getLoadedNBT(@NotNull ItemProxy itemProxy) {
- if (!itemProxy.has(getNBTPath(), TagList.TYPE_ID)) {
+ public StringListData getLoadedTag(@NotNull ItemProxy itemProxy) {
+ if (!itemProxy.has(getTagPath(), TagList.TYPE_ID)) {
return new StringListData(new ArrayList<>());
}
- TagList tagList = (TagList) itemProxy.get(getNBTPath());
+ TagList tagList = (TagList) itemProxy.get(getTagPath());
List list = new ArrayList<>();
for (int i = 0; i < tagList.size(); i++) {
list.add(tagList.get(i).getString());
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/StringStat.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/StringStat.java
index 76ff50c..bf3e739 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/StringStat.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/StringStat.java
@@ -1,6 +1,7 @@
package com.io.yutian.elementoriginlib.item.stat.type;
-import com.io.yutian.elementoriginlib.item.OriginItemStackBuilder;
+import com.io.yutian.elementoriginlib.exception.itemstat.ItemStatDataLoadException;
+import com.io.yutian.elementoriginlib.item.TagStatItemStackBuilder;
import com.io.yutian.elementoriginlib.item.stat.ItemStat;
import com.io.yutian.elementoriginlib.item.stat.data.StringData;
import com.io.yutian.elementoriginlib.tag.ItemProxy;
@@ -8,6 +9,8 @@ import com.io.yutian.elementoriginlib.tag.TagString;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.Objects;
+
public abstract class StringStat extends ItemStat {
public StringStat(@NotNull String id, @NotNull String path) {
@@ -15,16 +18,23 @@ public abstract class StringStat extends ItemStat {
}
@Override
- public void whenApplied(@NotNull OriginItemStackBuilder itemStackBuilder, @NotNull StringData statData) {
- ItemProxy itemProxy = itemStackBuilder.getNBTItem();
- itemProxy.editTag(nbtCompound -> nbtCompound.putString(getNBTPath(), statData.getString()));
+ public void whenApplied(@NotNull TagStatItemStackBuilder itemStackBuilder, @NotNull StringData statData) {
+ ItemProxy itemProxy = itemStackBuilder.getItemProxy();
+ itemProxy.editTag(tagCompound1 -> tagCompound1.putString(getTagPath(), statData.getString()));
}
+ @Override
+ public StringData loadAsObject(@NotNull Object value) {
+ if (Objects.isNull(value)) {
+ throw new ItemStatDataLoadException("Invalid value: null");
+ }
+ return new StringData(value.toString());
+ }
@Nullable
@Override
- public StringData getLoadedNBT(@NotNull ItemProxy itemProxy) {
- return new StringData(((TagString) itemProxy.get(getNBTPath())).getString());
+ public StringData getLoadedTag(@NotNull ItemProxy itemProxy) {
+ return new StringData(((TagString) itemProxy.get(getTagPath())).getString());
}
}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/UUIDStat.java b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/UUIDStat.java
index 54949c2..a3c5954 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/UUIDStat.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/item/stat/type/UUIDStat.java
@@ -1,6 +1,7 @@
package com.io.yutian.elementoriginlib.item.stat.type;
-import com.io.yutian.elementoriginlib.item.OriginItemStackBuilder;
+import com.io.yutian.elementoriginlib.exception.itemstat.ItemStatDataLoadException;
+import com.io.yutian.elementoriginlib.item.TagStatItemStackBuilder;
import com.io.yutian.elementoriginlib.item.stat.ItemStat;
import com.io.yutian.elementoriginlib.item.stat.data.UUIDData;
import com.io.yutian.elementoriginlib.tag.ItemProxy;
@@ -8,6 +9,7 @@ import com.io.yutian.elementoriginlib.tag.TagString;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.Objects;
import java.util.UUID;
public abstract class UUIDStat extends ItemStat {
@@ -17,15 +19,37 @@ public abstract class UUIDStat extends ItemStat {
}
@Override
- public void whenApplied(@NotNull OriginItemStackBuilder itemStackBuilder, @NotNull UUIDData statData) {
- ItemProxy itemProxy = itemStackBuilder.getNBTItem();
- itemProxy.editTag(nbtCompound -> nbtCompound.putString(getNBTPath(), statData.getUUID().toString()));
+ public void whenApplied(@NotNull TagStatItemStackBuilder itemStackBuilder, @NotNull UUIDData statData) {
+ ItemProxy itemProxy = itemStackBuilder.getItemProxy();
+ itemProxy.editTag(tagCompound1 -> tagCompound1.putString(getTagPath(), statData.getUUID().toString()));
+ }
+
+ @Override
+ public UUIDData loadAsObject(@NotNull Object value) throws ItemStatDataLoadException {
+ if (Objects.isNull(value)) {
+ throw new ItemStatDataLoadException("Invalid value: null");
+ }
+ try {
+ if (value instanceof UUID uuid) {
+ return new UUIDData(uuid);
+ } else if (value instanceof String str) {
+ try {
+ return new UUIDData(UUID.fromString(str));
+ } catch (IllegalArgumentException e) {
+ throw new ItemStatDataLoadException("Invalid UUID string: " + str, e);
+ }
+ } else {
+ throw new ItemStatDataLoadException("Invalid UUID value: " + value);
+ }
+ } catch (Exception e) {
+ throw new ItemStatDataLoadException(e);
+ }
}
@Nullable
@Override
- public UUIDData getLoadedNBT(@NotNull ItemProxy itemProxy) {
- return new UUIDData(UUID.fromString(((TagString) itemProxy.get(getNBTPath())).getString()));
+ public UUIDData getLoadedTag(@NotNull ItemProxy itemProxy) {
+ return new UUIDData(UUID.fromString(((TagString) itemProxy.get(getTagPath())).getString()));
}
}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/logger/Logger.java b/src/main/java/com/io/yutian/elementoriginlib/logger/Logger.java
index a6c4ac9..84c0c7d 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/logger/Logger.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/logger/Logger.java
@@ -2,6 +2,8 @@ package com.io.yutian.elementoriginlib.logger;
import org.bukkit.Bukkit;
+import java.io.PrintWriter;
+import java.io.StringWriter;
import java.util.logging.Level;
public class Logger {
@@ -44,14 +46,38 @@ public class Logger {
Bukkit.getLogger().warning(getPrefix("WARN") + msg);
}
+ public void warn(String msg, Throwable throwable) {
+ Bukkit.getLogger().severe(getPrefix("WARN") + msg);
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ throwable.printStackTrace(pw);
+ Bukkit.getLogger().severe(sw.toString());
+ }
+
public void error(String msg) {
Bukkit.getLogger().log(Level.SEVERE, getPrefix("ERROR") + msg);
}
+ public void error(String msg, Throwable throwable) {
+ Bukkit.getLogger().severe(getPrefix("ERROR") + msg);
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ throwable.printStackTrace(pw);
+ Bukkit.getLogger().severe(sw.toString());
+ }
+
public void fatal(String msg) {
Bukkit.getLogger().log(Level.SEVERE, "[!!!] "+getPrefix("FATAL") + msg);
}
+ public void fatal(String msg, Throwable throwable) {
+ Bukkit.getLogger().severe("[!!!] "+getPrefix("FATAL") + msg);
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw);
+ throwable.printStackTrace(pw);
+ Bukkit.getLogger().severe(sw.toString());
+ }
+
public void debug(String msg) {
Bukkit.getLogger().finer(getPrefix("DEBUG") + msg);
}
diff --git a/src/main/java/com/io/yutian/elementoriginlib/manager/CommandManager.java b/src/main/java/com/io/yutian/elementoriginlib/manager/CommandManager.java
index 88ed6f5..94fa183 100644
--- a/src/main/java/com/io/yutian/elementoriginlib/manager/CommandManager.java
+++ b/src/main/java/com/io/yutian/elementoriginlib/manager/CommandManager.java
@@ -2,15 +2,17 @@ package com.io.yutian.elementoriginlib.manager;
import com.io.yutian.elementoriginlib.command.SimpleCommandManager;
import com.io.yutian.elementoriginlib.command.list.CommandHelp;
-import com.io.yutian.elementoriginlib.command.list.CommandTest;
+import com.io.yutian.elementoriginlib.command.list.CommandReload;
import org.bukkit.plugin.Plugin;
public class CommandManager extends SimpleCommandManager {
- public CommandManager(Plugin plugin) {
- super(plugin, "elementoriginlib");
- register(new CommandHelp(this, "help"));
- register(new CommandTest());
+ public static final CommandManager INSTANCE = new CommandManager();
+
+ public CommandManager() {
+ super("ElementOriginLib");
+ register(new CommandHelp(this));
+ register(new CommandReload());
}
}
diff --git a/src/main/resources/lang.yml b/src/main/resources/lang.yml
index 21e823c..8821450 100644
--- a/src/main/resources/lang.yml
+++ b/src/main/resources/lang.yml
@@ -8,8 +8,11 @@ command:
player-no-online: "&f玩家 &e$0 &f不存在或不在线"
no-permission: "&f你没有执行该命令的权限"
help:
- description: "获得指令帮助"
- page-error: "页码错误"
+ description: "&f获得指令帮助"
+ page-error: "&c页码错误"
+ reload:
+ description: "&f重载配置文件"
+ success: "&a成功重载配置文件"
playerchatinput:
timeout: "&c输入超时"
cancel: "&c输入已取消"
\ No newline at end of file