Lua论点和数字

时间:2013-04-03 20:20:01

标签: lua

function OnChat(PlayerId, Type, Message)

    if Message == "!usecarepackage" then
        if ReadKS1 == "CP" or ReadKS2 == "CP" or ReadKS3 == "CP" then
            InputConsole("msg %s has requested a care package!", Get_Player_Name_By_ID(pID))
            local pos = Get_Position(Get_GameObj(pID))
            pos:AssignY(pos:GetY()+1)
            building = Create_Object("SignalFlare_Gold_Phys3", pos)
            Attach_Script(building, "Test_Cinematic", "caredrop.txt")
            if building == nil then
                 InputConsole("ppage %d Cannot spawn Care Package here.", pID)
            elseif math.random(50, 64) == 50 then
                Attach_Script(building, "z_Set_Team", Get_Team(pID))
                Attach_Script(building, "M00_No_Falling_Damage_DME")
                --Add in rest of numbers and corresponding streak, such as UAV if math.random = 50
            end
        elseif ReadKS1 ~= "CP" or ReadKS2 ~= "CP" or ReadKS3 ~= "CP" then
            InputConsole("ppage %d You are not allowed to use that with your current streak selection", pID)
        end
    end

    return 1
end

我知道这是一个邋code的代码,但是我收到了一个“错误的参数#2到'格式'(数字预期,没有价值)”。这与前面所有其他部分的这段代码有关:

function InputConsole(...)
    Console_Input(string.format(unpack(arg)))
end

最后,这是游戏Command and Conquer Renegade(如果你想查找API等)。对我所做错的任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

此代码可能存在的问题是在函数arg中使用了已弃用的InputConsole()功能。 Lua 5.0使用arg作为一种方法,使用参数列表中的...标记来访问声明为variadic的函数的实际参数。

编辑:但可能并不正确。

实际问题看似于从PlayerIdpID的习语切换。前者是函数OnChat()的命名参数,而后者是函数体中使用的全局变量,无需进一步初始化。未初始化的全局变量为nil,因此将nil传递给InputConsole(),错误消息告诉您真相。

没有解决的老答案

Lua 5.1弃用了该用法,Lua 5.2完全删除了它。

我不确定代码片段提供了哪个版本的Lua实际上在这个游戏中使用,但症状与缺少自动生成的arg表一致。

我会写这样的函数:

function InputConsole(...)
    Console_Input(string.format(...))
end

但是你也可以添加local arg = {...}作为函数的第一行,并获得与Lua 5.0提供的相同的效果,代价是创建(和丢弃)临时表。差异很微妙,主要与表格中nil的处理有关。

为清楚起见,我更喜欢将名字作为第一个参数,因为它不是真正可选的。

function InputConsole(fmt, ...)
    Console_Input(string.format(fmt, ...))
end

如果你可以指望那个参数是一个字符串,那么可以进一步简化为

function InputConsole(fmt,...)
    Console_Input(fmt:format(...))
end

如果需要关注它,请在致电fmt = tostring(fmt)之前说出assert(type(fmt)=="string")Console_Input()