Files
AuQuestEngine/README.md
2026-06-04 07:06:43 +08:00

348 lines
8.6 KiB
Markdown
Raw 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.
# AuQuestEngine
AuQuestEngine 是一个面向 Paper / Spigot 服务端的任务系统插件,用于通过配置文件定义任务、任务目标、接取条件、完成提示和奖励命令。
当前插件版本:`1.0.6`
## 1. 功能概览
- 支持每日、每周、每月、长期任务。
- 支持 YAML、SQLite、MySQL 三种玩家任务数据存储方式。
- 支持任务接取条件:玩家等级、前置已完成任务、指定世界。
- 支持多种 Bukkit 事件任务目标,例如破坏方块、放置方块、合成、拾取、击杀、钓鱼、村民交易、打开菜单等。
- 支持 PlaceholderAPI 变量。
- 支持 Citizens、MythicMobs、CustomFishing、CustomCrops 等前置插件的扩展任务监听。
- 支持任务完成后执行控制台奖励命令。
## 2. 运行环境
```text
Java: 21
服务端: Paper 1.21.11
构建工具: Maven
```
前置插件:
```yml
softdepend:
- Citizens
- MythicMobs
- PlaceholderAPI
- CustomFishing
- CustomCrops
```
这些前置不是全部必装。未安装对应插件时,相关任务监听器不会注册。
## 3. 安装方式
构建插件:
```bash
mvn package
```
构建完成后,将生成的插件包放入服务端:
```text
plugins/AuQuestEngine-1.0-SNAPSHOT.jar
```
启动服务端后,插件会生成基础配置文件。任务文件需要放在:
```text
plugins/AuQuestEngine/Quests/
```
## 4. 配置文件
`config.yml` 用于配置存储方式和部分任务类型识别列表。
```yml
Storage:
Type: yaml # yaml / sqlite / mysql
SQLite:
File: PlayerData.db
SaveInterval: 10
MySQL:
Host: localhost
Port: 3306
Database: quest
Username: root
Password: root
TablePrefix: AuQuest_
Pool:
MaximumPoolSize: 10
MinimumIdle: 2
ConnectionTimeout: 10000
IdleTimeout: 600000
MaxLifetime: 1800000
```
存储说明:
- `yaml`:玩家数据保存为单独 YAML 文件,适合小型服务器。
- `sqlite`:玩家数据保存到本地 SQLite 数据库。
- `mysql`:玩家数据保存到 MySQL适合多实例或长期运营环境。
插件包已包含 SQLite JDBC、MySQL Connector/J 和 HikariCP。
## 5. 任务文件格式
任务文件可以放在 `plugins/AuQuestEngine/Quests/` 目录下,文件名不限,后缀必须是 `.yml`
示例:
```yml
quest_1:
display_name: "&a[初级] 新手成长之路"
description:
- "&7完成基础生存挑战任务"
- "&7砍伐指定木材熟悉资源收集"
type: DAILY
messages:
receive:
- "&a你接受了任务&f新手成长之路"
complete:
- "&a任务完成&f新手成长之路"
- "&7奖励已发放请继续成长。"
conditions:
level: 0
completed_quests: []
worlds: []
tasks:
id_1:
type: BREAK_BLOCK
display_name: "砍伐云杉木 * 128"
amount: 128
targets:
- SPRUCE_LOG
- SPRUCE_WOOD
- STRIPPED_SPRUCE_LOG
- STRIPPED_SPRUCE_WOOD
rewards:
commands:
- "dlevel give %player% 12000"
- "points give %player% 5"
messages:
- "&a{name} 任务已完成"
```
字段说明:
- `display_name`:任务显示名称。
- `description`:任务描述。
- `type`:任务类型,可用 `DAILY``WEEKLY``MONTHLY``FIXED`
- `messages.receive`:接取任务后发送给玩家的消息。
- `messages.complete`:完成任务后发送给玩家的消息。
- `conditions.level`:最低等级要求。
- `conditions.completed_quests`:前置已完成任务 ID 列表。
- `conditions.worlds`:允许推进任务的世界列表,留空表示不限制。
- `tasks`:任务目标列表。
- `rewards.commands`:完成后由控制台执行的命令,使用 `%player%` 替换玩家名。
- `rewards.messages`:奖励提示,支持 `{name}` 替换任务名称。
## 6. 任务类型
常用任务类型:
```text
BREAK_BLOCK 破坏方块
PLACE_BLOCK 放置方块
CRAFT_ITEM 合成物品
PICKUP_ITEM 拾取物品
FISH_ITEM 钓鱼获得物品
FISH_STAR 钓起鱼的星级
PLACE_BUCKET 倒水、倒岩浆、放置粉雪
FILL_BUCKET 装水、装岩浆、装牛奶
HARVEST_CROP 收获农作物
EXP_GAIN 获取经验
BREED 繁殖动物
COLLECT_ENTITY 剪羊毛、取蘑菇煲
COLLECT_BLOCK 收集蜂蜜
TAME_ENTITY 驯服实体
VILLAGER_TRADE_ITEM 村民交易物品
VILLAGER_TRADE_JOB 村民职业交易
BREW_POTION 酿造药水
BREW_POTION_COUNT 酿造药水次数
USE_ANVIL 使用铁砧
ENCHANT_ITEM 附魔物品
FEED_ANIMAL 喂动物
FEED_PLAYER 玩家食用物品
SMELT_ORE 烧制矿物
SMELT_FOOD 烧制食物
INTERACT_NPC 交互 Citizens NPC
INTERACT_ENTITY 交互实体
INTERACT_ITEM 交互手持物品
SEND_COMMAND 发送命令
SEND_CHAT 发送聊天
OPEN_GUI_TITLE 打开指定标题菜单
OPEN_GUI_TYPE 打开指定类型菜单
KILL_TYPE 击杀原版实体
KILL_MYTHIC 击杀 MythicMobs 实体
```
预留类型存在于枚举中,但未必已有完整监听实现。配置任务前应确认对应监听器已实现。
## 7. 玩家命令
查看任务信息:
```text
/aquest info
```
管理员查看指定在线玩家任务信息:
```text
/aquest info <玩家名>
```
给玩家发放任务:
```text
/aquest js <任务ID> <玩家名>
```
OP 玩家直接完成自身任务:
```text
/aquest direc <任务ID>
```
## 8. 管理命令
管理命令需要权限:
```text
admin.use
```
重载配置、语言和任务:
```text
/aquestadmin reload
```
开关调试输出:
```text
/aquestadmin debug
```
清空指定玩家任务数据:
```text
/aquestadmin clear <玩家名>
```
SQLite 数据导出为 YAML
```text
/aquestadmin outsqlite
```
## 9. PlaceholderAPI 变量
插件标识:
```text
aquest
```
任务名称:
```text
%aquest_quest_<任务ID>_name%
```
任务是否完成:
```text
%aquest_quest_<任务ID>_completed%
```
任务总进度:
```text
%aquest_quest_<任务ID>_progress%
```
指定任务目标进度:
```text
%aquest_task_<任务ID>_<任务目标ID>%
```
示例:
```text
%aquest_quest_quest_1_name%
%aquest_quest_quest_1_progress%
%aquest_task_quest_1_id_1%
```
## 10. API 调用
其他插件可以通过 `AuQuestAPI` 查询或操作玩家任务。
```java
UUID uuid = player.getUniqueId();
boolean started = AuQuestAPI.startQuest(uuid, "quest_1");
boolean completed = AuQuestAPI.hasCompletedQuest(uuid, "quest_1");
boolean active = AuQuestAPI.hasActiveQuest(uuid, "quest_1");
List<String> activeQuests = AuQuestAPI.getActiveQuests(uuid);
List<String> completedQuests = AuQuestAPI.getCompletedQuests(uuid);
AuQuestAPI.directCompleteQuest(uuid, "quest_1");
AuQuestAPI.abandonQuest(uuid, "quest_1");
```
常用方法:
- `getQuestDisplayName(String questId)`
- `getQuestDescription(String questId)`
- `getQuestType(String questId)`
- `hasCompletedQuest(UUID uuid, String questId)`
- `hasActiveQuest(UUID uuid, String questId)`
- `getActiveQuests(UUID uuid)`
- `getCompletedQuests(UUID uuid)`
- `startQuest(UUID uuid, String questId)`
- `abandonQuest(UUID uuid, String questId)`
- `directCompleteQuest(UUID uuid, String questId)`
## 11. 自动刷新规则
任务刷新按任务类型处理:
- `DAILY`:每日 00:00 后刷新。
- `WEEKLY`:每周一 00:00 后刷新。
- `MONTHLY`:每月 1 日 00:00 后刷新。
- `FIXED`:长期任务,不参与周期刷新。
刷新时会清理对应类型任务的历史进度,并同步在线玩家缓存。
## 12. 使用流程
1. 将插件 jar 放入服务端 `plugins` 目录。
2. 启动服务端生成配置文件。
3. 根据需要选择 `yaml``sqlite``mysql` 存储。
4.`plugins/AuQuestEngine/Quests/` 下创建任务配置文件。
5. 执行 `/aquestadmin reload` 重载任务。
6. 使用 `/aquest js <任务ID> <玩家名>` 给玩家发放任务。
7. 玩家完成目标后自动累计进度。
8. 任务完成后自动发送完成消息并执行奖励命令。
## 13. 注意事项
- 修改任务文件后需要执行 `/aquestadmin reload`
- 数据库模式切换前应先备份旧数据。
- MySQL 模式需要确认数据库、账号和权限正确。
- CustomFishing、CustomCrops、Citizens、MythicMobs 未安装时,对应任务类型不会生效。
- 任务目标 `targets` 必须与监听器传入的目标字符串一致,原版方块和物品通常使用 Bukkit 枚举名。
- 任务奖励命令由控制台执行,配置前应确认命令不会被重复领取滥用。
- 发布新版本前应确认 `plugin.yml` 中版本号已递增。