魔力量子系统

基本信息

属性 值
API 包 vazkii.botania.api.mana(22 个接口/类)
网络实现 vazkii.botania.common.core.handler.ManaNetworkHandler(implements IManaNetwork)
单例 ManaNetworkHandler.instance,ManaNetworkHandler.java:31
法力池注册表 WeakHashMap<World, List<TileSignature>> manaPools,ManaNetworkHandler.java:33
法力收集器注册表 WeakHashMap<World, List<TileSignature>> manaCollectors,ManaNetworkHandler.java:34
服务端关闭清理 serverStopping 调用 ManaNetworkHandler.instance.clear(),Botania.java:100-102

功能

魔力量(mana)是 Botania 的核心资源。系统由三部分组成:生产(生成花)、网络(散播器把法力从花送到池)、消费(各类方块与物品)。

网络层

ManaNetworkHandler 维护两张以 World 为键的弱引用表。onNetworkEvent 订阅 ManaNetworkEvent,按 ManaBlockType(COLLECTOR 或其余)和 Action(ADD / 其他)把 TileSignature 加入或移出对应表(ManaNetworkHandler.java:36-42)。生成花在 SubTileGenerating.onUpdate() 中调用 linkCollector() 建立连接,随后 emptyManaIntoCollector() 把内部缓存的法力推给收集器。

TileSignature 把一个 TileEntity 包装成轻量签名,带一个 remoteWorld 标志(TileSignature.java),使客户端在未加载区块时也能通过网络表访问。

接收层

IManaReceiver extends IManaBlock,任何实现它的 TileEntity 都能从法力爆裂(mana burst)中接收法力(IManaReceiver.java):

  • isFull() —— 是否已满,满则不再接收爆裂
  • recieveMana(int mana) —— 实际接收回调
  • canRecieveManaFromBursts() —— 能否从爆裂接收;IManaCollector 的实现一般返回 false(IManaReceiver.java 注释)

IManaCollector extends IManaReceiver,是"法力收集器"(即法力池)。其 javadoc 明确了实现契约(IManaCollector.java):

  • 在 invalidate() 与 onChunkUnload() 中调用 ManaNetworkEvent.removeCollector(this)
  • 在 onUpdate() 的第一个 tick 调用 ManaNetworkEvent.addCollector(this)

其余方法:onClientDisplayTick()(客户端持魔杖时每 tick 调用)、getManaYieldMultiplier(IManaBurst burst)(接收倍率,1.0 = 爆裂全额,0.9 = 90%)、getMaxMana()(容量上限)。

数值

数值名 值 来源
法力池标准上限 1 000 000 TilePool.MAX_MANA = 1000000,TilePool.java:62
法力池稀释上限 10 000 TilePool.MAX_MANA_DILLUTED = 10000,TilePool.java:63
稀释池判定 方块 meta == 2 时 manaCap = MAX_MANA_DILLUTED TilePool.java:189
被动生成默认间隔 20 tick SubTileGenerating.getDelayBetweenPassiveGeneration(),SubTileGenerating.java:178-180
被动生成默认产量 1 mana SubTileGenerating.getValueForPassiveGeneration(),SubTileGenerating.java:182-184

交互

触发 行为
生成花每 tick onUpdate() → linkCollector() → 条件满足则 addMana(...) → emptyManaIntoCollector(),SubTileGenerating.java:64-81
池加入/移出网络 触发 ManaNetworkEvent,由 ManaNetworkHandler.onNetworkEvent 处理
服务端停止 ManaNetworkHandler.instance.clear() 清空两张表
客户端持魔杖 收集器每 tick 收到 onClientDisplayTick(),用于 HUD 显示

相关条目