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。

相关条目