character_queststatus 任务进度表
记录角色所有已接取任务的状态和进度数据
官方文档来源表概述
character_queststatus 表是 Characters 数据库中的核心任务追踪表,记录每个角色的所有已接取任务的总状态和完成进度。它是 QuestSystem 的重要组成部分。
每行数据代表一个角色的一个任务进度。通过 status 字段的位标志系统,可以精确表示任务的各种状态(已接取、已完成、已失败、已奖励)。而 mobcount 和 itemcount 字段 则记录任务目标的完成进度。
与该表相关的还有 character_queststatus_rewarded(已完成并领奖的任务)、character_queststatus_daily(日常任务重置时间)等子表。
character_queststatus 使用联合主键 (guid, quest),每个角色每任务只有一条记录。所有任务目标进度都浓缩在这一行数据中。
表结构
| 字段名 | 类型 | 说明 |
|---|---|---|
| guid | INT UNSIGNED | 角色全局唯一标识符(联合主键) |
| quest | INT UNSIGNED | 任务ID(联合主键,对应 quest_template.entry) |
| status | TINYINT UNSIGNED | 任务状态位标志 |
| explored | TINYINT UNSIGNED | 探索进度位标志(每bit代表一个探索区域) |
| timer | INT UNSIGNED | 限时任务的剩余时间(秒),普通任务为0 |
| mobcount1 | SMALLINT UNSIGNED | 击杀目标1的当前进度 |
| mobcount2 | SMALLINT UNSIGNED | 击杀目标2的当前进度 |
| mobcount3 | SMALLINT UNSIGNED | 击杀目标3的当前进度 |
| mobcount4 | SMALLINT UNSIGNED | 击杀目标4的当前进度 |
| itemcount1 | SMALLINT UNSIGNED | 收集物品1的当前进度 |
| itemcount2 | SMALLINT UNSIGNED | 收集物品2的当前进度 |
| itemcount3 | SMALLINT UNSIGNED | 收集物品3的当前进度 |
| itemcount4 | SMALLINT UNSIGNED | 收集物品4的当前进度 |
| itemcount5 | SMALLINT UNSIGNED | 收集物品5的当前进度 |
| itemcount6 | SMALLINT UNSIGNED | 收集物品6的当前进度 |
| playercount | SMALLINT UNSIGNED | 当前满足任务条件要求的玩家数量 |
核心字段说明
status 字段位标志详解
| 标志值 | 枚举常量 | 含义 |
|---|---|---|
| 0 | QUEST_STATUS_NONE | 未接取(实际上不会有此记录) |
| 1 | QUEST_STATUS_COMPLETE | 任务目标已达成,等待交任务 |
| 2 | QUEST_STATUS_UNAVAILABLE | 任务不可用 |
| 4 | QUEST_STATUS_FAILED | 任务失败(限时任务超时) |
| 8 | QUEST_STATUS_REWARDED | 已领取奖励(完成后从本表删除) |
| 32 | QUEST_STATUS_COMPLETE_WITH_FLAGS | 标记为完成 |
正在进行的任务 status 通常为 0(已接取但未完成);目标达成的任务 status 为 1(等待交任务)。
explored 探索标记
explored 字段使用位运算记录探索区域的状态。每个 bit 代表一个探索点。如果任务要求探索 3 个区域,Bit0、Bit1、Bit2 分别代表三个区域是否已被探索。
例如 explored = 7 (0b00000111) 表示 Bit0、Bit1、Bit2 均为 1,三个探索区域全部完成。
mobcount 和 itemcount 计数
系统支持每个任务最多4种击杀目标和6种收集物品。对应关系由 quest_template 的 RequiredNpcOrGo 和 RequiredItemId 字段定义。
实际案例
查询某角色所有正在进行中的任务
-- 查询状态为0(未完成)的任务及其击杀进度
SELECT quest, status, mobcount1, mobcount2, itemcount1, itemcount2
FROM character_queststatus
WHERE guid = 1 AND status = 0;查看某个任务的详细进度
-- 查看指定角色的某个任务完整进度
SELECT c.name, qs.quest, qs.status, qs.explored, qs.timer,
qs.mobcount1, qs.mobcount2, qs.mobcount3, qs.mobcount4,
qs.itemcount1, qs.itemcount2, qs.itemcount3, qs.itemcount4
FROM character_queststatus qs
JOIN characters c ON c.guid = qs.guid
WHERE c.name = '玩家名字' AND qs.quest = 12345;清除某个角色的所有任务数据
-- 重置角色任务状态(慎用!会丢失所有任务进度)
DELETE FROM character_queststatus WHERE guid = 1;
DELETE FROM character_queststatus_rewarded WHERE guid = 1;
DELETE FROM character_queststatus_daily WHERE guid = 1;常见问题
Q1: status 字段的值为0时代表什么状态?
status=0 表示任务已接取但目标尚未全部达成,玩家正在完成中。这不是"未接取",因为未接取的任务根本不会在 character_queststatus 中有记录。
Q2: 如何区分"已放弃"和"已完成待交"的任务?
已放弃的任务会从 character_queststatus 表中删除记录。status=1 表示任务目标已达成,等待找NPC交任务。status=4 表示限时任务超时失败(记录不会被自动删除)。
Q3: mobcount 字段最多只能记录4种怪物,如果任务需要击杀超过4种怎么办?
魔兽世界官方任务设计限制每个任务最多4种击杀目标。如果确实需要更多种类,通常会拆分为多个子任务,或使用任务事件触发器(SmartAI)来间接实现。