兼容插件体系(Mantle Pulsar)

基本信息

属性 值
包名 mods.natura.plugins
机制来源 Mantle 的 Pulsar 框架(硬前置 required-after:Mantle,Natura.java:65)
控制器 mods.natura.plugins.PluginController
管理器 Natura.pulsar = new PulseManager("Natura", "Natura-Dynamic")(Natura.java:81)
注册入口 PluginController.registerBuiltins()(Natura.java:88,位于 preInit)
已注册插件 9 个(PluginController.java:25-33)
源码规模 15 个 Java 文件、1194 行(find src/main/java/mods/natura/plugins -name '*.java' | wc -l 与 wc -l)

功能

Natura 把所有跨模组兼容收敛到一个 插件注册表 上,而不是散落在 postInit 的软依赖分支里。preInit 中先 MinecraftForge.EVENT_BUS.register(this)(Natura.java:85),再调 PluginController.registerBuiltins()(:88)把 9 个插件对象登记到 Pulsar,最后由 pulsar.preInit(evt)(:98)驱动它们。每个插件类带 @Pulse(id = ..., modsRequired = <modid>) 注解,由 Mantle 在运行时检测 mod 是否存在来决定是否激活,因此 Natura 自身不需要写 Loader.isModLoaded 判断。

public static void registerBuiltins() {
    pulsar.registerPulse(new TE4Pulse());
    pulsar.registerPulse(new BuildCraftPulse());
    pulsar.registerPulse(new ForestryPulse());
    pulsar.registerPulse(new TreeCapitatorPulse());
    pulsar.registerPulse(new ThaumcraftPulse());
    pulsar.registerPulse(new FMPPulse());
    pulsar.registerPulse(new NEIPulse());
    pulsar.registerPulse(new MFRPulse());
    pulsar.registerPulse(new WailaPulse());
}

9 个插件总览

插件类 modsRequired 目标 modid 实际注册内容 详情
TE4Pulse TE4Pulse.modId ThermalExpansion 84 条 SawmillRecipe(IMC) Thermal Expansion 配方
BuildCraftPulse BuildCraftPulse.modId BuildCraft|Transport 最多 9 条 add-facade(IMC) 本文下方
ForestryPulse ForestryPulse.modId Forestry 无(方法体整段被注释) 本文下方
TreeCapitatorPulse TreeCapitatorPulse.modId Treecapitator 1 份 ThirdPartyModConfig(IMC) 本文下方
ThaumcraftPulse ThaumcraftPulse.modId Thaumcraft 68 条 registerObjectTag + 7 条 harvestClickableCrop 神秘时代 aspects
FMPPulse ForgeMultiPart.modId ForgeMultipart 10 个方块的 MicroMaterial 本文下方
NEIPulse NEIPulse.modId NotEnoughItems 2 个 GUI 覆盖层 + 8 个 hideItem 本文下方
MFRPulse MFRPulse.modId MineFactoryReloaded 30 条 FactoryRegistry 注册 Mine Factory Reloaded
WailaPulse WailaPulse.modId Waila 2 个 Waila 数据提供器 本文下方

各插件细节

BuildCraft Transport(plugins/imc/BuildCraftPulse.java)

通过 FMLInterModComms.sendMessage("BuildCraft|Transport", "add-facade", ...) 把浆果丛注册为 BuildCraft 传送带的可作外观(facade)方块。共 9 条,且受配置包裹:

目标方块 meta 范围 生效条件
NContent.netherBerryBush 0–3 PHNatura.enableNetherBerryBushes
NContent.berryBush 0–3 PHNatura.enableBerryBushes
NContent.saguaro 0 无条件

Forestry(plugins/imc/ForestryPulse.java)—— 已注册但方法体为空

@Handler init() 的整个方法体只有一段被注释掉的代码(ForestryPulse.java:19-22),原本打算用 add-farmable-crop 把 Natura:seeds 注册为可耕种作物,但从未启用。

[!NOTE] 这是「已注册 ≠ 已接线」的实例:PluginController 确实登记了 ForestryPulse,Mantle 也会在装了 Forestry 时调用它的 init(),但该方法不产生任何注册。安装 Forestry 不会得到 Natura 作物支持。

