mirror of
https://github.com/CarmJos/UltraDepository.git
synced 2024-09-19 19:55:45 +00:00
完成用户数据部分与变量部分
This commit is contained in:
parent
abf82e1a91
commit
5bcea5f24b
@ -1,7 +1,7 @@
|
|||||||
name: "&c&l矿业仓库"
|
name: "&c&l矿业仓库"
|
||||||
|
|
||||||
capacity:
|
capacity:
|
||||||
default: 1000
|
default: 0 # 若为0则默认不可以使用该仓库
|
||||||
permissions:
|
permissions:
|
||||||
- "ub.miner.vip:5000"
|
- "ub.miner.vip:5000"
|
||||||
|
|
||||||
|
45
README.md
45
README.md
@ -44,9 +44,36 @@
|
|||||||
<summary>展开查看所有子指令</summary>
|
<summary>展开查看所有子指令</summary>
|
||||||
|
|
||||||
```text
|
```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)
|
||||||
|
- 为玩家售出相关物品。
|
||||||
|
- 若不填写数量,则售出所有对应背包的对应物品。
|
||||||
|
- 若不填写物品,则售出对应背包内所有物品。
|
||||||
|
- 若不填写背包,则售出所有背包内所有物品。
|
||||||
|
- 该指令受到玩家每日售出数量的限制。
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
@ -58,15 +85,28 @@
|
|||||||
<details>
|
<details>
|
||||||
<summary>展开查看所有变量</summary>
|
<summary>展开查看所有变量</summary>
|
||||||
|
|
||||||
```yaml
|
```text
|
||||||
|
# %UltraBackpack_amount_<背包ID>_<物品ID>%
|
||||||
|
- 得到对应背包内对应物品的数量
|
||||||
|
|
||||||
|
# %UltraBackpack_price_<背包ID>_<物品ID>%
|
||||||
|
- 得到对应背包内对应物品的价格
|
||||||
|
|
||||||
|
# %UltraBackpack_sold_<背包ID>_<物品ID>%
|
||||||
|
- 得到对应背包内对应物品的今日售出数量
|
||||||
|
|
||||||
|
# %UltraBackpack_limit_<背包ID>_<物品ID>%
|
||||||
|
- 得到对应背包内对应物品的每日售出限制
|
||||||
|
|
||||||
|
# %UltraBackpack_remain_<背包ID>_<物品ID>%
|
||||||
|
- 得到对应背包内对应物品的剩余可售出数量
|
||||||
|
- $剩余可售出数量 = $每日售出限制 - $今日售出数量
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## 插件权限
|
## 插件权限
|
||||||
|
|
||||||
|
|
||||||
## 配置文件
|
## 配置文件
|
||||||
|
|
||||||
### [插件配置文件](ultrabackpack-plugin/src/main/resources/config.yml) (config.yml)
|
### [插件配置文件](ultrabackpack-plugin/src/main/resources/config.yml) (config.yml)
|
||||||
@ -92,7 +132,6 @@
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
||||||
## 支持与捐赠
|
## 支持与捐赠
|
||||||
|
|
||||||
若您觉得本插件做的不错,您可以捐赠支持我!
|
若您觉得本插件做的不错,您可以捐赠支持我!
|
||||||
|
@ -1,4 +1,17 @@
|
|||||||
package cc.carm.plugin.ultrabackpack.api;
|
package cc.carm.plugin.ultrabackpack.api;
|
||||||
|
|
||||||
|
import cc.carm.plugin.ultrabackpack.api.manager.UBUserManager;
|
||||||
|
|
||||||
public class UltraBackpackAPI {
|
public class UltraBackpackAPI {
|
||||||
|
|
||||||
|
private static UBUserManager userManager;
|
||||||
|
|
||||||
|
public static void initialize(UBUserManager userManager) {
|
||||||
|
UltraBackpackAPI.userManager = userManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UBUserManager getUserManager() {
|
||||||
|
return userManager;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
package cc.carm.plugin.ultrabackpack.api.configuration.backpack;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public interface BackpackCapacity {
|
|
||||||
|
|
||||||
|
|
||||||
int getDefault();
|
|
||||||
|
|
||||||
Map<Integer, String> getPermissions();
|
|
||||||
|
|
||||||
}
|
|
@ -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<String, BackpackItem> getItems();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -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<String> getDisplayLore();
|
|
||||||
|
|
||||||
}
|
|
@ -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();
|
|
||||||
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
package cc.carm.plugin.ultrabackpack.api.configuration.gui;
|
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public interface GUIConfiguration {
|
|
||||||
|
|
||||||
|
|
||||||
String getTitle();
|
|
||||||
|
|
||||||
int getLines();
|
|
||||||
|
|
||||||
Map<Integer, GUIItemDetail> getItems();
|
|
||||||
|
|
||||||
}
|
|
@ -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<GUIAction> getActions();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,25 +1,27 @@
|
|||||||
package cc.carm.plugin.ultrabackpack.api.data;
|
package cc.carm.plugin.ultrabackpack.api.data;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class UBContentsData {
|
public class UBContentsData {
|
||||||
|
|
||||||
private final Map<String, UBItemData> contents;
|
private final Map<@NotNull String, @NotNull UBItemData> contents;
|
||||||
|
|
||||||
public UBContentsData(Map<String, UBItemData> contents) {
|
public UBContentsData(Map<@NotNull String, @NotNull UBItemData> contents) {
|
||||||
this.contents = contents;
|
this.contents = contents;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, UBItemData> getContents() {
|
public @NotNull Map<String, UBItemData> getContents() {
|
||||||
return this.contents;
|
return this.contents;
|
||||||
}
|
}
|
||||||
|
|
||||||
public UBItemData getItemData(String itemType) {
|
public @Nullable UBItemData getItemData(@NotNull String itemType) {
|
||||||
return getContents().get(itemType);
|
return getContents().get(itemType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static UBContentsData emptyContents() {
|
public static UBContentsData emptyContents() {
|
||||||
return new UBContentsData(new HashMap<>());
|
return new UBContentsData(new HashMap<>());
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,14 @@ public class UBItemData {
|
|||||||
return sold;
|
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() {
|
public void clearSold() {
|
||||||
this.sold = 0;
|
this.sold = 0;
|
||||||
}
|
}
|
||||||
|
@ -16,15 +16,29 @@ public interface UBUserData {
|
|||||||
|
|
||||||
@NotNull Set<String> getBackpackIDs();
|
@NotNull Set<String> 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();
|
boolean isCurrentDay();
|
||||||
|
|
||||||
void updateDate();
|
void checkoutDate();
|
||||||
|
|
||||||
void save() throws Exception;
|
void save() throws Exception;
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ public interface UBUserManager {
|
|||||||
UBUserData getData(@NotNull Player player);
|
UBUserData getData(@NotNull Player player);
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
UBUserData loaData(@NotNull UUID userUUID);
|
UBUserData loadData(@NotNull UUID userUUID);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
|
|
||||||
}
|
|
@ -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.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
@ -1,4 +1,4 @@
|
|||||||
package cc.carm.plugin.ultrabackpack.util;
|
package cc.carm.plugin.ultrabackpack.api.util;
|
||||||
|
|
||||||
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
@ -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 me.clip.placeholderapi.PlaceholderAPI;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
@ -31,11 +32,7 @@ public class MessageUtil {
|
|||||||
|
|
||||||
public static void sendWithPlaceholders(@Nullable CommandSender sender, List<String> messages) {
|
public static void sendWithPlaceholders(@Nullable CommandSender sender, List<String> messages) {
|
||||||
if (messages == null || messages.isEmpty() || sender == null) return;
|
if (messages == null || messages.isEmpty() || sender == null) return;
|
||||||
if (hasPlaceholderAPI() && sender instanceof Player) {
|
send(sender, setPlaceholders(sender, messages));
|
||||||
send(sender, PlaceholderAPI.setPlaceholders((Player) sender, messages));
|
|
||||||
} else {
|
|
||||||
send(sender, messages);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void sendWithPlaceholders(@Nullable CommandSender sender, List<String> messages, String param, Object value) {
|
public static void sendWithPlaceholders(@Nullable CommandSender sender, List<String> messages, String param, Object value) {
|
||||||
@ -46,6 +43,15 @@ public class MessageUtil {
|
|||||||
sendWithPlaceholders(sender, setCustomParams(messages, params, values));
|
sendWithPlaceholders(sender, setCustomParams(messages, params, values));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<String> setPlaceholders(@Nullable CommandSender sender, List<String> 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<String> setCustomParams(List<String> messages, String param, Object value) {
|
public static List<String> setCustomParams(List<String> messages, String param, Object value) {
|
||||||
return setCustomParams(messages, new String[]{param}, new Object[]{value});
|
return setCustomParams(messages, new String[]{param}, new Object[]{value});
|
||||||
}
|
}
|
@ -73,7 +73,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<artifactId>easysql-beecp</artifactId>
|
<artifactId>easysql-beecp</artifactId>
|
||||||
<version>0.2.2</version>
|
<version>0.2.3</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
@ -1,8 +1,19 @@
|
|||||||
package cc.carm.plugin.ultrabackpack;
|
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.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.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.Bukkit;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.PluginCommand;
|
import org.bukkit.command.PluginCommand;
|
||||||
@ -15,6 +26,13 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
public class Main extends JavaPlugin {
|
public class Main extends JavaPlugin {
|
||||||
|
|
||||||
private static Main instance;
|
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
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
@ -25,9 +43,53 @@ public class Main extends JavaPlugin {
|
|||||||
log("加载配置文件...");
|
log("加载配置文件...");
|
||||||
ConfigManager.initConfig();
|
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("注册监听器...");
|
log("注册监听器...");
|
||||||
|
regListener(new UserListener());
|
||||||
|
regListener(new CollectListener());
|
||||||
|
|
||||||
|
log("注册指令...");
|
||||||
|
|
||||||
|
|
||||||
|
if (MessageUtil.hasPlaceholderAPI()) {
|
||||||
|
log("注册变量...");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
log("检测到未安装PlaceholderAPI,跳过变量注册。");
|
||||||
|
}
|
||||||
|
|
||||||
|
UltraBackpackAPI.initialize(getUserManager());
|
||||||
|
|
||||||
log("加载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
|
log("加载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
|
||||||
|
|
||||||
@ -38,11 +100,39 @@ public class Main extends JavaPlugin {
|
|||||||
log(getName() + " " + getDescription().getVersion() + " 开始卸载...");
|
log(getName() + " " + getDescription().getVersion() + " 开始卸载...");
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
log("保存现有用户数据...");
|
||||||
|
|
||||||
|
|
||||||
|
log("释放存储源...");
|
||||||
|
getStorage().shutdown();
|
||||||
|
|
||||||
log("卸载监听器...");
|
log("卸载监听器...");
|
||||||
Bukkit.getServicesManager().unregisterAll(this);
|
Bukkit.getServicesManager().unregisterAll(this);
|
||||||
|
|
||||||
log("卸载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 注册监听器
|
* 注册监听器
|
||||||
*
|
*
|
||||||
|
@ -1,6 +1,13 @@
|
|||||||
package cc.carm.plugin.ultrabackpack.configuration;
|
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.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 {
|
public class PluginConfig {
|
||||||
|
|
||||||
@ -8,4 +15,125 @@ public class PluginConfig {
|
|||||||
"debug", Boolean.class
|
"debug", Boolean.class
|
||||||
);
|
);
|
||||||
|
|
||||||
|
public static final ConfigValue<String> STORAGE_METHOD = new ConfigValue<>(
|
||||||
|
"storage.method", String.class
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 收集配置
|
||||||
|
*/
|
||||||
|
public static class Collect {
|
||||||
|
|
||||||
|
public static final ConfigValue<Boolean> PICKUP = new ConfigValue<>(
|
||||||
|
"collect.pickup", Boolean.class, true
|
||||||
|
);
|
||||||
|
|
||||||
|
public static final ConfigValue<Boolean> KILL = new ConfigValue<>(
|
||||||
|
"collect.kill", Boolean.class, true
|
||||||
|
);
|
||||||
|
|
||||||
|
public static final ConfigValue<Boolean> BREAK = new ConfigValue<>(
|
||||||
|
"collect.break", Boolean.class, true
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通用配置
|
||||||
|
*/
|
||||||
|
public static class General {
|
||||||
|
/**
|
||||||
|
* 针对每一件物品的额外介绍
|
||||||
|
* 将添加到背包界面内的物品上,避免重复配置
|
||||||
|
*/
|
||||||
|
public static final ConfigValueList<String> ADDITIONAL_LORE = new ConfigValueList<>(
|
||||||
|
"general.additional-lore", String.class
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提示玩家点击行为的介绍
|
||||||
|
* 将添加到背包界面内的物品上,避免重复配置
|
||||||
|
*/
|
||||||
|
public static final ConfigValueList<String> CLICK_LORE = new ConfigValueList<>(
|
||||||
|
"general.click-lore", String.class
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 售出界面的配置
|
||||||
|
*/
|
||||||
|
public static class SellGUI {
|
||||||
|
|
||||||
|
|
||||||
|
public static final ConfigValue<String> TITLE = new ConfigValue<>(
|
||||||
|
"general.sell-gui.title", String.class
|
||||||
|
);
|
||||||
|
|
||||||
|
public static class Items {
|
||||||
|
|
||||||
|
public static final ConfigSectionCast<ItemStack> 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<String> 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<ItemStack> 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<String> 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<ItemStack> 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<String> 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<ItemStack> 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<String> lore = section.getStringList("lore");
|
||||||
|
if (name != null) factory.setDisplayName(name);
|
||||||
|
if (!lore.isEmpty()) factory.setLore(lore);
|
||||||
|
return factory.toItemStack();
|
||||||
|
}, new ItemStack(Material.STONE)
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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<String, Integer> permissions;
|
||||||
|
|
||||||
|
public BackpackCapacity(int defaultCapacity, List<String> permissionStrings) {
|
||||||
|
this.defaultCapacity = defaultCapacity;
|
||||||
|
Map<String, Integer> 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<String, Integer> permissions) {
|
||||||
|
this.defaultCapacity = defaultCapacity;
|
||||||
|
this.permissions = permissions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDefault() {
|
||||||
|
return defaultCapacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NotNull Map<String, Integer> 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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<String, BackpackItem> items;
|
||||||
|
|
||||||
|
|
||||||
|
public BackpackConfiguration(String identifier, String name,
|
||||||
|
GUIConfiguration guiConfiguration,
|
||||||
|
BackpackCapacity capacity,
|
||||||
|
Map<String, BackpackItem> 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<String, BackpackItem> getItems() {
|
||||||
|
return this.items;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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<String> lore;
|
||||||
|
|
||||||
|
public BackpackItem(@NotNull Material material, int data,
|
||||||
|
int slot, int price, int limit,
|
||||||
|
@Nullable String name, @Nullable List<String> 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<String> 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -10,6 +10,8 @@ import java.io.IOException;
|
|||||||
|
|
||||||
public class FileConfig {
|
public class FileConfig {
|
||||||
|
|
||||||
|
private long updateTime;
|
||||||
|
|
||||||
private final JavaPlugin plugin;
|
private final JavaPlugin plugin;
|
||||||
private final String fileName;
|
private final String fileName;
|
||||||
|
|
||||||
@ -28,6 +30,7 @@ public class FileConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void initFile() {
|
private void initFile() {
|
||||||
|
this.updateTime = System.currentTimeMillis();
|
||||||
this.file = new File(plugin.getDataFolder(), fileName);
|
this.file = new File(plugin.getDataFolder(), fileName);
|
||||||
if (!this.file.exists()) {
|
if (!this.file.exists()) {
|
||||||
if (!this.file.getParentFile().exists()) {
|
if (!this.file.getParentFile().exists()) {
|
||||||
@ -55,10 +58,19 @@ public class FileConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void reload() {
|
public void reload() {
|
||||||
|
this.updateTime = System.currentTimeMillis();
|
||||||
if (getFile().exists()) {
|
if (getFile().exists()) {
|
||||||
this.config = YamlConfiguration.loadConfiguration(getFile());
|
this.config = YamlConfiguration.loadConfiguration(getFile());
|
||||||
} else {
|
} else {
|
||||||
initFile();
|
initFile();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long getUpdateTime() {
|
||||||
|
return updateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isExpired(long time) {
|
||||||
|
return getUpdateTime() > time;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 向玩家发送声音。
|
||||||
|
* 允许配置音量与音调
|
||||||
|
* <ul>
|
||||||
|
* <li>SOUND_NAME</li>
|
||||||
|
* <li>SOUND_NAME:VOLUME</li>
|
||||||
|
* <li>SOUND_NAME:VOLUME:PITCH</li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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<GUIItem, Integer> guiItems;
|
||||||
|
|
||||||
|
public GUIConfiguration(String title, int lines, Multimap<GUIItem, Integer> 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<GUIItem, Integer> getGuiItems() {
|
||||||
|
return guiItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setupItems(GUI gui) {
|
||||||
|
getGuiItems().forEach((gui::setItem));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -3,7 +3,7 @@ package cc.carm.plugin.ultrabackpack.configuration.message;
|
|||||||
|
|
||||||
import cc.carm.plugin.ultrabackpack.configuration.values.ConfigValue;
|
import cc.carm.plugin.ultrabackpack.configuration.values.ConfigValue;
|
||||||
import cc.carm.plugin.ultrabackpack.manager.ConfigManager;
|
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.bukkit.command.CommandSender;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
@ -3,7 +3,7 @@ package cc.carm.plugin.ultrabackpack.configuration.message;
|
|||||||
|
|
||||||
import cc.carm.plugin.ultrabackpack.configuration.values.ConfigValueList;
|
import cc.carm.plugin.ultrabackpack.configuration.values.ConfigValueList;
|
||||||
import cc.carm.plugin.ultrabackpack.manager.ConfigManager;
|
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.bukkit.command.CommandSender;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
@ -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<V> {
|
||||||
|
|
||||||
|
FileConfig source;
|
||||||
|
|
||||||
|
String configSection;
|
||||||
|
@NotNull Function<ConfigurationSection, V> valueCast;
|
||||||
|
V defaultValue;
|
||||||
|
|
||||||
|
V valueCache;
|
||||||
|
long updateTime;
|
||||||
|
|
||||||
|
public ConfigSectionCast(String configSection, @NotNull Function<ConfigurationSection, V> valueCast) {
|
||||||
|
this(configSection, valueCast, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConfigSectionCast(String configSection,
|
||||||
|
@NotNull Function<ConfigurationSection, V> valueCast,
|
||||||
|
V defaultValue) {
|
||||||
|
this(ConfigManager.getPluginConfig(), configSection, valueCast, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConfigSectionCast(FileConfig source, String configSection,
|
||||||
|
@NotNull Function<ConfigurationSection, V> 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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<V> {
|
||||||
|
|
||||||
|
FileConfig source;
|
||||||
|
|
||||||
|
String configSection;
|
||||||
|
@NotNull Function<String, V> valueCast;
|
||||||
|
V defaultValue;
|
||||||
|
|
||||||
|
V valueCache;
|
||||||
|
long updateTime;
|
||||||
|
|
||||||
|
public ConfigStringCast(String configSection, @NotNull Function<String, V> valueCast) {
|
||||||
|
this(configSection, valueCast, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConfigStringCast(String configSection, @NotNull Function<String, V> valueCast, V defaultValue) {
|
||||||
|
this(ConfigManager.getPluginConfig(), configSection, valueCast, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConfigStringCast(FileConfig source, String configSection, @NotNull Function<String, V> 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -23,6 +23,8 @@ public class ConfigValueMap<K, V> {
|
|||||||
|
|
||||||
@Nullable LinkedHashMap<K, V> valueCache;
|
@Nullable LinkedHashMap<K, V> valueCache;
|
||||||
|
|
||||||
|
long updateTime;
|
||||||
|
|
||||||
public ConfigValueMap(@NotNull String configSection, @NotNull Function<String, K> keyCast,
|
public ConfigValueMap(@NotNull String configSection, @NotNull Function<String, K> keyCast,
|
||||||
@NotNull Class<V> valueClazz) {
|
@NotNull Class<V> valueClazz) {
|
||||||
this(ConfigManager.getPluginConfig(), configSection, keyCast, valueClazz);
|
this(ConfigManager.getPluginConfig(), configSection, keyCast, valueClazz);
|
||||||
@ -47,7 +49,7 @@ public class ConfigValueMap<K, V> {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public Map<K, V> get() {
|
public Map<K, V> get() {
|
||||||
if (valueCache != null) return valueCache;
|
if (valueCache != null && !this.source.isExpired(this.updateTime)) return valueCache;
|
||||||
ConfigurationSection section = getConfiguration().getConfigurationSection(this.configSection);
|
ConfigurationSection section = getConfiguration().getConfigurationSection(this.configSection);
|
||||||
if (section == null) return new LinkedHashMap<>();
|
if (section == null) return new LinkedHashMap<>();
|
||||||
Set<String> keys = section.getKeys(false);
|
Set<String> keys = section.getKeys(false);
|
||||||
@ -62,6 +64,7 @@ public class ConfigValueMap<K, V> {
|
|||||||
result.put(finalKey, finalValue);
|
result.put(finalKey, finalValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.updateTime = System.currentTimeMillis();
|
||||||
this.valueCache = result;
|
this.valueCache = result;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
package cc.carm.plugin.ultrabackpack.data;
|
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.UBContentsData;
|
||||||
|
import cc.carm.plugin.ultrabackpack.api.data.UBItemData;
|
||||||
import cc.carm.plugin.ultrabackpack.api.data.UBUserData;
|
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.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.sql.Date;
|
import java.sql.Date;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -19,7 +22,8 @@ public class UserData implements UBUserData {
|
|||||||
|
|
||||||
Date day;
|
Date day;
|
||||||
|
|
||||||
public UserData(UUID userUUID, UBStorage storage, Map<String, UBContentsData> backpacks, Date day) {
|
public UserData(UUID userUUID, UBStorage storage,
|
||||||
|
Map<String, UBContentsData> backpacks, Date day) {
|
||||||
this.userUUID = userUUID;
|
this.userUUID = userUUID;
|
||||||
this.storage = storage;
|
this.storage = storage;
|
||||||
this.backpacks = backpacks;
|
this.backpacks = backpacks;
|
||||||
@ -36,7 +40,8 @@ public class UserData implements UBUserData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull UBContentsData getBackpack(String backpackID) {
|
public @Nullable UBContentsData getBackpack(String backpackID) {
|
||||||
|
if (!Main.getBackpackManager().hasBackpack(backpackID)) return null;
|
||||||
if (!getBackpacks().containsKey(backpackID)) {
|
if (!getBackpacks().containsKey(backpackID)) {
|
||||||
getBackpacks().put(backpackID, UBContentsData.emptyContents());
|
getBackpacks().put(backpackID, UBContentsData.emptyContents());
|
||||||
}
|
}
|
||||||
@ -49,17 +54,76 @@ public class UserData implements UBUserData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getItemAmount(String backpackID, String typeID) {
|
public @Nullable UBItemData getItemData(@NotNull String backpackID, @NotNull String typeID) {
|
||||||
return getBackpack(backpackID).getItemData(typeID).getAmount();
|
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
|
@Override
|
||||||
public int getItemSold(String backpackID, String typeID) {
|
public @Nullable Integer getItemSold(@NotNull String backpackID, @NotNull String typeID) {
|
||||||
return getBackpack(backpackID).getItemData(typeID).getSold();
|
checkoutDate();
|
||||||
|
UBItemData data = getItemData(backpackID, typeID);
|
||||||
|
if (data == null) return null;
|
||||||
|
return data.getSold();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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;
|
return this.day;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,8 +133,12 @@ public class UserData implements UBUserData {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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
|
@Override
|
||||||
|
@ -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<String> PLACEHOLDERS = Arrays.asList(
|
||||||
|
"%UltraBackpack_%",
|
||||||
|
"%UltraBackpack_%"
|
||||||
|
);
|
||||||
|
|
||||||
|
JavaPlugin plugin;
|
||||||
|
|
||||||
|
public UBExpansion(JavaPlugin plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull List<String> 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 "参数错误";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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<Economy> 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
package cc.carm.plugin.ultrabackpack.listener;
|
package cc.carm.plugin.ultrabackpack.listener;
|
||||||
|
|
||||||
|
import cc.carm.plugin.ultrabackpack.configuration.PluginConfig;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
@ -15,6 +16,7 @@ public class CollectListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onBreak(BlockBreakEvent event) {
|
public void onBreak(BlockBreakEvent event) {
|
||||||
|
if (!PluginConfig.Collect.BREAK.get()) return;
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
|
|
||||||
Collection<ItemStack> drops = event.getBlock().getDrops();
|
Collection<ItemStack> drops = event.getBlock().getDrops();
|
||||||
@ -23,6 +25,7 @@ public class CollectListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onBreak(EntityDeathEvent event) {
|
public void onBreak(EntityDeathEvent event) {
|
||||||
|
if (!PluginConfig.Collect.KILL.get()) return;
|
||||||
Player player = event.getEntity().getKiller();
|
Player player = event.getEntity().getKiller();
|
||||||
if (player == null) return;
|
if (player == null) return;
|
||||||
|
|
||||||
@ -30,6 +33,7 @@ public class CollectListener implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void onPickup(EntityPickupItemEvent event) {
|
public void onPickup(EntityPickupItemEvent event) {
|
||||||
|
if (!PluginConfig.Collect.PICKUP.get()) return;
|
||||||
if (!(event.getEntity() instanceof Player)) return;
|
if (!(event.getEntity() instanceof Player)) return;
|
||||||
Player player = (Player) event.getEntity();
|
Player player = (Player) event.getEntity();
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -3,6 +3,19 @@ package cc.carm.plugin.ultrabackpack.manager;
|
|||||||
|
|
||||||
import cc.carm.plugin.ultrabackpack.Main;
|
import cc.carm.plugin.ultrabackpack.Main;
|
||||||
import cc.carm.plugin.ultrabackpack.configuration.file.FileConfig;
|
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 {
|
public class ConfigManager {
|
||||||
|
|
||||||
@ -32,5 +45,60 @@ public class ConfigManager {
|
|||||||
getMessageConfig().save();
|
getMessageConfig().save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static GUIConfiguration readConfiguration(ConfigurationSection section) {
|
||||||
|
String title = section.getString("title", "");
|
||||||
|
int liens = section.getInt("lines", 6);
|
||||||
|
Multimap<GUIItem, Integer> 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<GUIItem, List<Integer>> readItem(@Nullable ConfigurationSection itemSection) {
|
||||||
|
if (itemSection == null) return null;
|
||||||
|
ItemStack icon = itemSection.getItemStack("icon", new ItemStack(Material.STONE));
|
||||||
|
List<Integer> slots = itemSection.getIntegerList("slots");
|
||||||
|
int slot = itemSection.getInt("slot", 0);
|
||||||
|
|
||||||
|
List<String> actionsString = itemSection.getStringList("actions");
|
||||||
|
List<GUIActionConfiguration> 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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<UUID, UserData> dataCache = new HashMap<>();
|
||||||
|
|
||||||
|
public HashMap<UUID, UserData> 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()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
package cc.carm.plugin.ultrabackpack.storage;
|
package cc.carm.plugin.ultrabackpack.storage;
|
||||||
|
|
||||||
import cc.carm.plugin.ultrabackpack.api.data.UBUserData;
|
import cc.carm.plugin.ultrabackpack.Main;
|
||||||
import cc.carm.plugin.ultrabackpack.api.storage.UBStorage;
|
import cc.carm.plugin.ultrabackpack.configuration.values.ConfigValue;
|
||||||
import cc.carm.plugin.ultrabackpack.data.UserData;
|
import cc.carm.plugin.ultrabackpack.data.UserData;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@ -12,6 +12,10 @@ import java.util.UUID;
|
|||||||
|
|
||||||
public class FileStorage implements UBStorage {
|
public class FileStorage implements UBStorage {
|
||||||
|
|
||||||
|
private static final ConfigValue<String> FILE_PATH = new ConfigValue<>(
|
||||||
|
"storage.file-path", String.class, "data"
|
||||||
|
);
|
||||||
|
|
||||||
private File dataContainer;
|
private File dataContainer;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -19,14 +23,27 @@ public class FileStorage implements UBStorage {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void shutdown() {
|
||||||
|
// 似乎没什么需要做的
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull UserData loadData(@NotNull UUID uuid) {
|
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()));
|
return new UserData(uuid, this, new HashMap<>(), new Date(System.currentTimeMillis()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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。"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,8 +7,7 @@ import cc.carm.lib.easysql.api.action.query.SQLQuery;
|
|||||||
import cc.carm.plugin.ultrabackpack.Main;
|
import cc.carm.plugin.ultrabackpack.Main;
|
||||||
import cc.carm.plugin.ultrabackpack.api.data.UBContentsData;
|
import cc.carm.plugin.ultrabackpack.api.data.UBContentsData;
|
||||||
import cc.carm.plugin.ultrabackpack.api.data.UBItemData;
|
import cc.carm.plugin.ultrabackpack.api.data.UBItemData;
|
||||||
import cc.carm.plugin.ultrabackpack.api.data.UBUserData;
|
import cc.carm.plugin.ultrabackpack.configuration.PluginConfig;
|
||||||
import cc.carm.plugin.ultrabackpack.api.storage.UBStorage;
|
|
||||||
import cc.carm.plugin.ultrabackpack.configuration.values.ConfigValue;
|
import cc.carm.plugin.ultrabackpack.configuration.values.ConfigValue;
|
||||||
import cc.carm.plugin.ultrabackpack.data.UserData;
|
import cc.carm.plugin.ultrabackpack.data.UserData;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
@ -27,18 +26,18 @@ import java.util.UUID;
|
|||||||
|
|
||||||
public class MySQLStorage implements UBStorage {
|
public class MySQLStorage implements UBStorage {
|
||||||
|
|
||||||
public static final ConfigValue<String> DRIVER_NAME = new ConfigValue<>(
|
private static final ConfigValue<String> DRIVER_NAME = new ConfigValue<>(
|
||||||
"storage.mysql.driver", String.class, "com.mysql.jdbc.Driver"
|
"storage.mysql.driver", String.class, "com.mysql.jdbc.Driver"
|
||||||
);
|
);
|
||||||
|
|
||||||
public static final ConfigValue<String> URL = new ConfigValue<>(
|
private static final ConfigValue<String> URL = new ConfigValue<>(
|
||||||
"storage.mysql.url", String.class, "jdbc:mysql://127.0.0.1:3306/minecraft"
|
"storage.mysql.url", String.class, "jdbc:mysql://127.0.0.1:3306/minecraft"
|
||||||
);
|
);
|
||||||
|
|
||||||
public static final ConfigValue<String> USERNAME = new ConfigValue<>(
|
private static final ConfigValue<String> USERNAME = new ConfigValue<>(
|
||||||
"storage.mysql.username", String.class, "username"
|
"storage.mysql.username", String.class, "username"
|
||||||
);
|
);
|
||||||
public static final ConfigValue<String> PASSWORD = new ConfigValue<>(
|
private static final ConfigValue<String> PASSWORD = new ConfigValue<>(
|
||||||
"storage.mysql.password", String.class, "password"
|
"storage.mysql.password", String.class, "password"
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -86,8 +85,9 @@ public class MySQLStorage implements UBStorage {
|
|||||||
public boolean initialize() {
|
public boolean initialize() {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Main.log("尝试连接到数据库...");
|
Main.log(" 尝试连接到数据库...");
|
||||||
this.sqlManager = EasySQL.createManager(DRIVER_NAME.get(), URL.get(), USERNAME.get(), PASSWORD.get());
|
this.sqlManager = EasySQL.createManager(DRIVER_NAME.get(), URL.get(), USERNAME.get(), PASSWORD.get());
|
||||||
|
this.sqlManager.setDebugMode(PluginConfig.DEBUG.get());
|
||||||
} catch (Exception exception) {
|
} catch (Exception exception) {
|
||||||
Main.error("无法连接到数据库,请检查配置文件。");
|
Main.error("无法连接到数据库,请检查配置文件。");
|
||||||
Main.error("Could not connect to the database, please check the configuration.");
|
Main.error("Could not connect to the database, please check the configuration.");
|
||||||
@ -96,7 +96,7 @@ public class MySQLStorage implements UBStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Main.log("创建插件所需表...");
|
Main.log(" 创建插件所需表...");
|
||||||
SQLTables.createTables(sqlManager);
|
SQLTables.createTables(sqlManager);
|
||||||
} catch (SQLException exception) {
|
} catch (SQLException exception) {
|
||||||
Main.error("无法创建插件所需的表,请检查数据库权限。");
|
Main.error("无法创建插件所需的表,请检查数据库权限。");
|
||||||
@ -109,8 +109,15 @@ public class MySQLStorage implements UBStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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()) {
|
try (SQLQuery query = createAction(uuid).execute()) {
|
||||||
ResultSet resultSet = query.getResultSet();
|
ResultSet resultSet = query.getResultSet();
|
||||||
Map<String, UBContentsData> dataMap = new HashMap<>();
|
Map<String, UBContentsData> dataMap = new HashMap<>();
|
||||||
@ -125,8 +132,11 @@ public class MySQLStorage implements UBStorage {
|
|||||||
if (contentsData != null) dataMap.put(backpackID, contentsData);
|
if (contentsData != null) dataMap.put(backpackID, contentsData);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Main.debug("通过 MySQLStorage 加载 " + uuid + " 的用户数据完成,"
|
||||||
|
+ "耗时 " + (System.currentTimeMillis() - start) + "ms。");
|
||||||
return new UserData(uuid, this, dataMap, date);
|
return new UserData(uuid, this, dataMap, date);
|
||||||
}
|
}
|
||||||
|
Main.debug("当前库内不存在玩家 " + uuid + " 的数据,视作新档。");
|
||||||
return new UserData(uuid, this, new HashMap<>(), new Date(System.currentTimeMillis()));
|
return new UserData(uuid, this, new HashMap<>(), new Date(System.currentTimeMillis()));
|
||||||
} catch (Exception exception) {
|
} catch (Exception exception) {
|
||||||
Main.error("在加载玩家 #" + uuid + " 的数据时出现异常。");
|
Main.error("在加载玩家 #" + uuid + " 的数据时出现异常。");
|
||||||
@ -136,25 +146,28 @@ public class MySQLStorage implements UBStorage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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();
|
JsonObject dataObject = new JsonObject();
|
||||||
|
|
||||||
for (String backpackID : data.getBackpackIDs()) {
|
data.getBackpacks().forEach((id, contents) -> dataObject.add(id, serializeContentsData(contents)));
|
||||||
JsonObject contentObject = serializeContentsData(data.getBackpack(backpackID));
|
|
||||||
if (contentObject != null) dataObject.add(backpackID, contentObject);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
getSQLManager().createReplace(SQLTables.USER_DATA.getName())
|
getSQLManager().createReplace(SQLTables.USER_DATA.getName())
|
||||||
.setColumnNames("uuid", "data", "day")
|
.setColumnNames("uuid", "data", "day")
|
||||||
.setParams(data.getUserUUID(), GSON.toJson(dataObject), data.getDataDay())
|
.setParams(data.getUserUUID(), GSON.toJson(dataObject), data.getDate())
|
||||||
.execute();
|
.execute();
|
||||||
} catch (SQLException exception) {
|
} catch (SQLException exception) {
|
||||||
Main.error("在加载玩家 #" + data.getUserUUID() + " 的数据时出现异常。");
|
Main.error("在保存玩家 #" + data.getUserUUID() + " 的数据时出现异常。");
|
||||||
Main.error("Error occurred when loading #" + data.getUserUUID() + " data.");
|
Main.error("Error occurred when saving #" + data.getUserUUID() + " data.");
|
||||||
throw new Exception(exception);
|
throw new Exception(exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Main.debug("通过 MySQLStorage 保存 " + data.getUserUUID() + " 的用户数据完成," +
|
||||||
|
"耗时 " + (System.currentTimeMillis() - start) + "ms。");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private SQLManager getSQLManager() {
|
private SQLManager getSQLManager() {
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
package cc.carm.plugin.ultrabackpack.ui;
|
||||||
|
|
||||||
|
public class BackpackGUI {
|
||||||
|
}
|
@ -1,16 +1,12 @@
|
|||||||
package cc.carm.plugin.ultrabackpack.util.gui;
|
package cc.carm.plugin.ultrabackpack.util.gui;
|
||||||
|
|
||||||
import cc.carm.plugin.ultrabackpack.Main;
|
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.Bukkit;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.entity.HumanEntity;
|
import org.bukkit.entity.HumanEntity;
|
||||||
import org.bukkit.entity.Player;
|
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.InventoryClickEvent;
|
||||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
|
||||||
import org.bukkit.event.inventory.InventoryDragEvent;
|
import org.bukkit.event.inventory.InventoryDragEvent;
|
||||||
import org.bukkit.inventory.Inventory;
|
import org.bukkit.inventory.Inventory;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
@ -36,7 +32,7 @@ public class GUI {
|
|||||||
|
|
||||||
Map<String, Object> flags;
|
Map<String, Object> flags;
|
||||||
|
|
||||||
public Listener listener;
|
public GUIListener listener;
|
||||||
|
|
||||||
public GUI(GUIType type, String name) {
|
public GUI(GUIType type, String name) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
@ -186,80 +182,9 @@ public class GUI {
|
|||||||
this.inv = inv;
|
this.inv = inv;
|
||||||
player.openInventory(inv);
|
player.openInventory(inv);
|
||||||
|
|
||||||
if (listener == null)
|
if (listener == null) {
|
||||||
Bukkit.getPluginManager().registerEvents(listener = new Listener() {
|
Main.regListener(listener = new GUIListener(this, player));
|
||||||
@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());
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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<GUIItem> 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<GUIItem> 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();
|
|
||||||
|
|
||||||
}
|
|
@ -27,12 +27,20 @@ storage:
|
|||||||
username: "username"
|
username: "username"
|
||||||
password: "password"
|
password: "password"
|
||||||
|
|
||||||
|
|
||||||
|
# 玩家收集配置
|
||||||
|
# 用于决定玩家在哪些情况下的物品会自动放入背包
|
||||||
|
collect:
|
||||||
|
pickup: true # 捡取物品
|
||||||
|
kill: true #杀死动物
|
||||||
|
break: true #破坏方块
|
||||||
|
|
||||||
# 通用配置
|
# 通用配置
|
||||||
general:
|
general:
|
||||||
|
|
||||||
# 针对每一件物品的额外介绍
|
# 针对每一件物品的额外介绍
|
||||||
# 将添加到背包界面内的物品上,避免重复配置
|
# 将添加到背包界面内的物品上,避免重复配置
|
||||||
addtional-lore:
|
additional-lore:
|
||||||
- " "
|
- " "
|
||||||
- "&f仓库内数量 &a%(amount)"
|
- "&f仓库内数量 &a%(amount)"
|
||||||
- "&f该物品单价 &a%(price)"
|
- "&f该物品单价 &a%(price)"
|
||||||
@ -65,10 +73,10 @@ general:
|
|||||||
- "&7共计获得 &e%(money) &7元作为回报。"
|
- "&7共计获得 &e%(money) &7元作为回报。"
|
||||||
- " "
|
- " "
|
||||||
- "&a&l点击确认售出"
|
- "&a&l点击确认售出"
|
||||||
cancel: "&c取消售出"
|
cancel:
|
||||||
type: REDSTONE
|
type: REDSTONE
|
||||||
data: 0
|
data: 0
|
||||||
name: "&a确认售出"
|
name: "&c取消售出"
|
||||||
lore:
|
lore:
|
||||||
- " "
|
- " "
|
||||||
- "&c&l点击取消售出"
|
- "&c&l点击取消售出"
|
@ -8,9 +8,17 @@ website: ${project.parent.url}
|
|||||||
author: CarmJos
|
author: CarmJos
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
"${project.name}.use":
|
|
||||||
|
"UltraBackpack.use":
|
||||||
description: "超级背包的基本使用权限"
|
description: "超级背包的基本使用权限"
|
||||||
default: true
|
default: true
|
||||||
"${project.name}.admin":
|
|
||||||
|
"UltraBackpack.auto":
|
||||||
|
description: "超级背包的自动收集权限"
|
||||||
|
|
||||||
|
"UltraBackpack.auto.enable":
|
||||||
|
description: "用于判断是否启用了自动收集功能"
|
||||||
|
|
||||||
|
"UltraBackpack.admin":
|
||||||
description: "超级背包的管理权限"
|
description: "超级背包的管理权限"
|
||||||
default: op
|
default: op
|
51
ultrabackpack-plugin/src/test/java/ActionReadTest.java
Normal file
51
ultrabackpack-plugin/src/test/java/ActionReadTest.java
Normal file
@ -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<String> 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());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user