local addonname, addontbl = ... local addon = LibStub("AceAddon-3.0"):NewAddon(addonname, "AceEvent-3.0", "AceTimer-3.0") local L = addontbl.L function addon:OnInitialize() end function addon:OnEnable() -- DB local defaults = { profile = { minthreat = 5000, dynamic_minthreat = true, enabled_in = { dungeon = true, raid = false }, raid_icons = { 8, 7, 1, 2 }, icon_recycle = true, icon_recycle_time = 50 } } self.db = LibStub("AceDB-3.0"):New("KungalooshDB", defaults, true) self:CreateConfig() self:UnregisterEvent"ADDON_LOADED" self:RegisterEvent"PLAYER_ROLES_ASSIGNED" self:RegisterEvent"PLAYER_ENTERING_WORLD" self:EnableIfTank() end function addon:Print(...) print("|cFF33FF99Kungaloosh|r "..string.format(...)) end function addon:PLAYER_ROLES_ASSIGNED() self:EnableIfTank() end function addon:PLAYER_ENTERING_WORLD() self:EnableIfTank() end function addon:PLAYER_REGEN_ENABLED() self:ResetState() end function addon:UNIT_THREAT_LIST_UPDATE(event, unit) if not unit then return end local guid = UnitGUID(unit) local icon = self:GetRaidIconByGUID(guid) or self:GetNextIcon() if icon and GetRaidTargetIndex(unit) == nil then local istanking, status, threatpct, rawthreatpct, threat = UnitDetailedThreatSituation("player", unit) if threat and threat > (self:GetMinThreat() * 100) then SetRaidTarget(unit, icon) end end end function addon:COMBAT_LOG_EVENT_UNFILTERED(event, timestamp, cevent, hidecaster, sguid, sname, sflags, sflags2, dguid, dname, dflags, dflags2) if cevent == "UNIT_DIED" then local icon = self:GetRaidIconByGUID(dguid) if icon and self.db.icon_recycle then self:ScheduleTimer("ResetIcon", self.db.profile.icon_recycle_time, icon) end end end local function CheckUnit(unit) if UnitExists(unit) then local icon = GetRaidTargetIndex(unit) local guid = UnitGUID(unit) if icon then local oldguid = addon:GetGUIDByRaidIcon(icon) local oldicon = addon:GetRaidIconByGUID(guid) if guid ~= oldguid then if oldicon then addon.iconguids[oldicon] = nil end addon.iconguids[icon] = guid end else local oldicon = addon:GetRaidIconByGUID(guid) if oldicon then addon.iconguids[oldicon] = nil end end end end function addon:RAID_TARGET_UPDATE() CheckUnit"player" CheckUnit"focus" CheckUnit"target" CheckUnit"targettarget" CheckUnit"pet" CheckUnit"pettarget" for i = 1,40 do if i <= 5 then CheckUnit("party"..i) CheckUnit("party"..i.."target") end CheckUnit("raid"..i) CheckUnit("raid"..i.."target") end end function addon:ResetState() self:CancelAllTimers() self.iconguids = self.iconguids or {} table.wipe(self.iconguids) end function addon:ResetIcon(icon) self.iconguids[icon] = nil end function addon:GetRaidIconByGUID(guid) for icon, iguid in pairs(self.iconguids) do if guid == iguid then return icon end end end function addon:GetGUIDByRaidIcon(icon) return self.iconguids[icon] end function addon:GetNextIcon() for i, icon in ipairs(self.db.profile.raid_icons) do if not addon:GetGUIDByRaidIcon(icon) then return icon end end end function addon:GetMinThreat() if self.db.profile.dynamic_minthreat then local level = UnitLevel"player" local multiplier = (level > 80 and 3.0) or 1.2 return (level * level) * multiplier else return self.db.profile.minthreat end end function addon:EnableIfTank() local istank = (UnitGroupRolesAssigned"player" == "TANK") or (GetPartyAssignment("MAINTANK", "player") == 1) if istank then local enable = false if self.db.profile.enabled_in.dungeon and not UnitInRaid"player" then enable = true end if self.db.profile.enabled_in.raid and UnitInRaid"player" then enable = true end if enable then return self:Enable(L["is now enabled since you are assigned as a tank"]) end end return self:Disable() end function addon:Enable(msg) if self.enabled then return end self:RegisterEvent"PLAYER_REGEN_ENABLED" self:RegisterEvent"UNIT_THREAT_LIST_UPDATE" self:RegisterEvent"RAID_TARGET_UPDATE" self:RegisterEvent"COMBAT_LOG_EVENT_UNFILTERED" self.enabled = true self:ResetState() if msg then self:Print(msg) end end function addon:Disable(msg) if not self.enabled then return end self:UnregisterEvent"PLAYER_REGEN_ENABLED" self:UnregisterEvent"UNIT_THREAT_LIST_UPDATE" self:UnregisterEvent"RAID_TARGET_UPDATE" self:UnregisterEvent"COMBAT_LOG_EVENT_UNFILTERED" self.enabled = false if msg then self:Print(msg) end end function addon:Toggle() if not self.enabled then self:Enable(L["is now enabled"]) else self:Disable(L["is now disabled"]) end end function SlashCmdList.KUNGALOOSH() addon:Toggle() end _G["SLASH_KUNGALOOSH1"] = "/kungaloosh" _G["SLASH_KUNGALOOSH2"] = "/kl" _G["Kungaloosh"] = addon