WoW Addon - 收集来自不同事件的相关数据

时间:2016-11-04 15:19:36

标签: events lua add-on world-of-warcraft

我想将两个不同的魔兽世界事件联系在一起。我需要来自两个事件的一些信息,并将它们存储在一个简单的表中。同样重要的是,如果第一个事件被触发,第二个事件的数据仅存储

在我的情况下,它是来自COMBAT_LOG_EVENT_UNFILTERED的生物的名称以及从COMBAT_TEXT_UPDATE获得的声望。 只有通过杀死一个生物才能存储声誉。我目前正在使用临时表来链接它们。它存储第一个事件的名称,并在第二个事件中可读。这是简化的代码:

nehFragger_ReputationDB = {}   -- The actual database for my AddOn.
local tempKillLog = {}   -- A table that I use to link the different events.

function nehFraggerFrame_OnLoad(frame)
    frame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
    frame:RegisterEvent("COMBAT_TEXT_UPDATE")
end

function nehFraggerFrame_OnEvent(frame, event, ...)

    local arg1, eventType, arg3, arg4, sourceName, arg6, arg7, destGUID, destName = select(1, ...)
    if (event == "COMBAT_LOG_EVENT_UNFILTERED") then
        if (eventType == "PARTY_KILL") then
            tempKillLog.creatureGUID = destGUID   -- The unique identifier of the creature.
            tempKillLog.creatureName = destName    -- The creature name that I need.
        end
    end

    local eventType, faction, reputation = select(1, ...)
    if (event == "COMBAT_TEXT_UPDATE") then
        if (eventType == "FACTION") then
            local GUID = TempKillLog.creatureGUID
            if (string.upper(string.sub(GUID, 1 , 8)) == "CREATURE") then   -- Make sure the link-table data really is a creature.
                local creatureName = tempKillLog.creatureName   -- The name from my link-table.
                local reputationGain = reputation   -- The reputation that I need.
                -- Simply store the stuff to the database table for this faction:
                nehFragger_ReputationDB[faction] = {}
                nehFragger_ReputationDB[faction].creatureName = creatureName
                nehFragger_ReputationDB[faction].reputationGain = reputationGain
            end
        end
    end

end

这有点...... (见下文)有几个问题。

我的问题是:
是否有可能 - 为一般的不同事件的来源(例如destGUID COMBAT_LOG_EVENT)获取一些唯一标识符以连接这些事件 - 或者是否有更简单的方法来获得杀戮的声誉(包括生物和声誉信息),就像我的AddOn一样?

需要考虑的其他事项:
我还尝试在两个事件中使用当前时间来检查这些是否在0.01秒内被触发。这会消除我遇到的大量问题,但在某些情况下仍然会失败。例如,如果你通过杀死一个生物完成这些新的军团世界任务中的一个,然后获得任务本身的声誉。这仍然在时间范围内,无论它有多小。

另一个问题是,如果你一次杀死多个(比方说5个)生物,那么第一个事件COMBAT_LOG_EVENT_UNFILTERED会先连续发射5次,然后第二个事件COMBAT_TEXT_UPDATE会发射5次。在这种情况下,我nehFragger_ReputationDB中的所有5个日志都获得了正确的声望,但所有这些日志都被杀死/处理了最后一个生物的名字...

我真的想使用GUID两个事件来链接它们,但是我无法得到第二个事件之一 - 如果存在一个事件。在我看来,这将是最清洁,最安全的方式 或者,就像已经提到的那样,为此专门举办魔兽世界。但我找不到一个。

我希望有人可以在这里帮助我,或者提供一些思考的食物。

0 个答案:

没有答案