vanilla-wow-addons – Rev 1
?pathlinks?
XPerl_MainTanks = {}
MainTankCount = 0
local MainTanks = {}
local Events = {}
local XUnits = {}
local XOtherUnits = {}
local XFreeUnits = {}
local OtherTargetOwners = {}
local UpdateTime = 0
local FrameExpanded = false
local XOtherRows = 0
local XGaps = 0
local XTitle
local MainAssist = nil
local XFind = nil
local bigwigsSlowDown = 0
-- Dup colours used to show which tanks have the same target
local MTdupColours = { {r = "0.8", g = "0.2", b = "0.2"},
{r = "0.2", g = "0.2", b = "0.8"},
{r = "0.8", g = "0.2", b = "0.8"},
{r = "0.2", g = "0.8", b = "0.2"},
{r = "0.2", g = "0.8", b = "0.8"}}
local MAX_UNITS = 50
local MAX_OTHER_ROWS = 10
local GAP_SPACING = 10
XPERL_UNIT_HEIGHT_MIN = 17
XPERL_UNIT_HEIGHT_MAX = 30
XPERL_UNIT_WIDTH_MIN = 50
XPERL_UNIT_WIDTH_MAX = 125
if (not XPerlColourTable) then
local function MashXX(class)
local c = RAID_CLASS_COLORS[class]
XPerlColourTable[class] = string.format("|c00%02X%02X%02X", 255 * c.r, 255 * c.g, 255 * c.b)
end
XPerlColourTable = {}
MashXX("HUNTER")
MashXX("WARLOCK")
MashXX("PRIEST")
MashXX("PALADIN")
MashXX("MAGE")
MashXX("ROGUE")
MashXX("DRUID")
MashXX("SHAMAN")
MashXX("WARRIOR")
end
-- Although your own "target" is updated immediately, any reference to ourself via our raid id is updated via the server
-- So, to cure the slow response times, we check if anything is 'me'. Only direct targets are updated immedately,
-- so we don't bother with target's target onwards.
local function SpecialCaseUnit(unit)
if (unit.unit and (unit.type == "MTT" or unit.type == "OT") and UnitIsUnit("player", unit.unit)) then
return "target"
else
return unit.partyid
end
end
----------------------------
------- DISPLAY ------------
----------------------------
local function UpdateUnit(unit,forcedUpdate)
if (forcedUpdate) then
local time = GetTime()
if (unit.update and time < unit.update + 0.2) then
-- Since we catch UNIT_HEALTH changes, we don't need to update always
return
end
end
unit.update = GetTime()
local xunit = SpecialCaseUnit(unit)
local name = UnitName(xunit)
local text = getglobal(unit:GetName().."_Name")
local bar = getglobal(unit:GetName().."_HealthBar")
local percent = getglobal(unit:GetName().."_HealthBarText")
local barBG = getglobal(unit:GetName().."_HealthBarBG")
local combat = getglobal(unit:GetName().."_Combat")
local warning = getglobal(unit:GetName().."_Warning")
local raidIcon = getglobal(unit:GetName().."_RaidIcon")
local percBar
barBG:Show()
if (name and name ~= UNKNOWNOBJECT) then
-- Name
text:SetText(name)
text:SetPoint("BOTTOMRIGHT", unit, "TOPRIGHT", 0, -12)
local remCount = 1
while ((text:GetStringWidth() >= (unit:GetWidth() - 2)) and (string.len(name) > remCount)) do
name = string.sub(name, 1, string.len(name) - remCount)..".."
remCount = 3
text:SetText(name)
end
if (UnitPlayerControlled(xunit)) then
XPerl_ColourFriendlyUnit(text, xunit)
else
XPerl_SetUnitNameColor(xunit, text)
end
-- Health
local healthMax = UnitHealthMax(xunit)
local health = UnitHealth(xunit)
percBar = health / healthMax
local perc = percBar * 100
bar:SetMinMaxValues(0, healthMax)
bar:SetValue(health)
if (UnitIsDead(xunit)) then
percent:SetText(XPERL_LOC_DEAD)
else
percent:SetText(math.floor(perc + 0.5).."%")
end
if (XPerlConfigHelper.UnitHeight < 23) then
percent:Hide()
else
percent:Show()
end
if (unit.type == "MTT" or unit.type == "OT") then
if (BigWigsTargetMonitor) then
if (bigwigsSlowDown == 0) then
BigWigsTargetMonitor:TargetCheck(xunit)
end
end
local index = GetRaidTargetIndex(xunit)
if (index) then
SetRaidTargetIconTexture(raidIcon, index)
raidIcon:Show()
else
raidIcon:Hide()
end
else
raidIcon:Hide()
end
else
text:SetPoint("BOTTOMRIGHT", -2, 1)
if (unit.type == "MTT") then
name = UnitName(unit.unit)
if (name) then
XPerl_ColourFriendlyUnit(text, unit.unit)
text:SetText(string.format(XPERL_XS_TARGET, name))
barBG:Hide()
end
else
text:SetText(XPERL_NO_TARGET)
text:SetTextColor(0.5, 0.5, 0.5, 1)
end
bar:SetMinMaxValues(0, 1)
bar:SetValue(0)
percBar = 0
percent:Hide()
raidIcon:Hide()
end
if (UnitAffectingCombat(xunit)) then
combat:Show()
else
combat:Hide()
end
if (UnitIsCharmed(xunit)) then
warning:Show()
else
warning:Hide()
end
XPerl_SetSmoothBarColor (bar, percBar)
end
-- XPerl_RaidHelp_Show
function XPerl_RaidHelp_Show()
XPerlConfigHelper.RaidHelper = 1
XPerl_EnableDisable()
return true
end
-- XPerl_OnClick
function XPerl_OnClick(button)
local unitid = this.partyid
if (UnitName(unitid) or (button == "RightButton" and this.unit)) then
if (XPerl_OnClick_Handler) then
if (not XPerl_OnClick_Handler(button, unitid)) then
if (button == "RightButton" and this.unit) then
XPerl_OnClick_Handler("LeftButton", this.unit)
end
end
else
if (button == "RightButton" and this.unit and not SpellIsTargetting()) then
button = "LeftButton"
end
if (button == "LeftButton") then
if (SpellIsTargeting()) then
SpellTargetUnit(unitid)
return true
elseif (CursorHasItem()) then
if (UnitIsUnit("player", unitid)) then
AutoEquipCursorItem()
else
DropItemOnUnit(unitid)
end
return true
else
TargetUnit(unitid)
return true
end
elseif (button == "RightButton") then
if (SpellIsTargeting()) then
SpellStopTargeting()
return true
elseif (CursorHasItem()) then
ClearCursor()
return true
else
TargetUnit(this.unit)
end
end
end
end
end
-- XPerl_OnEnter
function XPerl_OnEnter()
local x = XPerl_Frame:GetCenter()
local a1, a2 = "ANCHOR_LEFT", "ANCHOR_TOPLEFT"
if ( x < (GetScreenWidth() / 2)) then
a1, a2 = "ANCHOR_RIGHT", "ANCHOR_TOPRIGHT"
end
if (SpellIsTargeting()) then
if (SpellCanTargetUnit(this.partyid)) then
SetCursor("CAST_CURSOR")
else
SetCursor("CAST_ERROR_CURSOR")
end
end
if (XPerlConfigHelper.Tooltips == 1) then
if (this.partyid and UnitName(this.partyid)) then
GameTooltip:SetOwner(this, a1)
GameTooltip:SetUnit(this.partyid)
if (this.unit and (this.type == "MTT" or this.type == "OT")) then
local extra = 10
if (TinyTipExtrasExists) then
extra = 20
end
XPerl_BottomTip:SetOwner(GameTooltip, a2, 0, extra)
XPerl_BottomTip:SetUnit(this.unit)
XPerl_BottomTip:SetBackdropColor(0.1, 0.4, 0.1, 0.75)
end
else
if (this.type == "MTT" or this.type == "OT") then
GameTooltip:SetOwner(this, a1)
GameTooltip:SetUnit(this.unit)
GameTooltip:SetBackdropColor(0.1, 0.4, 0.1, 0.75)
end
end
end
end
-- ListChanged1
local function ListChanged1(list1, list2)
if (getn(list1) == getn(list2)) then
for k,v in pairs(list1) do
if (v == list2[k]) then
return true
end
end
return false
end
return true
end
-- XPerl_SetupFrameSimple
function XPerl_SetupFrameSimple(argFrame, alpha)
argFrame:SetBackdropBorderColor(0.5, 0.5, 0.5, alpha or 0.8)
argFrame:SetBackdropColor(0, 0, 0, alpha or 0.8)
end
-- AllocateUnit
local AllocateUnitNum = 0
local LastUnitWarning
local function AllocateUnit(list, parent)
local unit = XFreeUnits[1]
if (unit) then
tremove(XFreeUnits, 1)
tinsert(list, unit)
unit:SetParent(parent)
else
if (AllocateUnitNum < MAX_UNITS) then
AllocateUnitNum = AllocateUnitNum + 1
unit = CreateFrame("Button", "XPerl_Unit"..AllocateUnitNum, parent, "XPerl_UnitTemplate")
if (unit) then
XPerl_SetupFrameSimple(unit, XPerlConfigHelper.Background_Transparency)
unit:SetAlpha(XPerlConfigHelper.Targets_Transparency)
tinsert(list, unit)
if (XPerl_RegisterHighlight) then
XPerl_RegisterHighlight(unit, 3)
else
local tex = unit:GetHighlightTexture()
tex:SetVertexColor(0.86, 0.82, 0.41)
end
else
XPerl_Notice("Error creating frame called 'XPerl_Unit"..AllocateUnitNum.."' from template 'XPerl_UnitTemplate'")
end
else
if (not LastUnitWarning or GetTime() > LastUnitWarning + 600) then
LastUnitWarning = GetTime()
XPerl_Notice("Maximum number of units reached ("..MAX_UNITS..")")
end
end
end
if (unit) then
if (XPerl_GetBarTexture) then
local tex = XPerl_GetBarTexture()
getglobal(unit:GetName().."_HealthBarTex"):SetTexture(tex)
if (XPerlConfig.BackgroundTextures == 1) then
getglobal(unit:GetName().."_HealthBarBG"):SetTexture(tex)
else
getglobal(unit:GetName().."_HealthBarBG"):SetTexture("Interface\\TargetingFrame\\UI-StatusBar")
end
end
local t = getglobal(unit:GetName().."_HealthBarText"); t:Hide()
t = getglobal(unit:GetName().."_Label"); t:SetText(""); t:Hide()
t = getglobal(unit:GetName().."_Name"); t:Show()
XPerl_SetupFrameSimple(unit, XPerlConfigHelper.Background_Transparency)
unit:SetScale(1)
unit:SetWidth(XPerlConfigHelper.UnitWidth)
unit:SetHeight(XPerlConfigHelper.UnitHeight)
local bar = getglobal(unit:GetName().."_HealthBar")
bar:ClearAllPoints()
if (XPerlConfigHelper.UnitHeight > 16) then
bar:SetPoint("TOPLEFT", 3, -14)
bar:SetPoint("BOTTOMRIGHT", -3, 2)
else
bar:SetPoint("TOPLEFT", 4, -4)
bar:SetPoint("BOTTOMRIGHT", -4, 4)
end
unit:Show()
end
return unit
end
-- Remove units from list and place back into available unit pool
local function UnallocateUnits(list)
while (getn(list) > 0) do
local unit = list[1]
unit:ClearAllPoints()
unit:Hide()
unit.partyid = nil
unit.unit = nil
unit.OtherTarget = nil
unit.collapseable = nil
unit.type = nil
tremove(list, 1)
tinsert(XFreeUnits, unit)
end
end
-- XPerl_HelperBarTextures
if (XPerl_GetBarTexture) then
function XPerl_HelperBarTextures(tex)
local function UnitTex(v, tex)
local f = getglobal(v:GetName().."_HealthBarTex")
f:SetTexture(tex)
f = getglobal(v:GetName().."_HealthBarBG")
if (XPerlConfig and XPerlConfig.BackgroundTextures == 1) then
f:SetTexture(tex)
else
f:SetTexture("Interface\\TargetingFrame\\UI-StatusBar")
end
end
XPerl_MyThreatTex:SetTexture(tex)
XPerl_MyThreatBG:SetTexture(tex)
for k,v in pairs(XUnits) do
UnitTex(v, tex)
end
for k,v in pairs(XOtherUnits) do
UnitTex(v, tex)
end
for k,v in pairs(XFreeUnits) do
UnitTex(v, tex)
end
end
end
-- XPerl_SetMainAssist
function XPerl_SetMainAssist(msg, ma, quiet)
if (ma == "broadcast") then
if (IsRaidOfficer()) then
SendAddonMessage(XPERL_COMMS_PREFIX, "MA "..UnitName("player").." "..UnitName(MainAssist.unit), "RAID")
else
XPerl_Message("You must be promoted to set the Main Assist")
end
else
if (not ma) then
ma = 0
end
if (string.lower(ma) == "target") then
ma = UnitName(ma)
end
if (ma) then
for i,tank in pairs(MainTanks) do
if (string.lower(UnitName("raid"..tank[1])) == string.lower(ma)) then
ma = i
break
end
end
ma = tonumber(ma)
if (MainTanks[ma]) then
local maUnit = "raid"..MainTanks[ma][1]
MainAssist = {unit = maUnit, name = UnitName(maUnit)}
local _, class = UnitClass(maUnit)
MainAssist.class = class
else
MainAssist = nil
end
else
MainAssist = nil
end
if (MainAssist) then
XPerlConfigHelper.LastMainAssist = MainAssist.name
else
XPerlConfigHelper.LastMainAssist = nil
end
if (not quiet) then
if (MainAssist) then
XPerl_Message("Main Assist set to "..XPerlColourTable[MainAssist.class]..MainAssist.name)
else
XPerl_Message("Main Assist |c00FF0000cleared!")
end
end
end
return true
end
-- RemoveDupMT
local function RemoveDupMT(name)
for k, v in pairs(XPerl_MainTanks) do
if (v[2] == name) then
XPerl_MainTanks[k] = nil
return true
end
end
end
-- GetRaidIDByName
local function GetRaidIDByName(name)
for i = 1, GetNumRaidMembers() do
if (UnitName("raid"..i) == name) then
return i
end
end
end
-- GetUnitRank
local function GetUnitRank(name)
local index = GetRaidIDByName(name)
if (index) then
local _, rank = GetRaidRosterInfo(index)
return rank
end
return 0
end
-- ValidateTankList
-- Check the roster for any tanks that have left the raid
local function ValidateTankList()
for index,entry in pairs(XPerl_MainTanks) do
local found
for i = 1,GetNumRaidMembers() do
if (UnitName("raid"..i) == entry[2]) then
found = true
break
end
end
if (not found) then
XPerl_MainTanks[index] = nil
end
end
end
-- XPerl_MTRosterChanged()
function XPerl_MTRosterChanged()
ValidateTankList()
MainTankCount = 0
for i in pairs(XPerl_MainTanks) do
MainTankCount = MainTankCount + 1
end
if (MainTankCount == 0 or XPerlConfigHelper.UseCTRATargets == 0) then
-- If no defined tanks, then make a list from the warriors in raid
MainTanks = {}
MainTankCount = 0
for i = 1,GetNumRaidMembers() do
local _, class = UnitClass("raid"..i)
if (class == "WARRIOR") then
tinsert(MainTanks, {i, UnitName("raid"..i)})
MainTankCount = MainTankCount + 1
end
end
else
MainTankCount = 0
for index,entry in pairs(XPerl_MainTanks) do
local raidid = GetRaidIDByName(entry[2])
if (raidid) then
MainTankCount = MainTankCount + 1
entry[1] = raidid
end
end
MainTanks = XPerl_MainTanks
end
XPerl_MakeTankList()
if (XPerlConfigHelper.LastMainAssist) then
if (not MainAssist) then
XPerl_SetMainAssist("", XPerlConfigHelper.LastMainAssist, true)
if (not MainAssist) then
XPerlConfigHelper.LastMainAssist = nil
end
end
end
end
-- CT_RA_IsSendingWithVersion override
-- Override this so that we get the MT list if there's only us in the raid with a CTRA version registered
local old_CT_RA_IsSendingWithVersion
if (CT_RA_IsSendingWithVersion) then
if (CT_RA_IsSendingWithVersion ~= XPerl_IsSendingWithVersion) then
old_CT_RA_IsSendingWithVersion = CT_RA_IsSendingWithVersion
CT_RA_IsSendingWithVersion = function(version)
if (version == 1.08) then
return 1
end
return old_CT_RA_IsSendingWithVersion(version)
end
end
end
-- ProcessCTRAMessage
local function ProcessCTRAMessage(unitName, msg)
local mtListUpdate
if (strsub(msg, 1, 4) == "SET ") then
local rankSender = GetUnitRank(unitName)
if (rankSender < 1) then
return
end
local useless, useless, num, name = strfind(msg, "^SET (%d+) (.+)$")
if (num and name) then
num = tonumber(num)
local mtID = 0
for i = 1, GetNumRaidMembers() do
if (UnitName("raid"..i) == name) then
mtID = i
break
end
end
if (XPerl_MainTanks[num]) then
if (XPerl_MainTanks[num][1] == mtID and XPerl_MainTanks[num][2] == name) then
return -- No Change
end
end
RemoveDupMT(name)
XPerl_MainTanks[tonumber(num)] = {mtID, name}
mtListUpdate = true
end
elseif (strsub(msg, 1, 2) == "R ") then
local rankSender = GetUnitRank(unitName)
if (rankSender < 1) then
return
end
local useless, useless, name = strfind(msg, "^R (.+)$")
if (name) then
mtListUpdate = RemoveDupMT(name)
end
end
if (mtListUpdate) then
XPerl_MTRosterChanged()
end
end
-- XPerl_SplitCTRAMessage
function XPerl_SplitCTRAMessage(msg, char)
local arr = { }
while (strfind(msg, char) ) do
local iStart, iEnd = strfind(msg, char)
tinsert(arr, strsub(msg, 1, iStart-1))
msg = strsub(msg, iEnd+1, strlen(msg))
end
if ( strlen(msg) > 0 ) then
tinsert(arr, msg)
end
return arr
end
-- XPerl_ParseCTRA
function XPerl_ParseCTRA(nick, msg, func)
if (strfind(msg, "#")) then
local arr = XPerl_SplitCTRAMessage(msg, "#")
for i,subMsg in pairs(arr) do
func(nick, subMsg)
end
else
func(nick, msg)
end
end
-- CHAT_MSG_ADDON
function Events:CHAT_MSG_ADDON()
if (arg1 == XPERL_COMMS_PREFIX and arg3 == "RAID") then
local msg = arg2
local cmds = {}
for x in string.gfind(msg, "[^ ]+") do
tinsert(cmds, x)
end
if (cmds[1] == "MA") then
local from = cmds[2]
local newMA = cmds[3]
local fromID, maID
-- Pick up raid id for sender and new MA
for i = 1,GetNumRaidMembers() do
local name, rank, group, level, classLocal, class = GetRaidRosterInfo(i)
if (name == from) then
if (rank > 0) then -- Make sure someone who is promoted sent the message
fromID = "raid"..i
else
return
end
end
if (name == newMA) then
maID = "raid"..i
end
end
if (fromID and maID) then
if (not UnitIsUnit(fromID, "player")) then
local _, fromClass = UnitClass(fromID)
local __, maClass = UnitClass(maID)
MainAssist = {unit = maID, name = UnitName(maID), class = maClass}
XPerlConfigHelper.LastMainAssist = MainAssist.name
XPerl_Message(XPerlColourTable[fromClass]..from.." has assigned the Main Assist to be "..XPerlColourTable[maClass]..MainAssist.name)
end
end
end
elseif (arg1 == "CTRA" and arg3 == "RAID") then
XPerl_ParseCTRA(arg4, arg2, ProcessCTRAMessage)
end
end
----------------------------
---------- EVENTS ----------
----------------------------
-- OnEvent
function XPerl_OnEvent()
local Event = Events[event]
if (Event) then
Event()
else
XPerl_ShowMessage("EXTRA EVENT")
end
end
local function IsDPSClass(unit)
local _, class = UnitClass(unit)
return (class == "ROGUE" or class == "WARRIOR" or class == "MAGE" or class == "WARLOCK" or class == "HUNTER")
end
local function IsMT1(unit)
if (MainAssist and UnitName(MainAssist.unit) == MainAssist.name) then
return UnitIsUnit(unit, MainAssist.unit)
elseif (MainTanks[1]) then
return UnitIsUnit(unit, "raid"..MainTanks[1][1])
end
end
local function IsMT(unit)
for k, tank in pairs(MainTanks) do
if (UnitIsUnit(unit, "raid"..tank[1])) then
return true
end
end
end
local function IsTanked(checkUnit)
for k, tank in pairs(MainTanks) do
if (UnitIsUnit("raid"..tank[1].."target", checkUnit)) then
return true
end
end
end
-- ScanForTargets
local function ScanForTargets()
if (XPerlConfigHelper.CollectOtherTargets == 0 or UnitIsCharmed("player")) then
return {}
end
local NewList = {}
local function FoundAlready(checkUnit)
for j, owner in pairs(NewList) do
if (UnitIsUnit(owner.."target", checkUnit.."target")) then
return true
end
end
end
local function Check(unitid, doStats)
if (UnitLevel(unitid.."target") ~= 1 and (UnitReaction("player", unitid.."target") or 5) <= 4 and not UnitIsDeadOrGhost(unitid.."target")) then
if (not FoundAlready(unitid)) then
if (not IsTanked(unitid.."target")) then
tinsert(NewList, unitid)
end
end
end
end
local doStats = XPerl_Stats:IsShown()
if (doStats) then
XPerl_Stats_List.NoTarget = {}
XPerl_Stats_List.NotAssistingMT1 = {}
XPerl_Stats_List.NotAssistingAnyMT = {}
XPerl_Stats_List.HealersOnMT1 = {}
XPerl_Stats_List.HealersOnOtherMTs = {}
XPerl_Stats_List.HealersNotOnMTs = {}
end
for i = 1,GetNumRaidMembers() do
local checkUnit = "raid"..i
if (doStats) then
if (UnitIsConnected(checkUnit) and UnitIsVisible(checkUnit) and not UnitIsDeadOrGhost(checkUnit)) then
if (not UnitName(checkUnit.."target") and UnitName(checkUnit.."target") ~= UNKNOWNOBJECT) then
-- No target, slacker
tinsert(XPerl_Stats_List.NoTarget, checkUnit)
else
if (IsDPSClass(checkUnit)) then
-- DPS statistics
--if (UnitCanAttack(checkUnit, checkUnit.."target")) then
if ((UnitReaction("player", checkUnit.."target") or 5) <= 4) then
if (not IsMT(checkUnit)) then
if (MainTanks[1] and not UnitIsUnit(checkUnit.."target", "raid"..MainTanks[1][1].."target")) then
-- They're not assisting MT1
tinsert(XPerl_Stats_List.NotAssistingMT1, checkUnit)
tinsert(XPerl_Stats_List.NotAssistingAnyMT, checkUnit)
elseif (not IsTanked(checkUnit.."target")) then
-- They're not assisting any of the MTs
tinsert(XPerl_Stats_List.NotAssistingAnyMT, checkUnit)
end
end
else
-- DPS targetting friendly, count it as useless
tinsert(XPerl_Stats_List.NoTarget, checkUnit)
end
else
-- Healer statistics
if (IsMT1(checkUnit.."target")) then
-- Healer targetting MT1
tinsert(XPerl_Stats_List.HealersOnMT1, checkUnit)
elseif (IsMT(checkUnit.."target")) then
-- Healer targetting another MT
tinsert(XPerl_Stats_List.HealersOnOtherMTs, checkUnit)
else
tinsert(XPerl_Stats_List.HealersNotOnMTs, checkUnit)
end
end
end
end
end
Check(checkUnit)
Check("raidpet"..i)
end
if (doStats) then
local function Colour(num, good)
if (num > 10) then
if (good) then
return "|c0000FF00"..num.."|r"
else
return "|c00FF0000"..num.."|r"
end
elseif (num > 0) then
return "|c00FFFF00"..num.."|r"
else
if (good) then
return "|c00FF0000"..num.."|r"
else
return "|c0000FF00"..num.."|r"
end
end
end
local MT1 = "MT1"
if (MainAssist and UnitName(MainAssist.unit) == MainAssist.name) then
MT1 = "MA"
end
XPerl_Stats1:SetText(string.format(XPERL_STATS_NO_TARGET, Colour(getn(XPerl_Stats_List.NoTarget))))
XPerl_Stats2:SetText(string.format(XPERL_STATS_NOT_ASSIST_MT1, Colour(getn(XPerl_Stats_List.NotAssistingMT1)), MT1))
XPerl_Stats3:SetText(string.format(XPERL_STATS_NOT_ASSIST_ANY, Colour(getn(XPerl_Stats_List.NotAssistingAnyMT))))
XPerl_Stats4:SetText(string.format(XPERL_STATS_HEALERS_MT1, Colour(getn(XPerl_Stats_List.HealersOnMT1), true), MT1))
XPerl_Stats5:SetText(string.format(XPERL_STATS_HEALERS_ANY, Colour(getn(XPerl_Stats_List.HealersOnOtherMTs), true)))
XPerl_Stats6:SetText(string.format(XPERL_STATS_HEALERS_NON_MT, Colour(getn(XPerl_Stats_List.HealersNotOnMTs))))
if (XPerl_Stats_List.shownStats ~= 0) then
XPerl_SetStatDetails()
end
end
return NewList
end
-- XPerl_GetUnit
local function XPerl_GetUnit(unit)
for i,search in pairs(XUnits) do
if (search.unit == unit) then
return search
end
end
end
-- ScanForMTDups
-- Check MTs all have unique targets
local function ScanForMTDups()
local dup = 1
local dups = {}
for i,unit in pairs(XUnits) do
XPerl_SetupFrameSimple(unit, XPerlConfigHelper.Background_Transparency)
end
for i,t1 in pairs(MainTanks) do
local any = false
if (UnitName("raid"..t1[1].."target") and UnitName("raid"..t1[1].."target") ~= UNKNOWNOBJECT and not UnitIsDeadOrGhost("raid"..t1[1])) then
for j,t2 in pairs(MainTanks) do
if (j > i and not dups["raid"..t2[1]]) then
if (UnitIsUnit("raid"..t1[1].."target", "raid"..t2[1].."target")) then
dups["raid"..t2[1]] = 1
local unit1 = XPerl_GetUnit("raid"..t1[1])
local unit2 = XPerl_GetUnit("raid"..t2[1])
if (unit1) then
unit1:SetBackdropBorderColor(MTdupColours[dup].r, MTdupColours[dup].g, MTdupColours[dup].b)
unit1:SetBackdropColor(MTdupColours[dup].r, MTdupColours[dup].g, MTdupColours[dup].b)
end
if (unit2) then
unit2:SetBackdropBorderColor(MTdupColours[dup].r, MTdupColours[dup].g, MTdupColours[dup].b)
unit2:SetBackdropColor(MTdupColours[dup].r, MTdupColours[dup].g, MTdupColours[dup].b)
end
any = true
end
end
end
if (any and dup < 5) then
dup = dup + 1
end
end
end
end
-- OnUpdate
local function OnUpdate()
UpdateTime = UpdateTime + arg1
if (UpdateTime > 0.2) then
UpdateTime = 0
local doneArrow = false
local maDone = false
XPerl_MyTarget:ClearAllPoints()
XPerl_MyTarget:Hide()
XPerl_MainAssist:Hide()
local arrowType = "MTT"
local arrowExtra = ""
if (XPerlConfigHelper.ShowMT == 1) then
arrowType = "MT"
arrowExtra = "target"
end
for i,unit in pairs(XUnits) do
UpdateUnit(unit, true)
local xunit = SpecialCaseUnit(unit)
if (unit.type == arrowType and not doneArrow and UnitIsUnit("target", xunit..arrowExtra) and UnitExists("target")) then -- and not UnitIsPlayer(unit.partyid)) then
doneArrow = true
XPerl_MyTarget:SetParent(unit)
XPerl_MyTarget:SetPoint("RIGHT", unit, "LEFT", 2 - (XPerlConfigHelper.MTLabels * 10), 0)
XPerl_MyTarget:Show()
end
if (not maDone and MainAssist and UnitIsUnit(unit.unit, MainAssist.unit) and UnitName(MainAssist.unit) == MainAssist.name) then
maDone = true
XPerl_MainAssist:SetParent(getglobal(unit:GetName().."_HealthBar"))
XPerl_MainAssist:ClearAllPoints()
if (XPerlConfigHelper.MTLabels == 1) then
XPerl_MainAssist:SetPoint("BOTTOMRIGHT", unit, "BOTTOMLEFT", 1, 3)
else
XPerl_MainAssist:SetPoint("BOTTOMRIGHT", -1, 1)
end
XPerl_MainAssist:Show()
end
end
local NewList = ScanForTargets()
if (ListChanged1(OtherTargetOwners, NewList)) then
OtherTargetOwners = NewList
XPerl_MakeOtherTargetList()
else
for i,unit in pairs(XOtherUnits) do
UpdateUnit(unit, true)
local xunit = SpecialCaseUnit(unit)
if (unit.type == "OT" and unit:IsVisible() and not doneArrow and UnitIsUnit("target", xunit) and UnitExists("target") and not UnitIsPlayer(unit.partyid)) then
doneArrow = true
XPerl_MyTarget:SetParent(unit)
XPerl_MyTarget:SetPoint("RIGHT", unit, "LEFT", 2 - (XPerlConfigHelper.MTLabels * XPerlConfigHelper.OtherTargetTargets * 10) * unit:GetScale(), 0)
XPerl_MyTarget:Show()
end
end
end
ScanForMTDups()
bigwigsSlowDown = bigwigsSlowDown + 1
if (bigwigsSlowDown > 10) then
bigwigsSlowDown = 0
end
--XPerl_Frame_Test:SetText(getn(XFreeUnits).." "..getn(XUnits).." "..getn(XOtherUnits))
end
if (FrameExpanded or XPerlConfigHelper.ExpandLock == 1) then
local f = GetMouseFocus()
if (f) then
while (f:GetParent() and f:GetParent() ~= UIParent) do
f = f:GetParent()
end
if (f ~= XPerl_Frame) then
XPerl_CollapseOthers()
end
end
end
end
-- VARIABLES_LOADED
function Events:VARIABLES_LOADED()
this:UnregisterEvent(event)
if (type(XPerl_MainTanks) ~= "table") then
XPerl_MainTanks = {}
end
XPerl_Startup()
XPerl_EnableDisable()
end
-- Registration
local function Registration()
local list = { "UNIT_HEALTH",
"UNIT_MAXHEALTH",
"PLAYER_TARGET_CHANGED",
"CHAT_MSG_ADDON"}
for i,a in pairs(list) do
if (GetNumRaidMembers() > 0 and XPerlConfigHelper.RaidHelper == 1) then
XPerl_Frame:RegisterEvent(a)
else
XPerl_Frame:UnregisterEvent(a)
end
end
end
-- XPerl_EnableDisable
function XPerl_EnableDisable()
if (XPerlConfigHelper and XPerlConfigHelper.RaidHelper == 1 and GetNumRaidMembers() > 0) then
XPerl_Frame:Show()
XPerl_Frame:SetScript("OnUpdate", OnUpdate)
if (CT_RAMenu_Options and CT_RA_UpdateVisibility) then
XPerlConfigHelper.OldCTMTListHide = CT_RAMenu_Options["temp"]["HideMTs"]
CT_RAMenu_Options["temp"]["HideMTs"] = true
CT_RA_UpdateVisibility(1)
end
else
XPerl_Frame:Hide()
XPerl_Frame:SetScript("OnUpdate", nil)
if (XPerlConfigHelper and XPerlConfigHelper.RaidHelper == 0 and CT_RAMenu_Options and CT_RA_UpdateVisibility) then
if (XPerlConfigHelper.OldCTMTListHide ~= true) then
XPerlConfigHelper.OldCTMTListHide = nil
CT_RAMenu_Options["temp"]["HideMTs"] = false
CT_RA_UpdateVisibility(1)
end
end
end
Registration()
XPerl_MTRosterChanged()
end
-- RAID_ROSTER_UPDATE
function Events:RAID_ROSTER_UPDATE()
if (GetNumRaidMembers() == 0) then
MainTanks = {}
end
XPerl_EnableDisable()
end
-- UNIT_HEALTH
function Events:UNIT_HEALTH()
-- scan for a unit we have
for k,unit in pairs(XUnits) do
if (UnitIsUnit(unit.partyid, arg1)) then
UpdateUnit(unit)
end
end
for k,unit in pairs(XOtherUnits) do
if (UnitIsUnit(unit.partyid, arg1)) then
UpdateUnit(unit)
end
end
end
Events.UNIT_MAXHEALTH = Events.UNIT_HEALTH
function Events:PLAYER_TARGET_CHANGED()
for i,unit in pairs(XUnits) do
if (UnitIsUnit(unit.partyid, "player")) then
UpdateUnit(unit)
end
end
end
-- The number of 'Other' colums that can be shown
local function DisplayableColumns()
local columnsTop = 1 + XPerlConfigHelper.ShowMT + XPerlConfigHelper.MTTargetTargets
local columnsBottom = 1 + XPerlConfigHelper.OtherTargetTargets
if (columnsTop == 1 and columnsBottom > 1) then
if (XPerlConfigHelper.MTTargetTargets == 0) then
if (XPerlConfigHelper.MTLabels == 1) then
if (XPerlConfigHelper.OtherTargets_Scale > 0.52) then
columnsTop = 2
end
else
if (XPerlConfigHelper.OtherTargets_Scale > 0.49) then
columnsTop = 2
end
end
end
end
return columnsTop
end
-- XPerl_SetTitle
function XPerl_SetTitle()
if (DisplayableColumns() > 1 and XPerlConfigHelper.UnitWidth >= 70) then
if (XPerl_MainTanks == MainTanks) then
XPerl_Frame_Title:SetText(XPERL_TITLE_MT_LONG)
else
XPerl_Frame_Title:SetText(XPERL_TITLE_WARRIOR_LONG)
end
else
if (XPerl_MainTanks == MainTanks) then
XPerl_Frame_Title:SetText(XPERL_TITLE_MT_SHORT)
else
XPerl_Frame_Title:SetText(XPERL_TITLE_WARRIOR_SHORT)
end
end
end
-- XPerl_MakeTankList
function XPerl_MakeTankList()
if (not XPerlConfigHelper or XPerlConfigHelper.RaidHelper == 0 or GetNumRaidMembers() == 0) then
XPerl_SetFrameSizes()
return
end
XPerl_SetTitle()
XPerl_MyTarget:Hide()
XPerl_MainAssist:Hide()
--MainTanks = NewTankList
UnallocateUnits(XUnits)
XGaps = 0
local previousUnit
local previousID = 0
local first = true
local foundMA = false
local mainTanksDisplayed = 0
for i,tank in pairs(MainTanks) do
local unit = AllocateUnit(XUnits, XPerl_MTTargets)
if (not unit) then
break
end
unit.partyid = "raid"..tank[1].."target"
unit.unit = "raid"..tank[1]; -- 1 == id, 2 == name
unit.type = "MTT"
mainTanksDisplayed = mainTanksDisplayed + 1
local rowFrames = {}
rowFrames[2] = unit
-- Correct the Main Assist number in case people leave the raid
if (MainAssist and UnitName("raid"..tank[1]) == MainAssist.name) then
MainAssist.unit = "raid"..tank[1]
foundMA = true
end
if (XPerlConfigHelper.ShowMT == 1) then
local unitTank = AllocateUnit(XUnits, XPerl_MTTargets)
if (unitTank) then
unitTank.partyid = "raid"..tank[1]
unitTank.unit = "raid"..tank[1]
unitTank.type = "MT"
rowFrames[1] = unitTank
else
break
end
end
if (XPerlConfigHelper.MTTargetTargets == 1) then
local unitTarget = AllocateUnit(XUnits, XPerl_MTTargets)
if (unitTarget) then
unitTarget.partyid = "raid"..tank[1].."targettarget"
unitTarget.unit = "raid"..tank[1]
unitTarget.type = "MTTT"
rowFrames[3] = unitTarget
else
break
end
end
local previousColumn
for j,frame in pairs(rowFrames) do
UpdateUnit(frame)
if (not previousColumn) then
if (first) then
first = false
frame:SetPoint("TOPLEFT", XPerl_MTTargets, "TOPLEFT", XPerlConfigHelper.MTLabels * 10, 0)
else
local gap = 0; -- Maintain a gap if not sequential numbers
if (i > previousID + 1) then
XGaps = XGaps + 1
gap = -GAP_SPACING
end
frame:SetPoint("TOPLEFT", previousUnit, "BOTTOMLEFT", 0, gap)
end
else
frame:SetPoint("TOPLEFT", previousColumn, "TOPRIGHT", 0, 0)
end
if (not previousColumn) then
local label = getglobal(frame:GetName().."_Label")
label:SetText(i)
label:SetTextColor(1, 1, 1)
if (XPerlConfigHelper.MTLabels == 1) then
label:Show()
end
previousUnit = frame
end
previousColumn = frame
end
if (mainTanksDisplayed >= XPerlConfigHelper.MaxMainTanks) then
break
end
previousID = i
end
if (MainAssist and not foundMA) then
-- Main assist left the raid
XPerl_Message("Main Assist "..XPerlColourTable[MainAssist.class]..MainAssist.name.."|r not found in tank list - removed!")
MainAssist = nil
end
if (previousUnit) then
XPerl_Frame:Show()
else
XPerl_Frame:Hide()
end
XPerl_SetFrameSizes()
end
-- XPerl_MakeOtherTargetList
function XPerl_MakeOtherTargetList()
UnallocateUnits(XOtherUnits)
local mainWidth = XPerl_Frame:GetWidth()
if (not IsTanked("target")) then
XPerl_MyTarget:Hide()
end
XOtherRows = 0
local previousUnit
local rowStartUnit
local rowSize = 0
local firstRowSize
for i,other in pairs(OtherTargetOwners) do
if (XOtherRows >= MAX_OTHER_ROWS) then -- Well, gotta stop somewhere...
break
end
local unit = AllocateUnit(XOtherUnits, XPerl_OtherTargets)
if (not unit) then
break
end
unit:SetScale(XPerlConfigHelper.OtherTargets_Scale)
local otherWidth = unit:GetWidth() * unit:GetScale()
unit.partyid = other.."target"
unit.type = "OT"
if (i == 1) then
rowStartUnit = unit
rowSize = otherWidth
unit:SetPoint("TOPLEFT", XPerl_OtherTargets, "TOPLEFT", XPerlConfigHelper.MTLabels * XPerlConfigHelper.OtherTargetTargets * 10, 0)
XOtherRows = XOtherRows + 1
else
if (XPerlConfigHelper.OtherTargetTargets == 1) then
unit:SetPoint("TOPLEFT", previousUnit, "BOTTOMLEFT", 0, 0)
XOtherRows = XOtherRows + 1
else
if (rowSize + otherWidth > mainWidth - 6) then
if (XOtherRows == MAX_OTHER_ROWS) then
break
end
if (not firstRowSize) then
firstRowSize = i - 1
end
unit:SetPoint("TOPLEFT", rowStartUnit, "BOTTOMLEFT", 0, 0)
rowStartUnit = unit
rowSize = otherWidth
XOtherRows = XOtherRows + 1
else
rowSize = rowSize + otherWidth
unit:SetPoint("TOPLEFT", previousUnit, "TOPRIGHT", 0, 0)
end
end
end
UpdateUnit(unit)
if (XOtherRows > 1) then
unit.collapseable = true
end
if (XOtherRows > 1 and not FrameExpanded and XPerlConfigHelper.ExpandLock == 0) then
unit:Hide()
end
local label = getglobal(unit:GetName().."_Label")
label:SetText(i)
label:SetTextColor(0.8, 0.2, 0.2)
if (XPerlConfigHelper.OtherTargetTargets == 1) then
if (XPerlConfigHelper.MTLabels == 1) then
label:Show()
end
local newUnit = AllocateUnit(XOtherUnits, XPerl_OtherTargets)
if (not newUnit) then
break
end
newUnit:SetScale(XPerlConfigHelper.OtherTargets_Scale)
newUnit.partyid = unit.partyid.."target"
newUnit:SetPoint("TOPLEFT", unit, "TOPRIGHT", 0, 0)
newUnit.type = "OTT"
UpdateUnit(newUnit)
if (XOtherRows > 1) then
newUnit.collapseable = true
end
if (i > 1 and not FrameExpanded and XPerlConfigHelper.ExpandLock == 0) then
unit.collapseable = true
newUnit:Hide()
end
unit.OtherTarget = newUnit
end
previousUnit = unit
end
XPerl_SetFrameSizes()
if (not firstRowSize) then
firstRowSize = 1
end
XPerl_ExpandArrowFrame_Stats:SetText(string.format(XPERL_FOOTER_MORE, getn(OtherTargetOwners) - firstRowSize))
local key = GetBindingText(GetBindingKey("TARGETFIRSTOTHER"), "KEY_")
if (key) then
XPerl_OtherTargets_Key:SetText(string.format(XPERL_TO_TARGET, "|c0000FF40"..key.."|r"))
else
XPerl_OtherTargets_Key:SetText("")
end
end
-- XPerl_SetFrameSizes
function XPerl_SetFrameSizes()
local tanks = MainTankCount
local unitHeight = 20
local unitHeightOther = 20
if (tanks > XPerlConfigHelper.MaxMainTanks) then
tanks = XPerlConfigHelper.MaxMainTanks
end
if (XPerl_Unit1) then
unitHeight = XPerl_Unit1:GetHeight()
if (XOtherUnits[1]) then
unitHeightOther = XOtherUnits[1]:GetHeight() * XOtherUnits[1]:GetScale()
end
end
XPerl_MTTargets:SetHeight((unitHeight * tanks) + (XGaps * GAP_SPACING))
local otherTargets = getn(OtherTargetOwners)
local otherTargetsExtraHeight = 0
if (otherTargets > 0) then
otherTargetsExtraHeight = 10
XPerl_OtherTargets:Show()
else
XPerl_OtherTargets:Hide()
end
if (XOtherRows < 2 or FrameExpanded or XPerlConfigHelper.ExpandLock == 1) then
XPerl_ExpandArrowFrame:Hide()
else
if (otherTargets > 1) then
otherTargets = 1
otherTargetsExtraHeight = otherTargetsExtraHeight + 10
XPerl_ExpandArrowFrame:Show()
else
XPerl_ExpandArrowFrame:Hide()
end
end
local otherRows = XOtherRows
if (otherRows > MAX_OTHER_ROWS) then
otherRows = MAX_OTHER_ROWS
end
if (otherRows > 1 and not FrameExpanded and XPerlConfigHelper.ExpandLock == 0) then
otherRows = 1
end
XPerl_Frame:SetHeight((unitHeight * tanks) + (XGaps * GAP_SPACING) + (unitHeightOther * otherRows) + 5 + XPerl_Frame_TitleBar:GetHeight() + otherTargetsExtraHeight)
local ExtraWidth = (XPerlConfigHelper.MTLabels * 10); -- 0 for off, 10 for on
XLastColumCount = DisplayableColumns()
XPerl_Frame:SetWidth(XLastColumCount * XPerlConfigHelper.UnitWidth + 6 + ExtraWidth)
end
-- XPerl_ExpandOthers
function XPerl_ExpandOthers()
if (not FrameExpanded) then
FrameExpanded = true
XPerl_SetFrameSizes()
for i,unit in pairs(XOtherUnits) do
unit:Show()
end
end
end
-- XPerl_CollapseOthers
function XPerl_CollapseOthers()
if (FrameExpanded and XPerlConfigHelper.ExpandLock == 0) then
FrameExpanded = false
XPerl_SetFrameSizes()
for i,unit in pairs(XOtherUnits) do
if (unit.collapseable) then
unit:Hide()
end
end
if (XOtherUnits[1] and XOtherUnits[1].OtherTarget) then
XOtherUnits[1].OtherTarget:Show()
end
end
end
-- XPerl_Toggle_Stats
function XPerl_Toggle_Stats()
if (XPerl_Stats:IsShown()) then
XPerl_Stats:Hide()
if (XPerl_Stats_List.shownStats ~= 0) then
getglobal("XPerl_Stats"..XPerl_Stats_List.shownStats):UnlockHighlight()
XPerl_Stats_List.shownStats = 0
end
XPerl_Stats_List:Hide()
else
XPerl_Stats1:SetText("")
XPerl_Stats2:SetText("")
XPerl_Stats3:SetText("")
XPerl_Stats4:SetText("")
XPerl_Stats5:SetText("")
XPerl_Stats:Show()
end
end
-- XPerl_TargetFirstOther
function XPerl_TargetFirstOther()
if (XOtherUnits[1]) then
TargetUnit(XOtherUnits[1].partyid)
end
end
-- XPerl_SmartAssist
local XAssistSkipCount = 0
function XPerl_SmartAssist()
local function ValidTarget(unit)
local minor
if (UnitIsVisible(unit)) then
if (UnitExists(unit) and not UnitIsDeadOrGhost(unit)) then
if (UnitReaction("player", unit) <= 4) then
if (UnitHealth(unit) <= 10) then
return "minor"
else
return "valid"
end
end
end
end
end
local function XFindUnit()
if (XFind) then
TargetByName(XFind)
if (ValidTarget("target") and strlower(strsub(UnitName("target"),1,strlen(XFind))) == strlower(XFind)) then
XPerl_Message("Using FIND found suitable target. ('|c00007F00/xp find|r' to clear).")
return true
else
local r = UnitReaction("player", "target")
if (r and r > 4) then
ClearTarget()
end
end
end
end
if (not UnitName("target")) then
if (XFindUnit()) then
return
end
end
if (not UnitExists("target")) then
XAssistSkipCount = 0
end
local minorUnit
local valid
local isMT = IsMT("player")
local targetCount = 0
local function Skip()
targetCount = targetCount + 1
if (targetCount > XAssistSkipCount) then
XAssistSkipCount = XAssistSkipCount + 1
return false
end
return true
end
if (not isMT and MainAssist and UnitName(MainAssist.unit) == MainAssist.name) then
valid = ValidTarget(MainAssist.unit.."target")
if (valid and valid == "valid") then
if (not Skip()) then
TargetUnit(MainAssist.unit.."target")
return
end
end
end
-- First scan the list of Main Tanks and pick one of their targets if it's health is greater than 10%
for i,id in pairs(MainTanks) do
local unit = "raid"..id[1]
valid = ValidTarget(unit.."target")
if (valid) then
if (valid == "minor") then
minorUnit = unit
if (not Skip()) then
break
end
else
if (not isMT) then
if (not Skip()) then
TargetUnit(unit.."target")
return
end
end
end
end
end
-- If we're not an MT, then pick one of the MT targets and assist
if (minorUnit and not isMT) then
if (not Skip()) then
TargetUnit(minorUnit.."target")
return
end
else
-- Otherwise, we're a tank so look for something un-tanked
for i,unit in pairs(OtherTargetOwners) do
local valid = ValidTarget(unit.."target")
if (valid) then
if (valid == "minor") then
minorUnit = unit
if (not Skip()) then
break
end
else
if (not Skip()) then
TargetUnit(unit.."target")
return
end
end
end
end
end
XAssistSkipCount = 0; -- If we reached here, there was nothing else to find
if (minorUnit) then
TargetUnit(minorUnit.."target")
else
-- Nothing found so far, scan through party members in case we've pressed the button when not in a raid
for i = 1,4 do
local unit = "party"..i.."target"
local valid = ValidTarget(unit)
if (valid) then
TargetUnit(unit.."target")
break
end
end
end
XFindUnit()
if (not UnitName("target")) then
TargetNearestEnemy()
end
end
-- XPerl_SetStatDetails
function XPerl_SetStatDetails(id, event)
if (id and XPerl_Stats_List.shownStats ~= 0) then
getglobal("XPerl_Stats"..XPerl_Stats_List.shownStats):UnlockHighlight()
end
if (id and XPerl_Stats_List.shownStats == id) then
XPerl_Stats_List.shownStats = 0
XPerl_Stats_List:Hide()
return
end
if (not id) then
id = XPerl_Stats_List.shownStats
end
local list
if (id == 1) then list = XPerl_Stats_List.NoTarget
elseif (id == 2) then list = XPerl_Stats_List.NotAssistingMT1
elseif (id == 3) then list = XPerl_Stats_List.NotAssistingAnyMT
elseif (id == 4) then list = XPerl_Stats_List.HealersOnMT1
elseif (id == 5) then list = XPerl_Stats_List.HealersOnOtherMTs
elseif (id == 6) then list = XPerl_Stats_List.HealersNotOnMTs
end
local text = ""
for i,unit in pairs(list) do
local _, class = UnitClass(unit)
local name = UnitName(unit)
text = text..XPerlColourTable[class]..name.." "
end
getglobal("XPerl_Stats"..id):LockHighlight()
XPerl_Stats_ListText:SetText(text)
XPerl_Stats_List.shownStats = id
XPerl_Stats_List:Show()
end
-- XPerl_Toggle_UseCTRATargets
function XPerl_Toggle_UseCTRATargets()
if (XPerlConfigHelper.UseCTRATargets == 1) then
XPerlConfigHelper.UseCTRATargets = 0
else
XPerlConfigHelper.UseCTRATargets = 1
end
XPerl_MTRosterChanged()
return true
end
-- XPerl_Toggle_OtherTargets
function XPerl_Toggle_OtherTargets(noChange)
if (not noChange) then
if (XPerlConfigHelper.OtherTargetTargets == 1) then
XPerlConfigHelper.OtherTargetTargets = 0
else
XPerlConfigHelper.OtherTargetTargets = 1
end
end
XPerl_MakeTankList()
XPerl_MakeOtherTargetList()
XPerl_Frame_ToggleTargets:SetButtonTex()
return true
end
function XPerl_Toggle_MTTargets(noChange)
if (not noChange) then
if (XPerlConfigHelper.MTTargetTargets == 1) then
XPerlConfigHelper.MTTargetTargets = 0
else
XPerlConfigHelper.MTTargetTargets = 1
end
end
XPerl_MakeTankList()
XPerl_MakeOtherTargetList()
XPerl_Frame_ToggleMTTargets:SetButtonTex()
return true
end
-- XPerl_Toggle_ExpandLock
function XPerl_Toggle_ExpandLock(noChange)
if (not noChange) then
if (XPerlConfigHelper.ExpandLock == 1) then
XPerlConfigHelper.ExpandLock = 0
else
XPerlConfigHelper.ExpandLock = 1
end
end
if (XPerlConfigHelper.ExpandLock == 1) then
XPerl_ExpandOthers()
else
XPerl_CollapseOthers()
end
XPerl_Frame_ExpandLock:SetButtonTex()
end
-- XPerl_Toggle_ToggleLabels
function XPerl_Toggle_ToggleLabels(noChange)
if (not noChange) then
if (XPerlConfigHelper.MTLabels == 1) then
XPerlConfigHelper.MTLabels = 0
else
XPerlConfigHelper.MTLabels = 1
end
end
XPerl_MakeTankList()
XPerl_MakeOtherTargetList()
XPerl_Frame_ToggleLabels:SetButtonTex()
return true
end
function XPerl_Toggle_ShowMT(noChange)
if (not noChange) then
if (XPerlConfigHelper.ShowMT == 1) then
XPerlConfigHelper.ShowMT = 0
else
XPerlConfigHelper.ShowMT = 1
end
end
XPerl_MakeTankList()
XPerl_MakeOtherTargetList()
XPerl_Frame_ToggleShowMT:SetButtonTex()
return true
end
-- XPerl_Toggle_CollectOtherTargets
function XPerl_Toggle_CollectOtherTargets(noChange)
if (not noChange) then
if (XPerlConfigHelper.CollectOtherTargets == 1) then
XPerlConfigHelper.CollectOtherTargets = 0
else
XPerlConfigHelper.CollectOtherTargets = 1
end
end
XPerl_MakeOtherTargetList()
return true
end
-- XPerl_SetFind
function XPerl_SetFind(msg)
local name = ""
local any
for x in string.gfind(msg, "[^ ]+") do
if (any) then
if (name ~= "") then
name = name.." "
end
name = name..x
end
any = true
end
XFind = name
if (XFind == "") then
XFind = nil
XPerl_Message("Find |c00FF0000cleared!|r")
else
XPerl_Message("Find set to |c0000FF00"..name.."|r. ('|c00007F00/xp find|r' to clear).")
end
return true
end
-- SmoothBarColor
local function SmoothBarColor(bar, barBG)
local barmin, barmax = bar:GetMinMaxValues()
local percentage = (bar:GetValue()/(barmax-barmin))
local r, g
if (percentage < 0.5) then
r = 2*percentage
g = 1
else
r = 1
g = 2*(1 - percentage)
end
if ((r>=0) and (g>=0) and (r<=1) and (g<=1)) then
bar:SetStatusBarColor(r, g, 0)
barBG:SetVertexColor(r, g, 0, 0.25)
end
end
-- Redo some of this stuff. too much duplication and work on each frame
local function SetBarToTitle(bar)
local offset = XPerl_Frame_Title:GetStringWidth() + 25
bar:SetScale(0.75); -- Scale it down for the font size
bar:SetParent(XPerl_Frame_TitleBar)
bar:Show()
bar:ClearAllPoints()
bar:SetPoint("TOPLEFT", XPerl_Frame_TitleBar, "TOPLEFT", offset / 0.75, -3)
bar:SetPoint("BOTTOMRIGHT", XPerl_Frame_ToggleShowMT, "BOTTOMLEFT", -5, 2)
end
local function SetBarToFrame(bar)
bar:SetScale(0.75)
bar:SetParent(XPerl_Threat)
bar:Show()
bar:ClearAllPoints()
bar:SetPoint("TOPLEFT", 3, -3)
bar:SetPoint("BOTTOMRIGHT", -3, 3)
end
-- XPerl_UpdateThreat
local lastThreat = -1
local lastThreat100
function XPerl_UpdateThreat()
local data, playerCount, threat100 = KLHTM_GetRaidData()
if (threat100 > 0) then
local userThreat = klhtm.table.raiddata[UnitName("player")] or 0
if (userThreat == lastThreat and threat100 == lastThreat100) then
return
else
lastThreat = userThreat
lastThreat100 = threat100
if (data[1].name == "Aggro Gain") then
playerCount = playerCount - 1
end
if (playerCount > 1) then
local titleSpace = (XPerl_Frame_ToggleShowMT:GetLeft() - XPerl_Frame_Title:GetLeft()) - (XPerl_Frame_Title:GetStringWidth() + 25)
XPerl_MyThreatText:SetText(userThreat - threat100) -- Show deficit threat value
XPerl_MyThreat:SetMinMaxValues(0, threat100)
XPerl_MyThreat:SetValue(userThreat)
if (titleSpace >= 10) then
SetBarToTitle(XPerl_MyThreat)
XPerl_Threat:Hide()
XPerl_Threat:SetHeight(2)
else
SetBarToFrame(XPerl_MyThreat)
XPerl_Threat:Show()
XPerl_Threat:SetHeight(12)
end
SmoothBarColor(XPerl_MyThreat, XPerl_MyThreatBG)
return
end
end
end
if (lastThreat) then
XPerl_Threat:Hide()
XPerl_Threat:SetHeight(2)
XPerl_MyThreat:Hide()
lastThreat = nil
lastThreat100 = nil
end
end