World of Warcraft Lua - поток операторов if

Пытаюсь создать аддон для World of Warcraft. Я создал функцию, которая проверяет, был ли добавлен бафф к текущему игроку.

Button:RegisterEvent("UNIT_AURA");
local function auraGained(self, event, ...)
    if (UnitAura("player", "Heating Up")) then
             if (heatingUpIsActive ~= 1) then
             heatingUpIsActive = heatingUpIsActive + 1
            print (heatingUpIsActive) 
            end 
    end
Button:SetScript("OnEvent", auraGained);

Это прекрасно работает, но как мне проверить, является ли UnitAura не "Heating Up"?

Кроме того, я бы предпочел, чтобы heatingUpIsActive был boolean, но мне не нравится, когда я это делаю. Как правильно создать boolean в Lua?


person GreenWire    schedule 04.04.2013    source источник


Ответы (1)


Ваша функция не проверяет ауру, вызвавшую событие. Он ищет "Разогрев" каждый раз, когда приходит какое-нибудь UNIT_AURA событие. Фактически, похоже, что событие UNIT_AURA на самом деле не говорит вам, какая аура его вызвала. Таким образом, вы не можете «проверить, является ли UnitAura не "Heating Up"», потому что вы просто не знаете, какая аура вызвала событие. Возможно, это было даже несколько аур сразу.

Тем не менее, событие говорит вам, какой юнит получил ауру. Это первый варарг. Вам, вероятно, следует проверить, player перед тем, как что-то делать

local unitid = ...
if unitid ~= "player" then return end

Кроме того, вы не объяснили, какие у вас проблемы с логическими значениями. Вы должны просто сказать что-нибудь вроде

if not heatingUpIsActive then
    heatingUpIsActive = true
    -- do whatever you want
end

хотя я никогда не видел объявления переменной в вашем коде. Использовать глобальные переменные для подобных вещей - плохая идея, поэтому вам следует объявить

local heatingUpIsActive

перед объявлением функции, например

local heatingUpIsActive
local function auraGained(self, event, ...)
    -- ...
person Lily Ballard    schedule 04.04.2013
comment
Спасибо за быстрый ответ! Насколько я понимаю (и простите меня, если я ошибаюсь в этом), я здесь делаю то, что событие UNIT_AURA вызывается всякий раз, когда юнит в области получает или теряет ауру. В конечном счете, что я хочу сделать, это когда на плеере активен нагрев, установите heatingUpIsActive в значение true. По моей логике, когда нагревание больше не на плеере, будет вызываться UNIT_AURA, я обнаруживаю, что его там нет, и устанавливаю heatingUpIsActive на false. Было бы это неправильным взглядом на эту проблему? - person GreenWire; 05.04.2013
comment
И чтобы ответить на ваш вопрос о логических значениях, в этом фрагменте кода я объявил переменную heatingUpIsActive = true, и аддон не загружался, но работал нормально, когда я объявил его как heatingUpIsActive = 1. Так что меня смутило 0_0 - person GreenWire; 05.04.2013
comment
@GreenWire: Ваше понимание UNIT_AURA кажется мне правильным. Если вы хотите установить heatingUpIsActive на false, когда аура исчезнет, ​​просто добавьте else heatingUpIsActive = false. - person Lily Ballard; 05.04.2013
comment
@GreenWire: И когда вы говорите, что аддон не загружается, что именно было не так? Вы получили ошибку? Может быть, есть глобальная переменная с именем heatingUpIsActive из другого дополнения, которая должна быть числом? Использование местного, как я предлагал, исправит это. - person Lily Ballard; 05.04.2013
comment
lol ... Я, должно быть, просто страдала от этого. Теперь он отлично работает, логические и все такое. Мой мыслительный процесс нужно было изменить, потому что if (UnitAura ("player", "Heating Up") не соответствует действительности, тогда else позаботится обо всем остальном. Ага. Извините за то, что был нублитом, и большое спасибо за вашу помощь! Ты удивительный! - person GreenWire; 05.04.2013
comment
Я последовал твоему совету и вложил его в свой код. Если можете, у меня есть еще один опубликованный мной вопрос, связанный с этим. Вы можете проверить это здесь: stackoverflow.com / questions / 15823838 / - person GreenWire; 05.04.2013