PRD-027 任务系统
文档编号:PRD-027
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:ScenesServer、Lua 任务脚本、tbl/Quest.xml
1. 背景与目标
任务系统承担新手引导、主线叙事、日常活跃与资源投放。当前任务脚本分散、进度统计重复、链式任务断链后无法恢复。本 PRD 统一任务模板、进度事件与提交校验。
目标
- 支持主线、支线、日常、周常、活动、引导六类任务。
- 任务进度由统一事件驱动,避免每个任务单独写统计逻辑。
- 支持放弃、重新接取、自动寻路、批量提交。
2. 核心规则
2.1 任务类型
| 类型 | 可放弃 | 可重复 | 进度重置 |
|---|---|---|---|
| 主线 | 否 | 否 | 不重置 |
| 支线 | 是 | 否 | 不重置 |
| 日常 | 是 | 每日 | 每日 0 点 |
| 周常 | 是 | 每周 | 周一 0 点 |
| 活动 | 按配置 | 按活动 | 活动周期 |
| 引导 | 强制 | 否 | 不重置 |
2.2 任务结构
- 前置任务 / 前置等级 / 前置物品。
- 目标列表:杀怪、采集、对话、护送、使用物品、到达坐标、击杀 BOSS、完成副本。
- 奖励:经验、金币、绑定货币、物品、称号、声望。
- 后续任务:支持一键接取下一环。
2.3 进度规则
- 杀怪:同地图、同队伍范围内计数;召唤物击杀计入主人。
- 采集/使用:以服务端确认的物品消耗为准。
- 对话/到达:以服务端坐标校验为准,客户端寻路不作为完成依据。
- 副本:以副本结算事件为准,中途退出不计。
- 日常进度跨天保留未领取奖励,但不再累计新进度。
3. 服务端设计
3.1 模块职责
| 模块 | 职责 |
|---|---|
QuestManager | 接取、进度、提交、放弃、重置 |
EventBus | 接收杀怪/采集/对话/进入地图等事件 |
QuestScript | Lua 条件与奖励逻辑 |
RecordServer | 任务状态持久化 |
3.2 数据结构
struct QuestState {
uint32_t quest_id;
uint8_t status; // 可接/进行中/可提交/已完成
uint32_t accept_time;
std::vector<ObjectiveProgress> objectives;
};
struct ObjectiveProgress {
uint32_t objective_id;
uint32_t current;
uint32_t required;
};
3.3 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| C→S | CS_QuestAccept | 接取任务 |
| C→S | CS_QuestSubmit | 提交任务 |
| C→S | CS_QuestAbandon | 放弃任务 |
| C→S | CS_QuestTrack | 设置追踪 |
| S→C | SC_QuestList | 全量任务列表 |
| S→C | SC_QuestUpdate | 进度变化 |
| S→C | SC_QuestComplete | 可提交/已完成 |
| S→C | SC_QuestDialog | NPC 对话与选项 |
3.4 事件驱动
杀怪/采集/对话/进图事件
→ EventBus 分发
→ 遍历玩家进行中的任务
→ 匹配 objective_type + target_id
→ 增加进度(上限 = required)
→ 进度满 → 标记可提交 → SC_QuestUpdate/SC_QuestComplete
3.5 持久化与重置
- 任务状态写
RecordServer,登录时恢复。 - 日常/周常在跨天/跨周时重置进度与完成标记。
- 任务链断链(前置被删除)时,登录校验并补接当前可接任务。
- 提交奖励使用事务:扣任务状态、发奖、写日志同时成功。
4. 客户端设计
- 任务追踪栏:显示 3–5 条,可展开全部、取消追踪。
- 任务面板:可接/进行中/已完成分页,显示奖励预览。
- NPC 对话:支持选项、打字机效果、自动接取下一环。
- 自动寻路:点击任务目标自动寻路到 NPC/坐标,到达后由服务端校验。
- 提交提示:任务完成时头像旁显示可提交图标,点击自动寻路到交付 NPC。
5. 配置与数值
tbl/Quest.xml 字段:
| 字段 | 说明 |
|---|---|
id | 任务 ID |
type | 主线/支线/日常/周常/活动/引导 |
pre_quest | 前置任务 |
level_min / level_max | 等级范围 |
objectives | 目标列表(类型、目标 ID、数量) |
rewards | 奖励列表 |
next_quest | 后续任务 |
can_abandon | 是否可放弃 |
reset_type | daily/weekly/activity/none |
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 重复接取 | 幂等,返回已接取 |
| 背包满时提交 | 拒绝提交并提示清理背包,不扣任务状态 |
| 任务目标怪物被删除 | 登录校验,自动替换为可完成目标或标记异常 |
| 跨天时正在打怪 | 以事件结算时间判断归属日期 |
| 放弃后重新接取 | 进度清零,已消耗物品不返还 |
| 组队击杀 | 范围内队员均计数,距离超过 30 格不计 |
7. 埋点与运营
- 任务接取/完成/放弃率,卡点任务与平均耗时。
- 奖励产出统计,防止单人刷任务破坏经济。
- 后台可配置任务上下架、奖励倍率、重置时间。
8. 验收标准
- 六类任务均可接取、追踪、提交、放弃(按配置)。
- 杀怪/采集/对话/副本进度准确,不重复计数。
- 日常/周常跨天跨周正确重置。
- 背包满、断线、跨地图时任务状态不丢失。
- 任务链断链后可恢复或给出明确提示。
- 提交奖励与扣状态在同一事务内。