Advanced Drawbridge
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | TMechworks:redstoneMachine |
| metadata | 2 |
| 方块类 | RedstoneMachine(与 Drawbridge 同一方块类) |
| TileEntity | AdvancedDrawbridgeLogic(InventoryLogic 16 槽) |
| 附加库存 | InvCamo camoInventory(1 槽,伪装方块) |
| 材质 | Material.iron |
| 硬度 | 12 |
| 步声 | soundTypeMetal |
| GUI ID | 1(CommonProxy.advDrawbridgeID) |
| 伸/缩频率 | 每 5 tick 1 格 |
| 最大伸展 | 15 格(extension < 15 硬编码,不是 maxExtension 字段) |
| 假玩家 | FakePlayerLogic(Player.Drawbridge) |
核心机制:16 槽 = 15 格「逐格不同」的序列
这是本变体与 Drawbridge 的根本区别。updateEntity(blocks/logic/AdvancedDrawbridgeLogic.java:259-260):
if (getStackInSlot(extension) != null && getStackInSlot(extension).stackSize > 0
&& extension < 15) {
extension++;
即槽 N 的内容物 = 伸出到第 N 格时放置的方块。extension 从 0 计到 14,共放置 15 格,槽 0…15 中只有 0…14 被消耗,槽 15 永远不会被用到(因为放置发生在 extension++ 之后,用的是 extension - 1)。
放置时取用的是缓存槽而非原槽(:303-327):
Item blockToItem = getStackInBufferSlot(extension - 1) != null && ... ;
ItemStack placeStack = getStackInBufferSlot(extension - 1);
bufferStacks 是 updateEntity 每 tick 从主库存复制的快照(ItemStack[] bufferStacks = new ItemStack[getSizeInventory()]),用于避免放置过程中源槽被 decrStackSize 改变导致索引漂移。
因此它能沿一条线依次放置 15 种不同的方块(如楼梯、台阶、台阶状组合),而 Drawbridge 只能用同一种方块填满 15 格。
与 Drawbridge 的差异
| 项 | Drawbridge (meta 0) | Advanced (meta 2) |
|---|---|---|
| 库存槽数 | 2 | 16 |
| 槽语义 | 槽 0 = 单一待放置方块 | 槽 N = 第 N 格的方块 |
| 伪装方块 | 槽 1 | 独立 camoInventory(1 槽) |
| GUI ID | 0 | 1 |
| 伸展上限 | maxExtension 字段(默认 15,Long 变体改 64) |
硬编码 15,无字段 |
| 放置时读取 | inventory[0] |
getStackInBufferSlot(extension - 1) |
| 缓存 | 单个 bufferStack |
bufferStacks[16] 快照数组 |
| 有效槽数 | 2 | 15(槽 15 不可达) |
数值
| 数值 | 值 |
|---|---|
| metadata | 2 |
| 库存槽数 | 16 |
| 实际可用槽数 | 15(0–14,槽 15 死槽) |
| camo 槽数 | 1(InvCamo,NBT 键 camoInventory) |
| 伸展上限 | 15(硬编码 extension < 15,无 maxExtension 字段) |
| GUI ID | 1 |
| 伸/缩频率 | 每 5 tick 1 格 |
| camo 槽 NBT | ItemStack.loadItemStackFromNBT(camoTag)(:519) |
| 硬度 | 12 |
| 配方数 | 2 |
交互
| 触发 | 行为 |
|---|---|
| 红石脉冲 | 每 5 tick 伸 1 格,依次放置槽 0→14 的方块 |
| 红石撤除 | 每 5 tick 缩 1 格 |
| 右键 | 打开 GUI(ID 1),4 个方向按钮设 placementDirection |
| camo 槽变化 | S35PacketUpdateTileEntity 同步 |
| 破坏 | canDropInventorySlot 恒 false → 16 槽 + camo 槽全部不返还 |
配方
common/MechRecipes.java:71-98,2 条,图案相同:
c
r d r
a
| 符号 | 材料 |
|---|---|
a |
ingotAluminumBrass × 1 |
c |
blankPattern meta 1 或 meta 2 |
r |
minecraft:redstone × 2 |
d |
redstoneMachine meta 0(一个普通 Drawbridge) |
TCon 手册无对应配方(setupTConManual 只注册 drawbridge 与 igniter)。
源码缺陷
- 槽 15 永远不可达:放置发生在
extension++之后且上限为 15,索引最大用到 14。16 槽中最后一个是死槽。 selSlot是死字段(blocks/logic/AdvancedDrawbridgeLogic.java:47):public int selSlot = 0;全仓无读写点,疑为未完成的「当前选中槽」UI 设计。getLightValue的 camo 分支取错槽(blocks/RedstoneMachine.java:62-70):先检查camoInventory.getCamoStack() != null,返回值却取getStackInSlot(1)(构造方块的槽)的方块亮度。camo 有值但槽 1 为空时不发光,与colorMultiplier(正确读 camo)不一致。setWorldObj被覆写但未调 super(:62-64):只做this.worldObj = par1World,跳过TileEntity.setWorldObj父类逻辑。- 无
maxExtension字段:与 Long Drawbridge 的 64 无法统一;两种变体用不同机制限长。 canDropInventorySlot恒false(:104),内容物全部丢失。- GUI 无槽位选择界面:
AdvDrawbridgeGui只有 4 个方向按钮,玩家必须靠物品顺序推断哪格放什么,无预览。 - 贴图只准备了 1 张专用图(
drawbridge_side_advanced),face 侧全部复用 Drawbridge 的drawbridge_*_face。
相关条目
- Drawbridge - 同一方块 ID 的 meta 0,本变体的简化版
- Long Drawbridge - 同一方块 ID 的 meta 3
- Drawbridge GUI - GUI ID 1 的实现
- Drawbridge 放置规则 - 与 Drawbridge 共用同一套白名单