巨型门

基本信息

属性 值
注册名 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):

  1. 仅允许放在顶面(side == 1),且下方方块必须为实心(BigDoor.java:122-129)
  2. 读回玩家朝向写入 meta:Door.dirToInt(dir)(BigDoor.java:133-135)
  3. 取出 BigDoorTileEntity,用物品 NBT 恢复门框方块状态:te.setFrameState(BlockState.fromNBT(itemStack.getTagCompound()))(BigDoor.java:139)
  4. 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

相关条目

  • 木门 - 合成中世纪门所需的云杉门
  • 车库门 - 另一类会展开多方块结构的门