From ebd5431294df03f9054bc53e9030e3d25bbfd7fa Mon Sep 17 00:00:00 2001 From: YuTian <2953516620@qq.com> Date: Tue, 28 Jan 2025 23:44:33 +0800 Subject: [PATCH] new-1.1 --- pom.xml | 1 - .../elementoriginlib/ElementOriginLib.java | 24 ++--- .../command/SimpleCommandManager.java | 9 +- .../command/handler/CommandHandler.java | 4 - .../command/list/CommandHelp.java | 16 +-- .../command/list/CommandReload.java | 20 ++++ .../command/list/CommandTest.java | 48 --------- .../datasync/DataSyncHelper.java | 4 +- .../itemstat/ItemStatDataLoadException.java | 21 ++++ .../{OriginItem.java => TagStatItem.java} | 18 ++-- ...lder.java => TagStatItemStackBuilder.java} | 31 +++--- .../elementoriginlib/item/stat/ItemStat.java | 34 ++++--- .../elementoriginlib/item/stat/ItemStats.java | 7 +- .../elementoriginlib/item/stat/StatData.java | 2 +- .../item/stat/data/DoubleData.java | 1 + .../item/stat/data/DoubleListData.java | 11 +++ .../item/stat/data/EnumData.java | 48 +++++++++ .../item/stat/data/EnumListData.java | 13 +++ .../item/stat/data/IntListData.java | 11 +++ .../item/stat/data/ListData.java | 41 ++++++++ .../item/stat/data/MapData.java | 56 +++++++++++ .../item/stat/data/StringListData.java | 30 +----- .../item/stat/type/BooleanStat.java | 41 ++++++-- .../item/stat/type/DoubleListStat.java | 98 +++++++++++++++++++ .../item/stat/type/DoubleStat.java | 43 ++++++-- .../item/stat/type/EnumListStat.java | 97 ++++++++++++++++++ .../item/stat/type/EnumStat.java | 63 ++++++++++++ .../item/stat/type/IntListStat.java | 86 ++++++++++++++++ .../item/stat/type/IntStat.java | 57 +++++++++-- .../item/stat/type/MapStat.java | 68 +++++++++++++ .../item/stat/type/StringListStat.java | 49 ++++++++-- .../item/stat/type/StringStat.java | 22 +++-- .../item/stat/type/UUIDStat.java | 36 +++++-- .../elementoriginlib/logger/Logger.java | 26 +++++ .../manager/CommandManager.java | 12 ++- src/main/resources/lang.yml | 7 +- 36 files changed, 961 insertions(+), 194 deletions(-) create mode 100644 src/main/java/com/io/yutian/elementoriginlib/command/list/CommandReload.java delete mode 100644 src/main/java/com/io/yutian/elementoriginlib/command/list/CommandTest.java create mode 100644 src/main/java/com/io/yutian/elementoriginlib/exception/itemstat/ItemStatDataLoadException.java rename src/main/java/com/io/yutian/elementoriginlib/item/{OriginItem.java => TagStatItem.java} (84%) rename src/main/java/com/io/yutian/elementoriginlib/item/{OriginItemStackBuilder.java => TagStatItemStackBuilder.java} (51%) create mode 100644 src/main/java/com/io/yutian/elementoriginlib/item/stat/data/DoubleListData.java create mode 100644 src/main/java/com/io/yutian/elementoriginlib/item/stat/data/EnumData.java create mode 100644 src/main/java/com/io/yutian/elementoriginlib/item/stat/data/EnumListData.java create mode 100644 src/main/java/com/io/yutian/elementoriginlib/item/stat/data/IntListData.java create mode 100644 src/main/java/com/io/yutian/elementoriginlib/item/stat/data/ListData.java create mode 100644 src/main/java/com/io/yutian/elementoriginlib/item/stat/data/MapData.java create mode 100644 src/main/java/com/io/yutian/elementoriginlib/item/stat/type/DoubleListStat.java create mode 100644 src/main/java/com/io/yutian/elementoriginlib/item/stat/type/EnumListStat.java create mode 100644 src/main/java/com/io/yutian/elementoriginlib/item/stat/type/EnumStat.java create mode 100644 src/main/java/com/io/yutian/elementoriginlib/item/stat/type/IntListStat.java create mode 100644 src/main/java/com/io/yutian/elementoriginlib/item/stat/type/MapStat.java 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 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