character_queststatus 任务进度表

记录角色所有已接取任务的状态和进度数据

官方文档来源

表概述

character_queststatus 表是 Characters 数据库中的核心任务追踪表,记录每个角色的所有已接取任务的总状态和完成进度。它是 QuestSystem 的重要组成部分。

每行数据代表一个角色的一个任务进度。通过 status 字段的位标志系统,可以精确表示任务的各种状态(已接取、已完成、已失败、已奖励)。而 mobcount 和 itemcount 字段 则记录任务目标的完成进度。

与该表相关的还有 character_queststatus_rewarded(已完成并领奖的任务)、character_queststatus_daily(日常任务重置时间)等子表。

character_queststatus 使用联合主键 (guid, quest),每个角色每任务只有一条记录。所有任务目标进度都浓缩在这一行数据中。

表结构

字段名类型说明
guidINT UNSIGNED角色全局唯一标识符(联合主键)
questINT UNSIGNED任务ID(联合主键,对应 quest_template.entry)
statusTINYINT UNSIGNED任务状态位标志
exploredTINYINT UNSIGNED探索进度位标志(每bit代表一个探索区域)
timerINT UNSIGNED限时任务的剩余时间(秒),普通任务为0
mobcount1SMALLINT UNSIGNED击杀目标1的当前进度
mobcount2SMALLINT UNSIGNED击杀目标2的当前进度
mobcount3SMALLINT UNSIGNED击杀目标3的当前进度
mobcount4SMALLINT UNSIGNED击杀目标4的当前进度
itemcount1SMALLINT UNSIGNED收集物品1的当前进度
itemcount2SMALLINT UNSIGNED收集物品2的当前进度
itemcount3SMALLINT UNSIGNED收集物品3的当前进度
itemcount4SMALLINT UNSIGNED收集物品4的当前进度
itemcount5SMALLINT UNSIGNED收集物品5的当前进度
itemcount6SMALLINT UNSIGNED收集物品6的当前进度
playercountSMALLINT UNSIGNED当前满足任务条件要求的玩家数量

核心字段说明

status 字段位标志详解

标志值枚举常量含义
0QUEST_STATUS_NONE未接取(实际上不会有此记录)
1QUEST_STATUS_COMPLETE任务目标已达成,等待交任务
2QUEST_STATUS_UNAVAILABLE任务不可用
4QUEST_STATUS_FAILED任务失败(限时任务超时)
8QUEST_STATUS_REWARDED已领取奖励(完成后从本表删除)
32QUEST_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)来间接实现。