血魔法集成(Blood Magic)
PluginBloodMagic 覆盖 Blood Magic 的 4 类方块实体:祭坛(Altar)、炼金术台(Chemistry Set / Writing Table)、仪式石(Master Stone)、传送器(Teleposer)。它带有一套双信标分级可见机制——按玩家是否持有特定信标、以及是否开启"预见信标增益",决定祭坛能显示到哪一层。
代码注释标明出处:@author Pokefenn (edits by tterrag)。
基本信息
| 属性 | 值 |
|---|---|
| 插件类 | tterrag.wailaplugins.plugins.PluginBloodMagic |
| 目标 mod | Blood Magic(modid AWWayofTime) |
@Plugin 注解 |
name = "Blood Magic", deps = "AWWayofTime", order = 1(源码注释 /* After Forge Plugin */) |
| 注册类型 | Body + NBT provider,目标类 TEAltar、TEWritingTable、TEMasterStone、TETeleposer |
| 挂钩的 API | WayofTime.alchemicalWizardry.*,含 Rituals、ModItems、BoundArmour |
| 默认启用 | 是([plugins] 段与 WAILA [modules] 段默认均为 true) |
| 反射 | 反射读取 TEAltar 的私有字段 liquidRequired(ReflectionHelper.findField,@SneakyThrows) |
注册顺序的意义
order = 1 高于默认值 0,而通用流体插件 PluginIFluidHandler 未设 order(即 0)。PluginRegistrar 按 order 升序排序后依次 load(),因此血魔法总是排在 Forge 流体插件之后注册——这正是 order 注释所指的意图,也保证血魔法能可靠地抹掉通用流体插件写下的提示行。
WAILA 元数据键(NBT)
| NBT 键 | 类型 | 来源类 | 含义 |
|---|---|---|---|
lp |
int | TEAltar.getCurrentBlood() |
当前 LP |
cap |
int | TEAltar.getCapacity() |
祭坛容量 |
tier |
int | TEAltar.getTier() |
祭坛层数 |
prog |
int | TEAltar |
祭坛转换进度百分比;TEWritingTable 取自其自身 NBT 的 progress |
resStack |
NBTTagCompound | TEWritingTable.getResultingItemStack() |
炼金术台当前产物;产物为 null 时不写该键 |
owner |
String | TEMasterStone.getOwner() |
仪式石主人 |
ritName |
String | TEMasterStone.getCurrentRitual() |
当前仪式内部名 |
stackName |
String | TETeleposer |
传送器 0 号槽物品显示名 |
祭坛 prog 的算法:altar.isActive() 时,用反射取出的 liquidRequired 乘以 0 号槽堆叠数作为分母,(progress / max) * 100 取整。
源码提示:
stackName被写入 NBT,但显示端并未读取它——getBody对TETeleposer直接调te.readFromNBT(tag)还原实体后取getStackInSlot(0).getDisplayName()。该键在本源码中属写出但未消费。
信标分级可见(双开关)
显示量由 sigilRequirement 与 seerBenefit 两个 wailaplugins.cfg 选项共同决定,二者都是本 mod 自己的配置,不在 WAILA 配置里。
sigilRequirement([blood_magic] 段,整数 0~2,默认 1):
| 值 | 语义 | hasSeer |
hasSigil |
|---|---|---|---|
0 |
完全不需要信标 | 恒为 true |
恒为 true |
1 |
信标需在背包中 | 背包内有 itemSeerSigil |
hasSeer 或 背包内有 divinationSigil |
2 |
信标需在手握 | 主手是 itemSeerSigil |
hasSeer 或 主手是 divinationSigil |
searchInventory 的查找范围:先遍历 player.inventory.mainInventory 找对应物品;再遍历 player.inventory.armorInventory,对 BoundArmour 类型装备展开其 getInternalInventory(stack) 继续找——即绑定盔甲内嵌的信标也算数。
seerBenefit([blood_magic] 段,boolean,默认 true):true 时只有预见信标(Seer)能看祭坛进度、占卜信标(Divination)看不到;false 时预见信标不提供额外信息、占卜信标可看全部信息。源码用 hasSeer |= !WPConfigHandler.seerBenefit; 实现——seerBenefit 为 false 时 hasSeer 被强制置真,于是 hasSigil 也随之成立(因 hasSigil 由 hasSeer 派生)。
显示内容
getBody 第一行就是 ((ITaggedList<String, String>) currenttip).removeEntries("IFluidHandler"),先摘掉通用流体插件的行。
| 方块实体 | 开关 | 显示 | 附加条件 |
|---|---|---|---|
TEAltar |
altar |
LP: N / 祭坛容量: N / 祭坛层数: N |
需 hasSigil |
TEAltar |
altar |
转换进度: N% |
需 hasSigil 且 hasSeer 且 NBT 含 prog 键(即祭坛 isActive()) |
TEWritingTable |
chemistrySet |
转换进度: N% |
无条件 |
TEWritingTable |
chemistrySet |
产物 ItemStack 的 getDisplayName() |
NBT 含 resStack |
TEMasterStone |
masterStone |
主人: X |
owner 非空 |
TEMasterStone |
masterStone |
仪式本地化名(经 Rituals.getNameOfRitual(ritName)) |
ritName 非空 |
TETeleposer |
teleposer |
0 号槽物品 getDisplayName() |
槽内非空 |
标签文本取自语言键 wp.hud.msg.currentLP / capacity / tier / progress / owner。
配置开关
4 个功能开关通过 addConfig(key) 注册,默认值均为 true:
| 开关 | 含义 |
|---|---|
altar |
显示祭坛信息 |
chemistrySet |
显示炼金术台信息 |
masterStone |
显示仪式信息 |
teleposer |
显示传送器信息 |
源码提示(语言键不匹配):
PluginBase.addConfig用getPluginName(...)拼语言键,而本插件name = "Blood Magic"非空,故getPluginName返回Blood Magic,代码实际请求的是wp.config.Blood Magic.altar这类键;而语言文件里定义的是wp.config.AWWayofTime.*(用的是依赖 modid)。二者对不上,这 4 个复选框的显示名会回退为原始键。功能不受影响——开关的布尔值仍按Blood Magic:<key>正常存取,只有标签文本失配。对照 Forestry 集成 与 Railcraft 集成,那两者的语言键前缀与getPluginName结果一致。另注:语言文件中的
wailaplugins.config.section.plugins在中文语言文件里写作全局设置,与英文的Global Plugin Settings略有出入。
本插件另有插件级总开关 Blood Magic(enabled() 读取),以及 sigilRequirement / seerBenefit 两个 wailaplugins.cfg 选项。
相关条目
- 插件 API 与生命周期 -
order如何决定注册顺序 - WAILA 模块开关 - 全部插件的总开关与功能开关总表
- 配置系统 -
sigilRequirement/seerBenefit的默认值与语义 - Forge 流体桥接(IFluidHandler) - 本插件会抹掉其输出行