1
mirror of https://github.com/CarmJos/UltraDepository.git synced 2024-09-19 19:55:45 +00:00

完成用户数据部分与变量部分

This commit is contained in:
Carm Jos 2021-12-26 10:39:41 +08:00
parent abf82e1a91
commit 5bcea5f24b
51 changed files with 1644 additions and 351 deletions

View File

@ -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"

View File

@ -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>
## 支持与捐赠 ## 支持与捐赠
若您觉得本插件做的不错,您可以捐赠支持我! 若您觉得本插件做的不错,您可以捐赠支持我!

View File

@ -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;
}
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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;
} }

View File

@ -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;

View File

@ -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);
} }

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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});
} }

View File

@ -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>

View File

@ -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;
}
/** /**
* 注册监听器 * 注册监听器
* *

View File

@ -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)
);
}
}
}
} }

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

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

View File

@ -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;
}
} }

View File

@ -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);
}
};
}
}

View File

@ -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);
}
}

View File

@ -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));
}
}

View File

@ -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;

View File

@ -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;

View File

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

View File

@ -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;
}
}

View File

@ -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;
} }

View File

@ -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

View File

@ -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 "参数错误";
}
}
}
}

View File

@ -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);
}
}

View File

@ -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,14 +16,16 @@ 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();
} }
@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();

View File

@ -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);
});
}
}

View File

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

View File

@ -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);
}
} }

View File

@ -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);
}
}

View File

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

View File

@ -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。"
);
} }
} }

View File

@ -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() {

View File

@ -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;
}

View File

@ -0,0 +1,4 @@
package cc.carm.plugin.ultrabackpack.ui;
public class BackpackGUI {
}

View File

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

View File

@ -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);
}
}
}

View File

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

View File

@ -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点击取消售出"

View File

@ -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

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