-- Colour tables now taken from WoW values (Since 1.6.4) - Well, we want to be ready when there's Paladin and Shaman in same raid -- and we can leave the colour choice up to Blizzard and it'll just all work. -- We craeted our string based colour table from Blizzard's raid colour table in 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") -- XPerl_GetClassColour function XPerl_GetClassColour(class) if (class) then local color = RAID_CLASS_COLORS[class]; -- Now using the WoW class color table if (color) then return color end end return {r = 0.5, g = 0.5, b = 1} end -- OtherClickHandlers local function OtherClickHandlers(button, unitid) if (XPerlConfig.CastPartyRaidOnly == 0 or string.sub(unitid, 1, 4) == "raid") then if (CastParty_OnClickByUnit and CastPartyConfig) then -- Cast Party local function CastParty_BuildActionKey(button) local action_key = "" if IsAltKeyDown() then action_key = action_key .. 'Alt' end if IsControlKeyDown() then action_key = action_key .. 'Ctrl' end if IsShiftKeyDown() then action_key = action_key .. 'Shift' end if action_key == "" then action_key = "None" end return action_key end local action_key = CastParty_BuildActionKey() local action = CastPartyConfig.key_bindings[button][action_key] if (action ~= "CastParty_WoWDefaultClick" and action ~= "CastParty_PartyDropDown" and action ~= CASTPARTY_KEYBINDINGS_NONE) then CastParty_OnClickByUnit(button, unitid) return true end elseif (Genesis_MouseHeal) then -- Genesis Clicks if (Genesis_MouseHeal(unitid, button)) then return true end elseif (JC_CatchKeyBinding) then -- JustClick if (JC_CatchKeyBinding(button, unit)) then return true end elseif (CH_Config and CH_Config.PCUFEnabled and CH_UnitClicked) then -- Click Heal local mb = CH_BuildMouseButton(button) actionType = CH_MouseSpells.Friend[mb] if (actionType ~= "MENU" and actionType ~= "TARGET" and actionType ~= "TOOLTIP") then CH_UnitClicked(unitid, button) return true end elseif (SmartHeal and SmartHeal.DefaultClick and SmartHeal.ClickHeal and SmartHeal.GetClickHealButton and SmartHeal.Loaded and SmartHeal.getConfig and SmartHeal:getConfig("enable") and SmartHeal:getConfig("enable", "clickmode")) then local KeyDownType = SmartHeal:GetClickHealButton() -- Smart Heal if(KeyDownType and KeyDownType ~= "undetermined") then SmartHeal:ClickHeal(KeyDownType..button, unitid) return true end end end end -- XPerl_Frame_FindID -- Compatibility function -- Same function used as Perl_Party_FindID, Perl_Party_Pet_FindID, Perl_Raid_FindID function XPerl_Frame_FindID(object) local _, _, num = strfind(object:GetName(), "(%d+)") return tonumber(num) end -- XPerl_OnClick_Handler function XPerl_OnClick_Handler(button, unitid) -- 1.8.3 - Moved these tests before click handlers for consistancy 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 end elseif (button == "RightButton") then if (SpellIsTargeting()) then SpellStopTargeting() return true end end if (type(Perl_Custom_ClickFunction) == "function") then if (Perl_Custom_ClickFunction(button, unitid)) then -- Perl_Custom_ClickFunction should return true if handled, then we do nothing more. -- no return and we'll continue with default X-Perl behaviour return true end end if (XPerlConfig.CastParty == 1) then local frame = getglobal(this:GetName().."_NameFrame") if (not frame or not MouseIsOver(frame)) then -- Name frame gives default behaviour if (OtherClickHandlers(button, unitid)) then return true end end end if (button == "LeftButton") then TargetUnit(unitid) return true end end --------------------------------- --Loading Function -- --------------------------------- -- XPerl_DisallowClear --function XPerl_DisallowClear() -- return AceLibrary and AceLibrary:HasInstance("Jostle-2.0") --end -- XPerl_BlizzFramesDisable function XPerl_BlizzFramesDisable() local XPerl_DummyFrame local XPerl_DummyFunc --if (XPerl_DisallowClear()) then -- XPerlConfig.ClearBlizzardFrames = 0 --end if (XPerlConfig.ClearBlizzardFrames == 1) then XPerl_DummyFrame = CreateFrame("Frame") XPerl_DummyFunc = function() end end if (XPerl_Player) then -- Blizz Player Frame Events PlayerFrame:UnregisterAllEvents() PlayerFrameHealthBar:UnregisterAllEvents() PlayerFrameManaBar:UnregisterAllEvents() PlayerFrame:Hide() -- Make it so it won't be visible, even if shown by another mod PlayerFrame:ClearAllPoints() PlayerFrame:SetPoint("BOTTOMLEFT", UIParent, "TOPLEFT", 0, 50) if (XPerlConfig.ClearBlizzardFrames == 1) then PlayerFrame = XPerl_DummyFrame PlayerFrame_OnLoad = nil PlayerFrame_Update = nil PlayerFrame_UpdatePartyLeader = nil PlayerFrame_UpdatePvPStatus = nil PlayerFrame_OnEvent = nil PlayerFrame_OnUpdate = nil PlayerFrame_OnClick = nil PlayerFrame_OnReceiveDrag = nil PlayerFrame_UpdateStatus = nil PlayerFrame_UpdateGroupIndicator = nil PlayerFrameDropDown_OnLoad = nil PlayerFrame_UpdatePlaytime = nil end end if (XPerl_Player_Pet) then -- Blizz Pet Frame Events PetFrame:UnregisterAllEvents() PetFrame:Hide() PetFrame:ClearAllPoints() PetFrame:SetPoint("BOTTOMLEFT", UIParent, "TOPLEFT", 0, 50) if (XPerlConfig.ClearBlizzardFrames == 1) then PetFrame = XPerl_DummyFrame PetFrame_OnLoad = nil PetFrame_Update = nil PetFrame_OnEvent = nil PetFrame_OnUpdate = nil PetFrame_OnClick = nil PetFrame_SetHappiness = nil PetFrameDropDown_OnLoad = nil end end if (XPerl_Target) then -- Blizz Target Frame Events TargetFrame:UnregisterAllEvents() TargetFrameHealthBar:UnregisterAllEvents() TargetFrameManaBar:UnregisterAllEvents() TargetFrame:Hide() TargetofTargetFrame:UnregisterAllEvents() TargetofTargetFrame:Hide() TargetFrame:ClearAllPoints() TargetFrame:SetPoint("BOTTOMLEFT", UIParent, "TOPLEFT", 0, 50) TargetofTargetFrame:ClearAllPoints() TargetofTargetFrame:SetPoint("BOTTOMLEFT", UIParent, "TOPLEFT", 0, 50) if (XPerlConfig.ClearBlizzardFrames == 1) then TargetFrame = XPerl_DummyFrame TargetofTargetFrame = XPerl_DummyFrame TargetFrame_OnLoad = nil TargetFrame_Update = nil TargetFrame_OnEvent = nil TargetFrame_OnShow = nil TargetFrame_OnHide = nil TargetFrame_CheckLevel = nil TargetFrame_CheckFaction = nil TargetFrame_CheckClassification = nil TargetFrame_CheckDead = nil TargetFrame_CheckDishonorableKill = nil TargetFrame_OnClick = nil TargetFrame_OnUpdate = nil TargetDebuffButton_Update = nil TargetFrame_HealthUpdate = nil TargetHealthCheck = nil TargetFrameDropDown_OnLoad = nil TargetFrame_UpdateRaidTargetIcon = nil TargetofTarget_OnUpdate = nil TargetofTarget_Update = nil TargetofTarget_OnClick = nil TargetofTarget_CheckDead = nil TargetofTargetHealthCheck = nil end end if (XPerl_party1) then -- Blizz Party Events ShowPartyFrame = function() end HidePartyFrame = ShowPartyFrame for num = 1, 4 do local f = getglobal("PartyMemberFrame"..num) f:Hide() f:UnregisterAllEvents() getglobal("PartyMemberFrame"..num.."HealthBar"):UnregisterAllEvents() getglobal("PartyMemberFrame"..num.."ManaBar"):UnregisterAllEvents() f:ClearAllPoints() f:SetPoint("BOTTOMLEFT", UIParent, "TOPLEFT", 0, 50) end if (XPerlConfig.ClearBlizzardFrames == 1) then for num = 1, 4 do setglobal("PartyMemberFrame"..num, XPerl_DummyFrame) end PartyMemberFrame_OnLoad = nil PartyMemberFrame_UpdateMember = nil PartyMemberFrame_UpdatePet = XPerl_DummyFunc -- Called when you press OK on interface options PartyMemberFrame_UpdateMemberHealth = nil PartyMemberFrame_UpdateLeader = nil PartyMemberFrame_UpdatePvPStatus = nil PartyMemberFrame_OnEvent = nil PartyMemberFrame_OnUpdate = nil PartyMemberFrame_OnClick = nil PartyMemberPetFrame_OnClick = nil PartyMemberFrame_RefreshPetBuffs = nil PartyMemberBuffTooltip_Update = nil PartyMemberHealthCheck = nil PartyFrameDropDown_OnLoad = nil UpdatePartyMemberBackground = nil PartyMemberBackground_ToggleOpacity = nil PartyMemberBackground_SetOpacity = nil PartyMemberBackground_SaveOpacity = nil end end XPerl_BlizzFramesDisable = nil end --------------------------------- --Smooth Health Bar Color -- --------------------------------- function XPerl_SetSmoothBarColor (bar, percentage) if (bar) then --local barmin, barmax = bar:GetMinMaxValues() --if (barmin == barmax) then -- return false --end --local percentage = bar:GetValue()/(barmax-barmin) local r, g, b if (XPerlConfig.ClassicHealthBar == 1) then if (percentage < 0.5) then r = 1 g = 2*percentage b = 0 else g = 1 r = 2*(1 - percentage) b = 0 end else r = XPerlConfig.ColourHealthEmpty.r + ((XPerlConfig.ColourHealthFull.r - XPerlConfig.ColourHealthEmpty.r) * percentage) g = XPerlConfig.ColourHealthEmpty.g + ((XPerlConfig.ColourHealthFull.g - XPerlConfig.ColourHealthEmpty.g) * percentage) b = XPerlConfig.ColourHealthEmpty.b + ((XPerlConfig.ColourHealthFull.b - XPerlConfig.ColourHealthEmpty.b) * percentage) end if (r >= 0 and g >= 0 and b >= 0 and r <= 1 and g <= 1 and b <= 1) then bar:SetStatusBarColor(r, g, b) local backBar = getglobal(bar:GetName().."BG") if (backBar) then backBar:SetVertexColor(r, g, b, 0.25) end end end end -- XPerl_SetHealthBar function XPerl_SetHealthBar(bar, hp, max) bar:SetMinMaxValues(0, max) if (XPerlConfig.InverseBars == 1) then bar:SetValue(max - hp) else bar:SetValue(hp) end local percent = hp / max local healthPct = string.format("%3.0f", percent * 100) XPerl_SetSmoothBarColor(bar, percent) local barPct = getglobal(bar:GetName().."Percent") if (barPct) then barPct:SetText(healthPct.."%") end local barText = getglobal(bar:GetName().."Text") if (barText) then if (XPerlConfig.HealerMode == 1) then if (XPerlConfig.HealerModeType == 1) then barText:SetText(string.format("%d/%d", hp - max, max)) else barText:SetText(hp - max) end else barText:SetText(hp.."/"..max) end end end --------------------------------- --Class Icon Location Functions-- --------------------------------- function XPerl_ClassPos (class) if(class=="WARRIOR") then return 0, 0.25, 0, 0.25; end if(class=="MAGE") then return 0.25, 0.5, 0, 0.25; end if(class=="ROGUE") then return 0.5, 0.75, 0, 0.25; end if(class=="DRUID") then return 0.75, 1, 0, 0.25; end if(class=="HUNTER") then return 0, 0.25, 0.25, 0.5; end if(class=="SHAMAN") then return 0.25, 0.5, 0.25, 0.5; end if(class=="PRIEST") then return 0.5, 0.75, 0.25, 0.5; end if(class=="WARLOCK") then return 0.75, 1, 0.25, 0.5; end if(class=="PALADIN") then return 0, 0.25, 0.5, 0.75; end return 0.25, 0.5, 0.5, 0.75 -- Returns empty next one, so blank end -- XPerl_Toggle function XPerl_Toggle() if (XPerlLocked == 1) then XPerl_UnlockFrames() else XPerl_LockFrames() end end -- XPerl_UnlockFrames function XPerl_UnlockFrames() EnableAddOn("XPerl_Options") if (not IsAddOnLoaded("XPerl_Options")) then UIParentLoadAddOn("XPerl_Options") end XPerlLocked = 0 if (XPerl_RaidShowAllTitles) then XPerl_RaidShowAllTitles() end if (XPerl_Options) then XPerl_Options:Show() XPerl_Options:SetAlpha(0) XPerl_Options.Fading = "in" end end -- XPerl_LockFrames function XPerl_LockFrames() XPerlLocked = 1 if (XPerl_Options) then XPerl_Options.Fading = "out" end if (XPerl_RaidTitles) then XPerl_RaidTitles() end end -- Minimap Icon function XPerl_MinimapButton_OnClick() XPerl_Toggle() end -- XPerl_MinimapButton_Init function XPerl_MinimapButton_Init() if(XPerlConfig.MinimapButtonShown == 1) then XPerl_MinimapButton_Frame:Show() else XPerl_MinimapButton_Frame:Hide() end end -- XPerl_MinimapButton_UpdatePosition function XPerl_MinimapButton_UpdatePosition() XPerl_MinimapButton_Frame:SetPoint( "TOPLEFT", "Minimap", "TOPLEFT", 54 - (78 * cos(XPerlConfig.MinimapButtonPosition)), (78 * sin(XPerlConfig.MinimapButtonPosition)) - 55 ) XPerl_MinimapButton_Init() end -- XPerl_MinimapButton_Dragging function XPerl_MinimapButton_Dragging() local xpos,ypos = GetCursorPosition() local xmin,ymin = Minimap:GetLeft(), Minimap:GetBottom() xpos = xmin-xpos/UIParent:GetScale()+70 ypos = ypos/UIParent:GetScale()-ymin-70 XPerl_MinimapButton_SetPosition(math.deg(math.atan2(ypos,xpos))) end -- XPerl_MinimapButton_SetPosition function XPerl_MinimapButton_SetPosition(v) if (v < 0) then v = v + 360 end XPerlConfig.MinimapButtonPosition = v XPerl_MinimapButton_UpdatePosition() end -- XPerl_MinimapButton_OnEnter function XPerl_MinimapButton_OnEnter() GameTooltip:SetOwner(this, "ANCHOR_LEFT") GameTooltip:SetText(XPerl_Version, 1, 1, 1) GameTooltip:AddLine(XPERL_MINIMAP_HELP1) GameTooltip:AddLine(XPERL_MINIMAP_HELP2) GameTooltip:Show() end -- XPerl_SetManaBarType local ManaColours = {"ColourMana", "ColourRage", "ColourFocus", "ColourEnergy"} function XPerl_SetManaBarType(argUnit, argFrame, argFrameBG) local power = UnitPowerType(argUnit) if (power) then local colour = XPerlConfig[ManaColours[power + 1]] argFrame:SetStatusBarColor(colour.r, colour.g, colour.b, 1) argFrameBG:SetVertexColor(colour.r, colour.g, colour.b, 0.25) end end -- XPerl_PlayerTip function XPerl_PlayerTip(unitid) if (SpellIsTargeting()) then if (SpellCanTargetUnit(unitid)) then SetCursor("CAST_CURSOR") else SetCursor("CAST_ERROR_CURSOR") end end GameTooltip_SetDefaultAnchor(GameTooltip, this) GameTooltip:SetUnit(unitid) if (XPerl_RaidTipExtra) then XPerl_RaidTipExtra(unitid) end if (XPerlConfig.XPerlTooltipInfo == 1 and XPerl_GetUsage) then local xpUsage = XPerl_GetUsage(UnitName(unitid)) if (xpUsage) then local xp, any = "|cFFD00000X-Perl|r " if (xpUsage.version) then xp = xp..xpUsage.version any = true end if (xpUsage.mods and IsShiftKeyDown()) then local modList = XPerl_DecodeModuleList(xpUsage.mods) if (modList) then xp = xp.." : |c00909090"..modList end end if (any) then GameTooltip:AddLine(xp, 1, 1, 1, 1) GameTooltip:Show() end end end end -- XPerl_PlayerTipHide function XPerl_PlayerTipHide() if (XPerlConfig.FadingTooltip == 1) then GameTooltip:FadeOut() else GameTooltip:Hide() end end -- XPerl_ToolTip_AddBuffDuration function XPerl_ToolTip_AddBuffDuration(partyid, x) if (XPerl_Raid_AddBuffDuration) then XPerl_Raid_AddBuffDuration(partyid, x) end end -- XPerl_ColourFriendlyUnit function XPerl_ColourFriendlyUnit(frame, partyid) local color if (UnitCanAttack("player", partyid) and UnitIsEnemy("player", partyid)) then -- For dueling color = XPerlConfig.ColourReactionEnemy else if (XPerlConfig.ClassColouredNames == 1) then local _, engClass = UnitClass(partyid) color = XPerl_GetClassColour(engClass) else if (UnitIsPVP(partyid)) then color = XPerlConfig.ColourReactionFriend else color = XPerlConfig.ColourReactionNone end end end frame:SetTextColor(color.r, color.g, color.b) end -- XPerl_ReactionColour function XPerl_ReactionColour(argUnit) if (UnitPlayerControlled(argUnit) or not UnitIsVisible(argUnit)) then if (UnitFactionGroup("player") == UnitFactionGroup(argUnit)) then if (UnitIsEnemy("player", argUnit)) then -- Dueling return XPerlConfig.ColourReactionEnemy elseif (UnitIsPVP(argUnit)) then return XPerlConfig.ColourReactionFriend end else if (UnitIsPVP(argUnit)) then if (UnitIsPVP("player")) then return XPerlConfig.ColourReactionEnemy else return XPerlConfig.ColourReactionNeutral end end end else if (UnitIsTapped(argUnit) and not UnitIsTappedByPlayer(argUnit)) then color = XPerlConfig.ColourTapped else local reaction = UnitReaction(argUnit, "player") if (reaction) then if (reaction >= 5) then return XPerlConfig.ColourReactionFriend elseif (reaction <= 2) then return XPerlConfig.ColourReactionEnemy elseif (reaction == 3) then return XPerlConfig.ColourReactionUnfriendly else return XPerlConfig.ColourReactionNeutral end else if (UnitFactionGroup("player") == UnitFactionGroup(argUnit)) then return XPerlConfig.ColourReactionFriend elseif (UnitIsEnemy("player", argUnit)) then return XPerlConfig.ColourReactionEnemy else return XPerlConfig.ColourReactionNeutral end end end end return XPerlConfig.ColourReactionNone end -- XPerl_SetUnitNameColor function XPerl_SetUnitNameColor(argUnit,argFrame) if (UnitPlayerControlled(argUnit) or not UnitIsVisible(argUnit)) then -- 1.8.3 - Changed to override pvp name colours if (XPerlConfig.ClassColouredNames == 1) then local _, class = UnitClass(argUnit) color = XPerl_GetClassColour(class) else color = XPerl_ReactionColour(argUnit) end else if (UnitIsTapped(argUnit) and not UnitIsTappedByPlayer(argUnit)) then color = XPerlConfig.ColourTapped else color = XPerl_ReactionColour(argUnit) end end argFrame:SetTextColor(color.r, color.g, color.b, XPerlConfig.TextTransparency) end local BasicEvents = {"UNIT_RAGE", "UNIT_MAXRAGE", "UNIT_ENERGY", "UNIT_MAXENERGY", "UNIT_MANA", "UNIT_MAXMANA", "UNIT_HEALTH", "UNIT_MAXHEALTH", "UNIT_LEVEL", "UNIT_COMBAT", "UNIT_DISPLAYPOWER", "UNIT_NAME_UPDATE"} -- XPerl_RegisterBasics function XPerl_RegisterBasics(argFrame) if (argFrame == nil) then argFrame = this end for i,event in pairs(BasicEvents) do argFrame:RegisterEvent(event) end end -- XPerl_UnregisterBasics function XPerl_UnregisterBasics(argFrame) if (argFrame == nil) then argFrame = this end for i,event in pairs(BasicEvents) do argFrame:UnregisterEvent(event) end end -- PerlSetPortrait3D function XPerlSetPortrait3D(argFrame, argUnit) --[[ if (argUnit == "player") then -- If it's ourself, we can check if we're going to 'look' different, and update anyway -- Many updates requests are false though, and no real change is made local head, shoulders, chest head = GetInventoryItemTexture("player", 1) shoulders = GetInventoryItemTexture("player", 3) chest = GetInventoryItemTexture("player", 5) if (argFrame.lastHead ~= head or argFrame.lastShoulders ~= shoulders or argFrame.lastChest ~= chest) then argFrame.last3DTime = nil end argFrame.lastHead = head argFrame.lastShoulders = shoulders argFrame.lastChest = chest else -- If someone else, check their name and update if changed local name = UnitName(argUnit) if (argFrame.lastName ~= name) then argFrame.last3DTime = nil end argFrame.lastName = name end if (argFrame.last3DTime) then -- 1.8.5 change -- Don't update the portrait so often, at least 15 seconds must pass before each update now if (argFrame.last3DTime < GetTime() + 15) then argFrame:SetCamera(0) return end end ]] argFrame:ClearModel() argFrame:SetUnit(argUnit) argFrame:SetCamera(0) -- argFrame.last3DTime = GetTime() end -- XPerl_CombatFlashSet function XPerl_CombatFlashSet (elapsed, argFrame, argNew, argGreen) if (XPerlConfig.PerlCombatFlash == 0) then argFrame.PlayerFlash = nil return false end if (argFrame) then if (argNew) then argFrame.PlayerFlash = 1 argFrame.PlayerFlashGreen = argGreen else if (argFrame.PlayerFlash and elapsed) then argFrame.PlayerFlash = argFrame.PlayerFlash - elapsed if (argFrame.PlayerFlash <= 0) then argFrame.PlayerFlash = 0 argFrame.PlayerFlashTime = nil argFrame.PlayerFlashGreen = nil end else return false end end return true end end -- XPerl_CombatFlashSetFrames function XPerl_CombatFlashSetFrames(argFrame) if (argFrame.PlayerFlash) then local baseColour if (argFrame.forcedColour) then baseColour = argFrame.forcedColour else baseColour = XPerlConfig.BorderColour end local r, g, b, a if (argFrame.PlayerFlash > 0) then local flashOffsetColour = argFrame.PlayerFlash / 2 if (argFrame.PlayerFlashGreen) then r = baseColour.r - flashOffsetColour g = baseColour.g + flashOffsetColour b = baseColour.b - flashOffsetColour else r = baseColour.r + flashOffsetColour g = baseColour.g - flashOffsetColour b = baseColour.b - flashOffsetColour end if (r < 0) then r = 0; elseif (r > 1) then r = 1; end if (g < 0) then g = 0; elseif (g > 1) then g = 1; end if (b < 0) then b = 0; elseif (b > 1) then b = 1; end else r, g, b = baseColour.r, baseColour.g, baseColour.b end a = XPerlConfig.BorderColour.a for i, frame in pairs(argFrame.FlashFrames) do frame:SetBackdropBorderColor(r, g, b, a) end if (argFrame.PlayerFlash == 0) then argFrame.PlayerFlash = nil end end end local bgDef = {bgFile = "Interface\\Addons\\XPerl\\Images\\XPerl_FrameBack", edgeFile = "", tile = true, tileSize = 32, edgeSize = 16, insets = { left = 5, right = 5, top = 5, bottom = 5 } } -- XPerl_CheckDebuffs function XPerl_CheckDebuffs(unit, frames) if (XPerlConfig.HighlightDebuffs == 0) then return end local show local Curses = {} local debuffCount = 0 for i = 1, MAX_TARGET_DEBUFFS do local debuff, debuffStack, debuffType = UnitDebuff(unit, i) if (not debuff) then break end if (debuffType) then Curses[debuffType] = 1 else Curses["none"] = 1 end debuffCount = debuffCount + 1 end if (debuffCount > 0) then if (Curses.Magic) then show = "Magic" elseif (Curses.Curse) then show = "Curse" elseif (Curses.Disease) then show = "Disease" elseif (Curses.Poison) then show = "Poison" end -- We also re-set the colours here so that we highlight best colour per class local _, class = UnitClass("player") if (class == "MAGE") then if (Curses["Curse"]) then show = "Curse" end elseif (class == "DRUID") then if (Curses["Curse"]) then show = "Curse" elseif (Curses["Poison"]) then show = "Poison" end elseif (class == "PRIEST" or class == "WARLOCK") then if (Curses["Magic"]) then show = "Magic" end elseif (class == "PALADIN") then if (Curses["Magic"]) then show = "Magic" elseif (Curses["Poison"]) then show = "Poison" elseif (Curses["Disease"]) then show = "Disease" end elseif (class == "SHAMAN") then if (Curses["Poison"]) then show = "Poison" elseif (Curses["Disease"]) then show = "Disease" end end end if (frames) then local colour, borderColour if (show) then colour = DebuffTypeColor[show] colour.a = 1 if (XPerlConfig.HighlightDebuffsBorder == 1) then borderColour = colour else borderColour = XPerlConfig.BorderColour end else colour = XPerlConfig.BackColour borderColour = XPerlConfig.BorderColour end for i, f in frames do if (f:IsShown()) then if (show and XPerlConfig.HighlightDebuffsBorder == 1) then f:GetParent().forcedColour = borderColour bgDef.edgeFile = "Interface\\Addons\\XPerl\\Images\\XPerl_Curse" f:SetBackdrop(bgDef) else f:GetParent().forcedColour = nil bgDef.edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border" f:SetBackdrop(bgDef) end f:SetBackdropColor(colour.r, colour.g, colour.b, colour.a) f:SetBackdropBorderColor(borderColour.r, borderColour.g, borderColour.b, borderColour.a) end end end end -- XPerl_SavePosition(frame) function XPerl_SavePosition(frame) if (not XPerlConfig.SavedPositions) then XPerlConfig.SavedPositions = {} end XPerlConfig.SavedPositions[frame:GetName()] = {top = frame:GetTop(), left = frame:GetLeft()} end -- XPerl_RestorePosition(frame) function XPerl_RestorePosition(frame) if (XPerlConfig.SavedPositions) then local pos = XPerlConfig.SavedPositions[frame:GetName()] if (pos) then if (pos.left or pos.right) then frame:ClearAllPoints() frame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", pos.left, pos.top) end end end end -- XPerl_GetRaidPosition function XPerl_GetRaidPosition(findName) for i = 1,GetNumRaidMembers() do if (UnitName("raid"..i) == findName) then return i end end end -- XPerl_SetBuffSize function XPerl_SetBuffSize(prefix, sizeBuff, sizeDebuff) for i = 1,20 do local buff = getglobal(prefix.."BuffFrame_Buff"..i) if (buff) then buff:SetHeight(sizeBuff) buff:SetWidth(sizeBuff) end local buff = getglobal(prefix.."BuffFrame_DeBuff"..i) if (buff) then buff:SetHeight(sizeDebuff) buff:SetWidth(sizeDebuff) end end end -- true indicates the buff is valid on anyone, otherwise a class string dictates we only count it if the player with the buff matches local BuffExceptions = { --ALL = {Spell_Misc_Food = true}, -- Enable this for food PRIEST = {Spell_Nature_ResistNature = true, Spell_Nature_Rejuvenation = true}, -- Druid regens DRUID = {Spell_Holy_Renew = true}, -- Priest regens WARLOCK = {Spell_Shadow_SoulGem = true}, -- Soulstone Resurrection HUNTER = {Spell_Nature_RavenForm = "HUNTER", Ability_Mount_JungleTiger = "HUNTER", Ability_Mount_WhiteTiger = true, Ability_Mount_PinkTiger = "HUNTER", Ability_Hunter_AspectOfTheMonkey = "HUNTER", Spell_Nature_ProtectionformNature = true, Ability_Rogue_FeignDeath = "HUNTER", Ability_Hunter_RunningShot = "HUNTER", Ability_TrueShot = true, Ability_Hunter_BeastTraining = "WARRIOR"}, ROGUE = {Ability_Stealth = "ROGUE", Spell_Shadow_ShadowWard = "ROGUE", Ability_Vanish = "ROGUE", Ability_Rogue_Sprint = "ROGUE"} } local DebuffExceptions = { ALL = {INV_Misc_Bandage_08 = true}, -- Recently Bandaged PRIEST = {Spell_Holy_AshesToAshes = true} -- Weakened Soul } -- BuffException --local showInfo local function BuffException(unit, index, flag, func, exceptions) local buff, count, debuffType if (not flag or flag == 0 or flag == "0") then -- Not filtered, just return it buff, count, debuffType = func(unit, index) return buff, count, debuffType, index end buff, count, debuffType = func(unit, index, 1) if (buff) then -- We need the index of the buff unfiltered later for tooltips for i = 1,20 do local buff1, count1, debuffType1 = func(unit, index) if (buff == buff1 and count == count1) then index = i break end end return buff, count, debuffType, index end -- See how many filtered buffs WoW has returned by default local normalBuffFilterCount = 0 for i = 1,20 do buff, count, debuffType = func(unit, i, 1) if (not buff) then normalBuffFilterCount = i - 1 break end end -- Nothing found by default, so look for exceptions local _, class = UnitClass("player") local _, unitClass = UnitClass(unit) local foundValid = 0 for i = 1,20 do buff, count, debuffType = func(unit, i) if (not buff) then break end if (strsub(buff, 1, 16) == "Interface\\Icons\\") then local test = strsub(buff, 17) local good if (exceptions[class]) then good = exceptions[class][test] elseif (exceptions.ALL) then good = exceptions.ALL[test] end -- Enable this for potions --if (not good) then -- if (exceptions == BuffExceptions and strsub(test, 1, 11) == "INV_Potion_") then -- good = true -- end --end if (good and type(good) == "string" and good ~= unitClass) then good = nil end if (good) then foundValid = foundValid + 1 if (foundValid + normalBuffFilterCount == index) then --if (showInfo) then -- ChatFrame7:AddMessage("Found extra: "..buff..", requested index == "..index..", actual buff index == "..i) --end return buff, count, debuffType, i end end end end end -- XPerl_UnitBuff function XPerl_UnitBuff(unit, index, flag) return BuffException(unit, index, flag, UnitBuff, BuffExceptions) end -- XPerl_UnitBuff function XPerl_UnitDebuff(unit, index, flag) return BuffException(unit, index, flag, UnitDebuff, DebuffExceptions) end -- XPerl_TooltipSetUnitBuff -- Retreives the index of the actual unfiltered buff, and uses this on unfiltered tooltip call function XPerl_TooltipSetUnitBuff(tooltip, unit, ind, flag) --showInfo = true local buff, count, _, index = BuffException(unit, ind, flag, UnitBuff, BuffExceptions) --showInfo = nil tooltip:SetUnitBuff(unit, index) end -- XPerl_TooltipSetUnitDebuff -- Retreives the index of the actual unfiltered debuff, and uses this on unfiltered tooltip call function XPerl_TooltipSetUnitDebuff(tooltip, unit, ind, flag) local buff, count, debuffType, index = BuffException(unit, ind, flag, UnitDebuff, DebuffExceptions) tooltip:SetUnitDebuff(unit, index) end