物品传送器(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 |
否 | 是(自身不存液) | 否 |