栅栏门

基本信息

属性 值
注册名 malisisdoors:acaciaFenceGate、birchFenceGate、darkOakFenceGate、jungleFenceGate、spruceFenceGate、camoFenceGate,以及条件注册的 malisisdoors:fenceGate
类 net.malisis.doors.door.block.FenceGate(独立注册,非 DoorDescriptor 体系)
TileEntity net.malisis.doors.door.tileentity.FenceGateTileEntity(注册名 fenceGateTileEntity,Registers.java:123)
父类 net.minecraft.block.BlockFenceGate(FenceGate.java:46)
开门机制 沿用原版栅栏门,非自定义动画(源码中无 openingTime 字段)
TileEntity 移动方式 FenceGateMovement(FenceGateTileEntity.java:40-43)
硬度 2.0(FenceGate.java:76)
爆炸抗性 5.0(FenceGate.java:77)
脚步声 soundTypeWood(FenceGate.java:78)
创造标签 除 OAK 外全部设置(FenceGate.java:81)

栅栏门不经 DoorDescriptor 注册,而是 FenceGate.register() 直接调 GameRegistry.registerBlock(this, type.name)——方块本身即物品,无独立 ItemBlock(FenceGate.java:84-97)。Registers.registerFenceGates() 注册 6 个(Registers.java:224-231),第 7 个 fenceGate(橡木)仅在 modifyVanillaDoors 开启时由 registerVanillaFenceGate() 注册(Registers.java:147-150)。

变体

FenceGate.Type 枚举定义于 FenceGate.java:48-58:

枚举 注册名 显示名(en_US) 木板 meta 注册条件
OAK malisisdoors:fenceGate Oak Fence Gate 0 仅 modifyVanillaDoors = true
SPRUCE malisisdoors:spruceFenceGate Spruce Fence Gate 1 总是
BIRCH malisisdoors:birchFenceGate Birch Fence Gate 2 总是
JUNGLE malisisdoors:jungleFenceGate Jungle Fence Gate 3 总是
ACACIA malisisdoors:acaciaFenceGate Acacia Fence Gate 4 总是
DARK_OAK malisisdoors:darkOakFenceGate Dark Oak Fence Gate 5 总是
CAMO malisisdoors:camoFenceGate Camo Fence Gate — 总是

OAK 型不设创造标签(FenceGate.java:81),因此不会出现在 Malisis' Doors 标签页中——它只用于替换原版栅栏门。

功能

FenceGate 继承原版 BlockFenceGate(FenceGate.java:46),因此门的开合、碰撞箱与红石逻辑沿用原版实现,本类只做三件事:

  1. 挂接 TileEntity 以支持伪装贴图查询:FenceGateTileEntity extends DoorTileEntity,在构造时装入一个只含 FenceGateMovement 的描述符(FenceGateTileEntity.java:37-44)
  2. 按木种取贴图:getIcon(int side, int meta) 对非 CAMO 型直接返回对应 Blocks.planks 贴图,只有 CAMO 型走 camoIcon(FenceGate.java:106-108)。CAMO 贴图由 MalisisIcon 注册为 malisisdoors:camo_fencegate(FenceGate.java:100-103)
  3. 伪装渲染:世界态查询 getIcon(IBlockAccess, x, y, z, side) 在 type == CAMO 时改从 TileEntity 取 getCamoIcon()(FenceGate.java:111-118);无 TileEntity 时回退父类实现(FenceGate.java:115-116)

放置时 onBlockPlacedBy 在 super 之后调用 te.updateAll() 刷新伪装采样(FenceGate.java:121-131)。FenceGateTileEntity.updateAll() 一次采样三项数据:周围方块 BlockState、染色颜色 camoColor、是否贴墙 isWall,随后 markBlockForUpdate 同步客户端(FenceGateTileEntity.java:54-64)。采样会沿栅栏门朝向偏移一格,若偏移后是配对的另一扇对开门则再偏移一格(FenceGateTileEntity.java:67-73)。

右键开合改由 TileEntity 驱动而非父类:onBlockActivated 取 DoorTileEntity,调 te.openOrCloseDoor(),并按玩家朝向修正 meta(FenceGate.java:134-157)。

数值

数值名 值 出处
硬度 2.0 FenceGate.java:76
爆炸抗性 5.0 FenceGate.java:77
开门时间 沿用原版 BlockFenceGate,源码中无自定义值 FenceGate.java:46(grep -n openingTime FenceGate.java 无匹配)

合成配方

除 CAMO 外全部共用同一形状,材料随木种变化(FenceGate.java:88-95):

ABA
ABA
字符 物品
A 木棍 Items.stick ×4
B 对应木种木板 Blocks.planks,meta 见变体表

伪装栅栏门配方(FenceGate.java:86-87):

ABC
字符 物品
A 金合欢栅栏门 acaciaFenceGate
B 丛林栅栏门 jungleFenceGate
C 白桦栅栏门 birchFenceGate

注意该配方引用的三个静态字段在 FenceGate.register() 被调用时由 registerFenceGates() 的前三次赋值填充(Registers.java:225-227),依赖注册顺序。

相关条目

  • 原版门替换 - OAK 栅栏门替换原版 minecraft:fence_gate 的机制
  • 活板门 - 同样由 DoorDescriptor 体系注册的垂挂类方块