生成花
基本信息
| 属性 | 值 |
|---|---|
| 注册类 | vazkii.botania.common.block.subtile.generating.*(14 个类 + 1 个基类) |
| 基类 | SubTileGenerating(vazkii.botania.api.subtile.SubTileGenerating) |
| 被动基类 | SubTilePassiveGenerating(isPassiveFlower() 返回 true) |
| 注册方式 | BotaniaAPI.registerSubTile(...),ModBlocks.java:469-513 |
| 已注册生成花变体 | 16 个(14 个类 + daybloomPrime + nightshadePrime) |
功能
生成花(Generating Flower)是 Botania 的魔力来源。基类 SubTileGenerating 在 onUpdate() 中执行统一的生成循环(SubTileGenerating.java:64-81):
linkCollector();
if(canGeneratePassively()) {
int delay = getDelayBetweenPassiveGeneration();
if(delay > 0 && ticksExisted % delay == 0 && !isRemote) {
if(shouldSyncPassiveGeneration()) sync();
addMana(getValueForPassiveGeneration());
}
}
emptyManaIntoCollector();
因此被动花只需重写 canGeneratePassively()(默认返回 false,SubTileGenerating.java:174-176),间隔与产量用默认的 20 tick / 1 mana(SubTileGenerating.java:178-184)。主动花不重写 canGeneratePassively(),而是在自己的 onUpdate() 中检测特定方块/实体并直接 this.mana += ...。
数值
被动生成花(5 个)
| 花 | 注册键 | 颜色 | 间隔(tick) | 产量 | 生成条件 |
|---|---|---|---|---|---|
| Daybloom | daybloom |
0xFFFF00 |
10(Primus)/ 12 | 1 | 白天 + 不下雨 + 头顶可见天空 |
| Nightshade | nightshade |
0x3D2A90 |
20(默认) | 1 | 非白天(!super.canGeneratePassively() && !isDaytime()) |
| Hydroangeas | hydroangeas |
0x532FE0 |
1(雨中)/ 2 | 1 | burnTime > 0(需要下雨,burnTime += getBurnTime()) |
| Thermalily | thermalily |
0xD03C00 |
1 | 20 | 继承默认 |
| Endoflame | endoflame |
0x785000 |
2 | 3 | burnTime > 0(需要燃料) |
来源:SubTileDaybloom.java:63-70(条件)、:69(间隔);SubTileNightshade.java(条件);SubTileHydroangeas.java:179(间隔)、:78(burnTime);SubTileThermalily.java:52(间隔)、:62(产量);SubTileEndoflame.java:134(间隔)、:95(产量)。
Daybloom 的条件判定细节:下雨由生物群系降水量 > 0 且 世界正在下雨或雷暴共同决定(SubTileDaybloom.java:64)。
主动生成花(9 个)
| 花 | 注册键 | 范围 | 触发 | 单次法力 |
|---|---|---|---|---|
| Rosa Arcana | arcanerose |
RANGE = 1 |
吸收范围内的经验球 | 50 × 经验值(MANA_PER_XP = 50) |
| Kekimurus | kekimurus |
RANGE = 5 |
每 80 tick 扫描 11×11×11 内的蛋糕方块并推进一级 | 1800 |
| Munchdew | munchdew |
RANGE = 8, RANGE_Y = 16 |
每 4 tick 吞噬范围内暴露在外的树叶 | 160 / 片叶 |
| Rafflowsia | rafflowsia |
RANGE = 5 |
每 40 tick 攻击范围内花朵 | 2100 × mod(mod = 1F / lastFlowerTimes) |
| Narslimmus | narslimmus |
RANGE = 2 |
每 5 tick 依范围内史莱姆数量生成 | 820 × 2^size |
| Endoflame | endoflame |
RANGE = 3 |
燃烧范围内物品 | 见上(3 / 2 tick) |
| Entropinnyum | entropinnyum |
RANGE = 12 |
范围内事件触发 | 无法核实 |
| Dandelifeon | dandelifeon |
RANGE = 12 |
需红石信号(redstoneSignal > 0),按 SPEED 间隔 |
无法核实 |
| Gourmaryllis | gourmaryllis |
RANGE = 1 |
范围 1 内事件触发 | 无法核实 |
| Spectrolus | spectrolus |
RANGE = 1 |
范围 1 内事件触发 | 无法核实 |
来源:SubTileArcaneRose.java:34-35,52,59;SubTileKekimurus.java:22,28,30,46;SubTileMunchdew.java:37-38,54,56;SubTileRafflowsia.java:37,43,45,67,73;SubTileNarslimmus.java:32,38,43-44;SubTileEntropinnyum.java:36;SubTileDandelifeon.java:28,48;SubTileGourmaryllis.java:29;SubTileSpectrolus.java:38。
标记「无法核实」的四朵花,本次只读取了它们的 RANGE 常量与调用点位置,未逐行确认 onUpdate() 中的具体法力增量公式,不做推断。
派生变体
| 变体 | 注册键 | 行为 |
|---|---|---|
| Daybloom Primus | daybloomPrime(SubTileDaybloom.Prime) |
周期更短(10 tick vs 12),且 getDrops() 会 list.clear() 阻止掉落;onUpdate() 记录并锁定最初位置,离开即自毁。lang 提示 “You should not have this on you”。SubTileDaybloom.java:38-58 |
| Nightshade Primus | nightshadePrime(SubTileNightshade.Prime) |
lang 提示同上。ModBlocks.java:478 |
交互
| 触发 | 行为 |
|---|---|
| 每 tick | onUpdate() 尝试连接附近的 IManaCollector 并把缓存法力推入 |
| 被动条件满足 | 按 ticksExisted % delay == 0 周期性 addMana() |
| 法力满 | 各花均以 getMaxMana() - this.mana >= 所需法力 作为生成前置条件 |
| 被动花枯萎 | passiveDecayTicks / TAG_PASSIVE_DECAY_TICKS(SubTileGenerating.java:53),时长由配置 passiveDecay.time 控制(默认 72000 tick,-1 关闭) |
| 红石 | acceptsRedstone() 为 true 时每 tick 读取邻接红石强度(SubTileGenerating.java:83-88) |
相关条目
- 魔力量子系统 - 生成、接收与网络的完整链路
- 法力池 - 生成花把法力送入的收集器
- Lexica Botania - 各花的说明位于"生成花"与"功能花"两个分类