任务状态与逻辑 (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

相关条目