diff --git a/.examples/backpacks/miner.yml b/.examples/backpacks/miner.yml index 559fdf2..0cf8deb 100644 --- a/.examples/backpacks/miner.yml +++ b/.examples/backpacks/miner.yml @@ -1,7 +1,7 @@ name: "&c&l矿业仓库" capacity: - default: 1000 + default: 0 # 若为0则默认不可以使用该仓库 permissions: - "ub.miner.vip:5000" diff --git a/README.md b/README.md index 90f4351..edd14f9 100644 --- a/README.md +++ b/README.md @@ -44,9 +44,36 @@ 展开查看所有子指令 ```text +# sell <背包ID> <物品ID> <数量> +@ 玩家指令 (UltraBackpack.Command.Sell) +- 售出对应数量的对应物品。 +- 该指令受到玩家每日售出数量的限制。 + +# sellAll [背包ID] [物品ID] +@ 玩家指令 (UltraBackpack.Command.SellAll) +- 售出所有相关物品。 +- 该指令受到玩家每日售出数量的限制。 +# info <玩家> [背包ID] [物品ID] +@ 管理指令 (UltraBackpack.admin) +- 得到玩家的相关物品信息。 +# add <玩家> <背包ID> <物品ID> <数量> +@ 管理指令 (UltraBackpack.admin) +- 为玩家添加对应背包中对于物品的数量。 + +# remove <玩家> <背包ID> <物品ID> <数量> +@ 管理指令 (UltraBackpack.admin) +- 为玩家减少对应背包中对于物品的数量。 + +# sell <玩家> [背包ID] [物品ID] [数量] +@ 管理指令 (UltraBackpack.admin) +- 为玩家售出相关物品。 +- 若不填写数量,则售出所有对应背包的对应物品。 +- 若不填写物品,则售出对应背包内所有物品。 +- 若不填写背包,则售出所有背包内所有物品。 +- 该指令受到玩家每日售出数量的限制。 ``` @@ -58,15 +85,28 @@
展开查看所有变量 -```yaml +```text +# %UltraBackpack_amount_<背包ID>_<物品ID>% +- 得到对应背包内对应物品的数量 +# %UltraBackpack_price_<背包ID>_<物品ID>% +- 得到对应背包内对应物品的价格 + +# %UltraBackpack_sold_<背包ID>_<物品ID>% +- 得到对应背包内对应物品的今日售出数量 + +# %UltraBackpack_limit_<背包ID>_<物品ID>% +- 得到对应背包内对应物品的每日售出限制 + +# %UltraBackpack_remain_<背包ID>_<物品ID>% +- 得到对应背包内对应物品的剩余可售出数量 +- $剩余可售出数量 = $每日售出限制 - $今日售出数量 ```
## 插件权限 - ## 配置文件 ### [插件配置文件](ultrabackpack-plugin/src/main/resources/config.yml) (config.yml) @@ -92,7 +132,6 @@ - ## 支持与捐赠 若您觉得本插件做的不错,您可以捐赠支持我! diff --git a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/UltraBackpackAPI.java b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/UltraBackpackAPI.java index 93d4876..d362b35 100644 --- a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/UltraBackpackAPI.java +++ b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/UltraBackpackAPI.java @@ -1,4 +1,17 @@ package cc.carm.plugin.ultrabackpack.api; +import cc.carm.plugin.ultrabackpack.api.manager.UBUserManager; + public class UltraBackpackAPI { + + private static UBUserManager userManager; + + public static void initialize(UBUserManager userManager) { + UltraBackpackAPI.userManager = userManager; + } + + public static UBUserManager getUserManager() { + return userManager; + } + } diff --git a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/backpack/BackpackCapacity.java b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/backpack/BackpackCapacity.java deleted file mode 100644 index 6e4a6a2..0000000 --- a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/backpack/BackpackCapacity.java +++ /dev/null @@ -1,12 +0,0 @@ -package cc.carm.plugin.ultrabackpack.api.configuration.backpack; - -import java.util.Map; - -public interface BackpackCapacity { - - - int getDefault(); - - Map getPermissions(); - -} diff --git a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/backpack/BackpackConfiguration.java b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/backpack/BackpackConfiguration.java deleted file mode 100644 index 8b71662..0000000 --- a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/backpack/BackpackConfiguration.java +++ /dev/null @@ -1,24 +0,0 @@ -package cc.carm.plugin.ultrabackpack.api.configuration.backpack; - -import cc.carm.plugin.ultrabackpack.api.configuration.gui.GUIConfiguration; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.util.Map; - -public interface BackpackConfiguration { - - @NotNull String getIdentifier(); - - @NotNull String getName(); - - @NotNull GUIConfiguration getGUIConfiguration(); - - @NotNull BackpackCapacity getCapacity(); - - int getCapacityFor(Player player); - - @NotNull Map getItems(); - - -} diff --git a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/backpack/BackpackItem.java b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/backpack/BackpackItem.java deleted file mode 100644 index 58a8686..0000000 --- a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/backpack/BackpackItem.java +++ /dev/null @@ -1,23 +0,0 @@ -package cc.carm.plugin.ultrabackpack.api.configuration.backpack; - -import org.bukkit.Material; - -import java.util.List; - -public interface BackpackItem { - - Material getMaterial(); - - int getData(); - - int getSoldLimit(); - - int getSoldPrice(); - - int getDisplaySlot(); - - String getDisplayName(); - - List getDisplayLore(); - -} diff --git a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/gui/GUIAction.java b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/gui/GUIAction.java deleted file mode 100644 index e69c22c..0000000 --- a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/gui/GUIAction.java +++ /dev/null @@ -1,27 +0,0 @@ -package cc.carm.plugin.ultrabackpack.api.configuration.gui; - -import org.bukkit.event.inventory.ClickType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public interface GUIAction { - - enum ActionType { - - COMMAND, - CONSOLE, - MESSAGE, - SOUND, - CLOSE - - } - - @Nullable ClickType getClickType(); - - @NotNull ActionType getActionType(); - - @NotNull String getActionContent(); - - void executeAction(); - -} diff --git a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/gui/GUIConfiguration.java b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/gui/GUIConfiguration.java deleted file mode 100644 index 209dc0b..0000000 --- a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/gui/GUIConfiguration.java +++ /dev/null @@ -1,14 +0,0 @@ -package cc.carm.plugin.ultrabackpack.api.configuration.gui; - -import java.util.Map; - -public interface GUIConfiguration { - - - String getTitle(); - - int getLines(); - - Map getItems(); - -} diff --git a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/gui/GUIItemDetail.java b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/gui/GUIItemDetail.java deleted file mode 100644 index 862b47d..0000000 --- a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/configuration/gui/GUIItemDetail.java +++ /dev/null @@ -1,15 +0,0 @@ -package cc.carm.plugin.ultrabackpack.api.configuration.gui; - -import org.bukkit.inventory.ItemStack; - -import java.util.List; - -public interface GUIItemDetail { - - - ItemStack getIcon(); - - List getActions(); - - -} diff --git a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/data/UBContentsData.java b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/data/UBContentsData.java index c6117b3..65ff6fe 100644 --- a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/data/UBContentsData.java +++ b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/data/UBContentsData.java @@ -1,25 +1,27 @@ package cc.carm.plugin.ultrabackpack.api.data; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + import java.util.HashMap; import java.util.Map; public class UBContentsData { - private final Map contents; + private final Map<@NotNull String, @NotNull UBItemData> contents; - public UBContentsData(Map contents) { + public UBContentsData(Map<@NotNull String, @NotNull UBItemData> contents) { this.contents = contents; } - public Map getContents() { + public @NotNull Map getContents() { return this.contents; } - public UBItemData getItemData(String itemType) { + public @Nullable UBItemData getItemData(@NotNull String itemType) { return getContents().get(itemType); } - public static UBContentsData emptyContents() { return new UBContentsData(new HashMap<>()); } diff --git a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/data/UBItemData.java b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/data/UBItemData.java index 3866241..f0b6aff 100644 --- a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/data/UBItemData.java +++ b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/data/UBItemData.java @@ -18,6 +18,14 @@ public class UBItemData { return sold; } + public void setAmount(int amount) { + this.amount = Math.max(0, amount); + } + + public void setSold(int sold) { + this.sold = Math.max(0, sold); + } + public void clearSold() { this.sold = 0; } diff --git a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/data/UBUserData.java b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/data/UBUserData.java index 6a5e0b5..45eed17 100644 --- a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/data/UBUserData.java +++ b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/data/UBUserData.java @@ -16,15 +16,29 @@ public interface UBUserData { @NotNull Set getBackpackIDs(); - int getItemAmount(String backpackID, String typeID); + @Nullable UBItemData getItemData(@NotNull String backpackID, @NotNull String typeID); - int getItemSold(String backpackID, String typeID); + @Nullable Integer getItemAmount(@NotNull String backpackID, @NotNull String typeID); - Date getDataDay(); + @Nullable Integer getItemSold(@NotNull String backpackID, @NotNull String typeID); + + @Nullable Integer setItemAmount(@NotNull String backpackID, @NotNull String typeID, int amount); + + @Nullable Integer setItemSold(@NotNull String backpackID, @NotNull String typeID, int amount); + + @Nullable Integer addItemAmount(@NotNull String backpackID, @NotNull String typeID, int amount); + + @Nullable Integer addItemSold(@NotNull String backpackID, @NotNull String typeID, int amount); + + @Nullable Integer removeItemAmount(@NotNull String backpackID, @NotNull String typeID, int amount); + + @Nullable Integer removeItemSold(@NotNull String backpackID, @NotNull String typeID, int amount); + + Date getDate(); boolean isCurrentDay(); - void updateDate(); + void checkoutDate(); void save() throws Exception; diff --git a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/manager/UBUserManager.java b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/manager/UBUserManager.java index 89857de..67ea574 100644 --- a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/manager/UBUserManager.java +++ b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/manager/UBUserManager.java @@ -16,7 +16,7 @@ public interface UBUserManager { UBUserData getData(@NotNull Player player); @NotNull - UBUserData loaData(@NotNull UUID userUUID); + UBUserData loadData(@NotNull UUID userUUID); } diff --git a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/storage/UBStorage.java b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/storage/UBStorage.java deleted file mode 100644 index e74f8c1..0000000 --- a/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/storage/UBStorage.java +++ /dev/null @@ -1,18 +0,0 @@ -package cc.carm.plugin.ultrabackpack.api.storage; - -import cc.carm.plugin.ultrabackpack.api.data.UBUserData; -import org.jetbrains.annotations.NotNull; - -import java.util.UUID; - -public interface UBStorage { - - - boolean initialize(); - - @NotNull - UBUserData loadData(@NotNull UUID uuid) throws Exception; - - void saveUserData(@NotNull UBUserData data) throws Exception; - -} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/ColorParser.java b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/util/ColorParser.java similarity index 95% rename from ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/ColorParser.java rename to ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/util/ColorParser.java index 59f44da..4cf32bb 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/ColorParser.java +++ b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/util/ColorParser.java @@ -1,5 +1,5 @@ -package cc.carm.plugin.ultrabackpack.util; +package cc.carm.plugin.ultrabackpack.api.util; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/ItemStackFactory.java b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/util/ItemStackFactory.java similarity index 98% rename from ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/ItemStackFactory.java rename to ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/util/ItemStackFactory.java index 97c1199..bf6f823 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/ItemStackFactory.java +++ b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/util/ItemStackFactory.java @@ -1,4 +1,4 @@ -package cc.carm.plugin.ultrabackpack.util; +package cc.carm.plugin.ultrabackpack.api.util; import org.bukkit.Material; diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/MessageUtil.java b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/util/MessageUtil.java similarity index 85% rename from ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/MessageUtil.java rename to ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/util/MessageUtil.java index 7c1e074..8a17053 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/MessageUtil.java +++ b/ultrabackpack-api/src/main/java/cc/carm/plugin/ultrabackpack/api/util/MessageUtil.java @@ -1,5 +1,6 @@ -package cc.carm.plugin.ultrabackpack.util; +package cc.carm.plugin.ultrabackpack.api.util; +import cc.carm.plugin.ultrabackpack.api.util.ColorParser; import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; @@ -31,11 +32,7 @@ public class MessageUtil { public static void sendWithPlaceholders(@Nullable CommandSender sender, List messages) { if (messages == null || messages.isEmpty() || sender == null) return; - if (hasPlaceholderAPI() && sender instanceof Player) { - send(sender, PlaceholderAPI.setPlaceholders((Player) sender, messages)); - } else { - send(sender, messages); - } + send(sender, setPlaceholders(sender, messages)); } public static void sendWithPlaceholders(@Nullable CommandSender sender, List messages, String param, Object value) { @@ -46,6 +43,15 @@ public class MessageUtil { sendWithPlaceholders(sender, setCustomParams(messages, params, values)); } + public static List setPlaceholders(@Nullable CommandSender sender, List messages) { + if (messages == null || messages.isEmpty() || sender == null) return messages; + if (hasPlaceholderAPI() && sender instanceof Player) { + return PlaceholderAPI.setPlaceholders((Player) sender, messages); + } else { + return messages; + } + } + public static List setCustomParams(List messages, String param, Object value) { return setCustomParams(messages, new String[]{param}, new Object[]{value}); } diff --git a/ultrabackpack-plugin/pom.xml b/ultrabackpack-plugin/pom.xml index c6a690b..bbdd8a9 100644 --- a/ultrabackpack-plugin/pom.xml +++ b/ultrabackpack-plugin/pom.xml @@ -73,7 +73,7 @@ cc.carm.lib easysql-beecp - 0.2.2 + 0.2.3 compile diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/Main.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/Main.java index c4124d6..c12e47e 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/Main.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/Main.java @@ -1,8 +1,19 @@ package cc.carm.plugin.ultrabackpack; +import cc.carm.plugin.ultrabackpack.api.UltraBackpackAPI; +import cc.carm.plugin.ultrabackpack.api.util.ColorParser; +import cc.carm.plugin.ultrabackpack.api.util.MessageUtil; import cc.carm.plugin.ultrabackpack.configuration.PluginConfig; +import cc.carm.plugin.ultrabackpack.listener.CollectListener; +import cc.carm.plugin.ultrabackpack.listener.UserListener; +import cc.carm.plugin.ultrabackpack.manager.BackpackManager; import cc.carm.plugin.ultrabackpack.manager.ConfigManager; -import cc.carm.plugin.ultrabackpack.util.ColorParser; +import cc.carm.plugin.ultrabackpack.manager.EconomyManager; +import cc.carm.plugin.ultrabackpack.manager.UserManager; +import cc.carm.plugin.ultrabackpack.storage.FileStorage; +import cc.carm.plugin.ultrabackpack.storage.MySQLStorage; +import cc.carm.plugin.ultrabackpack.storage.UBStorage; +import cc.carm.plugin.ultrabackpack.util.SchedulerUtils; import org.bukkit.Bukkit; import org.bukkit.command.CommandExecutor; import org.bukkit.command.PluginCommand; @@ -15,6 +26,13 @@ import org.jetbrains.annotations.Nullable; public class Main extends JavaPlugin { private static Main instance; + private static SchedulerUtils scheduler; + + private static UBStorage storage; + + private static UserManager userManager; + private static EconomyManager economyManager; + private static BackpackManager backpackManager; @Override public void onEnable() { @@ -25,9 +43,53 @@ public class Main extends JavaPlugin { log("加载配置文件..."); ConfigManager.initConfig(); + log("初始化存储方式..."); + if (PluginConfig.STORAGE_METHOD.get().equalsIgnoreCase("mysql")) { + log(" 正在使用 MySQL 进行数据存储"); + storage = new MySQLStorage(); + } else { + log(" 正在使用 文件 进行数据存储"); + storage = new FileStorage(); + } + + if (!storage.initialize()) { + error("存储初始化失败,请检查配置文件。"); + setEnabled(false); + return; + } + + log("加载用户系统..."); + userManager = new UserManager(); + + log("加载经济系统..."); + if (Bukkit.getPluginManager().getPlugin("Vault") != null) { + economyManager = new EconomyManager(); + if (!economyManager.initialize()) { + error("经济系统初始化失败,关闭出售功能。"); + } + } else { + log(" &7[-] 检测到未安装Vault,关闭出售功能。"); + } + + log("加载背包管理器..."); + backpackManager = new BackpackManager(); + log("注册监听器..."); + regListener(new UserListener()); + regListener(new CollectListener()); + log("注册指令..."); + + + if (MessageUtil.hasPlaceholderAPI()) { + log("注册变量..."); + + } else { + log("检测到未安装PlaceholderAPI,跳过变量注册。"); + } + + UltraBackpackAPI.initialize(getUserManager()); log("加载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。"); @@ -38,11 +100,39 @@ public class Main extends JavaPlugin { log(getName() + " " + getDescription().getVersion() + " 开始卸载..."); long startTime = System.currentTimeMillis(); + log("保存现有用户数据..."); + + + log("释放存储源..."); + getStorage().shutdown(); + log("卸载监听器..."); Bukkit.getServicesManager().unregisterAll(this); + log("卸载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。"); } + public static SchedulerUtils getScheduler() { + return scheduler; + } + + public static UBStorage getStorage() { + return storage; + } + + public static UserManager getUserManager() { + return userManager; + } + + public static EconomyManager getEconomyManager() { + return economyManager; + } + + public static BackpackManager getBackpackManager() { + return backpackManager; + } + + /** * 注册监听器 * diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/PluginConfig.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/PluginConfig.java index 112966a..d1a555c 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/PluginConfig.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/PluginConfig.java @@ -1,6 +1,13 @@ package cc.carm.plugin.ultrabackpack.configuration; +import cc.carm.plugin.ultrabackpack.api.util.ItemStackFactory; +import cc.carm.plugin.ultrabackpack.configuration.values.ConfigSectionCast; import cc.carm.plugin.ultrabackpack.configuration.values.ConfigValue; +import cc.carm.plugin.ultrabackpack.configuration.values.ConfigValueList; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.List; public class PluginConfig { @@ -8,4 +15,125 @@ public class PluginConfig { "debug", Boolean.class ); + public static final ConfigValue STORAGE_METHOD = new ConfigValue<>( + "storage.method", String.class + ); + + /** + * 收集配置 + */ + public static class Collect { + + public static final ConfigValue PICKUP = new ConfigValue<>( + "collect.pickup", Boolean.class, true + ); + + public static final ConfigValue KILL = new ConfigValue<>( + "collect.kill", Boolean.class, true + ); + + public static final ConfigValue BREAK = new ConfigValue<>( + "collect.break", Boolean.class, true + ); + + } + + /** + * 通用配置 + */ + public static class General { + /** + * 针对每一件物品的额外介绍 + * 将添加到背包界面内的物品上,避免重复配置 + */ + public static final ConfigValueList ADDITIONAL_LORE = new ConfigValueList<>( + "general.additional-lore", String.class + ); + + /** + * 提示玩家点击行为的介绍 + * 将添加到背包界面内的物品上,避免重复配置 + */ + public static final ConfigValueList CLICK_LORE = new ConfigValueList<>( + "general.click-lore", String.class + ); + + /** + * 售出界面的配置 + */ + public static class SellGUI { + + + public static final ConfigValue TITLE = new ConfigValue<>( + "general.sell-gui.title", String.class + ); + + public static class Items { + + public static final ConfigSectionCast ADD = new ConfigSectionCast<>( + "general.sell-gui.items.add", + section -> { + ItemStackFactory factory = new ItemStackFactory( + Material.matchMaterial(section.getString("type", "STONE")), + 1, section.getInt("data", 0) + ); + String name = section.getString("name"); + List lore = section.getStringList("lore"); + if (name != null) factory.setDisplayName(name); + if (!lore.isEmpty()) factory.setLore(lore); + return factory.toItemStack(); + }, new ItemStack(Material.STONE) + ); + + public static final ConfigSectionCast REMOVE = new ConfigSectionCast<>( + "general.sell-gui.items.remove", + section -> { + ItemStackFactory factory = new ItemStackFactory( + Material.matchMaterial(section.getString("type", "STONE")), + 1, section.getInt("data", 0) + ); + String name = section.getString("name"); + List lore = section.getStringList("lore"); + if (name != null) factory.setDisplayName(name); + if (!lore.isEmpty()) factory.setLore(lore); + return factory.toItemStack(); + }, new ItemStack(Material.STONE) + ); + + public static final ConfigSectionCast CONFIRM = new ConfigSectionCast<>( + "general.sell-gui.items.confirm", + section -> { + ItemStackFactory factory = new ItemStackFactory( + Material.matchMaterial(section.getString("type", "STONE")), + 1, section.getInt("data", 0) + ); + String name = section.getString("name"); + List lore = section.getStringList("lore"); + if (name != null) factory.setDisplayName(name); + if (!lore.isEmpty()) factory.setLore(lore); + return factory.toItemStack(); + }, new ItemStack(Material.STONE) + ); + + public static final ConfigSectionCast CANCEL = new ConfigSectionCast<>( + "general.sell-gui.items.cancel", + section -> { + ItemStackFactory factory = new ItemStackFactory( + Material.matchMaterial(section.getString("type", "STONE")), + 1, section.getInt("data", 0) + ); + String name = section.getString("name"); + List lore = section.getStringList("lore"); + if (name != null) factory.setDisplayName(name); + if (!lore.isEmpty()) factory.setLore(lore); + return factory.toItemStack(); + }, new ItemStack(Material.STONE) + ); + + } + + } + + } + } diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/backpack/BackpackCapacity.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/backpack/BackpackCapacity.java new file mode 100644 index 0000000..5525f1b --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/backpack/BackpackCapacity.java @@ -0,0 +1,53 @@ +package cc.carm.plugin.ultrabackpack.configuration.backpack; + +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class BackpackCapacity { + + int defaultCapacity; + Map permissions; + + public BackpackCapacity(int defaultCapacity, List permissionStrings) { + this.defaultCapacity = defaultCapacity; + Map permissions = new HashMap<>(); + permissionStrings.stream() + .filter(s -> s.contains(":")) + .map(s -> s.split(":", 1)) + .forEach(args -> { + try { + permissions.put(args[0], Integer.parseInt(args[1])); + } catch (Exception ignored) { + } + }); + this.permissions = permissions; + } + + + public BackpackCapacity(int defaultCapacity, Map permissions) { + this.defaultCapacity = defaultCapacity; + this.permissions = permissions; + } + + public int getDefault() { + return defaultCapacity; + } + + public @NotNull Map getPermissions() { + return permissions; + } + + public int getPlayerCapacity(Player player) { + return getPermissions().entrySet().stream() + .filter(entry -> player.hasPermission(entry.getKey())) + .map(Map.Entry::getValue) + .min(Comparator.comparingInt(Integer::intValue)) + .orElse(defaultCapacity); + } + +} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/backpack/BackpackConfiguration.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/backpack/BackpackConfiguration.java new file mode 100644 index 0000000..14dc7b4 --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/backpack/BackpackConfiguration.java @@ -0,0 +1,52 @@ +package cc.carm.plugin.ultrabackpack.configuration.backpack; + +import cc.carm.plugin.ultrabackpack.configuration.gui.GUIConfiguration; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; + +public class BackpackConfiguration { + + final String identifier; + + String name; + GUIConfiguration guiConfiguration; + BackpackCapacity capacity; + + Map items; + + + public BackpackConfiguration(String identifier, String name, + GUIConfiguration guiConfiguration, + BackpackCapacity capacity, + Map items) { + this.identifier = identifier; + this.name = name; + this.guiConfiguration = guiConfiguration; + this.capacity = capacity; + this.items = items; + } + + public @NotNull String getIdentifier() { + return this.identifier; + } + + public @NotNull String getName() { + return this.name; + } + + + public @NotNull GUIConfiguration getGUIConfiguration() { + return this.guiConfiguration; + } + + public @NotNull BackpackCapacity getCapacity() { + return this.capacity; + } + + public @NotNull Map getItems() { + return this.items; + } + + +} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/backpack/BackpackItem.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/backpack/BackpackItem.java new file mode 100644 index 0000000..a80fd36 --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/backpack/BackpackItem.java @@ -0,0 +1,75 @@ +package cc.carm.plugin.ultrabackpack.configuration.backpack; + +import cc.carm.plugin.ultrabackpack.api.util.ItemStackFactory; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class BackpackItem { + + final @NotNull Material material; + final int data; + + int slot; + + double price; + int limit; + + @Nullable String name; + @Nullable List lore; + + public BackpackItem(@NotNull Material material, int data, + int slot, int price, int limit, + @Nullable String name, @Nullable List lore) { + this.material = material; + this.data = data; + this.slot = slot; + this.price = price; + this.limit = limit; + this.name = name; + this.lore = lore; + } + + public @NotNull String getTypeID() { + return getMaterial().name() + (getData() != 0 ? ":" + getData() : ""); + } + + public @NotNull Material getMaterial() { + return material; + } + + public int getData() { + return data; + } + + public int getSlot() { + return slot; + } + + public double getPrice() { + return price; + } + + public int getLimit() { + return limit; + } + + public @Nullable String getName() { + return name; + } + + public @Nullable List getLore() { + return lore; + } + + public ItemStack getDisplayItem() { + ItemStackFactory factory = new ItemStackFactory(getMaterial(), 1, getData()); + if (getName() != null) factory.setDisplayName(getName()); + if (getLore() != null) factory.setLore(getLore()); + return factory.toItemStack(); + } + +} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/file/FileConfig.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/file/FileConfig.java index a82b874..4464c7d 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/file/FileConfig.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/file/FileConfig.java @@ -10,6 +10,8 @@ import java.io.IOException; public class FileConfig { + private long updateTime; + private final JavaPlugin plugin; private final String fileName; @@ -28,6 +30,7 @@ public class FileConfig { } private void initFile() { + this.updateTime = System.currentTimeMillis(); this.file = new File(plugin.getDataFolder(), fileName); if (!this.file.exists()) { if (!this.file.getParentFile().exists()) { @@ -55,10 +58,19 @@ public class FileConfig { } public void reload() { + this.updateTime = System.currentTimeMillis(); if (getFile().exists()) { this.config = YamlConfiguration.loadConfiguration(getFile()); } else { initFile(); } } + + public long getUpdateTime() { + return updateTime; + } + + public boolean isExpired(long time) { + return getUpdateTime() > time; + } } diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/gui/GUIActionConfiguration.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/gui/GUIActionConfiguration.java new file mode 100644 index 0000000..d43d15d --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/gui/GUIActionConfiguration.java @@ -0,0 +1,51 @@ +package cc.carm.plugin.ultrabackpack.configuration.gui; + +import cc.carm.plugin.ultrabackpack.util.gui.GUIItem; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class GUIActionConfiguration { + + + @Nullable ClickType clickType; + final @NotNull GUIActionType actionType; + final @Nullable String actionContent; + + public GUIActionConfiguration(@Nullable ClickType clickType, @NotNull GUIActionType actionType, @Nullable String actionContent) { + this.clickType = clickType; + this.actionType = actionType; + this.actionContent = actionContent; + } + + public @Nullable ClickType getClickType() { + return clickType; + } + + public @NotNull GUIActionType getActionType() { + return actionType; + } + + public @Nullable String getActionContent() { + return actionContent; + } + + public void checkAction(Player player, ClickType type) { + if (getClickType() == null || getClickType() == type) executeAction(player); + } + + public void executeAction(Player targetPlayer) { + getActionType().getExecutor().accept(targetPlayer, getActionContent()); + } + + public GUIItem.GUIClickAction toClickAction() { + return new GUIItem.GUIClickAction() { + @Override + public void run(ClickType type, Player player) { + checkAction(player, type); + } + }; + } + +} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/gui/GUIActionType.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/gui/GUIActionType.java new file mode 100644 index 0000000..4afb421 --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/gui/GUIActionType.java @@ -0,0 +1,88 @@ +package cc.carm.plugin.ultrabackpack.configuration.gui; + +import cc.carm.plugin.ultrabackpack.api.util.MessageUtil; +import org.bukkit.Bukkit; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.Collections; +import java.util.function.BiConsumer; + +public enum GUIActionType { + + /** + * 以玩家聊天的形式执行 + * 若内容以 “/" 开头,则会以玩家身份执行命令。 + */ + CHAT((player, string) -> { + if (string == null) return; + MessageUtil.setPlaceholders(player, Collections.singletonList(string)).forEach(player::chat); + }), + + /** + * 以后台的形式执行指令 + * 指令内容不需要以“/”开头。 + */ + CONSOLE((player, string) -> { + if (string == null) return; + MessageUtil.setPlaceholders(player, Collections.singletonList(string)) + .forEach(message -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), message)); + }), + + /** + * 向玩家发送消息。 + */ + MESSAGE(MessageUtil::send), + + /** + * 向玩家发送声音。 + * 允许配置音量与音调 + *
    + *
  • SOUND_NAME
  • + *
  • SOUND_NAME:VOLUME
  • + *
  • SOUND_NAME:VOLUME:PITCH
  • + *
