生成花

基本信息

属性 值
注册类 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)

相关条目