物品传送器(Item Translocator)

基本信息

属性 值
注册名 Translocator:translocator(GameRegistry.registerBlock(blockTranslocator, ItemTranslocator.class, "translocator"))
方块类 codechicken.translocator.BlockTranslocator
物品类 codechicken.translocator.ItemTranslocator(setHasSubtypes(true))
TileEntity codechicken.translocator.TileItemTranslocator(createTileEntity 中 metadata 0 返回)
metadata 0(damageDropped 保留 metadata,所以打坏会掉回同变体)
本地化键 tile.translocator|0.name=Item Translocator
硬度 1.5(setHardness(1.5F))
爆炸抗性 10.0(setResistance(10.0F))
亮度 0(未调用 setLightLevel)
材质 Material.iron
创造标签 CreativeTabs.tabRedstone(getSubBlocks 同时放出 metadata 0 与 1)
渲染类型 -1(getRenderType),全物品走 ItemTranslocatorRenderer

本条目是 侧面模式系统 的物品变体。同一个方块还有 液体传送器(metadata 1),两者的速率与过滤能力差别很大, 完整对比见 液体传送器 页的变体表。

功能

一个可从 6 个面同时抽取的物品搬运器:抽出面从相邻的 IInventory 拉取物品, 注入面把物品塞进相邻的 IInventory。每面独立配置过滤、速率与红石逻辑。 不消耗任何能量或红石以外的资源。

摆放要求

  • 右键贴在一个实现 IInventory 的方块表面上放置(ItemTranslocator.func_150936_a 判定 world.getTileEntity(...) instanceof IInventory)
  • 侧面对着目标:createAttachment(side ^ 1) 建在命中面的对面,即贴住容器的那一面
  • 每面只能附着一个容器;同一侧第二次放置返回 false
  • 目标方块被替换/移走后,邻接更新会自动回收那一面(harvestPart)
  • 目标不是可替换方块时放置坐标按命中面法线偏移(雪层强制按顶面处理)

数值

数值名 值 来源
每 tick 抽出量(普通) 1 个 int quantity = ia.fast ? stack.stackSize : 1;
每 tick 抽出量(高速,fast) 整叠(该槽当前 stackSize) 同上
过滤格每格可放(普通) 1 个 filterStackLimit():regulate ? 65535 : fast ? 64 : 1
过滤格每格可放(高速) 64 个 同上
过滤格每格可放(调节) 65535 个 同上
每 tick 抽出格数 1 格(每个抽出面每 tick 选数量最多的一格) 遍历 access.slots 取 largestQuantity
过滤器槽位数 9 ItemStack[] filters = new ItemStack[9]
信号器输出强度 15 strongPowerLevel 命中时 return 15
物品动画时长 5 tick MathHelper.approachLinear(a_progress, 1, 0.2)
插针伸出速度 approachExp(target, 0.5, 0.1) Attachment.update

⚠️ 高速模式的"整叠"是每个抽出面每 tick 最多一叠;实际抽出量还要再被 extractAmount(过滤器/调节上限)和 insertAmount(目标剩余空位)二次削减。

过滤与调节

过滤器 GUI 是 9 格(GuiTranslocator 用 textures/gui/container/dispenser.png 作底, 槽位坐标 62 + y*18, 17 + x*18),标题随模式在 translocator.filter 与 translocator.regulate 间切换。 过滤器本身存放在侧面 NBT 的 filters 标签里。

模式 触发 行为
过滤(默认) 无 只有与过滤器匹配的物品能进出。filterCount 返回过滤器里该物品的总数量 N,抽出量 qty = filter < 0 ? maxStackSize : filter,注入量上限同样是 N
调节 右键面持 钻石粒 双向补货到 N:注入 fit = min(空位, N - 目标已有数),抽出 qty = min(..., 源数量 - N),即只搬运"超过 N 的部分"或"差 N 的部分"

无过滤器时(filterCount 返回 -1):过滤模式下 extractAmount 返回 0(不搬), 调节模式下返回 stack.getMaxStackSize()(整叠回填)。也就是说不装过滤器就完全不工作。

匹配规则 matches:物品相同 + 若过滤器物品有子类型则 metadata 相同 + ItemStack.areItemStackTagsEqual(NBT 也要相同)。

输出分配

spreadOutput 把抽出的这一叠随机拆给所有注入面,且先非红石面、后红石面两轮 (spreadOutput(move, i, false, attached) 先于 spreadOutput(move, i, true, attached))。 拆分公式 qty = min(qty, move.stackSize / outputCount + rand.nextInt(move.stackSize % outputCount + 1)), 所以多个注入面之间是带随机抖动的均分,余数给前面的面。

信号器(铁锭)

持铁锭右键面 → signal = true,该面变成一个状态指示器(setPowering 会 notifyBlocksOfNeighborChange 通知两侧红石)。

面的角色 充能条件
注入面(!a_eject) isSatsified():过滤器里每种物品都满足(调节模式看数量、过滤模式看能否再插入),或没装过滤器时看容器是否已无空位
抽出面(a_eject) allSatisfied || !canTransferFilter(...):所有注入面都已满足,或已无可搬运的匹配物

strongPowerLevel(side) 查的是 attachments[side ^ 1],即对面的侧面状态 —— 信号从侧面穿出方块。

交互

触发 行为
右键·外圈·空手 打开 9 格过滤器 GUI
右键·中心按钮·空手 翻转红石取反逻辑(继承自 侧面模式系统)
右键·持红石粉 装红石模式(扣 1 个)
右键·持萤石粉 装高速模式,速率 1 → 整叠(扣 1 个)
右键·持 钻石粒 打开调节模式(扣 1 个)
右键·持铁锭 打开信号器(扣 1 个)
右键·空手·潜行 拆掉本面全部升级件(红石粉/萤石粉/钻石粒/铁锭)
左键 拆掉本面(方块本体保留)

掉落

Attachment.getDrops() 掉落:1 个本变体传送器(meta 0)+ 1 个红石粉(若装了)+ 1 个萤石粉(若装了)。 ItemAttachment 再追加 1 个钻石粒(调节)和 1 个铁锭(信号器)。 因此逐面拆除可以把整套零件完整取回。

合成配方

仅在 DreamCraft 未加载时注册(if (!Loader.isModLoaded("dreamcraft"))):

     R  Y  R          R = 红石粉
     I  P  I          Y = 末影珍珠
     R  G  R          I = 铁锭
(×2)                G = 金锭
                      P = 活塞

合成/回收配方(钻石粒)

9 个 钻石粒 → 1 个钻石;1 个钻石 → 9 个钻石粒(均为无序合成, 仅在 DreamCraft 未加载时注册)。详见钻石粒条目。

变体对比表

属性 物品传送器(meta 0) 液体传送器(meta 1) 基础 TileTranslocator
相邻方块要求 IInventory IFluidHandler 抽象,由 canExistOnSide 分派
每 tick 抽出量 1 个 / 整叠(高速) 100 mB / 1000 mB(高速) 未实现
过滤 9 格,可调节补货 无过滤,任意流体 无
过滤格堆叠上限 1 / 64 / 65535 — —
速率可自定义 否 是(GT 泵盖,见 GT 泵盖兼容层) —
额外升级件 钻石粒(调节)、铁锭(信号) GT 泵盖 无
红石供电 有(强度 15) 无 基类只提供 0
客户端动画 物品沿路径漂浮 螺旋流体带 + 多股并行 插针伸缩
实现 IFluidHandler 否 是(自身不存液) 否

相关条目