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());
+ }
+
+
+ }
+
+}