feat: CraftBank Folia 1.21.8 经济与银行核心插件初始实现

实现完整的现金/钱包、银行卡、支票、活期储蓄与定期存款系统,
实现并以 Highest 优先级注册 Vault Economy 接口,接入 PlaceholderAPI。
全程遵循 Folia 调度模型(AsyncScheduler / 实体区域线程),
数据缓存线程安全,支票兑现与定期领取做防刷处理。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Purpur Build
2026-06-29 18:16:06 +08:00
parent 6a5ee9906b
commit eddc706c9a
36 changed files with 3775 additions and 0 deletions
+101
View File
@@ -0,0 +1,101 @@
# 🏦 CraftBank(工艺银行)
> 适用于 **Folia 1.21.8** 的全能经济与银行核心插件 —— 旨在完全替代 XConomy 等传统经济插件。
[![Folia](https://img.shields.io/badge/Folia-1.21.8-blue)](https://papermc.io/software/folia)
[![Java](https://img.shields.io/badge/Java-21%2B-orange)](https://adoptium.net/)
[![Vault](https://img.shields.io/badge/Vault-required-green)](https://www.spigotmc.org/resources/vault.34315/)
CraftBank 内置完善的「个人钱包 / 现金」系统,并引入深度模拟的银行系统:实体银行卡、可交易支票、活期储蓄与严格的定期存款(带利息)。全程遵循 **Folia 多核服务端**的线程模型,使用 `AsyncScheduler` / `GlobalRegionScheduler` / `RegionScheduler` 调度,绝不使用已弃用的 `Bukkit.getScheduler()`
---
## ✨ 核心功能
| 模块 | 说明 |
|------|------|
| 💵 **核心经济** | 每位玩家独立现金账户;实现 Vault `Economy` 接口并以 `Highest` 优先级注册,接管全服扣款 |
| 💳 **银行卡** | 实体物品,PDC 绑定 UUID + 序列号;右键指定方块开柜;丢失可挂失补办(旧卡作废)|
| 📜 **支票** | `/cheque <金额>` 具现化为可流通实体物品;右键兑现入钱包;PDC 防伪 + 防刷 |
| 💰 **活期储蓄** | 存取自由,按真实时间戳逐日复利结算(含离线补偿,带封顶)|
| ⏳ **定期存款** | 7/15/30 天可选,到期前**任何情况不可提前支取**;到期本息自动入活期 |
---
## 🛠️ 依赖
- **必须**[Vault](https://www.spigotmc.org/resources/vault.34315/)CraftBank 作为其 Service Provider 注入)
- **可选**[PlaceholderAPI](https://www.spigotmc.org/resources/placeholderapi.6245/)
> MySQL 驱动默认未内置;若使用 MySQL,请将驱动放入服务端 `libraries`,或在 `build.gradle.kts` 中取消相应依赖注释后自行打包。
---
## 💻 指令与权限
### 基础经济(所有人)
| 指令 | 说明 |
|------|------|
| `/money [玩家]` | 查看现金余额(查他人需 `craftbank.money.others`|
| `/pay <玩家> <金额>` | 现金转账 |
| `/baltop [页码]` | 现金排行榜 |
### 银行玩家(`craftbank.use`
| 指令 | 说明 |
|------|------|
| `/bank open` | 打开银行 GUI(可配置是否允许)|
| `/bank card apply` | 申请新银行卡 |
| `/bank card revoke` | 挂失并作废当前银行卡 |
| `/bank deposit <金额>` | 现金 → 活期 |
| `/bank withdraw <金额>` | 活期 → 现金 |
| `/cheque <金额>` | 开具支票 |
### 管理员(`craftbank.admin`
| 指令 | 说明 |
|------|------|
| `/bankadmin reload` | 重载配置 |
| `/bankadmin give/take/set <玩家> <金额>` | 增加 / 扣除 / 设置现金 |
| `/bankadmin setinterest <savings\|term_7d\|term_15d\|term_30d> <利率>` | 动态修改利率 |
---
## 🔌 PlaceholderAPI 变量
| 变量 | 含义 |
|------|------|
| `%craftbank_cash%` | 现金(纯数字)|
| `%craftbank_cash_formatted%` | 现金(含货币符号)|
| `%craftbank_bank_saving%` | 活期(纯数字)|
| `%craftbank_bank_saving_formatted%` | 活期(含货币符号)|
---
## ⚙️ 配置文件
详见生成的 `config.yml`,涵盖:数据库(SQLite/MySQL)、货币设置、利率(活期 / 各定期)、银行交互方块、银行卡与支票的自定义材质 / CustomModelData / 名称 / Lore、以及全部消息文案。
---
## 🔨 从源码构建
```bash
# 需要 JDK 21+(已用 JDK 25 验证通过)
./gradlew shadowJar
```
产物位于 `build/libs/CraftBank-<version>.jar`,已内置 SQLite 与 HikariCP 驱动,可直接丢进 `plugins/` 目录。
---
## 🤖 Folia 线程安全设计
- **后台任务**(数据库、`/baltop` 排序、利息扫描)走 `AsyncScheduler`
- **玩家相关操作**(扣物品、开 GUI、发消息)从异步切回时调度到 `player.getScheduler()`(实体区域线程)。
- 经济数据缓存使用 `ConcurrentHashMap`,单账户余额变更用 `synchronized` 保证原子,抵御来自其它插件异步线程(经 Vault)的并发刷钱。
- 支票兑现在玩家区域线程独占操作物品栏;定期领取用数据库 `UPDATE ... WHERE claimed = 0` 原子置位防重复发放。
---
## 📄 许可证
见 [LICENSE](LICENSE)。