血魔法集成(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 选项。

相关条目