1
mirror of https://github.com/CarmJos/UltraDepository.git synced 2026-06-04 16:48:21 +08:00

Compare commits

...

29 Commits

Author SHA1 Message Date
carm 976d9c32ff [v1.1.6] 版本更新
- [U] 采用EasyPlugin项目代码,并将此项目作为示范项目。
- [A] 添加数个事件,便于其他插件的开发。
- [A] 提供JSON存储格式,便于其他情况下的使用。
- [U] 添加StorageMethod枚举类,并允许自定义存储源。
- [U] 不再强制为数据加上 “:0”数据结尾,简化数据格式。
2022-01-05 04:05:54 +08:00
carm 64acb25bfc 移除一些debug消息 2022-01-03 23:08:09 +08:00
carm e01aa6207e 提供JSON存储格式 2022-01-03 21:55:02 +08:00
carm 8766b3a45e 添加介绍 2022-01-03 15:38:12 +08:00
carm 1894761f7c 添加作者 2022-01-03 15:26:56 +08:00
carm 6a014cca48 添加作者 2022-01-03 15:24:19 +08:00
carm 1ee70b2794 将用户数据加载、保存的错误分析和debug消息放在UserManager 2022-01-03 12:39:34 +08:00
carm 3a5e5e8fc4 [v1.1.6] 添加更多统计数据 2022-01-02 10:23:57 +08:00
carm 6aa5c40c3f Update README.md 2022-01-02 10:01:48 +08:00
carm f98a7ce025 [v1.1.5] 版本修复
- [F] 修复自动收集时仓库容量不生效的问题。
- [F] 修复GUI在从其他界面中打开时功能失效的问题。
- [U] 支持按组拿取物品时不关闭界面并实时更新物品数量。
2021-12-31 16:02:17 +08:00
carm c5230c0fbd 补充插件功能介绍 2021-12-31 06:43:05 +08:00
carm 56aba62ffc 添加使用统计显示 2021-12-31 06:29:29 +08:00
carm affe047789 添加使用统计显示 2021-12-31 06:29:15 +08:00
carm 6662ae35fb 添加使用统计显示 2021-12-31 02:32:31 +08:00
carm e95ca412f8 [v1.1.3] 版本更新
- [U] 当物品不足时发送提示
- [A] 使用bStats进行数据统计
2021-12-31 02:23:50 +08:00
carm 539d0d08dc [v1.1.2] 采用Map的形式序列化用户数据。 2021-12-30 20:39:12 +08:00
carm 92b9c45911 [v1.1.2] 采用Map的形式序列化用户数据。 2021-12-30 20:38:58 +08:00
carm bfbf55c9fc 修改示例配置位置 2021-12-30 07:20:37 +08:00
carm 564ca28f4a 默认采用file方式存储数据。 2021-12-30 07:13:34 +08:00
carm 4b533e44b3 折叠效果预览,默认采用file方式存储数据。 2021-12-30 07:12:35 +08:00
carm 5c9ef858c8 修改玩家数据文件示例 2021-12-30 07:00:13 +08:00
carm d046aa931e 完善以文件方式存储玩家数据的功能 2021-12-30 06:59:14 +08:00
carm 2ab03912df 修改示例配置文件的位置 2021-12-30 05:12:49 +08:00
carm aed1c3cf20 添加详细示例仓库配置文件 2021-12-30 05:10:44 +08:00
carm 1650f2f4a5 添加详细示例仓库配置文件 2021-12-30 05:10:03 +08:00
carm aefd0aac46 添加示例仓库配置文件 2021-12-30 04:54:57 +08:00
carm 090aa36e34 修复一些情况下日期不更新的问题。 2021-12-30 04:10:59 +08:00
carm a0c369b370 修改权限默认值 2021-12-30 04:06:19 +08:00
carm 36540b1000 规定API版本 2021-12-30 03:53:59 +08:00
75 changed files with 1833 additions and 2807 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
# UltraBackpack Javadoc # UltraDepository Javadoc
基于 [Github Pages](https://pages.github.com/) 搭建,请访问 [JavaDoc](https://carmjos.github.io/UltraBackpack) 。 基于 [Github Pages](https://pages.github.com/) 搭建,请访问 [JavaDoc](https://carmjos.github.io/UltraDepository) 。
## 如何实现? ## 如何实现?
+11 -12
View File
@@ -1,17 +1,16 @@
```text ```text
_ _ _ _ ____ _ _ _ _ _ _ _____ _ _
| | | | | | | _ \ | | | | | | | | | | | __ \ (_) |
| | | | | |_ _ __ __ _| |_) | __ _ ___| | ___ __ __ _ ___| | __ | | | | | |_ _ __ __ _| | | | ___ _ __ ___ ___ _| |_ ___ _ __ _ _
| | | | | __| '__/ _` | _ < / _` |/ __| |/ / '_ \ / _` |/ __| |/ / | | | | | __| '__/ _` | | | |/ _ \ '_ \ / _ \/ __| | __/ _ \| '__| | | |
| |__| | | |_| | | (_| | |_) | (_| | (__| <| |_) | (_| | (__| < | |__| | | |_| | | (_| | |__| | __/ |_) | (_) \__ \ | || (_) | | | |_| |
\____/|_|\__|_| \__,_|____/ \__,_|\___|_|\_\ .__/ \__,_|\___|_|\_\ \____/|_|\__|_| \__,_|_____/ \___| .__/ \___/|___/_|\__\___/|_| \__, |
| | | | __/ |
|_| |_| |___/
``` ```
# UltraBackpack 帮助介绍文档
# UltraDepository 帮助介绍文档
## [开发文档](JAVADOC-README.md) ## [开发文档](JAVADOC-README.md)
基于 [Github Pages](https://pages.github.com/) 搭建,请访问 [JavaDoc](https://carmjos.github.io/UltraBackpack) 。 基于 [Github Pages](https://pages.github.com/) 搭建,请访问 [JavaDoc](https://carmjos.github.io/UltraDepository) 。
## 文档目录
+34
View File
@@ -0,0 +1,34 @@
# UltraDepository 预设仓库配置
## 详细示例
您可以 [点击这里](full-example.yml) 查看一份详细的示例。
## 使用须知
预设配置基于 MineCraft 1.16 实现,更低版本可能无法使用。
## 如何使用?
1. 下载并安装 UltraDepository 插件。
2. 启动服务器,配置 `config.yml` 中的一些基础设置。
3. 下载你想要的示例仓库配置文件,并放入 `插件配置目录/depositories` 下。
4. 重启服务器,即可令对应的配置文件生效!
## 预设配置截图
### 渔夫仓库 ([fishman.yml](files/fishman.yml))
![fishman](images/fishman.png)
### 矿工仓库 ([miner.yml](files/miner.yml))
![miner](images/miner.png)
### 农夫仓库 ([farmer.yml](files/farmer.yml))
![farmer](images/farmer.png)
### 猎人仓库 ([hunter.yml](files/hunter.yml))
![hunter](images/hunter.png)
+129
View File
@@ -0,0 +1,129 @@
name: "&a&l农夫仓库"
capacity:
default: 500 # 若为0则默认不可以使用该仓库
permissions:
- "ud.farmer.vip:1000"
gui:
title: "&a&l农夫仓库"
lines: 6
items:
"INFO":
material: CHEST
data: 0
slot: 49
name: "&2&l背包信息"
lore:
- " "
- "&f仓库最大容量&a %UltraDepository_capacity_farmer%"
- "&f仓库已用容量&a %UltraDepository_used_farmer%"
- "&f仓库剩余容量&a %UltraDepository_usable_farmer%"
- " "
items:
"WHEAT_SEEDS":
slot: 10
price: 0.1
limit: 500
name: "&a&l小麦种子"
"MELON_SEEDS":
slot: 11
price: 0.1
limit: 500
name: "&8&l西瓜种子"
"PUMPKIN_SEEDS":
slot: 12
price: 0.1
limit: 500
name: "&f&l南瓜种子"
"BEETROOT_SEEDS":
slot: 13
price: 0.1
limit: 500
name: "&7&l甜菜种子"
"NETHER_WART":
slot: 14
price: 0.1
limit: 500
name: "&c&l地狱疣"
"COCOA_BEANS":
slot: 15
price: 0.1
limit: 500
name: "&6&l可可豆"
"SWEET_BERRIES":
slot: 16
price: 0.1
limit: 500
name: "&c&l树莓"
"BEETROOT":
slot: 19
price: 0.1
limit: 500
name: "&c&l甜菜根"
"CARROT":
slot: 20
price: 0.1
limit: 500
name: "&6&l胡萝卜"
"POTATO":
slot: 21
price: 0.1
limit: 500
name: "&e&l土豆"
"WHEAT":
slot: 22
price: 0.1
limit: 500
name: "&e&l小麦"
"MELON_SLICE":
slot: 23
price: 0.1
limit: 500
name: "&c&l西瓜片"
"PUMPKIN":
slot: 24
price: 0.1
limit: 500
name: "&6&l南瓜"
"CACTUS":
slot: 25
price: 0.1
limit: 500
name: "&2&l仙人掌"
"POISONOUS_POTATO":
slot: 28
price: 0.1
limit: 500
name: "&a&l毒土豆"
"KELP":
slot: 29
price: 0.1
limit: 500
name: "&2&l海带"
"SUGAR_CANE":
slot: 30
price: 0.1
limit: 500
name: "&a&l甘蔗"
"BAMBOO":
slot: 31
price: 0.1
limit: 500
name: "&a&l竹子"
"VINE":
slot: 32
price: 0.1
limit: 500
name: "&2&l藤蔓"
"CHORUS_FRUIT":
slot: 33
price: 0.1
limit: 500
name: "&d&l紫颂果"
"CHORUS_PLANT":
slot: 34
price: 0.1
limit: 500
name: "&5&l紫颂植株"
+64
View File
@@ -0,0 +1,64 @@
name: "&b&l渔夫仓库"
capacity:
default: 500 # 若为0则默认不可以使用该仓库
permissions:
- "ud.fishman.vip:1000"
gui:
title: "&b&l渔夫仓库"
lines: 4
items:
"INFO":
material: CHEST
data: 0
slot: 31
name: "&9&l背包信息"
lore:
- " "
- "&f仓库最大容量&b %UltraDepository_capacity_fishman%"
- "&f仓库已用容量&b %UltraDepository_used_fishman%"
- "&f仓库剩余容量&b %UltraDepository_usable_fishman%"
- " "
items:
"INK_SAC":
slot: 11
price: 0.1
limit: 500
name: "&8&l墨囊"
lore:
- " "
- "&f抓住墨鱼!"
"TROPICAL_FISH":
slot: 12
price: 0.1
limit: 500
name: "&(#EE7942)&l小丑鱼"
lore:
- " "
- "&f不是小丑!"
"SALMON":
slot: 13
price: 0.1
limit: 500
name: "&c&l鲑鱼"
lore:
- " "
- "&f肉质鲜美!"
"COD":
slot: 14
price: 0.1
limit: 500
name: "&f&l鳕鱼"
lore:
- " "
- "&f十分美味!"
"PUFFERFISH":
slot: 15
price: 0.1
limit: 500
name: "&6&L河豚"
lore:
- " "
- "&f小心有毒!"
+130
View File
@@ -0,0 +1,130 @@
name: "&5&l猎人仓库"
capacity:
default: 500 # 若为0则默认不可以使用该仓库
permissions:
- "ud.hunter.vip:1000"
gui:
title: "&5&l猎人仓库"
lines: 6
items:
"INFO":
material: CHEST
data: 0
slot: 49
name: "&5&l背包信息"
lore:
- " "
- "&f仓库最大容量&d %UltraDepository_capacity_hunter%"
- "&f仓库已用容量&d %UltraDepository_used_hunter%"
- "&f仓库剩余容量&d %UltraDepository_usable_hunter%"
- " "
items:
"CHICKEN":
slot: 10
price: 0.1
limit: 500
name: "&6&l鸡肉"
"PORKCHOP":
slot: 11
price: 0.1
limit: 500
name: "&c&l猪肉"
"BEEF":
slot: 12
price: 0.1
limit: 500
name: "&c&l牛肉"
"MUTTON":
slot: 13
price: 0.1
limit: 500
name: "&6&l羊肉"
"RABBIT":
slot: 14
price: 0.1
limit: 500
name: "&f&l兔肉"
"RABBIT_HIDE":
slot: 15
price: 0.1
limit: 500
name: "&f&l兔子皮"
"LEATHER":
slot: 16
price: 0.1
limit: 500
name: "&c&l皮革"
"EGG":
slot: 19
price: 0.1
limit: 500
name: "&f&l鸡蛋"
"RABBIT_FOOT":
slot: 20
price: 0.1
limit: 500
name: "&f&l兔子脚"
"FEATHER":
slot: 21
price: 0.1
limit: 500
name: "&f&l羽毛"
"GOLD_NUGGET":
slot: 22
price: 0.1
limit: 500
name: "&e&l金粒"
"GHAST_TEAR":
slot: 23
price: 0.1
limit: 500
name: "&7&l恶魂之泪"
"BLAZE_ROD":
slot: 24
price: 0.1
limit: 500
name: "&e&l烈焰棒"
"MAGMA_CREAM":
slot: 25
price: 0.1
limit: 500
name: "&c&l岩浆球"
"SLIME_BALL":
slot: 28
price: 0.1
limit: 500
name: "&a&l粘液球"
"BONE":
slot: 29
price: 0.1
limit: 500
name: "&f&l骨头"
"SPIDER_EYE":
slot: 30
price: 0.1
limit: 500
name: "&4&l蜘蛛眼"
"GUNPOWDER":
slot: 31
price: 0.1
limit: 500
name: "&7&l火药"
"ROTTEN_FLESH":
slot: 32
price: 0.1
limit: 500
name: "&2&l腐肉"
"STRING":
slot: 33
price: 0.1
limit: 500
name: "&f&l线"
"ENDER_PEARL":
slot: 34
price: 0.1
limit: 500
name: "&5&l末影珍珠"
+136
View File
@@ -0,0 +1,136 @@
name: "&e&l矿工仓库"
capacity:
default: 5000 # 若为0则默认不可以使用该仓库
permissions:
- "ud.miner.vip:10000"
gui:
title: "&e&l矿工仓库"
lines: 6
items:
"INFO":
material: CHEST
data: 0
slot: 49
name: "&e&l背包信息"
lore:
- " "
- "&f仓库最大容量&6 %UltraDepository_capacity_miner%"
- "&f仓库已用容量&6 %UltraDepository_used_miner%"
- "&f仓库剩余容量&6 %UltraDepository_usable_miner%"
- " "
items:
"COBBLESTONE":
slot: 11
price: 0.1
limit: 500
name: "&f&l圆石"
lore:
- " "
- "&f方块!"
"IRON_ORE":
slot: 12
price: 0.1
limit: 500
name: "&f&l铁矿"
lore:
- " "
- "&f升级!"
"GOLD_ORE":
slot: 13
price: 0.1
limit: 500
name: "&e&l金矿"
lore:
- " "
- "&f财富!"
"COAL":
slot: 14
price: 0.1
limit: 500
name: "&8&l煤炭"
lore:
- " "
- "&f燃料!"
"FLINT":
slot: 15
price: 0.1
limit: 500
name: "&7&l燧石"
lore:
- " "
- "&f点火!"
"IRON_INGOT":
slot: 20
price: 0.1
limit: 500
name: "&f&l铁锭"
lore:
- " "
- "&f制造!"
"GOLD_INGOT":
slot: 21
price: 0.1
limit: 500
name: "&e&l金锭"
lore:
- " "
- "&f高贵!"
"LAPIS_LAZULI":
slot: 22
price: 0.1
limit: 500
name: "&9&l青金石"
lore:
- " "
- "&f附魔!"
"DIAMOND":
slot: 23
price: 10
limit: 1500
name: "&b&l钻石"
lore:
- " "
- "&f钻石!"
"EMERALD":
slot: 24
price: 10
limit: 1500
name: "&a&l绿宝石"
lore:
- " "
- "&f交易!"
"CLAY_BALL":
slot: 30
price: 0.1
limit: 500
name: "&7&l黏土"
lore:
- " "
- "&f塑形!"
"REDSTONE":
slot: 29
price: 0.1
limit: 500
name: "&c&l红石"
lore:
- " "
- "&f电路!"
"GLOWSTONE_DUST":
slot: 32
price: 0.5
limit: 1500
name: "&6&l萤石"
lore:
- " "
- "&f发光!"
"QUARTZ":
slot: 33
price: 0.5
limit: 1500
name: "&f&l石英"
lore:
- " "
- "&f美丽!"
+48
View File
@@ -0,0 +1,48 @@
name: "&b&l示例仓库" # 仓库名,用于消息显示
capacity: # 容量配置
default: 500 # 若为0则默认不可以使用该仓库
permissions: # 特殊权限对应的仓库容量,格式为 "权限:容量
- "UltraDepository.vip:1000"
- "UltraDepository.mvp:1500"
gui: # GUI额外配置
title: "&b&l示例仓库 &7| 界面" #示例仓库的GUI标题
lines: 4 # GUI的行数,支持 1-6行。
items:
"TEST":
material: CHEST # 物品图标的类型
data: 0 # 物品图标的数据值
slot: 31 # 在GUI中显示的格子
name: "&9&l测试图标"
lore:
# 支持使用变量
- "你好 %player_name% !"
actions: # 物品点击操作
- "[CHAT] Hello!" #以玩家身份发送Hello,支持PlaceholderAPI变量
- "[CHAT] /help" #若内容以"/"开头,则会以玩家身份执行指令,支持PlaceholderAPI变量
- "[CONSOLE] say HELLO WORLD" #以后台身份执行指令,不需要加"/",支持PlaceholderAPI变量
- "[MESSAGE] &(#FFBBBBB)Test %player_name%" # 向玩家发送消息,支持PlaceholderAPI变量和RGB颜色
- "[SOUND] ENTITY_EXPERIENCE_ORB_PICKUP:0.5" # 向玩家发送声音,可以规定音量大小和音调,格式为 <声音>:[音量]:[音调]
- "[CLOSE]" # 为玩家关闭界面
- "[LEFT:CLOSE]" #限制只有 鼠标左键 才触发CLOSE
- "[SHIFT_LEFT:CLOSE]" #限制只有 按住Shift+鼠标左键 才触发CLOSE
- "[RIGHT:CLOSE]" #限制只有 鼠标右键 才触发CLOSE
- "[SHIFT_RIGHT:CLOSE]" #限制只有 按住Shift+鼠标右键 才触发CLOSE
- "[MIDDLE:CLOSE]" #限制只有 鼠标中键 才触发CLOSE
- "[DROP:CLOSE]" #限制只有 丢弃建 才触发CLOSE
- "[CONTROL_DROP:CLOSE]" #限制只有 按住Ctrl+丢弃键 才触发CLOSE
- "[DOUBLE_CLICK:CLOSE]" #限制只有 鼠标双击物品 才触发CLOSE
- "[NUMBER_KEY:CLOSE]" #限制只有 数字键切换 才触发CLOSE
items:
"INK_SAC": #物品ID,若需要限制数据ID则可以加“:”,如 "INK_SANK:4"
slot: 11 # 物品在GUI中显示的槽位
price: 0.1 # 物品单价
limit: 500 # 物品每日售出限制
name: "&8&l墨囊" # 物品显示的名字
lore: # 物品的lore
- " "
- "&f抓住墨鱼!"
Binary file not shown.

After

Width:  |  Height:  |  Size: 621 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 555 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 810 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 687 KiB

-28
View File
@@ -1,28 +0,0 @@
name: "&c&l矿业仓库"
capacity:
default: 0 # 若为0则默认不可以使用该仓库
permissions:
- "ub.miner.vip:5000"
gui:
title: "&c&l矿业仓库"
lines: 6
items:
"CLOSE":
material: RED_STONE
data: 0
slot: 0
name: "关闭界面"
lore:
- "点击后您将关闭本界面。"
actions:
- "[LEFT:CLOSE]"
- "[SHIFT_LEFT:CLOSE]"
items:
"DIAMOND":
slot: 5
price: 10
limit: 100
name: "&b&l钻石"
+2
View File
@@ -0,0 +1,2 @@
INSERT INTO `ub_data`(`uuid`, `data`, `day`)
VALUES ('<UUID>', '{"date":20220103,"depositories":{"miner":{"DIAMOND:0":{"sold":102,"amount":399}}}}', '20220103');
+1
View File
@@ -0,0 +1 @@
{"date":20220103,"depositories":{"miner":{"DIAMOND:0":{"sold":102,"amount":399}}}}
+12
View File
@@ -0,0 +1,12 @@
date: 20211230 # 用于判断售出数据的所在日期
depositories:
hunter:
RABBIT_HIDE:0:
amount: 1
miner:
GOLD_INGOT:0:
amount: 52
DIAMOND:0:
sold: 30
amount: 351
+4
View File
@@ -22,6 +22,10 @@ jobs:
with: with:
java-version: '11' java-version: '11'
distribution: 'adopt' distribution: 'adopt'
cache: maven
server-id: github
server-username: MAVEN_USERNAME
server-password: MAVEN_TOKEN
- name: Generate docs - name: Generate docs
run: mvn clean package -DskipTests run: mvn clean package -DskipTests
+35 -18
View File
@@ -22,28 +22,47 @@
本插件基于Spigot实现,**理论上支持全版本**。 本插件基于Spigot实现,**理论上支持全版本**。
本插件由 [墨豆Mordo](https://www.zimrs.cn) 助本人开发,经过授权后开源。 本插件由 [墨豆Mordo](https://www.mordo.cn)、[子墨Zimrs](https://www.zimrs.cn) 助本人开发,经过授权后开源。
## 功能介绍
本插件允许配置多个不同功能的仓库,玩家通过 击杀生物/挖掘方块/捡起收集 获得的原版物品可以自动被放入仓库中。
进入仓库后的物品玩家可以选择拿出或直接按量出售,且每日的出售数量上限和每件物品的价格可以自定义。
插件支持针对不同的权限配置仓库的容量,由此可以制作付费享用的”农业仓库“、”战斗仓库“、”伐木仓库“...
综上,该插件不但提供了一种功能特权,对其合理配置之后也将大大为玩家带来便利。
## 效果预览 ## 效果预览
### 收集物品 <details>
<summary>收集物品</summary>
![collect](.documentation/images/collect-message.jpg) ![collect](.documentation/images/collect-message.jpg)
### 仓库界面 (可自定义配置) </details>
<details>
<summary>仓库界面 (可自定义配置)</summary>
![item-gui](.documentation/images/item-in-gui.png) ![item-gui](.documentation/images/item-in-gui.png)
### 出售界面 </details>
<details>
<summary>出售界面</summary>
![sell-gui](.documentation/images/sell-gui.png) ![sell-gui](.documentation/images/sell-gui.png)
![sell-message](.documentation/images/sell-message.png) ![sell-message](.documentation/images/sell-message.png)
</details>
## 插件依赖 ## 插件依赖
- **[必须]** 插件本体基于 [Spigot-API](https://hub.spigotmc.org/stash/projects/SPIGOT)、[BukkitAPI](http://bukkit.org/) 实现。 - **[必须]** 插件本体基于 [Spigot-API](https://hub.spigotmc.org/stash/projects/SPIGOT)、[BukkitAPI](http://bukkit.org/) 实现。
- **[自带]** 数据部分基于 [EasySQL](https://github.com/CarmJos/EasySQL) 实现。 - **[自带]** 数据部分基于 [EasySQL](https://github.com/CarmJos/EasySQL) 实现。
- 本插件连接池使用 [BeeCP](https://github.com/Chris2018998/BeeCP) ,更轻量、快速。 - 本插件连接池使用 [BeeCP](https://github.com/Chris2018998/BeeCP) ,更轻量、快速。
- **[推荐]** 变量部分基于 [PlaceholderAPI](https://www.spigotmc.org/resources/6245/) 实现。 - **[推荐]** 变量部分基于 [PlaceholderAPI](https://www.spigotmc.org/resources/6245/) 实现。
- **[推荐]** 经济部分基于 [VaultAPI](https://github.com/MilkBowl/VaultAPI) 实现。 - **[推荐]** 经济部分基于 [VaultAPI](https://github.com/MilkBowl/VaultAPI) 实现。
@@ -65,7 +84,6 @@
<details> <details>
<summary>展开查看所有玩家指令</summary> <summary>展开查看所有玩家指令</summary>
```text ```text
# open [仓库ID] # open [仓库ID]
@ 玩家指令 (UltraDepository.use) @ 玩家指令 (UltraDepository.use)
@@ -107,6 +125,7 @@
- 若不填写仓库,则售出所有仓库内所有物品。 - 若不填写仓库,则售出所有仓库内所有物品。
- 该指令受到玩家每日售出数量的限制。 - 该指令受到玩家每日售出数量的限制。
``` ```
</details> </details>
## 插件变量 ([PlaceholderAPI](https://www.spigotmc.org/resources/6245/)) ## 插件变量 ([PlaceholderAPI](https://www.spigotmc.org/resources/6245/))
@@ -167,6 +186,8 @@
# UltraDepository.auto.enable # UltraDepository.auto.enable
- 用于判断是否启用了自动收集功能 - 用于判断是否启用了自动收集功能
- 若玩家有"UltraDepository.auto"权限,且玩家有该权限,则会开始为玩家自动收集物品。
- 若玩家缺失该权限或“UltraDepository.auto”权限,则自动收集物品功能不会启用。
- 您可以自己使用GUI创建一个按钮,后通过给玩家添加/删除该权限决定玩家是否开启自动收集。 - 您可以自己使用GUI创建一个按钮,后通过给玩家添加/删除该权限决定玩家是否开启自动收集。
# UltraDepository.admin # UltraDepository.admin
@@ -178,31 +199,27 @@
## 配置文件 ## 配置文件
### [插件配置文件](src/main/resources/config.yml) (config.yml) ### 插件配置文件 ([config.yml](src/main/resources/config.yml))
详见源文件。 详见源文件。
### [消息配置文件](src/main/resources/messages.yml) (messages.yml) ### 消息配置文件 ([messages.yml](src/main/resources/messages.yml))
详见源文件。 详见源文件。
### 仓库配置文件 (depositories/<ID>.yml) ### 仓库配置文件 ([depositories/<仓库ID>.yml](.examples/depositories/full-example.yml))
所有仓库配置均为单独的配置文件,存放于 `插件配置目录/depositories` 下,便于管理。 所有仓库配置均为单独的配置文件,存放于 `插件配置目录/depositories` 下,便于管理。
文件名即仓库的ID理论上可以随便取,但**强烈推荐**使用纯英文,部分符号可能会影响正常读取,请避免使用。 文件名即仓库的ID,**强烈推荐使用纯英文**,部分符号可能会影响正常读取,请避免使用。
这里准备了几个常用的仓库类型,可以 [在这里](.examples/depositories) 找到您需要的直接使用或加以修改后使用。 随本项目预设了几个常用的仓库类型,可以 [在这里](.examples/depositories) 找到您需要的直接使用或加以修改后使用。
您也可以查看下方的示例,看到所有相关的配置,以制作您自己的仓库。 您也可以 [点击这里](.examples/depositories/full-example.yml) 查看一份*详细的仓库配置示例*,以制作您自己的仓库。
<details>
<summary>展开查看示例仓库配置</summary>
```yaml ## 使用统计
``` [![bStats](https://bstats.org/signatures/bukkit/UltraDepository.svg)](https://bstats.org/plugin/bukkit/UltraDepository/13777)
</details>
## 支持与捐赠 ## 支持与捐赠
+57 -19
View File
@@ -9,12 +9,13 @@
<maven.compiler.target>11</maven.compiler.target> <maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding> <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<easyplugin.version>1.1.0</easyplugin.version>
</properties> </properties>
<groupId>cc.carm.plugin</groupId> <groupId>cc.carm.plugin</groupId>
<artifactId>ultradepository</artifactId> <artifactId>ultradepository</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>
<version>1.0.0</version> <version>1.1.6</version>
<name>UltraDepository</name> <name>UltraDepository</name>
<description>超级仓库插件,支持设定不同物品的存储仓库。</description> <description>超级仓库插件,支持设定不同物品的存储仓库。</description>
@@ -28,6 +29,16 @@
<url>https://www.carm.cc</url> <url>https://www.carm.cc</url>
<roles> <roles>
<role>Main Developer</role> <role>Main Developer</role>
<role>Designer</role>
</roles>
</developer>
<developer>
<id>zimrs</id>
<name>Zimrs</name>
<email>zimrs@kar.red</email>
<url>https://www.zimrs.cn</url>
<roles>
<role>Product Manager</role>
</roles> </roles>
</developer> </developer>
</developers> </developers>
@@ -60,17 +71,6 @@
<repositories> <repositories>
<repository>
<id>EasySQL</id>
<url>https://maven.pkg.github.com/CarmJos/EasySQL</url>
</repository>
<repository>
<id>github</id>
<name>GitHub Packages</name>
<url>https://maven.pkg.github.com/CarmJos/UltraDepository</url>
</repository>
<repository> <repository>
<id>central</id> <id>central</id>
<url>https://repo1.maven.org/maven2/</url> <url>https://repo1.maven.org/maven2/</url>
@@ -83,18 +83,47 @@
</repository> </repository>
<repository> <repository>
<id>nexus</id> <id>github</id>
<url>https://mvn.lumine.io/repository/maven-public/</url> <name>GitHub Packages</name>
<url>https://maven.pkg.github.com/CarmJos/UltraDepository</url>
</repository> </repository>
</repositories> </repositories>
<dependencies> <dependencies>
<dependency>
<groupId>org.bstats</groupId>
<artifactId>bstats-bukkit</artifactId>
<version>2.2.1</version>
<scope>compile</scope>
</dependency>
<dependency> <dependency>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<artifactId>easysql-beecp</artifactId> <artifactId>easyplugin-main</artifactId>
<version>0.2.3</version> <version>${easyplugin.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cc.carm.lib</groupId>
<artifactId>easyplugin-configuration</artifactId>
<version>${easyplugin.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cc.carm.lib</groupId>
<artifactId>easyplugin-gui</artifactId>
<version>${easyplugin.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cc.carm.lib</groupId>
<artifactId>easyplugin-database</artifactId>
<version>${easyplugin.version}</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
@@ -201,12 +230,21 @@
<goals> <goals>
<goal>shade</goal> <goal>shade</goal>
</goals> </goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution> </execution>
</executions> </executions>
<configuration> <configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<relocations>
<relocation>
<pattern>org.bstats</pattern>
<shadedPattern>cc.carm.plugin.ultradepository.lib.bstats</shadedPattern>
</relocation>
<relocation>
<pattern>cc.carm.lib.easyplugin</pattern>
<shadedPattern>cc.carm.plugin.ultradepository.lib.easyplugin</shadedPattern>
</relocation>
</relocations>
<filters> <filters>
<filter> <filter>
<artifact>*:*</artifact> <artifact>*:*</artifact>
@@ -1,190 +0,0 @@
package cc.carm.plugin.ultradepository;
import cc.carm.plugin.ultradepository.command.DepositoryCommand;
import cc.carm.plugin.ultradepository.configuration.PluginConfig;
import cc.carm.plugin.ultradepository.hooker.PAPIExpansion;
import cc.carm.plugin.ultradepository.listener.CollectListener;
import cc.carm.plugin.ultradepository.listener.UserListener;
import cc.carm.plugin.ultradepository.manager.ConfigManager;
import cc.carm.plugin.ultradepository.manager.DepositoryManager;
import cc.carm.plugin.ultradepository.manager.EconomyManager;
import cc.carm.plugin.ultradepository.manager.UserManager;
import cc.carm.plugin.ultradepository.storage.DataStorage;
import cc.carm.plugin.ultradepository.storage.FileStorage;
import cc.carm.plugin.ultradepository.storage.MySQLStorage;
import cc.carm.plugin.ultradepository.util.ColorParser;
import cc.carm.plugin.ultradepository.util.MessageUtil;
import cc.carm.plugin.ultradepository.util.SchedulerUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.PluginCommand;
import org.bukkit.command.TabCompleter;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class Main extends JavaPlugin {
private static Main instance;
private static SchedulerUtils scheduler;
private static DataStorage storage;
private static UserManager userManager;
private static EconomyManager economyManager;
private static DepositoryManager depositoryManager;
boolean initialized = false;
@Override
public void onEnable() {
instance = this;
scheduler = new SchedulerUtils(this);
outputPlugin();
log(getName() + " " + getDescription().getVersion() + " &7开始加载...");
long startTime = System.currentTimeMillis();
log("加载配置文件...");
ConfigManager.initConfig();
log("初始化存储方式...");
if (PluginConfig.STORAGE_METHOD.get().equalsIgnoreCase("mysql")) {
log(" 正在使用 MySQL 进行数据存储");
storage = new MySQLStorage();
} else {
log(" 正在使用 文件 进行数据存储");
storage = new FileStorage();
}
if (!storage.initialize()) {
error("存储初始化失败,请检查配置文件。");
setEnabled(false);
return;
}
log("加载用户系统...");
userManager = new UserManager();
log("加载经济系统...");
if (Bukkit.getPluginManager().getPlugin("Vault") != null) {
economyManager = new EconomyManager();
if (!economyManager.initialize()) {
error("经济系统初始化失败,关闭出售功能。");
}
} else {
log(" &7[-] 检测到未安装Vault,关闭出售功能。");
}
log("加载仓库管理器...");
depositoryManager = new DepositoryManager();
getDepositoryManager().loadDepositories();
log("注册监听器...");
regListener(new UserListener());
regListener(new CollectListener());
log("注册指令...");
registerCommand("UltraDepository", new DepositoryCommand(), new DepositoryCommand());
if (MessageUtil.hasPlaceholderAPI()) {
log("注册变量...");
new PAPIExpansion(this).register();
} else {
log("检测到未安装PlaceholderAPI,跳过变量注册。");
}
initialized = true;
log("加载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
}
@Override
public void onDisable() {
if (!initialized) return;
outputPlugin();
log(getName() + " " + getDescription().getVersion() + " 开始卸载...");
long startTime = System.currentTimeMillis();
log("保存现有用户数据...");
getUserManager().saveAll();
log("释放存储源...");
getStorage().shutdown();
log("卸载监听器...");
Bukkit.getServicesManager().unregisterAll(this);
log("卸载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
}
public static DataStorage getStorage() {
return storage;
}
public static SchedulerUtils getScheduler() {
return scheduler;
}
public static UserManager getUserManager() {
return userManager;
}
public static EconomyManager getEconomyManager() {
return economyManager;
}
public static DepositoryManager getDepositoryManager() {
return depositoryManager;
}
/**
* 注册监听器
*
* @param listener 监听器
*/
public static void regListener(@NotNull Listener listener) {
Bukkit.getPluginManager().registerEvents(listener, getInstance());
}
public static void log(@Nullable String message) {
Bukkit.getConsoleSender().sendMessage(ColorParser.parse("[" + getInstance().getName() + "] " + message));
}
public static void error(String message) {
log("&c[ERROR] &r" + message);
}
public static void debug(@Nullable String message) {
if (PluginConfig.DEBUG.get()) log("[DEBUG] " + message);
}
public static Main getInstance() {
return instance;
}
public static void registerCommand(String commandName,
@NotNull CommandExecutor executor) {
registerCommand(commandName, executor, null);
}
public static void registerCommand(String commandName,
@NotNull CommandExecutor executor,
@Nullable TabCompleter tabCompleter) {
PluginCommand command = Bukkit.getPluginCommand(commandName);
if (command == null) return;
command.setExecutor(executor);
if (tabCompleter != null) command.setTabCompleter(tabCompleter);
}
public static void outputPlugin() {
log(" _ _ _ _ _____ _ _ ");
log("| | | | | | | __ \\ (_) | ");
log("| | | | | |_ _ __ __ _| | | | ___ _ __ ___ ___ _| |_ ___ _ __ _ _ ");
log("| | | | | __| '__/ _` | | | |/ _ \\ '_ \\ / _ \\/ __| | __/ _ \\| '__| | | |");
log("| |__| | | |_| | | (_| | |__| | __/ |_) | (_) \\__ \\ | || (_) | | | |_| |");
log(" \\____/|_|\\__|_| \\__,_|_____/ \\___| .__/ \\___/|___/_|\\__\\___/|_| \\__, |");
log(" | | __/ |");
log(" |_| |___/ ");
}
}
@@ -0,0 +1,158 @@
package cc.carm.plugin.ultradepository;
import cc.carm.lib.easyplugin.EasyPlugin;
import cc.carm.lib.easyplugin.gui.GUI;
import cc.carm.lib.easyplugin.utils.MessageUtils;
import cc.carm.plugin.ultradepository.command.DepositoryCommand;
import cc.carm.plugin.ultradepository.configuration.PluginConfig;
import cc.carm.plugin.ultradepository.hooker.PAPIExpansion;
import cc.carm.plugin.ultradepository.listener.CollectListener;
import cc.carm.plugin.ultradepository.listener.UserListener;
import cc.carm.plugin.ultradepository.manager.ConfigManager;
import cc.carm.plugin.ultradepository.manager.DepositoryManager;
import cc.carm.plugin.ultradepository.manager.EconomyManager;
import cc.carm.plugin.ultradepository.manager.UserManager;
import cc.carm.plugin.ultradepository.storage.DataStorage;
import cc.carm.plugin.ultradepository.storage.StorageMethod;
import org.bstats.bukkit.Metrics;
import org.bstats.charts.SimplePie;
import org.bstats.charts.SingleLineChart;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
public class UltraDepository extends EasyPlugin {
private static UltraDepository instance;
private static DataStorage storage;
private static UserManager userManager;
private static EconomyManager economyManager;
private static DepositoryManager depositoryManager;
@Override
public void load() {
instance = this;
log("加载配置文件...");
ConfigManager.initConfig();
GUI.initialize(this);
}
@Override
public boolean initialize() {
log("初始化存储方式...");
StorageMethod storageMethod = PluginConfig.STORAGE_METHOD.get();
if (storageMethod == null) {
log("初始化存储方式失败,放弃加载");
return false;
}
storage = storageMethod.createStorage();
log(" 正在使用 " + storageMethod.name() + " 进行数据存储");
if (!storage.initialize()) {
error("存储初始化失败,请检查配置文件。");
return false;
}
log("加载用户系统...");
userManager = new UserManager();
log("加载经济系统...");
if (Bukkit.getPluginManager().getPlugin("Vault") != null) {
economyManager = new EconomyManager();
if (!economyManager.initialize()) {
error("经济系统初始化失败,关闭出售功能。");
}
} else {
log(" &7[-] 检测到未安装Vault,关闭出售功能。");
}
log("加载仓库管理器...");
depositoryManager = new DepositoryManager();
getDepositoryManager().loadDepositories();
log("注册监听器...");
regListener(new UserListener());
regListener(new CollectListener());
log("注册指令...");
registerCommand("UltraDepository", new DepositoryCommand());
if (MessageUtils.hasPlaceholderAPI()) {
log("注册变量...");
new PAPIExpansion(this).register();
} else {
log("检测到未安装PlaceholderAPI,跳过变量注册。");
}
if (PluginConfig.METRICS.get()) {
log("启用统计数据...");
Metrics metrics = new Metrics(this, 13777);
metrics.addCustomChart(new SingleLineChart(
"active_depositories",
() -> getDepositoryManager().getDepositories().size())
);
metrics.addCustomChart(new SimplePie("storage_method", () -> getStorage().getClass().getSimpleName()));
metrics.addCustomChart(new SimplePie("economy_enabled", () -> economyManager.isInitialized() ? "YES" : "NO"));
metrics.addCustomChart(new SimplePie("papi_version", () -> {
Plugin plugin = Bukkit.getPluginManager().getPlugin("PlaceholderAPI");
if (plugin == null) return "Not installed";
else return plugin.getDescription().getVersion();
}));
}
return true;
}
@Override
public void shutdown() {
if (!isInitialized()) return;
log("保存现有用户数据...");
getUserManager().saveAll();
getUserManager().getDataCache().clear();
log("释放存储源...");
getStorage().shutdown();
log("卸载监听器...");
Bukkit.getServicesManager().unregisterAll(this);
}
public static DataStorage getStorage() {
return storage;
}
public static UltraDepository getInstance() {
return instance;
}
public static UserManager getUserManager() {
return userManager;
}
public static EconomyManager getEconomyManager() {
return economyManager;
}
public static DepositoryManager getDepositoryManager() {
return depositoryManager;
}
@Override
public void outputInfo() {
log("&6 _ _ _ _ &e _____ _ _ ");
log("&6| | | | | | &e| __ \\ (_) | ");
log("&6| | | | | |_ _ __ __ _ &e| | | | ___ _ __ ___ ___ _| |_ ___ _ __ _ _ ");
log("&6| | | | | __| '__/ _` |&e| | | |/ _ \\ '_ \\ / _ \\/ __| | __/ _ \\| '__| | | |");
log("&6| |__| | | |_| | | (_| |&e| |__| | __/ |_) | (_) \\__ \\ | || (_) | | | |_| |");
log("&6 \\____/|_|\\__|_| \\__,_|&e|_____/ \\___| .__/ \\___/|___/_|\\__\\___/|_| \\__, |");
log("&6 &e| | __/ |");
log("&6 &e|_| |___/ ");
log(" &fView more information at&6 https://github.com/CarmJos/UltraDepository");
}
}
@@ -1,6 +1,8 @@
package cc.carm.plugin.ultradepository.command; package cc.carm.plugin.ultradepository.command;
import cc.carm.plugin.ultradepository.Main; import cc.carm.lib.easyplugin.utils.ColorParser;
import cc.carm.lib.easyplugin.utils.MessageUtils;
import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.configuration.PluginConfig; import cc.carm.plugin.ultradepository.configuration.PluginConfig;
import cc.carm.plugin.ultradepository.configuration.PluginMessages; import cc.carm.plugin.ultradepository.configuration.PluginMessages;
import cc.carm.plugin.ultradepository.configuration.depository.Depository; import cc.carm.plugin.ultradepository.configuration.depository.Depository;
@@ -9,8 +11,6 @@ import cc.carm.plugin.ultradepository.data.DepositoryData;
import cc.carm.plugin.ultradepository.data.DepositoryItemData; import cc.carm.plugin.ultradepository.data.DepositoryItemData;
import cc.carm.plugin.ultradepository.data.UserData; import cc.carm.plugin.ultradepository.data.UserData;
import cc.carm.plugin.ultradepository.ui.DepositoryGUI; import cc.carm.plugin.ultradepository.ui.DepositoryGUI;
import cc.carm.plugin.ultradepository.util.ColorParser;
import cc.carm.plugin.ultradepository.util.MessageUtil;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
@@ -52,7 +52,7 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
return false; return false;
} }
if (args.length < 2) return helpPlayer(player); if (args.length < 2) return helpPlayer(player);
Depository depository = Main.getDepositoryManager().getDepository(args[1]); Depository depository = UltraDepository.getDepositoryManager().getDepository(args[1]);
if (depository == null) { if (depository == null) {
PluginMessages.NO_DEPOSITORY.send(player); PluginMessages.NO_DEPOSITORY.send(player);
return true; return true;
@@ -64,13 +64,13 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
if (!player.hasPermission("UltraDepository.Command.Sell")) { if (!player.hasPermission("UltraDepository.Command.Sell")) {
return false; return false;
} }
if (!Main.getEconomyManager().isInitialized()) { if (!UltraDepository.getEconomyManager().isInitialized()) {
PluginConfig.Sounds.SELL_FAIL.play(player); PluginConfig.Sounds.SELL_FAIL.play(player);
PluginMessages.NO_ECONOMY.send(player); PluginMessages.NO_ECONOMY.send(player);
return true; return true;
} }
if (args.length < 4) return helpPlayer(player); if (args.length < 4) return helpPlayer(player);
Depository depository = Main.getDepositoryManager().getDepository(args[1]); Depository depository = UltraDepository.getDepositoryManager().getDepository(args[1]);
if (depository == null) { if (depository == null) {
PluginConfig.Sounds.SELL_FAIL.play(player); PluginConfig.Sounds.SELL_FAIL.play(player);
PluginMessages.NO_DEPOSITORY.send(player); PluginMessages.NO_DEPOSITORY.send(player);
@@ -95,7 +95,7 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
return true; return true;
} }
UserData userData = Main.getUserManager().getData(player); UserData userData = UltraDepository.getUserManager().getData(player);
DepositoryItemData itemData = userData.getItemData(item); DepositoryItemData itemData = userData.getItemData(item);
int limit = item.getLimit(); int limit = item.getLimit();
int sold = itemData.getSold(); int sold = itemData.getSold();
@@ -113,26 +113,26 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
return true; return true;
} }
Main.getEconomyManager().sellItem(player, userData, itemData, amount); UltraDepository.getEconomyManager().sellItem(player, userData, item, amount);
return true; return true;
} }
case "sellall": { case "sellall": {
if (!player.hasPermission("UltraDepository.Command.SellAll")) { if (!player.hasPermission("UltraDepository.Command.SellAll")) {
return false; return false;
} }
if (!Main.getEconomyManager().isInitialized()) { if (!UltraDepository.getEconomyManager().isInitialized()) {
PluginConfig.Sounds.SELL_FAIL.play(player); PluginConfig.Sounds.SELL_FAIL.play(player);
PluginMessages.NO_ECONOMY.send(player); PluginMessages.NO_ECONOMY.send(player);
return true; return true;
} }
UserData userData = Main.getUserManager().getData(player); UserData userData = UltraDepository.getUserManager().getData(player);
String depositoryID = args.length >= 2 ? args[1] : null; String depositoryID = args.length >= 2 ? args[1] : null;
String itemID = args.length >= 3 ? args[2] : null; String itemID = args.length >= 3 ? args[2] : null;
Depository depository = null; Depository depository = null;
if (depositoryID != null) { if (depositoryID != null) {
depository = Main.getDepositoryManager().getDepository(depositoryID); depository = UltraDepository.getDepositoryManager().getDepository(depositoryID);
if (depository == null) { if (depository == null) {
PluginConfig.Sounds.SELL_FAIL.play(player); PluginConfig.Sounds.SELL_FAIL.play(player);
PluginMessages.NO_DEPOSITORY.send(player); PluginMessages.NO_DEPOSITORY.send(player);
@@ -141,7 +141,7 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
} }
if (depository == null) { if (depository == null) {
Main.getEconomyManager().sellAllItem(player, userData); UltraDepository.getEconomyManager().sellAllItem(player, userData);
sender.sendMessage("Success! " + player.getName() + "'s items had been sold."); sender.sendMessage("Success! " + player.getName() + "'s items had been sold.");
return true; return true;
} }
@@ -157,11 +157,11 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
} }
if (item == null) { if (item == null) {
Main.getEconomyManager().sellAllItem(player, userData, userData.getDepositoryData(depositoryID)); UltraDepository.getEconomyManager().sellAllItem(player, userData, depository);
return true; return true;
} }
Main.getEconomyManager().sellAllItem(player, userData, userData.getItemData(item)); UltraDepository.getEconomyManager().sellAllItem(player, userData, item);
return true; return true;
} }
default: default:
@@ -177,14 +177,14 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
sender.sendMessage("Player does not exist."); sender.sendMessage("Player does not exist.");
return false; return false;
} }
UserData userData = Main.getUserManager().getData(player); UserData userData = UltraDepository.getUserManager().getData(player);
String depositoryID = args.length >= 3 ? args[2] : null; String depositoryID = args.length >= 3 ? args[2] : null;
String itemID = args.length >= 4 ? args[3] : null; String itemID = args.length >= 4 ? args[3] : null;
Depository depository = null; Depository depository = null;
if (depositoryID != null) { if (depositoryID != null) {
depository = Main.getDepositoryManager().getDepository(depositoryID); depository = UltraDepository.getDepositoryManager().getDepository(depositoryID);
if (depository == null) { if (depository == null) {
PluginMessages.NO_DEPOSITORY.send(player); PluginMessages.NO_DEPOSITORY.send(player);
return true; return true;
@@ -193,12 +193,12 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
sender.sendMessage(ColorParser.parse("&fInfo &6" + player.getName() + " &f:")); sender.sendMessage(ColorParser.parse("&fInfo &6" + player.getName() + " &f:"));
if (depository == null) { if (depository == null) {
userData.getDepositories().values().forEach(depositoryData -> { userData.getDepositories().values().forEach(depositoryData -> {
MessageUtil.send(sender, "&8# &e" + depositoryData.getIdentifier()); MessageUtils.send(sender, "&8# &e" + depositoryData.getIdentifier());
depositoryData.getContents().values().forEach(itemData -> { depositoryData.getContents().values().forEach(itemData -> {
String typeID = itemData.getSource().getTypeID(); String typeID = itemData.getSource().getTypeID();
int amount = itemData.getAmount(); int amount = itemData.getAmount();
int sold = itemData.getSold(); int sold = itemData.getSold();
MessageUtil.send(sender, "&8- &f" + typeID + " &7[&f " + amount + "&8|&f " + sold + "&7]"); MessageUtils.send(sender, "&8- &f" + typeID + " &7[&f " + amount + "&8|&f " + sold + "&7]");
}); });
}); });
return true; return true;
@@ -215,12 +215,12 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
if (item == null) { if (item == null) {
DepositoryData depositoryData = userData.getDepositoryData(depository); DepositoryData depositoryData = userData.getDepositoryData(depository);
MessageUtil.send(sender, "&8# &e" + depositoryData.getIdentifier()); MessageUtils.send(sender, "&8# &e" + depositoryData.getIdentifier());
depositoryData.getContents().values().forEach(itemData -> { depositoryData.getContents().values().forEach(itemData -> {
String typeID = itemData.getSource().getTypeID(); String typeID = itemData.getSource().getTypeID();
int amount = itemData.getAmount(); int amount = itemData.getAmount();
int sold = itemData.getSold(); int sold = itemData.getSold();
MessageUtil.send(sender, "&8- &f" + typeID + " &7[&f " + amount + "&8|&f " + sold + "&7]"); MessageUtils.send(sender, "&8- &f" + typeID + " &7[&f " + amount + "&8|&f " + sold + "&7]");
}); });
return true; return true;
} }
@@ -230,8 +230,8 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
int amount = itemData.getAmount(); int amount = itemData.getAmount();
int sold = itemData.getSold(); int sold = itemData.getSold();
MessageUtil.send(sender, "&8# &e" + depository.getIdentifier()); MessageUtils.send(sender, "&8# &e" + depository.getIdentifier());
MessageUtil.send(sender, "&8- &f" + typeID + " &7[&f " + amount + "&8|&f " + sold + "&7]"); MessageUtils.send(sender, "&8- &f" + typeID + " &7[&f " + amount + "&8|&f " + sold + "&7]");
return true; return true;
} }
case "add": { case "add": {
@@ -242,7 +242,7 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
return false; return false;
} }
Depository depository = Main.getDepositoryManager().getDepository(args[2]); Depository depository = UltraDepository.getDepositoryManager().getDepository(args[2]);
if (depository == null) { if (depository == null) {
PluginMessages.NO_DEPOSITORY.send(sender); PluginMessages.NO_DEPOSITORY.send(sender);
return true; return true;
@@ -264,7 +264,7 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
return true; return true;
} }
Integer after = Main.getUserManager().getData(player) Integer after = UltraDepository.getUserManager().getData(player)
.addItemAmount(depository.getIdentifier(), item.getTypeID(), amount); .addItemAmount(depository.getIdentifier(), item.getTypeID(), amount);
if (after != null) { if (after != null) {
@@ -283,7 +283,7 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
return false; return false;
} }
Depository depository = Main.getDepositoryManager().getDepository(args[2]); Depository depository = UltraDepository.getDepositoryManager().getDepository(args[2]);
if (depository == null) { if (depository == null) {
PluginMessages.NO_DEPOSITORY.send(sender); PluginMessages.NO_DEPOSITORY.send(sender);
return true; return true;
@@ -305,7 +305,7 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
return true; return true;
} }
UserData userData = Main.getUserManager().getData(player); UserData userData = UltraDepository.getUserManager().getData(player);
if (amount != null) { if (amount != null) {
Integer after = userData.removeItemAmount(depository.getIdentifier(), item.getTypeID(), amount); Integer after = userData.removeItemAmount(depository.getIdentifier(), item.getTypeID(), amount);
if (after != null) { if (after != null) {
@@ -331,17 +331,17 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
Depository depository = null; Depository depository = null;
if (depositoryID != null) { if (depositoryID != null) {
depository = Main.getDepositoryManager().getDepository(depositoryID); depository = UltraDepository.getDepositoryManager().getDepository(depositoryID);
if (depository == null) { if (depository == null) {
PluginMessages.NO_DEPOSITORY.send(sender); PluginMessages.NO_DEPOSITORY.send(sender);
return true; return true;
} }
} }
UserData userData = Main.getUserManager().getData(player); UserData userData = UltraDepository.getUserManager().getData(player);
if (depository == null) { if (depository == null) {
Main.getEconomyManager().sellAllItem(player, userData); UltraDepository.getEconomyManager().sellAllItem(player, userData);
sender.sendMessage("Success! " + player.getName() + "'s items had been sold."); sender.sendMessage("Success! " + player.getName() + "'s items had been sold.");
return true; return true;
} }
@@ -355,7 +355,7 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
} }
} }
if (item == null) { if (item == null) {
Main.getEconomyManager().sellAllItem(player, userData, userData.getDepositoryData(depository)); UltraDepository.getEconomyManager().sellAllItem(player, userData, depository);
sender.sendMessage("Success! " + player.getName() + "'s " + depository.getIdentifier() + " had been sold."); sender.sendMessage("Success! " + player.getName() + "'s " + depository.getIdentifier() + " had been sold.");
return true; return true;
} }
@@ -374,7 +374,7 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
} }
if (amount == null) { if (amount == null) {
Main.getEconomyManager().sellAllItem(player, userData, userData.getItemData(item)); UltraDepository.getEconomyManager().sellAllItem(player, userData, item);
sender.sendMessage("Success! " + player.getName() + "'s " + item.getTypeID() + " had been sold."); sender.sendMessage("Success! " + player.getName() + "'s " + item.getTypeID() + " had been sold.");
return true; return true;
} }
@@ -395,7 +395,7 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
return true; return true;
} }
Main.getEconomyManager().sellItem(player, userData, userData.getItemData(item), amount); UltraDepository.getEconomyManager().sellItem(player, userData, item, amount);
sender.sendMessage("Success! " + player.getName() + "'s " + amount + " " + item.getTypeID() + " had been sold."); sender.sendMessage("Success! " + player.getName() + "'s " + amount + " " + item.getTypeID() + " had been sold.");
return true; return true;
} }
@@ -430,7 +430,7 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
&& player.hasPermission("UltraDepository.Command.Sell")) && player.hasPermission("UltraDepository.Command.Sell"))
|| (aim.equalsIgnoreCase("sellAll") || (aim.equalsIgnoreCase("sellAll")
&& player.hasPermission("UltraDepository.Command.SellAll"))) { && player.hasPermission("UltraDepository.Command.SellAll"))) {
allCompletes.addAll(Main.getDepositoryManager().getDepositories().keySet()); allCompletes.addAll(UltraDepository.getDepositoryManager().getDepositories().keySet());
} }
break; break;
} }
@@ -441,7 +441,7 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
&& player.hasPermission("UltraDepository.Command.Sell")) && player.hasPermission("UltraDepository.Command.Sell"))
|| (aim.equalsIgnoreCase("sellAll") || (aim.equalsIgnoreCase("sellAll")
&& player.hasPermission("UltraDepository.Command.SellAll"))) { && player.hasPermission("UltraDepository.Command.SellAll"))) {
Depository depository = Main.getDepositoryManager().getDepository(depositoryID); Depository depository = UltraDepository.getDepositoryManager().getDepository(depositoryID);
if (depository != null) { if (depository != null) {
allCompletes.addAll(depository.getItems().keySet()); allCompletes.addAll(depository.getItems().keySet());
} }
@@ -465,11 +465,11 @@ public class DepositoryCommand implements CommandExecutor, TabCompleter {
break; break;
} }
case 3: { case 3: {
allCompletes.addAll(Main.getDepositoryManager().getDepositories().keySet()); allCompletes.addAll(UltraDepository.getDepositoryManager().getDepositories().keySet());
break; break;
} }
case 4: { case 4: {
Depository depository = Main.getDepositoryManager().getDepository(args[2]); Depository depository = UltraDepository.getDepositoryManager().getDepository(args[2]);
if (depository != null) { if (depository != null) {
allCompletes.addAll(depository.getItems().keySet()); allCompletes.addAll(depository.getItems().keySet());
} }
@@ -1,21 +1,26 @@
package cc.carm.plugin.ultradepository.configuration; package cc.carm.plugin.ultradepository.configuration;
import cc.carm.plugin.ultradepository.configuration.message.ConfigMessage; import cc.carm.lib.easyplugin.configuration.impl.ConfigSound;
import cc.carm.plugin.ultradepository.configuration.message.ConfigMessageList; import cc.carm.lib.easyplugin.configuration.impl.ConfigStringCast;
import cc.carm.plugin.ultradepository.configuration.values.ConfigSound; import cc.carm.lib.easyplugin.configuration.message.ConfigMessage;
import cc.carm.plugin.ultradepository.configuration.values.ConfigStringCast; import cc.carm.lib.easyplugin.configuration.message.ConfigMessageList;
import cc.carm.plugin.ultradepository.configuration.values.ConfigValue; import cc.carm.lib.easyplugin.configuration.values.ConfigValue;
import cc.carm.plugin.ultradepository.manager.ConfigManager; import cc.carm.plugin.ultradepository.manager.ConfigManager;
import cc.carm.plugin.ultradepository.storage.StorageMethod;
import org.bukkit.Material; import org.bukkit.Material;
public class PluginConfig { public class PluginConfig {
public static final ConfigValue<Boolean> DEBUG = new ConfigValue<>( public static final ConfigValue<Boolean> DEBUG = new ConfigValue<>(
"debug", Boolean.class "debug", Boolean.class, false
); );
public static final ConfigValue<String> STORAGE_METHOD = new ConfigValue<>( public static final ConfigValue<Boolean> METRICS = new ConfigValue<>(
"storage.method", String.class "metrics", Boolean.class, true
);
public static final ConfigStringCast<StorageMethod> STORAGE_METHOD = new ConfigStringCast<>(
"storage.method", StorageMethod::read, StorageMethod.YAML
); );
/** /**
@@ -1,7 +1,7 @@
package cc.carm.plugin.ultradepository.configuration; package cc.carm.plugin.ultradepository.configuration;
import cc.carm.plugin.ultradepository.configuration.message.ConfigMessageList; import cc.carm.lib.easyplugin.configuration.message.ConfigMessageList;
public class PluginMessages { public class PluginMessages {
@@ -1,6 +1,6 @@
package cc.carm.plugin.ultradepository.configuration.depository; package cc.carm.plugin.ultradepository.configuration.depository;
import cc.carm.plugin.ultradepository.configuration.gui.GUIConfiguration; import cc.carm.lib.easyplugin.gui.configuration.GUIConfiguration;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -3,7 +3,6 @@ package cc.carm.plugin.ultradepository.configuration.depository;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Comparator;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -45,9 +44,8 @@ public class DepositoryCapacity {
public int getPlayerCapacity(Player player) { public int getPlayerCapacity(Player player) {
return getPermissions().entrySet().stream() return getPermissions().entrySet().stream()
.filter(entry -> player.hasPermission(entry.getKey())) .filter(entry -> player.hasPermission(entry.getKey()))
.map(Map.Entry::getValue) .mapToInt(Map.Entry::getValue)
.min(Comparator.comparingInt(Integer::intValue)) .max().orElse(defaultCapacity);
.orElse(defaultCapacity);
} }
} }
@@ -1,7 +1,7 @@
package cc.carm.plugin.ultradepository.configuration.depository; package cc.carm.plugin.ultradepository.configuration.depository;
import cc.carm.plugin.ultradepository.Main; import cc.carm.lib.easyplugin.utils.ItemStackFactory;
import cc.carm.plugin.ultradepository.util.ItemStackFactory; import cc.carm.plugin.ultradepository.UltraDepository;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -45,7 +45,7 @@ public class DepositoryItem {
} }
public @NotNull String getTypeID() { public @NotNull String getTypeID() {
return getMaterial().name() + ":" + getData(); return UltraDepository.getDepositoryManager().getItemTypeID(getMaterial(), getData());
} }
public @NotNull Material getMaterial() { public @NotNull Material getMaterial() {
@@ -123,8 +123,8 @@ public class DepositoryItem {
); );
} catch (Exception ex) { } catch (Exception ex) {
Main.error("没有与 " + typeID + " 匹配的物品!"); UltraDepository.getInstance().error("没有与 " + typeID + " 匹配的物品!");
Main.error("No match material of " + typeID + " !"); UltraDepository.getInstance().error("No match material of " + typeID + " !");
return null; return null;
} }
} }
@@ -1,76 +0,0 @@
package cc.carm.plugin.ultradepository.configuration.file;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.IOException;
public class FileConfig {
private long updateTime;
private final JavaPlugin plugin;
private final String fileName;
private File file;
private FileConfiguration config;
public FileConfig(final JavaPlugin plugin) {
this(plugin, "config.yml");
}
public FileConfig(final JavaPlugin plugin, final String name) {
this.plugin = plugin;
this.fileName = name;
initFile();
}
private void initFile() {
this.updateTime = System.currentTimeMillis();
this.file = new File(plugin.getDataFolder(), fileName);
if (!this.file.exists()) {
if (!this.file.getParentFile().exists()) {
boolean success = this.file.getParentFile().mkdirs();
}
plugin.saveResource(fileName, true);
}
this.config = YamlConfiguration.loadConfiguration(this.file);
}
public File getFile() {
return file;
}
public FileConfiguration getConfig() {
return config;
}
public void save() {
try {
getConfig().save(getFile());
} catch (IOException e) {
e.printStackTrace();
}
}
public void reload() {
this.updateTime = System.currentTimeMillis();
if (getFile().exists()) {
this.config = YamlConfiguration.loadConfiguration(getFile());
} else {
initFile();
}
}
public long getUpdateTime() {
return updateTime;
}
public boolean isExpired(long time) {
return getUpdateTime() > time;
}
}
@@ -1,51 +0,0 @@
package cc.carm.plugin.ultradepository.configuration.gui;
import cc.carm.plugin.ultradepository.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);
}
};
}
}
@@ -1,88 +0,0 @@
package cc.carm.plugin.ultradepository.configuration.gui;
import cc.carm.plugin.ultradepository.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);
}
}
@@ -1,86 +0,0 @@
package cc.carm.plugin.ultradepository.configuration.gui;
import cc.carm.plugin.ultradepository.util.ColorParser;
import cc.carm.plugin.ultradepository.util.gui.GUI;
import cc.carm.plugin.ultradepository.util.gui.GUIType;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public class GUIConfiguration {
String title;
int lines;
List<GUIItemConfiguration> guiItems;
public GUIConfiguration(String title, int lines, List<GUIItemConfiguration> guiItems) {
this.title = title;
this.lines = lines;
this.guiItems = guiItems;
}
public String getTitle() {
return ColorParser.parse(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 List<GUIItemConfiguration> getGuiItems() {
return guiItems;
}
public void setupItems(Player player, GUI gui) {
getGuiItems().forEach(itemConfiguration -> itemConfiguration.setupItems(player, gui));
}
public static GUIConfiguration readConfiguration(@Nullable ConfigurationSection section) {
if (section == null) return new GUIConfiguration("name", 6, new ArrayList<>());
String title = section.getString("title", "");
int lines = section.getInt("lines", 6);
ConfigurationSection itemsSection = section.getConfigurationSection("items");
if (itemsSection == null) return new GUIConfiguration(title, lines, new ArrayList<>());
return new GUIConfiguration(
title, lines, itemsSection.getKeys(false).stream()
.map(key -> GUIItemConfiguration.readFrom(itemsSection.getConfigurationSection(key)))
.filter(Objects::nonNull)
.collect(Collectors.toList())
);
}
public static ClickType readClickType(String type) {
return Arrays.stream(ClickType.values())
.filter(click -> click.name().equalsIgnoreCase(type))
.findFirst().orElse(null);
}
}
@@ -1,92 +0,0 @@
package cc.carm.plugin.ultradepository.configuration.gui;
import cc.carm.plugin.ultradepository.util.ItemStackFactory;
import cc.carm.plugin.ultradepository.util.MessageUtil;
import cc.carm.plugin.ultradepository.util.gui.GUI;
import cc.carm.plugin.ultradepository.util.gui.GUIItem;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
public class GUIItemConfiguration {
Material material;
int data;
String name;
@NotNull List<String> lore;
@NotNull List<Integer> slots;
@NotNull List<GUIActionConfiguration> actions;
public GUIItemConfiguration(Material material, int data,
String name, @NotNull List<String> lore,
@NotNull List<GUIActionConfiguration> actions,
@NotNull List<Integer> slots) {
this.material = material;
this.data = data;
this.name = name;
this.lore = lore;
this.slots = slots;
this.actions = actions;
}
public void setupItems(Player player, GUI gui) {
ItemStackFactory icon = new ItemStackFactory(this.material);
icon.setDurability(this.data);
if (this.name != null) icon.setDisplayName(this.name);
icon.setLore(MessageUtil.setPlaceholders(player, this.lore));
GUIItem item = new GUIItem(icon.toItemStack());
this.actions.stream().map(GUIActionConfiguration::toClickAction).forEach(item::addClickAction);
this.slots.forEach(slot -> gui.setItem(slot, item));
}
@Nullable
public static GUIItemConfiguration readFrom(@Nullable ConfigurationSection itemSection) {
if (itemSection == null) return null;
Material material = Optional.ofNullable(Material.matchMaterial(itemSection.getString("material", "STONE"))).orElse(Material.STONE);
int data = itemSection.getInt("data", 0);
String name = itemSection.getString("name");
List<String> lore = itemSection.getStringList("lore");
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 = GUIConfiguration.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()));
}
return new GUIItemConfiguration(
material, data, name, lore, actions,
slots.size() > 0 ? slots : Collections.singletonList(slot)
);
}
}
@@ -1,65 +0,0 @@
package cc.carm.plugin.ultradepository.configuration.message;
import cc.carm.plugin.ultradepository.configuration.file.FileConfig;
import cc.carm.plugin.ultradepository.configuration.values.ConfigValue;
import cc.carm.plugin.ultradepository.manager.ConfigManager;
import cc.carm.plugin.ultradepository.util.MessageUtil;
import org.bukkit.command.CommandSender;
import java.util.Collections;
import java.util.List;
public class ConfigMessage extends ConfigValue<String> {
String[] messageParams;
public ConfigMessage(String configSection) {
this(configSection, null);
}
public ConfigMessage(String configSection, String defaultValue) {
this(configSection, defaultValue, null);
}
public ConfigMessage(String configSection, String defaultValue, String[] messageParams) {
super(ConfigManager.getMessageConfig(), configSection, String.class, defaultValue);
this.messageParams = messageParams;
}
public ConfigMessage(FileConfig config, String configSection, String defaultValue, String[] messageParams) {
super(config, configSection, String.class, defaultValue);
this.messageParams = messageParams;
}
public String get(CommandSender sender, Object[] values) {
if (messageParams != null) {
return get(sender, messageParams, values);
} else {
return get(sender, new String[0], new Object[0]);
}
}
public String get(CommandSender sender, String[] params, Object[] values) {
List<String> messages = MessageUtil.setPlaceholders(sender, Collections.singletonList(get()), params, values);
return messages != null && !messages.isEmpty() ? messages.get(0) : "";
}
public void send(CommandSender sender) {
MessageUtil.sendWithPlaceholders(sender, get());
}
public void send(CommandSender sender, Object[] values) {
if (messageParams != null) {
send(sender, messageParams, values);
} else {
send(sender, new String[0], new Object[0]);
}
}
public void send(CommandSender sender, String[] params, Object[] values) {
MessageUtil.sendWithPlaceholders(sender, Collections.singletonList(get()), params, values);
}
}
@@ -1,68 +0,0 @@
package cc.carm.plugin.ultradepository.configuration.message;
import cc.carm.plugin.ultradepository.Main;
import cc.carm.plugin.ultradepository.configuration.file.FileConfig;
import cc.carm.plugin.ultradepository.configuration.values.ConfigValueList;
import cc.carm.plugin.ultradepository.manager.ConfigManager;
import cc.carm.plugin.ultradepository.util.MessageUtil;
import org.bukkit.Sound;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class ConfigMessageList extends ConfigValueList<String> {
String[] messageParams;
public ConfigMessageList(String configSection) {
super(ConfigManager.getMessageConfig(), configSection, String.class);
}
public ConfigMessageList(String configSection, String[] defaultValue) {
this(configSection, defaultValue, null);
}
public ConfigMessageList(String configSection, String[] defaultValue, String[] messageParams) {
super(ConfigManager.getMessageConfig(), configSection, String.class, defaultValue);
this.messageParams = messageParams;
}
public ConfigMessageList(FileConfig config, String configSection, String[] defaultValue, String[] messageParams) {
super(config, configSection, String.class, defaultValue);
this.messageParams = messageParams;
}
public List<String> get(@Nullable CommandSender sender) {
return MessageUtil.setPlaceholders(sender, get());
}
public List<String> get(@Nullable CommandSender sender, Object[] values) {
if (messageParams != null) {
return get(sender, messageParams, values);
} else {
return get(sender);
}
}
public List<String> get(@Nullable CommandSender sender, String[] params, Object[] values) {
return MessageUtil.setPlaceholders(sender, get(), params, values);
}
public void send(@Nullable CommandSender sender) {
MessageUtil.sendWithPlaceholders(sender, get());
}
public void send(@Nullable CommandSender sender, Object[] values) {
if (messageParams != null) {
send(sender, messageParams, values);
} else {
send(sender);
}
}
public void send(@Nullable CommandSender sender, String[] params, Object[] values) {
MessageUtil.sendWithPlaceholders(sender, get(), params, values);
}
}
@@ -1,72 +0,0 @@
package cc.carm.plugin.ultradepository.configuration.values;
import cc.carm.plugin.ultradepository.configuration.file.FileConfig;
import cc.carm.plugin.ultradepository.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();
}
}
@@ -1,72 +0,0 @@
package cc.carm.plugin.ultradepository.configuration.values;
import cc.carm.plugin.ultradepository.Main;
import cc.carm.plugin.ultradepository.configuration.file.FileConfig;
import cc.carm.plugin.ultradepository.manager.ConfigManager;
import org.bukkit.Sound;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
public class ConfigSound {
FileConfig source;
String configSection;
Sound defaultValue;
public ConfigSound(String configSection) {
this(configSection, null);
}
public ConfigSound(String configSection, Sound defaultValue) {
this(ConfigManager.getPluginConfig(), configSection, defaultValue);
}
public ConfigSound(FileConfig source, String configSection, Sound defaultValue) {
this.source = source;
this.configSection = configSection;
this.defaultValue = defaultValue;
}
public FileConfiguration getConfiguration() {
return this.source.getConfig();
}
public void set(Sound value, float volume) {
getConfiguration().set(this.configSection, value.name() + ":" + volume);
this.save();
}
public void set(Sound value, float volume, float pitch) {
getConfiguration().set(this.configSection, value.name() + ":" + volume + ":" + pitch);
this.save();
}
public void play(Player player) {
Sound finalSound = defaultValue;
float pitch = 1;
float volume = 1;
String soundString = getConfiguration().getString(this.configSection);
if (soundString != null) {
String[] args = soundString.contains(":") ? soundString.split(":") : new String[]{soundString};
try {
if (args.length >= 1) finalSound = Sound.valueOf(args[0]);
if (args.length >= 2) volume = Float.parseFloat(args[1]);
if (args.length >= 3) volume = Float.parseFloat(args[2]);
} catch (Exception exception) {
Main.log("声音 " + this.configSection + " 配置错误,不存在 " + soundString + " ,请检查。");
Main.log("In " + this.configSection + " (" + soundString + ") doesn't match any sound name.");
}
}
if (finalSound != null) {
player.playSound(player.getLocation(), finalSound, volume, pitch);
}
}
public void save() {
this.source.save();
}
}
@@ -1,72 +0,0 @@
package cc.carm.plugin.ultradepository.configuration.values;
import cc.carm.plugin.ultradepository.configuration.file.FileConfig;
import cc.carm.plugin.ultradepository.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;
}
}
@@ -1,58 +0,0 @@
package cc.carm.plugin.ultradepository.configuration.values;
import cc.carm.plugin.ultradepository.configuration.file.FileConfig;
import cc.carm.plugin.ultradepository.manager.ConfigManager;
import org.bukkit.configuration.file.FileConfiguration;
public class ConfigValue<V> {
FileConfig source;
String configSection;
Class<V> clazz;
V defaultValue;
public ConfigValue(String configSection, Class<V> clazz) {
this(configSection, clazz, null);
}
public ConfigValue(String configSection, Class<V> clazz, V defaultValue) {
this(ConfigManager.getPluginConfig(), configSection, clazz, defaultValue);
}
public ConfigValue(FileConfig source, String configSection, Class<V> clazz, V defaultValue) {
this.source = source;
this.configSection = configSection;
this.clazz = clazz;
this.defaultValue = defaultValue;
}
public FileConfiguration getConfiguration() {
return this.source.getConfig();
}
public V get() {
if (getConfiguration().contains(this.configSection)) {
Object val = getConfiguration().get(this.configSection, this.defaultValue);
return this.clazz.isInstance(val) ? this.clazz.cast(val) : this.defaultValue;
} else {
// 如果没有默认值,就把配置写进去,便于配置
return setDefault();
}
}
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;
}
}
@@ -1,72 +0,0 @@
package cc.carm.plugin.ultradepository.configuration.values;
import cc.carm.plugin.ultradepository.configuration.file.FileConfig;
import cc.carm.plugin.ultradepository.manager.ConfigManager;
import org.bukkit.configuration.file.FileConfiguration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ConfigValueList<V> {
FileConfig source;
String configSection;
Class<V> clazz;
V[] defaultValue;
public ConfigValueList(String configSection, Class<V> clazz) {
this(ConfigManager.getPluginConfig(), configSection, clazz);
}
public ConfigValueList(String configSection, Class<V> clazz, V[] defaultValue) {
this(ConfigManager.getPluginConfig(), configSection, clazz, defaultValue);
}
public ConfigValueList(FileConfig configuration, String configSection, Class<V> clazz) {
this(configuration, configSection, clazz, null);
}
public ConfigValueList(FileConfig configuration, String configSection, Class<V> clazz, V[] defaultValue) {
this.source = configuration;
this.configSection = configSection;
this.clazz = clazz;
this.defaultValue = defaultValue;
}
public FileConfiguration getConfiguration() {
return this.source.getConfig();
}
public ArrayList<V> get() {
List<?> list = getConfiguration().getList(this.configSection);
if (list == null) {
if (defaultValue != null) {
return new ArrayList<>(Arrays.asList(defaultValue));
} else {
return new ArrayList<>();
}
} else {
ArrayList<V> result = new ArrayList<>();
for (Object object : list) {
if (this.clazz.isInstance(object)) {
result.add(this.clazz.cast(object));
}
}
return result;
}
}
public void set(ArrayList<V> value) {
getConfiguration().set(this.configSection, value);
this.save();
}
public void save() {
this.source.save();
}
}
@@ -1,82 +0,0 @@
package cc.carm.plugin.ultradepository.configuration.values;
import cc.carm.plugin.ultradepository.configuration.file.FileConfig;
import cc.carm.plugin.ultradepository.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.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
public class ConfigValueMap<K, V> {
@NotNull FileConfig source;
@NotNull String configSection;
@NotNull Function<String, K> keyCast;
@NotNull Class<V> valueClazz;
@Nullable LinkedHashMap<K, V> valueCache;
long updateTime;
public ConfigValueMap(@NotNull String configSection, @NotNull Function<String, K> keyCast,
@NotNull Class<V> valueClazz) {
this(ConfigManager.getPluginConfig(), configSection, keyCast, valueClazz);
}
public ConfigValueMap(@NotNull FileConfig configuration, @NotNull String configSection,
@NotNull Function<String, K> keyCast, @NotNull Class<V> valueClazz) {
this.source = configuration;
this.configSection = configSection;
this.keyCast = keyCast;
this.valueClazz = valueClazz;
}
public @NotNull FileConfiguration getConfiguration() {
return this.source.getConfig();
}
public void clearCache() {
this.valueCache = null;
}
@NotNull
public Map<K, V> get() {
if (valueCache != null && !this.source.isExpired(this.updateTime)) return valueCache;
ConfigurationSection section = getConfiguration().getConfigurationSection(this.configSection);
if (section == null) return new LinkedHashMap<>();
Set<String> keys = section.getKeys(false);
if (keys.isEmpty()) return new LinkedHashMap<>();
else {
LinkedHashMap<K, V> result = new LinkedHashMap<>();
for (String key : keys) {
K finalKey = keyCast.apply(key);
Object val = section.get(key);
V finalValue = this.valueClazz.isInstance(val) ? this.valueClazz.cast(val) : null;
if (finalKey != null && finalValue != null) {
result.put(finalKey, finalValue);
}
}
this.updateTime = System.currentTimeMillis();
this.valueCache = result;
return result;
}
}
public void set(HashMap<K, V> valuesMap) {
getConfiguration().createSection(this.configSection, valuesMap);
this.save();
}
public void save() {
this.source.save();
}
}
@@ -42,6 +42,12 @@ public class DepositoryItemData {
this.sold = Math.max(0, sold); this.sold = Math.max(0, sold);
} }
public int[] applyChanges(int amountChanges, int soldChanges) {
setAmount(getAmount() + amountChanges);
setSold(getSold() + soldChanges);
return new int[]{getAmount(), getSold()};
}
public void clearSold() { public void clearSold() {
this.sold = 0; this.sold = 0;
} }
@@ -1,14 +1,15 @@
package cc.carm.plugin.ultradepository.data; package cc.carm.plugin.ultradepository.data;
import cc.carm.plugin.ultradepository.Main; import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.configuration.depository.Depository; import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem; import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import cc.carm.plugin.ultradepository.storage.DataStorage; import cc.carm.plugin.ultradepository.util.DateIntUtil;
import cc.carm.plugin.ultradepository.util.DateUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.sql.Date; import java.sql.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
@@ -16,15 +17,13 @@ public class UserData {
public final UUID userUUID; public final UUID userUUID;
DataStorage storage;
Map<String, DepositoryData> depositories; Map<String, DepositoryData> depositories;
int date; int date;
public UserData(UUID userUUID, DataStorage storage, public UserData(UUID userUUID,
Map<String, DepositoryData> depositories, int date) { Map<String, DepositoryData> depositories, int date) {
this.userUUID = userUUID; this.userUUID = userUUID;
this.storage = storage;
this.depositories = depositories; this.depositories = depositories;
this.date = date; this.date = date;
} }
@@ -43,7 +42,7 @@ public class UserData {
} }
public @Nullable DepositoryData getDepositoryData(String depositoryID) { public @Nullable DepositoryData getDepositoryData(String depositoryID) {
Depository depository = Main.getDepositoryManager().getDepository(depositoryID); Depository depository = UltraDepository.getDepositoryManager().getDepository(depositoryID);
if (depository == null) return null; if (depository == null) return null;
return getDepositoryData(depository); return getDepositoryData(depository);
} }
@@ -60,6 +59,7 @@ public class UserData {
} }
public @NotNull DepositoryItemData getItemData(@NotNull DepositoryItem itemType) { public @NotNull DepositoryItemData getItemData(@NotNull DepositoryItem itemType) {
checkoutDate();
return getDepositoryData(itemType.getDepository()).getItemData(itemType); return getDepositoryData(itemType.getDepository()).getItemData(itemType);
} }
@@ -70,7 +70,6 @@ public class UserData {
} }
public @Nullable Integer getItemSold(@NotNull String depositoryID, @NotNull String typeID) { public @Nullable Integer getItemSold(@NotNull String depositoryID, @NotNull String typeID) {
checkoutDate();
DepositoryItemData data = getItemData(depositoryID, typeID); DepositoryItemData data = getItemData(depositoryID, typeID);
if (data == null) return null; if (data == null) return null;
return data.getSold(); return data.getSold();
@@ -118,30 +117,43 @@ public class UserData {
public Date getDate() { public Date getDate() {
return new Date(DateUtil.getDateMillis(this.date)); return new Date(DateIntUtil.getDateMillis(getDateInt()));
}
public int getDateInt() {
return this.date;
} }
public boolean isCurrentDay() { public boolean isCurrentDay() {
return this.date == DateUtil.getCurrentDate(); return this.date == DateIntUtil.getCurrentDate();
} }
public void checkoutDate() { public void checkoutDate() {
if (isCurrentDay()) { if (isCurrentDay()) return;
Main.debug("Date is not change, skip clear sold amount.");
return; this.date = DateIntUtil.getCurrentDate(); //更新日期
}
this.date = DateUtil.getCurrentDate(); //更新日期
Main.debug("Date changed, clear sold.");
getDepositories().values().stream() getDepositories().values().stream()
.flatMap(value -> value.getContents().values().stream()) .flatMap(value -> value.getContents().values().stream())
.forEach(DepositoryItemData::clearSold); .forEach(DepositoryItemData::clearSold);
} }
public Map<String, Map<String, Map<String, Integer>>> serializeToMap() {
Map<String, Map<String, Map<String, Integer>>> values = new LinkedHashMap<>();
public void save() throws Exception { getDepositories().forEach((depositoryID, depositoryData) -> {
this.storage.saveUserData(this); Map<String, Map<String, Integer>> depositoryDataMap = new LinkedHashMap<>();
depositoryData.getContents().forEach((itemType, itemData) -> {
Map<String, Integer> itemDataMap = new HashMap<>();
if (itemData.getAmount() > 0) itemDataMap.put("amount", itemData.getAmount());
if (itemData.getSold() > 0) itemDataMap.put("sold", itemData.getSold());
if (!itemDataMap.isEmpty()) depositoryDataMap.put(itemType, itemDataMap);
});
if (!depositoryDataMap.isEmpty()) values.put(depositoryID, depositoryDataMap);
});
return values;
} }
} }
@@ -0,0 +1,53 @@
package cc.carm.plugin.ultradepository.event;
import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
public class DepositoryCollectItemEvent extends UltraDepositoryEvent implements Cancellable {
public static HandlerList handlers = new HandlerList();
boolean cancelled;
private final DepositoryItem depositoryItem;
int itemAmount;
public DepositoryCollectItemEvent(@NotNull Player player, @NotNull Depository depository,
@NotNull DepositoryItem depositoryItem, int itemAmount) {
super(player, depository);
this.depositoryItem = depositoryItem;
this.itemAmount = itemAmount;
}
public void setItemAmount(int itemAmount) {
this.itemAmount = itemAmount;
}
public int getItemAmount() {
return itemAmount;
}
public DepositoryItem getDepositoryItem() {
return depositoryItem;
}
@Override
public @NotNull HandlerList getHandlers() {
return handlers;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancel) {
this.cancelled = cancel;
}
}
@@ -0,0 +1,41 @@
package cc.carm.plugin.ultradepository.event;
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
public class DepositorySellItemEvent extends UltraDepositoryEvent {
public static HandlerList handlers = new HandlerList();
int beforeAmount;
int afterAmount;
double earnedMoney;
public DepositorySellItemEvent(@NotNull Player player, @NotNull DepositoryItem depositoryItem,
int beforeAmount, int afterAmount, double earnedMoney) {
super(player, depositoryItem.getDepository());
this.beforeAmount = beforeAmount;
this.afterAmount = afterAmount;
this.earnedMoney = earnedMoney;
}
public int getBeforeAmount() {
return beforeAmount;
}
public int getAfterAmount() {
return afterAmount;
}
public double getEarnedMoney() {
return earnedMoney;
}
@NotNull
@Override
public HandlerList getHandlers() {
return handlers;
}
}
@@ -0,0 +1,33 @@
package cc.carm.plugin.ultradepository.event;
import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.data.UserData;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.jetbrains.annotations.NotNull;
public abstract class UltraDepositoryEvent extends Event {
@NotNull Player player;
@NotNull Depository depository;
public UltraDepositoryEvent(@NotNull Player player, @NotNull Depository depository) {
this.player = player;
this.depository = depository;
}
public @NotNull UserData getUserData() {
return UltraDepository.getUserManager().getData(getPlayer());
}
public @NotNull Player getPlayer() {
return player;
}
public @NotNull Depository getDepository() {
return depository;
}
}
@@ -1,12 +1,13 @@
package cc.carm.plugin.ultradepository.hooker; package cc.carm.plugin.ultradepository.hooker;
import cc.carm.plugin.ultradepository.Main; import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.configuration.depository.Depository; import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem; import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import cc.carm.plugin.ultradepository.data.DepositoryItemData; import cc.carm.plugin.ultradepository.data.DepositoryItemData;
import cc.carm.plugin.ultradepository.data.UserData; import cc.carm.plugin.ultradepository.data.UserData;
import me.clip.placeholderapi.expansion.PlaceholderExpansion; import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Arrays; import java.util.Arrays;
@@ -18,16 +19,16 @@ public class PAPIExpansion extends PlaceholderExpansion {
"%UltraDepository_amount_<BackpackID>_<ItemTypeID>%", "%UltraDepository_amount_<BackpackID>_<ItemTypeID>%",
"%UltraDepository_sold_<BackpackID>_<ItemTypeID>%", "%UltraDepository_sold_<BackpackID>_<ItemTypeID>%",
"%UltraDepository_price_<BackpackID>_<ItemTypeID>%", "%UltraDepository_price_<BackpackID>_<ItemTypeID>%",
"%UltraDepository_remain_<BackpackID>_<ItemTypeID>%", "%UltraDepository_reUltraDepository_<BackpackID>_<ItemTypeID>%",
"%UltraDepository_capacity_<BackpackID>%", "%UltraDepository_capacity_<BackpackID>%",
"%UltraDepository_used_<BackpackID>%", "%UltraDepository_used_<BackpackID>%",
"%UltraDepository_usable_<BackpackID>%" "%UltraDepository_usable_<BackpackID>%"
); );
Main main; private final JavaPlugin plugin;
public PAPIExpansion(Main main) { public PAPIExpansion(JavaPlugin plugin) {
this.main = main; this.plugin = plugin;
} }
@Override @Override
@@ -42,17 +43,17 @@ public class PAPIExpansion extends PlaceholderExpansion {
@Override @Override
public @NotNull String getAuthor() { public @NotNull String getAuthor() {
return main.getDescription().getAuthors().toString(); return plugin.getDescription().getAuthors().toString();
} }
@Override @Override
public @NotNull String getIdentifier() { public @NotNull String getIdentifier() {
return main.getDescription().getName(); return plugin.getDescription().getName();
} }
@Override @Override
public @NotNull String getVersion() { public @NotNull String getVersion() {
return main.getDescription().getVersion(); return plugin.getDescription().getVersion();
} }
@Override @Override
@@ -64,7 +65,7 @@ public class PAPIExpansion extends PlaceholderExpansion {
return "Error Params"; return "Error Params";
} }
UserData data = Main.getUserManager().getData(player); UserData data = UltraDepository.getUserManager().getData(player);
switch (args[0].toLowerCase()) { switch (args[0].toLowerCase()) {
case "amount": { case "amount": {
@@ -79,9 +80,9 @@ public class PAPIExpansion extends PlaceholderExpansion {
if (sold == null) return "Depository or Item not exists"; if (sold == null) return "Depository or Item not exists";
else return sold.toString(); else return sold.toString();
} }
case "remain": { case "reUltraDepository": {
if (args.length < 2) return "Error Params"; if (args.length < 2) return "Error Params";
Depository depository = Main.getDepositoryManager().getDepository(args[1]); Depository depository = UltraDepository.getDepositoryManager().getDepository(args[1]);
if (depository == null) return "Depository not exists"; if (depository == null) return "Depository not exists";
DepositoryItem item = depository.getItems().get(args[2]); DepositoryItem item = depository.getItems().get(args[2]);
if (item == null) return "Depository Item not exists"; if (item == null) return "Depository Item not exists";
@@ -91,31 +92,31 @@ public class PAPIExpansion extends PlaceholderExpansion {
} }
case "limit": { case "limit": {
if (args.length < 3) return "Error Params"; if (args.length < 3) return "Error Params";
Integer limit = Main.getDepositoryManager().getItemSellLimit(args[1], args[2]); Integer limit = UltraDepository.getDepositoryManager().getItemSellLimit(args[1], args[2]);
if (limit == null) return "Depository or Item not exists"; if (limit == null) return "Depository or Item not exists";
else return limit.toString(); else return limit.toString();
} }
case "price": { case "price": {
if (args.length < 3) return "Error Params"; if (args.length < 3) return "Error Params";
Double price = Main.getDepositoryManager().getItemPrice(args[1], args[2]); Double price = UltraDepository.getDepositoryManager().getItemPrice(args[1], args[2]);
if (price == null) return "Depository or Item not exists"; if (price == null) return "Depository or Item not exists";
else return price.toString(); else return price.toString();
} }
case "capacity": { case "capacity": {
if (args.length < 2) return "Error Params"; if (args.length < 2) return "Error Params";
Depository depository = Main.getDepositoryManager().getDepository(args[1]); Depository depository = UltraDepository.getDepositoryManager().getDepository(args[1]);
if (depository == null) return "Depository not exists"; if (depository == null) return "Depository not exists";
return Integer.toString(depository.getCapacity().getPlayerCapacity(player)); return Integer.toString(depository.getCapacity().getPlayerCapacity(player));
} }
case "used": { case "used": {
if (args.length < 2) return "Error Params"; if (args.length < 2) return "Error Params";
Depository depository = Main.getDepositoryManager().getDepository(args[1]); Depository depository = UltraDepository.getDepositoryManager().getDepository(args[1]);
if (depository == null) return "Depository not exists"; if (depository == null) return "Depository not exists";
return Integer.toString(data.getDepositoryData(depository).getUsedCapacity()); return Integer.toString(data.getDepositoryData(depository).getUsedCapacity());
} }
case "usable": { case "usable": {
if (args.length < 2) return "Error Params"; if (args.length < 2) return "Error Params";
Depository depository = Main.getDepositoryManager().getDepository(args[1]); Depository depository = UltraDepository.getDepositoryManager().getDepository(args[1]);
if (depository == null) return "Depository not exists"; if (depository == null) return "Depository not exists";
int used = data.getDepositoryData(depository).getUsedCapacity(); int used = data.getDepositoryData(depository).getUsedCapacity();
return Integer.toString(depository.getCapacity().getPlayerCapacity(player) - used); return Integer.toString(depository.getCapacity().getPlayerCapacity(player) - used);
@@ -1,8 +1,7 @@
package cc.carm.plugin.ultradepository.listener; package cc.carm.plugin.ultradepository.listener;
import cc.carm.plugin.ultradepository.Main; import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.configuration.PluginConfig; import cc.carm.plugin.ultradepository.configuration.PluginConfig;
import org.bukkit.Material;
import org.bukkit.entity.Item; import org.bukkit.entity.Item;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@@ -24,19 +23,17 @@ public class CollectListener implements Listener {
if (event.isCancelled() || !PluginConfig.Collect.BREAK.get()) return; if (event.isCancelled() || !PluginConfig.Collect.BREAK.get()) return;
Player player = event.getPlayer(); Player player = event.getPlayer();
if (!Main.getUserManager().isCollectEnabled(player)) return; if (!UltraDepository.getUserManager().isCollectEnabled(player)) return;
if (event.getBlock().getType() == Material.CHEST || event.getBlock().getType() == Material.TRAPPED_CHEST) { if (event.getBlock().getType().isOccluding()) return;
return;
}
List<Item> droppedItems = event.getItems(); List<Item> droppedItems = event.getItems();
if (droppedItems.isEmpty()) return; if (droppedItems.isEmpty()) return;
for (Item drop : droppedItems) { for (Item drop : droppedItems) {
Main.debug("Dropped " + drop.getType().name() + " " + drop.getItemStack().getAmount()); UltraDepository.getInstance().debug("Dropped " + drop.getType().name() + " " + drop.getItemStack().getAmount());
} }
event.getItems().removeIf(item -> Main.getDepositoryManager().collectItem(player, item.getItemStack())); event.getItems().removeIf(item -> UltraDepository.getDepositoryManager().collectItem(player, item.getItemStack()));
} }
@@ -46,9 +43,9 @@ public class CollectListener implements Listener {
Player player = event.getEntity().getKiller(); Player player = event.getEntity().getKiller();
if (player == null) return; if (player == null) return;
if (!Main.getUserManager().isCollectEnabled(player)) return; if (!UltraDepository.getUserManager().isCollectEnabled(player)) return;
Collection<ItemStack> finalDrops = Main.getDepositoryManager().collectItem(player, event.getDrops()); Collection<ItemStack> finalDrops = UltraDepository.getDepositoryManager().collectItem(player, event.getDrops());
event.getDrops().clear(); event.getDrops().clear();
event.getDrops().addAll(finalDrops); event.getDrops().addAll(finalDrops);
} }
@@ -59,16 +56,15 @@ public class CollectListener implements Listener {
if (!(event.getEntity() instanceof Player)) return; if (!(event.getEntity() instanceof Player)) return;
Player player = (Player) event.getEntity(); Player player = (Player) event.getEntity();
if (!Main.getUserManager().isCollectEnabled(player)) return; if (!UltraDepository.getUserManager().isCollectEnabled(player)) return;
// 自己扔出去的东西不计入背包 // 自己扔出去的东西不计入背包
UUID thrower = event.getItem().getThrower(); UUID thrower = event.getItem().getThrower();
if (thrower != null && thrower.equals(player.getUniqueId())) return; if (thrower != null && thrower.equals(player.getUniqueId())) return;
ItemStack item = event.getItem().getItemStack(); ItemStack item = event.getItem().getItemStack();
Main.debug("Picked up " + item.getType().name() + " " + item.getAmount()); UltraDepository.getInstance().debug("Picked up " + item.getType().name() + " " + item.getAmount());
if (Main.getDepositoryManager().collectItem(player, item)) { if (UltraDepository.getDepositoryManager().collectItem(player, item)) {
event.setCancelled(true); event.setCancelled(true);
event.getItem().remove(); event.getItem().remove();
} }
@@ -1,6 +1,6 @@
package cc.carm.plugin.ultradepository.listener; package cc.carm.plugin.ultradepository.listener;
import cc.carm.plugin.ultradepository.Main; import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.data.UserData; import cc.carm.plugin.ultradepository.data.UserData;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@@ -20,23 +20,23 @@ public class UserListener implements Listener {
return; return;
} }
UUID uuid = event.getUniqueId(); UUID uuid = event.getUniqueId();
Main.debug("尝试加载玩家 " + event.getName() + " 的数据..."); UltraDepository.getInstance().debug("尝试加载玩家 " + event.getName() + " 的数据...");
Main.getUserManager().getDataCache().put(uuid, Main.getUserManager().loadData(uuid)); UltraDepository.getUserManager().getDataCache().put(uuid, UltraDepository.getUserManager().loadData(uuid));
} }
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
public void onPreLoginMonitor(AsyncPlayerPreLoginEvent event) { public void onPreLoginMonitor(AsyncPlayerPreLoginEvent event) {
if (event.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { if (event.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) {
Main.getUserManager().getDataCache().remove(event.getUniqueId()); UltraDepository.getUserManager().getDataCache().remove(event.getUniqueId());
} }
} }
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onPlayerLogin(PlayerLoginEvent e) { public void onPlayerLogin(PlayerLoginEvent e) {
UserData data = Main.getUserManager().getData(e.getPlayer().getUniqueId()); UserData data = UltraDepository.getUserManager().getData(e.getPlayer().getUniqueId());
if (data == null) { if (data == null) {
e.setResult(PlayerLoginEvent.Result.KICK_OTHER); e.setResult(PlayerLoginEvent.Result.KICK_OTHER);
e.setKickMessage(Main.getInstance().getName() + " 数据未被正确加载,请重新进入。"); e.setKickMessage(UltraDepository.getInstance().getName() + " 数据未被正确加载,请重新进入。");
} }
} }
@@ -44,7 +44,7 @@ public class UserListener implements Listener {
public void onQuit(PlayerQuitEvent event) { public void onQuit(PlayerQuitEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
UUID playerUUID = player.getUniqueId(); UUID playerUUID = player.getUniqueId();
Main.getScheduler().runAsync(() -> Main.getUserManager().unloadData(playerUUID, true)); UltraDepository.getInstance().getScheduler().runAsync(() -> UltraDepository.getUserManager().unloadData(playerUUID, true));
} }
} }
@@ -1,38 +1,28 @@
package cc.carm.plugin.ultradepository.manager; package cc.carm.plugin.ultradepository.manager;
import cc.carm.plugin.ultradepository.Main; import cc.carm.lib.easyplugin.configuration.file.FileConfig;
import cc.carm.plugin.ultradepository.configuration.file.FileConfig; import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.configuration.gui.GUIActionConfiguration;
import cc.carm.plugin.ultradepository.configuration.gui.GUIActionType;
import cc.carm.plugin.ultradepository.configuration.gui.GUIConfiguration;
import cc.carm.plugin.ultradepository.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 {
private static FileConfig config; private static FileConfig pluginConfiguration;
private static FileConfig messageConfig; private static FileConfig messageConfiguration;
public static void initConfig() { public static void initConfig() {
ConfigManager.config = new FileConfig(Main.getInstance(), "config.yml"); pluginConfiguration = new FileConfig(UltraDepository.getInstance(), "config.yml");
ConfigManager.messageConfig = new FileConfig(Main.getInstance(), "messages.yml"); messageConfiguration = new FileConfig(UltraDepository.getInstance(), "messages.yml");
FileConfig.pluginConfiguration = () -> pluginConfiguration;
FileConfig.messageConfiguration = () -> messageConfiguration;
} }
public static FileConfig getPluginConfig() { public static FileConfig getPluginConfig() {
return config; return pluginConfiguration;
} }
public static FileConfig getMessageConfig() { public static FileConfig getMessageConfig() {
return messageConfig; return messageConfiguration;
} }
public static void reload() { public static void reload() {
@@ -1,12 +1,13 @@
package cc.carm.plugin.ultradepository.manager; package cc.carm.plugin.ultradepository.manager;
import cc.carm.plugin.ultradepository.Main; import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.configuration.PluginConfig; import cc.carm.plugin.ultradepository.configuration.PluginConfig;
import cc.carm.plugin.ultradepository.configuration.PluginMessages; import cc.carm.plugin.ultradepository.configuration.PluginMessages;
import cc.carm.plugin.ultradepository.configuration.depository.Depository; import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem; import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import cc.carm.plugin.ultradepository.data.UserData; import cc.carm.plugin.ultradepository.event.DepositoryCollectItemEvent;
import com.google.common.collect.HashMultimap; import com.google.common.collect.HashMultimap;
import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
@@ -40,8 +41,8 @@ public class DepositoryManager {
public void loadDepositories() { public void loadDepositories() {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
Main.log(" 开始加载仓库配置..."); UltraDepository.getInstance().log(" 开始加载仓库配置...");
File folder = new File(Main.getInstance().getDataFolder(), "depositories"); File folder = new File(UltraDepository.getInstance().getDataFolder(), "depositories");
if (!folder.exists()) { if (!folder.exists()) {
folder.mkdir(); folder.mkdir();
} else if (folder.isDirectory()) { } else if (folder.isDirectory()) {
@@ -63,19 +64,19 @@ public class DepositoryManager {
depository.getItems().values().forEach(value -> items.put(value.getTypeID(), depository.getIdentifier())); depository.getItems().values().forEach(value -> items.put(value.getTypeID(), depository.getIdentifier()));
data.put(identifier, depository); data.put(identifier, depository);
} else { } else {
Main.error(" 仓库 " + depository.getName() + " 未配置任何物品,请检查相关配置!"); UltraDepository.getInstance().error(" 仓库 " + depository.getName() + " 未配置任何物品,请检查相关配置!");
} }
} }
for (Map.Entry<String, Collection<String>> entry : items.asMap().entrySet()) { for (Map.Entry<String, Collection<String>> entry : items.asMap().entrySet()) {
Main.debug("# " + entry.getKey()); UltraDepository.getInstance().debug("# " + entry.getKey());
for (String depositoryID : entry.getValue()) { for (String depositoryID : entry.getValue()) {
Main.debug("- " + depositoryID); UltraDepository.getInstance().debug("- " + depositoryID);
} }
} }
this.depositories = data; this.depositories = data;
this.itemMap = items; this.itemMap = items;
Main.log(" 仓库配置加载完成,共加载 " + data.size() + " 个仓库,耗时 " + (System.currentTimeMillis() - start) + "ms 。"); UltraDepository.getInstance().log(" 仓库配置加载完成,共加载 " + data.size() + " 个仓库,耗时 " + (System.currentTimeMillis() - start) + "ms 。");
} }
public @NotNull HashMap<@NotNull String, @NotNull Depository> getDepositories() { public @NotNull HashMap<@NotNull String, @NotNull Depository> getDepositories() {
@@ -111,17 +112,16 @@ public class DepositoryManager {
} }
public Set<Depository> getPlayerUsableDepository(Player player, ItemStack itemStack) { public Set<Depository> getPlayerUsableDepository(Player player, ItemStack itemStack) {
String typeID = getItemTypeID(itemStack);
return getItemDepositories(itemStack).stream().filter(configuration -> { return getItemDepositories(itemStack).stream().filter(configuration -> {
int currentAmount = Optional.ofNullable(Main.getUserManager().getData(player) int used = UltraDepository.getUserManager().getData(player).getDepositoryData(configuration).getUsedCapacity();
.getItemAmount(configuration.getIdentifier(), typeID)).orElse(0); int max = configuration.getCapacity().getPlayerCapacity(player);
int depositoryCapacity = configuration.getCapacity().getPlayerCapacity(player); return used + itemStack.getAmount() <= max;
return currentAmount + itemStack.getAmount() <= depositoryCapacity;
}).collect(Collectors.toSet()); }).collect(Collectors.toSet());
} }
public @NotNull String getItemTypeID(Material material, int data) { public @NotNull String getItemTypeID(Material material, int data) {
return material.name() + ":" + data; if (data == 0) return material.name();
else return material.name() + ":" + data;
} }
public @NotNull String getItemTypeID(ItemStack itemStack) { public @NotNull String getItemTypeID(ItemStack itemStack) {
@@ -129,38 +129,48 @@ public class DepositoryManager {
} }
public Collection<ItemStack> collectItem(Player player, Collection<ItemStack> items) { public Collection<ItemStack> collectItem(Player player, Collection<ItemStack> items) {
if (!Main.getUserManager().isCollectEnabled(player)) { if (!UltraDepository.getUserManager().isCollectEnabled(player)) {
Main.debug("player " + player.getName() + " disabled collect, skipped."); UltraDepository.getInstance().debug("player " + player.getName() + " disabled collect, skipped.");
return items; return items;
} else return items.stream().filter(item -> !collectItem(player, item)).collect(Collectors.toList()); } else return items.stream().filter(item -> !collectItem(player, item)).collect(Collectors.toList());
} }
public boolean collectItem(Player player, ItemStack item) { public boolean collectItem(Player player, ItemStack item) {
String typeID = getItemTypeID(item); String typeID = getItemTypeID(item);
Main.debug("Checking item " + typeID + " ..."); UltraDepository.getInstance().debug("Checking item " + typeID + " ...");
if (!Main.getUserManager().isCollectEnabled(player)) { if (!UltraDepository.getUserManager().isCollectEnabled(player)) {
Main.debug("Player " + player.getName() + " disabled collect, skipped."); UltraDepository.getInstance().debug("Player " + player.getName() + " disabled collect, skipped.");
return false; return false;
} }
ItemMeta meta = item.getItemMeta(); ItemMeta meta = item.getItemMeta();
if (meta != null && (meta.hasLore() || meta.hasDisplayName() || meta.hasEnchants())) { if (meta != null && (meta.hasLore() || meta.hasDisplayName() || meta.hasEnchants())) {
// 不收集有特殊属性的物品 // 不收集有特殊属性的物品
Main.debug("Item has special meta, skipped."); UltraDepository.getInstance().debug("Item has special meta, skipped.");
return false; return false;
} }
Set<Depository> usableDepositories = getPlayerUsableDepository(player, item); Set<Depository> usableDepositories = getPlayerUsableDepository(player, item);
if (usableDepositories.size() < 1) { if (usableDepositories.size() < 1) {
Main.debug("Item doesn't has any depository, skipped."); UltraDepository.getInstance().debug("Item doesn't has any depository, skipped.");
return false; return false;
} }
Depository depository = usableDepositories.stream().findFirst().orElse(null); Depository depository = usableDepositories.stream().findFirst().orElse(null);
String itemName = depository.getItems().get(typeID).getName(); DepositoryItem depositoryItem = depository.getItems().get(typeID);
UserData data = Main.getUserManager().getData(player);
int itemAmount = item.getAmount(); int itemAmount = item.getAmount();
data.addItemAmount(depository.getIdentifier(), typeID, itemAmount);
PluginMessages.COLLECTED.send(player, new Object[]{itemName, itemAmount, depository.getName()}); DepositoryCollectItemEvent collectItemEvent = new DepositoryCollectItemEvent(player, depository, depositoryItem, itemAmount);
Bukkit.getPluginManager().callEvent(collectItemEvent);
if (collectItemEvent.isCancelled()) return false;
int finalAmount = collectItemEvent.getItemAmount();
collectItemEvent.getUserData().addItemAmount(depository.getIdentifier(), typeID, finalAmount);
PluginMessages.COLLECTED.send(player, new Object[]{
depository.getItems().get(typeID).getName(),
finalAmount, depository.getName()
});
PluginConfig.Sounds.COLLECT.play(player); PluginConfig.Sounds.COLLECT.play(player);
Main.debug("Item collected successfully."); UltraDepository.getInstance().debug("Item collected successfully.");
return true; return true;
} }
@@ -2,10 +2,14 @@ package cc.carm.plugin.ultradepository.manager;
import cc.carm.plugin.ultradepository.configuration.PluginConfig; import cc.carm.plugin.ultradepository.configuration.PluginConfig;
import cc.carm.plugin.ultradepository.configuration.PluginMessages; import cc.carm.plugin.ultradepository.configuration.PluginMessages;
import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import cc.carm.plugin.ultradepository.data.DepositoryData; import cc.carm.plugin.ultradepository.data.DepositoryData;
import cc.carm.plugin.ultradepository.data.DepositoryItemData; import cc.carm.plugin.ultradepository.data.DepositoryItemData;
import cc.carm.plugin.ultradepository.data.UserData; import cc.carm.plugin.ultradepository.data.UserData;
import cc.carm.plugin.ultradepository.event.DepositorySellItemEvent;
import cc.carm.plugin.ultradepository.hooker.VaultHooker; import cc.carm.plugin.ultradepository.hooker.VaultHooker;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
public class EconomyManager { public class EconomyManager {
@@ -41,43 +45,48 @@ public class EconomyManager {
} }
public void sellAllItem(Player player, UserData userData, boolean playSound) { public void sellAllItem(Player player, UserData userData, boolean playSound) {
userData.getDepositories().values().forEach(depositoryData -> sellAllItem(player, userData, depositoryData, false)); userData.getDepositories().values().stream().map(DepositoryData::getSource)
.forEach(depositoryData -> sellAllItem(player, userData, depositoryData, false));
if (playSound) PluginConfig.Sounds.SELL_SUCCESS.play(player); if (playSound) PluginConfig.Sounds.SELL_SUCCESS.play(player);
} }
public void sellAllItem(Player player, UserData userData, DepositoryData depositoryData) { public void sellAllItem(Player player, UserData userData, Depository depository) {
sellAllItem(player, userData, depositoryData, true); sellAllItem(player, userData, depository, true);
} }
public void sellAllItem(Player player, UserData userData, DepositoryData depositoryData, boolean playSound) { public void sellAllItem(Player player, UserData userData, Depository depository, boolean playSound) {
depositoryData.getContents().values().forEach(value -> sellAllItem(player, userData, value, false)); depository.getItems().values().forEach(value -> sellAllItem(player, userData, value, false));
if (playSound) PluginConfig.Sounds.SELL_SUCCESS.play(player); if (playSound) PluginConfig.Sounds.SELL_SUCCESS.play(player);
} }
public void sellAllItem(Player player, UserData userData, DepositoryItemData itemData) { public void sellAllItem(Player player, UserData userData, DepositoryItem depositoryItem) {
sellAllItem(player, userData, itemData, true); sellAllItem(player, userData, depositoryItem, true);
} }
public void sellAllItem(Player player, UserData userData, DepositoryItemData itemData, boolean playSound) { public void sellAllItem(Player player, UserData userData, DepositoryItem depositoryItem, boolean playSound) {
DepositoryItemData itemData = userData.getItemData(depositoryItem);
int amount = itemData.getAmount(); int amount = itemData.getAmount();
int sold = itemData.getSold(); int sold = itemData.getSold();
int limit = itemData.getSource().getLimit(); int limit = depositoryItem.getLimit();
int finalAmount = Math.min(amount, (limit - sold)); int finalAmount = Math.min(amount, (limit - sold));
if (finalAmount > 0) sellItem(player, userData, itemData, finalAmount, false); if (finalAmount > 0) sellItem(player, userData, depositoryItem, finalAmount, false);
if (playSound) PluginConfig.Sounds.SELL_SUCCESS.play(player); if (playSound) PluginConfig.Sounds.SELL_SUCCESS.play(player);
} }
public void sellItem(Player player, UserData userData, DepositoryItemData itemData, int amount) { public void sellItem(Player player, UserData userData, DepositoryItem depositoryItem, int amount) {
sellItem(player, userData, itemData, amount, true); sellItem(player, userData, depositoryItem, amount, true);
} }
public void sellItem(Player player, UserData userData, DepositoryItemData itemData, int amount, boolean playSound) { public void sellItem(Player player, UserData userData, DepositoryItem depositoryItem, int amount, boolean playSound) {
userData.addItemSold(itemData.getOwner().getSource().getIdentifier(), itemData.getSource().getTypeID(), amount); int[] changes = userData.getItemData(depositoryItem).applyChanges(-amount, amount);
userData.removeItemAmount(itemData.getOwner().getSource().getIdentifier(), itemData.getSource().getTypeID(), amount); double money = sell(player, depositoryItem.getPrice(), amount);
double money = sell(player, itemData.getSource().getPrice(), amount); Bukkit.getPluginManager().callEvent(new DepositorySellItemEvent(
PluginMessages.SOLD.send(player, new Object[]{itemData.getSource().getName(), amount, money}); player, depositoryItem, changes[0] + amount, changes[0], money
));
PluginMessages.SOLD.send(player, new Object[]{depositoryItem.getName(), amount, money});
if (playSound) PluginConfig.Sounds.SELL_SUCCESS.play(player); if (playSound) PluginConfig.Sounds.SELL_SUCCESS.play(player);
} }
@@ -1,8 +1,9 @@
package cc.carm.plugin.ultradepository.manager; package cc.carm.plugin.ultradepository.manager;
import cc.carm.plugin.ultradepository.Main; import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.data.UserData; import cc.carm.plugin.ultradepository.data.UserData;
import cc.carm.plugin.ultradepository.util.DateUtil; import cc.carm.plugin.ultradepository.storage.DataStorage;
import cc.carm.plugin.ultradepository.util.DateIntUtil;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -29,11 +30,25 @@ public class UserManager {
public @NotNull UserData loadData(@NotNull UUID userUUID) { public @NotNull UserData loadData(@NotNull UUID userUUID) {
try { try {
return Main.getStorage().loadData(userUUID); long start = System.currentTimeMillis();
DataStorage storage = UltraDepository.getStorage();
UltraDepository.getInstance().debug("正通过 " + storage.getClass().getSimpleName() + " 加载 " + userUUID + " 的用户数据...");
UserData data = UltraDepository.getStorage().loadData(userUUID);
if (data == null) {
UltraDepository.getInstance().debug("当前还不存在玩家 " + userUUID + " 的数据,视作新档。");
return new UserData(userUUID, new HashMap<>(), DateIntUtil.getCurrentDate());
}
UltraDepository.getInstance().debug("通过 " + storage.getClass().getSimpleName() + "加载 " + userUUID + " 的用户数据完成,"
+ "耗时 " + (System.currentTimeMillis() - start) + "ms。");
return data;
} catch (Exception e) { } catch (Exception e) {
Main.error("无法正常加载玩家数据,玩家操作将不会被保存,请检查数据配置!"); UltraDepository.getInstance().error("无法正常加载玩家数据,玩家操作将不会被保存,请检查数据配置!");
Main.error("Could not load user's data, please check the data configuration!"); UltraDepository.getInstance().error("Could not load user's data, please check the data configuration!");
return new UserData(userUUID, Main.getStorage(), new HashMap<>(), DateUtil.getCurrentDate()); e.printStackTrace();
return new UserData(userUUID, new HashMap<>(), DateIntUtil.getCurrentDate());
} }
} }
@@ -46,11 +61,18 @@ public class UserManager {
public void saveData(UserData data) { public void saveData(UserData data) {
try { try {
data.save(); long start = System.currentTimeMillis();
Main.debug(" 玩家 " + data.getUserUUID() + " 数据已保存。"); DataStorage storage = UltraDepository.getStorage();
UltraDepository.getInstance().debug("正通过 " + storage.getClass().getSimpleName() + " 保存 " + data.getUserUUID() + " 的用户数据...");
storage.saveUserData(data);
UltraDepository.getInstance().debug("通过 " + storage.getClass().getSimpleName() + " 保存 " + data.getUserUUID() + " 的用户数据完成," +
"耗时 " + (System.currentTimeMillis() - start) + "ms。");
} catch (Exception e) { } catch (Exception e) {
Main.error("无法正常保存玩家数据,请检查数据配置!"); UltraDepository.getInstance().error("无法正常保存玩家数据,请检查数据配置!");
Main.error("Could not save user's data, please check the data configuration!"); UltraDepository.getInstance().error("Could not save user's data, please check the data configuration!");
e.printStackTrace(); e.printStackTrace();
} }
} }
@@ -2,6 +2,7 @@ package cc.carm.plugin.ultradepository.storage;
import cc.carm.plugin.ultradepository.data.UserData; import cc.carm.plugin.ultradepository.data.UserData;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.UUID; import java.util.UUID;
@@ -12,9 +13,33 @@ public interface DataStorage {
void shutdown(); void shutdown();
@NotNull @Nullable
UserData loadData(@NotNull UUID uuid) throws Exception; UserData loadData(@NotNull UUID uuid) throws Exception;
void saveUserData(@NotNull UserData data) throws Exception; void saveUserData(@NotNull UserData data) throws Exception;
/**
* Support old data which is forced to use data value.
* 老数据强制给typeID加上了data值(包括0),然而1.13后每个物品都有对应的Material。
* 自插件v1.1.6版本开始不再强制,但需要为此额外做出支持,避免玩家数据丢失。
*
* @param typeID ID源数据
* @return 正确ID数据
* @since v1.1.6
*/
default String getFixedTypeID(String typeID) {
String trueID = typeID;
if (typeID.contains(":")) {
try {
String[] args = trueID.split(":");
if (Integer.parseInt(args[1]) == 0) {
trueID = args[0];
}
} catch (Exception ignore) {
}
}
return trueID;
}
} }
@@ -1,50 +0,0 @@
package cc.carm.plugin.ultradepository.storage;
import cc.carm.plugin.ultradepository.Main;
import cc.carm.plugin.ultradepository.configuration.values.ConfigValue;
import cc.carm.plugin.ultradepository.data.UserData;
import cc.carm.plugin.ultradepository.util.DateUtil;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.sql.Date;
import java.util.HashMap;
import java.util.UUID;
public class FileStorage implements DataStorage {
private static final ConfigValue<String> FILE_PATH = new ConfigValue<>(
"storage.file-path", String.class, "data"
);
private File dataContainer;
@Override
public boolean initialize() {
return false;
}
@Override
public void shutdown() {
// 似乎没什么需要做的?
}
@Override
public @NotNull UserData loadData(@NotNull UUID uuid) {
long start = System.currentTimeMillis();
Main.debug("正通过 FileStorage 加载 " + uuid + " 的用户数据...");
return new UserData(uuid, this, new HashMap<>(), DateUtil.getCurrentDate());
}
@Override
public void saveUserData(@NotNull UserData data) {
long start = System.currentTimeMillis();
Main.debug("正通过 FileStorage 保存 " + data.getUserUUID() + " 的用户数据...");
Main.debug(
"通过 FileStorage 保存 " + data.getUserUUID() + " 的用户数据完成," +
"耗时 " + (System.currentTimeMillis() - start) + "ms。"
);
}
}
@@ -1,232 +0,0 @@
package cc.carm.plugin.ultradepository.storage;
import cc.carm.lib.easysql.EasySQL;
import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.lib.easysql.api.action.query.PreparedQueryAction;
import cc.carm.lib.easysql.api.action.query.SQLQuery;
import cc.carm.plugin.ultradepository.Main;
import cc.carm.plugin.ultradepository.configuration.PluginConfig;
import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import cc.carm.plugin.ultradepository.configuration.values.ConfigValue;
import cc.carm.plugin.ultradepository.data.DepositoryData;
import cc.carm.plugin.ultradepository.data.DepositoryItemData;
import cc.carm.plugin.ultradepository.data.UserData;
import cc.carm.plugin.ultradepository.util.DateUtil;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class MySQLStorage implements DataStorage {
private static final ConfigValue<String> DRIVER_NAME = new ConfigValue<>(
"storage.mysql.driver", String.class, "com.mysql.jdbc.Driver"
);
private static final ConfigValue<String> URL = new ConfigValue<>(
"storage.mysql.url", String.class, "jdbc:mysql://127.0.0.1:3306/minecraft"
);
private static final ConfigValue<String> USERNAME = new ConfigValue<>(
"storage.mysql.username", String.class, "username"
);
private static final ConfigValue<String> PASSWORD = new ConfigValue<>(
"storage.mysql.password", String.class, "password"
);
public enum SQLTables {
USER_DATA("ub_data", new String[]{
"`uuid` VARCHAR(36) NOT NULL PRIMARY KEY", // 用户的UUID
"`data` MEDIUMTEXT NOT NULL",// 背包内具体物品
"`day` DATE NOT NULL", // 记录卖出数量的所在天
});
String name;
String[] columns;
SQLTables(String name, String[] columns) {
this.name = name;
this.columns = columns;
}
public static void createTables(SQLManager sqlManager) throws SQLException {
for (SQLTables value : values()) {
sqlManager.createTable(value.getName())
.setColumns(value.getColumns())
.build().execute();
}
}
public String getName() {
return name;
}
public String[] getColumns() {
return columns;
}
}
public static final Gson GSON = new Gson();
public static final JsonParser PARSER = new JsonParser();
SQLManager sqlManager;
@Override
public boolean initialize() {
try {
Main.log(" 尝试连接到数据库...");
this.sqlManager = EasySQL.createManager(DRIVER_NAME.get(), URL.get(), USERNAME.get(), PASSWORD.get());
this.sqlManager.setDebugMode(PluginConfig.DEBUG.get());
} catch (Exception exception) {
Main.error("无法连接到数据库,请检查配置文件。");
Main.error("Could not connect to the database, please check the configuration.");
exception.printStackTrace();
return false;
}
try {
Main.log(" 创建插件所需表...");
SQLTables.createTables(sqlManager);
} catch (SQLException exception) {
Main.error("无法创建插件所需的表,请检查数据库权限。");
Main.error("Could not create necessary tables, please check the database privileges.");
exception.printStackTrace();
return false;
}
return true;
}
@Override
public void shutdown() {
Main.log(" 关闭数据库连接...");
EasySQL.shutdownManager(getSQLManager());
}
@Override
public @NotNull UserData loadData(@NotNull UUID uuid) throws Exception {
long start = System.currentTimeMillis();
Main.debug("正通过 MySQLStorage 加载 " + uuid + " 的用户数据...");
try (SQLQuery query = createAction(uuid).execute()) {
ResultSet resultSet = query.getResultSet();
if (resultSet != null && resultSet.next()) {
String dataJSON = resultSet.getString("data");
Date date = resultSet.getDate("day");
UserData data = new UserData(uuid, this, new HashMap<>(), DateUtil.getDateInt(date));
JsonElement dataElement = PARSER.parse(dataJSON);
if (dataElement.isJsonObject()) {
for (Map.Entry<String, JsonElement> entry : dataElement.getAsJsonObject().entrySet()) {
Depository depository = Main.getDepositoryManager().getDepository(entry.getKey());
if (depository == null) continue;
DepositoryData contentsData = parseContentsData(depository, data, entry.getValue());
if (contentsData != null) data.setDepository(contentsData);
}
}
Main.debug("通过 MySQLStorage 加载 " + uuid + " 的用户数据完成,"
+ "耗时 " + (System.currentTimeMillis() - start) + "ms。");
return data;
}
Main.debug("当前库内不存在玩家 " + uuid + " 的数据,视作新档。");
return new UserData(uuid, this, new HashMap<>(), DateUtil.getCurrentDate());
} catch (Exception exception) {
throw new Exception(exception);
}
}
@Override
public void saveUserData(@NotNull UserData data) throws Exception {
long start = System.currentTimeMillis();
Main.debug("正通过 MySQLStorage 保存 " + data.getUserUUID() + " 的用户数据...");
JsonObject dataObject = new JsonObject();
data.getDepositories().forEach((id, contents) -> dataObject.add(id, serializeContentsData(contents)));
try {
getSQLManager().createReplace(SQLTables.USER_DATA.getName())
.setColumnNames("uuid", "data", "day")
.setParams(data.getUserUUID(), GSON.toJson(dataObject), data.getDate())
.execute();
} catch (SQLException exception) {
Main.error("在保存玩家 #" + data.getUserUUID() + " 的数据时出现异常。");
Main.error("Error occurred when saving #" + data.getUserUUID() + " data.");
throw new Exception(exception);
}
Main.debug("通过 MySQLStorage 保存 " + data.getUserUUID() + " 的用户数据完成," +
"耗时 " + (System.currentTimeMillis() - start) + "ms。");
}
private SQLManager getSQLManager() {
return sqlManager;
}
private PreparedQueryAction createAction(UUID uuid) {
return getSQLManager().createQuery()
.inTable(SQLTables.USER_DATA.getName())
.addCondition("uuid", uuid.toString())
.setLimit(1).build();
}
private DepositoryData parseContentsData(Depository source, UserData owner, JsonElement contentsElement) {
return contentsElement.isJsonObject() ? parseContentsData(source, owner, contentsElement.getAsJsonObject()) : null;
}
private DepositoryData parseContentsData(Depository source, UserData owner, JsonObject contentsObject) {
DepositoryData data = DepositoryData.emptyContents(source, owner);
for (Map.Entry<String, JsonElement> entry : contentsObject.entrySet()) {
DepositoryItem item = source.getItems().get(entry.getKey());
if (item == null) continue;
DepositoryItemData itemData = parseItemData(item, data, entry.getValue());
if (itemData != null) data.getContents().put(item.getTypeID(), itemData);
}
return data;
}
private DepositoryItemData parseItemData(DepositoryItem source, DepositoryData owner, JsonElement itemElement) {
return itemElement.isJsonObject() ? parseItemData(source, owner, itemElement.getAsJsonObject()) : null;
}
private DepositoryItemData parseItemData(DepositoryItem source, DepositoryData owner, JsonObject itemObject) {
int amount = itemObject.has("amount") ? itemObject.get("amount").getAsInt() : 0;
int sold = itemObject.has("sold") ? itemObject.get("sold").getAsInt() : 0;
if (amount == 0 && sold == 0) return null;
else return new DepositoryItemData(source, owner, amount, sold);
}
@Nullable
private JsonObject serializeContentsData(@Nullable DepositoryData contentsData) {
if (contentsData == null) return null;
JsonObject contentsObject = new JsonObject();
contentsData.getContents().entrySet().stream()
// 只存取有数值的部分,减少数据量
.filter(entry -> entry.getValue().getSold() > 0 || entry.getValue().getAmount() > 0)
.forEach(entry -> contentsObject.add(entry.getKey(), serializeItemData(entry.getValue())));
return contentsObject;
}
@NotNull
private JsonObject serializeItemData(@NotNull DepositoryItemData itemData) {
JsonObject itemObject = new JsonObject();
if (itemData.getAmount() > 0) itemObject.addProperty("amount", itemData.getAmount());
if (itemData.getSold() > 0) itemObject.addProperty("sold", itemData.getSold());
return itemObject;
}
}
@@ -0,0 +1,64 @@
package cc.carm.plugin.ultradepository.storage;
import cc.carm.plugin.ultradepository.storage.impl.CustomStorage;
import cc.carm.plugin.ultradepository.storage.impl.JSONStorage;
import cc.carm.plugin.ultradepository.storage.impl.MySQLStorage;
import cc.carm.plugin.ultradepository.storage.impl.YAMLStorage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.Optional;
import java.util.function.Supplier;
public enum StorageMethod {
CUSTOM(0, CustomStorage::new),
YAML(1, YAMLStorage::new),
JSON(2, JSONStorage::new),
MYSQL(3, MySQLStorage::new);
private final int id;
private @NotNull Supplier<@NotNull DataStorage> storageSupplier;
StorageMethod(int id, @NotNull Supplier<@NotNull DataStorage> storageSupplier) {
this.id = id;
this.storageSupplier = storageSupplier;
}
public int getID() {
return id;
}
public @NotNull Supplier<@NotNull DataStorage> getStorageSupplier() {
return storageSupplier;
}
public void setStorageSupplier(@NotNull Supplier<@NotNull DataStorage> storageSupplier) {
this.storageSupplier = storageSupplier;
}
public @NotNull DataStorage createStorage() {
return getStorageSupplier().get();
}
public static @NotNull StorageMethod read(String s) {
StorageMethod byName = readByName(s);
if (byName != null) return byName;
try {
return Optional.ofNullable(readByID(Integer.parseInt(s))).orElse(YAML);
} catch (Exception ex) {
return YAML;
}
}
public static @Nullable StorageMethod readByName(String name) {
return Arrays.stream(values()).filter(value -> value.name().equalsIgnoreCase(name)).findFirst().orElse(null);
}
public static @Nullable StorageMethod readByID(int id) {
return Arrays.stream(values()).filter(value -> value.getID() == id).findFirst().orElse(null);
}
}
@@ -0,0 +1,37 @@
package cc.carm.plugin.ultradepository.storage.impl;
import cc.carm.plugin.ultradepository.data.UserData;
import cc.carm.plugin.ultradepository.storage.DataStorage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
import java.util.UUID;
public class CustomStorage implements DataStorage {
@Override
@TestOnly
public boolean initialize() {
return false;
}
@Override
@TestOnly
public void shutdown() {
}
@Override
@TestOnly
public @Nullable UserData loadData(@NotNull UUID uuid) {
return null;
}
@Override
@TestOnly
public void saveUserData(@NotNull UserData data) {
}
}
@@ -0,0 +1,134 @@
package cc.carm.plugin.ultradepository.storage.impl;
import cc.carm.lib.easyplugin.configuration.values.ConfigValue;
import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import cc.carm.plugin.ultradepository.data.DepositoryData;
import cc.carm.plugin.ultradepository.data.DepositoryItemData;
import cc.carm.plugin.ultradepository.data.UserData;
import cc.carm.plugin.ultradepository.storage.DataStorage;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class JSONStorage implements DataStorage {
private static final ConfigValue<String> FILE_PATH = new ConfigValue<>(
"storage.file-path", String.class, "data"
);
private File dataContainer;
public static final Gson GSON = new Gson();
public static final JsonParser PARSER = new JsonParser();
@Override
public boolean initialize() {
dataContainer = new File(UltraDepository.getInstance().getDataFolder(), FILE_PATH.get());
if (!dataContainer.exists()) {
return dataContainer.mkdir();
} else {
return dataContainer.isDirectory();
}
}
@Override
public void shutdown() {
// 似乎没什么需要做的?
dataContainer = null;
}
public File getDataContainer() {
return dataContainer;
}
@Override
public @Nullable UserData loadData(@NotNull UUID uuid) throws Exception {
File userDataFile = new File(getDataContainer(), uuid + ".json");
if (!userDataFile.exists()) {
UltraDepository.getInstance().debug("当前文件夾内不存在玩家 " + uuid + " 的数据,视作新档。");
return null;
}
JsonElement dataElement = PARSER.parse(new FileReader(userDataFile));
if (!dataElement.isJsonObject()) throw new NullPointerException(userDataFile.getName());
JsonObject dataObject = dataElement.getAsJsonObject();
int dateInt = dataObject.get("date").getAsInt();
JsonObject repositoriesObject = dataObject.getAsJsonObject("depositories");
UserData userData = new UserData(uuid, new HashMap<>(), dateInt);
for (Map.Entry<String, JsonElement> entry : repositoriesObject.entrySet()) {
Depository depository = UltraDepository.getDepositoryManager().getDepository(entry.getKey());
if (depository == null) continue;
DepositoryData contentsData = parseContentsData(depository, userData, entry.getValue());
if (contentsData != null) userData.setDepository(contentsData);
}
return userData;
}
@Override
public void saveUserData(@NotNull UserData data) throws Exception {
JsonObject dataObject = new JsonObject();
dataObject.addProperty("date", data.getDateInt());
dataObject.add("depositories", GSON.toJsonTree(data.serializeToMap()));
FileWriter writer = new FileWriter(new File(getDataContainer(), data.getUserUUID() + ".json"));
writer.write(GSON.toJson(dataObject));
writer.flush();
writer.close();
}
protected DepositoryData parseContentsData(@NotNull Depository source,
@NotNull UserData owner,
@NotNull JsonElement contentsElement) {
return contentsElement.isJsonObject() ? parseContentsData(source, owner, contentsElement.getAsJsonObject()) : null;
}
protected DepositoryData parseContentsData(@NotNull Depository source,
@NotNull UserData owner,
@NotNull JsonObject contentsObject) {
DepositoryData data = DepositoryData.emptyContents(source, owner);
for (Map.Entry<String, JsonElement> entry : contentsObject.entrySet()) {
DepositoryItem item = source.getItems().get(getFixedTypeID(entry.getKey()));
if (item == null) continue;
DepositoryItemData itemData = parseItemData(item, data, entry.getValue());
if (itemData != null) data.getContents().put(item.getTypeID(), itemData);
}
return data;
}
protected DepositoryItemData parseItemData(@NotNull DepositoryItem source,
@NotNull DepositoryData owner,
@NotNull JsonElement itemElement) {
return itemElement.isJsonObject() ? parseItemData(source, owner, itemElement.getAsJsonObject()) : null;
}
protected DepositoryItemData parseItemData(@NotNull DepositoryItem source,
@NotNull DepositoryData owner,
@NotNull JsonObject itemObject) {
int amount = itemObject.has("amount") ? itemObject.get("amount").getAsInt() : 0;
int sold = itemObject.has("sold") ? itemObject.get("sold").getAsInt() : 0;
if (amount == 0 && sold == 0) return null;
return new DepositoryItemData(source, owner, amount, sold);
}
}
@@ -0,0 +1,139 @@
package cc.carm.plugin.ultradepository.storage.impl;
import cc.carm.lib.easyplugin.configuration.values.ConfigValue;
import cc.carm.lib.easyplugin.database.DatabaseTable;
import cc.carm.lib.easyplugin.database.EasySQL;
import cc.carm.lib.easyplugin.database.api.SQLManager;
import cc.carm.lib.easyplugin.database.api.action.query.PreparedQueryAction;
import cc.carm.lib.easyplugin.database.api.action.query.SQLQuery;
import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.configuration.PluginConfig;
import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.data.DepositoryData;
import cc.carm.plugin.ultradepository.data.UserData;
import cc.carm.plugin.ultradepository.util.DateIntUtil;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class MySQLStorage extends JSONStorage {
private static final ConfigValue<String> DRIVER_NAME = new ConfigValue<>(
"storage.mysql.driver", String.class, "com.mysql.jdbc.Driver"
);
private static final ConfigValue<String> URL = new ConfigValue<>(
"storage.mysql.url", String.class, "jdbc:mysql://127.0.0.1:3306/minecraft"
);
private static final ConfigValue<String> USERNAME = new ConfigValue<>(
"storage.mysql.username", String.class, "username"
);
private static final ConfigValue<String> PASSWORD = new ConfigValue<>(
"storage.mysql.password", String.class, "password"
);
private static final DatabaseTable USER_TABLE = new DatabaseTable(
"ub_data",
new String[]{
"`uuid` VARCHAR(36) NOT NULL PRIMARY KEY", // 用户的UUID
"`data` MEDIUMTEXT NOT NULL",// 背包内具体物品
"`day` DATE NOT NULL", // 记录卖出数量的所在天
});
public static final Gson GSON = new Gson();
public static final JsonParser PARSER = new JsonParser();
SQLManager sqlManager;
@Override
public boolean initialize() {
try {
UltraDepository.getInstance().log(" 尝试连接到数据库...");
this.sqlManager = EasySQL.createManager(DRIVER_NAME.get(), URL.get(), USERNAME.get(), PASSWORD.get());
this.sqlManager.setDebugMode(PluginConfig.DEBUG.get());
} catch (Exception exception) {
UltraDepository.getInstance().error("无法连接到数据库,请检查配置文件。");
UltraDepository.getInstance().error("Could not connect to the database, please check the configuration.");
exception.printStackTrace();
return false;
}
try {
UltraDepository.getInstance().log(" 创建插件所需表...");
USER_TABLE.createTable(sqlManager);
} catch (SQLException exception) {
UltraDepository.getInstance().error("无法创建插件所需的表,请检查数据库权限。");
UltraDepository.getInstance().error("Could not create necessary tables, please check the database privileges.");
exception.printStackTrace();
return false;
}
return true;
}
@Override
public void shutdown() {
UltraDepository.getInstance().log(" 关闭数据库连接...");
EasySQL.shutdownManager(getSQLManager());
}
@Override
public @Nullable UserData loadData(@NotNull UUID uuid) throws Exception {
try (SQLQuery query = createAction(uuid).execute()) {
ResultSet resultSet = query.getResultSet();
if (resultSet == null || !resultSet.next()) return null;
String dataJSON = resultSet.getString("data");
Date date = resultSet.getDate("day");
UserData data = new UserData(uuid, new HashMap<>(), DateIntUtil.getDateInt(date));
JsonElement dataElement = PARSER.parse(dataJSON);
if (dataElement.isJsonObject()) {
for (Map.Entry<String, JsonElement> entry : dataElement.getAsJsonObject().entrySet()) {
Depository depository = UltraDepository.getDepositoryManager().getDepository(entry.getKey());
if (depository == null) continue;
DepositoryData contentsData = parseContentsData(depository, data, entry.getValue());
if (contentsData != null) data.setDepository(contentsData);
}
}
return data;
} catch (Exception exception) {
throw new Exception(exception);
}
}
@Override
public void saveUserData(@NotNull UserData data) throws Exception {
getSQLManager().createReplace(USER_TABLE.getTableName())
.setColumnNames("uuid", "data", "day")
.setParams(data.getUserUUID(), GSON.toJson(data.serializeToMap()), data.getDate())
.execute();
}
private SQLManager getSQLManager() {
return sqlManager;
}
private PreparedQueryAction createAction(UUID uuid) {
return USER_TABLE.createQuery(sqlManager)
.addCondition("uuid", uuid.toString())
.setLimit(1).build();
}
}
@@ -0,0 +1,104 @@
package cc.carm.plugin.ultradepository.storage.impl;
import cc.carm.lib.easyplugin.configuration.values.ConfigValue;
import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import cc.carm.plugin.ultradepository.data.DepositoryData;
import cc.carm.plugin.ultradepository.data.DepositoryItemData;
import cc.carm.plugin.ultradepository.data.UserData;
import cc.carm.plugin.ultradepository.storage.DataStorage;
import cc.carm.plugin.ultradepository.util.DateIntUtil;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.UUID;
public class YAMLStorage implements DataStorage {
private static final ConfigValue<String> FILE_PATH = new ConfigValue<>(
"storage.file-path", String.class, "data"
);
private File dataContainer;
@Override
public boolean initialize() {
dataContainer = new File(UltraDepository.getInstance().getDataFolder(), FILE_PATH.get());
if (!dataContainer.exists()) {
return dataContainer.mkdir();
} else {
return dataContainer.isDirectory();
}
}
@Override
public void shutdown() {
// 似乎没什么需要做的?
dataContainer = null;
}
public File getDataContainer() {
return dataContainer;
}
@Override
public @Nullable UserData loadData(@NotNull UUID uuid) {
File userDataFile = new File(getDataContainer(), uuid + ".yml");
if (!userDataFile.exists()) {
UltraDepository.getInstance().debug("当前文件夾内不存在玩家 " + uuid + " 的数据,视作新档。");
return null;
}
YamlConfiguration userDataConfig = YamlConfiguration.loadConfiguration(userDataFile);
int dateInt = userDataConfig.getInt("date", DateIntUtil.getCurrentDate());
UserData userData = new UserData(uuid, new HashMap<>(), dateInt);
ConfigurationSection depositoriesSection = userDataConfig.getConfigurationSection("depositories");
if (depositoriesSection != null) {
for (String depositoryID : depositoriesSection.getKeys(false)) {
Depository depository = UltraDepository.getDepositoryManager().getDepository(depositoryID);
if (depository == null) continue;
ConfigurationSection depositorySection = depositoriesSection.getConfigurationSection(depositoryID);
if (depositorySection == null) continue;
DepositoryData depositoryData = DepositoryData.emptyContents(depository, userData);
for (String itemTypeID : depositorySection.getKeys(false)) {
DepositoryItem item = depository.getItems().get(getFixedTypeID(itemTypeID));
if (item == null) continue;
ConfigurationSection itemSection = depositorySection.getConfigurationSection(itemTypeID);
if (itemSection == null) continue;
depositoryData.getContents().put(item.getTypeID(), new DepositoryItemData(
item, depositoryData,
itemSection.getInt("amount", 0),
itemSection.getInt("sold", 0)
));
}
if (!depositoryData.getContents().isEmpty()) userData.setDepository(depositoryData);
}
}
return userData;
}
@Override
public void saveUserData(@NotNull UserData data) throws IOException {
YamlConfiguration userDataConfig = new YamlConfiguration();
userDataConfig.set("date", data.getDateInt());
userDataConfig.createSection("depositories", data.serializeToMap());
userDataConfig.save(new File(getDataContainer(), data.getUserUUID() + ".yml"));
}
}
@@ -1,15 +1,15 @@
package cc.carm.plugin.ultradepository.ui; package cc.carm.plugin.ultradepository.ui;
import cc.carm.plugin.ultradepository.Main; import cc.carm.lib.easyplugin.gui.GUI;
import cc.carm.lib.easyplugin.gui.GUIItem;
import cc.carm.lib.easyplugin.utils.ItemStackFactory;
import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.configuration.PluginConfig; import cc.carm.plugin.ultradepository.configuration.PluginConfig;
import cc.carm.plugin.ultradepository.configuration.PluginMessages; import cc.carm.plugin.ultradepository.configuration.PluginMessages;
import cc.carm.plugin.ultradepository.configuration.depository.Depository; import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem; import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import cc.carm.plugin.ultradepository.data.DepositoryItemData; import cc.carm.plugin.ultradepository.data.DepositoryItemData;
import cc.carm.plugin.ultradepository.data.UserData; import cc.carm.plugin.ultradepository.data.UserData;
import cc.carm.plugin.ultradepository.util.ItemStackFactory;
import cc.carm.plugin.ultradepository.util.gui.GUI;
import cc.carm.plugin.ultradepository.util.gui.GUIItem;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.ClickType;
@@ -28,7 +28,7 @@ public class DepositoryGUI extends GUI {
super(depository.getGUIConfiguration().getGUIType(), depository.getGUIConfiguration().getTitle()); super(depository.getGUIConfiguration().getGUIType(), depository.getGUIConfiguration().getTitle());
this.player = player; this.player = player;
this.userData = Main.getUserManager().getData(player); this.userData = UltraDepository.getUserManager().getData(player);
this.depository = depository; this.depository = depository;
setupItems(); setupItems();
@@ -59,21 +59,19 @@ public class DepositoryGUI extends GUI {
return new GUIItem(factory.toItemStack()) { return new GUIItem(factory.toItemStack()) {
@Override @Override
public void onClick(ClickType type) { public void onClick(ClickType type) {
if (itemData.getAmount() < 1) return; if (itemData.getAmount() < 1) {
if (type == ClickType.LEFT) { PluginMessages.NO_ENOUGH_ITEM.send(player);
player.closeInventory(); return;
if (itemData.getAmount() >= 1) { }
if (remain >= 1) {
SellItemGUI.open(player, userData, itemData, depository, item);
} else {
PluginMessages.ITEM_SOLD_LIMIT.send(player, new Object[]{remain, item.getLimit()});
}
} else {
PluginMessages.NO_ENOUGH_ITEM.send(player);
}
if (type == ClickType.LEFT) {
if (remain >= 1) {
SellItemGUI.open(player, userData, itemData, depository, item);
} else {
PluginMessages.ITEM_SOLD_LIMIT.send(player, new Object[]{remain, item.getLimit()});
}
} else if (type == ClickType.RIGHT) { } else if (type == ClickType.RIGHT) {
player.closeInventory();
if (hasEmptySlot(player)) { if (hasEmptySlot(player)) {
int pickupAmount = Math.min(itemData.getAmount(), item.getMaterial().getMaxStackSize()); int pickupAmount = Math.min(itemData.getAmount(), item.getMaterial().getMaxStackSize());
userData.removeItemAmount(item.getDepository().getIdentifier(), item.getTypeID(), pickupAmount); userData.removeItemAmount(item.getDepository().getIdentifier(), item.getTypeID(), pickupAmount);
@@ -81,10 +79,12 @@ public class DepositoryGUI extends GUI {
PluginMessages.PICKUP.send(player, new Object[]{ PluginMessages.PICKUP.send(player, new Object[]{
item.getName(), pickupAmount item.getName(), pickupAmount
}); });
setupItems(); //刷新GUI
updateView();
} else { } else {
PluginMessages.NO_SPACE.send(player); PluginMessages.NO_SPACE.send(player);
player.closeInventory();
} }
} }
} }
}; };
@@ -97,6 +97,7 @@ public class DepositoryGUI extends GUI {
} }
public static void open(@NotNull Player player, @NotNull Depository depository) { public static void open(@NotNull Player player, @NotNull Depository depository) {
player.closeInventory();
DepositoryGUI gui = new DepositoryGUI(player, depository); DepositoryGUI gui = new DepositoryGUI(player, depository);
gui.openGUI(player); gui.openGUI(player);
} }
@@ -1,15 +1,16 @@
package cc.carm.plugin.ultradepository.ui; package cc.carm.plugin.ultradepository.ui;
import cc.carm.plugin.ultradepository.Main; import cc.carm.lib.easyplugin.gui.GUI;
import cc.carm.lib.easyplugin.gui.GUIItem;
import cc.carm.lib.easyplugin.gui.GUIType;
import cc.carm.lib.easyplugin.utils.ItemStackFactory;
import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.configuration.PluginConfig; import cc.carm.plugin.ultradepository.configuration.PluginConfig;
import cc.carm.plugin.ultradepository.configuration.PluginMessages;
import cc.carm.plugin.ultradepository.configuration.depository.Depository; import cc.carm.plugin.ultradepository.configuration.depository.Depository;
import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem; import cc.carm.plugin.ultradepository.configuration.depository.DepositoryItem;
import cc.carm.plugin.ultradepository.data.DepositoryItemData; import cc.carm.plugin.ultradepository.data.DepositoryItemData;
import cc.carm.plugin.ultradepository.data.UserData; import cc.carm.plugin.ultradepository.data.UserData;
import cc.carm.plugin.ultradepository.util.ItemStackFactory;
import cc.carm.plugin.ultradepository.util.gui.GUI;
import cc.carm.plugin.ultradepository.util.gui.GUIItem;
import cc.carm.plugin.ultradepository.util.gui.GUIType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.ClickType;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -51,7 +52,7 @@ public class SellItemGUI extends GUI {
this.currentAmount = Math.max(1, amount); // 不可小于1 this.currentAmount = Math.max(1, amount); // 不可小于1
ItemStackFactory factory = new ItemStackFactory(this.itemDisplay); ItemStackFactory factory = new ItemStackFactory(this.itemDisplay);
List<String> additionalLore = PluginConfig.General.ADDITIONAL_LORE.get(player, new Object[]{ List<String> additionalLore = PluginConfig.General.ADDITIONAL_LORE.get(player, new Object[]{
getItemName(), getRemainAmount(), getItemPrice(), getItemName(), getReUltraDepositoryAmount(), getItemPrice(),
getSoldAmount(), (getSellLimit() - getSoldAmount()), getSellLimit() getSoldAmount(), (getSellLimit() - getSoldAmount()), getSellLimit()
}); });
additionalLore.forEach(factory::addLore); additionalLore.forEach(factory::addLore);
@@ -122,8 +123,8 @@ public class SellItemGUI extends GUI {
return new GUIItem(factory.toItemStack()) { return new GUIItem(factory.toItemStack()) {
@Override @Override
public void onClick(ClickType type) { public void onClick(ClickType type) {
int amount = Math.min(getCurrentAmount(), Math.min(getRemainAmount(), getSellLimit() - getSoldAmount())); int amount = Math.min(getCurrentAmount(), Math.min(getReUltraDepositoryAmount(), getSellLimit() - getSoldAmount()));
if (amount > 0) Main.getEconomyManager().sellItem(player, userData, itemData, amount); if (amount > 0) UltraDepository.getEconomyManager().sellItem(player, userData, item, amount);
player.closeInventory(); player.closeInventory();
} }
}; };
@@ -163,7 +164,7 @@ public class SellItemGUI extends GUI {
return getCurrentAmount() * getItemPrice(); return getCurrentAmount() * getItemPrice();
} }
private int getRemainAmount() { private int getReUltraDepositoryAmount() {
return userData.getItemData(this.item).getAmount(); return userData.getItemData(this.item).getAmount();
} }
@@ -172,12 +173,17 @@ public class SellItemGUI extends GUI {
} }
private int getAddableAmount() { private int getAddableAmount() {
return Math.min(getRemainAmount(), getSellLimit() - getSoldAmount()) - getCurrentAmount(); return Math.min(getReUltraDepositoryAmount(), getSellLimit() - getSoldAmount()) - getCurrentAmount();
} }
public static void open(Player player, UserData userData, DepositoryItemData itemData, public static void open(Player player, UserData userData, DepositoryItemData itemData,
Depository configuration, DepositoryItem item) { Depository configuration, DepositoryItem item) {
if (!Main.getEconomyManager().isInitialized()) return; player.closeInventory();
if (!UltraDepository.getEconomyManager().isInitialized()) {
PluginMessages.NO_ECONOMY.send(player);
return;
}
SellItemGUI gui = new SellItemGUI(player, userData, itemData, configuration, item); SellItemGUI gui = new SellItemGUI(player, userData, itemData, configuration, item);
gui.openGUI(player); gui.openGUI(player);
} }
@@ -1,33 +0,0 @@
package cc.carm.plugin.ultradepository.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ColorParser {
public static String parse(String text) {
text = parseHexColor(text);
return parseColor(text);
}
public static String parseColor(final String text) {
return text.replaceAll("&", "§").replace("§§", "&");
}
public static String parseHexColor(String text) {
Pattern pattern = Pattern.compile("&\\((&?#[0-9a-fA-F]{6})\\)");
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
String hexColor = text.substring(matcher.start() + 2, matcher.end() - 1);
hexColor = hexColor.replace("&", "");
StringBuilder bukkitColorCode = new StringBuilder('§' + "x");
for (int i = 1; i < hexColor.length(); i++) {
bukkitColorCode.append('§').append(hexColor.charAt(i));
}
text = text.replaceAll("&\\(" + hexColor + "\\)", bukkitColorCode.toString().toLowerCase());
matcher.reset(text);
}
return text;
}
}
@@ -4,7 +4,7 @@ import java.sql.Date;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
public class DateUtil { public class DateIntUtil {
private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyyMMdd"); private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyyMMdd");
@@ -1,139 +0,0 @@
package cc.carm.plugin.ultradepository.util;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class ItemStackFactory {
ItemStack item;
private ItemStackFactory() {
}
public ItemStackFactory(ItemStack is) {
this.item = is.clone();
}
public ItemStackFactory(Material type) {
this(type, 1);
}
public ItemStackFactory(Material type, int amount) {
this(type, amount, (short) 0);
}
public ItemStackFactory(Material type, int amount, short data) {
this.item = new ItemStack(type, amount, data);
}
public ItemStackFactory(Material type, int amount, int data) {
this(type, amount, (short) data);
}
public ItemStack toItemStack() {
return this.item;
}
public ItemStackFactory setType(Material type) {
this.item.setType(type);
return this;
}
public ItemStackFactory setDurability(int i) {
this.item.setDurability((short) i);
return this;
}
public ItemStackFactory setAmount(int a) {
this.item.setAmount(a);
return this;
}
public ItemStackFactory setDisplayName(@NotNull String name) {
ItemMeta im = this.item.getItemMeta();
if (im != null) {
im.setDisplayName(ColorParser.parse(name));
this.item.setItemMeta(im);
}
return this;
}
public ItemStackFactory setLore(@NotNull List<String> loreList) {
ItemMeta im = this.item.getItemMeta();
if (im != null) {
im.setLore(
loreList.stream()
.map(ColorParser::parse)
.collect(Collectors.toList())
);
this.item.setItemMeta(im);
}
return this;
}
public ItemStackFactory addLore(@NotNull String s) {
ItemMeta im = this.item.getItemMeta();
if (im != null) {
List<String> lore = im.getLore() != null ? im.getLore() : new ArrayList<>();
lore.add(ColorParser.parse(s));
im.setLore(lore);
this.item.setItemMeta(im);
}
return this;
}
public ItemStackFactory addEnchant(@NotNull Enchantment enchant, int level, boolean ignoreLevelRestriction) {
ItemMeta im = this.item.getItemMeta();
if (im != null) {
im.addEnchant(enchant, level, ignoreLevelRestriction);
this.item.setItemMeta(im);
}
return this;
}
public ItemStackFactory removeEnchant(@NotNull Enchantment enchant) {
ItemMeta im = this.item.getItemMeta();
if (im != null) {
im.removeEnchant(enchant);
this.item.setItemMeta(im);
}
return this;
}
public ItemStackFactory addFlag(@NotNull ItemFlag flag) {
ItemMeta im = this.item.getItemMeta();
if (im != null) {
im.addItemFlags(flag);
this.item.setItemMeta(im);
}
return this;
}
public ItemStackFactory removeFlag(@NotNull ItemFlag flag) {
ItemMeta im = this.item.getItemMeta();
if (im != null) {
im.removeItemFlags(flag);
this.item.setItemMeta(im);
}
return this;
}
public ItemStackFactory setUnbreakable(boolean unbreakable) {
ItemMeta im = this.item.getItemMeta();
if (im != null) {
im.setUnbreakable(unbreakable);
this.item.setItemMeta(im);
}
return this;
}
}
@@ -1,85 +0,0 @@
package cc.carm.plugin.ultradepository.util;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable;
import java.util.*;
public class MessageUtil {
public static boolean hasPlaceholderAPI() {
return Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null;
}
public static void send(@Nullable CommandSender sender, List<String> messages) {
if (messages == null || messages.isEmpty() || sender == null) return;
for (String s : messages) {
sender.sendMessage(ColorParser.parse(s));
}
}
public static void send(@Nullable CommandSender sender, String... messages) {
send(sender, Arrays.asList(messages));
}
public static void sendWithPlaceholders(CommandSender sender, String... messages) {
sendWithPlaceholders(sender, Arrays.asList(messages));
}
public static void sendWithPlaceholders(@Nullable CommandSender sender, List<String> messages) {
if (messages == null || messages.isEmpty() || sender == null) return;
send(sender, setPlaceholders(sender, messages));
}
public static void sendWithPlaceholders(@Nullable CommandSender sender, List<String> messages, String param, Object value) {
sendWithPlaceholders(sender, messages, new String[]{param}, new Object[]{value});
}
public static void sendWithPlaceholders(@Nullable CommandSender sender, List<String> messages, String[] params, Object[] 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> setPlaceholders(@Nullable CommandSender sender, List<String> messages, String[] params, Object[] values) {
return setPlaceholders(sender, setCustomParams(messages, params, values));
}
public static List<String> setCustomParams(List<String> messages, String param, Object value) {
return setCustomParams(messages, new String[]{param}, new Object[]{value});
}
public static List<String> setCustomParams(List<String> messages, String[] params, Object[] values) {
if (params.length != values.length) return messages;
HashMap<String, Object> paramsMap = new HashMap<>();
for (int i = 0; i < params.length; i++) {
paramsMap.put(params[i], values[i]);
}
return setCustomParams(messages, paramsMap);
}
public static List<String> setCustomParams(List<String> messages, HashMap<String, Object> params) {
List<String> list = new ArrayList<>();
for (String message : messages) {
String afterMessage = message;
for (Map.Entry<String, Object> entry : params.entrySet()) {
afterMessage = afterMessage.replace(entry.getKey(), entry.getValue().toString());
}
list.add(afterMessage);
}
return list;
}
}
@@ -1,351 +0,0 @@
package cc.carm.plugin.ultradepository.util;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.Callable;
public class SchedulerUtils {
private final JavaPlugin plugin;
public SchedulerUtils(JavaPlugin plugin) {
this.plugin = plugin;
}
private JavaPlugin getPlugin() {
return plugin;
}
/**
* 在主线程延时执行一个任务。
*
* @param delay 延迟的ticks
* @param runnable 需要执行的任务
*/
public void runLater(long delay, Runnable runnable) {
Bukkit.getScheduler().runTaskLater(getPlugin(), runnable, delay);
}
/**
* 异步延时执行一个任务。
*
* @param delay 延迟的ticks
* @param runnable 需要执行的任务
*/
public void runLaterAsync(long delay, Runnable runnable) {
Bukkit.getScheduler().runTaskLaterAsynchronously(getPlugin(), runnable, delay);
}
/**
* 异步执行一个任务。
*
* @param runnable 需要执行的任务
*/
public void runAsync(Runnable runnable) {
Bukkit.getScheduler().runTaskAsynchronously(getPlugin(), runnable);
}
/**
* 在服务端主线程中执行一个任务
*
* @param runnable 需要执行的任务
*/
public void run(Runnable runnable) {
Bukkit.getScheduler().runTask(getPlugin(), runnable);
}
/**
* 间隔一段时间按顺序异步执行列表中的任务
*
* @param interval 间隔时间
* @param tasks 任务列表
*/
public void runAtIntervalAsync(long interval, Runnable... tasks) {
runAtIntervalAsync(0L, interval, tasks);
}
/**
* 间隔一段时间按顺序执行列表中的任务
*
* @param interval 间隔时间
* @param tasks 任务列表
*/
public void runAtInterval(long interval, Runnable... tasks) {
runAtInterval(0L, interval, tasks);
}
/**
* 间隔一段时间按顺序异步执行列表中的任务
*
* @param delay 延迟时间
* @param interval 间隔时间
* @param tasks 任务列表
*/
public void runAtIntervalAsync(long delay, long interval, Runnable... tasks) {
new BukkitRunnable() {
private int index;
@Override
public void run() {
if (this.index >= tasks.length) {
this.cancel();
return;
}
tasks[index].run();
index++;
}
}.runTaskTimerAsynchronously(getPlugin(), delay, interval);
}
/**
* 间隔一段时间按顺序执行列表中的任务
*
* @param delay 延迟时间
* @param interval 间隔时间
* @param tasks 任务列表
*/
public void runAtInterval(long delay, long interval, Runnable... tasks) {
new BukkitRunnable() {
private int index;
@Override
public void run() {
if (this.index >= tasks.length) {
this.cancel();
return;
}
tasks[index].run();
index++;
}
}.runTaskTimer(getPlugin(), delay, interval);
}
/**
* 重复执行一个任务。
*
* @param repetitions 重复次数
* @param interval 间隔时间
* @param task 任务
* @param onComplete 结束时执行的任务
*/
public void repeat(int repetitions, long interval, Runnable task, Runnable onComplete) {
new BukkitRunnable() {
private int index;
@Override
public void run() {
index++;
if (this.index >= repetitions) {
this.cancel();
if (onComplete == null) {
return;
}
onComplete.run();
return;
}
task.run();
}
}.runTaskTimer(getPlugin(), 0L, interval);
}
/**
* 重复执行一个任务。
*
* @param repetitions 重复次数
* @param interval 间隔时间
* @param task 任务
* @param onComplete 结束时执行的任务
*/
public void repeatAsync(int repetitions, long interval, Runnable task, Runnable onComplete) {
new BukkitRunnable() {
private int index;
@Override
public void run() {
index++;
if (this.index >= repetitions) {
this.cancel();
if (onComplete == null) {
return;
}
onComplete.run();
return;
}
task.run();
}
}.runTaskTimerAsynchronously(getPlugin(), 0L, interval);
}
/**
* 在满足某个条件时,重复执行一个任务。
*
* @param interval 重复间隔时间
* @param predicate 条件
* @param task 任务
* @param onComplete 结束时执行的任务
*/
public void repeatWhile(long interval, Callable<Boolean> predicate, Runnable task, Runnable onComplete) {
new BukkitRunnable() {
@Override
public void run() {
try {
if (!predicate.call()) {
this.cancel();
if (onComplete == null) {
return;
}
onComplete.run();
return;
}
task.run();
} catch (Exception e) {
e.printStackTrace();
}
}
}.runTaskTimer(getPlugin(), 0L, interval);
}
/**
* 在满足某个条件时,重复执行一个任务。
*
* @param interval 重复间隔时间
* @param predicate 条件
* @param task 任务
* @param onComplete 结束时执行的任务
*/
public void repeatWhileAsync(long interval, Callable<Boolean> predicate, Runnable task, Runnable onComplete) {
new BukkitRunnable() {
@Override
public void run() {
try {
if (!predicate.call()) {
this.cancel();
if (onComplete == null) {
return;
}
onComplete.run();
return;
}
task.run();
} catch (Exception e) {
e.printStackTrace();
}
}
}.runTaskTimerAsynchronously(getPlugin(), 0L, interval);
}
public interface Task {
void start(Runnable onComplete);
}
public class TaskBuilder {
private Queue<Task> taskList;
public TaskBuilder() {
this.taskList = new LinkedList<>();
}
public TaskBuilder append(TaskBuilder builder) {
this.taskList.addAll(builder.taskList);
return this;
}
public TaskBuilder appendDelay(long delay) {
this.taskList.add(onComplete -> SchedulerUtils.this.runLater(delay, onComplete));
return this;
}
public TaskBuilder appendTask(Runnable task) {
this.taskList.add(onComplete ->
{
task.run();
onComplete.run();
});
return this;
}
public TaskBuilder appendTask(Task task) {
this.taskList.add(task);
return this;
}
public TaskBuilder appendDelayedTask(long delay, Runnable task) {
this.taskList.add(onComplete -> SchedulerUtils.this.runLater(delay, () ->
{
task.run();
onComplete.run();
}));
return this;
}
public TaskBuilder appendTasks(long delay, long interval, Runnable... tasks) {
this.taskList.add(onComplete ->
{
Runnable[] runnables = Arrays.copyOf(tasks, tasks.length + 1);
runnables[runnables.length - 1] = onComplete;
SchedulerUtils.this.runAtInterval(delay, interval, runnables);
});
return this;
}
public TaskBuilder appendRepeatingTask(int repetitions, long interval, Runnable task) {
this.taskList.add(onComplete -> SchedulerUtils.this.repeat(repetitions, interval, task, onComplete));
return this;
}
public TaskBuilder appendConditionalRepeatingTask(long interval, Callable<Boolean> predicate, Runnable task) {
this.taskList.add(onComplete -> SchedulerUtils.this.repeatWhile(interval, predicate, task, onComplete));
return this;
}
public TaskBuilder waitFor(Callable<Boolean> predicate) {
this.taskList.add(onComplete -> new BukkitRunnable() {
@Override
public void run() {
try {
if (!predicate.call()) {
return;
}
this.cancel();
onComplete.run();
} catch (Exception e) {
e.printStackTrace();
}
}
}.runTaskTimer(getPlugin(), 0L, 1L));
return this;
}
public void runTasks() {
this.startNext();
}
private void startNext() {
Task task = this.taskList.poll();
if (task == null) {
return;
}
task.start(this::startNext);
}
}
}
@@ -1,222 +0,0 @@
package cc.carm.plugin.ultradepository.util.gui;
import cc.carm.plugin.ultradepository.Main;
import cc.carm.plugin.ultradepository.util.ColorParser;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.IntStream;
public class GUI {
private static final HashMap<Player, GUI> openedGUIs = new HashMap<>();
GUIType type;
String name;
public GUIItem[] items;
public Inventory inv;
boolean cancelOnTarget = true;
boolean cancelOnSelf = true;
boolean cancelOnOuter = true;
Map<String, Object> flags;
public GUIListener listener;
public GUI(GUIType type, String name) {
this.type = type;
this.name = ColorParser.parse(name);
switch (type) {
case ONE_BY_NINE:
this.items = new GUIItem[9];
break;
case TWO_BY_NINE:
this.items = new GUIItem[18];
break;
case THREE_BY_NINE:
this.items = new GUIItem[27];
break;
case FOUR_BY_NINE:
this.items = new GUIItem[36];
break;
case FIVE_BY_NINE:
this.items = new GUIItem[45];
break;
case SIX_BY_NINE:
this.items = new GUIItem[54];
break;
case CANCEL:
default:
this.items = null;
}
}
public final void setItem(int index, GUIItem item) {
if (item == null) {
this.items[index] = new GUIItem(new ItemStack(Material.AIR));
} else {
this.items[index] = item;
}
}
/**
* 批量添加GUI Item
*
* @param item 物品
* @param index 对应格
*/
public void setItem(GUIItem item, int... index) {
Arrays.stream(index).forEach(i -> setItem(i, item));
}
public void setItem(GUIItem item, int start, int end) {
IntStream.rangeClosed(start, end).forEach(i -> setItem(i, item));
}
public GUIItem getItem(int index) {
return this.items[index];
}
/**
* 更新玩家箱子的视图
*/
public void updateView() {
if (this.inv != null) {
List<HumanEntity> viewers = this.inv.getViewers();
IntStream.range(0, this.items.length).forEach(index -> {
GUIItem item = items[index];
if (item == null) {
inv.setItem(index, new ItemStack(Material.AIR));
} else {
inv.setItem(index, items[index].display);
}
});
for (HumanEntity p : viewers) {
((Player) p).updateInventory();
}
}
}
/**
* 设置是否取消点击GUI内物品的事件
* 如果不取消,玩家可以从GUI中拿取物品。
*
* @param b 是否取消
*/
public void setCancelledIfClickOnTarget(boolean b) {
this.cancelOnTarget = b;
}
/**
* 设置是否取消点击自己背包内物品的事件
* 如果不取消,玩家可以从自己的背包中拿取物品。
*
* @param b 是否取消
*/
public void setCancelledIfClickOnSelf(boolean b) {
this.cancelOnSelf = b;
}
/**
* 设置是否取消点击GUI外的事件
* 如果不取消,玩家可以把物品从GUI或背包中丢出去
*
* @param b 是否取消
*/
public void setCancelledIfClickOnOuter(boolean b) {
this.cancelOnOuter = b;
}
public void addFlag(String flag, Object obj) {
if (this.flags == null) this.flags = new HashMap<>();
this.flags.put(flag, obj);
}
public Object getFlag(String flag) {
if (this.flags == null) return null;
else
return this.flags.get(flag);
}
public void setFlag(String flag, Object obj) {
if (this.flags == null) this.flags = new HashMap<>();
this.flags.replace(flag, obj);
}
public void removeFlag(String flag) {
if (this.flags == null) this.flags = new HashMap<>();
this.flags.remove(flag);
}
public void rawClickListener(InventoryClickEvent event) {
}
public void openGUI(Player player) {
Inventory inv;
if (this.type == GUIType.CANCEL) {
throw new NullPointerException("被取消或不存在的GUI");
}
inv = Bukkit.createInventory(null, this.items.length, this.name);
for (int index = 0; index < this.items.length; index++) {
if (items[index] == null) {
inv.setItem(index, new ItemStack(Material.AIR));
} else {
inv.setItem(index, items[index].display);
}
}
setOpenedGUI(player, this);
this.inv = inv;
player.openInventory(inv);
if (listener == null) {
Main.regListener(listener = new GUIListener(this, player));
}
}
/**
* 拖动GUI内物品时执行的代码
*
* @param event InventoryDragEvent
*/
public void onDrag(InventoryDragEvent event) {
}
/**
* 关闭GUI时执行的代码
*/
public void onClose() {
}
public static void setOpenedGUI(Player player, GUI gui) {
openedGUIs.put(player, gui);
}
public static boolean hasOpenedGUI(Player player) {
return openedGUIs.containsKey(player);
}
public static GUI getOpenedGUI(Player player) {
return openedGUIs.get(player);
}
public static void removeOpenedGUI(Player player) {
openedGUIs.remove(player);
}
}
@@ -1,77 +0,0 @@
package cc.carm.plugin.ultradepository.util.gui;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack;
import java.util.HashSet;
import java.util.Set;
public class GUIItem {
ItemStack display;
boolean actionActive = true;
public Set<GUIClickAction> actions = new HashSet<>();
public Set<GUIClickAction> actionsIgnoreActive = new HashSet<>();
public GUIItem(ItemStack display) {
this.display = display;
}
public final ItemStack getDisplay() {
return this.display;
}
public final void setDisplay(ItemStack display) {
this.display = display;
}
public final boolean isActionActive() {
return this.actionActive;
}
public final void setActionActive(boolean b) {
actionActive = b;
}
/**
* 玩家点击GUI后执行的代码
*
* @param type 点击的类型
*/
public void onClick(ClickType type) {
}
public void addClickAction(GUIClickAction action) {
actions.add(action);
}
public void addActionIgnoreActive(GUIClickAction action) {
actionsIgnoreActive.add(action);
}
public void rawClickAction(InventoryClickEvent event) {
}
public void realRawClickAction(InventoryClickEvent event) {
}
/**
* 玩家点击GUI后执行的代码
*
* @param player 点击GUI的玩家
*/
public void customAction(Player player) {
}
public abstract static class GUIClickAction {
public abstract void run(ClickType type, Player player);
}
}
@@ -1,109 +0,0 @@
package cc.carm.plugin.ultradepository.util.gui;
import cc.carm.plugin.ultradepository.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;
import org.bukkit.event.inventory.InventoryOpenEvent;
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);
}
}
@EventHandler
public void onOpen(InventoryOpenEvent event) {
Player p = (Player) event.getPlayer();
//开启新界面后 结束旧界面
if (!event.getInventory().equals(getCurrentGUI().inv)) {
HandlerList.unregisterAll(this);
getCurrentGUI().listener = null;
getCurrentGUI().onClose();
GUI.removeOpenedGUI(p);
}
}
}
@@ -1,13 +0,0 @@
package cc.carm.plugin.ultradepository.util.gui;
public enum GUIType {
ONE_BY_NINE,
TWO_BY_NINE,
THREE_BY_NINE,
FOUR_BY_NINE,
FIVE_BY_NINE,
SIX_BY_NINE,
CANCEL
}
+8 -3
View File
@@ -6,14 +6,19 @@ version: ${project.version}
debug: false debug: false
# 统计数据设定
# 改选项用于帮助开发者统计插件版本与使用情况,且绝不会影响性能与使用体验。
# 当然,您也可以选择在这里关闭,或在plugins/bStats下的配置文件中关闭。
metrics: true
# 存储相关配置 # 存储相关配置
# 注意:存储配置不会通过重载指令生效,如有修改请重新启动服务器。 # 注意:存储配置不会通过重载指令生效,如有修改请重新启动服务器。
storage: storage:
# 存储方式,可选 [ file | mysql ] # 存储方式,可选 [ yaml | json | mysql(推荐) ]
method: mysql method: yaml
# 选择 file 存储方式时的存储路径 # 选择 yaml/json 存储方式时的存储路径
# 默认为相对路径,相对于插件生成的配置文件夹下的路径 # 默认为相对路径,相对于插件生成的配置文件夹下的路径
# 支持绝对路径,如 “/var/data/ub/"(linux) 或 "D:\data\ub\"(windows) # 支持绝对路径,如 “/var/data/ub/"(linux) 或 "D:\data\ub\"(windows)
# 使用绝对路径时请注意权限问题 # 使用绝对路径时请注意权限问题
+6 -3
View File
@@ -1,11 +1,15 @@
main: cc.carm.plugin.ultradepository.Main main: cc.carm.plugin.ultradepository.UltraDepository
name: UltraDepository name: UltraDepository
version: ${project.version} version: ${project.version}
description: ${project.description} description: ${project.description}
website: ${project.url} website: ${project.url}
author: CarmJos authors:
- CarmJos
- Zimrs
api-version: 1.13
softdepend: softdepend:
- PlaceholderAPI - PlaceholderAPI
@@ -32,7 +36,6 @@ permissions:
"UltraDepository.auto.enable": "UltraDepository.auto.enable":
description: "用于判断是否启用了自动收集功能" description: "用于判断是否启用了自动收集功能"
default: op
"UltraDepository.admin": "UltraDepository.admin":
description: "超级仓库的管理权限" description: "超级仓库的管理权限"
-51
View File
@@ -1,51 +0,0 @@
import cc.carm.plugin.ultradepository.configuration.gui.GUIActionType;
import cc.carm.plugin.ultradepository.configuration.gui.GUIConfiguration;
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;
if (prefix.contains(":")) {
String[] args = prefix.split(":");
clickType = GUIConfiguration.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());
}
}
}
+94
View File
@@ -0,0 +1,94 @@
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import java.lang.reflect.Method;
import java.util.*;
public class GsonMapTest {
private static final Gson GSON = new Gson();
@org.junit.Test
public void test() {
System.out.println(this.getClass().getSimpleName());
List<Test> tests = new ArrayList<>();
tests.add(new Test1());
tests.add(new Test2());
tests.add(new Test3());
tests.stream().map(test -> test.getClass().getSimpleName() + " : " + test.isOverride("load")).forEach(System.out::println);
Map<String, Map<String, Map<String, Integer>>> values = new LinkedHashMap<>();
for (int u = 0; u < 3; u++) {
Map<String, Map<String, Integer>> depositoryDataMap = new LinkedHashMap<>();
for (int i = 0; i < 5; i++) {
Map<String, Integer> itemDataMap = new HashMap<>();
int amount = Math.max(0, new Random().nextInt(15));
int sold = Math.max(0, new Random().nextInt(15));
if (amount > 0) itemDataMap.put("amount", amount);
if (sold > 0) itemDataMap.put("sold", sold);
if (!itemDataMap.isEmpty()) {
depositoryDataMap.put(UUID.randomUUID().toString().substring(0, 4), itemDataMap);
}
}
if (!depositoryDataMap.isEmpty()) {
values.put(UUID.randomUUID().toString().substring(0, 8), depositoryDataMap);
}
}
System.out.println(values.size());
String jsonValues = GSON.toJson(values);
System.out.println(jsonValues);
JsonObject dataObject = new JsonObject();
dataObject.addProperty("date", 20201011);
dataObject.add("depositories", GSON.toJsonTree(values));
System.out.println(GSON.toJson(dataObject));
}
public interface Test {
void load();
default boolean isOverride(String methodName) {
Map<Method, Method> methodMap = new HashMap<>();
Arrays.stream(Test.class.getDeclaredMethods())
.filter(method -> method.getName().equals(methodName))
.forEach(method -> Arrays.stream(getClass().getDeclaredMethods())
.filter(extend -> extend.getName().equals(methodName))
.filter(extend -> extend.getReturnType().equals(method.getReturnType()))
.filter(extend -> extend.getParameterTypes().length == method.getParameterTypes().length)
.findFirst().ifPresent(extendMethod -> methodMap.put(method, extendMethod))
);
return !methodMap.isEmpty();
}
}
public static class Test1 implements Test {
@Override
public void load() {
System.out.println("test1");
}
}
public static class Test2 extends Test1 {
}
public static class Test3 extends Test2 {
@Override
public void load() {
}
}
}