跳到主要内容

示例:编写一个函数库

函数库用于把通用能力封装起来供任务复用。它由两部分组成:

  • require 模块:纯 Lua 封装,供任务在自己的运行环境中调用;
  • inject/ 脚本:注入到游戏环境,提供原生操作。

本示例写一个 黑猫@我的工具库。

目录结构​

apps/黑猫@我的工具库/
├── .hm.json
├── util.lua # require("黑猫@我的工具库.util")
└── inject/
└── native.lua # 注入到游戏环境

1. 清单​

apps/黑猫@我的工具库/.hm.json
{
"名称": "我的工具库",
"作者": "黑猫",
"类型": "函数库",
"版本": "v1.0",
"简介": "提供角色血量与寻路辅助",
"仓库地址": "",
"依赖软件包": {}
}

2. 注入脚本:定义游戏原生函数​

inject/ 下的代码运行在游戏环境中,可以直接访问 Player 等对象。

apps/黑猫@我的工具库/inject/native.lua
-- 获取角色血量百分比(在游戏环境中执行)
function mylib_getHpPercent()
local hp = Player:GetData("HP")
local maxHp = Player:GetData("MAXHP")
if maxHp == nil or maxHp == 0 then
return 0
end
return hp * 100 / maxHp
end

3. require 模块:封装给任务使用​

任务环境无法直接访问游戏对象,需要通过 DoLuaString 调用上一步的原生函数。

apps/黑猫@我的工具库/util.lua
local util = {}

--- 获取角色血量百分比
---@return number
function util.getHpPercent()
return DoLuaStringAndGetInteger("return mylib_getHpPercent()")
end

--- 判断血量是否低于指定百分比
---@param threshold number
---@return boolean
function util.isHpBelow(threshold)
return util.getHpPercent() < threshold
end

--- 在血量过低时自动打坐
---@param threshold number
function util.meditateIfLow(threshold)
if util.isHpBelow(threshold) then
DoLuaString("hml_useAction(1001)") -- 示例:对应某个打坐动作
Delay(1000)
end
end

return util

4. 在任务中使用​

依赖该函数库:

apps/黑猫@某任务/.hm.json
{
"名称": "某任务",
"作者": "黑猫",
"类型": "任务",
"版本": "v1.0",
"依赖软件包": {
"黑猫@我的工具库": "v1.0"
}
}
apps/黑猫@某任务/index.lua
local util = require("黑猫@我的工具库.util")

CheckTime = 1000

function Check()
return 1
end

function Main()
GoPrint("当前血量百分比:" .. util.getHpPercent())
util.meditateIfLow(30)
Delay(1000)
end

要点​

  • 函数库的 类型 是 "函数库",不会出现在任务列表。
  • inject/ 只在被依赖时注入;函数库自己启动时不会用到它。
  • 任务通过 require("全名.模块") 使用函数库的纯 Lua 模块。
  • 任务不能直接访问 Player 等对象,必须经由 DoLuaString 触发注入的原生函数, 这些细节都封装在函数库里,任务侧保持简洁。

发布与复用​

把仓库打上 tag(如 v1.0)并发布后,其他作者就可以在清单里依赖你的函数库了。


掌握了函数库,你就拥有了构建复杂任务的全部工具。回到 VM 全局函数 或 黑猫@基础库 查阅更多可用的能力吧。