装备界面框架

装备界面框架

装备界面框架

Steam 版本

此 UI 框架提供了一系列 API,用于在负载(Loadout)UI 面板中添加新分区或替换现有分区。

据我理解,Kuertee UI Extension 为现有分区提供了固定的 API。而我的模组需要一个更灵活的框架,以便其他模组能够添加自定义 UI 分区。

  • 本框架不负责构建或辅助设计 UI 分区的内容。它会在一个共享钩子下注册多个针对负载 UI 面板的 UI 模组。
  • 本框架会遍历所有已注册的 UI 数据包,并通过一个钩子统一执行它们。这样可以防止多个模组为了替换原版 menu.setupLoadoutInfoSubmenuRows 函数而相互冲突。
  • 本框架不依赖 Kuertee UIX,但可以将 Kuertee UIX 作为可选依赖项,与它兼容。它会等待 Kuertee UIX 完成对负载 UI 的修改,然后再挂接钩子,以添加任何额外的模组 UI。

高层抽象

menu.setupLoadoutInfoSubmenuRows =
  LoadoutUI.wrapper(
    Aggregate(
      menu.setupLoadoutInfoSubmenuRows, -- vanilla or modified
      UI_Mod_1,
      UI_Mod_2,
      UI_Mod_3
    )
  )

主 API 每个 UI 模组必须提供两个函数,并维护它们之间的数据契约:

  • 构建数据:一个必须将所有数据作为数据包返回的函数。框架会将该数据传递给构建函数。如果它返回 nil,则框架跳过该 UI 数据包的执行。
  • 构建函数:一个使用数据包的完整 UI 渲染函数。

LoadoutUI.RegisterUI UI 注册调用示例

local LoadoutUI = _G.LoadoutUI

LoadoutUI.RegisterUI("mod_id", function() 
  return {
    -- use add or replace, or both if you are adding a new UI and replace existing   
    add = {
      {
        newname = "New section name",
        targetname = "Original section name", -- for new UI positioning
        builddata = function(vanillaparams) end,
        buildfunction = function(vanillaparams, builddata) end,
      },
    },
    replace = {
      {
        newname = "New name to replace or the original section name",
        targetname = "Original section name",
        builddata = function(vanillaparams) end,
        buildfunction = function(vanillaparams, builddata) end,
      },
    },
  }
end)

原版参数 这是原版 menu.setupLoadoutInfoSubmenuRows 使用的一个打包参数。本框架会获取菜单函数及其参数的实例,然后将它们传递给您的函数。构建数据函数可以选择不使用它,但它仍然会被传递给它。

-- 参考 menu_map.lua (位于 08.cat) 中的原版 menu.setupLoadoutInfoSubmenuRows 以了解更多详情
local vanillaparams = {
  menu = menu, -- 实例引用 UI 菜单
  mode = mode,
  inputtable = inputtable,
  inputobject = inputobject,
  instance = instance,
}

调试消息 此框架会记录每个 UI 模组的注册,以及针对同一 UI 分区的重复注册情况:

[Loadout UI][RegisterUI] ... 

这些仅用于调试,无法解决冲突问题。


可选 API 用于注册常见服务的附加 API。使用 GetService 来获取共享状态或函数。

LoadoutUI.RegisterService

local service = {
  data = {},
  GetData = function(...) end,
  SetData = function(...) end,
}
LoadoutUI.RegisterService("mod_id", "service_id", service)

LoadoutUI.GetService

local service = LoadoutUI.GetService("service_id")
service.GetData(...)