游戏原生接口
任务与界面环境不能直接访问游戏对象(Player、Pet、Talk 等)。要使用它们,必须把一段 Lua
代码字符串交给游戏环境执行,这通过 DoLuaString 系列函数完成(见 VM 全局函数)。
-- 无返回值:直接执行
DoLuaString("Player:SendAgreeTeamFollow()")
-- 需要返回值时,代码字符串里必须写 return
local name = DoLuaStringAndGetString("return Player:GetName()")
注意
xxxAndGetYyy 系列要求在代码字符串中显式 return,否则拿不到结果。
为什么需要这一层
任务运行在助手自己的 Lua 环境里,和游戏客户端是两个独立的 Lua 状态。DoLuaString 会把代码发到
客户端执行,再把结果按 JSON 转回来。因此有一条重要约束:
- 只能传字符串代码,不能传函数、闭包或 table 引用;
- 返回值只能是 JSON 能表达的类型(数字、字符串、布尔、数组 / 对象)。
常用原生接口
大部分能力已经封装在 黑猫@基础库 里(角色、背包、珍兽、技能、商店……), 优先使用它们。本页只列基础库尚未封装、但常用的原生接口。
聊天 / 喊话
游戏客户端通过 Talk 对象收发聊天。发送一条消息:
Talk:SendChatMessage(频道, 内容)
| 参数 | 类型 | 说明 |
|---|---|---|
| 频道 | string | 见下表 |
| 内容 | string | 要发送的文本 |
频道键(区分大小写):
| 频道键 | 含义 |
|---|---|
near | 附近 |
scene | 世界 |
menpai | 门派 |
guild | 帮会 |
team | 队伍 |
self | 自用 |
任务环境里的典型写法(做了存在性判断与返回码检查):
local function sendShout(channel, text)
-- 实际项目中应先把 channel / text 转义,避免其中的引号破坏代码字符串
local code = string.format(
'if Talk and Talk.SendChatMessage then Talk:SendChatMessage("%s","%s") return 1 end return 0',
channel, text)
return tonumber(DoLuaStringAndGetInteger(code)) == 1
end
if sendShout("scene", "大家好") then
GoPrint("已发送世界喊话")
end
注意
世界频道(scene)有等级与冷却限制,发送过于频繁可能被服务器拒绝;附近 / 队伍 等频道限制较松。
备注
Talk 是客户端原生对象,可用方法随客户端版本而变。上面写法在 Talk 不存在时会返回 0 而不会报错,
请以实际客户端为准。
角色 / 玩家
常用能力已封装在 黑猫@基础库.player,偶尔需要直接调用原生方法:
local name = DoLuaStringAndGetString("return Player:GetName()")
local hp = DoLuaStringAndGetInteger('return Player:GetData("HP")')
窗口
local shown = DoLuaStringAndGetBool('return IsWindowShow("BagFrame")')
窗口名可用「抓界面」类工具或在游戏环境里打印确认。
调试技巧
拿不准某个原生对象有哪些方法、或返回什么类型时,先在游戏环境里探测:
-- 若对象支持 pairs 遍历,可列出它的键
local keys = DoLuaStringAndGetTable([[
local t = {}
for k in pairs(Talk) do table.insert(t, tostring(k)) end
return t
]])
GoPrint(keys)
提示
类型不确定时,先用 DoLuaStringAndGetString 看原始返回,往往比猜 AndGetInteger 更快定位问题。
下一步:运行环境与可用库。