任务状态与逻辑 (Quest State & Logic)
基本信息
| 属性 | 值 |
|---|---|
EnumQuestState |
betterquesting/api/enums/EnumQuestState.java |
EnumQuestVisibility |
betterquesting/api/enums/EnumQuestVisibility.java |
EnumLogic |
betterquesting/api/enums/EnumLogic.java |
EnumPartyStatus |
betterquesting/api/enums/EnumPartyStatus.java |
| 消费方 | IQuest.getState()、NativeProps.VISIBILITY / LOGIC_TASK / LOGIC_QUEST、队伍系统 |
BetterQuesting 用 4 个小枚举定义任务的全部判定语义。它们的源码极短但判定规则全部写死在代码里,整合包作者只能通过属性取值来间接使用,无法扩展。
EnumQuestState(5 态)
LOCKED → UNLOCKED → UNCLAIMED → COMPLETED,外加 REPEATABLE。
这是玩家在界面上看到的进度标签,由 IQuest.getState(EntityPlayer) 返回。源码本身只有成员声明,不附带任何判定方法 —— 具体判定散落在 QuestInstance 内。
| 状态 | 含义(由 IQuest 的相关方法名推断,见下方说明) |
|---|---|
LOCKED |
前置任务未完成,isUnlocked(uuid) 为假 |
UNLOCKED |
isUnlocked(uuid) 为真、isComplete(uuid) 为假 |
UNCLAIMED |
isComplete(uuid) 为真、hasClaimed(uuid) 为假 |
COMPLETED |
isComplete(uuid) 且 hasClaimed(uuid) 均为真 |
REPEATABLE |
由 NativeProps.REPEAT_TIME 驱动;repeatTime 默认 -1(负数 = 不重复) |
⚠️ 上表的状态→方法的对应关系是依据
IQuest接口方法名与EnumQuestState成员名的语义对应整理的。EnumQuestState.java自身不含任何注释或判定实现,源码中也无switch (state)的集中映射表,故各状态的具体判定条件无法从该枚举文件单独核实,需读QuestInstance的对应方法。
EnumQuestVisibility(7 档)
源码中的成员注释即为完整判定规则(EnumQuestVisibility.java):
| 值 | 源码注释原文 | 语义 |
|---|---|---|
HIDDEN |
Never shown, and hidden from view mode. | 永不显示,查看模式也看不到 |
SECRET |
Like UNLOCKED, except also hidden from view mode. | 同 UNLOCKED,但查看模式也隐藏 |
UNLOCKED |
Must be unlocked to be shown (all prerequisites must be completed). | 所有前置完成后才显示 |
NORMAL |
Will be shown if all prerequisites are unlocked. | 所有前置解锁即显示(默认值) |
COMPLETED |
Must be completed to be shown. | 必须已完成才显示 |
CHAIN |
Will be shown if all prerequisites are shown. | 所有前置可见即显示 |
ALWAYS |
Always shown. | 恒显示 |
NORMAL 是 NativeProps.VISIBILITY 的默认值。
三个关键区别:UNLOCKED 要求前置完成,NORMAL 要求前置解锁,CHAIN 只要求前置可见 —— 这三档构成难度递增的递进披露。
「查看模式」(view mode)由客户端配置 BQ_Settings.viewMode 控制(见 客户端配置),HIDDEN 与 SECRET 是唯二会同时对查看模式保密的档位。
EnumLogic(6 种布尔运算)
NativeProps 有两个逻辑属性:任务项级 LOGIC_TASK(betterquesting:taskLogic)与任务级 LOGIC_QUEST(betterquesting:questLogic),默认均为 AND。
枚举自身携带 4 个方法,输入为「已满足的子项数 inputs」与「子项总数 total」:
| 值 | 源码注释 | getResult(inputs, total) |
isTrivial() |
isUnlockable(inputs, total) |
|---|---|---|---|---|
AND |
All true | inputs >= total |
true | true |
NAND |
Any false | inputs < total |
false | inputs < total |
OR |
Any true | inputs > 0 |
true | true |
NOR |
All false | inputs == 0 |
false | inputs == 0 |
XOR |
Only one true | inputs == 1 |
false | inputs <= 1 |
XNOR |
Only one false | inputs == total - 1 |
false | inputs < total |
两个方法的用途分工明确:
getResult—— 判定当前是否满足。isUnlockable—— 判定「在任务不可回退的前提下是否还可能被满足」。IQuest.isUnlockable(UUID)的接口注释与之吻合:返回 false 意味着「无论玩家做什么,这个任务都无法解锁,只能靠/bq_admin或手改存档」。这让XOR(inputs <= 1)在total > 2时会提前判死 —— 一个已被两个子项满足的 XOR 任务永远无法再满足第三个。isTrivial—— 标记无需额外处理的平凡运算,仅AND/OR为 true。
注意
XNOR的两处不对称:getResult用inputs == total - 1(恰好一个未满足),而isUnlockable用inputs < total(尚未全满足)。NAND两者一致。这不是笔误转述,是源码原文。
EnumPartyStatus(3 档)
MEMBER → ADMIN → OWNER,用于队伍内权限分级,见 队伍系统。
数值
| 枚举 | 成员数 |
|---|---|
EnumQuestState |
5 |
EnumQuestVisibility |
7(默认 NORMAL) |
EnumLogic |
6(默认 AND;其中平凡运算 2 种) |
EnumPartyStatus |
3 |