+ */ + SOUND((player, string) -> { + if (string == null) return; + try { + String[] args = string.contains(":") ? string.split(":") : new String[]{string}; + Sound sound = Arrays.stream(Sound.values()) + .filter(s -> s.name().equals(args[0])) + .findFirst().orElse(null); + + if (sound == null) return; + float volume = args.length > 1 ? Float.parseFloat(args[1]) : 1F; + float pitch = args.length > 2 ? Float.parseFloat(args[2]) : 1F; + + player.playSound(player.getLocation(), sound, volume, pitch); + } catch (Exception ignored) { + } + }), + + /** + * 为玩家关闭GUI。 + */ + CLOSE((player, string) -> player.closeInventory()); + + BiConsumer<@NotNull Player, @Nullable String> executor; + + + GUIActionType(BiConsumer<@NotNull Player, @Nullable String> executor) { + this.executor = executor; + } + + public BiConsumer<@NotNull Player, @Nullable String> getExecutor() { + return executor; + } + + public static GUIActionType readActionType(String string) { + return Arrays.stream(GUIActionType.values()) + .filter(action -> action.name().equalsIgnoreCase(string)) + .findFirst().orElse(null); + } + +} \ No newline at end of file diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/gui/GUIConfiguration.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/gui/GUIConfiguration.java new file mode 100644 index 0000000..50035e0 --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/gui/GUIConfiguration.java @@ -0,0 +1,54 @@ +package cc.carm.plugin.ultrabackpack.configuration.gui; + +import cc.carm.plugin.ultrabackpack.util.gui.GUI; +import cc.carm.plugin.ultrabackpack.util.gui.GUIItem; +import cc.carm.plugin.ultrabackpack.util.gui.GUIType; +import com.google.common.collect.Multimap; + +public class GUIConfiguration { + + String title; + int lines; + + Multimap guiItems; + + public GUIConfiguration(String title, int lines, Multimap guiItems) { + this.title = title; + this.lines = lines; + this.guiItems = guiItems; + } + + public String getTitle() { + return title; + } + + public int getLines() { + return lines; + } + + public GUIType getGUIType() { + switch (lines) { + case 1: + return GUIType.ONE_BY_NINE; + case 2: + return GUIType.TWO_BY_NINE; + case 3: + return GUIType.THREE_BY_NINE; + case 4: + return GUIType.FOUR_BY_NINE; + case 5: + return GUIType.FIVE_BY_NINE; + default: + return GUIType.SIX_BY_NINE; + } + } + + public Multimap getGuiItems() { + return guiItems; + } + + public void setupItems(GUI gui) { + getGuiItems().forEach((gui::setItem)); + } + +} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/message/ConfigMessage.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/message/ConfigMessage.java index 7c4523b..0a9c992 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/message/ConfigMessage.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/message/ConfigMessage.java @@ -3,7 +3,7 @@ package cc.carm.plugin.ultrabackpack.configuration.message; import cc.carm.plugin.ultrabackpack.configuration.values.ConfigValue; import cc.carm.plugin.ultrabackpack.manager.ConfigManager; -import cc.carm.plugin.ultrabackpack.util.MessageUtil; +import cc.carm.plugin.ultrabackpack.api.util.MessageUtil; import org.bukkit.command.CommandSender; import java.util.Collections; diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/message/ConfigMessageList.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/message/ConfigMessageList.java index 2c05823..c760ecf 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/message/ConfigMessageList.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/message/ConfigMessageList.java @@ -3,7 +3,7 @@ package cc.carm.plugin.ultrabackpack.configuration.message; import cc.carm.plugin.ultrabackpack.configuration.values.ConfigValueList; import cc.carm.plugin.ultrabackpack.manager.ConfigManager; -import cc.carm.plugin.ultrabackpack.util.MessageUtil; +import cc.carm.plugin.ultrabackpack.api.util.MessageUtil; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.Nullable; diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/values/ConfigSectionCast.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/values/ConfigSectionCast.java new file mode 100644 index 0000000..80a4d3a --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/values/ConfigSectionCast.java @@ -0,0 +1,72 @@ +package cc.carm.plugin.ultrabackpack.configuration.values; + +import cc.carm.plugin.ultrabackpack.configuration.file.FileConfig; +import cc.carm.plugin.ultrabackpack.manager.ConfigManager; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Function; + +public class ConfigSectionCast { + + FileConfig source; + + String configSection; + @NotNull Function valueCast; + V defaultValue; + + V valueCache; + long updateTime; + + public ConfigSectionCast(String configSection, @NotNull Function valueCast) { + this(configSection, valueCast, null); + } + + public ConfigSectionCast(String configSection, + @NotNull Function valueCast, + V defaultValue) { + this(ConfigManager.getPluginConfig(), configSection, valueCast, defaultValue); + } + + public ConfigSectionCast(FileConfig source, String configSection, + @NotNull Function valueCast, + V defaultValue) { + this.source = source; + this.configSection = configSection; + this.valueCast = valueCast; + this.defaultValue = defaultValue; + } + + public FileConfiguration getConfiguration() { + return this.source.getConfig(); + } + + + public @Nullable V get() { + if (valueCache != null && !this.source.isExpired(this.updateTime)) return valueCache; + if (!getConfiguration().contains(this.configSection)) return defaultValue; + try { + V finalValue = this.valueCast.apply(getConfiguration().getConfigurationSection(this.configSection)); + if (finalValue != null) { + this.valueCache = finalValue; + this.updateTime = System.currentTimeMillis(); + return finalValue; + } else { + return defaultValue; + } + } catch (Exception ignore) { + return defaultValue; + } + } + + public void set(ConfigurationSection section) { + + } + + public void save() { + this.source.save(); + } + +} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/values/ConfigStringCast.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/values/ConfigStringCast.java new file mode 100644 index 0000000..297daac --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/values/ConfigStringCast.java @@ -0,0 +1,72 @@ +package cc.carm.plugin.ultrabackpack.configuration.values; + +import cc.carm.plugin.ultrabackpack.configuration.file.FileConfig; +import cc.carm.plugin.ultrabackpack.manager.ConfigManager; +import org.bukkit.configuration.file.FileConfiguration; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Function; + +public class ConfigStringCast { + + FileConfig source; + + String configSection; + @NotNull Function valueCast; + V defaultValue; + + V valueCache; + long updateTime; + + public ConfigStringCast(String configSection, @NotNull Function valueCast) { + this(configSection, valueCast, null); + } + + public ConfigStringCast(String configSection, @NotNull Function valueCast, V defaultValue) { + this(ConfigManager.getPluginConfig(), configSection, valueCast, defaultValue); + } + + public ConfigStringCast(FileConfig source, String configSection, @NotNull Function valueCast, V defaultValue) { + this.source = source; + this.configSection = configSection; + this.valueCast = valueCast; + this.defaultValue = defaultValue; + } + + public FileConfiguration getConfiguration() { + return this.source.getConfig(); + } + + public @Nullable V get() { + if (valueCache != null && !this.source.isExpired(this.updateTime)) return valueCache; + if (!getConfiguration().contains(this.configSection)) return setDefault(); + try { + V finalValue = this.valueCast.apply(getConfiguration().getString(this.configSection)); + if (finalValue != null) { + this.valueCache = finalValue; + this.updateTime = System.currentTimeMillis(); + return finalValue; + } else { + return defaultValue; + } + } catch (Exception ignore) { + return defaultValue; + } + } + + public void set(V value) { + getConfiguration().set(this.configSection, value); + this.save(); + } + + public void save() { + this.source.save(); + } + + public V setDefault() { + set(this.defaultValue); + return this.defaultValue; + } + +} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/values/ConfigValueMap.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/values/ConfigValueMap.java index 515d882..b56b9e3 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/values/ConfigValueMap.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/configuration/values/ConfigValueMap.java @@ -23,6 +23,8 @@ public class ConfigValueMap { @Nullable LinkedHashMap valueCache; + long updateTime; + public ConfigValueMap(@NotNull String configSection, @NotNull Function keyCast, @NotNull Class valueClazz) { this(ConfigManager.getPluginConfig(), configSection, keyCast, valueClazz); @@ -47,7 +49,7 @@ public class ConfigValueMap { @NotNull public Map get() { - if (valueCache != null) return valueCache; + if (valueCache != null && !this.source.isExpired(this.updateTime)) return valueCache; ConfigurationSection section = getConfiguration().getConfigurationSection(this.configSection); if (section == null) return new LinkedHashMap<>(); Set keys = section.getKeys(false); @@ -62,6 +64,7 @@ public class ConfigValueMap { result.put(finalKey, finalValue); } } + this.updateTime = System.currentTimeMillis(); this.valueCache = result; return result; } diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/data/UserData.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/data/UserData.java index d0f9e95..5897c0e 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/data/UserData.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/data/UserData.java @@ -1,9 +1,12 @@ package cc.carm.plugin.ultrabackpack.data; +import cc.carm.plugin.ultrabackpack.Main; import cc.carm.plugin.ultrabackpack.api.data.UBContentsData; +import cc.carm.plugin.ultrabackpack.api.data.UBItemData; import cc.carm.plugin.ultrabackpack.api.data.UBUserData; -import cc.carm.plugin.ultrabackpack.api.storage.UBStorage; +import cc.carm.plugin.ultrabackpack.storage.UBStorage; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.sql.Date; import java.util.Map; @@ -19,7 +22,8 @@ public class UserData implements UBUserData { Date day; - public UserData(UUID userUUID, UBStorage storage, Map backpacks, Date day) { + public UserData(UUID userUUID, UBStorage storage, + Map backpacks, Date day) { this.userUUID = userUUID; this.storage = storage; this.backpacks = backpacks; @@ -36,7 +40,8 @@ public class UserData implements UBUserData { } @Override - public @NotNull UBContentsData getBackpack(String backpackID) { + public @Nullable UBContentsData getBackpack(String backpackID) { + if (!Main.getBackpackManager().hasBackpack(backpackID)) return null; if (!getBackpacks().containsKey(backpackID)) { getBackpacks().put(backpackID, UBContentsData.emptyContents()); } @@ -49,17 +54,76 @@ public class UserData implements UBUserData { } @Override - public int getItemAmount(String backpackID, String typeID) { - return getBackpack(backpackID).getItemData(typeID).getAmount(); + public @Nullable UBItemData getItemData(@NotNull String backpackID, @NotNull String typeID) { + UBContentsData data = getBackpack(backpackID); + if (data == null) return null; + if (!Main.getBackpackManager().hasItem(backpackID, typeID)) return null; + UBItemData itemData = data.getItemData(typeID); + if (itemData == null) { + itemData = UBItemData.emptyItemData(); + data.getContents().put(typeID, itemData); + } + return itemData; + } + + + @Override + public @Nullable Integer getItemAmount(@NotNull String backpackID, @NotNull String typeID) { + UBItemData data = getItemData(backpackID, typeID); + if (data == null) return null; + return data.getAmount(); } @Override - public int getItemSold(String backpackID, String typeID) { - return getBackpack(backpackID).getItemData(typeID).getSold(); + public @Nullable Integer getItemSold(@NotNull String backpackID, @NotNull String typeID) { + checkoutDate(); + UBItemData data = getItemData(backpackID, typeID); + if (data == null) return null; + return data.getSold(); } @Override - public Date getDataDay() { + public @Nullable Integer setItemAmount(@NotNull String backpackID, @NotNull String typeID, int amount) { + UBItemData data = getItemData(backpackID, typeID); + if (data == null) return null; + data.setAmount(amount); + return amount; + } + + @Override + public @Nullable Integer setItemSold(@NotNull String backpackID, @NotNull String typeID, int soldAmount) { + UBItemData data = getItemData(backpackID, typeID); + if (data == null) return null; + data.setSold(soldAmount); + return soldAmount; + } + + @Override + public @Nullable Integer addItemAmount(@NotNull String backpackID, @NotNull String typeID, int amount) { + Integer current = getItemAmount(backpackID, typeID); + if (current == null) return null; + return setItemAmount(backpackID, typeID, current + amount); + } + + @Override + public @Nullable Integer addItemSold(@NotNull String backpackID, @NotNull String typeID, int amount) { + Integer current = getItemSold(backpackID, typeID); + if (current == null) return null; + return setItemSold(backpackID, typeID, current + amount); + } + + @Override + public @Nullable Integer removeItemAmount(@NotNull String backpackID, @NotNull String typeID, int amount) { + return addItemAmount(backpackID, typeID, -amount); + } + + @Override + public @Nullable Integer removeItemSold(@NotNull String backpackID, @NotNull String typeID, int amount) { + return addItemSold(backpackID, typeID, -amount); + } + + @Override + public Date getDate() { return this.day; } @@ -69,8 +133,12 @@ public class UserData implements UBUserData { } @Override - public void updateDate() { - + public void checkoutDate() { + if (isCurrentDay()) return; + this.day = new Date(System.currentTimeMillis()); //更新日期 + getBackpacks().values().stream() + .flatMap(value -> value.getContents().values().stream()) + .forEach(UBItemData::clearSold); } @Override diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/hooker/UBExpansion.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/hooker/UBExpansion.java new file mode 100644 index 0000000..77afdf5 --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/hooker/UBExpansion.java @@ -0,0 +1,104 @@ +package cc.carm.plugin.ultrabackpack.hooker; + +import cc.carm.plugin.ultrabackpack.Main; +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.List; + +public class UBExpansion extends PlaceholderExpansion { + + private static final List PLACEHOLDERS = Arrays.asList( + "%UltraBackpack_%", + "%UltraBackpack_%" + ); + + JavaPlugin plugin; + + public UBExpansion(JavaPlugin plugin) { + this.plugin = plugin; + } + + @Override + public @NotNull List getPlaceholders() { + return PLACEHOLDERS; + } + + @Override + public boolean canRegister() { + return true; + } + + @Override + public @NotNull String getAuthor() { + return plugin.getDescription().getAuthors().toString(); + } + + @Override + public @NotNull String getIdentifier() { + return plugin.getDescription().getName(); + } + + @Override + public @NotNull String getVersion() { + return plugin.getDescription().getVersion(); + } + + @Override + public String onPlaceholderRequest(Player player, @NotNull String identifier) { + if (player == null) return "加载中..."; + String[] args = identifier.split("_"); + + if (args.length < 1) { + return "参数不足"; + } + + switch (args[0].toLowerCase()) { + case "amount": { + if (args.length < 3) return "参数不足"; + Integer amount = Main.getUserManager().getData(player).getItemAmount(args[2], args[3]); + if (amount == null) return "背包或物品不存在"; + else return amount.toString(); + } + case "sold": { + if (args.length < 3) return "参数不足"; + Integer sold = Main.getUserManager().getData(player).getItemSold(args[2], args[3]); + if (sold == null) return "背包或物品不存在"; + else return sold.toString(); + } + case "remain": { + if (args.length < 3) return "参数不足"; + + Integer sold = Main.getUserManager().getData(player).getItemSold(args[2], args[3]); + if (sold == null) return "背包或物品不存在"; + + Integer limit = Main.getBackpackManager().getItemLimit(args[2], args[3]); + if (limit == null) return "背包或物品不存在"; + + return Integer.toString(limit - sold); + } + case "limit": { + if (args.length < 3) return "参数不足"; + Integer limit = Main.getBackpackManager().getItemLimit(args[2], args[3]); + if (limit == null) return "背包或物品不存在"; + else return limit.toString(); + } + case "price": { + if (args.length < 3) return "参数不足"; + Double price = Main.getBackpackManager().getItemPrice(args[2], args[3]); + if (price == null) return "背包或物品不存在"; + else return price.toString(); + } + case "version": { + return getVersion(); + } + default: { + return "参数错误"; + } + } + } + +} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/hooker/VaultHooker.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/hooker/VaultHooker.java new file mode 100644 index 0000000..4ca01bb --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/hooker/VaultHooker.java @@ -0,0 +1,71 @@ +package cc.carm.plugin.ultrabackpack.hooker; + +import net.milkbowl.vault.economy.Economy; +import net.milkbowl.vault.economy.EconomyResponse; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.bukkit.plugin.RegisteredServiceProvider; + +public class VaultHooker { + + private Economy econ = null; + private EconomyResponse response; + + public static boolean hasVault() { + return Bukkit.getServer().getPluginManager().getPlugin("Vault") != null; + } + + public boolean setupEconomy() { + if (!hasVault()) { + return false; + } + RegisteredServiceProvider rsp = Bukkit.getServer().getServicesManager().getRegistration(Economy.class); + if (rsp == null) { + return false; + } + this.econ = rsp.getProvider(); + return true; + } + + public Economy getEconomy() { + return econ; + } + + public double getMoney(Player player) { + if (player != null) { + try { + return getEconomy().getBalance(player); + } catch (NullPointerException ignore) { + } + } + return 0L; + } + + public double getMoney(OfflinePlayer player) { + if (player != null) { + try { + return getEconomy().getBalance(player); + } catch (NullPointerException ignore) { + } + } + return 0L; + } + + public void removeMoney(Player player, double amount) { + getEconomy().withdrawPlayer(player, amount); + } + + public void removeMoney(OfflinePlayer player, double amount) { + getEconomy().withdrawPlayer(player, amount); + } + + public void addMoney(Player player, double amount) { + getEconomy().depositPlayer(player, amount); + } + + public void addMoney(OfflinePlayer player, double amount) { + getEconomy().depositPlayer(player, amount); + } + +} \ No newline at end of file diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/listener/CollectListener.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/listener/CollectListener.java index 841f5d1..c5c8f81 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/listener/CollectListener.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/listener/CollectListener.java @@ -1,5 +1,6 @@ package cc.carm.plugin.ultrabackpack.listener; +import cc.carm.plugin.ultrabackpack.configuration.PluginConfig; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -15,14 +16,16 @@ public class CollectListener implements Listener { @EventHandler public void onBreak(BlockBreakEvent event) { + if (!PluginConfig.Collect.BREAK.get()) return; Player player = event.getPlayer(); Collection drops = event.getBlock().getDrops(); - + } @EventHandler public void onBreak(EntityDeathEvent event) { + if (!PluginConfig.Collect.KILL.get()) return; Player player = event.getEntity().getKiller(); if (player == null) return; @@ -30,6 +33,7 @@ public class CollectListener implements Listener { } public void onPickup(EntityPickupItemEvent event) { + if (!PluginConfig.Collect.PICKUP.get()) return; if (!(event.getEntity() instanceof Player)) return; Player player = (Player) event.getEntity(); diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/listener/UserListener.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/listener/UserListener.java new file mode 100644 index 0000000..36c733e --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/listener/UserListener.java @@ -0,0 +1,60 @@ +package cc.carm.plugin.ultrabackpack.listener; + +import cc.carm.plugin.ultrabackpack.Main; +import cc.carm.plugin.ultrabackpack.api.data.UBUserData; +import cc.carm.plugin.ultrabackpack.data.UserData; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.util.UUID; + +public class UserListener implements Listener { + + @EventHandler(priority = EventPriority.HIGH) + public void onPreLogin(AsyncPlayerPreLoginEvent event) { + if (event.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { + return; + } + UUID uuid = event.getUniqueId(); + Main.debug("尝试加载玩家 " + event.getName() + " 的数据..."); + Main.getUserManager().getDataCache().put(uuid, Main.getUserManager().loadData(uuid)); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPreLoginMonitor(AsyncPlayerPreLoginEvent event) { + if (event.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { + Main.getUserManager().getDataCache().remove(event.getUniqueId()); + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerLogin(PlayerLoginEvent e) { + UserData data = Main.getUserManager().getData(e.getPlayer().getUniqueId()); + if (data == null) { + e.setResult(PlayerLoginEvent.Result.KICK_OTHER); + e.setKickMessage(Main.getInstance().getName() + " 数据未被正确加载,请重新进入。"); + } + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + String playerName = player.getName(); + UUID playerUUID = player.getUniqueId(); + UBUserData userData = Main.getUserManager().getData(player); + Main.getScheduler().runAsync(() -> { + try { + userData.save(); + Main.debug(" 玩家 " + playerName + " 数据已保存并卸载。"); + } catch (Exception ignored) { + } + Main.getUserManager().getDataCache().remove(playerUUID); + }); + } + +} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/BackpackManager.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/BackpackManager.java new file mode 100644 index 0000000..743dd74 --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/BackpackManager.java @@ -0,0 +1,74 @@ +package cc.carm.plugin.ultrabackpack.manager; + +import cc.carm.plugin.ultrabackpack.configuration.backpack.BackpackConfiguration; +import cc.carm.plugin.ultrabackpack.configuration.backpack.BackpackItem; +import com.google.common.collect.HashMultimap; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; + +public class BackpackManager { + + public HashMap<@NotNull String, @NotNull BackpackConfiguration> backpacks; + + /** + * 用于记录储存每个物品ID所对应的背包ID + */ + public HashMultimap<@NotNull String, @NotNull String> itemMap; + + public BackpackManager() { + this.backpacks = new HashMap<>(); + this.itemMap = HashMultimap.create(); + } + + public @NotNull HashMap<@NotNull String, @NotNull BackpackConfiguration> getBackpacks() { + return backpacks; + } + + public boolean hasBackpack(@NotNull String backpackID) { + return getBackpacks().containsKey(backpackID); + } + + public boolean hasItem(@NotNull String backpackID, @NotNull String itemTypeID) { + BackpackConfiguration configuration = getBackpack(backpackID); + if (configuration == null) return false; + return configuration.getItems().containsKey(itemTypeID); + } + + public @Nullable BackpackConfiguration getBackpack(@NotNull String backpackID) { + return getBackpacks().get(backpackID); + } + + /** + * 获得某背包配置中的某件物品单价,最低为0。 + * + * @param backpackID 背包ID + * @param itemTypeID 物品ID + * @return 若为空,则该背包或该物品不存在。 + */ + public @Nullable Double getItemPrice(@NotNull String backpackID, @NotNull String itemTypeID) { + BackpackConfiguration configuration = getBackpack(backpackID); + if (configuration == null) return null; + BackpackItem item = configuration.getItems().get(itemTypeID); + if (item == null) return null; + return item.getPrice(); + } + + /** + * 获得某背包配置中的某件物品每日售出限制,最低为0。 + * + * @param backpackID 背包ID + * @param itemTypeID 物品ID + * @return 若为空,则该背包或该物品不存在。 + */ + public @Nullable Integer getItemLimit(@NotNull String backpackID, @NotNull String itemTypeID) { + BackpackConfiguration configuration = getBackpack(backpackID); + if (configuration == null) return null; + BackpackItem item = configuration.getItems().get(itemTypeID); + if (item == null) return null; + return item.getLimit(); + } + + +} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/ConfigManager.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/ConfigManager.java index 357401a..b43b68e 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/ConfigManager.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/ConfigManager.java @@ -3,6 +3,19 @@ package cc.carm.plugin.ultrabackpack.manager; import cc.carm.plugin.ultrabackpack.Main; import cc.carm.plugin.ultrabackpack.configuration.file.FileConfig; +import cc.carm.plugin.ultrabackpack.configuration.gui.GUIActionConfiguration; +import cc.carm.plugin.ultrabackpack.configuration.gui.GUIActionType; +import cc.carm.plugin.ultrabackpack.configuration.gui.GUIConfiguration; +import cc.carm.plugin.ultrabackpack.util.gui.GUIItem; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Nullable; + +import java.util.*; public class ConfigManager { @@ -32,5 +45,60 @@ public class ConfigManager { getMessageConfig().save(); } + public static GUIConfiguration readConfiguration(ConfigurationSection section) { + String title = section.getString("title", ""); + int liens = section.getInt("lines", 6); + Multimap guiItemMap = ArrayListMultimap.create(); + ConfigurationSection itemsSection = section.getConfigurationSection("items"); + if (itemsSection != null) { + itemsSection.getKeys(false).stream() + .map(key -> readItem(itemsSection.getConfigurationSection(key))) + .filter(Objects::nonNull) + .forEach(entry -> guiItemMap.putAll(entry.getKey(), entry.getValue())); + + } + return new GUIConfiguration(title, liens, guiItemMap); + } + + @Nullable + private static AbstractMap.SimpleEntry> readItem(@Nullable ConfigurationSection itemSection) { + if (itemSection == null) return null; + ItemStack icon = itemSection.getItemStack("icon", new ItemStack(Material.STONE)); + List slots = itemSection.getIntegerList("slots"); + int slot = itemSection.getInt("slot", 0); + + List actionsString = itemSection.getStringList("actions"); + List actions = new ArrayList<>(); + for (String actionString : actionsString) { + int prefixStart = actionString.indexOf("["); + int prefixEnd = actionString.indexOf("]"); + if (prefixStart < 0 || prefixEnd < 0) continue; + + String prefix = actionString.substring(prefixStart + 1, prefixEnd); + ClickType clickType = null; + GUIActionType actionType; + if (prefix.contains(":")) { + String[] args = prefix.split(":"); + clickType = readClickType(args[0]); + actionType = GUIActionType.readActionType(args[1]); + } else { + actionType = GUIActionType.readActionType(prefix); + } + + if (actionType == null) continue; + actions.add(new GUIActionConfiguration(clickType, actionType, actionString.substring(prefixEnd + 1).trim())); + } + GUIItem item = new GUIItem(icon); + actions.stream().map(GUIActionConfiguration::toClickAction).forEach(item::addClickAction); + + return new AbstractMap.SimpleEntry<>(item, slots.size() > 0 ? slots : Collections.singletonList(slot)); + } + + public static ClickType readClickType(String type) { + return Arrays.stream(ClickType.values()) + .filter(click -> click.name().equalsIgnoreCase(type)) + .findFirst().orElse(null); + } + } diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/EconomyManager.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/EconomyManager.java new file mode 100644 index 0000000..591e3f9 --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/EconomyManager.java @@ -0,0 +1,35 @@ +package cc.carm.plugin.ultrabackpack.manager; + +import cc.carm.plugin.ultrabackpack.hooker.VaultHooker; +import org.bukkit.entity.Player; + +public class EconomyManager { + + VaultHooker hooker; + boolean initialized; + + public EconomyManager() { + this.hooker = new VaultHooker(); + } + + public boolean initialize() { + boolean success = this.hooker.setupEconomy(); + this.initialized = success; + + return success; + } + + public boolean isInitialized() { + return initialized; + } + + public VaultHooker getHooker() { + return hooker; + } + + public void sell(Player player, double price, int amount) { + if (!isInitialized()) return; + getHooker().addMoney(player, price * amount); + } + +} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/UserManager.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/UserManager.java new file mode 100644 index 0000000..c65a84d --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/manager/UserManager.java @@ -0,0 +1,43 @@ +package cc.carm.plugin.ultrabackpack.manager; + +import cc.carm.plugin.ultrabackpack.Main; +import cc.carm.plugin.ultrabackpack.api.manager.UBUserManager; +import cc.carm.plugin.ultrabackpack.data.UserData; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.sql.Date; +import java.util.HashMap; +import java.util.UUID; + +public class UserManager implements UBUserManager { + + private final HashMap dataCache = new HashMap<>(); + + public HashMap getDataCache() { + return dataCache; + } + + @Override + public @Nullable UserData getData(@NotNull UUID userUUID) { + return getDataCache().get(userUUID); + } + + @Override + public @NotNull UserData getData(@NotNull Player player) { + return getDataCache().get(player.getUniqueId()); + } + + @Override + public @NotNull UserData loadData(@NotNull UUID userUUID) { + try { + return Main.getStorage().loadData(userUUID); + } catch (Exception e) { + Main.error("无法正常加载玩家数据,玩家操作将不会被保存,请检查数据配置!"); + Main.error("Error occurred when loading user's data, please check the configuration!"); + return new UserData(userUUID, Main.getStorage(), new HashMap<>(), new Date(System.currentTimeMillis())); + } + } + +} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/storage/FileStorage.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/storage/FileStorage.java index 8b0995b..9c1637f 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/storage/FileStorage.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/storage/FileStorage.java @@ -1,7 +1,7 @@ package cc.carm.plugin.ultrabackpack.storage; -import cc.carm.plugin.ultrabackpack.api.data.UBUserData; -import cc.carm.plugin.ultrabackpack.api.storage.UBStorage; +import cc.carm.plugin.ultrabackpack.Main; +import cc.carm.plugin.ultrabackpack.configuration.values.ConfigValue; import cc.carm.plugin.ultrabackpack.data.UserData; import org.jetbrains.annotations.NotNull; @@ -12,6 +12,10 @@ import java.util.UUID; public class FileStorage implements UBStorage { + private static final ConfigValue FILE_PATH = new ConfigValue<>( + "storage.file-path", String.class, "data" + ); + private File dataContainer; @Override @@ -19,14 +23,27 @@ public class FileStorage implements UBStorage { return false; } + @Override + public void shutdown() { + // 似乎没什么需要做的 + } + @Override public @NotNull UserData loadData(@NotNull UUID uuid) { + long start = System.currentTimeMillis(); + Main.debug("正通过 FileStorage 加载 " + uuid + " 的用户数据..."); return new UserData(uuid, this, new HashMap<>(), new Date(System.currentTimeMillis())); } @Override - public void saveUserData(@NotNull UBUserData data) { + public void saveUserData(@NotNull UserData data) { + long start = System.currentTimeMillis(); + Main.debug("正通过 FileStorage 保存 " + data.getUserUUID() + " 的用户数据..."); + Main.debug( + "通过 FileStorage 保存 " + data.getUserUUID() + " 的用户数据完成," + + "耗时 " + (System.currentTimeMillis() - start) + "ms。" + ); } } diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/storage/MySQLStorage.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/storage/MySQLStorage.java index c07856d..07f5374 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/storage/MySQLStorage.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/storage/MySQLStorage.java @@ -7,8 +7,7 @@ import cc.carm.lib.easysql.api.action.query.SQLQuery; import cc.carm.plugin.ultrabackpack.Main; import cc.carm.plugin.ultrabackpack.api.data.UBContentsData; import cc.carm.plugin.ultrabackpack.api.data.UBItemData; -import cc.carm.plugin.ultrabackpack.api.data.UBUserData; -import cc.carm.plugin.ultrabackpack.api.storage.UBStorage; +import cc.carm.plugin.ultrabackpack.configuration.PluginConfig; import cc.carm.plugin.ultrabackpack.configuration.values.ConfigValue; import cc.carm.plugin.ultrabackpack.data.UserData; import com.google.gson.Gson; @@ -27,18 +26,18 @@ import java.util.UUID; public class MySQLStorage implements UBStorage { - public static final ConfigValue DRIVER_NAME = new ConfigValue<>( + private static final ConfigValue DRIVER_NAME = new ConfigValue<>( "storage.mysql.driver", String.class, "com.mysql.jdbc.Driver" ); - public static final ConfigValue URL = new ConfigValue<>( + private static final ConfigValue URL = new ConfigValue<>( "storage.mysql.url", String.class, "jdbc:mysql://127.0.0.1:3306/minecraft" ); - public static final ConfigValue USERNAME = new ConfigValue<>( + private static final ConfigValue USERNAME = new ConfigValue<>( "storage.mysql.username", String.class, "username" ); - public static final ConfigValue PASSWORD = new ConfigValue<>( + private static final ConfigValue PASSWORD = new ConfigValue<>( "storage.mysql.password", String.class, "password" ); @@ -86,8 +85,9 @@ public class MySQLStorage implements UBStorage { public boolean initialize() { try { - Main.log("尝试连接到数据库..."); + Main.log(" 尝试连接到数据库..."); this.sqlManager = EasySQL.createManager(DRIVER_NAME.get(), URL.get(), USERNAME.get(), PASSWORD.get()); + this.sqlManager.setDebugMode(PluginConfig.DEBUG.get()); } catch (Exception exception) { Main.error("无法连接到数据库,请检查配置文件。"); Main.error("Could not connect to the database, please check the configuration."); @@ -96,7 +96,7 @@ public class MySQLStorage implements UBStorage { } try { - Main.log("创建插件所需表..."); + Main.log(" 创建插件所需表..."); SQLTables.createTables(sqlManager); } catch (SQLException exception) { Main.error("无法创建插件所需的表,请检查数据库权限。"); @@ -109,8 +109,15 @@ public class MySQLStorage implements UBStorage { } @Override - public @NotNull UserData loadData(@NotNull UUID uuid) throws Exception { + public void shutdown() { + Main.log(" 关闭数据库连接..."); + EasySQL.shutdownManager(getSQLManager()); + } + @Override + public @NotNull UserData loadData(@NotNull UUID uuid) throws Exception { + long start = System.currentTimeMillis(); + Main.debug("正通过 MySQLStorage 加载 " + uuid + " 的用户数据..."); try (SQLQuery query = createAction(uuid).execute()) { ResultSet resultSet = query.getResultSet(); Map dataMap = new HashMap<>(); @@ -125,8 +132,11 @@ public class MySQLStorage implements UBStorage { if (contentsData != null) dataMap.put(backpackID, contentsData); }); } + Main.debug("通过 MySQLStorage 加载 " + uuid + " 的用户数据完成," + + "耗时 " + (System.currentTimeMillis() - start) + "ms。"); return new UserData(uuid, this, dataMap, date); } + Main.debug("当前库内不存在玩家 " + uuid + " 的数据,视作新档。"); return new UserData(uuid, this, new HashMap<>(), new Date(System.currentTimeMillis())); } catch (Exception exception) { Main.error("在加载玩家 #" + uuid + " 的数据时出现异常。"); @@ -136,25 +146,28 @@ public class MySQLStorage implements UBStorage { } @Override - public void saveUserData(@NotNull UBUserData data) throws Exception { + public void saveUserData(@NotNull UserData data) throws Exception { + long start = System.currentTimeMillis(); + Main.debug("正通过 MySQLStorage 保存 " + data.getUserUUID() + " 的用户数据..."); + JsonObject dataObject = new JsonObject(); - for (String backpackID : data.getBackpackIDs()) { - JsonObject contentObject = serializeContentsData(data.getBackpack(backpackID)); - if (contentObject != null) dataObject.add(backpackID, contentObject); - } + data.getBackpacks().forEach((id, contents) -> dataObject.add(id, serializeContentsData(contents))); try { getSQLManager().createReplace(SQLTables.USER_DATA.getName()) .setColumnNames("uuid", "data", "day") - .setParams(data.getUserUUID(), GSON.toJson(dataObject), data.getDataDay()) + .setParams(data.getUserUUID(), GSON.toJson(dataObject), data.getDate()) .execute(); } catch (SQLException exception) { - Main.error("在加载玩家 #" + data.getUserUUID() + " 的数据时出现异常。"); - Main.error("Error occurred when loading #" + data.getUserUUID() + " data."); + Main.error("在保存玩家 #" + data.getUserUUID() + " 的数据时出现异常。"); + Main.error("Error occurred when saving #" + data.getUserUUID() + " data."); throw new Exception(exception); } + Main.debug("通过 MySQLStorage 保存 " + data.getUserUUID() + " 的用户数据完成," + + "耗时 " + (System.currentTimeMillis() - start) + "ms。"); + } private SQLManager getSQLManager() { diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/storage/UBStorage.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/storage/UBStorage.java new file mode 100644 index 0000000..372072b --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/storage/UBStorage.java @@ -0,0 +1,20 @@ +package cc.carm.plugin.ultrabackpack.storage; + +import cc.carm.plugin.ultrabackpack.data.UserData; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +public interface UBStorage { + + + boolean initialize(); + + void shutdown(); + + @NotNull + UserData loadData(@NotNull UUID uuid) throws Exception; + + void saveUserData(@NotNull UserData data) throws Exception; + +} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/ui/BackpackGUI.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/ui/BackpackGUI.java new file mode 100644 index 0000000..c94feb8 --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/ui/BackpackGUI.java @@ -0,0 +1,4 @@ +package cc.carm.plugin.ultrabackpack.ui; + +public class BackpackGUI { +} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/gui/GUI.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/gui/GUI.java index 97f271e..a95ca8f 100644 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/gui/GUI.java +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/gui/GUI.java @@ -1,16 +1,12 @@ package cc.carm.plugin.ultrabackpack.util.gui; import cc.carm.plugin.ultrabackpack.Main; -import cc.carm.plugin.ultrabackpack.util.ColorParser; +import cc.carm.plugin.ultrabackpack.api.util.ColorParser; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryDragEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -36,7 +32,7 @@ public class GUI { Map flags; - public Listener listener; + public GUIListener listener; public GUI(GUIType type, String name) { this.type = type; @@ -186,80 +182,9 @@ public class GUI { this.inv = inv; player.openInventory(inv); - if (listener == null) - Bukkit.getPluginManager().registerEvents(listener = new Listener() { - @EventHandler - public void onInventoryClickEvent(InventoryClickEvent event) { - if (!(event.getWhoClicked() instanceof Player)) return; - Player p = (Player) event.getWhoClicked(); - rawClickListener(event); - if (event.getSlot() != -999) { - try { - if (getOpenedGUI(p) == GUI.this - && event.getClickedInventory() != null - && event.getClickedInventory().equals(GUI.this.inv) - && GUI.this.items[event.getSlot()] != null) { - GUI.this.items[event.getSlot()].realRawClickAction(event); - } - } catch (ArrayIndexOutOfBoundsException e) { - System.err.print("err cause by GUI(" + GUI.this + "), name=" + name); - e.printStackTrace(); - return; - } - } else if (cancelOnOuter) { - event.setCancelled(true); - } - if (hasOpenedGUI(p) - && getOpenedGUI(p) == GUI.this - && event.getClickedInventory() != null) { - if (event.getClickedInventory().equals(GUI.this.inv)) { - if (cancelOnTarget) event.setCancelled(true); - - if (event.getSlot() != -999 && GUI.this.items[event.getSlot()] != null) { - if (GUI.this.items[event.getSlot()].isActionActive()) { - GUI.this.items[event.getSlot()].onClick(event.getClick()); - GUI.this.items[event.getSlot()].rawClickAction(event); - if (!GUI.this.items[event.getSlot()].actions.isEmpty()) { - for (GUIItem.GUIClickAction action : GUI.this.items[event.getSlot()].actions) { - action.run(event.getClick(), player); - } - } - } - if (!GUI.this.items[event.getSlot()].actionsIgnoreActive.isEmpty()) { - for (GUIItem.GUIClickAction action : GUI.this.items[event.getSlot()].actionsIgnoreActive) { - action.run(event.getClick(), player); - } - } - } - } else if (event.getClickedInventory().equals(p.getInventory()) && cancelOnSelf) { - event.setCancelled(true); - } - } - } - - @EventHandler - public void onDrag(InventoryDragEvent e) { - if (e.getWhoClicked() instanceof Player) { - Player p = (Player) e.getWhoClicked(); - if (e.getInventory().equals(inv) || e.getInventory().equals(p.getInventory())) { - GUI.this.onDrag(e); - } - } - } - - @EventHandler - public void onInventoryCloseEvent(InventoryCloseEvent event) { - if (event.getPlayer() instanceof Player && event.getInventory().equals(inv)) { - Player p = (Player) event.getPlayer(); - if (event.getInventory().equals(inv)) { - HandlerList.unregisterAll(this); - listener = null; - onClose(); - removeOpenedGUI(p); - } - } - } - }, Main.getInstance()); + if (listener == null) { + Main.regListener(listener = new GUIListener(this, player)); + } } diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/gui/GUIListener.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/gui/GUIListener.java new file mode 100644 index 0000000..a536c9d --- /dev/null +++ b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/gui/GUIListener.java @@ -0,0 +1,96 @@ +package cc.carm.plugin.ultrabackpack.util.gui; + +import cc.carm.plugin.ultrabackpack.Main; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryDragEvent; + +public class GUIListener implements Listener { + + final GUI currentGUI; + final Player player; + + public GUIListener(GUI gui, Player player) { + this.currentGUI = gui; + this.player = player; + } + + public GUI getCurrentGUI() { + return currentGUI; + } + + @EventHandler + public void onInventoryClickEvent(InventoryClickEvent event) { + if (!(event.getWhoClicked() instanceof Player)) return; + getCurrentGUI().rawClickListener(event); + + Player p = (Player) event.getWhoClicked(); + if (event.getSlot() != -999) { + try { + if (GUI.getOpenedGUI(p) == getCurrentGUI() + && event.getClickedInventory() != null + && event.getClickedInventory().equals(getCurrentGUI().inv) + && getCurrentGUI().items[event.getSlot()] != null) { + getCurrentGUI().items[event.getSlot()].realRawClickAction(event); + } + } catch (ArrayIndexOutOfBoundsException e) { + Main.error("error cause by GUI(" + getCurrentGUI() + "), name=" + getCurrentGUI().name); + e.printStackTrace(); + return; + } + } else if (getCurrentGUI().cancelOnOuter) { + event.setCancelled(true); + } + + if (GUI.hasOpenedGUI(p) + && GUI.getOpenedGUI(p) == getCurrentGUI() + && event.getClickedInventory() != null) { + + if (event.getClickedInventory().equals(getCurrentGUI().inv)) { + if (getCurrentGUI().cancelOnTarget) event.setCancelled(true); + + if (event.getSlot() != -999 && getCurrentGUI().items[event.getSlot()] != null) { + + GUIItem item = getCurrentGUI().items[event.getSlot()]; + + if (item.isActionActive()) { + item.onClick(event.getClick()); + item.rawClickAction(event); + item.actions.forEach(action -> action.run(event.getClick(), player)); + } + + item.actionsIgnoreActive.forEach(action -> action.run(event.getClick(), player)); + + } + } else if (event.getClickedInventory().equals(p.getInventory()) && getCurrentGUI().cancelOnSelf) { + event.setCancelled(true); + } + } + } + + @EventHandler + public void onDrag(InventoryDragEvent e) { + if (!(e.getWhoClicked() instanceof Player)) return; + Player p = (Player) e.getWhoClicked(); + if (e.getInventory().equals(getCurrentGUI().inv) || e.getInventory().equals(p.getInventory())) { + getCurrentGUI().onDrag(e); + } + + } + + @EventHandler + public void onInventoryCloseEvent(InventoryCloseEvent event) { + Player p = (Player) event.getPlayer(); + if (event.getInventory().equals(getCurrentGUI().inv)) { + HandlerList.unregisterAll(this); + getCurrentGUI().listener = null; + getCurrentGUI().onClose(); + GUI.removeOpenedGUI(p); + } + } + +} diff --git a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/gui/PagedGUI.java b/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/gui/PagedGUI.java deleted file mode 100644 index 37c0c44..0000000 --- a/ultrabackpack-plugin/src/main/java/cc/carm/plugin/ultrabackpack/util/gui/PagedGUI.java +++ /dev/null @@ -1,75 +0,0 @@ -package cc.carm.plugin.ultrabackpack.util.gui; - - -import java.util.ArrayList; -import java.util.List; - -public abstract class PagedGUI extends GUI { - - protected List container = new ArrayList<>(); - public int page = 1; - - public PagedGUI(GUIType type, String name) { - super(type, name); - } - - public int addItem(GUIItem i) { - container.add(i); - return container.size() - 1; - } - - /** - * 从GUI中移除一个物品 - * - * @param item 物品 - */ - public void removeItem(GUIItem item) { - container.remove(item); - } - - /** - * 从GUI中移除一个物品 - * - * @param slot 物品格子数 - */ - public void removeItem(int slot) { - container.remove(slot); - } - - public List getItemsContainer() { - return new ArrayList<>(container); - } - - /** - * 前往上一页 - */ - public void goPreviousPage() { - if (hasPreviousPage()) - page--; - else - throw new IndexOutOfBoundsException(); - } - - - /** - * 前往下一页 - */ - public void goNextPage() { - if (hasNextPage()) - page++; - else - throw new IndexOutOfBoundsException(); - } - - - /** - * @return 是否有上一页 - */ - public abstract boolean hasPreviousPage(); - - /** - * @return 是否有下一页 - */ - public abstract boolean hasNextPage(); - -} diff --git a/ultrabackpack-plugin/src/main/resources/config.yml b/ultrabackpack-plugin/src/main/resources/config.yml index 3f82541..e4d9436 100644 --- a/ultrabackpack-plugin/src/main/resources/config.yml +++ b/ultrabackpack-plugin/src/main/resources/config.yml @@ -27,12 +27,20 @@ storage: username: "username" password: "password" + +# 玩家收集配置 +# 用于决定玩家在哪些情况下的物品会自动放入背包 +collect: + pickup: true # 捡取物品 + kill: true #杀死动物 + break: true #破坏方块 + # 通用配置 general: # 针对每一件物品的额外介绍 # 将添加到背包界面内的物品上,避免重复配置 - addtional-lore: + additional-lore: - " " - "&f仓库内数量 &a%(amount)" - "&f该物品单价 &a%(price)" @@ -65,10 +73,10 @@ general: - "&7共计获得 &e%(money) &7元作为回报。" - " " - "&a&l点击确认售出" - cancel: "&c取消售出" + cancel: type: REDSTONE data: 0 - name: "&a确认售出" + name: "&c取消售出" lore: - " " - "&c&l点击取消售出" \ No newline at end of file diff --git a/ultrabackpack-plugin/src/main/resources/plugin.yml b/ultrabackpack-plugin/src/main/resources/plugin.yml index de9d912..7c6595b 100644 --- a/ultrabackpack-plugin/src/main/resources/plugin.yml +++ b/ultrabackpack-plugin/src/main/resources/plugin.yml @@ -8,9 +8,17 @@ website: ${project.parent.url} author: CarmJos permissions: - "${project.name}.use": + + "UltraBackpack.use": description: "超级背包的基本使用权限" default: true - "${project.name}.admin": + + "UltraBackpack.auto": + description: "超级背包的自动收集权限" + + "UltraBackpack.auto.enable": + description: "用于判断是否启用了自动收集功能" + + "UltraBackpack.admin": description: "超级背包的管理权限" default: op \ No newline at end of file diff --git a/ultrabackpack-plugin/src/test/java/ActionReadTest.java b/ultrabackpack-plugin/src/test/java/ActionReadTest.java new file mode 100644 index 0000000..01bc39c --- /dev/null +++ b/ultrabackpack-plugin/src/test/java/ActionReadTest.java @@ -0,0 +1,51 @@ +import cc.carm.plugin.ultrabackpack.configuration.gui.GUIActionType; +import cc.carm.plugin.ultrabackpack.manager.ConfigManager; +import org.bukkit.event.inventory.ClickType; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +public class ActionReadTest { + + + @Test + public void test() { + + List actions = Arrays.asList( + "[CHAT] 123123", + "[SHIFT_LEFT:CHAT] /test qwq", + "[CONSOLE] say hello", + "[CLOSE]" + ); + + for (String actionString : actions) { + int prefixStart = actionString.indexOf("["); + int prefixEnd = actionString.indexOf("]"); + if (prefixStart < 0 || prefixEnd < 0) continue; + + String prefix = actionString.substring(prefixStart + 1, prefixEnd); + ClickType clickType = null; + GUIActionType actionType = null; + if (prefix.contains(":")) { + String[] args = prefix.split(":"); + clickType = ConfigManager.readClickType(args[0]); + actionType = GUIActionType.readActionType(args[1]); + } else { + actionType = GUIActionType.readActionType(prefix); + } + + if (actionType == null) { + System.out.println("# " + actionString); + System.out.println("- actionType is Null"); + continue; + } + + System.out.println("# " + actionType.name() + " " + (clickType == null ? "" : clickType.name())); + System.out.println("- " + actionString.substring(prefixEnd + 1).trim()); + } + + + } + +}