vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:

local mod = klhtm
local me = { }
mod.table = me

me.mydata = { } -- personal threat table data
me.raiddata = { } -- raid's threat table data
me.raidthreatoffset = 0 -- difference between your total threat and your raid threat

me.raidclasses = { } -- list of classes by player name. e.g. { ["Kenco"] = "Warrior", }
me.raidupdatetimes = { } -- list of last update times by player, e.g. { ["Kenco"] = GetTime(), }

------------------------------------
--    Special Core.lua Methods    --
------------------------------------

me.onload = function()
        
        -- initialise me.mydata . This refers to static methods from me.string, so goes in our onload().
        me.mydata[mod.string.get("threatsource", "total")] = me.newdatastruct()
        
end

--[[
We have the list me.raiddata, key = name, value = threat. Then the list me.raidupdatetimes, key = value, name = time.
We want to remove people from raiddata who are not in the raid / party, and also to reset the threat of people who are
in the party, but who haven't updated for a while.
]]

me.lastonupdate = 0                     -- value of GetTime()
me.updateinterval = 1.0         -- at most once every second
me.idlereset = 15.0                     -- seconds before we reset someone's threat

me.onupdate = function()

        -- 1) check for update time
        local timenow = GetTime()
        if timenow > me.lastonupdate + me.updateinterval then
                me.lastonupdate = timenow
        else
                return
        end

        local x
        
        -- 2) Remove people who aren't in the raid group
        for x, _ in me.raiddata do
                
                if (x ~= mod.string.get("misc", "aggrogain")) and (mod.unit.isplayeringroup(x) == nil) then
                        
                        if mod.out.checktrace("info", me, "idleplayer") then
                                mod.out.printtrace(string.format("Removing %s from the table, since he isn't in the raid group.", x))
                        end
                        
                        me.raiddata[x] = nil
                        me.raidupdatetimes[x] = nil
                        
                end
        end

        -- 3) Reset inactive people
        for x, _ in me.raiddata do
                if me.raidupdatetimes[x] == nil then
                        me.raidupdatetimes[x] = timenow

                elseif (timenow > me.raidupdatetimes[x] + me.idlereset) and (me.raiddata[x] ~= 0) then
                        me.raiddata[x] = 0
                        me.raidupdatetimes[x] = timenow
                        
                        if mod.out.checktrace("info", me, "idleplayer") then
                                mod.out.printtrace(string.format("Resetting %s's threat, since he hasn't updated for a while.", x))
                        end
                end
        end
                

end


-- to save lots of writing!
me.newdatastruct = function()
        
        return
        {
                ["hits"] = 0,
                ["damage"] = 0,
                ["threat"] = 0,
                ["rage"] = 0,
        }
        
end


-----------------------------------------------------

--[[ 
mod.table.getraidthreat()
Returns the value you would post to the raid group as your threat.
]]
me.getraidthreat = function()

        return me.mydata[mod.string.get("threatsource", "total")].threat + me.raidthreatoffset

end

--[[ 
mod.table.resetraidthreat()
Set your threat for the rest of the raid group to 0. Used for a complete threat wipe.
]]
me.resetraidthreat = function()
        
        me.raidthreatoffset = - me.mydata[mod.string.get("threatsource", "total")].threat
        
end

--[[ 
mod.table.updateplayerthreat(player, threat)
Updates a raid threat entry.
<player> is the name of the player whose threat is updated
<threat> is the new amount
TODO: add code to change aggrogain here, if player is master target???
]]
me.updateplayerthreat = function(player, threat)
        
        me.raiddata[player] = threat
        me.raidupdatetimes[player] = GetTime()

end


--[[ 
mod.table.redoraidclasses()
Checks the raid / party and finds the class of every player.
]]
me.redoraidclasses = function()
        
        local numraiders = GetNumRaidMembers()
        local class
        
        if (numraiders == 0) then
                -- we're not in a raid. check party
                
                local numparty = GetNumPartyMembers()
                
                for x = 1, numparty do
                        _, class = UnitClass("party" .. x)
                        me.raidclasses[UnitName("party" .. x)] = string.lower(class)
                end
                
                -- also do yourself
                me.raidclasses[UnitName("player")] = mod.my.class
                
        else -- we're in a raid
                
                local class
                local name
                
                for x = 1, numraiders do
                        _, class = UnitClass("raid" .. x)
                        me.raidclasses[UnitName("raid" .. x)] = string.lower(class)
                end
        end
end

--[[
mod.table.resetmytable()
Clears all the data in your personal threat table.
]]
me.resetmytable = function()
        
        -- reset raid offset
        me.raidthreatoffset = me.getraidthreat()
        
        -- clear table
        local key
        local value
        local key2
        
        for key, value in me.mydata do
                for key2 in value do
                        value[key2] = 0
                end
        end
        
end

--[[ 
mod.table.resetraidtable()
Clears all the data in the raid table.
]]
me.clearraidtable = function()

        local key
        
        for key, _ in me.raiddata do
                me.raiddata[key] = nil;
        end
        
        me.raiddata[UnitName("player")] = 0

end