巨型门
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | malisisdoors:carriage_door、malisisdoors:medieval_door |
| 类 | net.malisis.doors.door.block.BigDoor(继承 MalisisBlock,注册名由 MalisisBlock.register() 用 getName() 生成) |
| TileEntity | net.malisis.doors.door.tileentity.BigDoorTileEntity,注册名 bigDoorTileEntity(附加备选名 carriageDoorTileEntity) |
| 材质 | Material.wood(BigDoor.java:102) |
| 硬度 | 5.0(BigDoor.java:104) |
| 爆炸抗性 | 10.0(BigDoor.java:105) |
| 脚步声 | soundTypeStone(BigDoor.java:106) |
| 创造标签 | Malisis' Doors(BigDoor.java:108) |
| 结构尺寸 | 3 格宽 × 5 格高 |
2 个变体由 Registers.registerBigDoors() 注册(Registers.java:429-441):
| 变体 | 注册名 | 显示名(en_US) | Type 枚举 |
合成所需门 |
|---|---|---|---|---|
| 马车门 | malisisdoors:carriage_door |
Carriage Door | CARRIAGE |
原版木门 Items.wooden_door |
| 中世纪门 | malisisdoors:medieval_door |
Medieval Door | MEDIEVAL |
本模组云杉门 Items.doorSpruceItem |
出处:BigDoor.Type(BigDoor.java:56-69)、Registers.java:430-434。
功能
巨型门是占 3 格宽 × 5 格高的多方块结构门,适合车库、城墙、工厂大门。放置一个门方块后,模组会在相邻空间自动铺出门框与门扇(蓝图放置)。
结构尺寸由 BigDoor.checkAreaClearForDoor 确认:yLoc 循环 0..4 共 5 层,水平方向一轴 xMax/zMax 取 1→4(abs(xLoc) < 4,即 0、1、2 三格),另一轴为 1(BigDoor.java:157-170)。门扇厚度 Door.DOOR_WIDTH = 0.1875F(3/16 格)(Door.java:70)。
放置逻辑(BigDoor.onBlockPlacedBy,BigDoor.java:132-155):
- 仅允许放在顶面(
side == 1),且下方方块必须为实心(BigDoor.java:122-129) - 读回玩家朝向写入 meta:
Door.dirToInt(dir)(BigDoor.java:133-135) - 取出
BigDoorTileEntity,用物品 NBT 恢复门框方块状态:te.setFrameState(BlockState.fromNBT(itemStack.getTagCompound()))(BigDoor.java:139) checkAreaClearForDoor通过才展开蓝图te.onCreate(...);否则回滚——置空气、给玩家发提示There's no room for the door!,生存模式退还物品(BigDoor.java:140-153)
BigDoorTileEntity.onCreate 会检查世界高度:buildHeight = world.getHeight() - 6,超过则不放置(BigDoorTileEntity.java:316-327)。
内部碰撞辅助方块
巨型门展开时会在门扇位置生成 2 个不可见碰撞辅助方块(CollisionHelperBlock),用于让实体正确与大尺寸门扇碰撞。它们不设创造标签,canDropFromExplosion 返回 false(CollisionHelperBlock.java:37-43)。
注册于 Registers.registerCollisionHelperBlocks()(Registers.java:471-488),两者共用 TileEntity 类 MultiTile(注册名 collisionHelperTileEntity)。方块名由 type.name + "_collisionHelper" 决定(CollisionHelperBlock.java:41),但实际注册名又追加了枚举名后缀,注册为 malisisdoors:carriage_door_collisionHelper_CARRIAGE 与 malisisdoors:medieval_door_collisionHelper_MEDIEVAL(Registers.java:472-484)。两方块共用一份 TileEntity,通过 meta 0/1 区分(CollisionHelperBlock.java:53-59)。
数值
| 数值名 | 值 | 出处 |
|---|---|---|
| 结构高度 | 5 格 | BigDoor.java:165 |
| 结构宽度 | 3 格 | BigDoor.java:162-163 |
| 门扇厚度 | 0.1875(3/16 格) | Door.java:70 |
| 硬度 | 5.0 | BigDoor.java:104 |
| 爆炸抗性 | 10.0 | BigDoor.java:105 |
| 距世界顶部余量 | 6 格 | BigDoorTileEntity.java:318 |
合成配方
巨型门没有固定形状配方,而是由 BigDoorRecipe(实现 IRecipe)实现的数量型配方:放入 1 个指定门 + 5 个完全相同且可堆叠的方块,产出 1 个巨型门(BigDoorRecipe.java:40-63)。
判定逻辑 getMatching(BigDoorRecipe.java:42-63):
- 遍历 3×3 合成栏
- 遇到
type.door记为门;出现第二个门直接判失败(BigDoorRecipe.java:50-51) - 其余物品必须非 null、且彼此可堆叠(
ItemUtils.areItemStacksStackable),否则失败(BigDoorRecipe.java:54-56) - 最终要求
doorMatch && frame != null && frameSize == 5(BigDoorRecipe.java:61)
产出时把门框方块状态写入物品 NBT(BlockState.toNBT),因此合成的巨型门自带所选门框材质(BigDoorRecipe.java:72-83)。getRecipeSize() 返回 2(BigDoorRecipe.java:87-90)。
| 变体 | 门 | 门框材料(5 个,需同一种) |
|---|---|---|
| 马车门 | 原版木门 ×1 | 任意可堆叠方块 ×5 |
| 中世纪门 | 本模组云杉门 ×1 | 任意可堆叠方块 ×5 |