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等)。对我所做错的任何帮助都会非常感激。
答案 0 :(得分:0)
此代码可能存在的问题是在函数arg
中使用了已弃用的InputConsole()
功能。 Lua 5.0使用arg
作为一种方法,使用参数列表中的...
标记来访问声明为variadic的函数的实际参数。
编辑:但可能并不正确。
实际问题看似于从PlayerId
到pID
的习语切换。前者是函数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()
。