diff --git a/README.md b/README.md new file mode 100644 index 0000000..b948689 --- /dev/null +++ b/README.md @@ -0,0 +1,347 @@ +# 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 activeQuests = AuQuestAPI.getActiveQuests(uuid); +List 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` 中版本号已递增。