破坏机 / 放置机 / 物品掉落器 / 真空漏斗
基本信息
这四个方块是一组「红石驱动的物流设备」,共用同一套 OpenModsLib GUI / 物品框架,但触发与容量各不相同。
| 注册名 | 类 | TileEntity | 材质 | 朝向 | 声明位置 |
|---|---|---|---|---|---|
OpenBlocks:blockbreaker |
BlockBlockBreaker |
TileEntityBlockBreaker |
Material.rock |
SIX_DIRECTIONS + ENTITY_ANGLE 放置 |
OpenBlocks.java:345 |
OpenBlocks:blockPlacer |
BlockBlockPlacer |
TileEntityBlockPlacer |
Material.rock |
SIX_DIRECTIONS |
OpenBlocks.java:350 |
OpenBlocks:itemDropper |
BlockItemDropper |
TileEntityItemDropper |
Material.rock |
NONE(无朝向) |
OpenBlocks.java:353 |
OpenBlocks:vacuumhopper |
BlockVacuumHopper |
TileEntityVacuumHopper |
Material.rock |
无朝向设置 | OpenBlocks.java:307 |
注册名大小写不统一:
blockbreaker全小写,而blockPlacer/itemDropper是驼峰。破坏机的贴图前缀却用了驼峰blockBreaker(BlockBlockBreaker.java:38-41)。
功能
破坏机(TileEntityBlockBreaker)
朝向前方的方块挖掘并收集掉落物。方块类只负责贴图(含激活态贴图 openblocks:blockBreaker_active,getUnrotatedTexture 在 tile.isActivated() 时切换,BlockBlockBreaker.java:51-60)。
目标可破坏的判据是 block.getBlockHardness(worldObj, z, y, z) > -1.0F(TileEntityBlockBreaker.java:82),即用硬度作可破坏代理;激活时发方块事件 EVENT_ACTIVATE = 3(:28)。
该行把
z同时作为 x 与 z 传入getBlockHardness,因此硬度查询发生在(z, y, z)而不是(x, y, z)。仓库内没有注释或测试声明这是有意行为,此处按代码原样记录。
放置机(TileEntityBlockPlacer)
9 格缓冲的物品仓库 + GUI(BUFFER_SIZE = 9,TileEntityBlockPlacer.java:27;IHasGui,:25)。红石信号为真且缓冲非空时才动作(:39),激活时发方块事件 EVENT_ACTIVATE = 2(:29)。
物品掉落器(TileEntityItemDropper)
9 格缓冲 + GUI,无朝向(BlockItemDropper.java:17)。红石触发条件与放置机相同(TileEntityItemDropper.java:39),输出后清空耗尽的槽(:54)。贴图只覆写底面 openblocks:itemDropper_down(:24),其余走基类。
真空漏斗(TileEntityVacuumHopper)
吸走范围内的掉落物与经验球,转为物品与经验液双输出。
- 渲染
TESR_ONLY,视觉方块只有中间 0.25~0.75(BlockVacuumHopper.java:17-18),但碰撞箱是整格(:21-24)——所以它挡路但不显得挡路 - 碰撞回调转交 TE(
:26-32);canPlaceBlockOnSide恒 true,可贴任何面(:34-37) - 10 格物品仓库(
TileEntityInventory(this, "vacuumhopper", true, 10),TileEntityVacuumHopper.java:62-63) - 经验液是输出而非输入:
SidedFluidHandler.Source(xpOutputs, tank)(:69),与 XP 瓶机的Drain相反 - 罐容量
TANK_CAPACITY = xpToLiquidRatio(getExperienceForLevel(5))(:53),即 5 级所需经验对应的液体量 - 可吸实体判据
isEntityApplicable(:104-118):EntityItemProjectile—— 仅当motionY < 0.01(正在下落)EntityItem—— 试插成功才吸EntityXPOrb—— 罐子还有空间才吸- 其它一律不吸
vacuumDisabled同步开关可直接停掉吸取(:124)- 客户端在中心位置发
portal粒子(:126-131)
数值
| 数值名 | 来源 | 值 |
|---|---|---|
| 破坏机可破坏判据 | 硬编码 | getBlockHardness > -1.0F(TileEntityBlockBreaker.java:82) |
| 放置机缓冲格数 | BUFFER_SIZE |
9(TileEntityBlockPlacer.java:27) |
| 掉落器缓冲格数 | BUFFER_SIZE |
9(TileEntityItemDropper.java:27) |
| 真空漏斗仓库格数 | 硬编码 | 10(TileEntityVacuumHopper.java:63) |
| 真空漏斗罐容量 | xpToLiquidRatio(getExperienceForLevel(5)) |
5 级经验的液体量(TileEntityVacuumHopper.java:53) |
| 真空漏斗视觉边界 | 硬编码 | 0.25 ~ 0.75(BlockVacuumHopper.java:18) |
交互
| 触发 | 行为 |
|---|---|
| 破坏机红石通电 | 朝向面开始挖掘,激活时切贴图并发方块事件 3 |
| 放置机红石通电且缓冲非空 | 朝向面放置方块,发方块事件 2 |
| 掉落器红石通电 | 向下抛出全部缓冲 |
| 任意实体进入真空漏斗 | 按 isEntityApplicable 判定后吸入(TileEntityVacuumHopper.java:104-118) |
真空漏斗 vacuumDisabled 打开 |
updateEntity 直接 return,停止一切吸取(:123-124) |
| 真空漏斗每次 NBT 加载 | validate() / onNeighbourChanged 置 needsTankUpdate 以刷新罐的邻居缓存 |
合成配方
破坏机(Config.java:892-909):
ccc
r r
rcr
| 字符 | 物品 |
|---|---|
c |
cobblestone 圆石 |
r |
dustRedstone 红石粉 |
另有「挖掘类」与「打孔类」两套替代配方,同在 Config.java:892-909 内定义。
放置机(Config.java:909-925):
iii
rHr
iri
| 字符 | 物品 |
|---|---|
i |
ingotIron 铁锭 |
r |
dustRedstone 红石粉 |
H |
Blocks.heavy_weighted_pressure_plate 重质压力板 |
物品掉落器(Config.java:926-940):
iii
rHr
iri
| 字符 | 物品 |
|---|---|
i |
ingotIron 铁锭 |
r |
dustRedstone 红石粉 |
H |
Blocks.heavy_weighted_pressure_plate 重质压力板 |
真空漏斗(Config.java:773-778):
iii
iHi
iii
| 字符 | 物品 |
|---|---|
i |
ingotIron 铁锭 |
H |
Blocks.hopper 漏斗 |
相关条目
- 实体 / 物品投射物 -
EntityItemProjectile正是掉落器的产物 - 物品 / 地图与制图物品 - 真空漏斗输出的液体容器
- 配置项全表 - 全 92 项