示例:编写一个函数库
函数库用于把通用能力封装起来供任务复用。它由两部分组成:
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)并发布后,其他作者就可以在清单里依赖你的函数库了。