TreeCapitator(plugins/imc/TreeCapitatorPulse.java,213 行)

发送一份完整的 ThirdPartyModConfig NBT,把 5 把斧头登记为可砍树的工具,并为 13 种树各写一份 logs / leaves 组合:

字段 值
modID "Natura"
axeIDList ghostwoodAxe、bloodwoodAxe、darkwoodAxe、fusewoodAxe、netherquartzAxe(共 5 把)
useShiftedItemID false

13 个 treeName 及其方块来源(TreeCapitatorPulse.java:47-186):

treeName logs 来源 leaves 来源
amaranth rareTree meta 2/6/10 rareLeaves meta 2/10
bloodwood bloodwood floraLeavesNoColor meta 2/10
darkwood darkTree meta 0/4/8 darkLeaves
eucalyptus tree meta 0/4/8 floraLeaves meta 1/9
ghostwood tree meta 2/6/10 floraLeavesNoColor meta 1/9
hopseed tree meta 3/7/11 floraLeaves meta 2/10
maple rareTree meta 0/4/8 rareLeaves meta 0/8
redwood redwood floraLeaves meta 0/8
sakura tree meta 1/5/9 floraLeavesNoColor meta 0/8
siverbell rareTree meta 1/5/9 rareLeaves meta 1/9
tigerwood rareTree meta 3/7/11 rareLeaves meta 3/11
willow willow floraLeavesNoColor meta 3/7/11/15,另有 maxHorLeafBreakDist = 5

[!NOTE] siverbell 与 TreeCapitatorPulse 内部注释都写作 siverbell(缺一个 l),而 planks 贴图名是 silverbell(Planks.java:24)。这里记录的是源码实际发出的字符串。

ForgeMultipart(plugins/fmp/)

FMPPulse.init() 调用 ForgeMultiPart.registerBlocks()(ForgeMultiPart.java:17-28),把 10 个装饰方块注册为 MicroMaterial,使玩家可以把它们做成分段微方块:

目标方块 meta 范围 生成的小块数
bloodwood 0 1
willow 0 1
planks 0–12 13
tree 0–3 4
rareTree 0–3 4
rareLeaves 0–3 4
darkLeaves 0–3 4
redwood 0–2 3
floraLeaves 0–2 3
floraLeavesNoColor 0–2 3

FMPPulse 与 NEIPulse 都用 try/catch 包住注册,失败只记日志不中断加载(FMPPulse.java:14-19)。

NEI(plugins/nei/)

NEIPulse.init() 先判 getSide().isServer() 直接返回(NEIPulse.java:18),确保服务端不执行。随后 NotEnoughItems.registerNEICompat()(NotEnoughItems.java:14-30):

  • 为 WorkbenchGui 注册 crafting 覆盖层与 DefaultOverlayHandler(API.registerGuiOverlay / registerGuiOverlayHandler)
  • API.hideItem 隐藏 NContent.crops(无 metadata,永远隐藏)
  • 在 PHNatura.enableWoodenDoors 开启时再隐藏 7 个门物品:redwoodDoor、eucalyptusDoor、hopseedDoor、sakuraDoor、ghostDoor、bloodDoor、redwoodBarkDoor

共 8 个 hideItem 调用。

Waila(plugins/waila/)

WailaPulse 只发一条 FMLInterModComms.sendMessage("Waila", "register", "mods.natura.plugins.waila.WailaRegistrar.wailaCallback")(WailaPulse.java:16)。真正的注册在 WailaRegistrar.wailaCallback()(WailaRegistrar.java:13-24):

数据提供器 注册方式 目标方块类
NaturaCropDataProvider registerStackProvider CropBlock
NaturaCropDataProvider registerBodyProvider CropBlock
NaturaLeavesDataProvider registerStackProvider ×4 NLeaves、NLeavesNocolor、NLeavesDark、OverworldLeaves

即 6 次 Waila 注册:作物拿到完整信息,树叶只拿 stack 覆盖(不显示额外正文)。

相关条目