BabyChest 方块

基本信息

属性 值
方块类 com.dreammaster.modbabychest.BlockBabyChest
继承 BlockContainer(同时实现 ITileEntityProvider)
TileEntity com.dreammaster.modbabychest.TileEntityBabyChest
ItemBlock com.dreammaster.modbabychest.ItemBlockBabyChest
渲染器 RenderBabyChest / RenderItemBabyChest(方块与物品各一)
GUI 容器 ContainerBabyChest / GuiBabyChest
注册名 dreamcraft:BabyChest
材质 Material.wood(BlockBabyChest.java:36)
硬度 2.0F(BlockBabyChest.java:37)
爆炸抗性 5.0F(BlockBabyChest.java:38)
创造标签 最终为 ModTabList.BLOCKS(MainRegistry.java:299,覆盖构造器里的 tabDecorations,见下文)
GUI ID 1(GuiHandler.GUI_BABYCHEST,GuiHandler.java:15)
开关 CoreModConfig.Modules.BabyChest(默认 true)

⚠️ 不在 BlockList 内

这是本 mod 唯一带 TileEntity 的方块,但它不在 BlockList 枚举中。注册走独立路径:

public static Block blockBabyChest = new BlockBabyChest();   // MainRegistry.java:295

private void InitAdditionalBlocks() {
    GameRegistry.registerBlock(blockBabyChest, ItemBlockBabyChest.class, "BabyChest");  // MainRegistry.java:298
    blockBabyChest.setCreativeTab(ModTabList.BLOCKS);         // MainRegistry.java:299
}

InitAdditionalBlocks() 由 load(FMLInitializationEvent) 在 CoreModConfig.Modules.BabyChest 为 true 时调用(MainRegistry.java:268-270)。源码注释称其为 A complete, full working example for a custom chest, with its own renderer for items and blocks, custom sound and a GUI(CoreModConfig.java:50)—— 即它同时是本 mod 面向附属作者的教学范例。

注意注册名与贴图的两处特殊之处:

  • 注册名首字母大写:GameRegistry.registerBlock 第三个参数是 "BabyChest"(MainRegistry.java:298),但方块名在构造器里被设为 "babyChest"(BlockBabyChest.java:39)。两者不一致,属事实记录,不作缺陷断言 —— 仓库中无相关注释说明意图。
  • 贴图复用原版:本 mod 没有为它准备贴图。registerBlockIcons 直接取原版橡木木板图标:
blockIcon = pIconRegister.registerIcon("minecraft:planks_oak");

(BlockBabyChest.java:172-173)。同时 ItemBlockBabyChest 中不存在 setUnlocalizedName 或 setTextureName 调用(grep 'setUnlocalizedName\|setTextureName' ItemBlockBabyChest.java 无命中)。

  • 创造标签被设置两次:构造器先设 CreativeTabs.tabDecorations(BlockBabyChest.java:40),InitAdditionalBlocks 再覆盖为 ModTabList.BLOCKS(MainRegistry.java:299)。最终生效的是后者。

功能

一个自带渲染器与 GUI 的自定义箱子:

  • 右键打开自定义 GUI:pPlayer.openGui(MainRegistry.instance, GuiHandler.GUI_BABYCHEST, pWorld, pX, pY, pZ)(BlockBabyChest.java:82)
  • GuiHandler 按 GUI ID 分发:getServerGuiElement 返回 ContainerBabyChest,getClientGuiElement 返回 GuiBabyChest(GuiHandler.java:18-27、:29-39)
  • 两端都先 pWorld.getTileEntity(...) 并 instanceof TileEntityBabyChest 校验(GuiHandler.java:20-21、:32-33)
  • 支持比较器:重写 hasComparatorInputOverride(BlockBabyChest.java:177)与 getComparatorInputOverride(BlockBabyChest.java:182)
  • 破坏时清理 TileEntity(breakBlock,BlockBabyChest.java:133)
  • 接收方块事件(onBlockEventReceived,BlockBabyChest.java:139)
  • 放置后写入朝向(onBlockPlacedBy,BlockBabyChest.java:151)
  • isOpaqueCube()(BlockBabyChest.java:71)与 renderAsNormalBlock()(BlockBabyChest.java:66)均被重写

数值

数值名 值
硬度 2.0
爆炸抗性 5.0
GUI ID 1(本 mod 唯一一个 GUI ID)
碰撞箱 委托 super(BlockBabyChest.java:44-47)
选中箱 单独重写 getSelectedBoundingBoxFromPool(BlockBabyChest.java:51)

交互

触发 行为
右键方块 打开 BabyChest GUI(BlockBabyChest.java:76-83)
比较器读取 返回容器红石强度(BlockBabyChest.java:182)
破坏 掉落物品 + 清理 TileEntity
关闭 Modules.BabyChest 方块完全不存在,GUI ID 1 也不再注册

相关条目

  • BlockList - 本 mod 的 50 个无 TileEntity 方块,BabyChest 不在其中
  • CoreModConfig - BabyChest 开关定义