嘿,我对lua很新,已经开始盯着lua乱搞了。我已经编写了以下脚本,在数组的帮助下打印出构造函数中每个可用对象的距离和角度但是我的方式存在很大问题:
me = {'["game.exe"+2A]','["game.exe"+A8]','["game"+6A8]'}
botallx = {'["game.exe"+01]','["game.exe"+02]','["game.exe"+03]',
'["game.exe"+04]','["game.exe"+05]','["game.exe"+06]','["game.exe"+07]',
'["game.exe"+08]','["game.exe"+09]','["game.exe"+10]','["game.exe"+11]',
'["game.exe"+12]'}
botally = {'["game.exe"+31]','["game.exe"+32]','["game.exe"+33]',
'["game.exe"+34]','["game.exe"+35]','["game.exe"+36]','["game.exe"+37]',
'["game.exe"+38]','["game.exe"+39]','["game.exe"+30]','["game.exe"+31]',
'["game.exe"+32]'}
botallz = {'["game.exe"+51]','["game.exe"+52]','["game.exe"+53]',
'["game.exe"+54]','["game.exe"+55]','["game.exe"+56]','["game.exe"+57]',
'["game.exe"+58]','["game.exe"+59]','["game.exe"+50]','["game.exe"+51]',
'["game.exe"+52]'}
function sight_angle()
if (isKeyPressed(VK_E)) then
for i=1, 12 do
if (botallx[i] ~= nil or botally[i] ~= nil or botallz[i] ~= nil ) then
vecX=readFloat(me[1])-readFloat(botallx[i])
vecY=readFloat(me[2])-readFloat(botally[i])
vecZ=readFloat(me[3])-readFloat(botallz[i])
distance=math.sqrt(math.pow(calcZ,2)+math.pow(calcX,2))
angleX=math.deg(math.atan2(calcZ, calcX))
print ("current distance is " .. distance)
print ("current angle is " .. angleX)
else --One of the botallx, botally, botallz value was nil
print ("Can't perform calculations due to a nil value")
end
end
end
这些名为[“game.exe”+ ...]的地址包含一个浮点值,但是botally,botallx和botallz容器中的一些对象是零或没有值。因此,当我执行脚本时,i = 1到12的数组开始计算第一个并给出角度和距离,但是一直计算直到它从具有零值的容器中击中一个对象然后不想携带在计算其他对象。
示例:对象1,3,6在botally中,botallx和botallz有值,其他一切都是零。 它开始计算第一个...给出距离和角度,但然后停止在scenond并开始抱怨由于零值而无法执行计算,所以它跳回到第一个对象并给我dist和角度再次。
但我希望它跳过第二个空的nil对象并继续第三个对象,它有一个值并打印我的距离和角度,然后跳过空的第4个和第5个并计算第6个和之后,它可以再次跳回到第一个,因为从7到12的其余部分是零。
但它不想这样做....有人可以帮助我吗? :(
答案 0 :(得分:0)
一般来说,在lua中,你应该使用~= nil
检查一个值是否为零。所以你可以修改你的代码:
for i=1, 12 do
--Do the following calculations only if botallx or botally or botallz
-- are not nil
if (botallx[i] ~= nil or botally[i] ~= nil or botallz[i] ~= nil ) then
vecX=readFloat(me[1])-readFloat(botallx[i])
vecY=readFloat(me[2])-readFloat(botally[i])
vecZ=readFloat(me[3])-readFloat(botallz[i])
distance=math.sqrt(math.pow(calcZ,2)+math.pow(calcX,2))
angleX=math.deg(math.atan2(calcZ, calcX))
print ("current distance is " .. distance)
print ("current angle is " .. angleX)
else --One of the botallx, botally, botallz value was nil
print ("Can't perform calculations due to a nil value")
end
或者上面的if语句也可以这样写:
if (botallx[i] not nil or botally[i] not nil or botallz[i] not nil )
答案 1 :(得分:0)
我认为您想要的是 and
而不是 or
。使用 or
,您要检查其中至少一个存在,然后使用无论如何都不存在的那些。
if (botallx[i] ~= nil and botally[i] ~= nil and botallz[i] ~= nil ) then
或者:
if botallx[i] and botally[i] and botallz[i] then
尽管这些 botall
地址在您设置表格的方式中总是非零的。
什么是calcX
和calcZ
? 您的意思是 vecX
和 vecZ
在那里吗?如果是这样,那就是您的零算术异常。如果您不知道,未声明的变量具有 nil 值,而不是像大多数其他语言一样导致“未知符号”错误。
假设 calcX
问题只是复制/粘贴错误,您可能需要对这些 readFloat(...)
调用进行一些 nil 检查。
function sight_angle()
if (isKeyPressed(VK_E)) then
local meX = readFloat(me[1])
local meY = readFloat(me[2])
local meZ = readFloat(me[3])
if not meX or not meY or not meZ then
print ("Can't perform calculations due to a nil value")
return
end
for i=1, 12 do
-- Ditch the botall nil checks
local bX = readFloat(botallx[i])
local bY = readFloat(botally[i])
local bZ = readFloat(botallz[i])
if bX and bY and bZ then
local vecX=meX-bX
local vecY=meY-bY
local vecZ=meZ-bZ
-- Assuming calcX and calcZ meant vecX and vecZ
local distance=math.sqrt(math.pow(vecZ,2)+math.pow(vecX,2))
local angleX=math.deg(math.atan2(vecZ, vecX))
print ("current distance is " .. distance)
print ("current angle is " .. angleX)
else
print ("Can't perform calculations due to a nil value")
end
end
end
end
当然,我完全不知道这些东西是做什么的!这是作弊引擎插件吗?我只是基于我在您的代码片段中看到的内容。