Index: Banzai-1.0.lua
===================================================================
--- Banzai-1.0.lua (revision 11830)
+++ Banzai-1.0.lua (working copy)
@@ -22,10 +22,49 @@
local lib = {}
AceLibrary("AceEvent-2.0"):embed(lib)
+local RL = nil
local roster = nil
local playerName = nil
-------------------------------------------------------------------------------
+-- Utility
+-------------------------------------------------------------------------------
+
+local function acquire(a1,a2,a3,a4,a5)
+ local t = next(heap)
+ if t then
+ heap[t] = nil
+ assert(not next(t), "A table in the compost heap has been modified!")
+ end
+ t = t or {}
+
+ if a1 ~= nil then table.insert(t, a1) end
+ if a2 ~= nil then table.insert(t, a2) end
+ if a3 ~= nil then table.insert(t, a3) end
+ if a4 ~= nil then table.insert(t, a4) end
+ if a5 ~= nil then table.insert(t, a5) end
+ return t
+end
+
+
+local function reclaim(t, d)
+ if type(t) ~= "table" then return end
+
+ if d and d > 0 then
+ for i in pairs(t) do
+ if type(t[i]) == "table" then reclaim(t[i], d - 1) end
+ end
+ end
+
+ for i in pairs(t) do t[i] = nil end
+ t.reset = 1
+ t.reset = nil
+ table.setn(t, 0)
+
+ heap[t] = true
+end
+
+-------------------------------------------------------------------------------
-- Initialization
-------------------------------------------------------------------------------
@@ -38,9 +77,10 @@
end
end
- roster = AceLibrary("RosterLib-2.0").roster
+ RL = AceLibrary("RosterLib-2.0")
+ roster = RL.roster
playerName = UnitName("player")
- self:ScheduleRepeatingEvent("UpdateAggroList", self.UpdateAggroList, 0.5, self)
+ self:ScheduleRepeatingEvent("UpdateAggroList", self.UpdateAggroList, 0.2, self)
if oldDeactivate then oldDeactivate(oldLib) end
end
@@ -50,8 +90,10 @@
-------------------------------------------------------------------------------
function lib:UpdateAggroList()
+ local oldBanzai = acquire()
+
for i, unit in pairs(roster) do
- local oldbanzai = unit.banzai
+ oldBanzai[unit.unitid] = unit.banzai
-- deduct aggro for all, increase it later for everyone with aggro
if not unit.banzaiModifier then unit.banzaiModifier = 0 end
@@ -59,9 +101,13 @@
-- check for aggro
local targetName = UnitName(unit.unitid .. "targettarget")
+ -- is this guy targetting something we can kill?
if roster[targetName] and UnitCanAttack("player", unit.unitid .. "target") then
if not roster[targetName].banzaiModifier then roster[targetName].banzaiModifier = 0 end
roster[targetName].banzaiModifier = roster[targetName].banzaiModifier + 10
+ roster[targetName].banzaiTarget = unit.unitid .. "target"
+ else
+ roster[targetName].banzaiTarget = nil
end
-- cleanup
@@ -70,14 +116,46 @@
-- set aggro
unit.banzai = (unit.banzaiModifier > 15)
+ end
- if oldbanzai ~= unit.banzai and targetName == playerName then
- self:TriggerEvent("Banzai_PlayerAggro", unit.unitid .. "target")
+ for i, unit in pairs(roster) do
+ if oldBanzai[unit.unitId] ~= unit.banzai then
+ -- Aggro status has changed.
+ if unit.banzai then
+ -- Unit has aggro
+ self:TriggerEvent("Banzai_UnitGainedAggro", unit.banzaiTarget)
+ if unit.name == playerName then
+ self:TriggerEvent("Banzai_PlayerGainedAggro", unit.banzaiTarget)
+ end
+ else
+ -- Unit lost aggro
+ self:TriggerEvent("Banzai_UnitLostAggro", unit.unitid)
+ if unit.name == playerName then
+ self:TriggerEvent("Banzai_PlayerLostAggro", unit.unitid)
+ end
+ end
end
end
+
end
-------------------------------------------------------------------------------
+-- API
+-------------------------------------------------------------------------------
+
+function lib:GetUnitAggroByUnitId( unitId )
+ local rosterUnit = RL:GetUnitObjectFromUnit(unitId)
+ if not rosterUnit then return nil end
+ return rosterUnit.banzai
+end
+
+function lib:GetUnitAggroByUnitName( unitName )
+ local rosterUnit = RL:GetUnitObjectFromName(unitName)
+ if not rosterUnit then return nil end
+ return rosterUnit.banzai
+end
+
+-------------------------------------------------------------------------------
-- Register
-------------------------------------------------------------------------------
AceLibrary:Register(lib, MAJOR_VERSION, MINOR_VERSION, activate)