世界任务设置 (World Quest Settings)
基本信息
| 属性 | 值 |
|---|---|
| 实现类 | betterquesting.storage.QuestSettings(单例 INSTANCE) |
| 容器基类 | betterquesting.storage.PropertyContainer implements IQuestSettings |
| 装载方法 | QuestSettings.setupProps()(QuestSettings.java:37-52) |
| 世界级属性数 | 12 |
| API 键 | ApiReference.SETTINGS(ExpansionLoader.java:38) |
| 与客户端配置的关系 | 完全独立 —— 客户端配置存 config 文件,本设置存世界存档 |
功能
QuestSettings 存的是随世界存档走的设置:它们由整合包作者设定、被 /bq_admin 指令修改、随世界 NBT 持久化,而不是每个玩家各存一份。
setupProps() 在两个时机被调用(QuestSettings.java:26-30):
- 构造函数(
QuestSettings.java:15-17)—— 首次创建时 readFromNBT(NBTTagCompound)之后 —— 每次读档都会重跑一次
第 2 点的设计意图是版本迁移:setupValue(prop) 的实现是 this.setProperty(prop, this.getProperty(prop, def))(QuestSettings.java:54-56),即「有存档值就用存档值,没有才用默认值」。整合包给某属性新增了更合适的默认值,老存档读档时会补上;而显式存过的值不会被覆盖。
每个 setupValue(prop) 内部走 prop.getDefault()(QuestSettings.java:54-56),所以这 12 项的初始值就是 任务属性 表里列的 NativeProps 默认值。
12 项世界级属性
| 属性 ID | 类型 | 默认值 | 作用 |
|---|---|---|---|
betterquesting:pack_name |
String | "" |
任务包名称 |
betterquesting:pack_version |
Integer | 0 |
任务包版本号 |
betterquesting:party_enable |
Boolean | true |
是否启用队伍系统 |
betterquesting:editMode |
Boolean | true |
是否允许编辑。为真时 观测站 的 updateEntity 整个短路 |
betterquesting:hardcore |
Boolean | false |
硬核模式总开关 |
betterquesting:livesDef |
Integer | 3 |
新玩家初始生命数 |
betterquesting:livesMax |
Integer | 10 |
生命上限 |
betterquesting:home_image |
String | "betterquesting:textures/gui/default_title.png" |
主界面标题图 |
betterquesting:home_anchor_x |
Float | 0.5F |
标题图锚点 X |
betterquesting:home_anchor_y |
Float | 0F |
标题图锚点 Y |
betterquesting:home_offset_x |
Integer | -128 |
标题图 X 偏移 |
betterquesting:home_offset_y |
Integer | 0 |
标题图 Y 偏移 |
共 12 项 = 7 项任务包与玩法开关(PACK_NAME、PACK_VER、PARTY_ENABLE、EDIT_MODE、HARDCORE、LIVES_DEF、LIVES_MAX)+ 5 项主界面布局(HOME_IMAGE、HOME_ANC_X、HOME_ANC_Y、HOME_OFF_X、HOME_OFF_Y)。
计数依据:grep -c 'setupValue(NativeProps\.' QuestSettings.java = 12,对应 QuestSettings.java:38-51 的 12 行。本文件内 setupValue 的双参重载没有任何调用点 —— 唯二匹配 setupValue(…, …) 的行是重载体内的委托调用(QuestSettings.java:55)与该重载自身的声明(QuestSettings.java:58)。
编辑权限
QuestSettings.canUserEdit(EntityPlayer) 决定谁能改任务(QuestSettings.java:20-23):
if (player == null) return false;
return this.getProperty(NativeProps.EDIT_MODE) && NameCache.INSTANCE.isOP(QuestingAPI.getQuestingUUID(player));
两个条件都要满足:世界 editMode 为真(默认就是 true),且玩家在 NameCache 缓存中被标记为 OP。NameCache 的 OP 标记来自服务端 server.getConfigurationManager() 的权限表,并以 isOP 布尔写入 NBT(storage/NameCache.java:36-42),读取入口 NameCache.isOP(UUID)(NameCache.java:69-71)。
reset 行为
QuestSettings.reset() 实现为 this.readFromNBT(new NBTTagCompound())(QuestSettings.java:32-35)—— 即「读一个空标签」。因为 readFromNBT 末尾会重跑 setupProps(),而此时所有属性的存档值都不存在,于是全部落回 NativeProps 默认值。这是一条真正的重置路径,不是空操作。
数值
| 数值名 | 值 |
|---|---|
setupValue(NativeProps.*) 调用数 |
12 |
setupValue 双参重载的实际调用数 |
0(唯二文本匹配是重载体内的委托与声明本身) |
canUserEdit 要求的条件数 |
2(EDIT_MODE 为真 且 NameCache.isOP) |
reset() 的实现 |
读空 NBT 触发默认值回填 |
| 默认开启的开关 | EDIT_MODE = true、PARTY_ENABLE = true |
| 默认关闭的开关 | HARDCORE = false |