魔力量子系统
基本信息
| 属性 | 值 |
|---|---|
| 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 显示 |