几个小时前,lua还是一个全新的人,我在C ++和Java方面有一定的背景知识,但没什么令人惊奇的。
我正在尝试为一款游戏插件,以检查周围的玩家,如果可以(在10码内)打招呼。
它的效果很好,只不过我只希望每个玩家运行一次,否则它会变得垃圾且烦人,经常向人们打招呼。
我想最好的方法是将它们的字符名称存储在数组中,但是我在努力理解数组的语法。
function Wave()
local totalObjects = GetObjectCount()
local shouldMessage = false
local player = GetActivePlayer()
arrayNames = {}
for i = 1, totalObjects do
local object = GetObjectWithIndex(i)
if object ~= player and UnitIsPlayer(object) == true and UnitIsDead(object) == false then
local yards = GetDistanceBetweenObjects(player, object)
local name = ObjectName(object)
----------------- The beginning of my issue ----------------
if yards < 10 and arrayNames[i] ~= name then -- if name isnt in array already?
arrayNames[i] = name -- trying to add the name to array
print(arrayNames[i])
break
end
end
end
if storeName then
end
end
问题在于,每次调用Wave后,您的表都会被清除。这是因为您arrayNames = {}
在函数内部,所以每次运行该表时都会将其设置为一个新的空表。您可以arrayNames
在Wave
函数外部定义或将其更改为arrayNames = arrayNames or {}
第二个选项。第二个选项将设置为arrayNames
等于arrayNames
定义时的值,如果未定义,则设置为新表。
另外
您的代码仅检查name
特定索引处的数组中是否存在,而不检查整个数组。如果玩家的索引可以更改,那么您可能会使用此方法再次打招呼。
您也需要遍历整个数组,以确保您尚未与这个人打招呼。这意味着,随着您与越来越多的人打招呼,支票会越来越长
建议不要使用数组,而不要使用数组:
if yards < 10 and not arrayNames[name] then -- if name isnt in set already?
arrayNames[name] = true -- trying to add the name to set
print(name)
break
end
只需使用name
键作为键将其添加到表中,并将其设置为该值true
将为您的检查提供O(1)性能。
这是有关布景的更多信息:https : //en.wikipedia.org/wiki/Set_(abstract_data_type)
在计算机科学中,集合是一种抽象数据类型,可以存储唯一值而没有任何特定顺序。它是有限集的数学概念的计算机实现。与大多数其他集合类型不同,通常不从集合中检索特定元素,而是测试集合中成员资格的值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句