我想做的是一个小插件,它可以让我知道我在战斗中花费了多少时间,以%为单位,
function()
local spell, _, _, _, _, endTime = UnitCastingInfo("player")
-- getting information from the game itself whether im "Casting"
local inCombat = UnitAffectingCombat("player")
-- getting information form the game if combat is true (1) or not (nil)
local casting = {}
local sum = 0
if inCombat == 1 then
if spell then
table.insert(casting, 1)
else
table.insert(casting, 0)
end
else
for k in pairs (casting) do
casting [k] = nil
end
end
for i=1, #casting, 1 do
sum = sum + casting[i]
end
return( sum / #casting ) end
-- creating a list which adds 1 every frame I am casting and I am in combat,
-- or adds 0 every frame I'm not casting and I'm not in combat.
-- Then I sum all the numbers and divide it by the number of inputs to figure
-- out how much % I have spent "casting".
-- In case the combat condition is false, delete the list
由于某种原因,这些数字根本不加起来,当两个条件都满足时,我只会看到“ 1”;而如果战斗条件得到满足,我只会看到“ 0”。
我确定可能会有更好的方法,但是对于lua和一般而言,我是新手。
答案 0 :(得分:0)
您说您是Lua的新手,所以我将尝试详细解释什么地方出了问题以及如何加以改进,因此请您认真阅读。
我假设您的函数将在游戏的每个帧/步骤/刻度/任何您想调用的地方被调用。由于您在函数的开头设置了sum = 0
和casting = {}
,因此每次都会调用此函数。这就是为什么总是总是得到0或1的原因。
Lua有一个很好的东西,叫做词法作用域。我不会赘述,但基本思想是:如果在定义函数时访问变量(在范围内),则该函数会记住该变量,无论在何处调用它。例如:
local foo
do
local var = 10
foo = function() return var end
end
print(bar) -- nil
print(foo()) -- 10
您还可以为该变量分配一个新值,下次调用该函数时,它仍将具有该新值。例如,这是一个简单的计数器功能:
local counter
do
count = 0
counter = function() count = count + 1; return count; end
end
print(counter()) -- 1
print(counter()) -- 2
-- etc.
将其应用于您的情况,从一次调用到下一次调用需要保持哪些值?
在函数的外部中定义这两个值,并根据需要递增/读取/重置它们;它会在重复调用函数之间持续存在。
注意事项:
casting
不必是表格。表与整数相比要慢一些,即使重新使用它们也是如此。如果您需要数数,那么数字就绰绰有余。不在战斗中时,只需casting = 0
,在战斗中时将其增加1即可。答案 1 :(得分:0)
感谢大家的反馈,最后在您提出建议和研究后,我的代码看起来像这样,效果很好:
function()
local spell, _, _, _, startTime, endTime, _, _, _ = UnitCastingInfo("player")
local inCombat = UnitAffectingCombat("player")
local inLockdown = InCombatLockdown()
local _, duration, _, _ = GetSpellCooldown("Fireball")
casting = casting or {}
local sum = 0
if inCombat == 1 or inLockdown == 1 then
if spell or duration ~= 0 then
casting[#casting+1] = 1
elseif spell == nil or duration == 0 then
casting[#casting+1] = 0
end
else
local next = next
local k = next(casting)
while k ~= nil do
casting[k] = nil
k = next(casting, k)
end
end
for i=1, #casting, 1 do
sum = sum + casting[i]
end
return(("%.1f"):format( (sum / #casting)*100 ).. "%%") end
我注意到在重置原始代码表时出现问题:
for k in pairs (casting) do
casting [k] = nil
似乎有些零停留在那里,或者表的大小没有“缩小”,我不知道。
也许intereger比一张桌子要快,但是老实说,即使桌子变得异常大(5分钟,60 fps,多数民众赞成18k输入),我也看不到任何性能问题,这也是为了学习一种新的语言来更好我觉得更难做到
致谢