兼容插件体系(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 覆盖(不显示额外正文)。
相关条目
- Thermal Expansion 配方 - 84 条锯木机配方
- 神秘时代 aspects - 68 条
registerObjectTag - Mine Factory Reloaded - 30 条
FactoryRegistry注册 - 配置项总览 - 各插件内部用到的
PHNatura开关 - Natura 木材与树木 - 上述方块的来源