Files
OpenSourceTools/README.md

291 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# OpenSourceTools
开源 Minecraft 服务器工具包插件(Spigot / Paper),提供传送、称号、隐身、禁言、踢人 GUI、公告等常用服务器管理功能。
- **当前版本**:`2.1.0`
- **支持版本**:Minecraft **1.21.11**(Bukkit API `1.21.11-R0.1-SNAPSHOT`,`api-version: 1.21`)
- **协议**:[Apache License 2.0](LICENSE)
---
## 目录
- [功能特性](#功能特性)
- [环境要求](#环境要求)
- [安装](#安装)
- [命令列表](#命令列表)
- [权限](#权限)
- [PlaceholderAPI 变量](#placeholderapi-变量)
- [配置文件](#配置文件)
- [构建](#构建)
- [自动化测试](#自动化测试)
- [版本历史](#版本历史)
- [已知问题与限制](#已知问题与限制)
- [安全提醒](#安全提醒)
---
## 功能特性
### 命令系统(21 个注册命令)
| 功能分类 | 说明 |
|---|---|
| 基础恢复 | `/feed`(别名 `/eat`)恢复饱食度;`/heal` 恢复状态 |
| 出生点 | `/spawn` 返回主城;`/setspawn` 设置主城坐标 |
| 传送系统 | `/tpa` 发起传送请求(可点击同意/拒绝,60 秒超时);`/tpaaccept` 接受;`/tpadefuse` 拒绝 |
| 死亡回溯 | `/back` 返回死亡地点 |
| 游戏模式 | `/gamemode`(别名 `/gm`)切换创造/生存/冒险/旁观,支持数字与中文参数、Tab 补全、指定目标玩家 |
| 世界控制 | `/day` 一键天亮;`/sun` 一键晴天 |
| 玩家管理 | `/vanish`(别名 `/v`)隐身;`/fly` 飞行;`/mute` 禁言;`/unmute` 解除禁言;`/kick` 踢出(无参数时打开玩家头像踢人 GUI) |
| 服务器管理 | `/list`(别名 `/tps`)查看内存/TPS/在线列表;`/OSTReload` 重载插件;`/stop` 关闭服务器(支持自定义提示语) |
| 称号系统 | `/PlayerTitle`(别名 `/plt`)添加/删除玩家称号与后缀 |
| 内部命令 | `/testGUI`(插件作者测试用) |
### 事件系统(8 个监听器)
- **进服/退服公告**:区分管理员与普通玩家模板,支持 `%PlayerName%` 与 PlaceholderAPI 变量
- **彩色聊天**:按管理员/玩家开关控制,支持白名单;**彩色告示牌**:编辑时自动转换颜色代码
- **聊天管理**:聊天冷却(默认 3 秒)、重复消息防刷屏、屏蔽词拦截(拦截时通知在线管理员)
- **死亡记录**:死亡点自动记录,供 `/back` 使用
- **跨世界飞行保持**:切换世界后自动恢复飞行状态
### 定时任务(3 个)
- **TPA 超时检测**:每秒倒计时,60 秒未处理自动取消
- **TPA 执行检测**:定期执行已接受的传送请求
- **定时公告**:按配置间隔循环广播公告内容
### PlaceholderAPI 扩展
自动注册内部扩展,标识符 `OpenSourceTools`,提供 3 个变量(详见 [PlaceholderAPI 变量](#placeholderapi-变量))。
---
## 环境要求
| 项目 | 要求 |
|---|---|
| 服务器 | Spigot / Paper **1.21.11**(其他 1.21.x 版本理论可用,未测试) |
| Java | **21+**(本项目在 JDK 25 下编译与运行测试通过) |
| 前置插件 | **PlaceholderAPI**(硬依赖,缺失时插件无法启动) |
---
## 安装
1. 安装 [PlaceholderAPI](https://hangar.papermc.io/HelpChat/PlaceholderAPI) 前置插件。
2. 将构建产物 `OpenSourceTools-2.1.0.jar` 放入服务器 `plugins/` 目录。
3. 重启服务器,插件会自动生成 `plugins/OpenSourceTools/config.yml`。
4. 按需修改配置文件后使用 `/OSTReload` 重载。
> ⚠️ 插件在 `plugin.yml` 中声明了 `depend: [PlaceholderAPI]`,请确保 PAPI 已安装,否则插件不会加载。
---
## 命令列表
| 命令 | 别名 | 用法 | 权限 | 默认 |
|---|---|---|---|---|
| `/feed` | `/eat` | `/feed` | `OpenTools.default` | 所有人 |
| `/heal` | - | `/heal` | `OpenTools.default` | 所有人 |
| `/spawn` | - | `/spawn` | `OpenTools.default` | 所有人 |
| `/tpa` | - | `/tpa <玩家ID>` | `OpenTools.default` | 所有人 |
| `/back` | - | `/back` | `OpenTools.default` | 所有人 |
| `/tpaaccept` | - | `/tpaaccept <玩家ID>` | `OpenTools.default` | 所有人 |
| `/tpadefuse` | - | `/tpadefuse <玩家ID>` | `OpenTools.default` | 所有人 |
| `/tpaback` | - | `/tpaback` | `OpenTools.default` | 所有人 |
| `/PlayerTitle` | `/plt` | `/PlayerTitle help` | `OpenTools.default` | 所有人 |
| `/testGUI` | - | `/testGUI KickGUI` | `OpenTools.testGUI` | OP |
| `/OSTReload` | - | `/OSTReload` | `OpenTools.ostreload` | OP |
| `/stop` | - | `/stop [提示语]` | `OpenTools.stop` | OP |
| `/gamemode` | `/gm` | `/gamemode <模式> [玩家ID]` | `OpenTools.gamemode` | OP |
| `/sun` | - | `/sun` | `OpenTools.sun` | OP |
| `/setspawn` | - | `/setspawn` | `OpenTools.setspawn` | OP |
| `/day` | - | `/day` | `OpenTools.day` | OP || `/vanish` | `/v` | `/vanish [玩家ID]` | `OpenTools.vanish` | OP |
| `/fly` | - | `/fly [玩家ID]` | `OpenTools.fly` | OP |
| `/mute` | - | `/mute <玩家ID>` | `OpenTools.mute` | OP |
| `/unmute` | - | `/unmute <玩家ID>` | `OpenTools.unmute` | OP |
| `/kick` | - | `/kick [玩家ID] [理由]` | `OpenTools.kick` | OP |
| `/list` | `/tps` | `/list` | `OpenTools.list` | OP |
`/PlayerTitle` 子命令:
```
/PlayerTitle help
/PlayerTitle addTitle <玩家ID> <称号>
/PlayerTitle addSuffix <玩家ID> <后缀>
/PlayerTitle delTitle <玩家ID>
/PlayerTitle delSuffix <玩家ID>
```
`/gamemode` 模式参数支持:`0/生存/survival`、`1/创造/creative`、`2/冒险/adventure`、`3/旁观/spectator`。
---
## 权限
| 权限节点 | 默认 | 说明 |
|---|---|---|
| `OpenTools.default` | 所有人 | 默认命令权限(feed/heal/spawn/tpa/back/称号等) |
| `OpenTools.kick` | OP | /kick |
| `OpenTools.mute` | OP | /mute |
| `OpenTools.unmute` | OP | /unmute |
| `OpenTools.fly` | OP | /fly |
| `OpenTools.vanish` | OP | /vanish |
| `OpenTools.ostreload` | OP | /OSTReload |
| `OpenTools.sun` | OP | /sun |
| `OpenTools.stop` | OP | /stop |
| `OpenTools.gamemode` | OP | /gamemode |
| `OpenTools.setspawn` | OP | /setspawn |
| `OpenTools.day` | OP | /day |
| `OpenTools.list` | OP | /list |
| `OpenTools.testGUI` | OP | /testGUI |
---
## PlaceholderAPI 变量
| 变量 | 说明 | 示例输出 |
|---|---|---|
| `%OpenSourceTools_Nick%` | 玩家昵称(未设置时显示游戏 ID) | `Steve` |
| `%OpenSourceTools_Title%` | 玩家称号(未设置时为空) | `§7[管理员§7]§f` |
| `%OpenSourceTools_Suffix%` | 玩家后缀(未设置时为空) | `§7[后缀§7]` |
---
## 配置文件
首次启动自动生成 `plugins/OpenSourceTools/config.yml`,关键配置项:
```yaml
ServerName: "ServerName" # 服务器名字
DefaultStopMessage: "StopServerText" # 默认关服提示
PlayerJoinServerMessage: "&7[&f&l玩家&7]&e%PlayerName%&a进入了服务器" # 进服公告
AdminJoinServerMessage: "&7[&d&l管理员&7]&e%PlayerName%&a进入了服务器" # 管理员进服公告
ColorChatSetting:
AllowAdminUsedColorChat: true # 允许管理员彩色聊天
AllowPlayerUsedColorChat: true # 允许玩家彩色聊天
AllowPlayers: [] # 无视开关的白名单
ColorSignSetting:
AllowAdminUsedColorSign: true # 允许管理员彩色告示牌
AllowPlayerUsedColorSign: true # 允许玩家彩色告示牌
SpawnSetting: # 主城坐标(/setspawn 自动写入)
WorldName: world
locationX: 0.5
locationY: 80.0
locationZ: 0.5
TimeMessageSetting: # 定时公告
TimeMessage: true # 是否启用
TimeMessageTime: 60 # 间隔(秒)
Message:
- "Text-1"
FeedCommandSetting: # /feed 开关
AllowAdminUsedFeedCommand: true
AllowPlayerUsedFeedCommand: false
ChatSetting:
ChatTime: 3 # 聊天冷却(秒)
AntiKeyWords: # 屏蔽词列表(精确匹配整句)
- xxx1
```
---
## 构建
### 环境
- JDK 8+(编译目标为 Java 8 字节码;本仓库使用 JDK 25 验证)
- Maven 3.8+
### 构建命令
```bash
mvn clean package
```
构建产物:`target/OpenSourceTools-2.1.0.jar`(shade 打包,含 JetBrains Annotations)。
> 网络提示:若访问 Maven Central 缓慢,可使用项目自带的阿里云镜像设置:
>
> ```bash
> mvn -s tools/smoke-test/maven-settings.xml clean package
> ```
---
## 自动化测试
项目内置了基于 **Paper 1.21.11** 实机启动的自动化测试设施(`tools/smoke-test/`):
| 脚本 | 用途 |
|---|---|
| `run-smoke-test.ps1` | 全自动冒烟测试:临时启动服务器 → 校验插件加载/PAPI 扩展注册 → 优雅停止 → 断言日志,输出 PASS/FAIL |
| `start-test-server.ps1` | 启动一个**持续运行**的交互式测试服务器(端口 25565、离线模式),在独立控制台窗口等待玩家连接 |
使用前需将测试制品放入缓存目录 `%USERPROFILE%\.ost-smoke-cache\`:
- `paper-1.21.11-132.jar`([PaperMC Fill API](https://fill.papermc.io/) 下载,SHA256 `5ffef465eeeb5f2a3c23a24419d97c51afd7dbb4923ff42df9a3f58bba1ccfba`)
- `PlaceholderAPI-2.12.3.jar`(官方发行版,[Modrinth](https://modrinth.com/plugin/placeholderapi) 下载)
```powershell
# 一键冒烟测试(自动启停)
powershell -NoProfile -ExecutionPolicy Bypass -File tools/smoke-test/run-smoke-test.ps1
# 启动交互式测试服务器(等待玩家连接,手动关闭)
powershell -NoProfile -ExecutionPolicy Bypass -File tools/smoke-test/start-test-server.ps1
```
---
## 版本历史
| 版本 | 日期 | 变更 |
|---|---|---|
| `dev-mc-1.21.11`(分支) | 2026-11-09 | 修复 10 项已知代码问题(禁言生效、/heal 血量恢复、/kick 自我检查、控制台解禁、注册 /tpaback、NPE 防护、屏蔽词包含匹配、PAPI 缺失优雅退出、权限节点统一) |
| `2.1.0` | 2026-11-09 | 升级 Bukkit API 至 **1.21.11**;`api-version` 提升至 `1.21`;声明 `depend: [PlaceholderAPI]` 保证加载顺序;补充自动化冒烟测试设施 |
| `2.0` | 2025 | 初版(Spigot API 1.20) |
---
## 已知问题与限制
以下问题已在 **`dev-mc-1.21.11` 分支修复**:
1. ✅ 禁言不生效 → 聊天事件现在检查 `MutePlayerList`,被禁言玩家无法发言。
2. ✅ `/heal` 恢复饱食度 + 配置键大小写不匹配 → 现在恢复生命值并使用正确的 `HealCommandSetting` 配置键。
3. ✅ `/kick` 无法阻止踢出自己 → 自我检查改为与命令发送者比较。
4. ✅ 控制台 `/unmute` 无效 → 解禁分支由 `add` 修正为 `remove`。
5. ✅ `/tpaback` 未注册 → 已注册命令与权限(返回 TPA 传送前位置)。
6. ✅ 多处空指针风险(重生事件、/tpaback、跨世界飞行检查)→ 已加空值保护。
7. ✅ 跨世界飞行权限节点错误(`OpenSourceTools.FLY`)→ 改为正确的 `OpenTools.fly`。
8. ✅ 屏蔽词仅整句精确匹配 → 改为包含匹配(忽略大小写)。
9. ✅ 缺失 PlaceholderAPI 时 `System.exit(0)` 强杀整个 JVM → 改为优雅禁用插件。
10. ✅ 权限声明不一致(OSTReload/day)→ 已统一权限节点。
### 仍存在的限制
- **状态仅存内存**:TPA 请求、聊天冷却、死亡点、隐身/飞行状态保存在内存中,服务器重启后丢失(如需持久化请提 Issue 讨论方案)。
- `/kick` 踢人 GUI 与命令的自我踢出/管理员保护逻辑按现有设计保留。
---
## 安全提醒
- 仓库根目录的 `build.txt` 内含 Jenkins 构建服务器 Token,属于**敏感信息泄露**,建议立即吊销该 Token 并将文件从仓库移除。
- 玩家加入时其 IP 地址会输出到服务器控制台日志,如介意请自行移除 `PlayerJoin_Event.java` 中的相关代码。
---
## 许可证
本项目采用 [Apache License 2.0](LICENSE)。