1
mirror of https://github.com/CarmJos/UltraDepository.git synced 2026-06-05 00:58:22 +08:00

Compare commits

..

75 Commits

Author SHA1 Message Date
renovate[bot] 84e1be3975 chore(deps): update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.5.5 2026-03-10 08:05:26 +08:00
renovate[bot] 114d029579 fix(deps): update dependency org.bstats:bstats-bukkit to v3.2.1 2026-03-10 08:05:17 +08:00
renovate[bot] 7b49e56b69 chore(deps): update actions/upload-artifact action to v7 2026-03-10 08:05:09 +08:00
renovate[bot] 4334e13d63 chore(deps): update dependency org.apache.maven.plugins:maven-shade-plugin to v3.6.2 2026-03-10 08:05:02 +08:00
renovate[bot] f6187340fd chore(deps): update actions/upload-artifact action to v6 2026-02-21 00:56:48 +08:00
renovate[bot] 9507ddd09a chore(deps): update dependency org.apache.maven.plugins:maven-compiler-plugin to v3.15.0 2026-02-21 00:56:42 +08:00
renovate[bot] b76074873c fix(deps): update dependency me.clip:placeholderapi to v2.12.2 2026-02-21 00:56:36 +08:00
renovate[bot] 833ebdd675 chore(deps): update actions/upload-artifact action to v5 2025-12-01 09:31:56 +08:00
renovate[bot] c490f32e26 fix(deps): update dependency me.clip:placeholderapi to v2.11.7 2025-12-01 09:31:50 +08:00
renovate[bot] 3fae967c2c fix(deps): update dependency org.spigotmc:spigot-api to v1.19-r0.1-20220725.090125-47 2025-12-01 09:31:44 +08:00
renovate[bot] cc60dca3f3 chore(deps): update dependency org.apache.maven.plugins:maven-jar-plugin to v3.5.0 2025-12-01 09:31:38 +08:00
renovate[bot] d925bf55eb chore(deps): update actions/checkout action to v6 2025-12-01 09:31:31 +08:00
renovate[bot] cc6a092fbf chore(deps): update dependency org.apache.maven.plugins:maven-source-plugin to v3.4.0 2025-12-01 09:31:25 +08:00
renovate[bot] 2127ff6421 chore(deps): update github/codeql-action action to v4 2025-10-23 10:36:39 +08:00
renovate[bot] a9d1699233 chore(deps): update dependency org.apache.maven.plugins:maven-javadoc-plugin to v3.12.0 2025-09-24 09:19:14 +08:00
renovate[bot] 61f0bd1afa chore(deps): update dependency org.apache.maven.plugins:maven-compiler-plugin to v3.14.1 2025-09-24 09:19:08 +08:00
carm d4817d6438 feat: Update renovate.json 2025-09-14 16:59:28 +08:00
renovate[bot] 6be058153b Update dependency org.apache.maven.plugins:maven-shade-plugin to v3.6.1 2025-09-14 16:56:35 +08:00
renovate[bot] 66b9160a01 Update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.5.4 2025-09-14 16:56:29 +08:00
renovate[bot] e5b501b92d Update actions/checkout action to v5 2025-08-21 23:32:18 +08:00
renovate[bot] aa253b0ffd Update dependency org.apache.maven.plugins:maven-javadoc-plugin to v3.11.3 2025-08-21 23:32:11 +08:00
renovate[bot] 2e2b0772fc Update actions/setup-java action to v5 2025-08-21 23:32:04 +08:00
renovate[bot] da86663667 Update dependency cc.carm.lib:easyplugin-bom to v1.5.14 2025-06-25 06:13:15 +08:00
renovate[bot] 1777bfd8cb Update dependency cc.carm.lib:easyplugin-bom to v1.5.13 2025-06-02 15:04:49 +08:00
renovate[bot] 5ed483088d Update dependency org.apache.maven.plugins:maven-surefire-plugin to v3.5.3 2025-06-02 14:51:54 +08:00
renovate[bot] 849fc6a1c4 Update dependency org.apache.maven.plugins:maven-compiler-plugin to v3.14.0 2025-03-12 04:56:23 +08:00
renovate[bot] b867b2d761 Update dependency org.apache.maven.plugins:maven-javadoc-plugin to v3.11.2 2025-01-23 22:39:26 +08:00
renovate[bot] be8b9fde82 Update dependency org.apache.maven.plugins:maven-shade-plugin to v3.6.0 2025-01-23 22:39:17 +08:00
renovate[bot] 252c91bf94 Update dependency org.apache.maven.plugins:maven-source-plugin to v3.3.1 2025-01-23 22:39:08 +08:00
renovate[bot] ab744b6eb9 Update dependency org.bstats:bstats-bukkit to v3.1.0 2025-01-23 22:38:57 +08:00
renovate[bot] bb2577aed3 Update actions/checkout action to v4 2025-01-23 22:38:48 +08:00
renovate[bot] d0d188b399 Update actions/setup-java action to v4 2025-01-23 22:38:39 +08:00
renovate[bot] 443f04c55c Update actions/upload-artifact action to v4 2025-01-23 22:38:30 +08:00
renovate[bot] dcd0e114dd Update dependency org.apache.maven.plugins:maven-surefire-plugin to v3 2025-01-23 22:38:21 +08:00
renovate[bot] f019019c48 Update github/codeql-action action to v3 2025-01-23 22:38:12 +08:00
renovate[bot] 1fc6e47c46 Update dependency org.apache.maven.plugins:maven-compiler-plugin to v3.13.0 2025-01-23 03:47:32 +08:00
renovate[bot] f5d74e0bca Update dependency org.apache.maven.plugins:maven-jar-plugin to v3.4.2 2025-01-23 03:47:27 +08:00
renovate[bot] f8a3a35790 Update dependency cc.carm.lib:easysql-beecp to v0.4.7 2025-01-21 03:27:04 +08:00
renovate[bot] 93c5fc09fb Update dependency me.clip:placeholderapi to v2.11.6 2025-01-21 03:26:56 +08:00
renovate[bot] ee76419d6d Update dependency org.apache.maven.plugins:maven-surefire-plugin to v2.22.2 2025-01-18 05:55:10 +08:00
renovate[bot] 0e4568d646 Update dependency cc.carm.lib:easyplugin-bom to v1.5.12 2025-01-18 05:55:07 +08:00
renovate[bot] 62a76ef7b1 Update dependency cc.carm.lib:githubreleases4j to v1.3.2 2025-01-18 03:45:27 +08:00
renovate[bot] e6c4a77a18 Update dependency com.github.MilkBowl:VaultAPI to v1.7.1 2025-01-18 03:45:23 +08:00
renovate[bot] a6d70a7e22 Add renovate.json 2025-01-18 03:41:39 +08:00
carm e192a896b7 修改构件上传的方式 2022-03-14 12:00:16 +08:00
carm c3fc92abdb [1.3.9] 版本优化
- [R] 采用 Libraries 形式加载插件的部分依赖库,减小插件体积。
- [R] 修改插件入口类,独立API接口类。
2022-03-04 16:55:42 +08:00
carm 5a24db537a 补全插件大标题 2022-03-04 16:48:57 +08:00
carm c6c6b3bc37 更换插件的加载入口 2022-03-04 16:45:08 +08:00
carm 717e313f25 更换成插件入口名 2022-03-04 16:40:58 +08:00
carm 375f4d178a 更换打包配置 2022-03-04 16:33:21 +08:00
carm e35f5ef87e 更换打包配置 2022-03-04 16:31:27 +08:00
carm ccbb5782a6 更换打包配置 2022-03-04 16:25:53 +08:00
carm 8fdd83493b 采用 libraries 形式处理依赖 2022-03-04 16:20:17 +08:00
carm a8dcc99a72 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	pom.xml
2022-03-04 16:19:19 +08:00
carm 5b2eca9ac8 采用 libraries 形式处理依赖 2022-03-04 16:18:23 +08:00
carm 8a5dba9274 修改GithubReleases4J版本 2022-02-07 03:17:28 +08:00
carm 9bd02d1298 修改CI名 2022-02-06 23:57:32 +08:00
carm 7f9ba1c269 修改默认配置 2022-02-06 01:10:28 +08:00
carm 8c44791894 升级依赖版本 2022-02-06 01:10:16 +08:00
carm d52e001e7c [v1.3.8] 修复更新提示类型错误的问题 2022-01-24 01:24:18 +08:00
carm e5efd0d1b2 [v1.3.7] 修复更新提示类型错误的问题 2022-01-24 01:19:53 +08:00
carm 0fcbd1d8f1 [v1.3.6] 修改更新介绍 2022-01-24 01:19:26 +08:00
carm 8f500e3ff0 [v1.3.6] 修改更新介绍 2022-01-23 11:16:54 +08:00
carm baeee39d07 [v1.3.6] 修改更新介绍 2022-01-23 11:16:44 +08:00
carm af82d64ab1 [v1.3.5] 更新GithubReleases4J版本 2022-01-22 15:27:44 +08:00
carm 5d057d2e8e [v1.3.5] 更新GithubReleases4J版本 2022-01-22 14:47:58 +08:00
carm a427db36e9 [v1.3.4] 版本更新
- [A] 添加版本更新检查。
2022-01-22 06:07:33 +08:00
carm afd62a493d [v1.3.3] 版本更新
- [A] 支持通过 PlugMan 等插件进行热重载。
2022-01-21 23:19:09 +08:00
carm c841a7b1b3 [v1.3.2] 版本更新
- [F] 修复Javadoc错误
2022-01-21 13:13:43 +08:00
carm dc57e822b5 [v1.3.1] 版本更新
- [F] 修复Javadoc错误
2022-01-21 13:09:45 +08:00
carm 54cc9c070b [v1.3.1] 版本更新
- [U] 修改预测仓库配置文件的位置,使其在初次启动时自动生成,避免用户完全不知道还有预设仓库这回事。
2022-01-21 13:03:43 +08:00
carm fa07564548 [v1.3.0] [A] 添加Java注释,修改debug消息位置。 2022-01-17 13:54:32 +08:00
carm 7138d20357 [v1.2.6] [R] 整合构建、部署(Javadoc)与版本发布。 2022-01-16 08:08:17 +08:00
carm 379068b440 [v1.2.5] 版本更新
- [A] 针对物品能否出售的状态提供额外的配置。
- [A] 添加ActionBar提示(如需关掉仅需将消息设为"")
- [A] 添加取回物品到背包的声音。
- [F] 修复SellGUI数量重调回0后(虽然不可能发生)物品仍然显示的问题
- [F] 修复SellGUI中可能存在的精度显示异常的问题。
2022-01-14 19:09:49 +08:00
carm 23e900cf3f 添加发布地址 2022-01-14 14:57:28 +08:00
39 changed files with 1207 additions and 513 deletions
+4 -4
View File
@@ -17,18 +17,18 @@
## 预设配置截图
### 渔夫仓库 ([fishman.yml](files/fishman.yml))
### 渔夫仓库 ([fishman.yml](../../src/main/resources/depositories/fishman.yml))
![fishman](images/fishman.png)
### 矿工仓库 ([miner.yml](files/miner.yml))
### 矿工仓库 ([miner.yml](../../src/main/resources/depositories/miner.yml))
![miner](images/miner.png)
### 农夫仓库 ([farmer.yml](files/farmer.yml))
### 农夫仓库 ([farmer.yml](../../src/main/resources/depositories/farmer.yml))
![farmer](images/farmer.png)
### 猎人仓库 ([hunter.yml](files/hunter.yml))
### 猎人仓库 ([hunter.yml](../../src/main/resources/depositories/hunter.yml))
![hunter](images/hunter.png)
+14 -12
View File
@@ -1,30 +1,32 @@
---
name: 问题提交
about: 描述问题并提交,帮助我们对其进行检查与修复。
about: 提交并描述问题,帮助我们对其进行检查与修复。
title: ''
labels: bug
assignees: ''
---
### **问题简述**
用简短的话语描述一下大概问题。
**问题简述**
<!--用简短的话语描述一下大概问题。-->
### **问题来源**
**问题来源**
<!--
描述一下通过哪些操作才发现的问题,如:
1. 打开 '...'
2. 点击了 '....'
3. 出现了报错 '....'
-->
### **预期结果**(可选)
如果问题不发生,应该是什么情况
**预期结果**(可选)
<!--如果问题不发生,应该是什么情况-->
### **问题截图/问题报错**
如果有报错或输出,请提供截图。
**问题截图/问题报错**
<!--如果有报错或输出,请提供截图。-->
### *操作环境**
请在后台输入 `version` 并复制相关输出。
**操作环境**
<!--请在后台输入 `version` 并复制相关输出。-->
### **其他补充**
如有其他补充,可以在这里描述。
**其他补充**
<!--如有其他补充,可以在这里描述。-->
+8 -8
View File
@@ -7,14 +7,14 @@ assignees: ''
---
### **功能简述**
简单的描述一下你想要的功能
**功能简述**
<!--简单的描述一下你想要的功能-->
### **需求来源**
简单的描述一下为什么需要这个功能。
**需求来源**
<!--简单的描述一下为什么需要这个功能。-->
### **功能参考**(可选)
如果有相关功能的参考,如文本、截图,请提供给我们。
**功能参考**(可选)
<!--如果有相关功能的参考,如文本、截图,请提供给我们。-->
### **附加内容**
如果有什么小细节需要重点注意,请在这里告诉我们。
**附加内容**
<!--如果有什么小细节需要重点注意,请在这里告诉我们。-->
+4 -4
View File
@@ -38,11 +38,11 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v6
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -53,7 +53,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
uses: github/codeql-action/autobuild@v4
# ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
@@ -67,4 +67,4 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
uses: github/codeql-action/analyze@v4
+20 -10
View File
@@ -1,7 +1,7 @@
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: Project Deploy
name: Deploy & Upload
on:
# 支持手动触发构建
@@ -16,9 +16,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v6
- name: "Set up JDK"
uses: actions/setup-java@v2
uses: actions/setup-java@v5
with:
java-version: '11'
distribution: 'adopt'
@@ -27,13 +27,23 @@ jobs:
server-username: MAVEN_USERNAME
server-password: MAVEN_TOKEN
- name: "Maven Deploy With Javadoc"
- name: "Maven Deploy"
run: mvn -B deploy --file pom.xml -DskipTests
env:
MAVEN_USERNAME: ${{ github.repository_owner }}
MAVEN_TOKEN: ${{secrets.GITHUB_TOKEN}}
- name: "Copy Javadoc to Location"
- name: "Release Asset Upload"
id: upload-release-asset
uses: shogo82148/actions-upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ github.event.release.upload_url }}
asset_path: asset/*.jar
asset_content_type: application/java-archive
- name: "Javadoc Deploy Staging"
run: |
rm -rf docs
mkdir -vp docs
@@ -44,10 +54,10 @@ jobs:
id: sitemap
uses: cicirello/generate-sitemap@v1
with:
base-url-path: https://carmjos.github.io/EasySQL
base-url-path: https://${{ github.repository_owner }}.github.io/${{ github.event.repository.name }}
path-to-root: docs
- name: "Output stats"
- name: "Output Javadoc stats"
run: |
echo "sitemap-path = ${{ steps.sitemap.outputs.sitemap-path }}"
echo "url-count = ${{ steps.sitemap.outputs.url-count }}"
@@ -65,11 +75,11 @@ jobs:
git config --global user.name 'CarmJos'
git config --global user.email 'carm@carm.cc'
- name: "Commit documentations"
- name: "Commit Javadocs"
run: |
cd docs
git init
git remote add origin git@github.com:CarmJos/UltraDepository.git
git remote add origin git@github.com:${{ github.repository }}.git
git checkout -b gh-pages
git add -A
git commit -m "API Document generated."
@@ -77,4 +87,4 @@ jobs:
- name: "Push javadocs"
run: |
cd docs
git push origin HEAD:gh-pages --force
git push origin HEAD:gh-pages --force
+13 -8
View File
@@ -1,7 +1,7 @@
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: Project Build & Tests
name: Build & Tests
on:
# 支持手动触发构建
@@ -14,9 +14,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v6
- name: "Set up JDK"
uses: actions/setup-java@v2
uses: actions/setup-java@v5
with:
java-version: '11'
distribution: 'adopt'
@@ -29,10 +29,15 @@ jobs:
env:
MAVEN_USERNAME: ${{ github.repository_owner }}
MAVEN_TOKEN: ${{secrets.GITHUB_TOKEN}}
- name: "Target Stage"
run: mkdir staging && cp target/*.jar staging
- name: "Upload artifact"
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v7
with:
name: Artifact
path: staging
name: artifact
path: target
- name: "Upload assets"
uses: actions/upload-artifact@v7
with:
name: assets
path: asset
+1
View File
@@ -2,3 +2,4 @@
/target/
./*.iml
*.iml
asset/
+8 -7
View File
@@ -24,13 +24,15 @@
本插件由 [墨豆Mordo](https://www.mordo.cn)、[子墨Zimrs](https://www.zimrs.cn) 资助本人开发,经过授权后开源。
> 本插件已发布于 [MCBBS](https://www.mcbbs.net/forum.php?mod=viewthread&tid=1292631) 和 [SpigotMC]() 。
## 功能介绍
本插件允许配置多个不同功能的仓库,玩家通过 击杀生物/挖掘方块/捡起收集 获得的原版物品可以自动被放入仓库中。
进入仓库后的物品玩家可以选择拿出或直接按量出售,且每日的出售数量上限和每件物品的价格可以自定义。
插件支持针对不同的权限配置仓库的容量,由此可以制作付费享用的”农业仓库“、”战斗仓库“、”伐木仓库“...
插件支持针对不同的权限配置仓库的容量,由此可以制作付费享用的”作物仓库“、”药剂师仓库“、”伐木仓库“...
综上,该插件不但提供了一种功能特权,对其合理配置之后也将大大为玩家带来便利。
@@ -172,13 +174,9 @@
<summary>展开查看所有权限</summary>
```text
# UltraDepository.use
- 超级仓库的基本使用权限 (默认所有人都有)
# UltraDepository.silent
- 拥有该权限将不再接收到放入背包的提示。
# UltraDepository.Command.Sell
- 玩家使用Sell指令的权限
@@ -194,9 +192,12 @@
- 若玩家缺失该权限或“UltraDepository.auto”权限,则自动收集物品功能不会启用。
- 您可以自己使用GUI创建一个按钮,后通过给玩家添加/删除该权限决定玩家是否开启自动收集。
# UltraDepository.silent
- 拥有该权限将不再接收到放入背包的提示。
- 您可以自己使用GUI创建一个按钮,后通过给玩家添加/删除该权限决定玩家是否开启收集提示。
# UltraDepository.admin
- "超级仓库的管理权限"
```
</details>
@@ -217,7 +218,7 @@
文件名即仓库的ID,**强烈推荐使用纯英文**。以`.`开头的仓库配置不会被加载。部分符号可能会影响正常读取,请避免使用。
随本项目预设了几个常用的仓库类型,可以 [在这里](.examples/depositories) 找到您需要的仓库配置加以修改后使用。
随本项目预设了几个常用的仓库类型,可以 [在这里](.examples/depositories) 直接下载您需要的仓库配置加以修改后使用。
您也可以 [点击这里](src/main/resources/depositories/.example-depository.yml) 查看一份*详细的仓库配置示例*,以制作您自己的仓库。
+38 -25
View File
@@ -5,17 +5,20 @@
<modelVersion>4.0.0</modelVersion>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<java.version>11</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<easyplugin.version>1.3.4</easyplugin.version>
<easyplugin.version>1.5.14</easyplugin.version>
<easysql.version>0.4.7</easysql.version>
<ghreleases.version>1.3.2</ghreleases.version>
</properties>
<groupId>cc.carm.plugin</groupId>
<artifactId>ultradepository</artifactId>
<packaging>jar</packaging>
<version>1.2.4</version>
<version>1.3.9</version>
<name>UltraDepository</name>
<description>超级仓库插件,支持设定不同物品的存储仓库。</description>
@@ -112,35 +115,43 @@
<dependency>
<groupId>cc.carm.lib</groupId>
<artifactId>easyplugin-database</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.16.3-R0.1-SNAPSHOT</version>
<artifactId>easysql-beecp</artifactId>
<version>${easysql.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.10.9</version>
<groupId>cc.carm.lib</groupId>
<artifactId>githubreleases4j</artifactId>
<version>${ghreleases.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.bstats</groupId>
<artifactId>bstats-bukkit</artifactId>
<version>2.2.1</version>
<version>3.2.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.19-R0.1-20220725.090125-47</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.12.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.MilkBowl</groupId>
<artifactId>VaultAPI</artifactId>
<version>1.7</version>
<version>1.7.1</version>
<scope>provided</scope>
</dependency>
@@ -172,7 +183,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<version>3.5.5</version>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
</configuration>
@@ -180,7 +191,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.2.0</version>
<version>3.12.0</version>
<configuration>
<classifier>javadoc</classifier>
<links>
@@ -204,10 +215,10 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<version>3.15.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
<compilerArgument>-parameters</compilerArgument>
</configuration>
@@ -215,12 +226,12 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<version>3.5.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.0</version>
<version>3.4.0</version>
<executions>
<execution>
<phase>package</phase>
@@ -233,7 +244,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.3</version>
<version>3.6.2</version>
<executions>
<execution>
<phase>package</phase>
@@ -244,6 +255,8 @@
</executions>
<configuration>
<finalName>${project.name}-${project.version}</finalName>
<outputDirectory>${project.basedir}/asset/</outputDirectory>
<createDependencyReducedPom>false</createDependencyReducedPom>
<relocations>
<relocation>
+13
View File
@@ -0,0 +1,13 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended"
],
"packageRules": [
{
"matchUpdateTypes": ["minor", "patch"],
"matchCurrentVersion": "!/^0/",
"automerge": true
}
]
}
@@ -0,0 +1,180 @@
package cc.carm.plugin.ultradepository;
import cc.carm.lib.easyplugin.EasyPlugin;
import cc.carm.lib.easyplugin.gui.GUI;
import cc.carm.lib.easyplugin.i18n.EasyPluginMessageProvider;
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.GHUpdateChecker;
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 cc.carm.plugin.ultradepository.util.JarResourceUtils;
import org.bstats.bukkit.Metrics;
import org.bstats.charts.SimplePie;
import org.bstats.charts.SingleLineChart;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import java.util.Optional;
public class Main extends EasyPlugin {
private static Main instance;
private DataStorage storage;
private ConfigManager configManager;
private UserManager userManager;
private EconomyManager economyManager;
private DepositoryManager depositoryManager;
public Main() {
super(new EasyPluginMessageProvider.zh_CN());
}
@Override
protected void load() {
instance = this;
}
@Override
protected boolean initialize() {
log("加载配置文件...");
this.configManager = new ConfigManager(this);
if (!configManager.initialize()) {
log("初始化配置文件失败,放弃加载。");
return false;
}
log("初始化存储方式...");
StorageMethod storageMethod = PluginConfig.STORAGE_METHOD.getOptional().orElse(StorageMethod.YAML);
log(" 正在使用 " + storageMethod.name() + " 进行数据存储");
this.storage = storageMethod.createStorage();
if (!storage.initialize()) {
error("初始化存储失败,请检查配置文件。");
storage.shutdown();
return false;
}
log("加载经济系统...");
if (Bukkit.getPluginManager().getPlugin("Vault") != null) {
this.economyManager = new EconomyManager();
if (!economyManager.initialize()) {
error("经济系统初始化失败,关闭出售功能。");
}
} else {
log(" &7[-] 检测到未安装Vault,关闭出售功能。");
}
log("加载仓库管理器...");
this.depositoryManager = new DepositoryManager();
getDepositoryManager().loadDepositories();
log("加载用户系统...");
this.userManager = new UserManager();
log("注册监听器...");
regListener(new UserListener());
regListener(new CollectListener());
GUI.initialize(this);
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", storageMethod::name));
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();
}));
}
if (PluginConfig.CHECK_UPDATE.get()) {
log("开始检查更新...");
GHUpdateChecker checker = new GHUpdateChecker(getLogger(), "CarmJos", "UltraDepository");
getScheduler().runAsync(() -> checker.checkUpdate(getDescription().getVersion()));
} else {
log("已禁用检查更新,跳过。");
}
getUserManager().loadPlayersData();
return true;
}
@Override
protected void shutdown() {
if (!isInitialized()) return;
log("保存现有用户数据...");
getUserManager().saveAll();
getUserManager().getDataCache().clear();
log("释放存储源...");
getStorage().shutdown();
log("卸载监听器...");
Bukkit.getServicesManager().unregisterAll(this);
}
protected DataStorage getStorage() {
return storage;
}
public static Main getInstance() {
return instance;
}
protected UserManager getUserManager() {
return userManager;
}
protected EconomyManager getEconomyManager() {
return economyManager;
}
protected DepositoryManager getDepositoryManager() {
return depositoryManager;
}
protected ConfigManager getConfigManager() {
return configManager;
}
@Override
public boolean isDebugging() {
return PluginConfig.DEBUG.get();
}
@Override
public void outputInfo() {
Optional.ofNullable(JarResourceUtils.readResource(this.getResource("PLUGIN_INFO"))).ifPresent(this::log);
}
}
@@ -1,169 +1,35 @@
package cc.carm.plugin.ultradepository;
import cc.carm.lib.easyplugin.EasyPlugin;
import cc.carm.lib.easyplugin.gui.GUI;
import cc.carm.lib.easyplugin.i18n.EasyPluginMessageProvider;
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 {
public class UltraDepository {
private static UltraDepository instance;
public static DataStorage getStorage() {
return Main.getInstance().getStorage();
}
private static DataStorage storage;
public static Main getInstance() {
return Main.getInstance();
}
private static UserManager userManager;
private static EconomyManager economyManager;
private static DepositoryManager depositoryManager;
public static UserManager getUserManager() {
return Main.getInstance().getUserManager();
}
public UltraDepository() {
super(new EasyPluginMessageProvider.zh_CN());
}
public static EconomyManager getEconomyManager() {
return Main.getInstance().getEconomyManager();
}
@Override
protected void load() {
instance = this;
}
public static DepositoryManager getDepositoryManager() {
return Main.getInstance().getDepositoryManager();
}
@Override
protected boolean initialize() {
public static ConfigManager getConfigManager() {
return Main.getInstance().getConfigManager();
}
log("加载配置文件...");
if (!ConfigManager.initialize()) {
log("初始化配置文件失败,放弃加载。");
return false;
}
log("初始化存储方式...");
StorageMethod storageMethod = PluginConfig.STORAGE_METHOD.getOptional().orElse(StorageMethod.YAML);
log(" 正在使用 " + storageMethod.name() + " 进行数据存储");
storage = storageMethod.createStorage();
if (!storage.initialize()) {
error("初始化存储失败,请检查配置文件。");
storage.shutdown();
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();
GUI.initialize(this);
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", storageMethod::name));
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
protected 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 boolean isDebugging() {
return PluginConfig.DEBUG.get();
}
@Override
public void outputInfo() {
log(" ",
"&6 _ _ _ _ &e _____ _ _ ",
"&6| | | | | | &e| __ \\ (_) | ",
"&6| | | | | |_ _ __ __ _ &e| | | | ___ _ __ ___ ___ _| |_ ___ _ __ _ _ ",
"&6| | | | | __| '__/ _` |&e| | | |/ _ \\ '_ \\ / _ \\/ __| | __/ _ \\| '__| | | |",
"&6| |__| | | |_| | | (_| |&e| |__| | __/ |_) | (_) \\__ \\ | || (_) | | | |_| |",
"&6 \\____/|_|\\__|_| \\__,_|&e|_____/ \\___| .__/ \\___/|___/_|\\__\\___/|_| \\__, |",
"&6 &e| | __/ |",
"&6 &e|_| |___/ ",
"&f请访问项目主页查看详细插件介绍 &8/ &fView GitHub to get more information",
"&8-> &6https://github.com/CarmJos/UltraDepository",
" "
);
}
}
@@ -6,119 +6,156 @@ import cc.carm.lib.easyplugin.configuration.impl.ConfigSound;
import cc.carm.lib.easyplugin.configuration.message.ConfigMessage;
import cc.carm.lib.easyplugin.configuration.message.ConfigMessageList;
import cc.carm.lib.easyplugin.configuration.values.ConfigValue;
import cc.carm.plugin.ultradepository.manager.ConfigManager;
import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.storage.StorageMethod;
import org.bukkit.Material;
import org.bukkit.Sound;
public class PluginConfig {
public static final ConfigValue<Boolean> DEBUG = new ConfigValue<>(
"debug", Boolean.class, false
);
public static final ConfigValue<Boolean> DEBUG = new ConfigValue<>(
"debug", Boolean.class, false
);
public static final ConfigValue<Boolean> METRICS = new ConfigValue<>(
"metrics", Boolean.class, true
);
public static final ConfigValue<Boolean> METRICS = new ConfigValue<>(
"metrics", Boolean.class, true
);
public static final ConfigStringCast<StorageMethod> STORAGE_METHOD = new ConfigStringCast<>(
"storage.method", StorageMethod::read, StorageMethod.YAML
);
public static final ConfigValue<Boolean> CHECK_UPDATE = new ConfigValue<>(
"check-update", Boolean.class, true
);
/**
* 收集配置
*/
public static class Collect {
public static final ConfigStringCast<StorageMethod> STORAGE_METHOD = new ConfigStringCast<>(
"storage.method", StorageMethod::read, StorageMethod.YAML
);
public static final ConfigValue<Boolean> PICKUP = new ConfigValue<>(
"collect.pickup", Boolean.class, true
);
/**
* 收集配置
*/
public static class Collect {
public static final ConfigValue<Boolean> KILL = new ConfigValue<>(
"collect.kill", Boolean.class, true
);
public static final ConfigValue<Boolean> PICKUP = new ConfigValue<>(
"collect.pickup", Boolean.class, true
);
public static final ConfigValue<Boolean> BREAK = new ConfigValue<>(
"collect.break", Boolean.class, true
);
public static final ConfigValue<Boolean> KILL = new ConfigValue<>(
"collect.kill", Boolean.class, true
);
}
public static final ConfigValue<Boolean> BREAK = new ConfigValue<>(
"collect.break", Boolean.class, true
);
public static class Sounds {
}
public static final ConfigSound COLLECT = new ConfigSound("sounds.collect", Sound.ENTITY_VILLAGER_CELEBRATE);
public static final ConfigSound SELL_SUCCESS = new ConfigSound("sounds.sell-success");
public static final ConfigSound SELL_FAIL = new ConfigSound("sounds.sell-fail");
public static final ConfigSound GUI_CLICK = new ConfigSound("sounds.gui-click");
}
public static class Sounds {
/**
* 通用配置
*/
public static class General {
/**
* 针对每一件物品的额外介绍
* 将添加到背包界面内的物品上,避免重复配置
*/
public static final ConfigMessageList ADDITIONAL_LORE = new ConfigMessageList(
ConfigManager::getPluginConfig, "general.additional-lore", new String[]{},
new String[]{
"%(item_name)", "%(amount)", "%(price)", "%(sold)", "%(remain)", "%(limit)"
});
public static final ConfigSound COLLECT = new ConfigSound("sounds.collect", Sound.ENTITY_VILLAGER_CELEBRATE);
public static final ConfigSound TAKEOUT = new ConfigSound("sounds.collect");
public static final ConfigSound SELL_SUCCESS = new ConfigSound("sounds.sell-success");
public static final ConfigSound SELL_FAIL = new ConfigSound("sounds.sell-fail");
public static final ConfigSound GUI_CLICK = new ConfigSound("sounds.gui-click");
}
/**
* 提示玩家点击行为的介绍
* 将添加到背包界面内的物品上,避免重复配置
*/
public static final ConfigMessageList CLICK_LORE = new ConfigMessageList(
ConfigManager::getPluginConfig,
"general.click-lore",
new String[]{}, new String[]{
"%(item_name)", "%(amount)", "%(price)"
});
/**
* 通用配置
*/
public static class General {
/**
* 售出界面的配置
*/
public static class SellGUI {
/**
* 针对每一件物品的额外介绍
* 将添加到背包界面内的物品上,避免重复配置
*/
public static class AdditionalLore {
public static final ConfigMessageList AVAILABLE_FOR_SALE = new ConfigMessageList(
() -> UltraDepository.getConfigManager().getPluginConfig(),
"general.additional-lore.available-for-sale",
new String[]{},
new String[]{
"%(item_name)", "%(amount)", "%(price)", "%(sold)", "%(remain)", "%(limit)"
});
public static final ConfigMessageList NOT_FOR_SALE = new ConfigMessageList(
() -> UltraDepository.getConfigManager().getPluginConfig(),
"general.additional-lore.not-for-sale",
new String[]{}, new String[]{
"%(item_name)", "%(amount)"
});
}
/**
* 提示玩家点击行为的介绍
* 将添加到背包界面内的物品上,避免重复配置
*/
public static class ClickLore {
public static final ConfigMessageList AVAILABLE_FOR_SALE = new ConfigMessageList(
() -> UltraDepository.getConfigManager().getPluginConfig(),
"general.click-lore.available-for-sale",
new String[]{}, new String[]{
"%(item_name)", "%(amount)", "%(price)"
});
public static final ConfigMessageList NOT_FOR_SALE = new ConfigMessageList(
() -> UltraDepository.getConfigManager().getPluginConfig(),
"general.click-lore.not-for-sale",
new String[]{},
new String[]{
"%(item_name)", "%(amount)"
});
}
public static final ConfigMessage TITLE = new ConfigMessage(
ConfigManager::getPluginConfig,
"general.sell-gui.title",
"&a&l出售", new String[]{
"%(item_name)", "%(backpack_name)"
}
);
public static final ConfigMessageList CLICK_LORE = new ConfigMessageList(
() -> UltraDepository.getConfigManager().getPluginConfig(),
"general.click-lore",
new String[]{}, new String[]{
"%(item_name)", "%(amount)", "%(price)"
});
public static class Items {
/**
* 售出界面的配置
*/
public static class SellGUI {
public static final ConfigItem ADD = new ConfigItem(
"general.sell-gui.items.add",
new String[]{"%(item_name)", "%(amount)"},
ConfigItem.create(Material.GREEN_STAINED_GLASS_PANE, "&a添加物品 %(amount) 个")
);
public static final ConfigItem REMOVE = new ConfigItem(
"general.sell-gui.items.remove",
new String[]{"%(item_name)", "%(amount)"},
ConfigItem.create(Material.RED_STAINED_GLASS_PANE, "&c減少物品 %(amount) 个")
);
public static final ConfigMessage TITLE = new ConfigMessage(
() -> UltraDepository.getConfigManager().getPluginConfig(),
"general.sell-gui.title",
"&a&l出售", new String[]{
"%(item_name)", "%(backpack_name)"
}
);
public static final ConfigItem CONFIRM = new ConfigItem(
"general.sell-gui.items.confirm",
new String[]{"%(item_name)", "%(amount)", "%(money)"},
ConfigItem.create(Material.EMERALD, "&2确认售出")
);
public static class Items {
public static final ConfigItem CANCEL = new ConfigItem(
"general.sell-gui.items.cancel",
ConfigItem.create(Material.REDSTONE, "&4取消售出")
);
public static final ConfigItem ADD = new ConfigItem(
"general.sell-gui.items.add",
new String[]{"%(item_name)", "%(amount)"},
ConfigItem.create(Material.GREEN_STAINED_GLASS_PANE, "&a添加物品 %(amount) 个")
);
}
public static final ConfigItem REMOVE = new ConfigItem(
"general.sell-gui.items.remove",
new String[]{"%(item_name)", "%(amount)"},
ConfigItem.create(Material.RED_STAINED_GLASS_PANE, "&c減少物品 %(amount) 个")
);
}
public static final ConfigItem CONFIRM = new ConfigItem(
"general.sell-gui.items.confirm",
new String[]{"%(item_name)", "%(amount)", "%(money)"},
ConfigItem.create(Material.EMERALD, "&2确认售出")
);
}
public static final ConfigItem CANCEL = new ConfigItem(
"general.sell-gui.items.cancel",
ConfigItem.create(Material.REDSTONE, "&4取消售出")
);
}
}
}
}
@@ -1,88 +1,102 @@
package cc.carm.plugin.ultradepository.configuration;
import cc.carm.lib.easyplugin.configuration.language.EasyMessage;
import cc.carm.lib.easyplugin.configuration.language.EasyMessageList;
import cc.carm.lib.easyplugin.configuration.language.MessagesRoot;
import cc.carm.lib.easyplugin.configuration.language.MessagesSection;
public class PluginMessages extends MessagesRoot {
@MessagesSection("help")
public static class Usages {
@MessagesSection("help")
public static class Usages {
public static final EasyMessageList CONSOLE = new EasyMessageList(
"&6&l超级仓库 &f后台指令帮助",
"&8#&f info &6<玩家> &e[仓库ID] &e[物品ID]",
"&8-&7 得到玩家的相关物品信息。",
"&8#&f add &6<玩家> &6<仓库ID> &6<物品ID> &6<数量>",
"&8-&7 为玩家添加对应仓库中对于物品的数量。",
"&8#&f remove &6<玩家> &6<仓库ID> &6<物品ID> &e[数量]",
"&8-&7 为玩家减少对应仓库中对于物品的数量。",
"&8-&7 若不填写数量,则清空对应仓库的对应物品。",
"&8#&f sell &6<玩家> &e[仓库ID] &e[物品ID] &e[数量]",
"&8-&7 为玩家售出相关物品。",
"&8-&7 若不填写数量,则售出所有对应仓库的对应物品。",
"&8-&7 若不填写物品,则售出对应仓库内所有物品。",
"&8-&7 若不填写仓库,则售出所有仓库内所有物品。",
"&8-&7 该指令受到玩家每日售出数量的限制。"
);
public static final EasyMessageList CONSOLE = new EasyMessageList(
"&6&l超级仓库 &f后台指令帮助",
"&8#&f info &6<玩家> &e[仓库ID] &e[物品ID]",
"&8-&7 得到玩家的相关物品信息。",
"&8#&f add &6<玩家> &6<仓库ID> &6<物品ID> &6<数量>",
"&8-&7 为玩家添加对应仓库中对于物品的数量。",
"&8#&f remove &6<玩家> &6<仓库ID> &6<物品ID> &e[数量]",
"&8-&7 为玩家减少对应仓库中对于物品的数量。",
"&8-&7 若不填写数量,则清空对应仓库的对应物品。",
"&8#&f sell &6<玩家> &e[仓库ID] &e[物品ID] &e[数量]",
"&8-&7 为玩家售出相关物品。",
"&8-&7 若不填写数量,则售出所有对应仓库的对应物品。",
"&8-&7 若不填写物品,则售出对应仓库内所有物品。",
"&8-&7 若不填写仓库,则售出所有仓库内所有物品。",
"&8-&7 该指令受到玩家每日售出数量的限制。"
);
public static final EasyMessageList PLAYER = new EasyMessageList(
"&6&l超级仓库 &f玩家指令帮助",
"&8#&f open &e[仓库ID]",
"&8-&7 打开对应仓库的界面。",
"&8#&f sell &6<仓库ID> &6<物品ID> &6<数量>",
"&8-&7 售出对应数量的对应物品。",
"&8-&7 该指令受到玩家每日售出数量的限制。",
"&8#&f sellAll &e[仓库ID] &e[物品ID]",
"&8-&7 该指令受到玩家每日售出数量的限制。"
);
public static final EasyMessageList PLAYER = new EasyMessageList(
"&6&l超级仓库 &f玩家指令帮助",
"&8#&f open &e[仓库ID]",
"&8-&7 打开对应仓库的界面。",
"&8#&f sell &6<仓库ID> &6<物品ID> &6<数量>",
"&8-&7 售出对应数量的对应物品。",
"&8-&7 该指令受到玩家每日售出数量的限制。",
"&8#&f sellAll &e[仓库ID] &e[物品ID]",
"&8-&7 该指令受到玩家每日售出数量的限制。"
);
}
}
public static final EasyMessageList ITEM_SOLD = new EasyMessageList(
new String[]{"&f您出售了 &r%(item)&7x%(amount) &f,共赚取 &6%(money) &f元。"},
new String[]{"%(item)", "%(amount)", "%(money)"}
);
public static final EasyMessageList ITEM_SOLD = new EasyMessageList(
new String[]{"&f您出售了 &r%(item)&7x%(amount) &f,共赚取 &6%(money) &f元。"},
new String[]{"%(item)", "%(amount)", "%(money)"}
);
public static final EasyMessageList ITEM_SOLD_LIMIT = new EasyMessageList(
new String[]{"&f该物品今日剩余可出售额度为 &a%(amount)&8/%(limit) &f个。"},
new String[]{"%(amount)", "%(limit)"}
);
public static final EasyMessageList ITEM_SOLD_LIMIT = new EasyMessageList(
new String[]{"&f该物品今日剩余可出售额度为 &a%(amount)&8/%(limit) &f个。"},
new String[]{"%(amount)", "%(limit)"}
);
public static final EasyMessageList ITEM_PICKUP = new EasyMessageList(
new String[]{"&f您拾取了 &r%(item)&7x%(amount) &f,已自动放入到您的仓库中。"},
new String[]{"%(item)", "%(amount)"}
);
public static final EasyMessageList ITEM_PICKUP = new EasyMessageList(
new String[]{"&f您拾取了 &r%(item)&7x%(amount) &f,已自动放入到您的仓库中。"},
new String[]{"%(item)", "%(amount)"}
);
public static final EasyMessageList ITEM_COLLECT = new EasyMessageList(
new String[]{"&f您收集了 &r%(item)&7x%(amount) &f,已自动放入到您的 &6%(depository) &f中。"},
new String[]{"%(item)", "%(amount)", "%(depository)"}
);
public static final EasyMessageList ITEM_TAKEOUT = new EasyMessageList(
new String[]{"&f您从仓库中拿取了 &r%(item)&7x%(amount) &f放入到您的背包中。"},
new String[]{"%(item)", "%(amount)"}
);
public static final EasyMessageList ITEM_COLLECT = new EasyMessageList(
new String[]{"&f您收集了 &r%(item)&7x%(amount) &f,已自动放入到您的 &6%(depository) &f中。"},
new String[]{"%(item)", "%(amount)", "%(depository)"}
);
public static final EasyMessageList NO_SPACE = new EasyMessageList(
"&f您仓库内没有足够的空间取出物品!"
);
public static final EasyMessage ITEM_COLLECT_ACTIONBAR = new EasyMessage(
"&r%(item)&7x%(amount) &f-> &6%(depository)",
new String[]{"%(item)", "%(amount)", "%(depository)"}
);
public static final EasyMessageList NO_ECONOMY = new EasyMessageList(
"&f本服务器暂未启用出售功能。"
);
public static final EasyMessageList NO_SPACE = new EasyMessageList(
"&f您背包内没有足够的空间取出物品!"
);
public static final EasyMessageList NO_DEPOSITORY = new EasyMessageList(
"&f不存在该仓库,请检查仓库ID是否正确"
);
public static final EasyMessageList NO_ECONOMY = new EasyMessageList(
"&f本服务器暂未启用出售功能"
);
public static final EasyMessageList NO_ITEM = new EasyMessageList(
"&f仓库中不存在该物品,请检查物品ID是否正确。"
);
public static final EasyMessageList NO_DEPOSITORY = new EasyMessageList(
"&f不存在该仓库,请检查仓库ID是否正确。"
);
public static final EasyMessageList NO_ENOUGH_ITEM = new EasyMessageList(
"&f仓库中不存在足够的物品"
);
public static final EasyMessageList NO_ITEM = new EasyMessageList(
"&f仓库中不存在该物品,请检查物品ID是否正确"
);
public static final EasyMessageList WRONG_NUMBER = new EasyMessageList(
"&f数目输入错误,请输入正确的数字!"
);
public static final EasyMessageList NO_ENOUGH_ITEM = new EasyMessageList(
"&f仓库中不存在足够的物品。"
);
public static final EasyMessageList WRONG_NUMBER = new EasyMessageList(
"&f数目输入错误,请输入正确的数字!"
);
public static final EasyMessage LOAD_FAILED = new EasyMessage(
"&c您的背包数据未被正确加载,请重新进入!"
);
}
@@ -116,8 +116,8 @@ public class DepositoryItem {
return new DepositoryItem(
depository, material, data,
section.getInt("slot", 0),
section.getDouble("price", 0),
section.getInt("limit", 0),
section.getDouble("price", -1),
section.getInt("limit", -1),
section.getString("name", material.name()),
section.getStringList("lore")
);
@@ -0,0 +1,38 @@
package cc.carm.plugin.ultradepository.hooker;
import cc.carm.lib.githubreleases4j.GithubReleases4J;
import java.util.logging.Logger;
public class GHUpdateChecker {
private final Logger logger;
private final String owner;
private final String repo;
public GHUpdateChecker(Logger logger, String owner, String repo) {
this.logger = logger;
this.owner = owner;
this.repo = repo;
}
public void checkUpdate(String currentVersion) {
Integer behindVersions = GithubReleases4J.getVersionBehind(owner, repo, currentVersion);
String downloadURL = GithubReleases4J.getReleasesURL(owner, repo);
if (behindVersions == null) {
logger.severe("检查更新失败,请您定期查看插件是否更新,避免安全问题。");
logger.severe("下载地址 " + downloadURL);
} else if (behindVersions == 0) {
logger.info("检查完成,当前已是最新版本。");
} else if (behindVersions > 0) {
logger.info("发现新版本! 目前已落后 " + behindVersions + " 个版本。");
logger.info("最新版下载地址 " + downloadURL);
} else {
logger.severe("检查更新失败! 当前版本未知,请您使用原生版本以避免安全问题。");
logger.severe("最新版下载地址 " + downloadURL);
}
}
}
@@ -0,0 +1,36 @@
package cc.carm.plugin.ultradepository.hooker;
import cc.carm.lib.githubreleases4j.GithubReleases4J;
import cc.carm.plugin.ultradepository.Main;
import cc.carm.plugin.ultradepository.UltraDepository;
public class UpdateChecker {
public static void checkUpdate(Main plugin) {
plugin.getScheduler().runAsync(() -> {
Integer behindVersions = GithubReleases4J.getVersionBehind(
"CarmJos", "UltraDepository",
plugin.getDescription().getVersion()
);
String downloadURL = GithubReleases4J.getReleasesURL("CarmJos", "UltraDepository");
if (behindVersions == null) {
plugin.error("检查更新失败,请您定期查看插件是否更新,避免安全问题。");
plugin.error("下载地址 " + downloadURL);
} else if (behindVersions == 0) {
plugin.log("检查完成,当前已是最新版本。");
} else if (behindVersions > 0) {
plugin.log("发现新版本! 目前已落后 " + behindVersions + " 个版本。");
plugin.log("最新版下载地址 " + downloadURL);
} else {
plugin.error("检查更新失败! 当前版本未知,请您使用原生版本以避免安全问题。");
plugin.error("最新版下载地址 " + downloadURL);
}
});
}
}
@@ -1,6 +1,7 @@
package cc.carm.plugin.ultradepository.listener;
import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.configuration.PluginMessages;
import cc.carm.plugin.ultradepository.data.UserData;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -19,15 +20,13 @@ public class UserListener implements Listener {
if (event.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) {
return;
}
UUID uuid = event.getUniqueId();
UltraDepository.getInstance().debug("尝试加载玩家 " + event.getName() + " 的数据...");
UltraDepository.getUserManager().getDataCache().put(uuid, UltraDepository.getUserManager().loadData(uuid));
UltraDepository.getUserManager().loadDataCache(event.getUniqueId());
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPreLoginMonitor(AsyncPlayerPreLoginEvent event) {
if (event.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) {
UltraDepository.getUserManager().getDataCache().remove(event.getUniqueId());
UltraDepository.getUserManager().removeDataCache(event.getUniqueId());
}
}
@@ -36,7 +35,7 @@ public class UserListener implements Listener {
UserData data = UltraDepository.getUserManager().getData(e.getPlayer().getUniqueId());
if (data == null) {
e.setResult(PlayerLoginEvent.Result.KICK_OTHER);
e.setKickMessage(UltraDepository.getInstance().getName() + " 数据未被正确加载,请重新进入。");
e.setKickMessage(PluginMessages.LOAD_FAILED.get(e.getPlayer()));
}
}
@@ -44,7 +43,8 @@ public class UserListener implements Listener {
public void onQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
UUID playerUUID = player.getUniqueId();
UltraDepository.getInstance().getScheduler().runAsync(() -> UltraDepository.getUserManager().unloadData(playerUUID, true));
UltraDepository.getInstance().getScheduler()
.runAsync(() -> UltraDepository.getUserManager().unloadData(playerUUID, true));
}
}
@@ -7,70 +7,74 @@ import cc.carm.lib.easyplugin.configuration.language.MessagesInitializer;
import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.configuration.PluginMessages;
import cc.carm.plugin.ultradepository.util.JarUtil;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
public class ConfigManager {
private static FileConfig pluginConfiguration;
private static MessagesConfig messageConfiguration;
private final JavaPlugin plugin;
private FileConfig pluginConfiguration;
private MessagesConfig messageConfiguration;
public static boolean initialize() {
UltraDepository udPlugin = UltraDepository.getInstance();
public ConfigManager(JavaPlugin plugin) {
this.plugin = plugin;
}
public boolean initialize() {
try {
File configFile = new File(udPlugin.getDataFolder(), "config.yml");
if (!configFile.exists()) {
//没找到配置文件,可能是第一次加载此插件
//把一些英文版的东西复制出来,方便英文用户使用。
UltraDepository.getInstance().log(" 未找到配置文件,生成默认配置...");
JarUtil.copyFolderFromJar(
"i18n", udPlugin.getDataFolder(),
JarUtil.CopyOption.COPY_IF_NOT_EXIST
);
try {
File configFile = new File(plugin.getDataFolder(), "config.yml");
if (!configFile.exists()) {
//没找到配置文件,可能是第一次加载此插件
//把一些英文版的东西复制出来,方便英文用户使用。
UltraDepository.getInstance().log(" 未找到配置文件,生成默认配置...");
JarUtil.copyFolderFromJar(
"i18n", plugin.getDataFolder(),
JarUtil.CopyOption.COPY_IF_NOT_EXIST
);
}
}
pluginConfiguration = new FileConfig(udPlugin, "config.yml");
messageConfiguration = new MessagesConfig(udPlugin, "messages.yml");
pluginConfiguration = new FileConfig(plugin, "config.yml");
messageConfiguration = new MessagesConfig(plugin, "messages.yml");
FileConfig.pluginConfiguration = () -> pluginConfiguration;
FileConfig.messageConfiguration = () -> messageConfiguration;
FileConfig.pluginConfiguration = () -> pluginConfiguration;
FileConfig.messageConfiguration = () -> messageConfiguration;
MessagesInitializer.initialize(messageConfiguration, PluginMessages.class);
MessagesInitializer.initialize(messageConfiguration, PluginMessages.class);
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
public static FileConfig getPluginConfig() {
return pluginConfiguration;
}
public FileConfig getPluginConfig() {
return pluginConfiguration;
}
public static MessagesConfig getMessageConfig() {
return messageConfiguration;
}
public MessagesConfig getMessageConfig() {
return messageConfiguration;
}
public static void reload() {
try {
getPluginConfig().reload();
getMessageConfig().reload();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void reload() {
try {
getPluginConfig().reload();
getMessageConfig().reload();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void saveConfig() {
try {
getPluginConfig().save();
getMessageConfig().save();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void saveConfig() {
try {
getPluginConfig().save();
getMessageConfig().save();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
@@ -6,6 +6,7 @@ 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.event.DepositoryCollectItemEvent;
import cc.carm.plugin.ultradepository.util.JarUtil;
import com.google.common.collect.HashMultimap;
import org.bukkit.Bukkit;
import org.bukkit.Material;
@@ -18,6 +19,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
@@ -45,10 +47,14 @@ public class DepositoryManager {
File folder = new File(UltraDepository.getInstance().getDataFolder(), "depositories");
if (!folder.exists()) {
folder.mkdir();
UltraDepository.getInstance().saveResource(
"depositories/.example-depository.yml", false
);
try {
JarUtil.copyFolderFromJar(
"depositories", UltraDepository.getInstance().getDataFolder(),
JarUtil.CopyOption.COPY_IF_NOT_EXIST
);
} catch (IOException ignore) {
}
} else if (folder.isDirectory()) {
folder.delete();
@@ -179,6 +185,12 @@ public class DepositoryManager {
finalAmount, depository.getName()
});
PluginConfig.Sounds.COLLECT.play(player);
PluginMessages.ITEM_COLLECT_ACTIONBAR.sendBar(player, new Object[]{
depository.getItems().get(typeID).getName(),
finalAmount, depository.getName()
}); // Support action bar
}
UltraDepository.getInstance().debug("Item collected successfully.");
return true;
@@ -4,6 +4,7 @@ import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.data.UserData;
import cc.carm.plugin.ultradepository.storage.DataStorage;
import cc.carm.plugin.ultradepository.util.DateIntUtil;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -20,6 +21,27 @@ public class UserManager {
return dataCache;
}
public void loadPlayersData() {
if (Bukkit.getOnlinePlayers().size() < 1) return;
UltraDepository.getInstance().log("加载当前在线玩家数据...");
// 用于热加载时重载玩家数据。
Bukkit.getOnlinePlayers().forEach(player -> loadDataCache(player.getUniqueId()));
}
public @NotNull UserData loadDataCache(@NotNull UUID userUUID) {
UserData data = loadData(userUUID);
UltraDepository.getUserManager().getDataCache().put(userUUID, data);
return data;
}
public boolean removeDataCache(@NotNull UUID userUUID) {
boolean contains = getDataCache().containsKey(userUUID);
getDataCache().remove(userUUID);
return contains;
}
public @Nullable UserData getData(@NotNull UUID userUUID) {
return getDataCache().get(userUUID);
}
@@ -32,7 +54,7 @@ public class UserManager {
try {
long start = System.currentTimeMillis();
DataStorage storage = UltraDepository.getStorage();
UltraDepository.getInstance().debug("正通过 " + storage.getClass().getSimpleName() + " 加载 " + userUUID + " 的用户数据...");
UltraDepository.getInstance().debug("正通过 " + storage.getClass().getSimpleName() + " 加载 " + userUUID + " 的用户数据...(" + System.currentTimeMillis() + ")");
UserData data = UltraDepository.getStorage().loadData(userUUID);
if (data == null) {
@@ -56,7 +78,7 @@ public class UserManager {
UserData data = getData(uuid);
if (data == null) return;
if (save) saveData(data);
dataCache.remove(uuid);
removeDataCache(uuid);
}
public void saveData(UserData data) {
@@ -64,7 +86,7 @@ public class UserManager {
long start = System.currentTimeMillis();
DataStorage storage = UltraDepository.getStorage();
UltraDepository.getInstance().debug("正通过 " + storage.getClass().getSimpleName() + " 保存 " + data.getUserUUID() + " 的用户数据...");
UltraDepository.getInstance().debug("正通过 " + storage.getClass().getSimpleName() + " 保存 " + data.getUserUUID() + " 的用户数据...(" + System.currentTimeMillis() + ")");
storage.saveUserData(data);
UltraDepository.getInstance().debug("通过 " + storage.getClass().getSimpleName() + " 保存 " + data.getUserUUID() + " 的用户数据完成," +
@@ -1,6 +1,7 @@
package cc.carm.plugin.ultradepository.storage;
import cc.carm.plugin.ultradepository.data.UserData;
import cc.carm.plugin.ultradepository.manager.UserManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -8,14 +9,38 @@ import java.util.UUID;
public interface DataStorage {
/**
* 在插件加载存储源时执行。
*
* @return 是否初始化成功
*/
boolean initialize();
/**
* 在插件被卸载时执行。
*/
void shutdown();
/**
* 用于加载用户数据的方法。<b>该方法将会被异步运行!</b>
* <br>该方法一般无需自行执行,见 {@link UserManager#loadData(UUID)}
* <br>
* <br>若不存在该用户的数据,请返回 null 。
* <br>若加载出现任何错误,请抛出异常。
*
* @param uuid 用户UUID
* @throws Exception 当出现任何错误时抛出
*/
@Nullable
UserData loadData(@NotNull UUID uuid) throws Exception;
/**
* 用于保存用户数据的方法。 <b>该方法将会被异步运行!</b>
* <br>该方法一般无需自行执行,见 {@link UserManager#saveData(UserData)}
*
* @param data 用户数据
* @throws Exception 当出现任何错误时抛出
*/
void saveUserData(@NotNull UserData data) throws Exception;
/**
@@ -1,12 +1,12 @@
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.easysql.EasySQL;
import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.lib.easysql.api.action.query.PreparedQueryAction;
import cc.carm.plugin.ultradepository.UltraDepository;
import cc.carm.plugin.ultradepository.data.UserData;
import cc.carm.plugin.ultradepository.util.DatabaseTable;
import cc.carm.plugin.ultradepository.util.DateIntUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -13,8 +13,10 @@ import cc.carm.plugin.ultradepository.data.UserData;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
@@ -24,7 +26,7 @@ public class DepositoryGUI extends GUI {
UserData userData;
Depository depository;
public DepositoryGUI(Player player, Depository depository) {
private DepositoryGUI(Player player, Depository depository) {
super(depository.getGUIConfiguration().getGUIType(), depository.getGUIConfiguration().getTitle());
this.player = player;
@@ -35,53 +37,53 @@ public class DepositoryGUI extends GUI {
}
public void setupItems() {
loadConfigItems();
loadDepositoryItems();
}
public void loadConfigItems() {
depository.getGUIConfiguration().setupItems(player, this);
}
public void loadDepositoryItems() {
depository.getItems().values().forEach(depositoryItem -> setItem(depositoryItem.getSlot(), createGUIItem(depositoryItem)));
}
private GUIItem createGUIItem(DepositoryItem item) {
DepositoryItemData itemData = userData.getItemData(item);
int canSell = item.getLimit() - itemData.getSold();
ItemStackFactory factory = new ItemStackFactory(item.getDisplayItem());
List<String> additionalLore = PluginConfig.General.ADDITIONAL_LORE.get(player, new Object[]{
item.getName(), itemData.getAmount(), item.getPrice(),
itemData.getSold(), canSell, item.getLimit()
});
additionalLore.forEach(factory::addLore);
List<String> clickLore = PluginConfig.General.CLICK_LORE.get(player, new Object[]{
item.getName(), itemData.getAmount(), item.getPrice()
});
clickLore.forEach(factory::addLore);
return new GUIItem(factory.toItemStack()) {
return new GUIItem(getItemIcon(player, userData, item)) {
@Override
public void onClick(ClickType type) {
DepositoryItemData itemData = userData.getItemData(item);
if (itemData.getAmount() < 1) {
PluginConfig.Sounds.SELL_FAIL.play(player);
PluginMessages.NO_ENOUGH_ITEM.send(player);
return;
}
if (type == ClickType.LEFT) {
if (canSell >= 1) {
if (canSell(item) && type == ClickType.LEFT) {
int sellableAmount = item.getLimit() - itemData.getSold();
if (sellableAmount >= 1) {
SellItemGUI.open(player, userData, itemData, depository, item);
} else {
PluginConfig.Sounds.SELL_FAIL.play(player);
PluginMessages.ITEM_SOLD_LIMIT.send(player, new Object[]{canSell, item.getLimit()});
PluginMessages.ITEM_SOLD_LIMIT.send(player, new Object[]{sellableAmount, item.getLimit()});
player.closeInventory();
}
} else if (type == ClickType.RIGHT) {
if (hasEmptySlot(player)) {
int pickupAmount = Math.min(itemData.getAmount(), item.getMaterial().getMaxStackSize());
userData.removeItemAmount(item.getDepository().getIdentifier(), item.getTypeID(), pickupAmount);
player.getInventory().addItem(item.getRawItem(pickupAmount));
PluginMessages.ITEM_PICKUP.send(player, new Object[]{
item.getName(), pickupAmount
int takeoutAmount = Math.min(itemData.getAmount(), item.getMaterial().getMaxStackSize());
userData.removeItemAmount(
item.getDepository().getIdentifier(), item.getTypeID(), takeoutAmount
);
player.getInventory().addItem(item.getRawItem(takeoutAmount));
PluginMessages.ITEM_TAKEOUT.send(player, new Object[]{
item.getName(), takeoutAmount
});
setupItems(); //刷新GUI
PluginConfig.Sounds.TAKEOUT.play(player);
setDisplay(getItemIcon(player, userData, item)); // 刷新物品显示
loadConfigItems(); // 更新配置中的其他物品
updateView();
} else {
PluginMessages.NO_SPACE.send(player);
@@ -92,12 +94,51 @@ public class DepositoryGUI extends GUI {
};
}
private boolean hasEmptySlot(Player player) {
public static boolean hasEmptySlot(Player player) {
return IntStream.range(0, 36)
.mapToObj(i -> player.getInventory().getItem(i))
.anyMatch(i -> i == null || i.getType() == Material.AIR);
}
public static ItemStack getItemIcon(@NotNull Player player,
@NotNull UserData userData,
@NotNull DepositoryItem item) {
DepositoryItemData itemData = userData.getItemData(item);
ItemStackFactory factory = new ItemStackFactory(item.getDisplayItem());
getExtraLore(player, itemData).forEach(factory::addLore);
return factory.toItemStack();
}
public static List<String> getExtraLore(@NotNull Player player,
@NotNull DepositoryItemData itemData) {
DepositoryItem item = itemData.getSource();
int canSell = item.getLimit() - itemData.getSold();
List<String> lore = new ArrayList<>();
if (canSell(item)) {
lore.addAll(PluginConfig.General.AdditionalLore.AVAILABLE_FOR_SALE.get(player, new Object[]{
item.getName(), itemData.getAmount(), item.getPrice(),
itemData.getSold(), canSell, item.getLimit()
}));
lore.addAll(PluginConfig.General.ClickLore.AVAILABLE_FOR_SALE.get(player, new Object[]{
item.getName(), itemData.getAmount(), item.getPrice()
}));
} else {
lore.addAll(PluginConfig.General.AdditionalLore.NOT_FOR_SALE.get(player, new Object[]{
item.getName(), itemData.getAmount()
}));
lore.addAll(PluginConfig.General.ClickLore.NOT_FOR_SALE.get(player, new Object[]{
item.getName(), itemData.getAmount()
}));
}
return lore;
}
public static boolean canSell(DepositoryItem item) {
return UltraDepository.getEconomyManager().isInitialized()
&& item.getLimit() > 0 && item.getPrice() > 0;
}
public static void open(@NotNull Player player, @NotNull Depository depository) {
player.closeInventory();
DepositoryGUI gui = new DepositoryGUI(player, depository);
@@ -15,6 +15,8 @@ import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.inventory.ItemStack;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import static cc.carm.plugin.ultradepository.configuration.PluginConfig.General.SellGUI.Items.*;
@@ -51,10 +53,11 @@ public class SellItemGUI extends GUI {
private void load(int amount) {
this.currentAmount = Math.max(1, amount); // 不可小于1
ItemStackFactory factory = new ItemStackFactory(this.itemDisplay);
List<String> additionalLore = PluginConfig.General.ADDITIONAL_LORE.get(player, new Object[]{
getItemName(), getReUltraDepositoryAmount(), getItemPrice(),
getSoldAmount(), (getSellLimit() - getSoldAmount()), getSellLimit()
});
List<String> additionalLore = PluginConfig.General.AdditionalLore.AVAILABLE_FOR_SALE
.get(player, new Object[]{
getItemName(), getDepositoryAmount(), getItemPrice(),
getSoldAmount(), (getSellLimit() - getSoldAmount()), getSellLimit()
});
additionalLore.forEach(factory::addLore);
setItem(9, getCurrentAmount() > 1000 ? getRemoveItem(1000) : null);
@@ -67,7 +70,7 @@ public class SellItemGUI extends GUI {
setItem(16, getAddableAmount() >= 100 ? getAddItem(100) : null);
setItem(17, getAddableAmount() >= 1000 ? getAddItem(1000) : null);
if (getCurrentAmount() >= 1) setItem(getConfirmItem(), 27, 28, 29, 30);
setItem(getCurrentAmount() >= 1 ? getConfirmItem() : null, 27, 28, 29, 30);
setItem(getCancelItem(), 32, 33, 34, 35);
}
@@ -104,7 +107,7 @@ public class SellItemGUI extends GUI {
})) {
@Override
public void onClick(ClickType type) {
int amount = Math.min(getCurrentAmount(), Math.min(getReUltraDepositoryAmount(), getSellLimit() - getSoldAmount()));
int amount = Math.min(getCurrentAmount(), Math.min(getDepositoryAmount(), getSellLimit() - getSoldAmount()));
if (amount > 0) UltraDepository.getEconomyManager().sellItem(player, userData, item, amount);
player.closeInventory();
}
@@ -138,10 +141,11 @@ public class SellItemGUI extends GUI {
}
private double getTotalMoney() {
return getCurrentAmount() * getItemPrice();
BigDecimal money = BigDecimal.valueOf(getCurrentAmount() * getItemPrice()).setScale(2, RoundingMode.DOWN);
return money.doubleValue();
}
private int getReUltraDepositoryAmount() {
private int getDepositoryAmount() {
return userData.getItemData(this.item).getAmount();
}
@@ -150,7 +154,7 @@ public class SellItemGUI extends GUI {
}
private int getAddableAmount() {
return Math.min(getReUltraDepositoryAmount(), getSellLimit() - getSoldAmount()) - getCurrentAmount();
return Math.min(getDepositoryAmount(), getSellLimit() - getSoldAmount()) - getCurrentAmount();
}
public static void open(Player player, UserData userData, DepositoryItemData itemData,
@@ -0,0 +1,77 @@
package cc.carm.plugin.ultradepository.util;
import cc.carm.lib.easysql.api.SQLManager;
import cc.carm.lib.easysql.api.action.PreparedSQLUpdateAction;
import cc.carm.lib.easysql.api.action.PreparedSQLUpdateBatchAction;
import cc.carm.lib.easysql.api.builder.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.sql.SQLException;
public class DatabaseTable {
private final @NotNull String tableName;
private final @NotNull String[] columns;
@Nullable String tableSettings;
public DatabaseTable(@NotNull String tableName, @NotNull String[] columns) {
this(tableName, columns, null);
}
public DatabaseTable(@NotNull String tableName, @NotNull String[] columns,
@Nullable String tableSettings) {
this.tableName = tableName;
this.columns = columns;
this.tableSettings = tableSettings;
}
public @NotNull String getTableName() {
return tableName;
}
public @NotNull String[] getColumns() {
return columns;
}
public @Nullable String getTableSettings() {
return tableSettings;
}
public int createTable(SQLManager sqlManager) throws SQLException {
TableCreateBuilder createAction = sqlManager.createTable(getTableName());
createAction.setColumns(getColumns());
if (getTableSettings() != null) createAction.setTableSettings(getTableSettings());
return createAction.build().execute();
}
public TableQueryBuilder createQuery(SQLManager sqlManager) {
return sqlManager.createQuery().inTable(getTableName());
}
public DeleteBuilder createDelete(SQLManager sqlManager) {
return sqlManager.createDelete(getTableName());
}
public UpdateBuilder createUpdate(SQLManager sqlManager) {
return sqlManager.createUpdate(getTableName());
}
public InsertBuilder<PreparedSQLUpdateAction> createInsert(SQLManager sqlManager) {
return sqlManager.createInsert(getTableName());
}
public InsertBuilder<PreparedSQLUpdateBatchAction> createInsertBatch(SQLManager sqlManager) {
return sqlManager.createInsertBatch(getTableName());
}
public ReplaceBuilder<PreparedSQLUpdateAction> createReplace(SQLManager sqlManager) {
return sqlManager.createReplace(getTableName());
}
public ReplaceBuilder<PreparedSQLUpdateBatchAction> createReplaceBatch(SQLManager sqlManager) {
return sqlManager.createReplaceBatch(getTableName());
}
}
@@ -0,0 +1,106 @@
package cc.carm.plugin.ultradepository.util;
import org.jetbrains.annotations.Nullable;
import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
@SuppressWarnings("ResultOfMethodCallIgnored")
public class JarResourceUtils {
public static final char JAR_SEPARATOR = '/';
public static @Nullable String[] readResource(@Nullable InputStream resourceStream) {
if (resourceStream == null) return null;
try (Scanner scanner = new Scanner(resourceStream, StandardCharsets.UTF_8.name())) {
List<String> contents = new ArrayList<>();
while (scanner.hasNextLine()) {
contents.add(scanner.nextLine());
}
return contents.toArray(new String[0]);
} catch (Exception e) {
return null;
}
}
public static void copyFolderFromJar(String folderName, File destFolder, CopyOption option)
throws IOException {
copyFolderFromJar(folderName, destFolder, option, null);
}
public static void copyFolderFromJar(String folderName, File destFolder,
CopyOption option, PathTrimmer trimmer) throws IOException {
if (!destFolder.exists())
destFolder.mkdirs();
byte[] buffer = new byte[1024];
File fullPath;
String path = JarResourceUtils.class.getProtectionDomain().getCodeSource().getLocation().getPath();
if (trimmer != null)
path = trimmer.trim(path);
try {
if (!path.startsWith("file"))
path = "file://" + path;
fullPath = new File(new URI(path));
} catch (URISyntaxException e) {
e.printStackTrace();
return;
}
ZipInputStream zis = new ZipInputStream(new FileInputStream(fullPath));
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
if (!entry.getName().startsWith(folderName + JAR_SEPARATOR))
continue;
String fileName = entry.getName();
if (fileName.charAt(fileName.length() - 1) == JAR_SEPARATOR) {
File file = new File(destFolder + File.separator + fileName);
if (file.isFile()) {
file.delete();
}
file.mkdirs();
continue;
}
File file = new File(destFolder + File.separator + fileName);
if (option == CopyOption.COPY_IF_NOT_EXIST && file.exists())
continue;
if (!file.getParentFile().exists())
file.getParentFile().mkdirs();
if (!file.exists())
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
int len;
while ((len = zis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
}
zis.closeEntry();
zis.close();
}
public enum CopyOption {
COPY_IF_NOT_EXIST, REPLACE_IF_EXIST
}
@FunctionalInterface
public interface PathTrimmer {
String trim(String original);
}
}
+10
View File
@@ -0,0 +1,10 @@
&6 _ _ _ _ &e _____ _ _
&6| | | | | | &e| __ \ (_) |
&6| | | | | |_ _ __ __ _&e| | | | ___ _ __ ___ ___ _| |_ ___ _ __ _ _
&6| | | | | __| '__/ _` &e| | | |/ _ \ '_ \ / _ \/ __| | __/ _ \| '__| | | |
&6| |__| | | |_| | | (_| &e| |__| | __/ |_) | (_) \__ \ | || (_) | | | |_| |
&6 \____/|_|\__|_| \__,_&e|_____/ \___| .__/ \___/|___/_|\__\___/|_| \__, |
&6 &e | | __/ |
&6 &e |_| |___/
&f请访问项目主页查看详细插件介绍 &8/ &fView GitHub to get more information
&8-> &6${project.url}
+30 -10
View File
@@ -11,6 +11,11 @@ debug: false
# 当然,您也可以选择在这里关闭,或在plugins/bStats下的配置文件中关闭。
metrics: true
# 检查更新设定
# 该选项用于插件判断是否要检查更新,若您不希望插件检查更新并提示您,可以选择关闭。
# 检查更新为异步操作,绝不会影响性能与使用体验。
check-update: true
# 存储相关配置
# 注意:存储配置不会通过重载指令生效,如有修改请重新启动服务器。
storage:
@@ -20,14 +25,14 @@ storage:
# 选择 yaml/json 存储方式时的存储路径
# 默认为相对路径,相对于插件生成的配置文件夹下的路径
# 支持绝对路径,如 “/var/data/ub/"(linux) 或 "D:\data\ub\"(windows)
# 支持绝对路径,如 “/var/data/ud/"(linux) 或 "D:\data\ud\"(windows)
# 使用绝对路径时请注意权限问题
file-path: data
# 选择 database 存储方式时的数据库配置
mysql:
# 数据库驱动路径
driver: "com.mysql.jdbc.Driver"
driver: "com.mysql.cj.jdbc.Driver"
url: "jdbc:mysql://127.0.0.1:3306/<db-name>"
table: "ud_data" # 插件表名,允许自定义
username: "username"
@@ -44,6 +49,7 @@ collect:
sounds:
collect: "ENTITY_EXPERIENCE_ORB_PICKUP:0.5"
takeout: "ENTITY_HORSE_ARMOR:0.5"
sell-success: "ENTITY_VILLAGER_CELEBRATE"
sell-fail: "ENTITY_VILLAGER_NO"
gui-click: "UI_BUTTON_CLICK"
@@ -51,20 +57,34 @@ sounds:
# 通用配置
general:
# 针对每一件物品的额外介绍
# 针对可出售物品的额外介绍
# 将添加到背包界面内的物品上,避免重复配置
additional-lore:
- " "
- "&f仓库内数量 &a%(amount)"
- "&f该物品单价 &a%(price)"
- "&f今日可出售 &a%(remain)&8/%(limit)"
available-for-sale:
# 可出售物品的介绍
- " "
- "&f仓库内数量 &a%(amount)"
- "&f该物品单价 &a%(price)"
- "&f今日可出售 &a%(remain)&8/%(limit)"
not-for-sale:
# 针对不可出售的物品的额外介绍
# (当 未安装经济插件 或 每日可售出数量<=0 或 单价<=0 时判断为不可出售)
- " "
- "&f仓库内数量 &a%(amount)"
# 提示玩家点击行为的介绍
# 将添加到背包界面内的物品上,避免重复配置
click-lore:
- " "
- "&a&l左键点击 &8| &f按量售出该物品"
- "&a&l键点击 &8| &f取出一组该物品"
available-for-sale:
- " "
- "&a&l键点击 &8| &f按量售出该物品"
- "&a&l右键点击 &8| &f取出一组该物品"
not-for-sale:
# 针对不可出售的物品的额外介绍
# (当 未安装经济插件 或 每日可售出数量<=0 或 单价<=0 时判断为不可出售)
- " "
- "&a&l右键点击 &8| &f取出一组该物品"
# 售出界面的配置
sell-gui:
+27 -8
View File
@@ -20,7 +20,7 @@ storage:
method: yaml
# The storage file path when choosing "yaml"/"json" method.
# Support absolute paths, e.g. “/var/data/ub/"(linux) or "D:\data\ub\"(windows)
# Support absolute paths, e.g. “/var/data/ud/"(linux) or "D:\data\ud\"(windows)
# **Be aware of permission issues when using absolute paths!**
file-path: data
@@ -52,17 +52,36 @@ general:
# Hints lore for the item's information
# Will add to items in BackpackGUI and SellGUI.
additional-lore:
- " "
- "&fAmount &a%(amount)"
- "&fPrice &a%(price)"
- "&fSold &a%(remain)&8/%(limit)"
available-for-sale:
- " "
- "&fAmount &a%(amount)"
- "&fPrice &a%(price)"
- "&fSold &a%(remain)&8/%(limit)"
not-for-sale:
# Display when :
# 1. Vault not installed
# 2. No economy plugins
# 3. daily sell limit <= 0
# 4. item price <=0
- " "
- "&fAmount &a%(amount)"
# Hints lore for the player's click
# Will add to items in BackpackGUI.
click-lore:
- " "
- "&a&lLEFT-CLICK &8| &fSell items"
- "&a&lRIGHT-CLICK &8| &fTake one Stack"
available-for-sale:
- " "
- "&a&lLEFT-CLICK &8| &fSell items"
- "&a&lRIGHT-CLICK &8| &fTake one Stack"
not-for-sale:
# Display when :
# 1. Vault not installed
# 2. No economy plugins
# 3. daily sell limit <= 0
# 4. item price <=0
- " "
- "&a&lRIGHT-CLICK &8| &fTake one Stack"
# Configuration of the SellGUI
sell-gui:
@@ -0,0 +1,48 @@
help:
console:
- '&6&l超级仓库 &f后台指令帮助'
- '&8#&f info &6<玩家> &e[仓库ID] &e[物品ID]'
- '&8-&7 得到玩家的相关物品信息。'
- '&8#&f add &6<玩家> &6<仓库ID> &6<物品ID> &6<数量>'
- '&8-&7 为玩家添加对应仓库中对于物品的数量。'
- '&8#&f remove &6<玩家> &6<仓库ID> &6<物品ID> &e[数量]'
- '&8-&7 为玩家减少对应仓库中对于物品的数量。'
- '&8-&7 若不填写数量,则清空对应仓库的对应物品。'
- '&8#&f sell &6<玩家> &e[仓库ID] &e[物品ID] &e[数量]'
- '&8-&7 为玩家售出相关物品。'
- '&8-&7 若不填写数量,则售出所有对应仓库的对应物品。'
- '&8-&7 若不填写物品,则售出对应仓库内所有物品。'
- '&8-&7 若不填写仓库,则售出所有仓库内所有物品。'
- '&8-&7 该指令受到玩家每日售出数量的限制。'
player:
- '&6&l超级仓库 &f玩家指令帮助'
- '&8#&f open &e[仓库ID]'
- '&8-&7 打开对应仓库的界面。'
- '&8#&f sell &6<仓库ID> &6<物品ID> &6<数量>'
- '&8-&7 售出对应数量的对应物品。'
- '&8-&7 该指令受到玩家每日售出数量的限制。'
- '&8#&f sellAll &e[仓库ID] &e[物品ID]'
- '&8-&7 该指令受到玩家每日售出数量的限制。'
item-sold:
- '&f您出售了 &r%(item)&7x%(amount) &f,共赚取 &6%(money) &f元。'
item-sold-limit:
- '&f该物品今日剩余可出售额度为 &a%(amount)&8/%(limit) &f个。'
item-pickup:
- '&f您拾取了 &r%(item)&7x%(amount) &f,已自动放入到您的仓库中。'
item-takeout:
- '&f您从仓库中拿取了 &r%(item)&7x%(amount) &f放入到您的背包中。'
item-collect:
- '&f您收集了 &r%(item)&7x%(amount) &f,已自动放入到您的 &6%(depository) &f中。'
item-collect-actionbar: '&r%(item)&7x%(amount) &f-> &6%(depository)'
no-space:
- '&f您背包内没有足够的空间取出物品!'
no-economy:
- '&f本服务器暂未启用出售功能。'
no-depository:
- '&f不存在该仓库,请检查仓库ID是否正确。'
no-item:
- '&f仓库中不存在该物品,请检查物品ID是否正确。'
no-enough-item:
- '&f仓库中不存在足够的物品。'
wrong-number:
- '&f数目输入错误,请输入正确的数字!'
+26 -8
View File
@@ -20,7 +20,7 @@ storage:
method: yaml
# The storage file path when choosing "yaml"/"json" method.
# Support absolute paths, e.g. “/var/data/ub/"(linux) or "D:\data\ub\"(windows)
# Support absolute paths, e.g. “/var/data/ud/"(linux) or "D:\data\ud\"(windows)
# **Be aware of permission issues when using absolute paths!**
file-path: data
@@ -52,17 +52,35 @@ general:
# Hints lore for the item's information
# Will add to items in BackpackGUI and SellGUI.
additional-lore:
- " "
- "&fAmount &a%(amount)"
- "&fPrice &a%(price)"
- "&fSold &a%(remain)&8/%(limit)"
available-for-sale:
- " "
- "&fAmount &a%(amount)"
- "&fPrice &a%(price)"
- "&fSold &a%(remain)&8/%(limit)"
not-for-sale:
# Display when :
# 1. Vault not installed
# 2. No economy plugins
# 3. daily sell limit <= 0
# 4. item price <=0
- " "
- "&fAmount &a%(amount)"
# Hints lore for the player's click
# Will add to items in BackpackGUI.
click-lore:
- " "
- "&a&lLEFT-CLICK &8| &fSell items"
- "&a&lRIGHT-CLICK &8| &fTake one Stack"
available-for-sale:
- " "
- "&a&lLEFT-CLICK &8| &fSell items"
- "&a&lRIGHT-CLICK &8| &fTake one Stack"
not-for-sale:
# Display when :
# 1. Vault not installed
# 2. No economy plugins
# 3. daily sell limit <= 0
# 4. item price <=0
- " "
- "&a&lRIGHT-CLICK &8| &fTake one Stack"
# Configuration of the SellGUI
sell-gui:
@@ -0,0 +1,48 @@
help:
console:
- '&6&l超级仓库 &f后台指令帮助'
- '&8#&f info &6<玩家> &e[仓库ID] &e[物品ID]'
- '&8-&7 得到玩家的相关物品信息。'
- '&8#&f add &6<玩家> &6<仓库ID> &6<物品ID> &6<数量>'
- '&8-&7 为玩家添加对应仓库中对于物品的数量。'
- '&8#&f remove &6<玩家> &6<仓库ID> &6<物品ID> &e[数量]'
- '&8-&7 为玩家减少对应仓库中对于物品的数量。'
- '&8-&7 若不填写数量,则清空对应仓库的对应物品。'
- '&8#&f sell &6<玩家> &e[仓库ID] &e[物品ID] &e[数量]'
- '&8-&7 为玩家售出相关物品。'
- '&8-&7 若不填写数量,则售出所有对应仓库的对应物品。'
- '&8-&7 若不填写物品,则售出对应仓库内所有物品。'
- '&8-&7 若不填写仓库,则售出所有仓库内所有物品。'
- '&8-&7 该指令受到玩家每日售出数量的限制。'
player:
- '&6&l超级仓库 &f玩家指令帮助'
- '&8#&f open &e[仓库ID]'
- '&8-&7 打开对应仓库的界面。'
- '&8#&f sell &6<仓库ID> &6<物品ID> &6<数量>'
- '&8-&7 售出对应数量的对应物品。'
- '&8-&7 该指令受到玩家每日售出数量的限制。'
- '&8#&f sellAll &e[仓库ID] &e[物品ID]'
- '&8-&7 该指令受到玩家每日售出数量的限制。'
item-sold:
- '&f您出售了 &r%(item)&7x%(amount) &f,共赚取 &6%(money) &f元。'
item-sold-limit:
- '&f该物品今日剩余可出售额度为 &a%(amount)&8/%(limit) &f个。'
item-pickup:
- '&f您拾取了 &r%(item)&7x%(amount) &f,已自动放入到您的仓库中。'
item-takeout:
- '&f您从仓库中拿取了 &r%(item)&7x%(amount) &f放入到您的背包中。'
item-collect:
- '&f您收集了 &r%(item)&7x%(amount) &f,已自动放入到您的 &6%(depository) &f中。'
item-collect-actionbar: '&r%(item)&7x%(amount) &f-> &6%(depository)'
no-space:
- '&f您背包内没有足够的空间取出物品!'
no-economy:
- '&f本服务器暂未启用出售功能。'
no-depository:
- '&f不存在该仓库,请检查仓库ID是否正确。'
no-item:
- '&f仓库中不存在该物品,请检查物品ID是否正确。'
no-enough-item:
- '&f仓库中不存在足够的物品。'
wrong-number:
- '&f数目输入错误,请输入正确的数字!'
+5 -1
View File
@@ -1,4 +1,4 @@
main: cc.carm.plugin.ultradepository.UltraDepository
main: cc.carm.plugin.ultradepository.Main
name: UltraDepository
version: ${project.version}
@@ -15,6 +15,10 @@ softdepend:
- PlaceholderAPI
- Vault
libraries:
- cc.carm.lib:easysql-beecp:${easysql.version}
- cc.carm.lib:githubreleases4j:${ghreleases.version}
commands:
"UltraDepository":
description: "超级仓库的主指令"
+20
View File
@@ -0,0 +1,20 @@
import cc.carm.lib.githubreleases4j.GithubRelease;
import cc.carm.lib.githubreleases4j.GithubReleases4J;
import org.junit.Test;
import java.util.List;
public class ReleasesTest {
@Test
public void onTest() {
List<GithubRelease> releases = GithubReleases4J.listReleases("CarmJos", "UltraDepository");
for (GithubRelease release : releases) {
System.out.println("#" + release.getID() + " (:" + release.getTagName() + ")" + " " + release.getName());
System.out.println("- " + release.getHTMLUrl());
}
}
}