无线拉杆

[!WARNING] 本方块在当前版本无法启用。ConfigBlocks.wirelessLever 被声明却从未赋值,恒为 Java 默认值 false,而 ModBlocks.init() 与 MixinWorld 的加载条件都读它。详见下方「缺陷」。

基本信息

属性 值
注册名 RandomThings:wirelessLever
类 lumien.randomthings.Blocks.BlockWirelessLever(继承原版 BlockLever,实现 ITileEntityProvider)
TileEntity TileEntityWirelessLever(ModTileEntities.java:16,已注册)
硬度 0.5F(BlockWirelessLever.java:27)
脚步声 Block.soundTypeWood(:28)
贴图 RandomThings:wirelessLever(:29)
渲染类型 RenderIds.WIRELESS_LEVER(:34-36)
注册路径 构造函数内直接 GameRegistry.registerBlock(this, ItemBlockWirelessLever.class, "wirelessLever")(:30)
联动半径 10 格(Settings.WIRELESSLEVER_RANGE,Settings.java:12)
实例化开关 ConfigBlocks.wirelessLever(ModBlocks.java:55)

功能(设计意图)

无线拉杆是带 TileEntity 的原版拉杆:外观与交互完全是拉杆,但它会在半径内联动所有同类方块 —— 拨动任意一个,范围内的无线拉杆一起切换。半径由 Settings.WIRELESSLEVER_RANGE 决定,默认 10 格(RTConfiguration.java:76-77、:262)。

半径判定在 TileEntity 中用了两种写法(TileEntityWirelessLever.java:59 的 vec.length() > Settings.WIRELESSLEVER_RANGE 去抖,:125 的 distance <= Settings.WIRELESSLEVER_RANGE)。

为了能扫描周围方块寻找其他无线拉杆,本 mod 打了一个专用 Mixin:

WORLD(new MixinBuilder()
        .addCommonMixins("MixinWorld")
        .setApplyIf(() -> ConfigBlocks.wirelessLever)
        .setPhase(Phase.EARLY));

(Mixins.java:46-49)

缺陷:开关恒为 false

ConfigBlocks 声明了 14 个开关字段,但 RTConfiguration.syncConfig() 只赋值了 13 个 —— 唯独漏掉 wirelessLever:

// RTConfiguration.java:198-210,逐行可见 wirelessLever 缺席
ConfigBlocks.playerInterface      = isBlockEnabled("PlayerInterface");
ConfigBlocks.fluidDisplay         = isBlockEnabled("FluidDisplay");
ConfigBlocks.fertilizedDirt       = ConfigBlocks.fertilizedDirtTilled = isBlockEnabled("FertilizedDirt");
ConfigBlocks.itemCollector        = isBlockEnabled("ItemCollector");
...
ConfigBlocks.lapisLamp            = isBlockEnabled("LapisLamp");
ConfigBlocks.dyeingMachine        = isBlockEnabled("DyeingMachine");

可复现的验证方式:

# 声明但从未赋值
comm -23 <(sed -n 's/.*public static boolean *\([A-Za-z]*\).*/\1/p' Configuration/ConfigBlocks.java | sort -u) \
         <(sed -n '196,212p' Configuration/RTConfiguration.java | grep -o 'ConfigBlocks\.[A-Za-z]*' | sed 's/ConfigBlocks\.//' | sort -u)
# → wirelessLever

同样的比对在 ConfigItems 上输出为空(19 个字段全部赋值),说明这是 ConfigBlocks 的孤立遗漏。

连带后果

受影响对象 位置 结果
ModBlocks.wirelessLever ModBlocks.java:55 条件恒 false,方块不注册
MixinWorld Mixins.java:48 setApplyIf 恒 false,Mixin 从不加载
TileEntityWirelessLever ModTileEntities.java:16 仍被 registerTileEntity 注册,但无方块可挂载

同时,RTConfiguration.init() 只定义了 WirelessLeverRange(:76)而没有 WirelessLever 这个 isBlockEnabled 键,因此玩家也无法在配置文件中打开它 —— 这是纯粹的代码缺陷,不是设计取舍。

合成配方

配方本身是存在且正确的(Library/Recipes.java:247-255):

r
l
字符 物品
r 红石块(blockRedstone)
l 拉杆(Blocks.lever)

但由于方块未注册,该配方在游戏中无法匹配到任何输出。

相关条目