Lua接口/返回值判断

来自天龙知识库
跳到导航跳到搜索

首页 · 服务端接口 · 调用约定

先查函数的返回约定,再判断值。0、负数、空字符串、nil 不能用同一条成功规则处理。

Lua 条件判断

在 if 中 注意事项
nil 可能是无返回值、未赋值,或多返回值中的缺失项。
false Lua 布尔值;不等同于数值 0。
0 可以表示计数为零、有效位置或业务失败,需看接口。
-1 等负数 可能是错误码或有效业务数值,不能只按正负判断。
"" 空字符串也会进入 if result then 分支。

只有 nil 和 false 为假。if result then 不能用来判断返回数字的接口是否成功;result == true 也不会把数字 1 当作 true。

按接口区分

接口 应如何理解
EndAddItem 1 表示当前可接收列表,0 表示不能接收,-1 表示疲劳限制或对象无效等失败。检查通过后仍需发放。
GetItemCount 0 表示计数为零,不是函数不存在;-1 是对象无效等失败路径。计数范围包括已装备物品。
GetBagPosByItemSn 0 是有效背包位置,-1 表示未找到或失败,判断位置用 >= 0。
GetName 返回字符串,失败可返回空字符串。先确认类型,再检查是否为空。
LuaFnIsItemLocked 1 是交易锁,0 是未发现交易锁,-2 是位置越界,-1 是玩家无效等失败。
LuaFnDelAvailableItem 正数量扣除流程报告成功为 1,失败为 0;非正数量直接返回 1 但不扣除,失败也可能已部分扣除。
AddTextEndEvent 无返回值;赋值接收得到 nil,不表示函数不存在。

计数与字符串示例

local count = GetItemCount(sceneId, selfId, itemTypeSn)
if type(count) == "number" and count >= 0 then
    -- count 为有效计数;0 表示没有计入的物品
else
    -- 本次查询未取得有效计数
end

local name = GetName(sceneId, selfId)
if type(name) == "string" and name ~= "" then
    -- name 为非空名称
end

itemTypeSn 必须来自已确认有效的物品配置。不能只写 name ~= "":nil 也不等于空字符串,类型检查可以避免误判。

多个返回值按位置接收

local x, z = GetWorldPos(sceneId, selfId)
if type(x) == "number" and type(z) == "number"
    and x ~= -1 and z ~= -1 then
    -- x、z 是场景平面坐标
end

local petGuidHigh, petGuidLow = LuaFnGetCurrentPetGUID(sceneId, selfId)
if type(petGuidHigh) == "number" and type(petGuidLow) == "number" then
    -- 取得当前召唤珍兽的 GUID 高段、低段
else
    -- 无召唤珍兽或未取得结果
end

GetWorldPos 失败返回 -1、-1;LuaFnGetCurrentPetGUID 在没有召唤珍兽等路径不返回值,此时两个变量都是 nil。少接收变量会丢掉后面的结果;给函数调用外面加一对括号,也可能把多返回值收缩成第一项。

返回成功不等于整段业务完成

EndAddItem 只检查能否接收,AddItemListToHuman 才执行发放且无返回值。扣除、发放、保存领取记录是不同步骤,不能只看其中一次返回 1 就推断整段业务成功。

未注明的枚举、异常后的背包变化和完整业务结果需要实测。失败后自动重试可能造成重复扣除,先核对具体接口的副作用,见 扣除可用物品示例

相关问题

服务端调用约定 · 服务端调用示例

示例依据当前服务端注册名称和参数读取顺序核对;sceneId、selfId 等上下文及业务编号由实际回调提供。Lua 语法检查不能代替游戏内实测。