无线拉杆
[!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) |
但由于方块未注册,该配方在游戏中无法匹配到任何输出。