开发者工具
基本信息
| 属性 | 值 |
|---|---|
| 类型 | 纯客户端 GUI 调试挂钩(Developer Tools addon) |
@Mod 类 |
net.bdew.neiaddons.developer.AddonDeveloper,modid NEIAddons|Developer |
| 开关 | Addons 分类的 Developer Tools,默认 false |
| 侧限制 | checkSide(side) { return side.isClient(); } — 服务端永不加载 |
| FML 依赖 | after:NEIAddons(无其它) |
| 无外部 mod 依赖 | getDependencies() 继承基类返回空数组 |
这是全 mod 唯一默认关闭的 addon,因为 AddonDeveloper.isEnabledByDefault() 显式 return false;其余 5 个 addon 都用基类默认的 true。开发期调试用,正常游戏里需要手动在 .cfg 里开。
注册链路
AddonDeveloper.loadClient() // NEI 调 IConfigureNEI 时
-> DeveloperHelper.init()
-> GuiContainerManager.addTooltipHandler(new DeveloperGuiHandler())
DeveloperGuiHandler implements codechicken.nei.guihook.IContainerTooltipHandler。这是它实现的唯一 NEI 接口,源码里没有第二个 IContainerTooltipHandler。
handleTooltip 的输出
在任意 GuiContainer 内用鼠标悬停,命中槽位后(slotNum > 0,注意是严格大于 0,槽位 0 会被跳过)向 tooltip 追加这些行:
| 行 | 内容 |
|---|---|
| 第 1 行 | 下划线 + Slot #<槽位下标>,颜色码 EnumChatFormatting.UNDERLINE |
| 第 2 行 | G: <GuiContainer 子类简名> |
| 第 3 行 | C: <Container 子类简名> |
| 第 4 行 | S: <Slot 子类简名> |
| 第 5 行 | I: <Inventory 子类简名> (#<getSlotIndex()>),或 I: NULL(红色) |
| 第 6 行 | <xDisplayPosition>/<yDisplayPosition>,槽位在 GUI 内的像素坐标 |
getItemDisplayName 与 getItemTooltip 两个接口方法都原样返回传入的 list,不做任何加工。
槽位命中判定是纯几何的:把鼠标坐标减去 gui.guiLeft / gui.guiTop,再与槽位 xDisplayPosition / yDisplayPosition 比对,槽位尺寸写死 16×16,容差 ±1 像素。遍历 gui.inventorySlots.inventorySlots 找第一个命中的槽位就 break。
getNBTData 类逻辑不存在——DeveloperGuiHandler 不实现任何数据提供者,只在客户端本地算,不发包。
配套的死代码
devDependencies 目录不存在,但 utils/SetRecipeCommandHandler(实现 SubPacketHandler)本应是这套工具的服务端配套。源码里 grep -rn "SetRecipeCommandHandler" src 只有自身第 19 行类声明与第 24 行构造函数两处命中——没有 registerHandler 调用,所以它永远不会被触发。
它的设计意图是:客户端把配方所需的物品栈按槽位号打包成一个 NBT 列表发给服务端,服务端在匹配的 Container 里把 SlotClass 实例的槽位逐个 putStack(stmap 里没有的槽位被置 null,等于清空)。
装饰性资源
src/main/resources/assets/neiaddons/textures/items/invalid.png 存在但没有任何代码引用,属开发期遗留素材。
相关条目
- 配置文件 -
Developer Tools开关 - Addon 架构与加载顺序 - 仅客户端 addon 的注册路径
- NEI 接口实现总表 -
IContainerTooltipHandler在接口清单中的位置 - 叠加层与 GUI 挂钩 - 同属 GUI 挂钩的
IOverlayHandler死代码