注册框架

基本信息

属性 值
主要类型 net.bdew.lib.machine.Machine(抽象类)
管理器 net.bdew.lib.config.MachineManager / BlockManager / ItemManager
注册入口 MachineManager.registerMachine(machine)
开关字段 配置段 Enabled(布尔)
本模组自注册内容 0 方块 / 0 物品 / 0 TileEntity

功能

BD lib 自身不注册内容,GameRegistry.registerBlock / registerItem 等调用只存在于供下游模组调用的框架类中。实测证据:

$ grep -rn 'regBlock\|regItem\|\.regSpecial' --include=*.scala src/
src/main/scala/net/bdew/lib/config/ItemManager.scala:19:    regItem(new SimpleItem(name), name)
src/main/scala/net/bdew/lib/config/MachineManager.scala:29:      machine.regBlock(creativeTab)
src/main/scala/net/bdew/lib/machine/Machine.scala:26:  def regBlock(creativeTab: CreativeTabs) {

以上命中全部落在框架定义里,没有任何一处是 BD lib 在自己加载时注册具体内容。grep -rn 'extends Machine\|new Machine\|extends ItemManager\|new BlockManager' 在全仓仅命中 config/MachineManager.scala:39 的 trait MachineManagerMultiblock extends MachineManager —— 同样是框架类型的继承,而非内容注册。

Machine

Machine[T <: Block](machine/Machine.scala:20)是最上层的机器抽象,字段包括 name(注册名)、block(由 blockConstruct 惰性构造)、tuning(配置段)、enabled(是否启用),以及 modId = Misc.getActiveModId。

regBlock(creativeTab)(Machine.scala:26-43)执行注册:自动选择 ItemBlock 子类(若方块实现 HasItemBlock 则用其指定的类,否则用默认 classOf[ItemBlock])、调用 GameRegistry.registerBlock、设置创造标签,并在方块实现 HasTE[_] 时自动调用 GameRegistry.registerTileEntity,ID 格式为 "%s.%s".format(modId, name)。

MachineManager

MachineManager.registerMachine(config/MachineManager.scala:25-34)是推荐的注册入口,其流程为:

  1. 用 machine.name 从传入的 tuning 配置段中取出子段赋给 machine.tuning
  2. 检查 machine.tuning.getBoolean("Enabled");为 false 则完全不注册,直接返回
  3. 置 machine.enabled = true 并调用 machine.regBlock(creativeTab)
  4. 若该机器实现 GuiProvider,额外注册到 guiHandler

MachineManagerMultiblock(MachineManager.scala:39-58)在此之上追加多方块逻辑:把实现了 MachineCore 的控制器收进 controllers 集合,并回填 getController.machine;同时提供 getMachinesForBlock,按模块 kind 查得每种控制器允许的 (required, max) 数量对。

BlockManager 与 ItemManager

BlockManager.regBlock(config/BlockManager.scala:31-57)是更细粒度的方块注册器,额外支持 addStack(调用 GameRegistry.registerCustomItemStack 注册一个默认物品堆栈)与 skipTileEntityReg(跳过 TileEntity 注册)。ItemManager.regItem(config/ItemManager.scala:23)对应物品注册,内部有一个 regItem(new SimpleItem(name), name) 的便捷重载。

创造标签

CreativeTabContainer(CreativeTabContainer.scala)提供一个内部类 Tab(name, item) 继承 CreativeTabs,供下游模组创建标签页。本类自身不注册任何标签页 —— 它的 init() 方法体为空,仅在构造时打印一行日志。

数值

数值名 值
GameRegistry.* 调用点总数 16
涉及的不同 GameRegistry 方法 10(addRecipe、addShapelessRecipe、addSmelting、findBlock、findItem、findItemStack、registerBlock、registerCustomItemStack、registerItem、registerTileEntity、registerTileEntityWithAlternatives)
机器启用判定字段 tuning 中的 Enabled 布尔项
TileEntity ID 格式 <modId>.<name>
CreativeTabContainer 内置标签页数 0(init() 为空方法体)

交互

本框架没有面向玩家的交互。它的调用方是其他模组的初始化代码:

触发 行为
下游模组调用 registerMachine 且配置 Enabled = true 方块 + ItemBlock + TileEntity 被注册到该下游 modid 命名空间
下游模组调用 registerMachine 且配置 Enabled = false 静默跳过,不注册任何内容
下游模组机器实现 GuiProvider 自动注册 GUI 处理器
配置 addStack = true 额外注册一个默认 ItemStack,使方块在未破坏时也可被合成/使用

相关条目