# 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` 中版本号已递增。