You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

14347 lines
597 KiB

----------------------------------------------------------------------
-- Leatrix Plus 10.1.12 (18th July 2023)
----------------------------------------------------------------------
-- 01:Functns, 02:Locks, 03:Restart, 20:Live, 30:Isolated, 40:Player
-- 50:RunOnce, 60:Evnts, 62:Profile, 70:Lgot, 80:Commands, 90:Panel
----------------------------------------------------------------------
-- Leatrix Plus
----------------------------------------------------------------------
-- Create global table
_G.LeaPlusDB = _G.LeaPlusDB or {}
-- Create locals
local LeaPlusLC, LeaPlusCB, LeaDropList, LeaConfigList, LeaLockList = {}, {}, {}, {}, {}
local GameLocale = GetLocale()
local void
-- Version
LeaPlusLC["AddonVer"] = "10.1.12"
-- Get locale table
local void, Leatrix_Plus = ...
local L = Leatrix_Plus.L
-- Check Wow version is valid
do
local gameversion, gamebuild, gamedate, gametocversion = GetBuildInfo()
if gametocversion and gametocversion < 100000 then
-- Game client is Wow Classic
C_Timer.After(2, function()
print(L["LEATRIX PLUS: WRONG VERSION INSTALLED!"])
end)
return
end
if gametocversion and gametocversion == 100107 then -- 10.1.7
LeaPlusLC.NewPatch = true
end
end
-- Check for addons
if IsAddOnLoaded("ElvUI") then LeaPlusLC.ElvUI = unpack(ElvUI) end
if IsAddOnLoaded("Glass") then LeaPlusLC.Glass = true end
----------------------------------------------------------------------
-- L00: Leatrix Plus
----------------------------------------------------------------------
-- Initialise variables
LeaPlusLC["ShowErrorsFlag"] = 1
LeaPlusLC["NumberOfPages"] = 9
LeaPlusLC["RaidColors"] = RAID_CLASS_COLORS
-- Create event frame
local LpEvt = CreateFrame("FRAME")
LpEvt:RegisterEvent("ADDON_LOADED")
LpEvt:RegisterEvent("PLAYER_LOGIN")
-- Set bindings translations
_G.BINDING_NAME_LEATRIX_PLUS_GLOBAL_TOGGLE = L["Toggle panel"]
_G.BINDING_NAME_LEATRIX_PLUS_GLOBAL_WEBLINK = L["Show web link"]
_G.BINDING_NAME_LEATRIX_PLUS_GLOBAL_RARE = L["Announce rare"]
_G.BINDING_NAME_LEATRIX_PLUS_GLOBAL_MOUNTSPECIAL = L["Mount special"]
-- Minimap compartment button
-- LibDBIcon will be updated in future with a better replacement for Blizzard's compartment menu
-- Using stuff that Blizzard make like this is always prone to breaking addons so better to use LibDBIcon
-- Disable bag automation
-- Open vendor and close vendor again.
-- Open vendor again.
-- Click the bag icon to switch bag mode (either from single to combined or combined to single).
-- Buy alcohol if you don't have it already (if you do, skip this step) (tested with Bottle of Dalaran Noir).
-- Drink alcohol from bags.
-- Disable sticky editbox
-- Open 2 chat windows
-- Press enter in general chat to open editbox, type anything but don't press enter
-- Undock the second chat window and dock it again
-- Press enter in general chat to open editbox, type anything but don't press enter
-- Right-click General chat tab and enter Edit Mode
----------------------------------------------------------------------
-- L01: Functions
----------------------------------------------------------------------
-- Print text
function LeaPlusLC:Print(text)
DEFAULT_CHAT_FRAME:AddMessage(L[text], 1.0, 0.85, 0.0)
end
-- Lock and unlock an item
function LeaPlusLC:LockItem(item, lock)
if lock then
item:Disable()
item:SetAlpha(0.3)
else
item:Enable()
item:SetAlpha(1.0)
end
end
-- Hide configuration panels
function LeaPlusLC:HideConfigPanels()
for k, v in pairs(LeaConfigList) do
v:Hide()
end
end
-- Create a close button without using a template
function LeaPlusLC:CreateCloseButton(parent, w, h, anchor, x, y)
local btn = CreateFrame("BUTTON", nil, parent)
btn:SetSize(w, h)
btn:SetPoint(anchor, x, y)
btn:SetNormalTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Up")
btn:SetHighlightTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Highlight")
btn:SetPushedTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Down")
btn:SetDisabledTexture("Interface\\Buttons\\UI-Panel-MinimizeButton-Disabled")
return btn
end
-- Decline a shared quest if needed
function LeaPlusLC:CheckIfQuestIsSharedAndShouldBeDeclined()
if LeaPlusLC["NoSharedQuests"] == "On" then
local npcName = UnitName("questnpc")
if npcName and UnitIsPlayer(npcName) then
if UnitInParty(npcName) or UnitInRaid(npcName) then
if not LeaPlusLC:FriendCheck(npcName) then
DeclineQuest()
return
end
end
end
end
end
-- Display on-screen message
function LeaPlusLC:DisplayMessage(self)
ActionStatus:DisplayMessage(self)
end
-- Show a single line prefilled editbox with copy functionality
function LeaPlusLC:ShowSystemEditBox(word, focuschat)
if not LeaPlusLC.FactoryEditBox then
-- Create frame for first time
local eFrame = CreateFrame("FRAME", nil, UIParent)
LeaPlusLC.FactoryEditBox = eFrame
eFrame:SetSize(700, 110)
eFrame:SetPoint("CENTER", UIParent, "CENTER", 0, 150)
eFrame:SetFrameStrata("FULLSCREEN_DIALOG")
eFrame:SetFrameLevel(5000)
eFrame:SetScript("OnMouseDown", function(self, btn)
if btn == "RightButton" then
eFrame:Hide()
end
end)
-- Add background color
eFrame.t = eFrame:CreateTexture(nil, "BACKGROUND")
eFrame.t:SetAllPoints()
eFrame.t:SetColorTexture(0.05, 0.05, 0.05, 0.9)
-- Add copy title
eFrame.f = eFrame:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge')
eFrame.f:SetPoint("TOPLEFT", x, y)
eFrame.f:SetPoint("TOPLEFT", eFrame, "TOPLEFT", 12, -52)
eFrame.f:SetWidth(676)
eFrame.f:SetJustifyH("LEFT")
eFrame.f:SetWordWrap(false)
-- Add copy label
eFrame.c = eFrame:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge')
eFrame.c:SetPoint("TOPLEFT", x, y)
eFrame.c:SetText(L["Press CTRL/C to copy"])
eFrame.c:SetPoint("TOPLEFT", eFrame, "TOPLEFT", 12, -82)
-- Add feedback label
eFrame.x = eFrame:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge')
eFrame.x:SetPoint("TOPRIGHT", x, y)
eFrame.x:SetText(L["feedback@leatrix.com"])
eFrame.x:SetPoint("TOPRIGHT", eFrame, "TOPRIGHT", -12, -52)
hooksecurefunc(eFrame.f, "SetText", function()
eFrame.f:SetWidth(676 - eFrame.x:GetStringWidth() - 26)
end)
-- Add cancel label
eFrame.x = eFrame:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge')
eFrame.x:SetPoint("TOPRIGHT", x, y)
eFrame.x:SetText(L["Right-click to close"])
eFrame.x:SetPoint("TOPRIGHT", eFrame, "TOPRIGHT", -12, -82)
-- Create editbox
eFrame.b = CreateFrame("EditBox", nil, eFrame, "InputBoxTemplate")
eFrame.b:ClearAllPoints()
eFrame.b:SetPoint("TOPLEFT", eFrame, "TOPLEFT", 16, -12)
eFrame.b:SetSize(672, 24)
eFrame.b:SetFontObject("GameFontNormalLarge")
eFrame.b:SetTextColor(1.0, 1.0, 1.0, 1)
eFrame.b:SetBlinkSpeed(0)
eFrame.b:SetHitRectInsets(99, 99, 99, 99)
eFrame.b:SetAutoFocus(true)
eFrame.b:SetAltArrowKeyMode(true)
-- Editbox texture
eFrame.t = CreateFrame("FRAME", nil, eFrame.b, "BackdropTemplate")
eFrame.t:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = false, tileSize = 16, edgeSize = 16, insets = { left = 5, right = 5, top = 5, bottom = 5 }})
eFrame.t:SetPoint("LEFT", -6, 0)
eFrame.t:SetWidth(eFrame.b:GetWidth() + 6)
eFrame.t:SetHeight(eFrame.b:GetHeight())
eFrame.t:SetBackdropColor(1.0, 1.0, 1.0, 0.3)
-- Handler
eFrame.b:SetScript("OnKeyDown", function(void, key)
if key == "C" and IsControlKeyDown() then
C_Timer.After(0.1, function()
eFrame:Hide()
LeaPlusLC:DisplayMessage(L["Copied to clipboard."], true)
if LeaPlusLC.FactoryEditBoxFocusChat then
local eBox = ChatEdit_ChooseBoxForSend()
ChatEdit_ActivateChat(eBox)
end
end)
end
end)
-- Prevent changes
eFrame.b:SetScript("OnEscapePressed", function() eFrame:Hide() end)
eFrame.b:SetScript("OnEnterPressed", eFrame.b.HighlightText)
eFrame.b:SetScript("OnMouseDown", eFrame.b.ClearFocus)
eFrame.b:SetScript("OnMouseUp", eFrame.b.HighlightText)
eFrame.b:SetFocus(true)
eFrame.b:HighlightText()
eFrame:Show()
end
if focuschat then LeaPlusLC.FactoryEditBoxFocusChat = true else LeaPlusLC.FactoryEditBoxFocusChat = nil end
LeaPlusLC.FactoryEditBox:Show()
LeaPlusLC.FactoryEditBox.b:SetText(word)
LeaPlusLC.FactoryEditBox.b:HighlightText()
LeaPlusLC.FactoryEditBox.b:SetScript("OnChar", function() LeaPlusLC.FactoryEditBox.b:SetFocus(true) LeaPlusLC.FactoryEditBox.b:SetText(word) LeaPlusLC.FactoryEditBox.b:HighlightText() end)
LeaPlusLC.FactoryEditBox.b:SetScript("OnKeyUp", function() LeaPlusLC.FactoryEditBox.b:SetFocus(true) LeaPlusLC.FactoryEditBox.b:SetText(word) LeaPlusLC.FactoryEditBox.b:HighlightText() end)
end
-- Load a string variable or set it to default if it's not set to "On" or "Off"
function LeaPlusLC:LoadVarChk(var, def)
if LeaPlusDB[var] and type(LeaPlusDB[var]) == "string" and LeaPlusDB[var] == "On" or LeaPlusDB[var] == "Off" then
LeaPlusLC[var] = LeaPlusDB[var]
else
LeaPlusLC[var] = def
LeaPlusDB[var] = def
end
end
-- Load a numeric variable and set it to default if it's not within a given range
function LeaPlusLC:LoadVarNum(var, def, valmin, valmax)
if LeaPlusDB[var] and type(LeaPlusDB[var]) == "number" and LeaPlusDB[var] >= valmin and LeaPlusDB[var] <= valmax then
LeaPlusLC[var] = LeaPlusDB[var]
else
LeaPlusLC[var] = def
LeaPlusDB[var] = def
end
end
-- Load an anchor point variable and set it to default if the anchor point is invalid
function LeaPlusLC:LoadVarAnc(var, def)
if LeaPlusDB[var] and type(LeaPlusDB[var]) == "string" and LeaPlusDB[var] == "CENTER" or LeaPlusDB[var] == "TOP" or LeaPlusDB[var] == "BOTTOM" or LeaPlusDB[var] == "LEFT" or LeaPlusDB[var] == "RIGHT" or LeaPlusDB[var] == "TOPLEFT" or LeaPlusDB[var] == "TOPRIGHT" or LeaPlusDB[var] == "BOTTOMLEFT" or LeaPlusDB[var] == "BOTTOMRIGHT" then
LeaPlusLC[var] = LeaPlusDB[var]
else
LeaPlusLC[var] = def
LeaPlusDB[var] = def
end
end
-- Load a string variable and set it to default if it is not a string (used with minimap exclude list)
function LeaPlusLC:LoadVarStr(var, def)
if LeaPlusDB[var] and type(LeaPlusDB[var]) == "string" then
LeaPlusLC[var] = LeaPlusDB[var]
else
LeaPlusLC[var] = def
LeaPlusDB[var] = def
end
end
-- Show tooltips for checkboxes
function LeaPlusLC:TipSee()
GameTooltip:SetOwner(self, "ANCHOR_NONE")
local parent = self:GetParent()
if parent == LeaPlusLC.RemoveTransformsScrollChild then
-- Remove transforms scroll list tooltips have different parent
parent = self:GetParent():GetParent():GetParent():GetParent()
end
local pscale = parent:GetEffectiveScale()
local gscale = UIParent:GetEffectiveScale()
local tscale = GameTooltip:GetEffectiveScale()
local gap = ((UIParent:GetRight() * gscale) - (parent:GetRight() * pscale))
if gap < (250 * tscale) then
GameTooltip:SetPoint("TOPRIGHT", parent, "TOPLEFT", 0, 0)
else
GameTooltip:SetPoint("TOPLEFT", parent, "TOPRIGHT", 0, 0)
end
GameTooltip:SetText(self.tiptext, nil, nil, nil, nil, true)
end
-- Show tooltips for dropdown menu tooltips
function LeaPlusLC:ShowDropTip()
GameTooltip:SetOwner(self, "ANCHOR_NONE")
local parent = self:GetParent():GetParent():GetParent()
local pscale = parent:GetEffectiveScale()
local gscale = UIParent:GetEffectiveScale()
local tscale = GameTooltip:GetEffectiveScale()
local gap = ((UIParent:GetRight() * gscale) - (parent:GetRight() * pscale))
if gap < (250 * tscale) then
GameTooltip:SetPoint("TOPRIGHT", parent, "TOPLEFT", 0, 0)
else
GameTooltip:SetPoint("TOPLEFT", parent, "TOPRIGHT", 0, 0)
end
GameTooltip:SetText(self.tiptext, nil, nil, nil, nil, true)
end
-- Show tooltips for configuration buttons and dropdown menus
function LeaPlusLC:ShowTooltip()
GameTooltip:SetOwner(self, "ANCHOR_NONE")
local parent = LeaPlusLC["PageF"]
local pscale = parent:GetEffectiveScale()
local gscale = UIParent:GetEffectiveScale()
local tscale = GameTooltip:GetEffectiveScale()
local gap = ((UIParent:GetRight() * gscale) - (LeaPlusLC["PageF"]:GetRight() * pscale))
if gap < (250 * tscale) then
GameTooltip:SetPoint("TOPRIGHT", parent, "TOPLEFT", 0, 0)
else
GameTooltip:SetPoint("TOPLEFT", parent, "TOPRIGHT", 0, 0)
end
GameTooltip:SetText(self.tiptext, nil, nil, nil, nil, true)
end
-- Show tooltips for interface settings (not currently used)
function LeaPlusLC:ShowFacetip()
GameTooltip:SetOwner(self, "ANCHOR_TOP")
GameTooltip:SetText(self.tiptext, nil, nil, nil, nil, true)
end
-- Create configuration button
function LeaPlusLC:CfgBtn(name, parent)
local CfgBtn = CreateFrame("BUTTON", nil, parent)
LeaPlusCB[name] = CfgBtn
CfgBtn:SetWidth(20)
CfgBtn:SetHeight(20)
CfgBtn:SetPoint("LEFT", parent.f, "RIGHT", 0, 0)
CfgBtn.t = CfgBtn:CreateTexture(nil, "BORDER")
CfgBtn.t:SetAllPoints()
CfgBtn.t:SetTexture("Interface\\WorldMap\\Gear_64.png")
CfgBtn.t:SetTexCoord(0, 0.50, 0, 0.50);
CfgBtn.t:SetVertexColor(1.0, 0.82, 0, 1.0)
CfgBtn:SetHighlightTexture("Interface\\WorldMap\\Gear_64.png")
CfgBtn:GetHighlightTexture():SetTexCoord(0, 0.50, 0, 0.50);
CfgBtn.tiptext = L["Click to configure the settings for this option."]
CfgBtn:SetScript("OnEnter", LeaPlusLC.ShowTooltip)
CfgBtn:SetScript("OnLeave", GameTooltip_Hide)
end
-- Create a help button to the right of a fontstring
function LeaPlusLC:CreateHelpButton(frame, panel, parent, tip)
LeaPlusLC:CfgBtn(frame, panel)
LeaPlusCB[frame]:ClearAllPoints()
LeaPlusCB[frame]:SetPoint("LEFT", parent, "RIGHT", -parent:GetWidth() + parent:GetStringWidth(), 0)
LeaPlusCB[frame]:SetSize(25, 25)
LeaPlusCB[frame].t:SetTexture("Interface\\COMMON\\help-i.blp")
LeaPlusCB[frame].t:SetTexCoord(0, 1, 0, 1)
LeaPlusCB[frame].t:SetVertexColor(0.9, 0.8, 0.0)
LeaPlusCB[frame]:SetHighlightTexture("Interface\\COMMON\\help-i.blp")
LeaPlusCB[frame]:GetHighlightTexture():SetTexCoord(0, 1, 0, 1)
LeaPlusCB[frame].tiptext = L[tip]
LeaPlusCB[frame]:SetScript("OnEnter", LeaPlusLC.TipSee)
end
-- Show a footer
function LeaPlusLC:MakeFT(frame, text, left, width, bottom)
local footer = LeaPlusLC:MakeTx(frame, text, left, bottom)
footer:SetWidth(width); footer:SetJustifyH("LEFT"); footer:SetWordWrap(true); footer:ClearAllPoints()
footer:SetPoint("BOTTOMLEFT", left, bottom)
end
-- Capitalise first character in a string
function LeaPlusLC:CapFirst(str)
return gsub(string.lower(str), "^%l", strupper)
end
-- Toggle Zygor addon
function LeaPlusLC:ZygorToggle()
if select(2, GetAddOnInfo("ZygorGuidesViewer")) then
if not IsAddOnLoaded("ZygorGuidesViewer") then
if LeaPlusLC:PlayerInCombat() then
return
else
EnableAddOn("ZygorGuidesViewer")
ReloadUI();
end
else
DisableAddOn("ZygorGuidesViewer")
ReloadUI();
end
else
-- Zygor cannot be found
LeaPlusLC:Print("Zygor addon not found.");
end
return
end
-- Show memory usage stat
function LeaPlusLC:ShowMemoryUsage(frame, anchor, x, y)
-- Create frame
local memframe = CreateFrame("FRAME", nil, frame)
memframe:ClearAllPoints()
memframe:SetPoint(anchor, x, y)
memframe:SetWidth(100)
memframe:SetHeight(20)
-- Create labels
local pretext = memframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormal')
pretext:SetPoint("TOPLEFT", 0, 0)
pretext:SetText(L["Memory Usage"])
local memtext = memframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormal')
memtext:SetPoint("TOPLEFT", 0, 0 - 30)
-- Create stat
local memstat = memframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormal')
memstat:SetPoint("BOTTOMLEFT", memtext, "BOTTOMRIGHT")
memstat:SetText("(calculating...)")
-- Create update script
local memtime = -1
memframe:SetScript("OnUpdate", function(self, elapsed)
if memtime > 2 or memtime == -1 then
UpdateAddOnMemoryUsage();
memtext = GetAddOnMemoryUsage("Leatrix_Plus")
memtext = math.floor(memtext + .5) .. " KB"
memstat:SetText(memtext);
memtime = 0;
end
memtime = memtime + elapsed;
end)
-- Release memory
LeaPlusLC.ShowMemoryUsage = nil
end
-- Check if player is in LFG queue
function LeaPlusLC:IsInLFGQueue()
if GetLFGMode(LE_LFG_CATEGORY_LFD) or
GetLFGMode(LE_LFG_CATEGORY_LFR) or
GetLFGMode(LE_LFG_CATEGORY_RF) or
GetLFGMode(LE_LFG_CATEGORY_SCENARIO) or
GetLFGMode(LE_LFG_CATEGORY_FLEXRAID) then
return true
end
end
-- Check if player is in combat
function LeaPlusLC:PlayerInCombat()
if (UnitAffectingCombat("player")) then
LeaPlusLC:Print("You cannot do that in combat.")
return true
end
end
-- Hide panel and pages
function LeaPlusLC:HideFrames()
-- Hide option pages
for i = 0, LeaPlusLC["NumberOfPages"] do
if LeaPlusLC["Page"..i] then
LeaPlusLC["Page"..i]:Hide();
end;
end
-- Hide options panel
LeaPlusLC["PageF"]:Hide();
end
-- Find out if Leatrix Plus is showing (main panel or config panel)
function LeaPlusLC:IsPlusShowing()
if LeaPlusLC["PageF"]:IsShown() then return true end
for k, v in pairs(LeaConfigList) do
if v:IsShown() then
return true
end
end
end
-- Check if a name is in your friends list, guild or community (does not check realm as realm is unknown for some checks)
function LeaPlusLC:FriendCheck(name, guid)
-- Do nothing if name is empty (such as whispering from the Battle.net app)
if not name then return end
-- Update friends list
C_FriendList.ShowFriends()
-- Remove realm
name = strsplit("-", name, 2)
-- Check character friends
for i = 1, C_FriendList.GetNumFriends() do
-- Return true is character name matches and GUID matches if there is one (realm is not checked)
local friendInfo = C_FriendList.GetFriendInfoByIndex(i)
local charFriendName = C_FriendList.GetFriendInfoByIndex(i).name
charFriendName = strsplit("-", charFriendName, 2)
if (name == charFriendName) and (guid and (guid == friendInfo.guid) or true) then
return true
end
end
-- Check Battle.net friends
local numfriends = BNGetNumFriends()
for i = 1, numfriends do
local numtoons = C_BattleNet.GetFriendNumGameAccounts(i)
for j = 1, numtoons do
local gameAccountInfo = C_BattleNet.GetFriendGameAccountInfo(i, j)
local characterName = gameAccountInfo.characterName
local client = gameAccountInfo.clientProgram
if client == "WoW" and characterName == name then
return true
end
end
end
-- Check guild members if guild is enabled (new members may need to press J to refresh roster)
if LeaPlusLC["FriendlyGuild"] == "On" then
local gCount = GetNumGuildMembers()
for i = 1, gCount do
local gName, void, void, void, void, void, void, void, gOnline, void, void, void, void, gMobile, void, void, gGUID = GetGuildRosterInfo(i)
if gOnline and not gMobile then
gName = strsplit("-", gName, 2)
-- Return true if character name matches including GUID if there is one
if (name == gName) and (guid and (guid == gGUID) or true) then
return true
end
end
end
end
-- Check communities if communities is enabled
if LeaPlusLC["FriendlyCommunities"] == "On" then
local communities = C_Club.GetSubscribedClubs()
for void, community in pairs(communities) do
if community.clubType == Enum.ClubType.Character then
local cMemberIds = CommunitiesUtil.GetMemberIdsSortedByName(community.clubId)
local cMembersInfo = CommunitiesUtil.GetMemberInfo(community.clubId, cMemberIds)
for void, member in pairs(cMembersInfo) do
if member and member.name and member.presence and member.presence ~= Enum.ClubMemberPresence.Offline and member.presence ~= Enum.ClubMemberPresence.OnlineMobile then
local cName = strsplit("-", member.name, 2)
-- Return true if character name matches including GUID if there is one
if (name == cName) and (guid and member.guid and (guid == member.guid) or true) then
return true
end
end
end
end
end
end
end
----------------------------------------------------------------------
-- L02: Locks
----------------------------------------------------------------------
-- Function to set lock state for configuration buttons
function LeaPlusLC:LockOption(option, item, reloadreq)
if reloadreq then
-- Option change requires UI reload
if LeaPlusLC[option] ~= LeaPlusDB[option] or LeaPlusLC[option] == "Off" then
LeaPlusLC:LockItem(LeaPlusCB[item], true)
else
LeaPlusLC:LockItem(LeaPlusCB[item], false)
end
else
-- Option change does not require UI reload
if LeaPlusLC[option] == "Off" then
LeaPlusLC:LockItem(LeaPlusCB[item], true)
else
LeaPlusLC:LockItem(LeaPlusCB[item], false)
end
end
end
-- Set lock state for configuration buttons
function LeaPlusLC:SetDim()
LeaPlusLC:LockOption("AutomateQuests", "AutomateQuestsBtn", false) -- Automate quests
LeaPlusLC:LockOption("AutoAcceptRes", "AutoAcceptResBtn", false) -- Accept resurrection
LeaPlusLC:LockOption("AutoReleasePvP", "AutoReleasePvPBtn", false) -- Release in PvP
LeaPlusLC:LockOption("AutoSellJunk", "AutoSellJunkBtn", true) -- Sell junk automatically
LeaPlusLC:LockOption("AutoRepairGear", "AutoRepairBtn", false) -- Repair automatically
LeaPlusLC:LockOption("InviteFromWhisper", "InvWhisperBtn", false) -- Invite from whispers
LeaPlusLC:LockOption("NoChatButtons", "NoChatButtonsBtn", true) -- Hide chat buttons
LeaPlusLC:LockOption("SetChatFontSize", "SetChatFontSizeBtn", true) -- Set chat font size
LeaPlusLC:LockOption("FilterChatMessages", "FilterChatMessagesBtn", true) -- Filter chat messages
LeaPlusLC:LockOption("MailFontChange", "MailTextBtn", true) -- Resize mail text
LeaPlusLC:LockOption("QuestFontChange", "QuestTextBtn", true) -- Resize quest text
LeaPlusLC:LockOption("MinimapModder", "ModMinimapBtn", true) -- Enhance minimap
LeaPlusLC:LockOption("TipModEnable", "MoveTooltipButton", true) -- Enhance tooltip
LeaPlusLC:LockOption("EnhanceDressup", "EnhanceDressupBtn", true) -- Enhance dressup
LeaPlusLC:LockOption("ShowCooldowns", "CooldownsButton", true) -- Show cooldowns
LeaPlusLC:LockOption("ShowBorders", "ModBordersBtn", true) -- Show borders
LeaPlusLC:LockOption("ShowPlayerChain", "ModPlayerChain", true) -- Show player chain
LeaPlusLC:LockOption("ShowWowheadLinks", "ShowWowheadLinksBtn", true) -- Show Wowhead links
LeaPlusLC:LockOption("ManageWidgetTop", "ManageWidgetTopButton", true) -- Manage widget top
LeaPlusLC:LockOption("ManageControl", "ManageControlButton", true) -- Manage control
LeaPlusLC:LockOption("ClassColFrames", "ClassColFramesBtn", true) -- Class colored frames
LeaPlusLC:LockOption("SetWeatherDensity", "SetWeatherDensityBtn", false) -- Set weather density
LeaPlusLC:LockOption("MuteGameSounds", "MuteGameSoundsBtn", false) -- Mute game sounds
LeaPlusLC:LockOption("MuteMountSounds", "MuteMountSoundsBtn", false) -- Mute mount sounds
LeaPlusLC:LockOption("MuteCustomSounds", "MuteCustomSoundsBtn", false) -- Mute custom sounds
LeaPlusLC:LockOption("FasterLooting", "FasterLootingBtn", true) -- Faster auto loot
LeaPlusLC:LockOption("NoTransforms", "NoTransformsBtn", false) -- Remove transforms
end
----------------------------------------------------------------------
-- L03: Restarts
----------------------------------------------------------------------
-- Set the reload button state
function LeaPlusLC:ReloadCheck()
-- Automation
if (LeaPlusLC["AutoSellJunk"] ~= LeaPlusDB["AutoSellJunk"]) -- Sell junk automatically
-- Chat
or (LeaPlusLC["UseEasyChatResizing"] ~= LeaPlusDB["UseEasyChatResizing"]) -- Use easy resizing
or (LeaPlusLC["NoCombatLogTab"] ~= LeaPlusDB["NoCombatLogTab"]) -- Hide the combat log
or (LeaPlusLC["NoChatButtons"] ~= LeaPlusDB["NoChatButtons"]) -- Hide chat buttons
or (LeaPlusLC["NoSocialButton"] ~= LeaPlusDB["NoSocialButton"]) -- Hide social button
or (LeaPlusLC["UnclampChat"] ~= LeaPlusDB["UnclampChat"]) -- Unclamp chat frame
or (LeaPlusLC["MoveChatEditBoxToTop"] ~= LeaPlusDB["MoveChatEditBoxToTop"]) -- Move editbox to top
or (LeaPlusLC["SetChatFontSize"] ~= LeaPlusDB["SetChatFontSize"]) -- Set chat font size
or (LeaPlusLC["NoStickyChat"] ~= LeaPlusDB["NoStickyChat"]) -- Disable sticky chat
or (LeaPlusLC["UseArrowKeysInChat"] ~= LeaPlusDB["UseArrowKeysInChat"]) -- Use arrow keys in chat
or (LeaPlusLC["NoChatFade"] ~= LeaPlusDB["NoChatFade"]) -- Disable chat fade
or (LeaPlusLC["RecentChatWindow"] ~= LeaPlusDB["RecentChatWindow"]) -- Recent chat window
or (LeaPlusLC["MaxChatHstory"] ~= LeaPlusDB["MaxChatHstory"]) -- Increase chat history
or (LeaPlusLC["FilterChatMessages"] ~= LeaPlusDB["FilterChatMessages"]) -- Filter chat messages
or (LeaPlusLC["RestoreChatMessages"] ~= LeaPlusDB["RestoreChatMessages"]) -- Restore chat messages
-- Text
or (LeaPlusLC["HideErrorMessages"] ~= LeaPlusDB["HideErrorMessages"]) -- Hide error messages
or (LeaPlusLC["NoHitIndicators"] ~= LeaPlusDB["NoHitIndicators"]) -- Hide portrait text
or (LeaPlusLC["HideZoneText"] ~= LeaPlusDB["HideZoneText"]) -- Hide zone text
or (LeaPlusLC["HideKeybindText"] ~= LeaPlusDB["HideKeybindText"]) -- Hide keybind text
or (LeaPlusLC["HideMacroText"] ~= LeaPlusDB["HideMacroText"]) -- Hide macro text
or (LeaPlusLC["MailFontChange"] ~= LeaPlusDB["MailFontChange"]) -- Resize mail text
or (LeaPlusLC["QuestFontChange"] ~= LeaPlusDB["QuestFontChange"]) -- Resize quest text
-- Interface
or (LeaPlusLC["MinimapModder"] ~= LeaPlusDB["MinimapModder"]) -- Enhance minimap
or (LeaPlusLC["SquareMinimap"] ~= LeaPlusDB["SquareMinimap"]) -- Square minimap
or (LeaPlusLC["HideMiniAddonMenu"] ~= LeaPlusDB["HideMiniAddonMenu"]) -- Hide addon menu
or (LeaPlusLC["UnclampMinimap"] ~= LeaPlusDB["UnclampMinimap"]) -- Unclamp minimap cluster
or (LeaPlusLC["CombineAddonButtons"] ~= LeaPlusDB["CombineAddonButtons"]) -- Combine addon buttons
or (LeaPlusLC["MiniExcludeList"] ~= LeaPlusDB["MiniExcludeList"]) -- Minimap exclude list
or (LeaPlusLC["TipModEnable"] ~= LeaPlusDB["TipModEnable"]) -- Enhance tooltip
or (LeaPlusLC["TipNoHealthBar"] ~= LeaPlusDB["TipNoHealthBar"]) -- Tooltip hide health bar
or (LeaPlusLC["EnhanceDressup"] ~= LeaPlusDB["EnhanceDressup"]) -- Enhance dressup
or (LeaPlusLC["DressupWiderPreview"] ~= LeaPlusDB["DressupWiderPreview"]) -- Enhance dressup wider character preview
or (LeaPlusLC["DressupMoreZoomOut"] ~= LeaPlusDB["DressupMoreZoomOut"]) -- Enhance dressup increase zoom out distance
or (LeaPlusLC["ShowVolume"] ~= LeaPlusDB["ShowVolume"]) -- Show volume slider
or (LeaPlusLC["ShowCooldowns"] ~= LeaPlusDB["ShowCooldowns"]) -- Show cooldowns
or (LeaPlusLC["DurabilityStatus"] ~= LeaPlusDB["DurabilityStatus"]) -- Show durability status
or (LeaPlusLC["ShowPetSaveBtn"] ~= LeaPlusDB["ShowPetSaveBtn"]) -- Show pet save button
or (LeaPlusLC["ShowRaidToggle"] ~= LeaPlusDB["ShowRaidToggle"]) -- Show raid button
or (LeaPlusLC["ShowTrainAllButton"] ~= LeaPlusDB["ShowTrainAllButton"]) -- Show train all button
or (LeaPlusLC["ShowBorders"] ~= LeaPlusDB["ShowBorders"]) -- Show borders
or (LeaPlusLC["ShowPlayerChain"] ~= LeaPlusDB["ShowPlayerChain"]) -- Show player chain
or (LeaPlusLC["ShowReadyTimer"] ~= LeaPlusDB["ShowReadyTimer"]) -- Show ready timer
or (LeaPlusLC["ShowWowheadLinks"] ~= LeaPlusDB["ShowWowheadLinks"]) -- Show Wowhead links
-- Frames
or (LeaPlusLC["ManageWidgetTop"] ~= LeaPlusDB["ManageWidgetTop"]) -- Manage widget top
or (LeaPlusLC["ManageControl"] ~= LeaPlusDB["ManageControl"]) -- Manage control
or (LeaPlusLC["ClassColFrames"] ~= LeaPlusDB["ClassColFrames"]) -- Class colored frames
or (LeaPlusLC["NoAlerts"] ~= LeaPlusDB["NoAlerts"]) -- Hide alerts
or (LeaPlusLC["HideBodyguard"] ~= LeaPlusDB["HideBodyguard"]) -- Hide bodyguard gossip
or (LeaPlusLC["HideTalkingFrame"] ~= LeaPlusDB["HideTalkingFrame"]) -- Hide talking frame
or (LeaPlusLC["HideCleanupBtns"] ~= LeaPlusDB["HideCleanupBtns"]) -- Hide clean-up buttons
or (LeaPlusLC["HideBossBanner"] ~= LeaPlusDB["HideBossBanner"]) -- Hide boss banner
or (LeaPlusLC["HideEventToasts"] ~= LeaPlusDB["HideEventToasts"]) -- Hide event toasts
or (LeaPlusLC["NoClassBar"] ~= LeaPlusDB["NoClassBar"]) -- Hide stance bar
or (LeaPlusLC["NoCommandBar"] ~= LeaPlusDB["NoCommandBar"]) -- Hide order hall bar
or (LeaPlusLC["NoRestedSleep"] ~= LeaPlusDB["NoRestedSleep"]) -- Hide rested sleep
-- System
or (LeaPlusLC["NoRestedEmotes"] ~= LeaPlusDB["NoRestedEmotes"]) -- Silence rested emotes
or (LeaPlusLC["NoPetAutomation"] ~= LeaPlusDB["NoPetAutomation"]) -- Disable pet automation
or (LeaPlusLC["CharAddonList"] ~= LeaPlusDB["CharAddonList"]) -- Show character addons
or (LeaPlusLC["FasterLooting"] ~= LeaPlusDB["FasterLooting"]) -- Faster auto loot
or (LeaPlusLC["FasterMovieSkip"] ~= LeaPlusDB["FasterMovieSkip"]) -- Faster movie skip
or (LeaPlusLC["CombatPlates"] ~= LeaPlusDB["CombatPlates"]) -- Combat plates
or (LeaPlusLC["EasyItemDestroy"] ~= LeaPlusDB["EasyItemDestroy"]) -- Easy item destroy
or (LeaPlusLC["LockoutSharing"] ~= LeaPlusDB["LockoutSharing"]) -- Lockout sharing
then
-- Enable the reload button
LeaPlusLC:LockItem(LeaPlusCB["ReloadUIButton"], false)
LeaPlusCB["ReloadUIButton"].f:Show()
else
-- Disable the reload button
LeaPlusLC:LockItem(LeaPlusCB["ReloadUIButton"], true)
LeaPlusCB["ReloadUIButton"].f:Hide()
end
end
----------------------------------------------------------------------
-- L20: Live
----------------------------------------------------------------------
function LeaPlusLC:Live()
----------------------------------------------------------------------
-- Automatically accept Dungeon Finder queue requests
----------------------------------------------------------------------
if LeaPlusLC["AutoConfirmRole"] == "On" then
LFDRoleCheckPopupAcceptButton:SetScript("OnShow", function()
local leader, leaderGUID = "", ""
for i = 1, GetNumSubgroupMembers() do
if UnitIsGroupLeader("party" .. i) then
leader = UnitName("party" .. i)
leaderGUID = UnitGUID("party" .. i)
break
end
end
if LeaPlusLC:FriendCheck(leader, leaderGUID) then
LFDRoleCheckPopupAcceptButton:Click()
end
end)
else
LFDRoleCheckPopupAcceptButton:SetScript("OnShow", nil)
end
----------------------------------------------------------------------
-- Invite from whispers
----------------------------------------------------------------------
if LeaPlusLC["InviteFromWhisper"] == "On" then
LpEvt:RegisterEvent("CHAT_MSG_WHISPER");
LpEvt:RegisterEvent("CHAT_MSG_BN_WHISPER");
else
LpEvt:UnregisterEvent("CHAT_MSG_WHISPER");
LpEvt:UnregisterEvent("CHAT_MSG_BN_WHISPER");
end
----------------------------------------------------------------------
-- Block duels
----------------------------------------------------------------------
if LeaPlusLC["NoDuelRequests"] == "On" then
LpEvt:RegisterEvent("DUEL_REQUESTED");
else
LpEvt:UnregisterEvent("DUEL_REQUESTED");
end
----------------------------------------------------------------------
-- Block pet battle duels
----------------------------------------------------------------------
if LeaPlusLC["NoPetDuels"] == "On" then
LpEvt:RegisterEvent("PET_BATTLE_PVP_DUEL_REQUESTED");
else
LpEvt:UnregisterEvent("PET_BATTLE_PVP_DUEL_REQUESTED");
end
----------------------------------------------------------------------
-- Block party invites and Party from friends
----------------------------------------------------------------------
if LeaPlusLC["NoPartyInvites"] == "On" or LeaPlusLC["AcceptPartyFriends"] == "On" then
LpEvt:RegisterEvent("PARTY_INVITE_REQUEST");
else
LpEvt:UnregisterEvent("PARTY_INVITE_REQUEST");
end
----------------------------------------------------------------------
-- Automatic summon
----------------------------------------------------------------------
if LeaPlusLC["AutoAcceptSummon"] == "On" then
LpEvt:RegisterEvent("CONFIRM_SUMMON");
else
LpEvt:UnregisterEvent("CONFIRM_SUMMON");
end
----------------------------------------------------------------------
-- Disable loot warnings
----------------------------------------------------------------------
if LeaPlusLC["NoConfirmLoot"] == "On" then
LpEvt:RegisterEvent("CONFIRM_LOOT_ROLL")
LpEvt:RegisterEvent("CONFIRM_DISENCHANT_ROLL")
LpEvt:RegisterEvent("LOOT_BIND_CONFIRM")
LpEvt:RegisterEvent("MERCHANT_CONFIRM_TRADE_TIMER_REMOVAL")
LpEvt:RegisterEvent("MAIL_LOCK_SEND_ITEMS")
else
LpEvt:UnregisterEvent("CONFIRM_LOOT_ROLL")
LpEvt:UnregisterEvent("CONFIRM_DISENCHANT_ROLL")
LpEvt:UnregisterEvent("LOOT_BIND_CONFIRM")
LpEvt:UnregisterEvent("MERCHANT_CONFIRM_TRADE_TIMER_REMOVAL")
LpEvt:UnregisterEvent("MAIL_LOCK_SEND_ITEMS")
end
end
----------------------------------------------------------------------
-- L30: Isolated
----------------------------------------------------------------------
function LeaPlusLC:Isolated()
----------------------------------------------------------------------
-- Mute mount sounds (no reload required)
----------------------------------------------------------------------
do
-- Get mute table
local mountTable = Leatrix_Plus["mountTable"]
-- Give table file level scope (its used during logout and for wipe and admin commands)
LeaPlusLC["mountTable"] = mountTable
-- Load saved settings or set default values
for k, v in pairs(mountTable) do
if LeaPlusDB[k] and type(LeaPlusDB[k]) == "string" and LeaPlusDB[k] == "On" or LeaPlusDB[k] == "Off" then
LeaPlusLC[k] = LeaPlusDB[k]
else
LeaPlusLC[k] = "Off"
LeaPlusDB[k] = "Off"
end
end
-- Create configuration panel
local MountPanel = LeaPlusLC:CreatePanel("Mute mount sounds", "MountPanel")
-- Add checkboxes
LeaPlusLC:MakeTx(MountPanel, "Mounts", 16, -72)
LeaPlusLC:MakeCB(MountPanel, "MuteAerials", "Aerials", 16, -92, false, "If checked, jet aerial units will be quieter.|n|nThis applies to Aerial Unit R-21X and Rustbolt Resistor.")
LeaPlusLC:MakeCB(MountPanel, "MuteAirships", "Airships", 16, -112, false, "If checked, airships will be muted.|n|nThis applies to airship mounts and transports.")
LeaPlusLC:MakeCB(MountPanel, "MuteBanLu", "Ban-Lu", 16, -132, false, "If checked, Ban-Lu will no longer talk to you.")
LeaPlusLC:MakeCB(MountPanel, "MuteBikes", "Bikes", 16, -152, false, "If checked, most of the bike mount sounds will be muted.")
LeaPlusLC:MakeCB(MountPanel, "MuteBrooms", "Brooms", 16, -172, false, "If checked, broom mounts will be muted.")
LeaPlusLC:MakeCB(MountPanel, "MuteDragonriding", "Dragonriding", 16, -192, false, "If checked, dragonriding mounts will be quieter.")
LeaPlusLC:MakeCB(MountPanel, "MuteFurlines", "Furlines", 16, -212, false, "If checked, furlines will be muted.|n|nThis applies to Sunwarmed Furline.")
LeaPlusLC:MakeCB(MountPanel, "MuteGyrocopters", "Gyrocopters", 16, -232, false, "If checked, gyrocopters will be muted.|n|nThis applies to Mimiron's Head, Mecha-Mogul MK2 and other gyrocopter mounts.|n|nEnabling this option will also mute airplane gear shift sounds.")
LeaPlusLC:MakeCB(MountPanel, "MuteHovercraft", "Hovercraft", 150, -92, false, "If checked, hovercraft will be quieter.|n|nThis applies to Xiwyllag ATV.")
LeaPlusLC:MakeCB(MountPanel, "MuteLunarwing", "Lunarwing", 150, -112, false, "If checked, Archdruid's Lunarwing Form will be quieter.")
LeaPlusLC:MakeCB(MountPanel, "MuteMechSteps", "Mechsteps", 150, -132, false, "If checked, footsteps for mechanical mounts will be muted.")
LeaPlusLC:MakeCB(MountPanel, "MuteStriders", "Mechstriders", 150, -152, false, "If checked, mechanostriders will be quieter.")
LeaPlusLC:MakeCB(MountPanel, "MuteMechsuits", "Mechsuits", 150, -172, false, "If checked, mechsuits will be quieter.|n|nThis applies to Felsteel Annihilator, Lightforged Warframe, Sky Golem and other mechsuits.")
LeaPlusLC:MakeCB(MountPanel, "MuteOttuks", "Ottuks", 150, -192, false, "If checked, ottuks will be quieter.")
LeaPlusLC:MakeCB(MountPanel, "MuteRazorwings", "Razorwings", 150, -212, false, "If checked, razorwings will be muted.")
LeaPlusLC:MakeCB(MountPanel, "MuteRockets", "Rockets", 150, -232, false, "If checked, rockets will be muted.")
LeaPlusLC:MakeCB(MountPanel, "MuteSoulEaters", "Soul Eaters", 284, -92, false, "If checked, Gladiator Soul Eater mounts will be quieter.")
LeaPlusLC:MakeCB(MountPanel, "MuteSoulseekers", "Soulseekers", 284, -112, false, "If checked, soulseekers will be quieter.|n|nThis applies to Corridor Creeper, Mawsworn Soulhunter and Bound Shadehound.")
LeaPlusLC:MakeCB(MountPanel, "MuteTravelers", "Travelers", 284, -132, false, "If checked, traveling merchant greetings and farewells will be muted.|n|nThis applies to Traveler's Tundra Mammoth, Grand Expedition Yak and Mighty Caravan Brutosaur.")
LeaPlusLC:MakeCB(MountPanel, "MuteUnicorns", "Unicorns", 284, -152, false, "If checked, unicorns will be quieter.|n|nThis applies to Lucid Nightmare, Wild Dreamrunner, Pureheart Courser and other unicorn mounts.")
LeaPlusLC:MakeCB(MountPanel, "MuteZeppelins", "Zeppelins", 284, -172, false, "If checked, zeppelins will be muted.|n|nThis applies to zeppelin mounts and transports.")
-- Set click width for sounds checkboxes
for k, v in pairs(mountTable) do
LeaPlusCB[k].f:SetWidth(90)
if LeaPlusCB[k].f:GetStringWidth() > 90 then
LeaPlusCB[k]:SetHitRectInsets(0, -80, 0, 0)
else
LeaPlusCB[k]:SetHitRectInsets(0, -LeaPlusCB[k].f:GetStringWidth() + 4, 0, 0)
end
end
-- Function to mute and unmute sounds
local function SetupMute()
for k, v in pairs(mountTable) do
if LeaPlusLC["MuteMountSounds"] == "On" and LeaPlusLC[k] == "On" then
for i, e in pairs(v) do
local file, soundID = e:match("([^,]+)%#([^,]+)")
MuteSoundFile(soundID)
end
else
for i, e in pairs(v) do
local file, soundID = e:match("([^,]+)%#([^,]+)")
UnmuteSoundFile(soundID)
end
end
end
end
-- Setup mute on startup if option is enabled
if LeaPlusLC["MuteMountSounds"] == "On" then SetupMute() end
-- Setup mute when options are clicked
for k, v in pairs(mountTable) do
LeaPlusCB[k]:HookScript("OnClick", SetupMute)
end
LeaPlusCB["MuteMountSounds"]:HookScript("OnClick", SetupMute)
-- Help button hidden
MountPanel.h:Hide()
-- Back button handler
MountPanel.b:SetScript("OnClick", function()
MountPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page7"]:Show()
return
end)
-- Reset button handler
MountPanel.r:SetScript("OnClick", function()
-- Reset checkboxes
for k, v in pairs(mountTable) do
LeaPlusLC[k] = "Off"
end
SetupMute()
-- Refresh panel
MountPanel:Hide(); MountPanel:Show()
end)
-- Show panal when options panel button is clicked
LeaPlusCB["MuteMountSoundsBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
for k, v in pairs(mountTable) do
LeaPlusLC[k] = "On"
end
SetupMute()
else
MountPanel:Show()
LeaPlusLC:HideFrames()
end
end)
end
----------------------------------------------------------------------
-- Mute game sounds (no reload required)
----------------------------------------------------------------------
do
-- Get mute table
local muteTable = Leatrix_Plus["muteTable"]
-- Give table file level scope (its used during logout and for wipe and admin commands)
LeaPlusLC["muteTable"] = muteTable
-- Load saved settings or set default values
for k, v in pairs(muteTable) do
if LeaPlusDB[k] and type(LeaPlusDB[k]) == "string" and LeaPlusDB[k] == "On" or LeaPlusDB[k] == "Off" then
LeaPlusLC[k] = LeaPlusDB[k]
else
LeaPlusLC[k] = "Off"
LeaPlusDB[k] = "Off"
end
end
-- Create configuration panel
local SoundPanel = LeaPlusLC:CreatePanel("Mute game sounds", "SoundPanel")
-- Add checkboxes
LeaPlusLC:MakeTx(SoundPanel, "General", 16, -72)
LeaPlusLC:MakeCB(SoundPanel, "MuteChimes", "Chimes", 16, -92, false, "If checked, clock hourly chimes will be muted.")
LeaPlusLC:MakeCB(SoundPanel, "MuteEvents", "Events", 16, -112, false, "If checked, holiday event sounds will be muted.|n|nThis applies to Headless Horseman.")
LeaPlusLC:MakeCB(SoundPanel, "MuteFizzle", "Fizzle", 16, -132, false, "If checked, the spell fizzle sounds will be muted.")
LeaPlusLC:MakeCB(SoundPanel, "MuteInterface", "Interface", 16, -152, false, "If checked, the interface button sound, the chat frame tab click sound and the game menu toggle sound will be muted.")
LeaPlusLC:MakeCB(SoundPanel, "MuteLogin", "Login", 16, -172, false, "If checked, login screen sounds will be muted when you logout of the game.|n|nNote that login screen sounds will not be muted when you initially launch the game.|n|nThey will only be muted when you logout of the game. This includes manually logging out as well as being forcefully logged out by the game server for reasons such as being away for an extended period of time.|n|nNo more dragons roaring when you fall asleep while the game is running!")
LeaPlusLC:MakeCB(SoundPanel, "MuteReady", "Ready", 16, -192, false, "If checked, the ready check sound will be muted.")
LeaPlusLC:MakeCB(SoundPanel, "MuteSniffing", "Sniffing", 16, -212, false, "If checked, the worgen sniffing sounds will be muted.")
LeaPlusLC:MakeCB(SoundPanel, "MuteTrains", "Trains", 16, -232, false, "If checked, train sounds will be muted.")
LeaPlusLC:MakeTx(SoundPanel, "General", 150, -72)
LeaPlusLC:MakeCB(SoundPanel, "MuteVaults", "Vaults", 150, -92, false, "If checked, the mechanical guild vault idle sound will be muted.")
LeaPlusLC:MakeCB(SoundPanel, "MuteVigor", "Vigor", 150, -112, false, "If checked, the dragonriding vigor recharging sound will be muted.")
LeaPlusLC:MakeTx(SoundPanel, "Pets", 150, -152)
LeaPlusLC:MakeCB(SoundPanel, "MutePierre", "Pierre", 150, -172, false, "If checked, Pierre will be quieter.")
LeaPlusLC:MakeCB(SoundPanel, "MuteSunflower", "Sunflower", 150, -192, false, "If checked, the Singing Sunflower pet will be muted.")
LeaPlusLC:MakeTx(SoundPanel, "Toys", 284, -72)
LeaPlusLC:MakeCB(SoundPanel, "MuteAnima", "Anima", 284, -92, false, "If checked, the Experimental Anima Cell toy will be quieter.")
LeaPlusLC:MakeCB(SoundPanel, "MuteBalls", "Balls", 284, -112, false, "If checked, the Foot Ball sounds will be muted.")
LeaPlusLC:MakeCB(SoundPanel, "MuteHarp", "Harp", 284, -132, false, "If checked, the Fae Harp toy will be muted.")
LeaPlusLC:MakeTx(SoundPanel, "Combat", 284, -172)
LeaPlusLC:MakeCB(SoundPanel, "MuteArena", "Arena", 284, -192, false, "If checked, arena announcers will be muted.")
LeaPlusLC:MakeCB(SoundPanel, "MuteBattleShouts", "Shouts", 284, -212, false, "If checked, your character will not shout and wail during combat.")
LeaPlusLC:MakeTx(SoundPanel, "Misc", 418, -72)
LeaPlusLC:MakeCB(SoundPanel, "MuteDucks", "Ducks", 418, -92, false, "If checked, duck greetings will be muted.|n|nUse this if you like to do your Valdrakken banking in peace.")
-- Set click width for sounds checkboxes
for k, v in pairs(muteTable) do
LeaPlusCB[k].f:SetWidth(90)
if LeaPlusCB[k].f:GetStringWidth() > 90 then
LeaPlusCB[k]:SetHitRectInsets(0, -80, 0, 0)
else
LeaPlusCB[k]:SetHitRectInsets(0, -LeaPlusCB[k].f:GetStringWidth() + 4, 0, 0)
end
end
-- Function to mute and unmute sounds
local function SetupMute()
for k, v in pairs(muteTable) do
if LeaPlusLC["MuteGameSounds"] == "On" and LeaPlusLC[k] == "On" then
for i, e in pairs(v) do
local file, soundID = e:match("([^,]+)%#([^,]+)")
MuteSoundFile(soundID)
end
else
for i, e in pairs(v) do
local file, soundID = e:match("([^,]+)%#([^,]+)")
UnmuteSoundFile(soundID)
end
end
end
end
-- Setup mute on startup if option is enabled
if LeaPlusLC["MuteGameSounds"] == "On" then SetupMute() end
-- Setup mute when options are clicked
for k, v in pairs(muteTable) do
LeaPlusCB[k]:HookScript("OnClick", SetupMute)
end
LeaPlusCB["MuteGameSounds"]:HookScript("OnClick", SetupMute)
-- Help button hidden
SoundPanel.h:Hide()
-- Back button handler
SoundPanel.b:SetScript("OnClick", function()
SoundPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page7"]:Show()
return
end)
-- Reset button handler
SoundPanel.r:SetScript("OnClick", function()
-- Reset checkboxes
for k, v in pairs(muteTable) do
LeaPlusLC[k] = "Off"
end
SetupMute()
-- Refresh panel
SoundPanel:Hide(); SoundPanel:Show()
end)
-- Show panal when options panel button is clicked
LeaPlusCB["MuteGameSoundsBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
for k, v in pairs(muteTable) do
LeaPlusLC[k] = "On"
end
LeaPlusLC["MuteReady"] = "Off"
LeaPlusLC["MuteVigor"] = "Off"
SetupMute()
else
SoundPanel:Show()
LeaPlusLC:HideFrames()
end
end)
----------------------------------------------------------------------
-- Login setting
----------------------------------------------------------------------
-- Handle sounds that get muted or unmuted when logging out
local muteLogoutTable = Leatrix_Plus["muteLogoutTable"]
local logoutEvent = CreateFrame("FRAME")
logoutEvent:RegisterEvent("PLAYER_LOGOUT")
-- Mute or unmute sounds when logging out
logoutEvent:SetScript("OnEvent", function()
if LeaPlusLC["MuteGameSounds"] == "On" and LeaPlusLC["MuteLogin"] == "On" then
-- Mute logout table sounds on logout
for void, soundID in pairs(muteLogoutTable) do
MuteSoundFile(soundID)
end
else
-- Unmute logout table sounds on logout
for void, soundID in pairs(muteLogoutTable) do
UnmuteSoundFile(soundID)
end
end
end)
-- Unmute sounds when logging in
for void, soundID in pairs(muteLogoutTable) do
UnmuteSoundFile(soundID)
end
end
----------------------------------------------------------------------
-- Easy item destroy
----------------------------------------------------------------------
if LeaPlusLC["EasyItemDestroy"] == "On" then
-- Get the type "DELETE" into the field to confirm text
local TypeDeleteLine = gsub(DELETE_GOOD_ITEM, "[\r\n]", "@")
local void, TypeDeleteLine = strsplit("@", TypeDeleteLine, 2)
-- Add hyperlinks to regular item destroy
StaticPopupDialogs["DELETE_ITEM"].OnHyperlinkEnter = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkEnter
StaticPopupDialogs["DELETE_ITEM"].OnHyperlinkLeave = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkLeave
StaticPopupDialogs["DELETE_QUEST_ITEM"].OnHyperlinkEnter = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkEnter
StaticPopupDialogs["DELETE_QUEST_ITEM"].OnHyperlinkLeave = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkLeave
StaticPopupDialogs["DELETE_GOOD_QUEST_ITEM"].OnHyperlinkEnter = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkEnter
StaticPopupDialogs["DELETE_GOOD_QUEST_ITEM"].OnHyperlinkLeave = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkLeave
-- Hide editbox and set item link
local easyDelFrame = CreateFrame("FRAME")
easyDelFrame:RegisterEvent("DELETE_ITEM_CONFIRM")
easyDelFrame:SetScript("OnEvent", function()
if StaticPopup1EditBox:IsShown() then
-- Item requires player to type delete so hide editbox and show link
StaticPopup1EditBox:Hide()
StaticPopup1Button1:Enable()
local link = select(3, GetCursorInfo())
if link then
-- Custom link for battle pets
local linkType, linkOptions, name = LinkUtil.ExtractLink(link)
if linkType == "battlepet" then
local speciesID, level, breedQuality = strsplit(":", linkOptions)
local qualityColor = BAG_ITEM_QUALITY_COLORS[tonumber(breedQuality)]
link = qualityColor:WrapTextInColorCode(name .. " |n" .. L["Level"] .. " " .. level .. L["Battle Pet"])
end
StaticPopup1Text:SetText(gsub(StaticPopup1Text:GetText(), gsub(TypeDeleteLine, "@", ""), "") .. "|n" .. link)
end
else
-- Item does not require player to type delete so just show item link
StaticPopup1:SetHeight(StaticPopup1:GetHeight() + 40)
StaticPopup1EditBox:Hide()
StaticPopup1Button1:Enable()
local link = select(3, GetCursorInfo())
if link then
-- Custom link for battle pets
local linkType, linkOptions, name = LinkUtil.ExtractLink(link)
if linkType == "battlepet" then
local speciesID, level, breedQuality = strsplit(":", linkOptions)
local qualityColor = BAG_ITEM_QUALITY_COLORS[tonumber(breedQuality)]
link = qualityColor:WrapTextInColorCode(name .. " |n" .. L["Level"] .. " " .. level .. L["Battle Pet"])
end
StaticPopup1Text:SetText(gsub(StaticPopup1Text:GetText(), gsub(TypeDeleteLine, "@", ""), "") .. "|n|n" .. link)
end
end
end)
end
----------------------------------------------------------------------
-- Faster movie skip
----------------------------------------------------------------------
if LeaPlusLC["FasterMovieSkip"] == "On" then
-- Allow space bar, escape key and enter key to cancel cinematic without confirmation
CinematicFrame:HookScript("OnKeyDown", function(self, key)
if key == "ESCAPE" then
if CinematicFrame:IsShown() and CinematicFrame.closeDialog and CinematicFrameCloseDialogConfirmButton then
CinematicFrameCloseDialog:Hide()
end
end
end)
CinematicFrame:HookScript("OnKeyUp", function(self, key)
if key == "SPACE" or key == "ESCAPE" or key == "ENTER" then
if CinematicFrame:IsShown() and CinematicFrame.closeDialog and CinematicFrameCloseDialogConfirmButton then
CinematicFrameCloseDialogConfirmButton:Click()
end
end
end)
MovieFrame:HookScript("OnKeyUp", function(self, key)
if key == "SPACE" or key == "ESCAPE" or key == "ENTER" then
if MovieFrame:IsShown() and MovieFrame.CloseDialog and MovieFrame.CloseDialog.ConfirmButton then
MovieFrame.CloseDialog.ConfirmButton:Click()
end
end
end)
end
----------------------------------------------------------------------
-- Unclamp chat frame
----------------------------------------------------------------------
if LeaPlusLC["UnclampChat"] == "On" and not LeaLockList["UnclampChat"] then
-- Process normal and existing chat frames on startup
for i = 1, 50 do
if _G["ChatFrame" .. i] then
_G["ChatFrame" .. i]:SetClampedToScreen(false)
_G["ChatFrame" .. i]:SetClampRectInsets(0, 0, 0, 0)
end
end
-- Process new chat frames and combat log
hooksecurefunc("FloatingChatFrame_UpdateBackgroundAnchors", function(self)
self:SetClampRectInsets(0, 0, 0, 0)
end)
-- Process temporary chat frames
hooksecurefunc("FCF_OpenTemporaryWindow", function()
local cf = FCF_GetCurrentChatFrame():GetName() or nil
if cf then
_G[cf]:SetClampRectInsets(0, 0, 0, 0)
end
end)
end
----------------------------------------------------------------------
-- Wowhead Links
----------------------------------------------------------------------
if LeaPlusLC["ShowWowheadLinks"] == "On" then
-- Create configuration panel
local WowheadPanel = LeaPlusLC:CreatePanel("Show Wowhead links", "WowheadPanel")
LeaPlusLC:MakeTx(WowheadPanel, "Settings", 16, -72)
LeaPlusLC:MakeCB(WowheadPanel, "WowheadLinkComments", "Links go directly to the comments section", 16, -92, false, "If checked, Wowhead links will go directly to the comments section.")
-- Help button hidden
WowheadPanel.h:Hide()
-- Back button handler
WowheadPanel.b:SetScript("OnClick", function()
WowheadPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show()
return
end)
-- Reset button handler
WowheadPanel.r:SetScript("OnClick", function()
-- Reset controls
LeaPlusLC["WowheadLinkComments"] = "Off"
-- Refresh configuration panel
WowheadPanel:Hide(); WowheadPanel:Show()
end)
-- Show configuration panal when options panel button is clicked
LeaPlusCB["ShowWowheadLinksBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["WowheadLinkComments"] = "Off"
else
WowheadPanel:Show()
LeaPlusLC:HideFrames()
end
end)
-- Get localised Wowhead URL
local wowheadLoc
if GameLocale == "deDE" then wowheadLoc = "de.wowhead.com"
elseif GameLocale == "esMX" then wowheadLoc = "es.wowhead.com"
elseif GameLocale == "esES" then wowheadLoc = "es.wowhead.com"
elseif GameLocale == "frFR" then wowheadLoc = "fr.wowhead.com"
elseif GameLocale == "itIT" then wowheadLoc = "it.wowhead.com"
elseif GameLocale == "ptBR" then wowheadLoc = "pt.wowhead.com"
elseif GameLocale == "ruRU" then wowheadLoc = "ru.wowhead.com"
elseif GameLocale == "koKR" then wowheadLoc = "ko.wowhead.com"
elseif GameLocale == "zhCN" then wowheadLoc = "cn.wowhead.com"
elseif GameLocale == "zhTW" then wowheadLoc = "cn.wowhead.com"
else wowheadLoc = "wowhead.com"
end
----------------------------------------------------------------------
-- Achievements frame
----------------------------------------------------------------------
-- Achievement link function
local function DoWowheadAchievementFunc()
-- Create editbox
local aEB = CreateFrame("EditBox", nil, AchievementFrame)
aEB:ClearAllPoints()
aEB:SetPoint("BOTTOMRIGHT", -50, 1)
aEB:SetHeight(16)
aEB:SetFontObject("GameFontNormalSmall")
aEB:SetBlinkSpeed(0)
aEB:SetJustifyH("RIGHT")
aEB:SetAutoFocus(false)
aEB:EnableKeyboard(false)
aEB:SetHitRectInsets(90, 0, 0, 0)
aEB:SetScript("OnKeyDown", function() end)
aEB:SetScript("OnMouseUp", function()
if aEB:IsMouseOver() then
aEB:HighlightText()
else
aEB:HighlightText(0, 0)
end
end)
-- Create hidden font string (used for setting width of editbox)
aEB.z = aEB:CreateFontString(nil, 'ARTWORK', 'GameFontNormalSmall')
aEB.z:Hide()
-- Store last link in case editbox is cleared
local lastAchievementLink
-- Function to set editbox value
local function SetAchievementFunc(self, achievementID)
if achievementID then
-- Set editbox text
if LeaPlusLC["WowheadLinkComments"] == "On" then
aEB:SetText("https://" .. wowheadLoc .. "/achievement=" .. achievementID .. "#comments")
else
aEB:SetText("https://" .. wowheadLoc .. "/achievement=" .. achievementID)
end
lastAchievementLink = aEB:GetText()
-- Set hidden fontstring then resize editbox to match
aEB.z:SetText(aEB:GetText())
aEB:SetWidth(aEB.z:GetStringWidth() + 90)
-- Get achievement title for tooltip
local achievementLink = GetAchievementLink(achievementID)
if achievementLink then
aEB.tiptext = achievementLink:match("%[(.-)%]") .. "|n" .. L["Press CTRL/C to copy."]
end
-- Show the editbox
aEB:Show()
end
end
hooksecurefunc(AchievementTemplateMixin, "DisplayObjectives", SetAchievementFunc)
hooksecurefunc("AchievementFrameComparisonTab_OnClick", function(self) aEB:Hide() end)
-- Create tooltip
aEB:HookScript("OnEnter", function()
aEB:HighlightText()
aEB:SetFocus()
GameTooltip:SetOwner(aEB, "ANCHOR_TOP", 0, 10)
GameTooltip:SetText(aEB.tiptext, nil, nil, nil, nil, true)
GameTooltip:Show()
end)
aEB:HookScript("OnLeave", function()
-- Set link text again if it's changed since it was set
if aEB:GetText() ~= lastAchievementLink then aEB:SetText(lastAchievementLink) end
aEB:HighlightText(0, 0)
aEB:ClearFocus()
GameTooltip:Hide()
end)
end
-- Run function when achievement UI is loaded
if IsAddOnLoaded("Blizzard_AchievementUI") then
DoWowheadAchievementFunc()
else
local waitAchievementsFrame = CreateFrame("FRAME")
waitAchievementsFrame:RegisterEvent("ADDON_LOADED")
waitAchievementsFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_AchievementUI" then
DoWowheadAchievementFunc()
waitAchievementsFrame:UnregisterAllEvents()
end
end)
end
----------------------------------------------------------------------
-- World map frame
----------------------------------------------------------------------
-- Hide the title text
WorldMapFrameTitleText:Hide()
-- Create editbox
local mEB = CreateFrame("EditBox", nil, WorldMapFrame.BorderFrame)
mEB:SetFrameLevel(501)
mEB:ClearAllPoints()
mEB:SetPoint("TOPLEFT", 100, -4)
mEB:SetHeight(16)
mEB:SetFontObject("GameFontNormal")
mEB:SetBlinkSpeed(0)
mEB:SetAutoFocus(false)
mEB:EnableKeyboard(false)
mEB:SetHitRectInsets(0, 90, 0, 0)
mEB:SetScript("OnKeyDown", function() end)
mEB:SetScript("OnMouseUp", function()
if mEB:IsMouseOver() then
mEB:HighlightText()
else
mEB:HighlightText(0, 0)
end
end)
-- Create hidden font string (used for setting width of editbox)
mEB.z = mEB:CreateFontString(nil, 'ARTWORK', 'GameFontNormal')
mEB.z:Hide()
-- Function to set editbox value
local function SetQuestInBox()
local questID
if QuestMapFrame.DetailsFrame:IsShown() then
-- Get quest ID from currently showing quest in details panel
questID = QuestMapFrame_GetDetailQuestID()
else
-- Get quest ID from currently selected quest on world map
questID = C_SuperTrack.GetSuperTrackedQuestID()
end
if questID then
-- Hide editbox if quest ID is invalid
if questID == 0 then mEB:Hide() else mEB:Show() end
-- Set editbox text
if LeaPlusLC["WowheadLinkComments"] == "On" then
mEB:SetText("https://" .. wowheadLoc .. "/quest=" .. questID .. "#comments")
else
mEB:SetText("https://" .. wowheadLoc .. "/quest=" .. questID)
end
-- Set hidden fontstring then resize editbox to match
mEB.z:SetText(mEB:GetText())
mEB:SetWidth(mEB.z:GetStringWidth() + 90)
-- Get quest title for tooltip
local questLink = GetQuestLink(questID) or nil
if questLink then
mEB.tiptext = questLink:match("%[(.-)%]") .. "|n" .. L["Press CTRL/C to copy."]
else
mEB.tiptext = ""
if mEB:IsMouseOver() and GameTooltip:IsShown() then GameTooltip:Hide() end
end
end
end
-- Set URL when super tracked quest changes and on startup
mEB:RegisterEvent("SUPER_TRACKING_CHANGED")
mEB:SetScript("OnEvent", SetQuestInBox)
SetQuestInBox()
-- Set URL when quest details frame is shown or hidden
hooksecurefunc("QuestMapFrame_ShowQuestDetails", SetQuestInBox)
hooksecurefunc("QuestMapFrame_CloseQuestDetails", SetQuestInBox)
-- Create tooltip
mEB:HookScript("OnEnter", function()
mEB:HighlightText()
mEB:SetFocus()
GameTooltip:SetOwner(mEB, "ANCHOR_BOTTOM", 0, -10)
GameTooltip:SetText(mEB.tiptext, nil, nil, nil, nil, true)
GameTooltip:Show()
end)
mEB:HookScript("OnLeave", function()
mEB:HighlightText(0, 0)
mEB:ClearFocus()
GameTooltip:Hide()
SetQuestInBox()
end)
-- Function to move Wowhead link frame if Leatrix Maps is installed with Remove map border enabled
local function MoveWowheadLinks()
if LeaMapsDB and LeaMapsDB["NoMapBorder"] and LeaMapsDB["NoMapBorder"] == "On" then
mEB:SetParent(WorldMapFrame)
mEB:ClearAllPoints()
mEB:SetPoint("TOPLEFT", WorldMapFrame, "TOPLEFT", 4, -64)
mEB:SetFontObject("GameFontNormalSmall")
mEB:SetFrameStrata("HIGH")
mEB:SetAlpha(0.5)
end
end
-- Run function when Leatrix Maps is loaded
if IsAddOnLoaded("Leatrix_Maps") then
MoveWowheadLinks()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Leatrix_Maps" then
MoveWowheadLinks()
waitFrame:UnregisterAllEvents()
end
end)
end
end
----------------------------------------------------------------------
-- Enhance dressup
----------------------------------------------------------------------
if LeaPlusLC["EnhanceDressup"] == "On" then
-- Create configuration panel
local DressupPanel = LeaPlusLC:CreatePanel("Enhance dressup", "DressupPanel")
LeaPlusLC:MakeTx(DressupPanel, "Dressing room", 16, -72)
LeaPlusLC:MakeCB(DressupPanel, "DressupItemButtons", "Show item buttons", 16, -92, false, "If checked, item buttons will be shown in the dressing room. You can click the item buttons to remove individual items from the model.")
LeaPlusLC:MakeCB(DressupPanel, "DressupAnimControl", "Show animation slider", 16, -112, false, "If checked, an animation slider will be shown in the dressing room.")
LeaPlusLC:MakeTx(DressupPanel, "Transmogrify character preview", 16, -152)
LeaPlusLC:MakeCB(DressupPanel, "DressupWiderPreview", "Wider character preview", 16, -172, true, "If checked, the transmogrify character preview will be wider.")
LeaPlusLC:MakeCB(DressupPanel, "DressupMoreZoomOut", "Increase zoom out distance", 16, -192, true, "If checked, you will be able to zoom out further with the transmogrify character preview.")
LeaPlusLC:MakeCB(DressupPanel, "DressupTransmogAnim", "Show animation slider", 16, -212, false, "If checked, an animation slider will be shown in the transmogrify character preview.")
LeaPlusLC:MakeTx(DressupPanel, "Zoom speed", 356, -72)
LeaPlusLC:MakeSL(DressupPanel, "DressupFasterZoom", "Drag to set the character model zoom speed.", 1, 10, 1, 356, -92, "%.0f")
-- Refresh zoom speed slider when changed
LeaPlusCB["DressupFasterZoom"]:HookScript("OnValueChanged", function()
LeaPlusCB["DressupFasterZoom"].f:SetFormattedText("%.0f%%", LeaPlusLC["DressupFasterZoom"] * 100)
end)
-- Set zoom speed when dressup model is zoomed (wardrobe is set in wardrobe section further down)
DressUpFrame.ModelScene:SetScript("OnMouseWheel", function(self, delta)
for i = 1, LeaPlusLC["DressupFasterZoom"] do
if DressUpFrame.ModelScene.activeCamera then
DressUpFrame.ModelScene.activeCamera:OnMouseWheel(delta)
end
end
end)
-- Set zoom speed when character frame model is zoomed
CharacterModelScene:SetScript("OnMouseWheel", function(self, delta)
for i = 1, LeaPlusLC["DressupFasterZoom"] do
if CharacterModelScene.activeCamera then
CharacterModelScene.activeCamera:OnMouseWheel(delta)
end
end
end)
-- Help button hidden
DressupPanel.h:Hide()
-- Back button handler
DressupPanel.b:SetScript("OnClick", function()
DressupPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show()
return
end)
-- Reset button handler
DressupPanel.r.tiptext = DressupPanel.r.tiptext .. "|n|n" .. L["Note that this will not reset settings that require a UI reload."]
DressupPanel.r:SetScript("OnClick", function()
-- Reset controls
LeaPlusLC["DressupFasterZoom"] = 3
-- Refresh configuration panel
DressupPanel:Hide(); DressupPanel:Show()
end)
-- Show configuration panal when options panel button is clicked
LeaPlusCB["EnhanceDressupBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["DressupFasterZoom"] = 3
else
DressupPanel:Show()
LeaPlusLC:HideFrames()
end
end)
----------------------------------------------------------------------
-- Item buttons
----------------------------------------------------------------------
do
local buttons = {}
local slotTable = {"HeadSlot", "ShoulderSlot", "BackSlot", "ChestSlot", "ShirtSlot", "TabardSlot", "WristSlot", "HandsSlot", "WaistSlot", "LegsSlot", "FeetSlot", "MainHandSlot", "SecondaryHandSlot"}
local function MakeSlotButton(slot, anchor, x, y)
-- Create slot button
local slotBtn = CreateFrame("Button", nil, DressUpFrame)
slotBtn:SetFrameStrata("HIGH")
slotBtn:SetSize(35, 35)
slotBtn.slot = slot
slotBtn:ClearAllPoints()
slotBtn:SetPoint(anchor, x, y)
slotBtn:RegisterForClicks("LeftButtonUp")
slotBtn:SetMotionScriptsWhileDisabled(true)
-- Ensure slot buttons only show with reset button
slotBtn:SetParent(DressUpFrameResetButton)
-- Slot button tooltip
slotBtn:SetScript("OnClick", function(self, btn)
if btn == "LeftButton" then
local playerActor = DressUpFrame.ModelScene:GetPlayerActor()
local slotID = GetInventorySlotInfo(self.slot)
playerActor:UndressSlot(slotID)
playerActor:SetSheathed(true)
end
end)
slotBtn:SetScript("OnEnter", function(self)
GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
if self.item then
GameTooltip:SetHyperlink(self.item)
else
if self.slot then
GameTooltip:SetText(_G[string.upper(self.slot)])
end
end
end)
slotBtn:SetScript("OnLeave", GameTooltip_Hide)
-- Slot button textures
slotBtn.t = slotBtn:CreateTexture(nil, "BACKGROUND")
slotBtn.t:SetSize(35, 35)
slotBtn.t:SetPoint("CENTER")
slotBtn.h = slotBtn:CreateTexture()
slotBtn.h:SetSize(35, 35)
slotBtn.h:SetPoint("CENTER")
slotBtn.h:SetAtlas("bags-glow-white")
slotBtn.h:SetBlendMode("ADD")
slotBtn:SetHighlightTexture(slotBtn.h)
-- Add slot button to table
tinsert(buttons, slotBtn)
end
-- Show left column slot buttons
for i = 1, 7 do
MakeSlotButton(slotTable[i], "TOPLEFT", 10, -70 + -40 * (i - 1))
end
-- Show right column slot buttons
for i = 8, 13 do
MakeSlotButton(slotTable[i], "TOPRIGHT", -12, -70 + -40 * (i - 8))
end
-- Updates slots
hooksecurefunc(DressUpFrameOutfitDropDown, "UpdateSaveButton", function()
local playerActor = DressUpFrame.ModelScene:GetPlayerActor()
if playerActor then
for slot, slotButtons in pairs(buttons) do
if slotTable[slot] and GetInventorySlotInfo(slotTable[slot]) then
local slotID, slotTexture = GetInventorySlotInfo(slotTable[slot])
local itemTransmogInfo = playerActor:GetItemTransmogInfo(slotID)
if itemTransmogInfo == nil then
buttons[slot].item = nil
buttons[slot].text = nil
buttons[slot].t:SetTexture(slotTexture)
else
local void, void, void, icon, void, link = C_TransmogCollection.GetAppearanceSourceInfo(itemTransmogInfo.appearanceID)
buttons[slot].item = link
buttons[slot].text = UNKNOWN
if C_TransmogCollection.IsAppearanceHiddenVisual(itemTransmogInfo.appearanceID) then
-- Hidden item
buttons[slot].t:SetAtlas("transmog-icon-hidden")
else
-- Visible item
buttons[slot].t:SetTexture(icon or "Interface\\Icons\\INV_Misc_QuestionMark")
end
end
end
end
end
end)
-- Function to set item buttons
local function ToggleItemButtons()
if LeaPlusLC["DressupItemButtons"] == "On" then
for i = 1, #buttons do buttons[i]:Show() end
else
for i = 1, #buttons do buttons[i]:Hide() end
end
end
-- Assign file level scope to function (it's used in bottom row buttons)
LeaPlusLC.ToggleItemButtons = ToggleItemButtons
-- Set item buttons for option click, startup, reset click and preset click
LeaPlusCB["DressupItemButtons"]:HookScript("OnClick", ToggleItemButtons)
ToggleItemButtons()
DressupPanel.r:HookScript("OnClick", function()
LeaPlusLC["DressupItemButtons"] = "On"
ToggleItemButtons()
DressupPanel:Hide(); DressupPanel:Show()
end)
LeaPlusCB["EnhanceDressupBtn"]:HookScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
LeaPlusLC["DressupItemButtons"] = "On"
ToggleItemButtons()
end
end)
end
----------------------------------------------------------------------
-- Animation slider (must be before bottom row buttons)
----------------------------------------------------------------------
local animTable = {0, 4, 5, 143, 119, 26, 25, 27, 28, 108, 120, 51, 124, 52, 125, 126, 62, 63, 41, 42, 43, 44, 132, 38, 14, 115, 193, 48, 110, 109, 134, 197, 0}
local lastSetting
LeaPlusLC["DressupAnim"] = 0 -- Defined here since the setting is not saved
LeaPlusLC:MakeSL(DressUpFrame, "DressupAnim", "", 1, #animTable - 1, 1, 356, -92, "%.0f")
LeaPlusCB["DressupAnim"]:ClearAllPoints()
LeaPlusCB["DressupAnim"]:SetPoint("BOTTOM", 0, 32)
LeaPlusCB["DressupAnim"]:SetParent(DressUpFrameResetButton) -- So it only shows with reset button
LeaPlusCB["DressupAnim"]:SetWidth(240)
LeaPlusCB["DressupAnim"]:SetFrameLevel(5)
LeaPlusCB["DressupAnim"]:HookScript("OnValueChanged", function(self, setting)
local playerActor = DressUpFrame.ModelScene:GetPlayerActor()
setting = math.floor(setting + 0.5)
if playerActor and setting ~= lastSetting then
lastSetting = setting
playerActor:SetAnimation(animTable[setting], 0, 1, 1)
-- print(animTable[setting]) -- Debug
end
end)
-- Function to show animation control
local function SetAnimationSlider()
if LeaPlusLC["DressupAnimControl"] == "On" then
LeaPlusCB["DressupAnim"]:Show()
else
LeaPlusCB["DressupAnim"]:Hide()
end
LeaPlusCB["DressupAnim"]:SetValue(1)
end
-- Set animation control with option, startup, preset and reset
LeaPlusCB["DressupAnimControl"]:HookScript("OnClick", SetAnimationSlider)
SetAnimationSlider()
LeaPlusCB["EnhanceDressupBtn"]:HookScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
LeaPlusLC["DressupAnimControl"] = "On"
SetAnimationSlider()
end
end)
DressupPanel.r:HookScript("OnClick", function()
LeaPlusLC["DressupAnimControl"] = "On"
SetAnimationSlider()
DressupPanel:Hide(); DressupPanel:Show()
end)
-- Reset animation when dressup frame is shown and model is reset
hooksecurefunc(DressUpFrame, "Show", SetAnimationSlider)
DressUpFrameResetButton:HookScript("OnClick", SetAnimationSlider)
-- Skin slider for ElvUI
if LeaPlusLC.ElvUI then
_G.LeaPlusGlobalDressupAnim = LeaPlusCB["DressupAnim"]
LeaPlusLC.ElvUI:GetModule("Skins"):HandleSliderFrame(_G.LeaPlusGlobalDressupAnim, false)
end
----------------------------------------------------------------------
-- Bottom row buttons
----------------------------------------------------------------------
-- Function to modify a button
local function SetButton(where, text, tip)
where:SetText(L[text])
where:SetWidth(where:GetFontString():GetStringWidth() + 20)
where:HookScript("OnEnter", function()
GameTooltip:SetOwner(where, "ANCHOR_NONE")
GameTooltip:SetPoint("BOTTOM", where, "TOP", 0, 10)
GameTooltip:SetText(L[tip], nil, nil, nil, nil, true)
end)
where:HookScript("OnLeave", GameTooltip_Hide)
end
SetButton(DressUpFrameCancelButton, "C", "Close")
SetButton(DressUpFrameResetButton, "R", "Reset")
-- Remove all items button (parented to reset button so they show with reset button)
LeaPlusLC:CreateButton("DressUpNudeBtn", DressUpFrameResetButton, "N", "BOTTOMLEFT", 106, 79, 80, 22, false, "")
LeaPlusCB["DressUpNudeBtn"]:ClearAllPoints()
LeaPlusCB["DressUpNudeBtn"]:SetPoint("RIGHT", DressUpFrameResetButton, "LEFT", 0, 0)
SetButton(LeaPlusCB["DressUpNudeBtn"], "N", "Remove all items")
LeaPlusCB["DressUpNudeBtn"]:SetScript("OnClick", function()
local playerActor = DressUpFrame.ModelScene:GetPlayerActor()
playerActor:Undress()
end)
-- Show me button
LeaPlusLC:CreateButton("DressUpShowMeBtn", DressUpFrameResetButton, "M", "BOTTOMLEFT", 26, 79, 80, 22, false, "")
LeaPlusCB["DressUpShowMeBtn"]:ClearAllPoints()
LeaPlusCB["DressUpShowMeBtn"]:SetPoint("RIGHT", LeaPlusCB["DressUpNudeBtn"], "LEFT", 0, 0)
SetButton(LeaPlusCB["DressUpShowMeBtn"], "M", "Show me")
LeaPlusCB["DressUpShowMeBtn"]:SetScript("OnClick", function()
local playerActor = DressUpFrame.ModelScene:GetPlayerActor()
playerActor:SetModelByUnit("player", true, true)
C_Timer.After(0.1, function()
playerActor:SetModelByUnit("player", true, true)
-- Set animation
playerActor:SetAnimation(0)
C_Timer.After(0.1,function()
playerActor:SetAnimation(animTable[math.floor(LeaPlusCB["DressupAnim"]:GetValue() + 0.5)], 0, 1, 1)
end)
end)
end)
-- Show my outfit on target button
LeaPlusLC:CreateButton("DressUpOutfitOnTargetBtn", DressUpFrameResetButton, "O", "BOTTOMLEFT", 26, 79, 80, 22, false, "")
LeaPlusCB["DressUpOutfitOnTargetBtn"]:ClearAllPoints()
LeaPlusCB["DressUpOutfitOnTargetBtn"]:SetPoint("RIGHT", LeaPlusCB["DressUpShowMeBtn"], "LEFT", 0, 0)
SetButton(LeaPlusCB["DressUpOutfitOnTargetBtn"], "O", "Show my outfit on target")
LeaPlusCB["DressUpOutfitOnTargetBtn"]:SetScript("OnClick", function()
if UnitIsPlayer("target") then
local playerActor = DressUpFrame.ModelScene:GetPlayerActor()
playerActor:SetModelByUnit("player", true, true)
local modelTransmogList = playerActor:GetItemTransmogInfoList()
playerActor:SetModelByUnit("target", true, true)
C_Timer.After(0.01, function()
playerActor:SetModelByUnit("target", true, true)
playerActor:Undress()
DressUpItemTransmogInfoList(modelTransmogList)
-- Set animation
playerActor:SetAnimation(0)
C_Timer.After(0.1,function()
playerActor:SetAnimation(animTable[math.floor(LeaPlusCB["DressupAnim"]:GetValue() + 0.5)], 0, 1, 1)
end)
end)
end
end)
-- Show target outfit on me button
LeaPlusLC:CreateButton("DressUpTargetSelfBtn", DressUpFrameResetButton, "B", "BOTTOMLEFT", 26, 79, 80, 22, false, "")
LeaPlusCB["DressUpTargetSelfBtn"]:ClearAllPoints()
LeaPlusCB["DressUpTargetSelfBtn"]:SetPoint("RIGHT", LeaPlusCB["DressUpOutfitOnTargetBtn"], "LEFT", 0, 0)
SetButton(LeaPlusCB["DressUpTargetSelfBtn"], "S", "Show target outfit on me")
LeaPlusCB["DressUpTargetSelfBtn"]:SetScript("OnClick", function()
if UnitIsPlayer("target") then
local playerActor = DressUpFrame.ModelScene:GetPlayerActor()
playerActor:SetModelByUnit("target", true, true)
C_Timer.After(0.01, function()
local modelTransmogList = playerActor:GetItemTransmogInfoList()
playerActor:SetModelByUnit("player", true, true)
SetupPlayerForModelScene(DressUpFrame.ModelScene, modelTransmogList, true, true)
playerActor:Undress()
DressUpItemTransmogInfoList(modelTransmogList)
-- Set animation
playerActor:SetAnimation(0)
C_Timer.After(0.1,function()
playerActor:SetAnimation(animTable[math.floor(LeaPlusCB["DressupAnim"]:GetValue() + 0.5)], 0, 1, 1)
end)
end)
end
end)
-- Show target model button
LeaPlusLC:CreateButton("DressUpTargetBtn", DressUpFrameResetButton, "T", "BOTTOMLEFT", 26, 79, 80, 22, false, "")
LeaPlusCB["DressUpTargetBtn"]:ClearAllPoints()
LeaPlusCB["DressUpTargetBtn"]:SetPoint("RIGHT", LeaPlusCB["DressUpTargetSelfBtn"], "LEFT", 0, 0)
SetButton(LeaPlusCB["DressUpTargetBtn"], "T", "Show target model")
LeaPlusCB["DressUpTargetBtn"]:SetScript("OnClick", function()
if UnitIsPlayer("target") then
local playerActor = DressUpFrame.ModelScene:GetPlayerActor()
playerActor:SetModelByUnit("target", true, true)
C_Timer.After(0.1, function()
playerActor:SetModelByUnit("target", true, true)
-- Set animation
playerActor:SetAnimation(0)
C_Timer.After(0.1,function()
playerActor:SetAnimation(animTable[math.floor(LeaPlusCB["DressupAnim"]:GetValue() + 0.5)], 0, 1, 1)
end)
end)
end
end)
-- Hide link button
DressUpFrame.LinkButton:HookScript("OnShow", DressUpFrame.LinkButton.Hide)
-- Create editbox for link to slash command
local pFrame = CreateFrame("Frame", nil, DressUpFrame)
pFrame:ClearAllPoints()
pFrame:SetPoint("CENTER", DressUpFrame, "CENTER", 0, -10)
pFrame:SetSize(230,300)
pFrame:Hide()
pFrame:SetFrameLevel(5000)
pFrame:SetScript("OnMouseDown", function(self, btn)
if btn == "RightButton" then
pFrame:Hide()
end
end)
-- Add text
LeaPlusLC:MakeTx(pFrame, "Share outfit online", 16, -72)
pFrame.txt = LeaPlusLC:MakeWD(pFrame, "Press CTRL/C to copy this command to the clipboard for sharing your outfit online.", 16, -136)
pFrame.txt:SetWordWrap(true)
pFrame.txt:SetWidth(200)
pFrame.btn = LeaPlusLC:CreateButton("ShareOutfitDone", pFrame, "Okay", "TOPLEFT", 16, -212, 0, 25, true, "")
pFrame.btn:ClearAllPoints()
pFrame.btn:SetPoint("BOTTOMRIGHT", pFrame, "BOTTOMRIGHT", -10, 10)
pFrame.btn:SetScript("OnClick", function()
pFrame:Hide()
end)
-- Hide frame when outfit changes
hooksecurefunc(DressUpFrameOutfitDropDown, "UpdateSaveButton", function() pFrame:Hide() end)
-- Add background color
pFrame.t = pFrame:CreateTexture(nil, "BACKGROUND")
pFrame.t:SetAllPoints()
pFrame.t:SetColorTexture(0.05, 0.05, 0.05, 0.8)
-- Create editbox
local petEB = CreateFrame("EditBox", nil, pFrame)
petEB:SetPoint("TOPLEFT", 15, -100)
petEB:SetSize(200, 16)
petEB:SetTextInsets(2, 2, 2, 2)
petEB:SetFontObject("GameFontNormal")
petEB:SetTextColor(1.0, 1.0, 1.0, 1)
petEB:SetBlinkSpeed(0)
petEB:SetAltArrowKeyMode(true)
-- Create tooltip
petEB.tiptext = L["Press CTRL/C to copy."]
petEB:HookScript("OnEnter", function()
GameTooltip:SetOwner(petEB, "ANCHOR_TOP", 0, 10)
GameTooltip:SetText(petEB.tiptext, nil, nil, nil, nil, true)
end)
petEB:HookScript("OnLeave", GameTooltip_Hide)
-- Prevent changes
petEB:SetScript("OnEscapePressed", function() pFrame:Hide() end)
petEB:SetScript("OnEnterPressed", petEB.HighlightText)
petEB:SetScript("OnMouseDown", function(self, btn)
petEB:ClearFocus()
if btn == "RightButton" then
pFrame:Hide()
end
end)
petEB:SetScript("OnMouseUp", petEB.HighlightText)
-- Link to chat
LeaPlusLC:CreateButton("DressUpLinkChatBtn", DressUpFrameResetButton, "L", "BOTTOMLEFT", 26, 79, 80, 22, false, "")
LeaPlusCB["DressUpLinkChatBtn"]:ClearAllPoints()
LeaPlusCB["DressUpLinkChatBtn"]:SetPoint("BOTTOMLEFT", DressUpFrame, "BOTTOMLEFT", 2, 4)
SetButton(LeaPlusCB["DressUpLinkChatBtn"], "L", "Link outfit in chat")
LeaPlusCB["DressUpLinkChatBtn"]:SetScript("OnClick", function()
local playerActor = DressUpFrame.ModelScene:GetPlayerActor()
local itemTransmogInfoList = playerActor and playerActor:GetItemTransmogInfoList()
local hyperlink = C_TransmogCollection.GetOutfitHyperlinkFromItemTransmogInfoList(itemTransmogInfoList)
if not ChatEdit_InsertLink(hyperlink) then
ChatFrame_OpenChat(hyperlink)
end
end)
-- Share outfit online
LeaPlusLC:CreateButton("DressUpLinkSlashBtn", DressUpFrameResetButton, "W", "BOTTOMLEFT", 26, 79, 80, 22, false, "")
LeaPlusCB["DressUpLinkSlashBtn"]:ClearAllPoints()
LeaPlusCB["DressUpLinkSlashBtn"]:SetPoint("LEFT", LeaPlusCB["DressUpLinkChatBtn"], "RIGHT", 0, 0)
SetButton(LeaPlusCB["DressUpLinkSlashBtn"], "W", "Share outfit online")
LeaPlusCB["DressUpLinkSlashBtn"]:SetScript("OnClick", function()
local playerActor = DressUpFrame.ModelScene:GetPlayerActor()
local itemTransmogInfoList = playerActor and playerActor:GetItemTransmogInfoList()
local slashCommand = TransmogUtil.CreateOutfitSlashCommand(itemTransmogInfoList)
-- Function to refresh editbox text
local function RefreshEditBoxText()
petEB:SetText(slashCommand)
petEB:HighlightText()
petEB:SetFocus()
petEB:SetCursorPosition(0)
end
-- Prevent changes to editbox value
petEB:SetScript("OnChar", RefreshEditBoxText)
petEB:SetScript("OnKeyUp", RefreshEditBoxText)
RefreshEditBoxText()
if pFrame:IsShown() then pFrame:Hide() else pFrame:Show() end
end)
-- Toggle buttons
LeaPlusLC:CreateButton("DressUpButonsBtn", DressUpFrameResetButton, "B", "BOTTOMLEFT", 26, 79, 80, 22, false, "")
LeaPlusCB["DressUpButonsBtn"]:ClearAllPoints()
LeaPlusCB["DressUpButonsBtn"]:SetPoint("LEFT", LeaPlusCB["DressUpLinkSlashBtn"], "RIGHT", 0, 0)
SetButton(LeaPlusCB["DressUpButonsBtn"], "B", "Toggle buttons")
LeaPlusCB["DressUpButonsBtn"]:SetScript("OnClick", function()
if LeaPlusLC["DressupItemButtons"] == "On" then LeaPlusLC["DressupItemButtons"] = "Off" else LeaPlusLC["DressupItemButtons"] = "On" end
LeaPlusLC:ToggleItemButtons()
if DressupPanel:IsShown() then DressupPanel:Hide(); DressupPanel:Show() end
end)
-- Change player actor to player when reset button is clicked (needed because target button changes it)
DressUpFrameResetButton:HookScript("OnClick", function()
local playerActor = DressUpFrame.ModelScene:GetPlayerActor()
playerActor:SetModelByUnit("player", true, true)
end)
-- Skin buttons for ElvUI
if LeaPlusLC.ElvUI then
_G.LeaPlusGlobalDressUpButtonsButton = LeaPlusCB["DressUpButonsBtn"]
LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpButtonsButton)
_G.LeaPlusGlobalDressUpShowMeButton = LeaPlusCB["DressUpShowMeBtn"]
LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpShowMeButton)
_G.LeaPlusGlobalDressUpTargetButton = LeaPlusCB["DressUpTargetBtn"]
LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpTargetButton)
_G.LeaPlusGlobalDressUpNudeButton = LeaPlusCB["DressUpNudeBtn"]
LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpNudeButton)
_G.LeaPlusGlobalDressUpTargetSelfBtn = LeaPlusCB["DressUpTargetSelfBtn"]
LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpTargetSelfBtn)
_G.LeaPlusGlobalDressUpOutfitOnTargetBtn = LeaPlusCB["DressUpOutfitOnTargetBtn"]
LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpOutfitOnTargetBtn)
_G.LeaPlusGlobalDressUpLinkChatBtn = LeaPlusCB["DressUpLinkChatBtn"]
LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpLinkChatBtn)
_G.LeaPlusGlobalDressUpLinkSlashBtn = LeaPlusCB["DressUpLinkSlashBtn"]
LeaPlusLC.ElvUI:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalDressUpLinkSlashBtn)
end
----------------------------------------------------------------------
-- Controls
----------------------------------------------------------------------
-- Hide controls for character frame
CharacterModelScene.ControlFrame:HookScript("OnShow", function()
CharacterModelScene.ControlFrame:Hide()
end)
-- Hide controls for dressing room
DressUpFrame.ModelScene.ControlFrame:HookScript("OnShow", DressUpFrame.ModelScene.ControlFrame.Hide)
----------------------------------------------------------------------
-- Wardrobe and inspect system
----------------------------------------------------------------------
-- Wardrobe (used by transmogrifier NPC)
local function DoBlizzardCollectionsFunc()
-- Hide positioning controls
WardrobeTransmogFrame.ModelScene.ControlFrame:HookScript("OnShow", WardrobeTransmogFrame.ModelScene.ControlFrame.Hide)
-- Set zoom speed
WardrobeTransmogFrame.ModelScene:SetScript("OnMouseWheel", function(self, delta)
for i = 1, LeaPlusLC["DressupFasterZoom"] do
if WardrobeTransmogFrame.ModelScene.activeCamera then
WardrobeTransmogFrame.ModelScene.activeCamera:OnMouseWheel(delta)
end
end
end)
-- Wider transmogrifier character preview
if LeaPlusLC["DressupWiderPreview"] == "On" then
local width = 1200 -- Default is 965
WardrobeFrame:SetWidth(width)
WardrobeTransmogFrame:SetWidth(width - 665)
WardrobeTransmogFrame.Inset.BG:SetWidth(width - 671)
WardrobeTransmogFrame.ModelScene:SetWidth(width - 671)
-- Left slots column
WardrobeTransmogFrame.HeadButton:ClearAllPoints()
WardrobeTransmogFrame.HeadButton:SetPoint("TOPLEFT", 15, -40)
-- Right slots column
WardrobeTransmogFrame.HandsButton:ClearAllPoints()
WardrobeTransmogFrame.HandsButton:SetPoint("TOPRIGHT", -15, -60)
-- Weapons
WardrobeTransmogFrame.SecondaryHandButton:ClearAllPoints()
WardrobeTransmogFrame.SecondaryHandButton:SetPoint("TOP", WardrobeTransmogFrame.FeetButton, "BOTTOM", 0, -96)
WardrobeTransmogFrame.SecondaryHandEnchantButton:ClearAllPoints()
WardrobeTransmogFrame.SecondaryHandEnchantButton:SetPoint("BOTTOM", WardrobeTransmogFrame.SecondaryHandButton, "BOTTOM", 0, -15)
WardrobeTransmogFrame.MainHandButton:ClearAllPoints()
WardrobeTransmogFrame.MainHandButton:SetPoint("BOTTOM", WardrobeTransmogFrame.SecondaryHandButton, "TOP", 0, 30)
WardrobeTransmogFrame.MainHandEnchantButton:ClearAllPoints()
WardrobeTransmogFrame.MainHandEnchantButton:SetPoint("BOTTOM", WardrobeTransmogFrame.MainHandButton, "BOTTOM", 0, -15)
-- Checkbox for transmog each shoulder separately
WardrobeTransmogFrame.ToggleSecondaryAppearanceCheckbox:ClearAllPoints()
WardrobeTransmogFrame.ToggleSecondaryAppearanceCheckbox:SetPoint("BOTTOMLEFT", WardrobeTransmogFrame, "BOTTOMLEFT", 583, 15)
else
-- Wider character preview is disabled so move the right column up
WardrobeTransmogFrame.HandsButton:ClearAllPoints()
WardrobeTransmogFrame.HandsButton:SetPoint("TOPRIGHT", -6, -60)
-- Show weapons in the right column
WardrobeTransmogFrame.SecondaryHandButton:ClearAllPoints()
WardrobeTransmogFrame.SecondaryHandButton:SetPoint("TOP", WardrobeTransmogFrame.FeetButton, "BOTTOM", 0, -96)
WardrobeTransmogFrame.SecondaryHandEnchantButton:ClearAllPoints()
WardrobeTransmogFrame.SecondaryHandEnchantButton:SetPoint("BOTTOM", WardrobeTransmogFrame.SecondaryHandButton, "BOTTOM", 0, -15)
WardrobeTransmogFrame.MainHandButton:ClearAllPoints()
WardrobeTransmogFrame.MainHandButton:SetPoint("BOTTOM", WardrobeTransmogFrame.SecondaryHandButton, "TOP", 0, 30)
WardrobeTransmogFrame.MainHandEnchantButton:ClearAllPoints()
WardrobeTransmogFrame.MainHandEnchantButton:SetPoint("BOTTOM", WardrobeTransmogFrame.MainHandButton, "BOTTOM", 0, -15)
end
-- Increase zoom out distance
if LeaPlusLC["DressupMoreZoomOut"] == "On" then
hooksecurefunc(WardrobeTransmogFrame.ModelScene, "TransitionToModelSceneID", function(self)
local activeCamera = self:GetActiveCamera()
if activeCamera then
local currentZoom = activeCamera:GetZoomDistance()
activeCamera:SetMaxZoomDistance(5)
activeCamera:SetZoomDistance(currentZoom)
end
end)
end
----------------------------------------------------------------------
-- Transmogrify animation slider
----------------------------------------------------------------------
do
local transmogAnimTable = {0, 4, 5, 143, 119, 26, 25, 27, 28, 108, 120, 51, 124, 52, 125, 126, 62, 63, 41, 42, 43, 44, 132, 38, 14, 115, 193, 48, 110, 109, 134, 197, 0}
local transmogLastSetting
LeaPlusLC["TransmogAnim"] = 0 -- Defined here since the setting is not saved
LeaPlusLC:MakeSL(WardrobeTransmogFrame, "TransmogAnim", "", 1, #transmogAnimTable - 1, 1, 356, -92, "%.0f")
LeaPlusCB["TransmogAnim"]:ClearAllPoints()
LeaPlusCB["TransmogAnim"]:SetPoint("BOTTOM", 0, 6)
if LeaPlusLC["DressupWiderPreview"] == "On" then
LeaPlusCB["TransmogAnim"]:SetWidth(240)
else
LeaPlusCB["TransmogAnim"]:SetWidth(216)
end
LeaPlusCB["TransmogAnim"]:SetFrameLevel(5)
LeaPlusCB["TransmogAnim"]:HookScript("OnValueChanged", function(self, setting)
local playerActor = WardrobeTransmogFrame.ModelScene:GetPlayerActor()
setting = math.floor(setting + 0.5)
if playerActor and setting ~= lastSetting then
lastSetting = setting
playerActor:SetAnimation(transmogAnimTable[setting], 0, 1, 1)
end
end)
-- Function to show animation control
local function SetAnimationSlider()
if LeaPlusLC["DressupTransmogAnim"] == "On" then
LeaPlusCB["TransmogAnim"]:Show()
else
LeaPlusCB["TransmogAnim"]:Hide()
end
LeaPlusCB["TransmogAnim"]:SetValue(1)
end
-- Set animation control with option, startup, preset and reset
LeaPlusCB["DressupTransmogAnim"]:HookScript("OnClick", SetAnimationSlider)
SetAnimationSlider()
LeaPlusCB["EnhanceDressupBtn"]:HookScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
LeaPlusLC["DressupTransmogAnim"] = "On"
SetAnimationSlider()
end
end)
DressupPanel.r:HookScript("OnClick", function()
LeaPlusLC["DressupTransmogAnim"] = "Off"
SetAnimationSlider()
DressupPanel:Hide(); DressupPanel:Show()
end)
-- Reset animation when slider is shown
LeaPlusCB["TransmogAnim"]:HookScript("OnShow", SetAnimationSlider)
-- Skin slider for ElvUI
if LeaPlusLC.ElvUI then
_G.LeaPlusGlobalTransmogAnim = LeaPlusCB["TransmogAnim"]
LeaPlusLC.ElvUI:GetModule("Skins"):HandleSliderFrame(_G.LeaPlusGlobalTransmogAnim, false)
end
end
end
if IsAddOnLoaded("Blizzard_Collections") then
DoBlizzardCollectionsFunc()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_Collections" then
DoBlizzardCollectionsFunc()
waitFrame:UnregisterAllEvents()
end
end)
end
-- Inspect System
local function DoInspectSystemFunc()
-- Hide positioning controls
InspectModelFrameControlFrame:HookScript("OnShow", InspectModelFrameControlFrame.Hide)
end
if IsAddOnLoaded("Blizzard_InspectUI") then
DoInspectSystemFunc()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_InspectUI" then
DoInspectSystemFunc()
waitFrame:UnregisterAllEvents()
end
end)
end
end
----------------------------------------------------------------------
-- Automate gossip (no reload required)
----------------------------------------------------------------------
do
-- Function to skip gossip
local function SkipGossip(skipAltKeyRequirement)
if not skipAltKeyRequirement and not IsAltKeyDown() then return end
local gossipInfoTable = C_GossipInfo.GetOptions()
if gossipInfoTable[1] then
if gossipInfoTable[1].gossipOptionID then
C_GossipInfo.SelectOption(gossipInfoTable[1].gossipOptionID)
else
-- Some gossip options dont have a gossip option ID (such as Suspicious Noble NPCs in Court of Stars, Suramar)
if GossipFrame and GossipFrame:IsShown() then GossipFrame:SelectGossipOption(1) end
end
end
end
-- Create gossip event frame
local gossipFrame = CreateFrame("FRAME")
-- Function to setup events
local function SetupEvents()
if LeaPlusLC["AutomateGossip"] == "On" then
gossipFrame:RegisterEvent("GOSSIP_SHOW")
else
gossipFrame:UnregisterEvent("GOSSIP_SHOW")
end
end
-- Setup events when option is clicked and on startup (if option is enabled)
LeaPlusCB["AutomateGossip"]:HookScript("OnClick", SetupEvents)
if LeaPlusLC["AutomateGossip"] == "On" then SetupEvents() end
-- Event handler
gossipFrame:SetScript("OnEvent", function()
-- Special treatment for specific NPCs
local npcGuid = UnitGUID("target") or nil
if npcGuid then
local void, void, void, void, void, npcID = strsplit("-", npcGuid)
if npcID then
-- Open rogue doors in Dalaran (Broken Isles) automatically
if npcID == "96782" -- Lucian Trias
or npcID == "93188" -- Mongar
or npcID == "97004" -- "Red" Jack Findle
then
SkipGossip()
return
end
-- Skip gossip with no alt key requirement
if npcID == "132969" -- Katy Stampwhistle (toy)
or npcID == "104201" -- Katy Stampwhistle (npc)
then
SkipGossip(true) -- true means skip alt key requirement
return
end
end
end
-- Process gossip
local gossipOptions = C_GossipInfo.GetOptions()
if gossipOptions and #gossipOptions == 1 and C_GossipInfo.GetNumAvailableQuests() == 0 and C_GossipInfo.GetNumActiveQuests() == 0 then
SkipGossip()
end
end)
end
----------------------------------------------------------------------
-- Hide order hall bar
----------------------------------------------------------------------
if LeaPlusLC["NoCommandBar"] == "On" then
-- Function to hide the order hall bar
local function HideCommandBar()
OrderHallCommandBar:HookScript("OnShow", function()
OrderHallCommandBar:Hide()
end)
end
-- Run function when Blizzard addon has loaded
if IsAddOnLoaded("Blizzard_OrderHallUI") then
HideCommandBar()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_OrderHallUI" then
HideCommandBar()
waitFrame:UnregisterAllEvents()
end
end)
end
end
----------------------------------------------------------------------
-- Disable pet automation
----------------------------------------------------------------------
if LeaPlusLC["NoPetAutomation"] == "On" then
-- Create frame to watch for combat
local petCombat = CreateFrame("FRAME")
local petTicker
-- Function to dismiss pet
local function DismissPetTimerFunc()
if UnitAffectingCombat("player") then
-- Player is in combat so cancel ticker and schedule it for when combat ends
if petTicker then petTicker:Cancel() end
petCombat:RegisterEvent("PLAYER_REGEN_ENABLED")
else
-- Player is not in combat so attempt to dismiss pet
local summonedPet = C_PetJournal.GetSummonedPetGUID()
if summonedPet then
C_PetJournal.SummonPetByGUID(summonedPet)
end
end
end
hooksecurefunc(C_PetJournal, "SetPetLoadOutInfo", function()
-- Cancel existing ticker if one already exists
if petTicker then petTicker:Cancel() end
-- Check for combat
if UnitAffectingCombat("player") then
-- Player is in combat so schedule ticker for when combat ends
petCombat:RegisterEvent("PLAYER_REGEN_ENABLED")
else
-- Player is not in combat so run ticker now
petTicker = C_Timer.NewTicker(0.5, DismissPetTimerFunc, 15)
end
end)
-- Script for when combat ends
petCombat:SetScript("OnEvent", function()
-- Combat has ended so run ticker now
petTicker = C_Timer.NewTicker(0.5, DismissPetTimerFunc, 15)
petCombat:UnregisterEvent("PLAYER_REGEN_ENABLED")
end)
end
----------------------------------------------------------------------
-- Show pet save button
----------------------------------------------------------------------
if LeaPlusLC["ShowPetSaveBtn"] == "On" then
local function MakePetSystem()
-- Create panel
local pFrame = CreateFrame("Frame", nil, PetJournal)
pFrame:ClearAllPoints()
pFrame:SetPoint("TOPLEFT", PetJournalLoadoutBorder, "TOPLEFT", 4, 40)
pFrame:SetSize(PetJournalLoadoutBorder:GetWidth() -10, 16)
pFrame:Hide()
pFrame:SetFrameLevel(5000)
-- Add background color
pFrame.t = pFrame:CreateTexture(nil, "BACKGROUND")
pFrame.t:SetAllPoints()
pFrame.t:SetColorTexture(0.05, 0.05, 0.05, 0.7)
-- Create editbox
local petEB = CreateFrame("EditBox", nil, pFrame)
petEB:SetAllPoints()
petEB:SetTextInsets(2, 2, 2, 2)
petEB:SetFontObject("GameFontNormal")
petEB:SetTextColor(1.0, 1.0, 1.0, 1)
petEB:SetBlinkSpeed(0)
petEB:SetAltArrowKeyMode(true)
-- Prevent changes
petEB:SetScript("OnEscapePressed", function() pFrame:Hide() end)
petEB:SetScript("OnEnterPressed", petEB.HighlightText)
petEB:SetScript("OnMouseDown", petEB.ClearFocus)
petEB:SetScript("OnMouseUp", petEB.HighlightText)
-- Create tooltip
petEB.tiptext = L["This command will assign your current pet team and selected abilities.|n|nPress CTRL/C to copy the command then paste it into a macro or chat window with CTRL/V."]
petEB:HookScript("OnEnter", function()
GameTooltip:SetOwner(petEB, "ANCHOR_TOP")
GameTooltip:SetText(petEB.tiptext, nil, nil, nil, nil, true)
end)
petEB:HookScript("OnLeave", GameTooltip_Hide)
-- Function to get pet data and build macro
local function RefreshPets()
-- Get pet data
local p1, p1a, p1b, p1c = C_PetJournal.GetPetLoadOutInfo(1)
local p2, p2a, p2b, p2c = C_PetJournal.GetPetLoadOutInfo(2)
local p3, p3a, p3b, p3c = C_PetJournal.GetPetLoadOutInfo(3)
if p1 and p1a and p1b and p1c and p2 and p2a and p2b and p2c and p3 and p3a and p3b and p3c then
-- Build macro string and show it in editbox
local comTeam = "/ltp team "
comTeam = comTeam .. p1 .. ',' .. p1a .. ',' .. p1b .. ',' .. p1c .. ","
comTeam = comTeam .. p2 .. ',' .. p2a .. ',' .. p2b .. ',' .. p2c .. ","
comTeam = comTeam .. p3 .. ',' .. p3a .. ',' .. p3b .. ',' .. p3c
petEB:SetText(comTeam)
petEB:HighlightText()
petEB:SetFocus()
end
end
-- Prevent changes to editbox value
petEB:SetScript("OnChar", RefreshPets)
petEB:SetScript("OnKeyUp", RefreshPets)
-- Refresh pet data when slots are changed
hooksecurefunc(C_PetJournal, "SetPetLoadOutInfo", RefreshPets)
-- Add macro button
local macroBtn = LeaPlusLC:CreateButton("PetMacroBtn", _G["PetJournalLoadoutPet1"], "", "TOPRIGHT", 0, 0, 32, 32, false, "")
macroBtn:SetFrameLevel(5000)
macroBtn:SetNormalTexture("Interface\\BUTTONS\\AdventureGuideMicrobuttonAlert")
macroBtn:SetScript("OnClick", function()
if C_PetJournal.GetPetLoadOutInfo(1) and C_PetJournal.GetPetLoadOutInfo(2) and C_PetJournal.GetPetLoadOutInfo(3) then
if pFrame:IsShown() then
-- Frame is already showing so hide it
pFrame:Hide()
else
-- Show macro panel
pFrame:Show()
RefreshPets()
end
else
LeaPlusLC:Print("You need a battle pet team.")
end
end)
macroBtn:HookScript("OnHide", function() pFrame:Hide() end)
end
-- Run system function when pet journal loads
if IsAddOnLoaded("Blizzard_Collections") then
MakePetSystem()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_Collections" then
MakePetSystem()
waitFrame:UnregisterAllEvents()
end
end)
end
end
----------------------------------------------------------------------
-- Faster looting
----------------------------------------------------------------------
if LeaPlusLC["FasterLooting"] == "On" then
-- Create configuration panel
local FasterLootPanel = LeaPlusLC:CreatePanel("Faster auto loot", "FasterLootPanel")
LeaPlusLC:MakeTx(FasterLootPanel, "Delay", 16, -72)
LeaPlusLC:MakeSL(FasterLootPanel, "LeaPlusFasterLootDelay", "Drag to set the delay between looting items.|n|nLower is faster but may not always give the best results.|n|nIt's recommended that you leave this setting at 0.3 but feel free to try lower values if you wish.", 0.1, 0.3, 0.1, 16, -92, "%.1f")
LeaPlusLC:MakeFT(FasterLootPanel, "The default delay setting is 0.3. Lower is faster but may not always give the best results. It's recommended that you leave this setting at 0.3.", 16, 510, 96)
-- Help button hidden
FasterLootPanel.h:Hide()
-- Back button handler
FasterLootPanel.b:SetScript("OnClick", function()
FasterLootPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page7"]:Show()
return
end)
-- Reset button handler
FasterLootPanel.r:SetScript("OnClick", function()
-- Reset slider
LeaPlusLC["LeaPlusFasterLootDelay"] = 0.3
-- Refresh side panel
FasterLootPanel:Hide(); FasterLootPanel:Show()
end)
-- Show configuration panal when options panel button is clicked
LeaPlusCB["FasterLootingBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["LeaPlusFasterLootDelay"] = 0.3
FasterLootPanel:Hide(); FasterLootPanel:Show()
else
FasterLootPanel:Show()
LeaPlusLC:HideFrames()
end
end)
-- Time delay
local tDelay = 0
-- Fast loot function
local function FastLoot()
if GetTime() - tDelay >= LeaPlusLC["LeaPlusFasterLootDelay"] then
tDelay = GetTime()
if GetCVarBool("autoLootDefault") ~= IsModifiedClick("AUTOLOOTTOGGLE") then
if TSMDestroyBtn and TSMDestroyBtn:IsShown() and TSMDestroyBtn:GetButtonState() == "DISABLED" then tDelay = GetTime() return end
for i = GetNumLootItems(), 1, -1 do
LootSlot(i)
end
tDelay = GetTime()
end
end
end
-- Event frame
local faster = CreateFrame("Frame")
faster:RegisterEvent("LOOT_READY")
faster:SetScript("OnEvent", FastLoot)
end
----------------------------------------------------------------------
-- Hide event toasts
----------------------------------------------------------------------
if LeaPlusLC["HideEventToasts"] == "On" then
-- Hide event toasts when shown except toasts with a close button (Torghast final scores)
hooksecurefunc(EventToastManagerFrame, "Show", function()
if not EventToastManagerFrame.HideButton:IsShown() then
if EventToastManagerFrame.currentDisplayingToast then
if IsInJailersTower() then
-- Show floor summary
local title = EventToastManagerFrame.currentDisplayingToast.Title:GetText() or nil
if title and strfind(title, JAILERS_TOWER_SCENARIO_FLOOR) then
-- Add right-click to close floor summary
EventToastManagerFrame.currentDisplayingToast:SetScript("OnMouseDown", function(self, btn)
if btn == "RightButton" then
EventToastManagerFrame:CloseActiveToasts()
return
end
end)
return
end
end
EventToastManagerFrame.currentDisplayingToast:OnAnimatedOut()
end
end
end)
-- Force zone text to show while EventToastManagerFrame is showing
ZoneTextFrame:HookScript("OnEvent", function(self, event)
if EventToastManagerFrame:IsShown() then
if event == "ZONE_CHANGED_NEW_AREA" and not ZoneTextFrame:IsShown() then
FadingFrame_Show(ZoneTextFrame)
elseif event == "ZONE_CHANGED_INDOORS" and not SubZoneTextFrame:IsShown() then
FadingFrame_Show(SubZoneTextFrame)
end
end
end)
end
----------------------------------------------------------------------
-- Hide boss banner
----------------------------------------------------------------------
if LeaPlusLC["HideBossBanner"] == "On" then
BossBanner:UnregisterEvent("ENCOUNTER_LOOT_RECEIVED")
BossBanner:UnregisterEvent("BOSS_KILL")
end
----------------------------------------------------------------------
-- Hide clean-up buttons
----------------------------------------------------------------------
if LeaPlusLC["HideCleanupBtns"] == "On" and not LeaLockList["HideCleanupBtns"] then
-- Hide backpack clean-up button and make item search box longer
BagItemAutoSortButton:HookScript("OnShow", BagItemAutoSortButton.Hide)
BagItemSearchBox:SetWidth(120)
-- Hide bank frame clean-up button and make item search box longer
BankItemAutoSortButton:HookScript("OnShow", BankItemAutoSortButton.Hide)
BankItemSearchBox:ClearAllPoints()
BankItemSearchBox:SetPoint("TOPRIGHT", BankFrame, "TOPRIGHT", -27, -33)
BankItemSearchBox:SetWidth(120)
end
----------------------------------------------------------------------
-- Hide talking frame
----------------------------------------------------------------------
if LeaPlusLC["HideTalkingFrame"] == "On" then
hooksecurefunc(TalkingHeadFrame, "PlayCurrent", function(self)
self:Hide()
end)
end
----------------------------------------------------------------------
-- Automate quests (no reload required)
----------------------------------------------------------------------
do
-- Create configuration panel
local QuestPanel = LeaPlusLC:CreatePanel("Automate quests", "QuestPanel")
LeaPlusLC:MakeTx(QuestPanel, "Settings", 16, -72)
LeaPlusLC:MakeCB(QuestPanel, "AutoQuestRegular", "Accept regular quests automatically", 16, -92, false, "If checked, regular quests will be accepted automatically.|n|nThis does not apply to daily or weekly quests.")
LeaPlusLC:MakeCB(QuestPanel, "AutoQuestDaily", "Accept daily quests automatically", 16, -112, false, "If checked, daily quests will be accepted automatically.")
LeaPlusLC:MakeCB(QuestPanel, "AutoQuestWeekly", "Accept weekly quests automatically", 16, -132, false, "If checked, weekly quests will be accepted automatically.")
LeaPlusLC:MakeCB(QuestPanel, "AutoQuestCompleted", "Turn-in completed quests automatically", 16, -152, false, "If checked, completed quests will be turned-in automatically.")
LeaPlusLC:MakeCB(QuestPanel, "AutoQuestShift", "Require override key for quest automation", 16, -172, false, "If checked, you will need to hold the override key down for quests to be automated.|n|nIf unchecked, holding the override key will prevent quests from being automated.")
LeaPlusLC:CreateDropDown("AutoQuestKeyMenu", "Override key", QuestPanel, 146, "TOPLEFT", 356, -115, {L["SHIFT"], L["ALT"], L["CONTROL"], L["CMD (MAC)"]}, "")
-- Help button hidden
QuestPanel.h:Hide()
-- Back button handler
QuestPanel.b:SetScript("OnClick", function()
QuestPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page1"]:Show();
return
end)
-- Reset button handler
QuestPanel.r:SetScript("OnClick", function()
-- Reset checkboxes
LeaPlusLC["AutoQuestShift"] = "Off"
LeaPlusLC["AutoQuestRegular"] = "On"
LeaPlusLC["AutoQuestDaily"] = "On"
LeaPlusLC["AutoQuestWeekly"] = "On"
LeaPlusLC["AutoQuestCompleted"] = "On"
LeaPlusLC["AutoQuestKeyMenu"] = 1
-- Refresh panel
QuestPanel:Hide(); QuestPanel:Show()
end)
-- Show panal when options panel button is clicked
LeaPlusCB["AutomateQuestsBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["AutoQuestShift"] = "Off"
LeaPlusLC["AutoQuestRegular"] = "On"
LeaPlusLC["AutoQuestDaily"] = "On"
LeaPlusLC["AutoQuestWeekly"] = "On"
LeaPlusLC["AutoQuestCompleted"] = "On"
LeaPlusLC["AutoQuestKeyMenu"] = 1
else
QuestPanel:Show()
LeaPlusLC:HideFrames()
end
end)
-- Function to determine if override key is being held
local function IsOverrideKeyDown()
if LeaPlusLC["AutoQuestKeyMenu"] == 1 and IsShiftKeyDown()
or LeaPlusLC["AutoQuestKeyMenu"] == 2 and IsAltKeyDown()
or LeaPlusLC["AutoQuestKeyMenu"] == 3 and IsControlKeyDown()
or LeaPlusLC["AutoQuestKeyMenu"] == 4 and IsMetaKeyDown()
then
return true
end
end
-- Funcion to ignore specific NPCs
local function isNpcBlocked(actionType)
local npcGuid = UnitGUID("target") or nil
if npcGuid then
local void, void, void, void, void, npcID = strsplit("-", npcGuid)
if npcID then
-- Ignore specific NPCs for selecting, accepting and turning-in quests (required if automation has consequences)
if npcID == "15192" -- Anachronos (Caverns of Time)
or npcID == "119388" -- Chieftain Hatuun (Krokul Hovel, Krokuun)
or npcID == "6566" -- Estelle Gendry (Heirloom Curator, Undercity)
or npcID == "45400" -- Fiona's Caravan (Eastern Plaguelands)
or npcID == "18166" -- Khadgar (Allegiance to Aldor/Scryer, Shattrath)
or npcID == "55402" -- Korgol Crushskull (Darkmoon Faire, Pit Master)
or npcID == "6294" -- Krom Stoutarm (Heirloom Curator, Ironforge)
or npcID == "109227" -- Meliah Grayfeather (Tradewind Roost, Highmountain)
or npcID == "99183" -- Renegade Ironworker (Tanaan Jungle, repeatable quest)
or npcID == "114719" -- Trader Caelen (Obliterum Forge, Dalaran, Broken Isles)
-- Seals of Fate
or npcID == "111243" -- Archmage Lan'dalock (Seal quest, Dalaran)
or npcID == "87391" -- Fate-Twister Seress (Seal quest, Stormshield)
or npcID == "88570" -- Fate-Twister Tiklal (Seal quest, Horde)
or npcID == "142063" -- Tezran (Seal quest, Boralus Harbor, Alliance)
or npcID == "141584" -- Zurvan (Seal quest, Dazar'alor, Horde)
-- Wartime Donations (Alliance)
or npcID == "142994" -- Brandal Darkbeard (Boralus)
or npcID == "142995" -- Charlane (Boralus)
or npcID == "142993" -- Chelsea Strand (Boralus)
or npcID == "142998" -- Faella (Boralus)
or npcID == "143004" -- Larold Kyne (Boralus)
or npcID == "143005" -- Liao (Boralus)
or npcID == "143007" -- Mae Wagglewand (Boralus)
or npcID == "143008" -- Norber Togglesprocket (Boralus)
or npcID == "142685" -- Paymaster Vauldren (Boralus)
or npcID == "142700" -- Quartermaster Peregrin (Boralus)
or npcID == "142997" -- Senedras (Boralus)
-- Wartime Donations (Horde)
or npcID == "142970" -- Kuma Longhoof (Dazar'alor)
or npcID == "142969" -- Logarr (Dazar'alor)
or npcID == "142973" -- Mai-Lu (Dazar'alor)
or npcID == "142977" -- Meredith Swane (Dazar'alor)
or npcID == "142981" -- Merill Redgrave (Dazar'alor)
or npcID == "142157" -- Paymaster Grintooth (Dazar'alor)
or npcID == "142158" -- Quartermaster Rauka (Dazar'alor)
or npcID == "142975" -- Seamstress Vessa (Dazar'alor)
or npcID == "142983" -- Swizzle Fizzcrank (Dazar'alor)
or npcID == "142992" -- Uma'wi (Dazar'alor)
or npcID == "142159" -- Zen'kin (Dazar'alor)
-- Dragonflight
or npcID == "193110" -- Khadin <Master Artisan> (Ohn'ahran Plains)
or npcID == "194584" -- Khuri <Fishing Trainer> (The Waking Shores)
then
return true
end
-- Ignore specific NPCs for selecting quests only (only used for items that have no other purpose)
if actionType == "Select" then
if npcID == "87706" -- Gazmolf Futzwangler (Reputation quests, Nagrand, Draenor)
or npcID == "70022" -- Ku'ma (Isle of Giants, Pandaria)
or npcID == "12944" -- Lokhtos Darkbargainer (Thorium Brotherhood, Blackrock Depths)
or npcID == "87393" -- Sallee Silverclamp (Reputation quests, Nagrand, Draenor)
or npcID == "10307" -- Witch Doctor Mau'ari (E'Ko quests, Winterspring)
then
return true
end
end
end
end
end
-- Function to check if quest ID is blocked
local function IsQuestIDBlocked(questID)
if questID then
if questID == 43923 -- Starlight Rose
or questID == 43924 -- Leyblood
or questID == 43925 -- Runescale Koi
or questID == 71162 -- Waygate: Algeth'era (Thaelin Darkanvil, Dragonflight)
or questID == 71165 -- Waygate: Eon's Fringe (Thaelin Darkanvil, Dragonflight)
or questID == 71138 -- Waygate: Rusza'thar Reach (Thaelin Darkanvil, Dragonflight)
or questID == 71178 -- Waygate: Shady Sanctuary (Thaelin Darkanvil, Dragonflight)
or questID == 71157 -- Waygate: Skytop Observatory (Thaelin Darkanvil, Dragonflight)
or questID == 71161 -- Waygate: Vakthros (Thaelin Darkanvil, Dragonflight)
then
return true
end
end
end
-- Function to check if a required item is account-bound
local function IsItemAccountBound(itemID)
local tooltipData = C_TooltipInfo.GetItemByID(itemID)
TooltipUtil.SurfaceArgs(tooltipData)
for row, line in ipairs(tooltipData.lines) do
TooltipUtil.SurfaceArgs(line)
if tooltipData.lines[row] and tooltipData.lines[row].leftText and (tooltipData.lines[row].leftText == ITEM_BNETACCOUNTBOUND or tooltipData.lines[row].leftText == ITEM_BIND_TO_BNETACCOUNT or tooltipData.lines[row].leftText == ITEM_BIND_TO_ACCOUNT or tooltipData.lines[row].leftText == ITEM_ACCOUNTBOUND) then
return true
end
end
end
-- Function to check if quest requires currency or a crafting reagent or required item is account-bound
local function QuestRequiresCurrency()
for i = 1, 6 do
local progItem = _G["QuestProgressItem" ..i] or nil
if progItem and progItem:IsShown() and progItem.type == "required" then
if progItem.objectType == "currency" then
-- Quest requires currency so do nothing
return true
elseif progItem.objectType == "item" then
-- Quest requires an item
local name, texture, numItems, void, void, itemID = GetQuestItemInfo("required", i)
if name and itemID then
local void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, isCraftingReagent = GetItemInfo(itemID)
if isCraftingReagent or IsItemAccountBound(itemID) then
-- Item is a crafting reagent or account-bound so do nothing
return true
end
end
end
end
end
end
-- Function to check if quest requires gold
local function QuestRequiresGold()
local goldRequiredAmount = GetQuestMoneyToGet()
if goldRequiredAmount and goldRequiredAmount > 0 then
return true
end
end
-- Function to check if quest ID has requirements met
local function DoesQuestHaveRequirementsMet(qID)
if qID and qID ~= "" then
if not qID then
-- Scourgestones
elseif qID == 62293 then
-- Quest Darkened Scourgestones requires 25 Darkened Scourgestones
if GetItemCount(180720) >= 25 then return true end
elseif qID == 62292 then
-- Quest Pitch Black Scourgestones requires 25 Pitch Black Scourgestones
if GetItemCount(183200) >= 25 then return true end
elseif qID == 10325 or qID == 10326 then
-- Requires 10 More Marks of Kil'jaeden
if GetItemCount(29425) >= 10 then return true end
elseif qID == 10655 or qID == 10828 then
-- Requires 1 Marks of Sargeras (if more than 10, leave for More Marks of Sargeras)
if GetItemCount(30809) >= 1 and GetItemCount(30809) < 10 then return true end
elseif qID == 10654 or qID == 10827 then
-- Requires 10 Marks of Sargeras
if GetItemCount(30809) >= 10 then return true end
elseif qID == 10412 or qID == 10415 then
-- Requires 10 Firewing Signets
if GetItemCount(29426) >= 10 then return true end
elseif qID == 10659 or qID == 10822 then
-- Requires 1 Sunfury Signet (if more than 10, leave for More Sunfury Signets)
if GetItemCount(30810) >= 1 and GetItemCount(30810) < 10 then return true end
elseif qID == 10658 or qID == 10823 then
-- Requires 10 Sunfury Signets
if GetItemCount(30810) >= 10 then return true end
else return true
end
end
end
-- Create event frame
local qFrame = CreateFrame("FRAME")
-- Function to setup events
local function SetupEvents()
if LeaPlusLC["AutomateQuests"] == "On" then
qFrame:RegisterEvent("QUEST_DETAIL")
qFrame:RegisterEvent("QUEST_ACCEPT_CONFIRM")
qFrame:RegisterEvent("QUEST_PROGRESS")
qFrame:RegisterEvent("QUEST_COMPLETE")
qFrame:RegisterEvent("QUEST_GREETING")
qFrame:RegisterEvent("QUEST_AUTOCOMPLETE")
qFrame:RegisterEvent("GOSSIP_SHOW")
qFrame:RegisterEvent("QUEST_FINISHED")
else
qFrame:UnregisterAllEvents()
end
end
-- Setup events when option is clicked and on startup (if option is enabled)
LeaPlusCB["AutomateQuests"]:HookScript("OnClick", SetupEvents)
if LeaPlusLC["AutomateQuests"] == "On" then SetupEvents() end
-- Store quest frequency values
local regularQuest = Enum.QuestFrequency.Default
local dailyQuest = Enum.QuestFrequency.Daily
local weeklyQuest = Enum.QuestFrequency.Weekly
-- Event handler
qFrame:SetScript("OnEvent", function(self, event, arg1)
-- Block shared quests if option is enabled
if event == "QUEST_DETAIL" then
LeaPlusLC:CheckIfQuestIsSharedAndShouldBeDeclined()
end
-- Clear progress items when quest interaction has ceased
if event == "QUEST_FINISHED" then
for i = 1, 6 do
local progItem = _G["QuestProgressItem" ..i] or nil
if progItem and progItem:IsShown() then
progItem:Hide()
end
end
return
end
-- Check for SHIFT key modifier
if LeaPlusLC["AutoQuestShift"] == "On" and not IsOverrideKeyDown() then return
elseif LeaPlusLC["AutoQuestShift"] == "Off" and IsOverrideKeyDown() then return
end
----------------------------------------------------------------------
-- Accept quests automatically
----------------------------------------------------------------------
-- Accept quests with a quest detail window
if event == "QUEST_DETAIL" then
if LeaPlusLC["AutoQuestRegular"] == "On" or LeaPlusLC["AutoQuestDaily"] == "On" or LeaPlusLC["AutoQuestWeekly"] == "On" then
-- Don't accept quests if option is not enabled
if LeaPlusLC["AutoQuestRegular"] == "Off" and not QuestIsDaily() and not QuestIsWeekly() then return end
-- Don't accept daily quests if option is not enabled
if LeaPlusLC["AutoQuestDaily"] == "Off" and QuestIsDaily() then return end
-- Don't accept weekly quests if option is not enabled
if LeaPlusLC["AutoQuestWeekly"] == "Off" and QuestIsWeekly() then return end
-- Don't accept blocked quests
if isNpcBlocked("Accept") then return end
-- Accept quest
if QuestGetAutoAccept() then
-- Quest has already been accepted by Wow so close the quest detail window
CloseQuest()
else
-- Quest has not been accepted by Wow so accept it
AcceptQuest()
HideUIPanel(QuestFrame)
end
end
end
-- Accept quests which require confirmation (such as sharing escort quests)
if event == "QUEST_ACCEPT_CONFIRM" then
if LeaPlusLC["AutoQuestRegular"] == "On" then
ConfirmAcceptQuest()
StaticPopup_Hide("QUEST_ACCEPT")
end
end
----------------------------------------------------------------------
-- Turn-in quests automatically
----------------------------------------------------------------------
-- Turn-in progression quests
if event == "QUEST_PROGRESS" and IsQuestCompletable() then
if LeaPlusLC["AutoQuestCompleted"] == "On" then
-- Don't continue quests for blocked NPCs
if isNpcBlocked("Complete") then return end
-- Don't continue if quest requires currency
if QuestRequiresCurrency() then return end
-- Don't continue if quest requires gold
if QuestRequiresGold() then return end
-- Continue quest
CompleteQuest()
end
end
-- Turn in completed quests if only one reward item is being offered
if event == "QUEST_COMPLETE" then
if LeaPlusLC["AutoQuestCompleted"] == "On" then
-- Don't complete quests for blocked NPCs
if isNpcBlocked("Complete") then return end
-- Don't complete if quest requires currency
if QuestRequiresCurrency() then return end
-- Don't complete if quest requires gold
if QuestRequiresGold() then return end
-- Complete quest
if GetNumQuestChoices() <= 1 then
GetQuestReward(GetNumQuestChoices())
end
end
end
-- Show quest dialog for quests that use the objective tracker (it will be completed automatically)
if event == "QUEST_AUTOCOMPLETE" then
if LeaPlusLC["AutoQuestCompleted"] == "On" then
local index = C_QuestLog.GetLogIndexForQuestID(arg1)
local info = C_QuestLog.GetInfo(index)
if info and info.isAutoComplete then
local questID = C_QuestLog.GetQuestIDForLogIndex(index)
C_QuestLog.SetSelectedQuest(questID)
ShowQuestComplete(C_QuestLog.GetSelectedQuest())
end
end
end
----------------------------------------------------------------------
-- Select quests automatically
----------------------------------------------------------------------
if event == "GOSSIP_SHOW" or event == "QUEST_GREETING" then
-- Select quests
if UnitExists("npc") or QuestFrameGreetingPanel:IsShown() then
-- Do nothing if there is a gossip option with a color code (such as skip ahead)
local gossipInfoTable = C_GossipInfo.GetOptions()
for i = 1, #gossipInfoTable do
local nameText = gossipInfoTable[i].name
if nameText then
if string.find(strupper(nameText), "|C") or string.find(strupper(nameText), "<")then
if not string.find(nameText, "FF0008E8") then -- Purple text such as Darkmoon Faire daily quests
return
end
end
end
end
-- Don't select quests for blocked NPCs
if isNpcBlocked("Select") then return end
-- Select quests
if event == "QUEST_GREETING" then
-- Select quest greeting completed quests
if LeaPlusLC["AutoQuestCompleted"] == "On" then
for i = 1, GetNumActiveQuests() do
local title, isComplete = GetActiveTitle(i)
if title and isComplete then
return SelectActiveQuest(i)
end
end
end
-- Select quest greeting available quests
if LeaPlusLC["AutoQuestRegular"] == "On" or LeaPlusLC["AutoQuestDaily"] == "On" or LeaPlusLC["AutoQuestWeekly"] == "On" then
for i = 1, GetNumAvailableQuests() do
local title, isComplete = GetAvailableTitle(i)
if title and not isComplete then
local isTrivial, frequency, isRepeatable, isLegendary = GetAvailableQuestInfo(i)
if frequency ~= regularQuest or LeaPlusLC["AutoQuestRegular"] == "On" then
if frequency ~= dailyQuest or LeaPlusLC["AutoQuestDaily"] == "On" then
if frequency ~= weeklyQuest or LeaPlusLC["AutoQuestWeekly"] == "On" then
return SelectAvailableQuest(i)
end
end
end
end
end
end
else
-- Select gossip completed quests
if LeaPlusLC["AutoQuestCompleted"] == "On" then
local gossipQuests = C_GossipInfo.GetActiveQuests()
for titleIndex, questInfo in ipairs(gossipQuests) do
if questInfo.title and questInfo.isComplete then
if questInfo.questID then
return C_GossipInfo.SelectActiveQuest(questInfo.questID)
end
end
end
end
-- Select gossip available quests
if LeaPlusLC["AutoQuestRegular"] == "On" or LeaPlusLC["AutoQuestDaily"] == "On" or LeaPlusLC["AutoQuestWeekly"] == "On" then
local GossipQuests = C_GossipInfo.GetAvailableQuests()
for titleIndex, questInfo in ipairs(GossipQuests) do
if questInfo.frequency ~= regularQuest or LeaPlusLC["AutoQuestRegular"] == "On" then
if questInfo.frequency ~= dailyQuest or LeaPlusLC["AutoQuestDaily"] == "On" then
if questInfo.frequency ~= weeklyQuest or LeaPlusLC["AutoQuestWeekly"] == "On" then
if questInfo.questID and not IsQuestIDBlocked(questInfo.questID) and DoesQuestHaveRequirementsMet(questInfo.questID) then
return C_GossipInfo.SelectAvailableQuest(questInfo.questID)
end
end
end
end
end
end
end
end
end
end)
end
----------------------------------------------------------------------
-- Hide bogyguard gossip
----------------------------------------------------------------------
if LeaPlusLC["HideBodyguard"] == "On" then
local gFrame = CreateFrame("FRAME")
gFrame:RegisterEvent("GOSSIP_SHOW")
local bodyNames = {}
for i, v in pairs({--[[Delvar Ironfist]] 1733, --[[Tormmok]] 1736, --[[Talonpriest Ishaal]] 1737, --[[Defender Illona]] 1738, --[[Vivianne]] 1739, --[[Aeda Brightdawn]] 1740, --[[Leorajh]] 1741}) do
local reputationInfo = C_GossipInfo.GetFriendshipReputation(v)
bodyNames[reputationInfo.name] = true
end
gFrame:SetScript("OnEvent", function()
-- Do nothing if shift is being held
if IsShiftKeyDown() then return end
local name = UnitName("target") or nil
if bodyNames[name] then
-- Close gossip window if it's for a cooperating (active) bodyguard
-- If you open a gossip window prior to the bodyguard (or hold shift), it will not close
-- and will need to be closed manually.
if UnitCanCooperate("target", "player") then
C_GossipInfo.CloseGossip()
end
end
end)
end
----------------------------------------------------------------------
-- Sort game options addon list
----------------------------------------------------------------------
if LeaPlusLC["CharAddonList"] == "On" then
-- Set the addon list to character by default
if AddonCharacterDropDown and AddonCharacterDropDown.selectedValue then
AddonCharacterDropDown.selectedValue = UnitName("player")
AddonCharacterDropDownText:SetText(UnitName("player"))
end
end
----------------------------------------------------------------------
-- Sell junk automatically
----------------------------------------------------------------------
if LeaPlusLC["AutoSellJunk"] == "On" then
-- 10.1.7: Hide the sell all junk items button (it does not take exclusions, special items or transmog items into account and does not print vendor summaries)
if MerchantSellAllJunkButton then
hooksecurefunc(MerchantSellAllJunkButton, "Show", function() MerchantSellAllJunkButton:Hide() end)
end
-- Create sell junk banner
local StartMsg = CreateFrame("FRAME", nil, MerchantFrame)
StartMsg:ClearAllPoints()
StartMsg:SetPoint("BOTTOMLEFT", 4, 4)
StartMsg:SetSize(160, 22)
StartMsg:SetToplevel(true)
StartMsg:Hide()
StartMsg.s = StartMsg:CreateTexture(nil, "BACKGROUND")
StartMsg.s:SetAllPoints()
StartMsg.s:SetColorTexture(0.1, 0.1, 0.1, 1.0)
StartMsg.f = StartMsg:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
StartMsg.f:SetAllPoints();
StartMsg.f:SetText(L["SELLING JUNK"])
-- Declarations
local IterationCount, totalPrice = 500, 0
local SellJunkTicker
-- Create custom NewTicker function (from Wrath)
local function LeaPlusNewTicker(duration, callback, iterations)
local ticker = setmetatable({}, TickerMetatable)
ticker._remainingIterations = iterations
ticker._callback = function()
if (not ticker._cancelled) then
callback(ticker)
--Make sure we weren't cancelled during the callback
if (not ticker._cancelled) then
if (ticker._remainingIterations) then
ticker._remainingIterations = ticker._remainingIterations - 1
end
if (not ticker._remainingIterations or ticker._remainingIterations > 0) then
C_Timer.After(duration, ticker._callback)
end
end
end
end
C_Timer.After(duration, ticker._callback)
return ticker
end
-- Create configuration panel
local SellJunkFrame = LeaPlusLC:CreatePanel("Sell junk automatically", "SellJunkFrame")
LeaPlusLC:MakeTx(SellJunkFrame, "Settings", 16, -72)
LeaPlusLC:MakeCB(SellJunkFrame, "AutoSellShowSummary", "Show vendor summary in chat", 16, -92, false, "If checked, a vendor summary will be shown in chat when junk is automatically sold.")
LeaPlusLC:MakeCB(SellJunkFrame, "AutoSellNoKeeperTahult", "Exclude Keeper Ta'hult's pet items", 16, -112, false, L["If checked, the following junk items required to purchase pets from Keeper Ta'hult in Oribos will not be sold automatically."] .. L["|cff889D9D|n"] .. L["|n- A Frayed Knot|n- Dark Iron Baby Booties|n- Ground Gear|n- Large Slimy Bone|n- Rabbits Foot|n- Robbles Wobbly Staff|n- Rotting Bear Carcass|n- The Stoppable Force|n- Very Unlucky Rock"] .. "|r")
LeaPlusLC:MakeCB(SellJunkFrame, "AutoSellNoGreyGear", "Exclude all unbound grey gear", 16, -132, false, L["If checked, grey gear that is not soulbound to your character will not be sold.|n|nUse this setting if you plan to sell grey gear in the auction house."])
LeaPlusLC:MakeTx(SellJunkFrame, "Transmog", 16, -172)
LeaPlusLC:MakeCB(SellJunkFrame, "AutoSellExcludeMyChar", "Exclude gear designed for my character", 16, -192, false, L["If checked, uncollected grey gear that is designed for your character will not be sold.|n|nUse this setting if you plan to collect transmog appearances from grey gear that is designed for your character."])
LeaPlusLC:MakeCB(SellJunkFrame, "AutoSellExcludeMyAlts", "Exclude gear designed for my alts", 16, -212, false, L["If checked, uncollected grey gear that is designed for your alts and is not soulbound to your character will not be sold.|n|nUse this setting if you plan to collect transmog appearances from grey gear that is designed for your alts."])
-- Exclude all grey gear checkbox lock
local NoGreyTransmogTipText = LeaPlusCB["AutoSellExcludeMyChar"].tiptext
local NoGreyTransmogCharTipText = LeaPlusCB["AutoSellExcludeMyAlts"].tiptext
local function SetTransmogLockFunc()
if LeaPlusLC["AutoSellNoGreyGear"] == "On" then
LeaPlusLC:LockItem(LeaPlusCB["AutoSellExcludeMyChar"], true)
LeaPlusCB["AutoSellExcludeMyChar"].tiptext = NoGreyTransmogTipText .. "|n|n|cff00AAFF" .. L["You have excluded all unbound grey gear from being sold so this setting is ignored."]
LeaPlusLC:LockItem(LeaPlusCB["AutoSellExcludeMyAlts"], true)
LeaPlusCB["AutoSellExcludeMyAlts"].tiptext = NoGreyTransmogCharTipText .. "|n|n|cff00AAFF" .. L["You have excluded all unbound grey gear from being sold so this setting is ignored."]
else
LeaPlusLC:LockItem(LeaPlusCB["AutoSellExcludeMyChar"], false)
LeaPlusCB["AutoSellExcludeMyChar"].tiptext = NoGreyTransmogTipText
LeaPlusLC:LockItem(LeaPlusCB["AutoSellExcludeMyAlts"], false)
LeaPlusCB["AutoSellExcludeMyAlts"].tiptext = NoGreyTransmogCharTipText
end
end
LeaPlusCB["AutoSellNoGreyGear"]:HookScript("OnClick", SetTransmogLockFunc)
LeaPlusCB["AutoSellExcludeMyChar"]:HookScript("OnClick", SetTransmogLockFunc)
SetTransmogLockFunc()
-- Help button hidden
SellJunkFrame.h:Hide()
-- Back button handler
SellJunkFrame.b:SetScript("OnClick", function()
SellJunkFrame:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page1"]:Show();
return
end)
-- Reset button handler
SellJunkFrame.r.tiptext = SellJunkFrame.r.tiptext .. "|n|n" .. L["Note that this will not reset your exclusions list."]
SellJunkFrame.r:SetScript("OnClick", function()
-- Reset checkboxes
LeaPlusLC["AutoSellShowSummary"] = "On"
LeaPlusLC["AutoSellNoKeeperTahult"] = "On"
LeaPlusLC["AutoSellNoGreyGear"] = "Off"
LeaPlusLC["AutoSellExcludeMyChar"] = "On"; SetTransmogLockFunc() -- Must be after AutoSellNoGreyGear
LeaPlusLC["AutoSellExcludeMyAlts"] = "On"; SetTransmogLockFunc() -- Must be after AutoSellNoGreyGear
-- Refresh panel
SellJunkFrame:Hide(); SellJunkFrame:Show()
end)
-- Show panal when options panel button is clicked
LeaPlusCB["AutoSellJunkBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["AutoSellShowSummary"] = "On"
LeaPlusLC["AutoSellNoKeeperTahult"] = "On"
LeaPlusLC["AutoSellNoGreyGear"] = "Off"
LeaPlusLC["AutoSellExcludeMyChar"] = "On"; SetTransmogLockFunc() -- Must be after AutoSellNoGreyGear
LeaPlusLC["AutoSellExcludeMyAlts"] = "Off"; SetTransmogLockFunc() -- Must be after AutoSellNoGreyGear
else
SellJunkFrame:Show()
LeaPlusLC:HideFrames()
end
end)
-- Function to stop selling
local function StopSelling()
if SellJunkTicker then SellJunkTicker._cancelled = true; end
StartMsg:Hide()
SellJunkFrame:UnregisterEvent("ITEM_LOCKED")
SellJunkFrame:UnregisterEvent("UI_ERROR_MESSAGE")
end
-- Create excluded box
local titleTX = LeaPlusLC:MakeTx(SellJunkFrame, "Exclusions", 356, -72)
titleTX:SetWidth(200)
titleTX:SetWordWrap(false)
titleTX:SetJustifyH("LEFT")
-- Show help button for exclusions
LeaPlusLC:CreateHelpButton("SellJunkExcludeHelpButton", SellJunkFrame, titleTX, "Enter item IDs separated by commas. Item IDs can be found in item tooltips while this panel is showing.|n|nJunk items entered here will not be sold automatically.|n|nWhite items entered here will be sold automatically.|n|nThe editbox tooltip will show you more information about the items you have entered.")
local eb = CreateFrame("Frame", nil, SellJunkFrame, "BackdropTemplate")
eb:SetSize(200, 180)
eb:SetPoint("TOPLEFT", 350, -92)
eb:SetBackdrop({
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
edgeFile = "Interface\\PVPFrame\\UI-Character-PVP-Highlight",
edgeSize = 16,
insets = {left = 8, right = 6, top = 8, bottom = 8},
})
eb:SetBackdropBorderColor(1.0, 0.85, 0.0, 0.5)
eb.scroll = CreateFrame("ScrollFrame", nil, eb, "UIPanelScrollFrameTemplate")
eb.scroll:SetPoint("TOPLEFT", eb, 12, -10)
eb.scroll:SetPoint("BOTTOMRIGHT", eb, -30, 10)
eb.Text = CreateFrame("EditBox", nil, eb)
eb.Text:SetMultiLine(true)
eb.Text:SetWidth(150)
eb.Text:SetPoint("TOPLEFT", eb.scroll)
eb.Text:SetPoint("BOTTOMRIGHT", eb.scroll)
eb.Text:SetMaxLetters(600)
eb.Text:SetFontObject(GameFontNormalLarge)
eb.Text:SetAutoFocus(false)
eb.Text:SetScript("OnEscapePressed", function(self) self:ClearFocus() end)
eb.scroll:SetScrollChild(eb.Text)
-- Set focus on the editbox text when clicking the editbox
eb:SetScript("OnMouseDown", function()
eb.Text:SetFocus()
eb.Text:SetCursorPosition(eb.Text:GetMaxLetters())
end)
-- Function to create whitelist
local whiteList = {}
local function UpdateWhiteList()
wipe(whiteList)
-- Keeper Ta'hult's pet items
if LeaPlusLC["AutoSellNoKeeperTahult"] == "On" then
-- Debug
-- whiteList[2219] = "Small White Shield"
-- whiteList[1820] = "Wooden Maul"
-- whiteList[1796] = "Rawhide Boots"
-- whiteList[2783] = "Shoddy Blunderbuss"
-- Ruby Baubleworm
whiteList[36812] = "Ground Gear"
whiteList[62072] = "Robbles Wobbly Staff"
whiteList[67410] = "Very Unlucky Rock"
-- Topaz Baubleworm
whiteList[11406] = "Rotting Bear Carcass"
whiteList[11944] = "Dark Iron Baby Booties"
whiteList[25402] = "The Stoppable Force"
-- Turquoise Baubleworm
whiteList[3300] = "Rabbits Foot"
whiteList[3670] = "Large Slimy Bone"
whiteList[6150] = "A Frayed Knot"
end
-- These items cannot be sold but the game thinks they can be
-- https://www.wowhead.com/items/quest/min-level:1/max-level:1/quality:0?filter=64;3;1
-- Continued Waygate Exploration
whiteList[200590] = "Carefully Rolled Message"
whiteList[200593] = "Sealed Expedition Note"
whiteList[200594] = "Thaelin's Second Favorite Comb"
whiteList[200595] = "Odorous Parchment"
whiteList[200596] = "Letter from Thaelin Darkanvil"
-- Dirty Old Satchel
whiteList[200592] = "Dirty Old Satchel"
whiteList[200606] = "Previously Owned Map"
-- End of whitelist
local whiteString = eb.Text:GetText()
if whiteString and whiteString ~= "" then
whiteString = whiteString:gsub("[^,%d]", "")
local tList = {strsplit(",", whiteString)}
for i = 1, #tList do
if tList[i] then
tList[i] = tonumber(tList[i])
if tList[i] then
whiteList[tList[i]] = true
end
end
end
end
LeaPlusLC["AutoSellExcludeList"] = whiteString
eb.Text:SetText(LeaPlusLC["AutoSellExcludeList"])
end
-- Save the excluded list when it changes and at startup
eb.Text:SetScript("OnTextChanged", UpdateWhiteList)
eb.Text:SetText(LeaPlusLC["AutoSellExcludeList"])
UpdateWhiteList()
-- Create whitelist on startup and option, reset or preset is clicked
UpdateWhiteList()
LeaPlusCB["AutoSellNoKeeperTahult"]:HookScript("OnClick", UpdateWhiteList)
SellJunkFrame.r:HookScript("OnClick", UpdateWhiteList)
LeaPlusCB["AutoSellJunkBtn"]:HookScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile (just the whitelist part)
UpdateWhiteList()
end
end)
-- Editbox tooltip
local tipPrefix = ""
-- Function to make tooltip string
local function MakeTooltipString()
local keepMsg = ""
local sellMsg = ""
local dupMsg = ""
local novalueMsg = ""
local incompatMsg = ""
local tipString = eb.Text:GetText()
if tipString and tipString ~= "" then
tipString = tipString:gsub("[^,%d]", "")
local tipList = {strsplit(",", tipString)}
for i = 1, #tipList do
if tipList[i] then
tipList[i] = tonumber(tipList[i])
if tipList[i] and tipList[i] > 0 and tipList[i] < 999999999 then
local void, tLink, Rarity, void, void, void, void, void, void, void, ItemPrice = GetItemInfo(tipList[i])
if tLink and tLink ~= "" then
local linkCol = string.sub(tLink, 1, 10)
if linkCol then
local linkName = tLink:match("%[(.-)%]")
if linkName and ItemPrice then
if ItemPrice > 0 then
if Rarity == 0 then
-- Junk item
if string.find(keepMsg, "%(" .. tipList[i] .. "%)") then
-- Duplicate (ID appears more than once in list)
dupMsg = dupMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n"
else
-- Add junk item to keep list
keepMsg = keepMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n"
end
elseif Rarity == 1 then
-- White item
if string.find(sellMsg, "%(" .. tipList[i] .. "%)") then
-- Duplicate (ID appears more than once in list)
dupMsg = dupMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n"
else
-- Add non-junk item to sell list
sellMsg = sellMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n"
end
else
-- Incompatible item (not junk or white)
if string.find(incompatMsg, "%(" .. tipList[i] .. "%)") then
-- Duplicate (ID appears more than once in list)
dupMsg = dupMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n"
else
-- Add item to incompatible list
incompatMsg = incompatMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n"
end
end
else
-- Item has no sell price so cannot be sold
if string.find(novalueMsg, "%(" .. tipList[i] .. "%)") then
-- Duplicate (ID appears more than once in list)
dupMsg = dupMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n"
else
-- Add item to cannot be sold list
novalueMsg = novalueMsg .. linkCol .. linkName .. " (" .. tipList[i] .. ")" .. "|r|n"
end
end
end
end
end
end
end
end
end
if keepMsg ~= "" then keepMsg = "|n" .. L["Keep"] .. "|n" .. keepMsg end
if sellMsg ~= "" then sellMsg = "|n" .. L["Sell"] .. "|n" .. sellMsg end
if dupMsg ~= "" then dupMsg = "|n" .. L["Duplicates"] .. "|n" .. dupMsg end
if novalueMsg ~= "" then novalueMsg = "|n" .. L["Cannot be sold"] .. "|n" .. novalueMsg end
if incompatMsg ~= "" then incompatMsg = "|n" .. L["Incompatible"] .. "|n" .. incompatMsg end
eb.tiptext = L["Exclusions"] .. "|n" .. keepMsg .. sellMsg .. dupMsg .. novalueMsg .. incompatMsg
eb.Text.tiptext = L["Exclusions"] .. "|n" .. keepMsg .. sellMsg .. dupMsg .. novalueMsg .. incompatMsg
if eb.tiptext == L["Exclusions"] .. "|n" then eb.tiptext = eb.tiptext .. "|n" .. L["Nothing to see here."] end
if eb.Text.tiptext == L["Exclusions"] .. "|n" then eb.Text.tiptext = "-" end
if GameTooltip:IsShown() then
if MouseIsOver(eb) or MouseIsOver(eb.Text) then
GameTooltip:SetText(eb.tiptext, nil, nil, nil, nil, false)
end
end
end
eb.Text:HookScript("OnTextChanged", MakeTooltipString)
eb.Text:HookScript("OnTextChanged", function()
C_Timer.After(0.1, function()
MakeTooltipString()
end)
end)
-- Show the button tooltip for the editbox
eb:SetScript("OnEnter", MakeTooltipString)
eb:HookScript("OnEnter", LeaPlusLC.TipSee)
eb:HookScript("OnEnter", function() GameTooltip:SetText(eb.tiptext, nil, nil, nil, nil, false) end)
eb:SetScript("OnLeave", GameTooltip_Hide)
eb.Text:SetScript("OnEnter", MakeTooltipString)
eb.Text:HookScript("OnEnter", LeaPlusLC.ShowDropTip)
eb.Text:HookScript("OnEnter", function() GameTooltip:SetText(eb.tiptext, nil, nil, nil, nil, false) end)
eb.Text:SetScript("OnLeave", GameTooltip_Hide)
-- Show item ID in item tooltips while configuration panel is showing
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Item, function(self)
if self ~= GameTooltip then return end
if SellJunkFrame:IsShown() then
local void, itemLink = self:GetItem()
if itemLink then
local itemID = GetItemInfoFromHyperlink(itemLink)
if itemID then self:AddLine(L["Item ID"] .. ": " .. itemID) end
end
end
end)
-- Vendor function
local function SellJunkFunc()
-- Variables
local SoldCount, Rarity, ItemPrice = 0, 0, 0
local CurrentItemLink, classID, void
local itemTypeWeapon = Enum.ItemClass.Weapon
local itemTypeArmor = Enum.ItemClass.Armor
-- Traverse bags and sell grey items
for BagID = 0, 5 do
for BagSlot = 1, C_Container.GetContainerNumSlots(BagID) do
CurrentItemLink = C_Container.GetContainerItemLink(BagID, BagSlot)
if CurrentItemLink then
void, void, Rarity, void, void, void, void, void, void, void, ItemPrice, classID = GetItemInfo(CurrentItemLink)
-- Don't sell whitelisted items
local itemID = GetItemInfoFromHyperlink(CurrentItemLink)
if itemID and whiteList[itemID] then
if Rarity == 0 then
-- Junk item to keep
Rarity = 20
ItemPrice = 0
elseif Rarity == 1 then
-- White item to sell
Rarity = 0
end
end
-- Exclude grey gear
if Rarity == 0 and classID and (classID == itemTypeWeapon or classID == itemTypeArmor) then -- Weapon or armor
local isSoulBound = C_Item.IsBound(ItemLocation:CreateFromBagAndSlot(BagID, BagSlot))
if not isSoulBound then
-- Item is not soulbound (soulbound gear cannot be sold to others and will not have a learnable appearance)
if LeaPlusLC["AutoSellNoGreyGear"] == "On" then
-- Exclude all grey gear is checked so do not sell
Rarity = 20
ItemPrice = 0
else
-- Exclude uncollected grey gear (exclude all grey gear is off)
if LeaPlusLC["AutoSellExcludeMyChar"] == "On" or LeaPlusLC["AutoSellExcludeMyAlts"] == "On" then
local appearanceID, sourceID = C_TransmogCollection.GetItemInfo(itemID)
if sourceID then
local void, void, void, void, isCollected = C_TransmogCollection.GetAppearanceSourceInfo(sourceID)
local hasItemData, canCollect = C_TransmogCollection.PlayerCanCollectSource(sourceID)
if not isCollected then
-- Item is not collected at all
if not canCollect then
if LeaPlusLC["AutoSellExcludeMyAlts"] == "On" then
-- Gear is designed for my alts and exclude gear designed for my alts is checked so do not sell
Rarity = 20
ItemPrice = 0
end
elseif LeaPlusLC["AutoSellExcludeMyChar"] == "On" then
-- Gear is designed for my character and exclude gear designed for my character is checked so do not sell
Rarity = 20
ItemPrice = 0
end
end
end
end
end
end
end
-- Continue
local cInfo = C_Container.GetContainerItemInfo(BagID, BagSlot)
local itemCount = cInfo.stackCount
if Rarity == 0 and ItemPrice ~= 0 then
SoldCount = SoldCount + 1
if MerchantFrame:IsShown() then
-- If merchant frame is open, vendor the item
C_Container.UseContainerItem(BagID, BagSlot)
-- Perform actions on first iteration
if SellJunkTicker._remainingIterations == IterationCount then
-- Calculate total price
totalPrice = totalPrice + (ItemPrice * itemCount)
end
else
-- If merchant frame is not open, stop selling
StopSelling()
return
end
end
end
end
end
-- Stop selling if no items were sold for this iteration or iteration limit was reached
if SoldCount == 0 or SellJunkTicker and SellJunkTicker._remainingIterations == 1 then
StopSelling()
if totalPrice > 0 and LeaPlusLC["AutoSellShowSummary"] == "On" then
LeaPlusLC:Print(L["Sold junk for"] .. " " .. GetCoinText(totalPrice) .. ".")
end
end
end
-- Event handler
SellJunkFrame:RegisterEvent("MERCHANT_SHOW")
SellJunkFrame:RegisterEvent("MERCHANT_CLOSED")
SellJunkFrame:SetScript("OnEvent", function(self, event, arg1)
if event == "MERCHANT_SHOW" then
-- Check for vendors that refuse to buy items
SellJunkFrame:RegisterEvent("UI_ERROR_MESSAGE")
-- Reset variable
totalPrice = 0
-- Do nothing if shift key is held down
if IsShiftKeyDown() then return end
-- Cancel existing ticker if present
if SellJunkTicker then SellJunkTicker._cancelled = true; end
-- Sell grey items using ticker (ends when all grey items are sold or iteration count reached)
SellJunkTicker = LeaPlusNewTicker(0.2, SellJunkFunc, IterationCount)
SellJunkFrame:RegisterEvent("ITEM_LOCKED")
elseif event == "ITEM_LOCKED" then
StartMsg:Show()
SellJunkFrame:UnregisterEvent("ITEM_LOCKED")
elseif event == "MERCHANT_CLOSED" then
-- If merchant frame is closed, stop selling
StopSelling()
elseif event == "UI_ERROR_MESSAGE" then
if arg1 == 46 then
StopSelling() -- Vendor refuses to buy items
elseif arg1 == 635 then
StopSelling() -- At gold limit
end
end
end)
end
----------------------------------------------------------------------
-- Repair automatically (no reload required)
----------------------------------------------------------------------
do
-- Repair when suitable merchant frame is shown
local function RepairFunc()
if IsShiftKeyDown() then return end
if CanMerchantRepair() then -- If merchant is capable of repair
-- Process repair
local RepairCost, CanRepair = GetRepairAllCost()
if CanRepair then -- If merchant is offering repair
if LeaPlusLC["AutoRepairGuildFunds"] == "On" and IsInGuild() then
-- Guilded character and guild repair option is enabled
if CanGuildBankRepair() then
-- Character has permission to repair so try guild funds but fallback on character funds (if daily gold limit is reached)
RepairAllItems(1)
RepairAllItems()
else
-- Character does not have permission to repair so use character funds
RepairAllItems()
end
else
-- Unguilded character or guild repair option is disabled
RepairAllItems()
end
-- Show cost summary
if LeaPlusLC["AutoRepairShowSummary"] == "On" then
LeaPlusLC:Print(L["Repaired for"] .. " " .. GetCoinText(RepairCost) .. ".")
end
end
end
end
-- Create event frame
local RepairFrame = CreateFrame("FRAME")
-- Function to setup event
local function SetupEvent()
if LeaPlusLC["AutoRepairGear"] == "On" then
RepairFrame:RegisterEvent("MERCHANT_SHOW")
else
RepairFrame:UnregisterEvent("MERCHANT_SHOW")
end
end
-- Setup event when option is clicked and on startup (if option is enabled)
LeaPlusCB["AutoRepairGear"]:HookScript("OnClick", SetupEvent)
if LeaPlusLC["AutoRepairGear"] == "On" then SetupEvent() end
-- Event handler
RepairFrame:SetScript("OnEvent", RepairFunc)
-- Create configuration panel
local RepairPanel = LeaPlusLC:CreatePanel("Repair automatically", "RepairPanel")
LeaPlusLC:MakeTx(RepairPanel, "Settings", 16, -72)
LeaPlusLC:MakeCB(RepairPanel, "AutoRepairGuildFunds", "Repair using guild funds if available", 16, -92, false, "If checked, repair costs will be taken from guild funds for characters that are guilded and have permission to repair.")
LeaPlusLC:MakeCB(RepairPanel, "AutoRepairShowSummary", "Show repair summary in chat", 16, -112, false, "If checked, a repair summary will be shown in chat when your gear is automatically repaired.")
-- Help button hidden
RepairPanel.h:Hide()
-- Back button handler
RepairPanel.b:SetScript("OnClick", function()
RepairPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page1"]:Show();
return
end)
-- Reset button handler
RepairPanel.r:SetScript("OnClick", function()
-- Reset checkboxes
LeaPlusLC["AutoRepairGuildFunds"] = "On"
LeaPlusLC["AutoRepairShowSummary"] = "On"
-- Refresh panel
RepairPanel:Hide(); RepairPanel:Show()
end)
-- Show panal when options panel button is clicked
LeaPlusCB["AutoRepairBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["AutoRepairGuildFunds"] = "On"
LeaPlusLC["AutoRepairShowSummary"] = "On"
else
RepairPanel:Show()
LeaPlusLC:HideFrames()
end
end)
end
----------------------------------------------------------------------
-- Hide the combat log
----------------------------------------------------------------------
if LeaPlusLC["NoCombatLogTab"] == "On" and not LeaLockList["NoCombatLogTab"] then
-- Ensure combat log is docked
if ChatFrame2.isDocked then
-- Set combat log attributes when chat windows are updated
LpEvt:RegisterEvent("UPDATE_CHAT_WINDOWS")
-- Set combat log tab placement when tabs are assigned by the client
hooksecurefunc("FCF_SetTabPosition", function()
ChatFrame2Tab:SetPoint("BOTTOMLEFT", ChatFrame1Tab, "BOTTOMRIGHT", 0, 0)
end)
else
-- If combat log is undocked, do nothing but show warning
C_Timer.After(1, function()
LeaPlusLC:Print("Combat log cannot be hidden while undocked.")
end)
end
end
----------------------------------------------------------------------
-- Show player chain
----------------------------------------------------------------------
if LeaPlusLC["ShowPlayerChain"] == "On" and not LeaLockList["ShowPlayerChain"] then
-- Ensure chain doesnt clip through pet portrait and rune frame
PetPortrait:GetParent():SetFrameLevel(4)
RuneFrame:SetFrameLevel(4)
-- Create chain texture
local playerChain = PlayerFrame.PlayerFrameContainer:CreateTexture(nil, "OVERLAY")
playerChain:SetTexCoord(1, 0, 0, 1)
-- Create configuration panel
local ChainPanel = LeaPlusLC:CreatePanel("Show player chain", "ChainPanel")
-- Add dropdown menu
LeaPlusLC:CreateDropDown("PlayerChainMenu", "Chain style", ChainPanel, 146, "TOPLEFT", 16, -112, {L["ELITE"], L["BOSS"], L["RARE"]}, "")
-- Set chain style
local function SetChainStyle()
-- Get dropdown menu value
local chain = LeaPlusLC["PlayerChainMenu"] -- Numeric value
-- Set chain style according to value
if chain == 1 then -- Elite (Gold)
playerChain:SetAtlas("UI-HUD-UnitFrame-Target-PortraitOn-Boss-Gold", true)
playerChain:ClearAllPoints()
playerChain:SetPoint("TOPLEFT", 8, -9)
playerChain:SetVertexColor(1, 1, 1, 1)
elseif chain == 2 then -- Boss (Gold Winged)
playerChain:SetAtlas("UI-HUD-UnitFrame-Target-PortraitOn-Boss-Gold-Winged", true)
playerChain:ClearAllPoints()
playerChain:SetPoint("TOPLEFT", -11, -8)
playerChain:SetVertexColor(1, 1, 1, 1)
elseif chain == 3 then -- Rare (Silver)
playerChain:SetAtlas("UI-HUD-UnitFrame-Target-PortraitOn-Boss-Rare-Silver", true)
playerChain:ClearAllPoints()
playerChain:SetPoint("TOPLEFT", 8, -9)
playerChain:SetVertexColor(1, 1, 1, 1)
end
end
-- Set style on startup
SetChainStyle()
-- Set style when a drop menu is selected (procs when the list is hidden)
LeaPlusCB["ListFramePlayerChainMenu"]:HookScript("OnHide", SetChainStyle)
-- Help button hidden
ChainPanel.h:Hide()
-- Back button handler
ChainPanel.b:SetScript("OnClick", function()
LeaPlusCB["ListFramePlayerChainMenu"]:Hide() -- Hide the dropdown list
ChainPanel:Hide();
LeaPlusLC["PageF"]:Show()
LeaPlusLC["Page5"]:Show()
return
end)
-- Reset button handler
ChainPanel.r:SetScript("OnClick", function()
LeaPlusCB["ListFramePlayerChainMenu"]:Hide() -- Hide the dropdown list
LeaPlusLC["PlayerChainMenu"] = 1
ChainPanel:Hide(); ChainPanel:Show()
SetChainStyle()
end)
-- Show the panel when the configuration button is clicked
LeaPlusCB["ModPlayerChain"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
LeaPlusLC["PlayerChainMenu"] = 1
SetChainStyle()
else
LeaPlusLC:HideFrames()
ChainPanel:Show()
end
end)
end
----------------------------------------------------------------------
-- Show raid frame toggle button
----------------------------------------------------------------------
if LeaPlusLC["ShowRaidToggle"] == "On" and not LeaLockList["ShowRaidToggle"] then
-- Check to make sure raid toggle button exists
if CompactRaidFrameManagerDisplayFrameHiddenModeToggle then
-- Create a border for the button
local cBackdrop = CreateFrame("Frame", nil, CompactRaidFrameManagerDisplayFrameHiddenModeToggle, "BackdropTemplate")
cBackdrop:SetAllPoints()
cBackdrop.backdropInfo = {edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = {left = 0, right = 0, top = 0, bottom = 0}}
cBackdrop:ApplyBackdrop()
-- Move the button (function runs after PLAYER_ENTERING_WORLD and PARTY_LEADER_CHANGED)
hooksecurefunc("CompactRaidFrameManager_UpdateOptionsFlowContainer", function()
if CompactRaidFrameManager and CompactRaidFrameManagerDisplayFrameHiddenModeToggle then
local void, void, void, void, y = CompactRaidFrameManager:GetPoint()
CompactRaidFrameManagerDisplayFrameHiddenModeToggle:SetWidth(40)
CompactRaidFrameManagerDisplayFrameHiddenModeToggle:ClearAllPoints()
CompactRaidFrameManagerDisplayFrameHiddenModeToggle:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 0, y + 22)
CompactRaidFrameManagerDisplayFrameHiddenModeToggle:SetParent(UIParent)
end
end)
end
end
----------------------------------------------------------------------
-- Hide hit indicators (portrait text)
----------------------------------------------------------------------
if LeaPlusLC["NoHitIndicators"] == "On" and not LeaLockList["NoHitIndicators"] then
hooksecurefunc(PlayerHitIndicator, "Show", PlayerHitIndicator.Hide)
hooksecurefunc(PetHitIndicator, "Show", PetHitIndicator.Hide)
end
----------------------------------------------------------------------
-- Class colored frames
----------------------------------------------------------------------
if LeaPlusLC["ClassColFrames"] == "On" and not LeaLockList["ClassColFrames"] then
-- Create background frame for player frame
local PlayFN = PlayerFrame.PlayerFrameContent.PlayerFrameContentMain:CreateTexture(nil, "BACKGROUND")
PlayFN:SetAtlas("UI-HUD-UnitFrame-Target-PortraitOn-Type", true)
PlayFN:SetTexCoord(1, 0, 0, 1)
PlayFN:ClearAllPoints()
PlayFN:SetPoint("TOPLEFT", 75, -25)
local c = LeaPlusLC["RaidColors"][select(2, UnitClass("player"))]
if c then PlayFN:SetVertexColor(c.r, c.g, c.b) end
-- Create color function for target and focus frames
local function TargetFrameCol()
if UnitIsPlayer("target") then
local c = LeaPlusLC["RaidColors"][select(2, UnitClass("target"))]
if c then TargetFrame.TargetFrameContent.TargetFrameContentMain.ReputationColor:SetVertexColor(c.r, c.g, c.b) end
end
if UnitIsPlayer("focus") then
local c = LeaPlusLC["RaidColors"][select(2, UnitClass("focus"))]
if c then FocusFrame.TargetFrameContent.TargetFrameContentMain.ReputationColor:SetVertexColor(c.r, c.g, c.b) end
end
end
local ColTar = CreateFrame("FRAME")
ColTar:SetScript("OnEvent", TargetFrameCol) -- Events are registered if target option is enabled
-- Refresh color if focus frame size changes
if FocusFrame_SetSmallSize then
hooksecurefunc(FocusFrame, "SetSmallSize", function()
if LeaPlusLC["ClassColTarget"] == "On" then
TargetFrameCol()
end
end)
end
-- Create configuration panel
local ClassFrame = LeaPlusLC:CreatePanel("Class colored frames", "ClassFrame")
LeaPlusLC:MakeTx(ClassFrame, "Settings", 16, -72)
LeaPlusLC:MakeCB(ClassFrame, "ClassColPlayer", "Show player frame in class color", 16, -92, false, "If checked, the player frame background will be shown in class color.")
LeaPlusLC:MakeCB(ClassFrame, "ClassColTarget", "Show target frame and focus frame in class color", 16, -112, false, "If checked, the target frame background and focus frame background will be shown in class color.")
-- Help button hidden
ClassFrame.h:Hide()
-- Back button handler
ClassFrame.b:SetScript("OnClick", function()
ClassFrame:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show()
return
end)
-- Function to set class colored frames
local function SetClassColFrames()
-- Player frame
if LeaPlusLC["ClassColPlayer"] == "On" then
PlayFN:Show()
else
PlayFN:Hide()
end
-- Target and focus frames
if LeaPlusLC["ClassColTarget"] == "On" then
ColTar:RegisterEvent("GROUP_ROSTER_UPDATE")
ColTar:RegisterEvent("PLAYER_TARGET_CHANGED")
ColTar:RegisterEvent("PLAYER_FOCUS_CHANGED")
ColTar:RegisterEvent("UNIT_FACTION")
TargetFrameCol()
else
ColTar:UnregisterAllEvents()
TargetFrame.CheckFaction(TargetFrame) -- Reset target frame colors
TargetFrame.CheckFaction(FocusFrame) -- Reset focus frame colors
end
end
-- Run function when options are clicked and on startup
LeaPlusCB["ClassColPlayer"]:HookScript("OnClick", SetClassColFrames)
LeaPlusCB["ClassColTarget"]:HookScript("OnClick", SetClassColFrames)
SetClassColFrames()
-- Reset button handler
ClassFrame.r:SetScript("OnClick", function()
-- Reset checkboxes
LeaPlusLC["ClassColPlayer"] = "On"
LeaPlusLC["ClassColTarget"] = "On"
-- Update colors and refresh configuration panel
SetClassColFrames()
ClassFrame:Hide(); ClassFrame:Show()
end)
-- Show configuration panal when options panel button is clicked
LeaPlusCB["ClassColFramesBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["ClassColPlayer"] = "On"
LeaPlusLC["ClassColTarget"] = "On"
SetClassColFrames()
else
ClassFrame:Show()
LeaPlusLC:HideFrames()
end
end)
end
----------------------------------------------------------------------
-- Quest text size
----------------------------------------------------------------------
if LeaPlusLC["QuestFontChange"] == "On" then
-- Create configuration panel
local QuestTextPanel = LeaPlusLC:CreatePanel("Resize quest text", "QuestTextPanel")
LeaPlusLC:MakeTx(QuestTextPanel, "Text size", 16, -72)
LeaPlusLC:MakeSL(QuestTextPanel, "LeaPlusQuestFontSize", "Drag to set the font size of quest text.", 10, 30, 1, 16, -92, "%.0f")
-- Function to update the font size
local function QuestSizeUpdate()
local a, b, c = QuestFont:GetFont()
QuestTitleFont:SetFont(a, LeaPlusLC["LeaPlusQuestFontSize"] + 3, c)
QuestFont:SetFont(a, LeaPlusLC["LeaPlusQuestFontSize"] + 1, c)
local d, e, f = QuestFontNormalSmall:GetFont()
QuestFontNormalSmall:SetFont(d, LeaPlusLC["LeaPlusQuestFontSize"], f)
end
-- Set text size when slider changes and on startup
LeaPlusCB["LeaPlusQuestFontSize"]:HookScript("OnValueChanged", QuestSizeUpdate)
QuestSizeUpdate()
-- Help button hidden
QuestTextPanel.h:Hide()
-- Back button handler
QuestTextPanel.b:SetScript("OnClick", function()
QuestTextPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page4"]:Show()
return
end)
-- Reset button handler
QuestTextPanel.r:SetScript("OnClick", function()
-- Reset slider
LeaPlusLC["LeaPlusQuestFontSize"] = 12
QuestSizeUpdate()
-- Refresh side panel
QuestTextPanel:Hide(); QuestTextPanel:Show()
end)
-- Show configuration panal when options panel button is clicked
LeaPlusCB["QuestTextBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["LeaPlusQuestFontSize"] = 18
QuestSizeUpdate()
else
QuestTextPanel:Show()
LeaPlusLC:HideFrames()
end
end)
end
----------------------------------------------------------------------
-- Resize mail text
----------------------------------------------------------------------
if LeaPlusLC["MailFontChange"] == "On" then
-- Create configuration panel
local MailTextPanel = LeaPlusLC:CreatePanel("Resize mail text", "MailTextPanel")
LeaPlusLC:MakeTx(MailTextPanel, "Text size", 16, -72)
LeaPlusLC:MakeSL(MailTextPanel, "LeaPlusMailFontSize", "Drag to set the font size of mail text.", 10, 30, 1, 16, -92, "%.0f")
-- Function to set the text size
local function MailSizeUpdate()
local MailFont, void, flags = QuestFont:GetFont()
OpenMailBodyText:SetFont("h1", MailFont, LeaPlusLC["LeaPlusMailFontSize"], flags)
OpenMailBodyText:SetFont("h2", MailFont, LeaPlusLC["LeaPlusMailFontSize"], flags)
OpenMailBodyText:SetFont("h3", MailFont, LeaPlusLC["LeaPlusMailFontSize"], flags)
OpenMailBodyText:SetFont("p", MailFont, LeaPlusLC["LeaPlusMailFontSize"], flags)
SendMailBodyEditBox:SetFont(MailFont, LeaPlusLC["LeaPlusMailFontSize"], flags)
end
-- Set text size after changing slider and on startup
LeaPlusCB["LeaPlusMailFontSize"]:HookScript("OnValueChanged", MailSizeUpdate)
MailSizeUpdate()
-- Help button hidden
MailTextPanel.h:Hide()
-- Back button handler
MailTextPanel.b:SetScript("OnClick", function()
MailTextPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page4"]:Show()
return
end)
-- Reset button handler
MailTextPanel.r:SetScript("OnClick", function()
-- Reset slider
LeaPlusLC["LeaPlusMailFontSize"] = 15
-- Refresh side panel
MailTextPanel:Hide(); MailTextPanel:Show()
end)
-- Show configuration panal when options panel button is clicked
LeaPlusCB["MailTextBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["LeaPlusMailFontSize"] = 22
MailSizeUpdate()
else
MailTextPanel:Show()
LeaPlusLC:HideFrames()
end
end)
end
----------------------------------------------------------------------
-- Show durability status
----------------------------------------------------------------------
if LeaPlusLC["DurabilityStatus"] == "On" then
-- Create durability button
local cButton = CreateFrame("BUTTON", nil, PaperDollFrame)
cButton:ClearAllPoints()
cButton:SetPoint("BOTTOMRIGHT", CharacterFrameInset, "BOTTOMRIGHT", -2, -1)
cButton:SetNormalTexture("Interface\\Buttons\\UI-SpellbookIcon-PrevPage-Up")
cButton:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight")
cButton:SetSize(32, 32)
-- Create durability tables
local Slots = {"HeadSlot", "ShoulderSlot", "ChestSlot", "WristSlot", "HandsSlot", "WaistSlot", "LegsSlot", "FeetSlot", "MainHandSlot", "SecondaryHandSlot"}
local SlotsFriendly = {INVTYPE_HEAD, INVTYPE_SHOULDER, INVTYPE_CHEST, INVTYPE_WRIST, INVTYPE_HAND, INVTYPE_WAIST, INVTYPE_LEGS, INVTYPE_FEET, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND}
-- Show durability status in tooltip or status line (tip or status)
local function ShowDuraStats(where)
local duravaltotal, duramaxtotal, durapercent = 0, 0, 0
local valcol, id, duraval, duramax
if where == "tip" then
-- Creare layout
GameTooltip:AddLine("|cffffffff")
GameTooltip:AddLine("|cffffffff")
GameTooltip:AddLine("|cffffffff")
_G["GameTooltipTextLeft1"]:SetText("|cffffffff"); _G["GameTooltipTextRight1"]:SetText("|cffffffff")
_G["GameTooltipTextLeft2"]:SetText("|cffffffff"); _G["GameTooltipTextRight2"]:SetText("|cffffffff")
_G["GameTooltipTextLeft3"]:SetText("|cffffffff"); _G["GameTooltipTextRight3"]:SetText("|cffffffff")
end
local validItems = false
-- Traverse equipment slots
for k, slotName in ipairs(Slots) do
if GetInventorySlotInfo(slotName) then
id = GetInventorySlotInfo(slotName)
duraval, duramax = GetInventoryItemDurability(id)
if duraval ~= nil then
-- At least one item has durability stat
validItems = true
-- Add to tooltip
if where == "tip" then
durapercent = tonumber(format("%.0f", duraval / duramax * 100))
valcol = (durapercent >= 80 and "|cff00FF00") or (durapercent >= 60 and "|cff99FF00") or (durapercent >= 40 and "|cffFFFF00") or (durapercent >= 20 and "|cffFF9900") or (durapercent >= 0 and "|cffFF2000") or ("|cffFFFFFF")
_G["GameTooltipTextLeft1"]:SetText(L["Durability"])
_G["GameTooltipTextLeft2"]:SetText(_G["GameTooltipTextLeft2"]:GetText() .. SlotsFriendly[k] .. "|n")
_G["GameTooltipTextRight2"]:SetText(_G["GameTooltipTextRight2"]:GetText() .. valcol .. durapercent .. "%" .. "|n")
end
duravaltotal = duravaltotal + duraval
duramaxtotal = duramaxtotal + duramax
end
end
end
if duravaltotal > 0 and duramaxtotal > 0 then
durapercent = duravaltotal / duramaxtotal * 100
else
durapercent = 0
end
if where == "tip" then
if validItems == true then
-- Show overall durability in the tooltip
if durapercent >= 80 then valcol = "|cff00FF00" elseif durapercent >= 60 then valcol = "|cff99FF00" elseif durapercent >= 40 then valcol = "|cffFFFF00" elseif durapercent >= 20 then valcol = "|cffFF9900" elseif durapercent >= 0 then valcol = "|cffFF2000" else return end
_G["GameTooltipTextLeft3"]:SetText(L["Overall"] .. " " .. valcol)
_G["GameTooltipTextRight3"]:SetText(valcol .. string.format("%.0f", durapercent) .. "%")
-- Show lines of the tooltip
GameTooltipTextLeft1:Show(); GameTooltipTextRight1:Show()
GameTooltipTextLeft2:Show(); GameTooltipTextRight2:Show()
GameTooltipTextLeft3:Show(); GameTooltipTextRight3:Show()
GameTooltipTextRight2:SetJustifyH"RIGHT";
GameTooltipTextRight3:SetJustifyH"RIGHT";
GameTooltip:Show()
else
-- No items have durability stat
GameTooltip:ClearLines()
GameTooltip:AddLine("" .. L["Durability"],1.0, 0.85, 0.0)
GameTooltip:AddLine("" .. L["No items with durability equipped."], 1, 1, 1)
GameTooltip:Show()
end
elseif where == "status" then
if validItems == true then
-- Show simple status line instead
if tonumber(durapercent) >= 0 then -- Ensure character has some durability items equipped
LeaPlusLC:Print(L["You have"] .. " " .. string.format("%.0f", durapercent) .. "%" .. " " .. L["durability"] .. ".")
end
end
end
end
-- Hover over the durability button to show the durability tooltip
cButton:SetScript("OnEnter", function()
GameTooltip:SetOwner(cButton, "ANCHOR_RIGHT");
ShowDuraStats("tip");
end)
cButton:SetScript("OnLeave", GameTooltip_Hide)
-- Create frame to watch events
local DeathDura = CreateFrame("FRAME")
DeathDura:RegisterEvent("PLAYER_DEAD")
DeathDura:SetScript("OnEvent", function(self, event)
ShowDuraStats("status")
DeathDura:UnregisterEvent("PLAYER_DEAD")
C_Timer.After(2, function()
DeathDura:RegisterEvent("PLAYER_DEAD")
end)
end)
hooksecurefunc("AcceptResurrect", function()
-- Player has ressed without releasing
ShowDuraStats("status")
end)
end
----------------------------------------------------------------------
-- Hide zone text
----------------------------------------------------------------------
if LeaPlusLC["HideZoneText"] == "On" then
ZoneTextFrame:SetScript("OnShow", ZoneTextFrame.Hide);
SubZoneTextFrame:SetScript("OnShow", SubZoneTextFrame.Hide);
end
----------------------------------------------------------------------
-- Disable sticky chat
----------------------------------------------------------------------
if LeaPlusLC["NoStickyChat"] == "On" and not LeaLockList["NoStickyChat"] then
-- These taint if set to anything other than nil
ChatTypeInfo.WHISPER.sticky = nil
ChatTypeInfo.BN_WHISPER.sticky = nil
ChatTypeInfo.CHANNEL.sticky = nil
end
----------------------------------------------------------------------
-- Hide stance bar
----------------------------------------------------------------------
if LeaPlusLC["NoClassBar"] == "On" and not LeaLockList["NoClassBar"] then
local stancebar = CreateFrame("FRAME", nil, UIParent)
stancebar:Hide()
StanceBar:UnregisterAllEvents()
StanceBar:SetParent(stancebar)
end
----------------------------------------------------------------------
-- Disable chat fade
----------------------------------------------------------------------
if LeaPlusLC["NoChatFade"] == "On" and not LeaLockList["NoChatFade"] then
-- Process normal and existing chat frames
for i = 1, 50 do
if _G["ChatFrame" .. i] then
_G["ChatFrame" .. i]:SetFading(false)
end
end
-- Process temporary frames
hooksecurefunc("FCF_OpenTemporaryWindow", function()
local cf = FCF_GetCurrentChatFrame():GetName() or nil
if cf then
_G[cf]:SetFading(false)
end
end)
end
----------------------------------------------------------------------
-- Use easy chat frame resizing
----------------------------------------------------------------------
if LeaPlusLC["UseEasyChatResizing"] == "On" and not LeaLockList["UseEasyChatResizing"] then
ChatFrame1Tab:HookScript("OnMouseDown", function(self,arg1)
if arg1 == "LeftButton" then
if select(8, GetChatWindowInfo(1)) then
ChatFrame1:StartSizing("TOP")
end
end
end)
ChatFrame1Tab:SetScript("OnMouseUp", function(self,arg1)
if arg1 == "LeftButton" then
ChatFrame1:StopMovingOrSizing()
FCF_SavePositionAndDimensions(ChatFrame1)
end
end)
end
----------------------------------------------------------------------
-- Increase chat history
----------------------------------------------------------------------
if LeaPlusLC["MaxChatHstory"] == "On" and not LeaLockList["MaxChatHstory"] then
-- Process normal and existing chat frames
for i = 1, 50 do
if _G["ChatFrame" .. i] and _G["ChatFrame" .. i]:GetMaxLines() ~= 4096 then
_G["ChatFrame" .. i]:SetMaxLines(4096);
end
end
-- Process temporary chat frames
hooksecurefunc("FCF_OpenTemporaryWindow", function()
local cf = FCF_GetCurrentChatFrame():GetName() or nil
if cf then
if (_G[cf]:GetMaxLines() ~= 4096) then
_G[cf]:SetMaxLines(4096);
end
end
end)
end
----------------------------------------------------------------------
-- Hide error messages
----------------------------------------------------------------------
if LeaPlusLC["HideErrorMessages"] == "On" then
-- Error message events
local OrigErrHandler = UIErrorsFrame:GetScript('OnEvent')
UIErrorsFrame:SetScript('OnEvent', function (self, event, id, err, ...)
if event == "UI_ERROR_MESSAGE" then
-- Hide error messages
if LeaPlusLC["ShowErrorsFlag"] == 1 then
if err == ERR_INV_FULL or
err == ERR_QUEST_LOG_FULL or
err == ERR_RAID_GROUP_ONLY or
err == ERR_PARTY_LFG_BOOT_LIMIT or
err == ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE or
err == ERR_PARTY_LFG_BOOT_IN_COMBAT or
err == ERR_PARTY_LFG_BOOT_IN_PROGRESS or
err == ERR_PARTY_LFG_BOOT_LOOT_ROLLS or
err == ERR_PARTY_LFG_TELEPORT_IN_COMBAT or
err == ERR_PET_SPELL_DEAD or
err == ERR_PLAYER_DEAD or
err == SPELL_FAILED_TARGET_NO_POCKETS or
err == ERR_ALREADY_PICKPOCKETED or
err:find(format(ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S, ".+")) then
return OrigErrHandler(self, event, id, err, ...)
end
else
return OrigErrHandler(self, event, id, err, ...)
end
elseif event == 'UI_INFO_MESSAGE' then
-- Show information messages
return OrigErrHandler(self, event, id, err, ...)
end
end)
end
-- Release memory
LeaPlusLC.Isolated = nil
end
----------------------------------------------------------------------
-- L40: Player
----------------------------------------------------------------------
function LeaPlusLC:Player()
----------------------------------------------------------------------
-- Mute custom sounds (no reload required)
----------------------------------------------------------------------
do
-- Create configuration panel
local MuteCustomPanel = LeaPlusLC:CreatePanel("Mute custom sounds", "MuteCustomPanel")
local titleTX = LeaPlusLC:MakeTx(MuteCustomPanel, "Editor", 16, -72)
titleTX:SetWidth(534)
titleTX:SetWordWrap(false)
titleTX:SetJustifyH("LEFT")
-- Show help button for title
LeaPlusLC:CreateHelpButton("MuteGameSoundsCustomHelpButton", MuteCustomPanel, titleTX, "Enter sound file IDs separated by comma then click the Mute button.|n|nIf you wish, you can enter a brief note for each file ID but do not include numbers in your notes.|n|nFor example, you can enter 'DevAura 569679, RetAura 568744' to mute the Devotion Aura and Retribution Aura spells.|n|nUse Leatrix Sounds to find, test and play sound file IDs.")
-- Add large editbox
local eb = CreateFrame("Frame", nil, MuteCustomPanel, "BackdropTemplate")
eb:SetSize(548, 180)
eb:SetPoint("TOPLEFT", 10, -92)
eb:SetBackdrop({
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
edgeFile = "Interface\\PVPFrame\\UI-Character-PVP-Highlight",
edgeSize = 16,
insets = { left = 8, right = 6, top = 8, bottom = 8 },
})
eb:SetBackdropBorderColor(1.0, 0.85, 0.0, 0.5)
eb.scroll = CreateFrame("ScrollFrame", nil, eb, "UIPanelScrollFrameTemplate")
eb.scroll:SetPoint("TOPLEFT", eb, 12, -10)
eb.scroll:SetPoint("BOTTOMRIGHT", eb, -30, 10)
eb.Text = CreateFrame("EditBox", nil, eb)
eb.Text:SetMultiLine(true)
eb.Text:SetWidth(494)
eb.Text:SetHeight(230)
eb.Text:SetPoint("TOPLEFT", eb.scroll)
eb.Text:SetPoint("BOTTOMRIGHT", eb.scroll)
eb.Text:SetMaxLetters(2000)
eb.Text:SetFontObject(GameFontNormalLarge)
eb.Text:SetAutoFocus(false)
eb.Text:SetScript("OnEscapePressed", function(self) self:ClearFocus() end)
eb.scroll:SetScrollChild(eb.Text)
-- Set focus on the editbox text when clicking the editbox
eb:SetScript("OnMouseDown", function()
eb.Text:SetFocus()
eb.Text:SetCursorPosition(eb.Text:GetMaxLetters())
end)
-- Function to save the custom sound list
local function SaveString(self, userInput)
local keytext = eb.Text:GetText()
if keytext and keytext ~= "" then
LeaPlusLC["MuteCustomList"] = strtrim(eb.Text:GetText())
else
LeaPlusLC["MuteCustomList"] = ""
end
end
-- Save the custom sound list when it changes and at startup
eb.Text:SetScript("OnTextChanged", SaveString)
eb.Text:SetText(LeaPlusLC["MuteCustomList"])
SaveString()
-- Help button hidden
MuteCustomPanel.h:Hide()
-- Back button handler
MuteCustomPanel.b:SetScript("OnClick", function()
MuteCustomPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page7"]:Show()
return
end)
-- Reset button hidden
MuteCustomPanel.r:Hide()
-- Show configuration panal when options panel button is clicked
LeaPlusCB["MuteCustomSoundsBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["MuteCustomList"] = "Devotion Aura 569679, Retribution Aura 568744"
eb.Text:SetText(LeaPlusLC["MuteCustomList"])
else
MuteCustomPanel:Show()
LeaPlusLC:HideFrames()
end
end)
-- Function to mute custom sound list
local function MuteCustomListFunc(unmute, userInput)
-- local mutedebug = true -- Debug
local counter = 0
local muteString = LeaPlusLC["MuteCustomList"]
if muteString and muteString ~= "" then
muteString = muteString:gsub("%s", ",")
muteString = muteString:gsub("[\n]", ",")
muteString = muteString:gsub("[^,%d]", "")
if mutedebug then print(muteString) end
local tList = {strsplit(",", muteString)}
if mutedebug then ChatFrame1:Clear() end
for i = 1, #tList do
if tList[i] then
tList[i] = tonumber(tList[i])
if tList[i] and tList[i] < 20000000 then
if mutedebug then print(tList[i]) end
if unmute then
UnmuteSoundFile(tList[i])
else
MuteSoundFile(tList[i])
end
counter = counter + 1
end
end
end
if userInput then
if unmute then
if counter == 1 then
LeaPlusLC:Print(L["Unmuted"] .. " " .. counter .. " " .. L["sound"] .. ".")
else
LeaPlusLC:Print(L["Unmuted"] .. " " .. counter .. " " .. L["sounds"] .. ".")
end
else
if counter == 1 then
LeaPlusLC:Print(L["Muted"] .. " " .. counter .. " " .. L["sound"] .. ".")
else
LeaPlusLC:Print(L["Muted"] .. " " .. counter .. " " .. L["sounds"] .. ".")
end
end
end
end
end
-- Mute custom list on startup if option is enabled
if LeaPlusLC["MuteCustomSounds"] == "On" then
MuteCustomListFunc()
end
-- Mute or unmute when option is clicked
LeaPlusCB["MuteCustomSounds"]:HookScript("OnClick", function()
if LeaPlusLC["MuteCustomSounds"] == "On" then
MuteCustomListFunc(false, false)
else
MuteCustomListFunc(true, false)
end
end)
-- Add mute button
local MuteCustomNowButton = LeaPlusLC:CreateButton("MuteCustomNowButton", MuteCustomPanel, "Mute", "TOPLEFT", 16, -292, 0, 25, true, "Click to mute sounds in the list.")
LeaPlusCB["MuteCustomNowButton"]:SetScript("OnClick", function() MuteCustomListFunc(false, true) end)
-- Add unmute button
local UnmuteCustomNowButton = LeaPlusLC:CreateButton("UnmuteCustomNowButton", MuteCustomPanel, "Unmute", "TOPLEFT", 16, -72, 0, 25, true, "Click to unmute sounds in the list.")
LeaPlusCB["UnmuteCustomNowButton"]:ClearAllPoints()
LeaPlusCB["UnmuteCustomNowButton"]:SetPoint("LEFT", MuteCustomNowButton, "RIGHT", 10, 0)
LeaPlusCB["UnmuteCustomNowButton"]:SetScript("OnClick", function() MuteCustomListFunc(true, true) end)
-- Add play sound file editbox
local willPlay, musicHandle
local MuteCustomSoundsStopButton = LeaPlusLC:CreateButton("MuteCustomSoundsStopButton", MuteCustomPanel, "Stop", "TOPRIGHT", -18, -66, 0, 25, true, "")
MuteCustomSoundsStopButton:SetScript("OnClick", function()
if musicHandle then StopSound(musicHandle) end
end)
local MuteCustomSoundsPlayButton = LeaPlusLC:CreateButton("MuteCustomSoundsPlayButton", MuteCustomPanel, "Play", "TOPRIGHT", -18, -66, 0, 25, true, "")
MuteCustomSoundsPlayButton:ClearAllPoints()
MuteCustomSoundsPlayButton:SetPoint("RIGHT", MuteCustomSoundsStopButton, "LEFT", -10, 0)
local MuteCustomSoundsSoundBox = LeaPlusLC:CreateEditBox("MuteCustomSoundsSoundBox", eb, 80, 8, "TOPRIGHT", -10, 20, "PlaySoundBox", "PlaySoundBox")
MuteCustomSoundsSoundBox:SetNumeric(true)
MuteCustomSoundsSoundBox:ClearAllPoints()
MuteCustomSoundsSoundBox:SetPoint("RIGHT", MuteCustomSoundsPlayButton, "LEFT", -10, 0)
MuteCustomSoundsPlayButton:SetScript("OnClick", function()
MuteCustomSoundsSoundBox:GetText()
if musicHandle then StopSound(musicHandle) end
willPlay, musicHandle = PlaySoundFile(MuteCustomSoundsSoundBox:GetText(), "Master")
end)
-- Add mousewheel support to the editbox
MuteCustomSoundsSoundBox:SetScript("OnMouseWheel", function(self, delta)
local endSound = tonumber(MuteCustomSoundsSoundBox:GetText())
if endSound then
if delta == 1 then endSound = endSound + 1 else endSound = endSound - 1 end
if endSound < 1 then endSound = 1 elseif endSound >= 10000000 then endSound = 10000000 end
MuteCustomSoundsSoundBox:SetText(endSound)
MuteCustomSoundsPlayButton:Click()
end
end)
local titlePlayer = LeaPlusLC:MakeTx(MuteCustomPanel, "Player", 16, -72)
titlePlayer:ClearAllPoints()
titlePlayer:SetPoint("TOPLEFT", MuteCustomSoundsSoundBox, "TOPLEFT", -4, 16)
LeaPlusLC:CreateHelpButton("MuteGameSoundsCustomPlayHelpButton", MuteCustomPanel, titlePlayer, "If you want to listen to a sound file, enter the sound file ID into the editbox and click the play button.|n|nYou can scroll the mousewheel over the editbox to play neighbouring sound files.")
end
----------------------------------------------------------------------
-- Hide rested sleep
----------------------------------------------------------------------
if LeaPlusLC["NoRestedSleep"] == "On" and not LeaLockList["NoRestedSleep"] then
PlayerFrame.PlayerFrameContent.PlayerFrameContentContextual.PlayerRestLoop.RestTexture:SetTexture("")
end
----------------------------------------------------------------------
-- Block shared quests (no reload needed)
----------------------------------------------------------------------
do
local eFrame = CreateFrame("FRAME")
eFrame:SetScript("OnEvent", LeaPlusLC.CheckIfQuestIsSharedAndShouldBeDeclined)
-- Function to set event
local function SetSharedQuestsFunc()
if LeaPlusLC["NoSharedQuests"] == "On" then
eFrame:RegisterEvent("QUEST_DETAIL")
else
eFrame:UnregisterEvent("QUEST_DETAIL")
end
end
-- Set event when option is clicked and on startup
LeaPlusCB["NoSharedQuests"]:HookScript("OnClick", SetSharedQuestsFunc)
SetSharedQuestsFunc()
end
----------------------------------------------------------------------
-- Restore chat messages
----------------------------------------------------------------------
if LeaPlusLC["RestoreChatMessages"] == "On" and not LeaLockList["RestoreChatMessages"] then
local historyFrame = CreateFrame("FRAME")
historyFrame:RegisterEvent("PLAYER_LOGIN")
historyFrame:RegisterEvent("PLAYER_LOGOUT")
local FCF_IsChatWindowIndexActive = FCF_IsChatWindowIndexActive
local GetMessageInfo = GetMessageInfo
local GetNumMessages = GetNumMessages
-- Save chat messages on logout
historyFrame:SetScript("OnEvent", function(self, event)
if event == "PLAYER_LOGOUT" then
local name, realm = UnitFullName("player")
if not realm then realm = GetNormalizedRealmName() end
if name and realm then
LeaPlusDB["ChatHistoryName"] = name .. "-" .. realm
LeaPlusDB["ChatHistoryTime"] = GetServerTime()
for i = 1, 50 do
if i ~= 2 and _G["ChatFrame" .. i] then
if FCF_IsChatWindowIndexActive(i) then
LeaPlusDB["ChatHistory" .. i] = {}
local chtfrm = _G["ChatFrame" .. i]
local NumMsg = chtfrm:GetNumMessages()
local StartMsg = 1
if NumMsg > 128 then StartMsg = NumMsg - 127 end
for iMsg = StartMsg, NumMsg do
local chatMessage, r, g, b, chatTypeID = chtfrm:GetMessageInfo(iMsg)
if chatMessage then
if r and g and b then
local colorCode = RGBToColorCode(r, g, b)
chatMessage = colorCode .. chatMessage
end
tinsert(LeaPlusDB["ChatHistory" .. i], chatMessage)
end
end
end
end
end
end
end
end)
-- Restore chat messages on login
local name, realm = UnitFullName("player")
if not realm then realm = GetNormalizedRealmName() end
if name and realm then
if LeaPlusDB["ChatHistoryName"] and LeaPlusDB["ChatHistoryTime"] then
local timeDiff = GetServerTime() - LeaPlusDB["ChatHistoryTime"]
if LeaPlusDB["ChatHistoryName"] == name .. "-" .. realm and timeDiff and timeDiff < 10 then -- reload must be done within 15 seconds
-- Store chat messages from current session and clear chat
for i = 1, 50 do
if i ~= 2 and _G["ChatFrame" .. i] and FCF_IsChatWindowIndexActive(i) then
LeaPlusDB["ChatTemp" .. i] = {}
local chtfrm = _G["ChatFrame" .. i]
local NumMsg = chtfrm:GetNumMessages()
for iMsg = 1, NumMsg do
local chatMessage, r, g, b, chatTypeID = chtfrm:GetMessageInfo(iMsg)
if chatMessage then
if r and g and b then
local colorCode = RGBToColorCode(r, g, b)
chatMessage = colorCode .. chatMessage
end
tinsert(LeaPlusDB["ChatTemp" .. i], chatMessage)
end
end
chtfrm:Clear()
end
end
-- Restore chat messages from previous session
for i = 1, 50 do
if i ~= 2 and _G["ChatFrame" .. i] and LeaPlusDB["ChatHistory" .. i] and FCF_IsChatWindowIndexActive(i) then
LeaPlusDB["ChatHistory" .. i .. "Count"] = 0
-- Add previous session messages to chat
for k = 1, #LeaPlusDB["ChatHistory" .. i] do
if LeaPlusDB["ChatHistory" .. i][k] ~= string.match(LeaPlusDB["ChatHistory" .. i][k], "|cffffd800" .. L["Restored"] .. " " .. ".*" .. " " .. L["message"] .. ".*.|r") then
_G["ChatFrame" .. i]:AddMessage(LeaPlusDB["ChatHistory" .. i][k])
LeaPlusDB["ChatHistory" .. i .. "Count"] = LeaPlusDB["ChatHistory" .. i .. "Count"] + 1
end
end
-- Show how many messages were restored
if LeaPlusDB["ChatHistory" .. i .. "Count"] == 1 then
_G["ChatFrame" .. i]:AddMessage("|cffffd800" .. L["Restored"] .. " " .. LeaPlusDB["ChatHistory" .. i .. "Count"] .. " " .. L["message from previous session"] .. ".|r")
else
_G["ChatFrame" .. i]:AddMessage("|cffffd800" .. L["Restored"] .. " " .. LeaPlusDB["ChatHistory" .. i .. "Count"] .. " " .. L["messages from previous session"] .. ".|r")
end
else
-- No messages to restore
LeaPlusDB["ChatHistory" .. i] = nil
end
end
-- Restore chat messages from this session
for i = 1, 50 do
if i ~= 2 and _G["ChatFrame" .. i] and LeaPlusDB["ChatTemp" .. i] and FCF_IsChatWindowIndexActive(i) then
for k = 1, #LeaPlusDB["ChatTemp" .. i] do
_G["ChatFrame" .. i]:AddMessage(LeaPlusDB["ChatTemp" .. i][k])
end
end
end
end
end
end
else
-- Option is disabled so clear any messages from saved variables
LeaPlusDB["ChatHistoryName"] = nil
LeaPlusDB["ChatHistoryTime"] = nil
for i = 1, 50 do
LeaPlusDB["ChatHistory" .. i] = nil
LeaPlusDB["ChatTemp" .. i] = nil
LeaPlusDB["ChatHistory" .. i .. "Count"] = nil
end
end
----------------------------------------------------------------------
-- Set chat font size
----------------------------------------------------------------------
if LeaPlusLC["SetChatFontSize"] == "On" and not LeaLockList["SetChatFontSize"] then
-- Function to set chat font size of existing chat frames
local function SetFontSizeFunc()
-- Existing chat frames
for i = 1, 50 do
if _G["ChatFrame" .. i] then
local fontFile, unused, fontFlags = _G["ChatFrame" .. i]:GetFont()
_G["ChatFrame" .. i]:SetFont(fontFile, LeaPlusLC["LeaPlusChatFontSize"], fontFlags)
end
end
-- Special frames
local fontFile, unused, fontFlags = DEFAULT_CHAT_FRAME:GetFont()
if GMChatFrame then
GMChatFrame:SetFont(fontFile, LeaPlusLC["LeaPlusChatFontSize"], fontFlags)
end
if CommunitiesFrame then
CommunitiesFrame.Chat.MessageFrame:SetFont(fontFile, LeaPlusLC["LeaPlusChatFontSize"], fontFlags)
end
SetChatWindowSize(DEFAULT_CHAT_FRAME:GetID(), LeaPlusLC["LeaPlusChatFontSize"])
end
-- Set chat font size of temporary chat frames
hooksecurefunc("FCF_OpenTemporaryWindow", function()
local cf = FCF_GetCurrentChatFrame():GetName() or nil
if cf then
-- Temporary frames
local fontFile, unused, fontFlags = _G[cf]:GetFont()
_G[cf]:SetFont(fontFile, LeaPlusLC["LeaPlusChatFontSize"], fontFlags)
end
end)
-- Set chat font size whenever the game sets it
hooksecurefunc("FCF_SetChatWindowFontSize", function(self, chatFrame, fontSize)
if not chatFrame then
chatFrame = FCF_GetCurrentChatFrame()
end
-- Temporary frames
local fontFile, unused, fontFlags = chatFrame:GetFont()
chatFrame:SetFont(fontFile, LeaPlusLC["LeaPlusChatFontSize"], fontFlags)
-- Special frames
if GMChatFrame then
GMChatFrame:SetFont(fontFile, LeaPlusLC["LeaPlusChatFontSize"], fontFlags)
end
if CommunitiesFrame then
CommunitiesFrame.Chat.MessageFrame:SetFont(fontFile, LeaPlusLC["LeaPlusChatFontSize"], fontFlags)
end
SetChatWindowSize(chatFrame:GetID(), LeaPlusLC["LeaPlusChatFontSize"])
end)
-- Create configuration panel
local ChatFontSizePanel = LeaPlusLC:CreatePanel("Set chat font size", "ChatFontSizePanel")
LeaPlusLC:MakeTx(ChatFontSizePanel, "Text size", 16, -72)
LeaPlusLC:MakeSL(ChatFontSizePanel, "LeaPlusChatFontSize", "Drag to set the chat font size.", 12, 48, 1, 16, -92, "%.0f")
-- Set text size when slider changes and on startup
LeaPlusCB["LeaPlusChatFontSize"]:HookScript("OnValueChanged", SetFontSizeFunc)
SetFontSizeFunc()
-- Help button hidden
ChatFontSizePanel.h:Hide()
-- Back button handler
ChatFontSizePanel.b:SetScript("OnClick", function()
ChatFontSizePanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page3"]:Show()
return
end)
-- Reset button handler
ChatFontSizePanel.r:SetScript("OnClick", function()
-- Reset slider
LeaPlusLC["LeaPlusChatFontSize"] = 20
SetFontSizeFunc()
-- Refresh side panel
ChatFontSizePanel:Hide(); ChatFontSizePanel:Show()
end)
-- Show configuration panal when options panel button is clicked
LeaPlusCB["SetChatFontSizeBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["LeaPlusChatFontSize"] = 20
SetFontSizeFunc()
else
ChatFontSizePanel:Show()
LeaPlusLC:HideFrames()
end
end)
end
----------------------------------------------------------------------
-- Enhance minimap
----------------------------------------------------------------------
if LeaPlusLC["MinimapModder"] == "On" and not LeaLockList["MinimapModder"] then
-- Set minimap shape (need to do this first)
if LeaPlusLC["SquareMinimap"] == "On" then
-- Square minimap is enabled so use square shape
_G.GetMinimapShape = function() return "SQUARE" end
else
-- Square minimap is disabled so use round shape
_G.GetMinimapShape = function() return "ROUND" end
end
local miniFrame = CreateFrame("FRAME")
local LibDBIconStub = LibStub("LibDBIcon-1.0")
if LeaPlusLC["SquareMinimap"] == "On" then
LibDBIconStub:SetButtonRadius(0.165)
else
LibDBIconStub:SetButtonRadius(1)
end
----------------------------------------------------------------------
-- Configuration panel
----------------------------------------------------------------------
-- Create configuration panel
local SideMinimap = LeaPlusLC:CreatePanel("Enhance minimap", "SideMinimap")
-- Add checkboxes
LeaPlusLC:MakeTx(SideMinimap, "Settings", 16, -72)
LeaPlusLC:MakeCB(SideMinimap, "HideMiniAddonButtons", "Hide addon buttons", 16, -92, false, "If checked, addon buttons will be hidden while the pointer is not over the minimap.")
LeaPlusLC:MakeCB(SideMinimap, "CombineAddonButtons", "Combine addon buttons", 16, -112, true, "If checked, addon buttons will be combined into a single button frame which you can toggle by right-clicking the minimap.|n|nNote that enabling this option will lock out the 'Hide addon buttons' setting.")
LeaPlusLC:MakeCB(SideMinimap, "SquareMinimap", "Square minimap", 16, -132, true, "If checked, the minimap shape will be square.")
LeaPlusLC:MakeCB(SideMinimap, "ShowWhoPinged", "Show who pinged", 16, -152, false, "If checked, when someone pings the minimap, their name will be shown. This does not apply to your pings.")
LeaPlusLC:MakeCB(SideMinimap, "HideMiniAddonMenu", "Hide addon menu", 16, -172, true, "If checked, the addon menu will be hidden.|n|nThe addon menu appears as a number in the corner of the minimap if you have any addons installed which make use of it.")
LeaPlusLC:MakeCB(SideMinimap, "UnclampMinimap", "Unclamp minimap cluster", 16, -192, true, "If checked, you will be able to drag the minimap cluster to the edge of the screen using Edit Mode.|n|nWhile positioning the minimap with Edit Mode, you may need to disable Snap to position the minimap precisely.")
-- Add excluded button
local MiniExcludedButton = LeaPlusLC:CreateButton("MiniExcludedButton", SideMinimap, "Buttons", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the addon buttons editor.")
LeaPlusCB["MiniExcludedButton"]:ClearAllPoints()
LeaPlusCB["MiniExcludedButton"]:SetPoint("LEFT", SideMinimap.h, "RIGHT", 10, 0)
-- Set exclude button visibility
local function SetExcludeButtonsFunc()
if LeaPlusLC["HideMiniAddonButtons"] == "On" or LeaPlusLC["CombineAddonButtons"] == "On" then
LeaPlusLC:LockItem(LeaPlusCB["MiniExcludedButton"], false)
else
LeaPlusLC:LockItem(LeaPlusCB["MiniExcludedButton"], true)
end
end
LeaPlusCB["HideMiniAddonButtons"]:HookScript("OnClick", SetExcludeButtonsFunc)
SetExcludeButtonsFunc()
LeaPlusLC:MakeTx(SideMinimap, "Cluster scale", 356, -72)
LeaPlusLC:MakeSL(SideMinimap, "MiniClusterScale", "Drag to set the cluster scale.", 0.5, 2, 0.1, 356, -92, "%.2f")
----------------------------------------------------------------------
-- Hide addon menu
----------------------------------------------------------------------
if LeaPlusLC["HideMiniAddonMenu"] == "On" then
-- Hide compartment menu when it is shown and on startup
AddonCompartmentFrame:HookScript("OnShow", AddonCompartmentFrame.Hide)
AddonCompartmentFrame:Hide()
end
----------------------------------------------------------------------
-- Unclamp minimap cluster
----------------------------------------------------------------------
if LeaPlusLC["UnclampMinimap"] == "On" then
MinimapCluster:SetClampedToScreen(false)
end
----------------------------------------------------------------------
-- Addon buttons editor
----------------------------------------------------------------------
do
-- Create configuration panel
local ExcludedButtonsPanel = LeaPlusLC:CreatePanel("Enhance minimap", "ExcludedButtonsPanel")
local titleTX = LeaPlusLC:MakeTx(ExcludedButtonsPanel, "Buttons for the addons listed below will remain visible.", 16, -72)
titleTX:SetWidth(534)
titleTX:SetWordWrap(false)
titleTX:SetJustifyH("LEFT")
-- Add second excluded button
local MiniExcludedButton2 = LeaPlusLC:CreateButton("MiniExcludedButton2", ExcludedButtonsPanel, "Buttons", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the addon buttons editor.")
LeaPlusCB["MiniExcludedButton2"]:ClearAllPoints()
LeaPlusCB["MiniExcludedButton2"]:SetPoint("LEFT", ExcludedButtonsPanel.h, "RIGHT", 10, 0)
LeaPlusCB["MiniExcludedButton2"]:SetScript("OnClick", function()
ExcludedButtonsPanel:Hide(); SideMinimap:Show()
return
end)
-- Add large editbox
local eb = CreateFrame("Frame", nil, ExcludedButtonsPanel, "BackdropTemplate")
eb:SetSize(548, 180)
eb:SetPoint("TOPLEFT", 10, -92)
eb:SetBackdrop({
bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
edgeFile = "Interface\\PVPFrame\\UI-Character-PVP-Highlight",
edgeSize = 16,
insets = { left = 8, right = 6, top = 8, bottom = 8 },
})
eb:SetBackdropBorderColor(1.0, 0.85, 0.0, 0.5)
eb.scroll = CreateFrame("ScrollFrame", nil, eb, "UIPanelScrollFrameTemplate")
eb.scroll:SetPoint("TOPLEFT", eb, 12, -10)
eb.scroll:SetPoint("BOTTOMRIGHT", eb, -30, 10)
eb.Text = CreateFrame("EditBox", nil, eb)
eb.Text:SetMultiLine(true)
eb.Text:SetWidth(494)
eb.Text:SetHeight(230)
eb.Text:SetPoint("TOPLEFT", eb.scroll)
eb.Text:SetPoint("BOTTOMRIGHT", eb.scroll)
eb.Text:SetMaxLetters(1200)
eb.Text:SetFontObject(GameFontNormalLarge)
eb.Text:SetAutoFocus(false)
eb.Text:SetScript("OnEscapePressed", function(self) self:ClearFocus() end)
eb.scroll:SetScrollChild(eb.Text)
-- Set focus on the editbox text when clicking the editbox
eb:SetScript("OnMouseDown", function()
eb.Text:SetFocus()
eb.Text:SetCursorPosition(eb.Text:GetMaxLetters())
end)
-- Debug
-- eb.Text:SetText("Leatrix_Plus\nLeatrix_Maps\nBugSack\nLeatrix_Plus\nLeatrix_Maps\nBugSack\nLeatrix_Plus\nLeatrix_Maps\nBugSack\nLeatrix_Plus\nLeatrix_Maps\nBugSack\nLeatrix_Plus\nLeatrix_Maps\nBugSack")
-- Function to save the excluded list
local function SaveString(self, userInput)
local keytext = eb.Text:GetText()
if keytext and keytext ~= "" then
LeaPlusLC["MiniExcludeList"] = strtrim(eb.Text:GetText())
else
LeaPlusLC["MiniExcludeList"] = ""
end
if userInput then
LeaPlusLC:ReloadCheck()
end
end
-- Save the excluded list when it changes and at startup
eb.Text:SetScript("OnTextChanged", SaveString)
eb.Text:SetText(LeaPlusLC["MiniExcludeList"])
SaveString()
-- Help button tooltip
ExcludedButtonsPanel.h.tiptext = L["If you use the 'Hide addon buttons' or 'Combine addon buttons' settings but you want some addon buttons to remain visible around the minimap, enter the addon names into the editbox separated by a comma.|n|nThe editbox tooltip shows the addon names that you can enter. The names must match exactly with the names shown in the editbox tooltip though case does not matter.|n|nChanges to the list will require a UI reload to take effect."]
-- Back button handler
ExcludedButtonsPanel.b:SetScript("OnClick", function()
ExcludedButtonsPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show()
return
end)
-- Reset button handler
ExcludedButtonsPanel.r:SetScript("OnClick", function()
-- Reset controls
LeaPlusLC["MiniExcludeList"] = ""
eb.Text:SetText(LeaPlusLC["MiniExcludeList"])
-- Refresh configuration panel
ExcludedButtonsPanel:Hide(); ExcludedButtonsPanel:Show()
LeaPlusLC:ReloadCheck()
end)
-- Show configuration panal when options panel button is clicked
LeaPlusCB["MiniExcludedButton"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["MiniExcludeList"] = "BugSack, Leatrix_Plus"
LeaPlusLC:ReloadCheck()
else
ExcludedButtonsPanel:Show()
LeaPlusGlobalPanel_SideMinimap:Hide()
end
end)
-- Function to make tooltip string with list of addons
local function MakeAddonString()
local msg = ""
local numAddons = GetNumAddOns()
for i = 1, numAddons do
if IsAddOnLoaded(i) then
local name = GetAddOnInfo(i)
if name and _G["LibDBIcon10_" .. name] then -- Only list LibDBIcon buttons
msg = msg .. name .. ", "
end
end
end
if msg ~= "" then
msg = L["Supported Addons"] .. "|n|n" .. msg:sub(1, (strlen(msg) - 2)) .. "."
else
msg = L["No supported addons."]
end
eb.tiptext = msg
eb.Text.tiptext = msg
end
-- Show the help button tooltip for the editbox too
eb:SetScript("OnEnter", MakeAddonString)
eb:HookScript("OnEnter", LeaPlusLC.TipSee)
eb:SetScript("OnLeave", GameTooltip_Hide)
eb.Text:SetScript("OnEnter", MakeAddonString)
eb.Text:HookScript("OnEnter", LeaPlusLC.ShowDropTip)
eb.Text:SetScript("OnLeave", GameTooltip_Hide)
end
----------------------------------------------------------------------
-- Show who pinged
----------------------------------------------------------------------
do
-- Create frame
local pFrame = CreateFrame("FRAME", nil, Minimap, "BackdropTemplate")
pFrame:SetSize(100, 20)
-- Set position
if LeaPlusLC["SquareMinimap"] == "On" then
pFrame:SetPoint("BOTTOMRIGHT", Minimap, "BOTTOMRIGHT", 0, -3)
else
pFrame:SetPoint("BOTTOM", Minimap, "BOTTOM", 0, 2)
end
-- Set backdrop
pFrame.bg = {
bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
insets = {left = 4, top = 4, right = 4, bottom = 4},
edgeSize = 16,
tile = true,
}
pFrame:SetBackdrop(pFrame.bg)
pFrame:SetBackdropColor(0, 0, 0, 0.7)
pFrame:SetBackdropBorderColor(0, 0, 0, 0)
-- Create fontstring
pFrame.f = pFrame:CreateFontString(nil, nil, "GameFontNormalSmall")
pFrame.f:SetAllPoints()
pFrame:Hide()
-- Set variables
local pingTime
local lastUnit, lastX, lastY = "player", 0, 0
-- Show who pinged
pFrame:SetScript("OnEvent", function(void, void, unit, x, y)
-- Do nothing if unit is you or unit has not changed
if UnitIsUnit(unit, "player") or UnitIsUnit(unit, lastUnit) and x == lastX and y == lastY then return end
lastUnit, lastX, lastY = unit, x, y
-- Show name in class color
local void, class = UnitClass(unit)
if class then
local color = CUSTOM_CLASS_COLORS and CUSTOM_CLASS_COLORS[class] or RAID_CLASS_COLORS[class]
if color then
-- Set frame details
pFrame.f:SetFormattedText("|cff%02x%02x%02x%s|r", color.r * 255, color.g * 255, color.b * 255, UnitName(unit))
pFrame:SetSize(pFrame.f:GetUnboundedStringWidth() + 12, 20)
-- Hide frame after 5 seconds
pFrame:Show()
pingTime = GetTime()
C_Timer.After(5, function()
if GetTime() - pingTime >= 5 then
pFrame:Hide()
end
end)
end
end
end)
-- Set event when option is clicked and on startup
local function SetPingFunc()
if LeaPlusLC["ShowWhoPinged"] == "On" then
pFrame:RegisterEvent("MINIMAP_PING")
else
pFrame:UnregisterEvent("MINIMAP_PING")
if pFrame:IsShown() then pFrame:Hide() end
end
end
LeaPlusLC.SetPingFunc = SetPingFunc
LeaPlusCB["ShowWhoPinged"]:HookScript("OnClick", SetPingFunc)
SetPingFunc()
end
----------------------------------------------------------------------
-- Minimap cluster scale
----------------------------------------------------------------------
-- Function to set the minimap cluster scale
local function SetClusterScale()
MinimapCluster:SetScale(LeaPlusLC["MiniClusterScale"])
-- Set slider formatted text
LeaPlusCB["MiniClusterScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["MiniClusterScale"] * 100)
end
-- Set minimap scale when slider is changed and on startup
LeaPlusCB["MiniClusterScale"]:HookScript("OnValueChanged", SetClusterScale)
SetClusterScale()
----------------------------------------------------------------------
-- Combine addon buttons
----------------------------------------------------------------------
if LeaPlusLC["CombineAddonButtons"] == "On" then
-- Lock out hide minimap buttons
LeaPlusLC:LockItem(LeaPlusCB["HideMiniAddonButtons"], true)
LeaPlusCB["HideMiniAddonButtons"].tiptext = LeaPlusCB["HideMiniAddonButtons"].tiptext .. "|n|n|cff00AAFF" .. L["Cannot be used with Combine addon buttons."]
-- Create button frame
local bFrame = CreateFrame("FRAME", nil, UIParent)
bFrame:ClearAllPoints()
bFrame:SetPoint("TOPLEFT", Minimap, "TOPRIGHT", 4, 4)
bFrame:Hide()
-- Set top level to ensure button frame shows on top of frames such as the main action bar
bFrame:SetToplevel(true)
-- Set buttm frame scale to match minimap cluster scale
bFrame:SetScale(MinimapCluster:GetScale())
MinimapCluster:HookScript("OnSizeChanged", function()
bFrame:SetScale(MinimapCluster:GetScale())
end)
LeaPlusLC.bFrame = bFrame -- Used in LibDBIcon callback
_G["LeaPlusGlobalMinimapCombinedButtonFrame"] = bFrame -- For third party addons
-- Hide button frame automatically
local ButtonFrameTicker
bFrame:HookScript("OnShow", function()
if ButtonFrameTicker then ButtonFrameTicker:Cancel() end
ButtonFrameTicker = C_Timer.NewTicker(2, function()
if not bFrame:IsMouseOver() and not Minimap:IsMouseOver() then
bFrame:Hide()
if ButtonFrameTicker then ButtonFrameTicker:Cancel() end
end
end, 15)
end)
-- Position LibDBIcon tooltips when shown
LibDBIconTooltip:HookScript("OnShow", function()
GameTooltip:Hide()
LibDBIconTooltip:ClearAllPoints()
if bFrame:GetPoint() == "BOTTOMLEFT" then
LibDBIconTooltip:SetPoint("TOPLEFT", Minimap, "BOTTOMLEFT", 0, -6)
else
LibDBIconTooltip:SetPoint("TOPRIGHT", Minimap, "BOTTOMRIGHT", 0, -6)
end
end)
-- Function to position GameTooltip below the minimap
local function SetButtonTooltip()
GameTooltip:ClearAllPoints()
if bFrame:GetPoint() == "BOTTOMLEFT" then
GameTooltip:SetPoint("TOPLEFT", Minimap, "BOTTOMLEFT", 0, -6)
else
GameTooltip:SetPoint("TOPRIGHT", Minimap, "BOTTOMRIGHT", 0, -6)
end
end
LeaPlusLC.SetButtonTooltip = SetButtonTooltip -- Used in LibDBIcon callback
-- Hide existing LibDBIcon icons
local buttons = LibDBIconStub:GetButtonList()
for i = 1, #buttons do
local button = LibDBIconStub:GetMinimapButton(buttons[i])
local buttonName = strlower(buttons[i])
if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then
button:Hide()
button:SetScript("OnShow", function() if not bFrame:IsShown() then button:Hide() end end)
-- Create background texture
local bFrameBg = button:CreateTexture(nil, "BACKGROUND")
bFrameBg:SetTexture("Interface\\ChatFrame\\ChatFrameBackground")
bFrameBg:SetPoint("CENTER")
bFrameBg:SetSize(30, 30)
bFrameBg:SetVertexColor(0, 0, 0, 0.5)
end
-- Move GameTooltip to below the minimap in case the button uses it
button:HookScript("OnEnter", SetButtonTooltip)
end
-- Hide new LibDBIcon icons
-- LibDBIcon_IconCreated: Done in LibDBIcon callback function
-- Toggle button frame
local MiniUpScript = Minimap:GetScript("OnMouseUp")
Minimap:SetScript("OnMouseUp", function(frame, button)
if button == "RightButton" then
if bFrame:IsShown() then
bFrame:Hide()
else bFrame:Show()
-- Position button frame
local side
local m = Minimap:GetCenter()
local b = Minimap:GetEffectiveScale()
local w = GetScreenWidth()
local s = UIParent:GetEffectiveScale()
bFrame:ClearAllPoints()
if m * b > (w * s / 2) then
side = "Right"
bFrame:SetPoint("BOTTOMRIGHT", Minimap, "BOTTOMLEFT", -10, -0)
else
side = "Left"
bFrame:SetPoint("BOTTOMLEFT", Minimap, "BOTTOMRIGHT", 10, 0)
end
-- Show button frame
local x, y, row, col = 0, 0, 0, 0
local buttons = LibDBIconStub:GetButtonList()
-- Calculate buttons per row
local buttonsPerRow
local totalButtons = #buttons
if totalButtons > 36 then buttonsPerRow = 10
elseif totalButtons > 32 then buttonsPerRow = 9
elseif totalButtons > 28 then buttonsPerRow = 8
elseif totalButtons > 24 then buttonsPerRow = 7
elseif totalButtons > 20 then buttonsPerRow = 6
elseif totalButtons > 16 then buttonsPerRow = 5
elseif totalButtons > 12 then buttonsPerRow = 4
elseif totalButtons > 8 then buttonsPerRow = 3
elseif totalButtons > 4 then buttonsPerRow = 2
else
buttonsPerRow = 1
end
-- Build button grid
for i = 1, totalButtons do
local buttonName = strlower(buttons[i])
if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then
local button = LibDBIconStub:GetMinimapButton(buttons[i])
if button.db then
if buttonName == "armory" then button.db.hide = false end -- Armory addon sets hidden to true
if not button.db.hide then
button:SetParent(bFrame)
button:ClearAllPoints()
if side == "Left" then
-- Minimap is on left side of screen
button:SetPoint("TOPLEFT", bFrame, "TOPLEFT", x, y)
col = col + 1; if col >= buttonsPerRow then col = 0; row = row + 1; x = 0; y = y - 30 else x = x + 30 end
else
-- Minimap is on right side of screen
button:SetPoint("TOPRIGHT", bFrame, "TOPRIGHT", x, y)
col = col + 1; if col >= buttonsPerRow then col = 0; row = row + 1; x = 0; y = y - 30 else x = x - 30 end
end
if totalButtons <= buttonsPerRow then
bFrame:SetWidth(totalButtons * 30)
else
bFrame:SetWidth(buttonsPerRow * 30)
end
local void, void, void, void, e = button:GetPoint()
bFrame:SetHeight(0 - e + 30)
LibDBIconStub:Show(buttons[i])
end
end
end
end
end
else
MiniUpScript(frame, button)
end
end)
end
----------------------------------------------------------------------
-- Square minimap
----------------------------------------------------------------------
if LeaPlusLC["SquareMinimap"] == "On" then
-- Set button layout
AddonCompartmentFrame:SetFrameStrata("MEDIUM")
AddonCompartmentFrame:ClearAllPoints()
AddonCompartmentFrame:SetPoint("TOPRIGHT", Minimap, "TOPRIGHT", -2, -2)
-- Show compartment menu on hover if hide addon menu is unchecked
if LeaPlusLC["HideMiniAddonMenu"] == "Off" then
-- Toggle button visibility when pointer enters and leaves minimap and on startup
Minimap:HookScript("OnEnter", function()
AddonCompartmentFrame:Show()
end)
Minimap:HookScript("OnLeave", function()
if not MouseIsOver(AddonCompartmentFrame) then
AddonCompartmentFrame:Hide()
end
end)
-- Hide compartment menu on startup
C_Timer.After(0.1, function()
if not MouseIsOver(AddonCompartmentFrame) and not MouseIsOver(Minimap) then
AddonCompartmentFrame:Hide()
end
end)
end
-- Debug
-- AddonCompartmentFrame:SetText("56")
-- Create black border around map
local miniBorder = CreateFrame("Frame", nil, Minimap, "BackdropTemplate")
miniBorder:SetPoint("TOPLEFT", -3, 3)
miniBorder:SetPoint("BOTTOMRIGHT", 3, -3)
miniBorder:SetAlpha(1)
miniBorder:SetBackdrop({
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Background-Dark",
edgeSize = 5,
})
-- Nudge calendar button to the left
GameTimeFrame:ClearAllPoints()
GameTimeFrame:SetPoint("TOPLEFT", TimeManagerClockButton, "TOPRIGHT", 0, 0)
-- Function to set minimap position
local function SetHeaderThing()
-- local setting = MinimapCluster:GetSettingValueBool(Enum.EditModeMinimapSetting.HeaderUnderneath)
Minimap:ClearAllPoints()
Minimap:SetPoint("CENTER", MinimapCluster, "TOP", 14, -124)
end
-- Set minimap position when header position is changed and on startup
hooksecurefunc(MinimapCluster, "SetHeaderUnderneath", SetHeaderThing)
SetHeaderThing()
-- Hide the default compass border
MinimapCompassTexture:Hide()
-- Mask texture
Minimap:SetMaskTexture('Interface\\ChatFrame\\ChatFrameBackground')
-- Fix textures
Minimap:SetArchBlobRingScalar(0)
Minimap:SetArchBlobRingAlpha(0)
Minimap:SetQuestBlobRingScalar(0)
Minimap:SetQuestBlobRingAlpha(0)
-- Zoom in button
miniFrame.ClearAllPoints(Minimap.ZoomIn)
Minimap.ZoomIn:SetPoint("BOTTOMRIGHT", Minimap, "BOTTOMRIGHT", 0, 0)
miniFrame.ClearAllPoints(Minimap.ZoomOut)
Minimap.ZoomOut:SetPoint("RIGHT", Minimap.ZoomIn, "LEFT", -6, 0)
-- Expansion button
ExpansionLandingPageMinimapButton.border = ExpansionLandingPageMinimapButton:CreateTexture(nil, "OVERLAY")
ExpansionLandingPageMinimapButton.border:SetTexture("Interface\\Minimap\\MiniMap-TrackingBorder")
ExpansionLandingPageMinimapButton.border:SetSize(52, 52)
ExpansionLandingPageMinimapButton.border:SetPoint("TOPLEFT", 0, 0)
ExpansionLandingPageMinimapButton.background = ExpansionLandingPageMinimapButton:CreateTexture(nil, "BACKGROUND")
ExpansionLandingPageMinimapButton.background:SetTexture("Interface\\Minimap\\UI-Minimap-Background")
ExpansionLandingPageMinimapButton.background:SetAllPoints()
ExpansionLandingPageMinimapButton:SetHitRectInsets(-0.2, 0.2, 0, 0)
miniFrame.SetSize(ExpansionLandingPageMinimapButton, 30, 30)
hooksecurefunc(ExpansionLandingPageMinimapButton, "SetSize", function()
miniFrame.SetSize(ExpansionLandingPageMinimapButton, 30, 30)
end)
-- Set expansion button on startup (needed for Dragonflight button)
miniFrame.ClearAllPoints(ExpansionLandingPageMinimapButton)
ExpansionLandingPageMinimapButton:SetPoint("TOPLEFT", MinimapBackdrop, "TOPLEFT", -7, -150)
ExpansionLandingPageMinimapButton.LoopingGlow:SetAtlas("Mage-ArcaneCharge-CircleGlow", true)
-- Set expansion button when icon is updated (needed for Shadowlands button)
hooksecurefunc(ExpansionLandingPageMinimapButton, "UpdateIcon", function()
miniFrame.ClearAllPoints(ExpansionLandingPageMinimapButton)
ExpansionLandingPageMinimapButton:SetPoint("TOPLEFT", MinimapBackdrop, "TOPLEFT", -7, -150)
ExpansionLandingPageMinimapButton.LoopingGlow:SetAtlas("Mage-ArcaneCharge-CircleGlow", true)
end)
ExpansionLandingPageMinimapButton.AlertBG:ClearAllPoints()
ExpansionLandingPageMinimapButton.AlertBG:SetPoint("RIGHT", ExpansionLandingPageMinimapButton, "CENTER", -4, 0)
ExpansionLandingPageMinimapButton.AlertText:ClearAllPoints()
ExpansionLandingPageMinimapButton.AlertText:SetPoint("RIGHT", ExpansionLandingPageMinimapButton, "LEFT", -8, 0)
ExpansionLandingPageMinimapButton:SetHitRectInsets(0, 0, 0, 0)
-- Set instance difficulty layout
MinimapCluster.InstanceDifficulty:ClearAllPoints()
MinimapCluster.InstanceDifficulty:SetPoint("TOPRIGHT", MinimapCluster, "TOPRIGHT", -10, -22)
-- Setup hybrid minimap when available
local function SetHybridMap()
HybridMinimap.MapCanvas:SetUseMaskTexture(false)
HybridMinimap.CircleMask:SetTexture("Interface\\BUTTONS\\WHITE8X8")
HybridMinimap.MapCanvas:SetUseMaskTexture(true)
end
-- Run function when Blizzard addon is loaded
if IsAddOnLoaded("Blizzard_HybridMinimap") then
SetHybridMap()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_HybridMinimap" then
SetHybridMap()
waitFrame:UnregisterAllEvents()
end
end)
end
end
----------------------------------------------------------------------
-- Replace non-standard buttons
----------------------------------------------------------------------
-- Replace non-standard buttons for addons that don't use the standard LibDBIcon library
do
-- Make LibDBIcon buttons for addons that don't use LibDBIcon
local CustomAddonTable = {}
LeaPlusDB["CustomAddonButtons"] = LeaPlusDB["CustomAddonButtons"] or {}
-- Function to create a LibDBIcon button
local function CreateBadButton(name)
-- Get non-standard button texture
local finalTex = "Interface\\HELPFRAME\\HelpIcon-KnowledgeBase"
if _G[name .. "Icon"] then
if _G[name .. "Icon"]:GetObjectType() == "Texture" then
local gTex = _G[name .. "Icon"]:GetTexture()
if gTex then
finalTex = gTex
end
end
else
for i = 1, select('#', _G[name]:GetRegions()) do
local region = select(i, _G[name]:GetRegions())
if region.GetTexture then
local x, y = region:GetSize()
if x and x < 30 then
finalTex = region:GetTexture()
end
end
end
end
if not finalTex then finalTex = "Interface\\HELPFRAME\\HelpIcon-KnowledgeBase" end
local zeroButton = LibStub("LibDataBroker-1.1"):NewDataObject("LeaPlusCustomIcon_" .. name, {
type = "data source",
text = name,
icon = finalTex,
OnClick = function(self, btn)
if _G[name] then
if string.find(name, "LibDBIcon") then
-- It's a fake LibDBIcon
local mouseUp = _G[name]:GetScript("OnMouseUp")
if mouseUp then
mouseUp(self, btn)
end
else
-- It's a genuine LibDBIcon
local clickUp = _G[name]:GetScript("OnClick")
if clickUp then
_G[name]:Click(btn)
end
end
end
end,
OnTooltipShow = function(tooltip)
if not tooltip or not tooltip.AddLine then return end
tooltip:AddLine(name)
tooltip:AddLine(L["This is a custom button."], 1, 1, 1)
tooltip:AddLine(L["Please ask the addon author to use LibDBIcon."], 1, 1, 1)
tooltip:AddLine(L["There is a helpful guide on leatrix.com."], 1, 1, 1)
end,
})
LeaPlusDB["CustomAddonButtons"][name] = LeaPlusDB["CustomAddonButtons"][name] or {}
LeaPlusDB["CustomAddonButtons"][name].hide = false
CustomAddonTable[name] = name
local icon = LibStub("LibDBIcon-1.0", true)
icon:Register("LeaPlusCustomIcon_" .. name, zeroButton, LeaPlusDB["CustomAddonButtons"][name])
end
-- Function to loop through minimap children to find non-standard addon buttons
local function MakeButtons()
local temp = {Minimap:GetChildren()}
for i = 1, #temp do
if temp[i] then
local btn = temp[i]
local name = btn:GetName()
local btype = btn:GetObjectType()
if name and btype == "Button" and not CustomAddonTable[name] and btn:GetNumRegions() >= 3 and not issecurevariable(name) and btn:IsShown() then
if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), strlower("##" .. name)) then
if not string.find(name, "LibDBIcon") or name == "LibDBIcon10_MethodRaidTools" then
CreateBadButton(name)
btn:Hide()
btn:SetScript("OnShow", function() btn:Hide() end)
end
end
end
end
end
end
-- Run the function a few times on startup
C_Timer.NewTicker(2, MakeButtons, 3)
C_Timer.After(0.1, MakeButtons)
end
----------------------------------------------------------------------
-- Hide addon buttons
----------------------------------------------------------------------
if LeaPlusLC["CombineAddonButtons"] == "Off" then
-- Function to set button state
local function SetHideButtons()
if LeaPlusLC["HideMiniAddonButtons"] == "On" then
-- Hide existing buttons
local buttons = LibDBIconStub:GetButtonList()
for i = 1, #buttons do
local buttonName = strlower(buttons[i])
if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then
LibDBIconStub:ShowOnEnter(buttons[i], true)
end
end
-- Hide new buttons
-- LibDBIcon_IconCreated: Done in LibDBIcon callback function
else
-- Show existing buttons
local buttons = LibDBIconStub:GetButtonList()
for i = 1, #buttons do
local buttonName = strlower(buttons[i])
if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then
LibDBIconStub:ShowOnEnter(buttons[i], false)
end
end
-- Show new buttons
-- LibDBIcon_IconCreated: Done in LibDBIcon callback function
end
end
-- Assign file level scope (it's used in reset and preset)
LeaPlusLC.SetHideButtons = SetHideButtons
-- Set buttons when option is clicked and on startup
LeaPlusCB["HideMiniAddonButtons"]:HookScript("OnClick", SetHideButtons)
SetHideButtons()
end
----------------------------------------------------------------------
-- Buttons
----------------------------------------------------------------------
-- Help button tooltip
SideMinimap.h.tiptext = L["If you toggle an addon minimap button, you may need to reload your UI for the change to take effect. This only affects a few addons that use custom buttons."]
-- Back button handler
SideMinimap.b:SetScript("OnClick", function()
SideMinimap:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show()
return
end)
-- Reset button handler
SideMinimap.r.tiptext = SideMinimap.r.tiptext .. "|n|n" .. L["Note that this will not reset settings that require a UI reload."]
SideMinimap.r:HookScript("OnClick", function()
LeaPlusLC["HideMiniAddonButtons"] = "On"; if LeaPlusLC.SetHideButtons then LeaPlusLC:SetHideButtons() end
LeaPlusLC["ShowWhoPinged"] = "On"; LeaPlusLC:SetPingFunc()
LeaPlusLC["MiniClusterScale"] = 1; LeaPlusLC["MinimapNoScale"] = "Off"; SetClusterScale()
-- Refresh panel
SideMinimap:Hide(); SideMinimap:Show()
end)
-- Configuration button handler
LeaPlusCB["ModMinimapBtn"]:HookScript("OnClick", function()
if LeaPlusLC:PlayerInCombat() then
return
else
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["HideMiniAddonButtons"] = "On"; if LeaPlusLC.SetHideButtons then LeaPlusLC:SetHideButtons() end
LeaPlusLC["ShowWhoPinged"] = "On"; LeaPlusLC:SetPingFunc()
LeaPlusLC["HideMiniAddonMenu"] = "On"
LeaPlusLC["MiniClusterScale"] = 1; LeaPlusLC["MinimapNoScale"] = "Off"; SetClusterScale()
LeaPlusLC["UnclampMinimap"] = "On"
LeaPlusLC:ReloadCheck() -- Special reload check
else
-- Show configuration panel
SideMinimap:Show()
LeaPlusLC:HideFrames()
end
end
end)
-- LibDBIcon callback (search LibDBIcon_IconCreated to find calls to this)
LibDBIconStub.RegisterCallback(miniFrame, "LibDBIcon_IconCreated", function(self, button, name)
-- Combine addon buttons: Hide new LibDBIcon icons
if LeaPlusLC["CombineAddonButtons"] == "On" then
--C_Timer.After(0.1, function() -- Removed for now
local buttonName = strlower(name)
if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then
if button.db and not button.db.hide then
button:Hide()
button:SetScript("OnShow", function() if not LeaPlusLC.bFrame:IsShown() then button:Hide() end end)
end
-- Create background texture
local bFrameBg = button:CreateTexture(nil, "BACKGROUND")
bFrameBg:SetTexture("Interface\\ChatFrame\\ChatFrameBackground")
bFrameBg:SetPoint("CENTER")
bFrameBg:SetSize(30, 30)
bFrameBg:SetVertexColor(0, 0, 0, 0.5)
end
-- Move GameTooltip to below the minimap in case the button uses it
button:HookScript("OnEnter", LeaPlusLC.SetButtonTooltip)
--end)
end
-- Hide addon buttons: Hide new LibDBIcon icons
if LeaPlusLC["CombineAddonButtons"] == "Off" then
local buttonName = strlower(name)
if LeaPlusLC["HideMiniAddonButtons"] == "On" then
-- Hide addon buttons is enabled
if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then
LibDBIconStub:ShowOnEnter(name, true)
end
else
-- Hide addon buttons is disabled
if not strfind(strlower(LeaPlusDB["MiniExcludeList"]), buttonName) then
LibDBIconStub:ShowOnEnter(name, false)
end
end
end
end)
end
----------------------------------------------------------------------
-- Show ready timer
----------------------------------------------------------------------
if LeaPlusLC["ShowReadyTimer"] == "On" then
-- Dungeons and Raids
do
-- Declare variables
local duration, barTime = 40, -1
local t = duration
-- Create status bar below dungeon ready popup
local bar = CreateFrame("StatusBar", nil, LFGDungeonReadyPopup)
bar:SetPoint("TOPLEFT", LFGDungeonReadyPopup, "BOTTOMLEFT", 0, -5)
bar:SetPoint("TOPRIGHT", LFGDungeonReadyPopup, "BOTTOMRIGHT", 0, -5)
bar:SetHeight(5)
bar:SetStatusBarTexture("Interface\\TargetingFrame\\UI-StatusBar")
bar:SetStatusBarColor(1.0, 0.85, 0.0)
bar:SetMinMaxValues(0, duration)
-- Create status bar text
local text = bar:CreateFontString(nil, "ARTWORK")
text:SetFontObject("GameFontNormalLarge")
text:SetTextColor(1.0, 0.85, 0.0)
text:SetPoint("TOP", 0, -10)
-- Update bar as timer counts down
bar:SetScript("OnUpdate", function(self, elapsed)
t = t - elapsed
if barTime >= 1 or barTime == -1 then
self:SetValue(t)
text:SetText(SecondsToTime(floor(t + 0.5)))
barTime = 0
end
barTime = barTime + elapsed
end)
-- Show frame when dungeon ready frame shows
local frame = CreateFrame("FRAME")
frame:RegisterEvent("LFG_PROPOSAL_SHOW")
frame:RegisterEvent("LFG_PROPOSAL_FAILED")
frame:RegisterEvent("LFG_PROPOSAL_SUCCEEDED")
frame:SetScript("OnEvent", function(self, event)
if event == "LFG_PROPOSAL_SHOW" then
t = duration
barTime = -1
bar:Show()
-- Hide existing timer bars (such as BigWigs)
local children = {LFGDungeonReadyPopup:GetChildren()}
if children then
for i, child in ipairs(children) do
if child ~= bar then
local objType = child:GetObjectType()
if objType and objType == "StatusBar" then
child:Hide()
end
end
end
end
else
bar:Hide()
end
end)
end
-- Player vs Player
do
-- Declare variables
local t, barTime = -1, -1
-- Create status bar below dungeon ready popup
local bar = CreateFrame("StatusBar", nil, PVPReadyDialog)
bar:SetPoint("TOPLEFT", PVPReadyDialog, "BOTTOMLEFT", 0, -5)
bar:SetPoint("TOPRIGHT", PVPReadyDialog, "BOTTOMRIGHT", 0, -5)
bar:SetHeight(5)
bar:SetStatusBarTexture("Interface\\TargetingFrame\\UI-StatusBar")
bar:SetStatusBarColor(1.0, 0.85, 0.0)
-- Create status bar text
local text = bar:CreateFontString(nil, "ARTWORK")
text:SetFontObject("GameFontNormalLarge")
text:SetTextColor(1.0, 0.85, 0.0)
text:SetPoint("TOP", 0, -10)
-- Update bar as timer counts down
bar:SetScript("OnUpdate", function(self, elapsed)
t = t - elapsed
if barTime >= 1 or barTime == -1 then
self:SetValue(t)
text:SetText(SecondsToTime(floor(t + 0.5)))
barTime = 0
end
barTime = barTime + elapsed
end)
-- Show frame when PvP ready frame shows
hooksecurefunc("PVPReadyDialog_Display", function(self, id)
t = GetBattlefieldPortExpiration(id) + 1
-- t = 89; -- debug
if t and t > 1 then
bar:SetMinMaxValues(0, t)
barTime = -1
bar:Show()
else
bar:Hide()
end
end)
PVPReadyDialog:HookScript("OnHide", function()
bar:Hide()
end)
-- Debug
-- C_Timer.After(2, function() PVPReadyDialog_Display(PVPReadyDialog, 1, "Warsong Gulch", 0, "BATTLEGROUND", "", "DAMAGER"); bar:Show() end)
end
end
----------------------------------------------------------------------
-- Remove transforms (no reload required)
----------------------------------------------------------------------
do
local transTable = {
-- Single spell IDs
["TransAqir"] = {318452}, -- Aqir Egg Cluster
["TransAtomic"] = {399502}, -- Atomically Recalibrated toy
["TransBlight"] = {290224}, -- Detoxified Blight Grenade
["TransLantern"] = {44212}, -- Weighted Jack-o'-Lantern
["TransWitch"] = {279509}, -- Lucille's Sewing Needle (witch)
["TransTurkey"] = {61781}, -- Turkey (Pilgrim's Bounty)
-- Spraybots
["TransSpraybots"] = {
--[[Paintbot Orange]] 301892,
--[[Paintbot Blue]] 301893,
--[[Paintbot Green]] 301894,
},
-- Hallowed Wand costumes
["TransHallowed"] = {
--[[Abomination]] 172010,
--[[CancelBanshee]] 218132,
--[[Bat]] 191703,
--[[Gargoyle]] 191210,
--[[Geist]] 172015,
--[[Ghost]] 24735, 24736, 191698, 191700,
--[[Ghoul]] 172008,
--[[Leper Gnome]] 24712, 24713, 191701,
--[[Nerubian]] 191211,
--[[Ninja]] 24710, 24711, 191686, 191688,
--[[Pirate]] 24708, 24709, 173958, 173959, 191682, 191683,
--[[Skeleton]] 24723, 191702,
--[[Slime]] 172003,
--[[Spider]] 172020,
--[[Wight]] 191208,
--[[Wisp]] 24740,
},
-- Professions
["TransProfessions"] = {
-- Crafting
--[[Blacksmithing: Suited for Smithing]] 388658,
--[[Jewelcrafting: An Eye For Shine]] 394015,
--[[Tailoring: Wrapped Up In Weaving]] 391312,
--[[Engineering: Ready To Build]] 394007,
--[[Enchanting: A Looker's Charm]] 394008,
--[[Alchemy: Spark of Madness]] 394003,
--[[Inscription: Artist's Duds]] 394016,
--[[Leatherworking: Sculpting Leather Finery]] 394001,
-- Gathering
--[[Herbalism: A Cultivator's Colors]] 394005,
--[[Mining: Rockin' Mining Gear]] 394006,
--[[Skinning: Dressed To Kill]] 394011,
-- Secondary
--[[Cooking: What's Cookin', Good Lookin'?]] 391775,
--[[Fishing: Fishing For Attention 394009 - Handled separately]]
},
}
-- Give table file level scope (its used during logout and for admin command)
LeaPlusLC["transTable"] = transTable
-- Create local table for storing spell IDs that need to be removed
local cTable = {}
-- Load saved settings or set default values
for k, v in pairs(transTable) do
if LeaPlusDB[k] and type(LeaPlusDB[k]) == "string" and LeaPlusDB[k] == "On" or LeaPlusDB[k] == "Off" then
LeaPlusLC[k] = LeaPlusDB[k]
else
LeaPlusLC[k] = "Off"
LeaPlusDB[k] = "Off"
end
end
-- Create configuration panel
local transPanel = LeaPlusLC:CreatePanel("Remove transforms", "transPanel")
-- Create scroll list backdrop
local backFrame = CreateFrame("FRAME", nil, transPanel, "BackdropTemplate")
backFrame:SetSize(transPanel:GetSize())
backFrame:SetPoint("TOPLEFT", 16, -68)
backFrame:SetPoint("BOTTOMRIGHT", -16, 108)
backFrame:SetBackdrop({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background"})
backFrame:SetBackdropColor(0, 0, 1, 0.5)
-- Create scroll frame
local scrollFrame = CreateFrame("ScrollFrame", "LeaPlusGlobalTransScrollFrame", backFrame, "UIPanelScrollFrameTemplate")
local scrollChild = CreateFrame("Frame", nil, scrollFrame)
scrollChild:SetSize(1, 1)
scrollFrame:SetScrollChild(scrollChild)
scrollFrame:SetPoint("TOPLEFT", -8, -6)
scrollFrame:SetPoint("BOTTOMRIGHT", -29, 6)
-- Give child a file level scope (it's used in LeaPlusLC.TipSee)
LeaPlusLC.RemoveTransformsScrollChild = scrollChild
-- Initialise row count
local row = -1
-- Add checkboxes
row = row + 2; LeaPlusLC:MakeTx(scrollChild, "Professions", 16, -((row - 1) * 20) - 2)
row = row + 1; LeaPlusLC:MakeCB(scrollChild, "TransProfessions", "All profession transforms", 16, -((row - 1) * 20) - 2, false, "If checked, all profession transforms added in Dragonflight will be removed when applied.")
row = row + 2; LeaPlusLC:MakeTx(scrollChild, "Toys", 16, -((row - 1) * 20) - 2)
row = row + 1; LeaPlusLC:MakeCB(scrollChild, "TransAqir", "Aqir Egg Cluster", 16, -((row - 1) * 20) - 2, false, "If checked, the Aqir Egg Cluster transform will be removed when applied.")
row = row + 1; LeaPlusLC:MakeCB(scrollChild, "TransAtomic", "Atomic Recalibrator", 16, -((row - 1)* 20) -2, false, "If checked, the Atomic Recalibrator transform will be removed when applied.")
row = row + 1; LeaPlusLC:MakeCB(scrollChild, "TransBlight", "Detoxified Blight Grenade", 16, -((row - 1) * 20) - 2, false, "If checked, the Detoxified Blight Grenade transform will be removed when applied.")
row = row + 1; LeaPlusLC:MakeCB(scrollChild, "TransWitch", "Lucille's Sewing Needle", 16, -((row - 1) * 20) - 2, false, "If checked, the Lucille's Sewing Needle transform will be removed when applied.")
row = row + 1; LeaPlusLC:MakeCB(scrollChild, "TransSpraybots", "Spraybots", 16, -((row - 1) * 20) - 2, false, "If checked, the Spraybot transforms will be removed when applied.")
row = row + 2; LeaPlusLC:MakeTx(scrollChild, "Events", 16, -(row - 1) * 20 - 2)
row = row + 1; LeaPlusLC:MakeCB(scrollChild, "TransHallowed", "Hallow's End: Hallowed Wand", 16, -((row - 1) * 20) - 2, false, "If checked, the Hallowed Wand transforms will be removed when applied.")
row = row + 1; LeaPlusLC:MakeCB(scrollChild, "TransLantern", "Hallow's End: Weighted Jack-o'-Lantern", 16, -((row - 1) * 20) - 2, false, "If checked, the Weighted Jack-o'-Lantern transform will be removed when applied.")
row = row + 1; LeaPlusLC:MakeCB(scrollChild, "TransTurkey", "Pilgrim's Bounty: Turkey Shooter", 16, -((row - 1) * 20) - 2, false, "If checked, the Turkey Shooter transform will be removed when applied.")
-- Debug
if RemoveCommentToEnableDebug then
row = row + 2; LeaPlusLC:MakeTx(scrollChild, "Debug", 16, -(row - 1) * 20 - 2)
row = row + 1; LeaPlusLC:MakeCB(scrollChild, "CancelDevotion", "Devotion Aura", 16, -((row - 1) * 20) - 2, false, "")
transTable["CancelDevotion"] = {465}
LeaPlusLC["CancelDevotion"] = "On"
row = row + 1; LeaPlusLC:MakeCB(scrollChild, "CancelStealth", "Stealth", 16, -((row - 1) * 20) - 2, false, "")
transTable["CancelStealth"] = {1784}
LeaPlusLC["CancelStealth"] = "On"
row = row + 1; LeaPlusLC:MakeCB(scrollChild, "CancelIntel", "Intellect", 16, -((row - 1) * 20) - 2, false, "")
transTable["CancelIntel"] = {1459}
LeaPlusLC["CancelIntel"] = "On"
end
-- Scroll handlers
scrollFrame:SetScript("OnMouseWheel", function(self, delta)
if delta == 1 then
LeaPlusGlobalTransScrollFrameScrollBar:SetValue(LeaPlusGlobalTransScrollFrameScrollBar:GetValue() - 20)
else
LeaPlusGlobalTransScrollFrameScrollBar:SetValue(LeaPlusGlobalTransScrollFrameScrollBar:GetValue() + 20)
end
end)
LeaPlusGlobalTransScrollFrameScrollBarScrollDownButton:SetScript("OnClick", function(self)
LeaPlusGlobalTransScrollFrameScrollBar:SetValue(LeaPlusGlobalTransScrollFrameScrollBar:GetValue() + 20)
end)
LeaPlusGlobalTransScrollFrameScrollBarScrollUpButton:SetScript("OnClick", function(self)
LeaPlusGlobalTransScrollFrameScrollBar:SetValue(LeaPlusGlobalTransScrollFrameScrollBar:GetValue() - 20)
end)
-- Set scroll list to top when shown
scrollFrame:HookScript("OnShow", function()
scrollFrame:SetVerticalScroll(0)
end)
-- Add scroll for more message
local footMessage = LeaPlusLC:MakeTx(transPanel, "(scroll the list for more)", 16, 0)
footMessage:ClearAllPoints()
footMessage:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", 28, 24)
-- Function to populate cTable with spell IDs for settings that are enabled
local function UpdateList()
for k, v in pairs(transTable) do
for j, spellID in pairs(v) do
if LeaPlusLC[k] == "On" then
cTable[spellID] = true
else
cTable[spellID] = nil
end
end
end
end
-- Populate cTable on startup
UpdateList()
-- Special exception for fishing (loot frame remains open after fishing channeling stops and buff is removed if combat starts)
local fishEvent = CreateFrame("FRAME")
fishEvent:RegisterUnitEvent("UNIT_SPELLCAST_CHANNEL_STOP", "player")
fishEvent:SetScript("OnEvent", function(self, event, unit, void, spellID)
if LeaPlusLC["NoTransforms"] == "On" and LeaPlusLC["TransProfessions"] == "On" and spellID == 131476 then -- Fishing
for i = 1, 40 do
local void, void, void, void, length, expire, void, void, void, spellID = UnitBuff("player", i)
if spellID and spellID == 394009 and not UnitAffectingCombat("player") then -- Fishing For Attention
CancelUnitBuff("player", i)
end
end
end
end)
-- Create frame for events
local spellFrame = CreateFrame("FRAME")
local fisherTicker, castingSpellID
-- Function to cancel buffs
local function eventFunc()
for i = 1, 40 do
local void, void, void, void, length, expire, void, void, void, spellID = UnitBuff("player", i)
if spellID and cTable[spellID] then
if UnitAffectingCombat("player") then
spellFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
else
CancelUnitBuff("player", i)
end
end
end
end
-- Check for buffs
spellFrame:SetScript("OnEvent", function(self, event, unit, updatedAuras)
if event == "UNIT_AURA" then
if updatedAuras then
if updatedAuras.isFullUpdate then
eventFunc()
elseif updatedAuras.addedAuras then
for void, aura in ipairs(updatedAuras.addedAuras) do
if aura.spellId and cTable[aura.spellId] then
eventFunc()
end
end
end
end
elseif event == "PLAYER_REGEN_ENABLED" then
-- Traverse buffs (will only run spell was found in cTable previously)
for i = 1, 40 do
local void, void, void, void, length, expire, void, void, void, spellID = UnitBuff("player", i)
if spellID and cTable[spellID] then
spellFrame:UnregisterEvent("PLAYER_REGEN_ENABLED")
CancelUnitBuff("player", i)
end
end
end
end)
-- Function to set event
local function SetTransformFunc()
if LeaPlusLC["NoTransforms"] == "On" then
eventFunc()
spellFrame:RegisterUnitEvent("UNIT_AURA", "player")
else
spellFrame:UnregisterEvent("UNIT_AURA")
spellFrame:UnregisterEvent("PLAYER_REGEN_ENABLED")
end
end
-- Run set event function when option is clicked and on startup
LeaPlusCB["NoTransforms"]:HookScript("OnClick", SetTransformFunc)
if LeaPlusLC["NoTransforms"] == "On" then SetTransformFunc() end
-- Set click width for checkboxes and run update when checkboxes are clicked
for k, v in pairs(transTable) do
--[[LeaPlusCB[k].f:SetWidth(80)
if LeaPlusCB[k].f:GetStringWidth() > 80 then
LeaPlusCB[k]:SetHitRectInsets(0, -70, 0, 0)
else
LeaPlusCB[k]:SetHitRectInsets(0, -LeaPlusCB[k].f:GetStringWidth() + 4, 0, 0)
end]]
LeaPlusCB[k]:HookScript("OnClick", function()
UpdateList()
eventFunc()
end)
end
-- Help button hidden
transPanel.h:Hide()
-- Back button handler
transPanel.b:SetScript("OnClick", function()
transPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page7"]:Show()
return
end)
-- Reset button handler
transPanel.r:SetScript("OnClick", function()
-- Reset checkboxes
for k, v in pairs(transTable) do
LeaPlusLC[k] = "Off"
end
UpdateList()
eventFunc()
-- Refresh panel
transPanel:Hide(); transPanel:Show()
end)
-- Show panal when options panel button is clicked
LeaPlusCB["NoTransformsBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
for k, v in pairs(transTable) do
LeaPlusLC[k] = "On"
end
UpdateList()
eventFunc()
else
transPanel:Show()
LeaPlusLC:HideFrames()
end
end)
end
----------------------------------------------------------------------
-- Show train all button
----------------------------------------------------------------------
if LeaPlusLC["ShowTrainAllButton"] == "On" then
-- Function to create train all button
local function TrainerFunc()
----------------------------------------------------------------------
-- Train All button
----------------------------------------------------------------------
-- Create train all button
LeaPlusLC:CreateButton("TrainAllButton", ClassTrainerFrame, "Train All", "BOTTOMLEFT", 344, 54, 0, 22, false, "")
LeaPlusCB["TrainAllButton"]:ClearAllPoints()
LeaPlusCB["TrainAllButton"]:SetPoint("RIGHT", ClassTrainerTrainButton, "LEFT", -1, 0)
local gap = ClassTrainerFrame:GetWidth() - ClassTrainerFrameMoneyBg:GetWidth() - ClassTrainerTrainButton:GetWidth() - 13
if LeaPlusCB["TrainAllButton"]:GetWidth() > gap then
LeaPlusCB["TrainAllButton"]:GetFontString():SetWordWrap(false)
LeaPlusCB["TrainAllButton"]:SetWidth(gap)
LeaPlusCB["TrainAllButton"]:GetFontString():SetWidth(gap - 8)
end
-- Give button global scope (useful for compatibility with other addons and essential for ElvUI)
_G.LeaPlusGlobalTrainAllButton = LeaPlusCB["TrainAllButton"]
-- Button tooltip
LeaPlusCB["TrainAllButton"]:SetScript("OnEnter", function(self)
-- Get number of available skills and total cost
local count, cost = 0, 0
for i = 1, GetNumTrainerServices() do
local void, isAvail = GetTrainerServiceInfo(i)
if isAvail and isAvail == "available" then
count = count + 1
cost = cost + GetTrainerServiceCost(i)
end
end
-- Show tooltip
if count > 0 then
GameTooltip:SetOwner(self, "ANCHOR_TOP", 0, 4)
GameTooltip:ClearLines()
if count > 1 then
GameTooltip:AddLine(L["Train"] .. " " .. count .. " " .. L["skills for"] .. " " .. GetCoinTextureString(cost))
else
GameTooltip:AddLine(L["Train"] .. " " .. count .. " " .. L["skill for"] .. " " .. GetCoinTextureString(cost))
end
GameTooltip:Show()
end
end)
-- Button click handler
LeaPlusCB["TrainAllButton"]:SetScript("OnClick",function(self)
for i = 1, GetNumTrainerServices() do
local void, isAvail = GetTrainerServiceInfo(i)
if isAvail and isAvail == "available" then
BuyTrainerService(i)
end
end
end)
-- Enable button only when skills are available
local skillsAvailable
hooksecurefunc("ClassTrainerFrame_Update", function()
skillsAvailable = false
for i = 1, GetNumTrainerServices() do
local void, isAvail = GetTrainerServiceInfo(i)
if isAvail and isAvail == "available" then
skillsAvailable = true
end
end
LeaPlusCB["TrainAllButton"]:SetEnabled(skillsAvailable)
-- Refresh tooltip
if LeaPlusCB["TrainAllButton"]:IsMouseOver() and skillsAvailable then
LeaPlusCB["TrainAllButton"]:GetScript("OnEnter")(LeaPlusCB["TrainAllButton"])
end
end)
----------------------------------------------------------------------
-- ElvUI fixes
----------------------------------------------------------------------
-- ElvUI fixes
if LeaPlusLC.ElvUI then
local E = LeaPlusLC.ElvUI
if E.private.skins.blizzard.enable and E.private.skins.blizzard.trainer then
LeaPlusCB["TrainAllButton"]:ClearAllPoints()
LeaPlusCB["TrainAllButton"]:SetPoint("RIGHT", ClassTrainerTrainButton, "LEFT", -6, 0)
E:GetModule("Skins"):HandleButton(_G.LeaPlusGlobalTrainAllButton)
if LeaPlusCB["TrainAllButton"]:GetWidth() > gap then
LeaPlusCB["TrainAllButton"]:GetFontString():SetWordWrap(false)
LeaPlusCB["TrainAllButton"]:SetWidth(gap - 5)
LeaPlusCB["TrainAllButton"]:GetFontString():SetWidth(gap - 8)
end
end
end
end
-- Run function when Trainer UI has loaded
if IsAddOnLoaded("Blizzard_TrainerUI") then
TrainerFunc()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_TrainerUI" then
TrainerFunc()
waitFrame:UnregisterAllEvents()
end
end)
end
end
----------------------------------------------------------------------
-- Filter chat messages
----------------------------------------------------------------------
if LeaPlusLC["FilterChatMessages"] == "On" then
-- Load LibChatAnims
Leatrix_Plus:LeaPlusLCA()
-- Create configuration panel
local ChatFilterPanel = LeaPlusLC:CreatePanel("Filter chat messages", "ChatFilterPanel")
LeaPlusLC:MakeTx(ChatFilterPanel, "Settings", 16, -72)
LeaPlusLC:MakeCB(ChatFilterPanel, "BlockSpellLinks", "Block spell links during combat", 16, -92, false, "If checked, messages containing spell links will be blocked while you are in combat.|n|nThis is useful for blocking spell interrupt spam.|n|nThis applies to the say, party, raid, instance, emote and yell channels.")
LeaPlusLC:MakeCB(ChatFilterPanel, "BlockDrunkenSpam", "Block drunken spam", 16, -112, false, "If checked, drunken messages will be blocked unless they apply to your character.|n|nThis applies to the system channel.")
LeaPlusLC:MakeCB(ChatFilterPanel, "BlockDuelSpam", "Block duel spam", 16, -132, false, "If checked, duel victory and retreat messages will be blocked unless your character took part in the duel.|n|nThis applies to the system channel.")
-- Lock block drunken spam option for zhTW
if GameLocale == "zhTW" then
LeaPlusLC:LockItem(LeaPlusCB["BlockDrunkenSpam"], true)
LeaPlusLC["BlockDrunkenSpam"] = "Off"
LeaPlusDB["BlockDrunkenSpam"] = "Off"
LeaPlusCB["BlockDrunkenSpam"].tiptext = LeaPlusCB["BlockDrunkenSpam"].tiptext .. "|n|n|cff00AAFF" .. L["Cannot use this with your locale."]
end
-- Help button hidden
ChatFilterPanel.h:Hide()
-- Back button handler
ChatFilterPanel.b:SetScript("OnClick", function()
ChatFilterPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page3"]:Show()
return
end)
local charName = GetUnitName("player")
local charRealm = GetNormalizedRealmName()
local nameRealm = charName .. "%%-" .. charRealm
-- Chat filter
local function ChatFilterFunc(self, event, msg)
-- Block duel spam
if LeaPlusLC["BlockDuelSpam"] == "On" then
-- Block duel messages unless you are part of the duel
if msg:match(DUEL_WINNER_KNOCKOUT:gsub("%%1$s", "%.+"):gsub("%%2$s", "%.+")) or msg:match(DUEL_WINNER_RETREAT:gsub("%%1$s", "%.+"):gsub("%%2$s", "%.+")) then
-- Player has defeated player in a duel.
if msg:match(DUEL_WINNER_KNOCKOUT:gsub("%%1$s", charName):gsub("%%2$s", "%.+")) then return false end
if msg:match(DUEL_WINNER_KNOCKOUT:gsub("%%1$s", nameRealm):gsub("%%2$s", "%.+")) then return false end
if msg:match(DUEL_WINNER_KNOCKOUT:gsub("%%1$s", "%.+"):gsub("%%2$s", charName)) then return false end
if msg:match(DUEL_WINNER_KNOCKOUT:gsub("%%1$s", "%.+"):gsub("%%2$s", nameRealm)) then return false end
-- Player has fled from player in a duel.
if msg:match(DUEL_WINNER_RETREAT:gsub("%%1$s", charName):gsub("%%2$s", "%.+")) then return false end
if msg:match(DUEL_WINNER_RETREAT:gsub("%%1$s", nameRealm):gsub("%%2$s", "%.+")) then return false end
if msg:match(DUEL_WINNER_RETREAT:gsub("%%1$s", "%.+"):gsub("%%2$s", charName)) then return false end
if msg:match(DUEL_WINNER_RETREAT:gsub("%%1$s", "%.+"):gsub("%%2$s", nameRealm)) then return false end
-- Block all duel messages not involving player
return true
end
end
-- Block spell links
if LeaPlusLC["BlockSpellLinks"] == "On" and UnitAffectingCombat("player") then
if msg:find("|Hspell") then return true end
end
-- Block drunken spam
if LeaPlusLC["BlockDrunkenSpam"] == "On" then
for i = 1, 4 do
local drunk1 = _G["DRUNK_MESSAGE_ITEM_OTHER"..i]:gsub("%%s", "%s-")
local drunk2 = _G["DRUNK_MESSAGE_OTHER"..i]:gsub("%%s", "%s-")
if msg:match(drunk1) or msg:match(drunk2) then
return true
end
end
end
end
-- Enable or disable chat filter settings
local function SetChatFilter()
if LeaPlusLC["BlockSpellLinks"] == "On" then
ChatFrame_AddMessageEventFilter("CHAT_MSG_SAY", ChatFilterFunc)
ChatFrame_AddMessageEventFilter("CHAT_MSG_PARTY", ChatFilterFunc)
ChatFrame_AddMessageEventFilter("CHAT_MSG_PARTY_LEADER", ChatFilterFunc)
ChatFrame_AddMessageEventFilter("CHAT_MSG_RAID", ChatFilterFunc)
ChatFrame_AddMessageEventFilter("CHAT_MSG_RAID_LEADER", ChatFilterFunc)
ChatFrame_AddMessageEventFilter("CHAT_MSG_INSTANCE_CHAT", ChatFilterFunc)
ChatFrame_AddMessageEventFilter("CHAT_MSG_INSTANCE_CHAT_LEADER", ChatFilterFunc)
ChatFrame_AddMessageEventFilter("CHAT_MSG_EMOTE", ChatFilterFunc)
ChatFrame_AddMessageEventFilter("CHAT_MSG_YELL", ChatFilterFunc)
else
ChatFrame_RemoveMessageEventFilter("CHAT_MSG_SAY", ChatFilterFunc)
ChatFrame_RemoveMessageEventFilter("CHAT_MSG_PARTY", ChatFilterFunc)
ChatFrame_RemoveMessageEventFilter("CHAT_MSG_PARTY_LEADER", ChatFilterFunc)
ChatFrame_RemoveMessageEventFilter("CHAT_MSG_RAID", ChatFilterFunc)
ChatFrame_RemoveMessageEventFilter("CHAT_MSG_RAID_LEADER", ChatFilterFunc)
ChatFrame_RemoveMessageEventFilter("CHAT_MSG_INSTANCE_CHAT", ChatFilterFunc)
ChatFrame_RemoveMessageEventFilter("CHAT_MSG_INSTANCE_CHAT_LEADER", ChatFilterFunc)
ChatFrame_RemoveMessageEventFilter("CHAT_MSG_EMOTE", ChatFilterFunc)
ChatFrame_RemoveMessageEventFilter("CHAT_MSG_YELL", ChatFilterFunc)
end
if LeaPlusLC["BlockDrunkenSpam"] == "On" or LeaPlusLC["BlockDuelSpam"] == "On" then
ChatFrame_AddMessageEventFilter("CHAT_MSG_SYSTEM", ChatFilterFunc)
else
ChatFrame_RemoveMessageEventFilter("CHAT_MSG_SYSTEM", ChatFilterFunc)
end
end
-- Set chat filter when settings are clicked and on startup
LeaPlusCB["BlockSpellLinks"]:HookScript("OnClick", SetChatFilter)
LeaPlusCB["BlockDrunkenSpam"]:HookScript("OnClick", SetChatFilter)
LeaPlusCB["BlockDuelSpam"]:HookScript("OnClick", SetChatFilter)
SetChatFilter()
-- Reset button handler
ChatFilterPanel.r:SetScript("OnClick", function()
-- Reset controls
LeaPlusLC["BlockSpellLinks"] = "Off"
LeaPlusLC["BlockDrunkenSpam"] = "Off"
LeaPlusLC["BlockDuelSpam"] = "Off"
SetChatFilter()
-- Refresh configuration panel
ChatFilterPanel:Hide(); ChatFilterPanel:Show()
end)
-- Show configuration panal when options panel button is clicked
LeaPlusCB["FilterChatMessagesBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["BlockSpellLinks"] = "On"
LeaPlusLC["BlockDrunkenSpam"] = "On"
LeaPlusLC["BlockDuelSpam"] = "On"
SetChatFilter()
else
ChatFilterPanel:Show()
LeaPlusLC:HideFrames()
end
end)
end
----------------------------------------------------------------------
-- Automatically accept resurrection requests (no reload required)
----------------------------------------------------------------------
do
-- Create configuration panel
local AcceptResPanel = LeaPlusLC:CreatePanel("Accept resurrection", "AcceptResPanel")
LeaPlusLC:MakeTx(AcceptResPanel, "Settings", 16, -72)
LeaPlusLC:MakeCB(AcceptResPanel, "AutoResNoCombat", "Exclude combat resurrection", 16, -92, false, "If checked, resurrection requests will not be automatically accepted if the player resurrecting you is in combat.")
-- Help button hidden
AcceptResPanel.h:Hide()
-- Back button handler
AcceptResPanel.b:SetScript("OnClick", function()
AcceptResPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page1"]:Show();
return
end)
-- Reset button handler
AcceptResPanel.r:SetScript("OnClick", function()
-- Reset checkboxes
LeaPlusLC["AutoResNoCombat"] = "On"
-- Refresh panel
AcceptResPanel:Hide(); AcceptResPanel:Show()
end)
-- Show panal when options panel button is clicked
LeaPlusCB["AutoAcceptResBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["AutoResNoCombat"] = "On"
else
AcceptResPanel:Show()
LeaPlusLC:HideFrames()
end
end)
-- Function to set resurrect event
local function SetResEvent()
if LeaPlusLC["AutoAcceptRes"] == "On" then
AcceptResPanel:RegisterEvent("RESURRECT_REQUEST")
else
AcceptResPanel:UnregisterEvent("RESURRECT_REQUEST")
end
end
-- Run function when option is clicked and on startup if option is enabled
LeaPlusCB["AutoAcceptRes"]:HookScript("OnClick", SetResEvent)
if LeaPlusLC["AutoAcceptRes"] == "On" then SetResEvent() end
-- Handle event
AcceptResPanel:SetScript("OnEvent", function(self, event, arg1)
if event == "RESURRECT_REQUEST" then
-- Exclude pylon and brazier requests
local pylonLoc
-- Exclude Failure Detection Pylon
pylonLoc = "Failure Detection Pylon"
if GameLocale == "zhCN" then pylonLoc = "故障检测晶塔"
elseif GameLocale == "zhTW" then pylonLoc = "滅團偵測水晶塔"
elseif GameLocale == "ruRU" then pylonLoc = "Пилон для обнаружения проблем"
elseif GameLocale == "koKR" then pylonLoc = "고장 감지 변환기"
elseif GameLocale == "esMX" then pylonLoc = "Pilón detector de errores"
elseif GameLocale == "ptBR" then pylonLoc = "Pilar Detector de Falhas"
elseif GameLocale == "deDE" then pylonLoc = "Fehlschlagdetektorpylon"
elseif GameLocale == "esES" then pylonLoc = "Pilón detector de errores"
elseif GameLocale == "frFR" then pylonLoc = "Pylône de détection des échecs"
elseif GameLocale == "itIT" then pylonLoc = "Pilone d'Individuazione Fallimenti"
end
if arg1 == pylonLoc then return end
-- Exclude Brazier of Awakening
pylonLoc = "Brazier of Awakening"
if GameLocale == "zhCN" then pylonLoc = "觉醒火盆"
elseif GameLocale == "zhTW" then pylonLoc = "覺醒火盆"
elseif GameLocale == "ruRU" then pylonLoc = "Жаровня пробуждения"
elseif GameLocale == "koKR" then pylonLoc = "각성의 화로"
elseif GameLocale == "esMX" then pylonLoc = "Blandón del Despertar"
elseif GameLocale == "ptBR" then pylonLoc = "Braseiro do Despertar"
elseif GameLocale == "deDE" then pylonLoc = "Kohlenbecken des Erwachens"
elseif GameLocale == "esES" then pylonLoc = "Blandón de Despertar"
elseif GameLocale == "frFR" then pylonLoc = "Brasero de l'Éveil"
elseif GameLocale == "itIT" then pylonLoc = "Braciere del Risveglio"
end
if arg1 == pylonLoc then return end
-- Manage other resurrection requests
if not UnitAffectingCombat(arg1) or LeaPlusLC["AutoResNoCombat"] == "Off" then
AcceptResurrect()
StaticPopup_Hide("RESURRECT_NO_TIMER")
end
return
end
end)
end
----------------------------------------------------------------------
-- Hide keybind text
----------------------------------------------------------------------
if LeaPlusLC["HideKeybindText"] == "On" and not LeaLockList["HideKeybindText"] then
-- Hide bind text
for i = 1, 12 do
_G["ActionButton"..i.."HotKey"]:SetAlpha(0) -- Main bar
_G["MultiBarBottomRightButton"..i.."HotKey"]:SetAlpha(0) -- Bottom right bar
_G["MultiBarBottomLeftButton"..i.."HotKey"]:SetAlpha(0) -- Bottom left bar
_G["MultiBarRightButton"..i.."HotKey"]:SetAlpha(0) -- Right bar
_G["MultiBarLeftButton"..i.."HotKey"]:SetAlpha(0) -- Left bar
_G["MultiBar5Button" .. i .. "HotKey"]:SetAlpha(0) -- Dragonflight new bars
_G["MultiBar6Button" .. i .. "HotKey"]:SetAlpha(0) -- Dragonflight new bars
_G["MultiBar7Button" .. i .. "HotKey"]:SetAlpha(0) -- Dragonflight new bars
end
end
----------------------------------------------------------------------
-- Hide macro text
----------------------------------------------------------------------
if LeaPlusLC["HideMacroText"] == "On" and not LeaLockList["HideMacroText"] then
-- Hide marco text
for i = 1, 12 do
_G["ActionButton"..i.."Name"]:SetAlpha(0) -- Main bar
_G["MultiBarBottomRightButton"..i.."Name"]:SetAlpha(0) -- Bottom right bar
_G["MultiBarBottomLeftButton"..i.."Name"]:SetAlpha(0) -- Bottom left bar
_G["MultiBarRightButton"..i.."Name"]:SetAlpha(0) -- Right bar
_G["MultiBarLeftButton"..i.."Name"]:SetAlpha(0) -- Left bar
_G["MultiBar5Button" .. i .. "Name"]:SetAlpha(0) -- Dragonflight new bars
_G["MultiBar6Button" .. i .. "Name"]:SetAlpha(0) -- Dragonflight new bars
_G["MultiBar7Button" .. i .. "Name"]:SetAlpha(0) -- Dragonflight new bars
end
end
----------------------------------------------------------------------
-- Automatically release in battlegrounds
----------------------------------------------------------------------
do
-- Create configuration panel
local ReleasePanel = LeaPlusLC:CreatePanel("Release in PvP", "ReleasePanel")
LeaPlusLC:MakeTx(ReleasePanel, "Settings", 16, -72)
LeaPlusLC:MakeCB(ReleasePanel, "AutoReleaseNoAlterac", "Exclude Alterac Valley", 16, -92, false, "If checked, you will not release automatically in Alterac Valley.")
LeaPlusLC:MakeCB(ReleasePanel, "AutoReleaseNoWintergsp", "Exclude Wintergrasp", 16, -112, false, "If checked, you will not release automatically in Wintergrasp.")
LeaPlusLC:MakeCB(ReleasePanel, "AutoReleaseNoTolBarad", "Exclude Tol Barad (PvP)", 16, -132, false, "If checked, you will not release automatically in Tol Barad (PvP).")
LeaPlusLC:MakeCB(ReleasePanel, "AutoReleaseNoAshran", "Exclude Ashran", 16, -152, false, "If checked, you will not release automatically in Ashran.")
LeaPlusLC:MakeTx(ReleasePanel, "Delay", 356, -72)
LeaPlusLC:MakeSL(ReleasePanel, "AutoReleaseDelay", "Drag to set the number of milliseconds before you are automatically released.|n|nYou can hold down shift as the timer is ending to cancel the automatic release.", 0, 3000, 100, 356, -92, "%.0f")
-- Help button hidden
ReleasePanel.h:Hide()
-- Back button handler
ReleasePanel.b:SetScript("OnClick", function()
ReleasePanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page1"]:Show();
return
end)
-- Reset button handler
ReleasePanel.r:SetScript("OnClick", function()
-- Reset checkboxes
LeaPlusLC["AutoReleaseNoAlterac"] = "Off"
LeaPlusLC["AutoReleaseNoWintergsp"] = "Off"
LeaPlusLC["AutoReleaseNoTolBarad"] = "Off"
LeaPlusLC["AutoReleaseNoAshran"] = "Off"
LeaPlusLC["AutoReleaseDelay"] = 0
-- Refresh panel
ReleasePanel:Hide(); ReleasePanel:Show()
end)
-- Show panal when options panel button is clicked
LeaPlusCB["AutoReleasePvPBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["AutoReleaseNoAlterac"] = "Off"
LeaPlusLC["AutoReleaseNoWintergsp"] = "Off"
LeaPlusLC["AutoReleaseNoTolBarad"] = "Off"
LeaPlusLC["AutoReleaseNoAshran"] = "Off"
LeaPlusLC["AutoReleaseDelay"] = 0
else
ReleasePanel:Show()
LeaPlusLC:HideFrames()
end
end)
-- Create event frame
local ReleaseEvent = CreateFrame("FRAME")
-- Function to set event
local function SetReleasePvP()
if LeaPlusLC["AutoReleasePvP"] == "On" then
ReleaseEvent:RegisterEvent("PLAYER_DEAD")
else
ReleaseEvent:UnregisterEvent("PLAYER_DEAD")
end
end
-- Set release event on startup and when option is clicked
LeaPlusCB["AutoReleasePvP"]:HookScript("OnClick", SetReleasePvP)
if LeaPlusLC["AutoReleasePvP"] == "On" then SetReleasePvP() end
-- Click the release button during OnUpdate when required
local ReleaseButtonReady = 0
hooksecurefunc(StaticPopupDialogs["DEATH"], "OnUpdate", function(self)
if ReleaseButtonReady == 1 and self.button1:IsEnabled() then
ReleaseButtonReady = 0
self.button1:Click()
end
end)
-- Release in PvP
ReleaseEvent:SetScript("OnEvent", function()
-- If player has ability to self-resurrect (soulstone, reincarnation, etc), do nothing and quit
if C_DeathInfo.GetSelfResurrectOptions() and #C_DeathInfo.GetSelfResurrectOptions() > 0 then return end
-- Resurrect if player is in a battleground
local InstStat, InstType = IsInInstance()
if InstStat and InstType == "pvp" then
-- Exclude specific instanced maps
local mapID = C_Map.GetBestMapForUnit("player") or nil
if mapID then
if mapID == 91 and LeaPlusLC["AutoReleaseNoAlterac"] == "On" then return end -- Alterac Valley
if mapID == 1537 and LeaPlusLC["AutoReleaseNoAlterac"] == "On" then return end -- Alterac Valley
if mapID == 1334 and LeaPlusLC["AutoReleaseNoWintergsp"] == "On" then return end -- Wintergrasp (instanced)
if mapID == 1478 and LeaPlusLC["AutoReleaseNoAshran"] == "On" then return end -- Ashran (instanced)
end
-- Release automatically
local delay = LeaPlusLC["AutoReleaseDelay"] / 1000
C_Timer.After(delay, function()
if IsShiftKeyDown() then
LeaPlusLC:DisplayMessage(L["Automatic Release Cancelled"], true)
else
ReleaseButtonReady = 1
end
return
end)
end
-- Resurrect if playuer is in a PvP location
local areaID = C_Map.GetBestMapForUnit("player") or 0
if areaID == 123 and LeaPlusLC["AutoReleaseNoWintergsp"] == "Off" -- Wintergrasp
or areaID == 244 and LeaPlusLC["AutoReleaseNoTolBarad"] == "Off" -- Tol Barad (PvP)
or areaID == 588 and LeaPlusLC["AutoReleaseNoAshran"] == "Off" -- Ashran
or areaID == 622 and LeaPlusLC["AutoReleaseNoAshran"] == "Off" -- Stormshield
or areaID == 624 and LeaPlusLC["AutoReleaseNoAshran"] == "Off" -- Warspear
then
local delay = LeaPlusLC["AutoReleaseDelay"] / 1000
C_Timer.After(delay, function()
if IsShiftKeyDown() then
LeaPlusLC:DisplayMessage(L["Automatic Release Cancelled"], true)
else
ReleaseButtonReady = 1
end
return
end)
end
end)
end
----------------------------------------------------------------------
-- Sync from friends (no reload required)
----------------------------------------------------------------------
do
hooksecurefunc(QuestSessionManager.StartDialog, "Show", function(self)
if LeaPlusLC["SyncFromFriends"] == "On" then
local details = C_QuestSession.GetSessionBeginDetails()
if details then
for index, unit in ipairs({"player", "party1", "party2", "party3", "party4",}) do
local guid = UnitGUID(unit)
if guid == details.guid then
local requesterName = UnitName(unit)
if requesterName and LeaPlusLC:FriendCheck(requesterName, guid) then
self.ButtonContainer.Confirm:Click()
end
return
end
end
end
end
end)
end
----------------------------------------------------------------------
-- Set weather density (no reload required)
----------------------------------------------------------------------
do
-- Create configuration panel
local weatherPanel = LeaPlusLC:CreatePanel("Set weather density", "weatherPanel")
LeaPlusLC:MakeTx(weatherPanel, "Settings", 16, -72)
LeaPlusLC:MakeSL(weatherPanel, "WeatherLevel", "Drag to set the density of weather effects.", 0, 3, 1, 16, -92, "%.0f")
local weatherSliderTable = {L["Off"], L["Low"], L["Medium"], L["High"]}
-- Function to set the weather density
local function SetWeatherFunc()
LeaPlusCB["WeatherLevel"].f:SetText(LeaPlusLC["WeatherLevel"] .. " (" .. weatherSliderTable[LeaPlusLC["WeatherLevel"] + 1] .. ")")
if LeaPlusLC["SetWeatherDensity"] == "On" then
SetCVar("WeatherDensity", LeaPlusLC["WeatherLevel"])
SetCVar("RAIDweatherDensity", LeaPlusLC["WeatherLevel"])
else
SetCVar("WeatherDensity", "3")
SetCVar("RAIDweatherDensity", "3")
end
end
-- Set weather density when options are clicked and on startup if option is enabled
LeaPlusCB["SetWeatherDensity"]:HookScript("OnClick", SetWeatherFunc)
LeaPlusCB["WeatherLevel"]:HookScript("OnValueChanged", SetWeatherFunc)
if LeaPlusLC["SetWeatherDensity"] == "On" then SetWeatherFunc() end
-- Prevent weather density from being changed when particle density is changed
hooksecurefunc("SetCVar", function(setting, value)
if setting and LeaPlusLC["SetWeatherDensity"] == "On" then
if setting == "graphicsParticleDensity" then
if GetCVar("WeatherDensity") ~= LeaPlusLC["WeatherLevel"] then
C_Timer.After(0.1, function()
SetCVar("WeatherDensity", LeaPlusLC["WeatherLevel"])
end)
end
elseif setting == "raidGraphicsParticleDensity" then
if GetCVar("RAIDweatherDensity") ~= LeaPlusLC["WeatherLevel"] then
C_Timer.After(0.1, function()
SetCVar("RAIDweatherDensity", LeaPlusLC["WeatherLevel"])
end)
end
end
end
end)
-- Help button hidden
weatherPanel.h:Hide()
-- Back button handler
weatherPanel.b:SetScript("OnClick", function()
weatherPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page7"]:Show()
return
end)
-- Reset button handler
weatherPanel.r:SetScript("OnClick", function()
-- Reset slider
LeaPlusLC["WeatherLevel"] = 3
-- Refresh side panel
weatherPanel:Hide(); weatherPanel:Show()
end)
-- Show configuration panal when options panel button is clicked
LeaPlusCB["SetWeatherDensityBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["WeatherLevel"] = 0
SetWeatherFunc()
else
weatherPanel:Show()
LeaPlusLC:HideFrames()
end
end)
end
----------------------------------------------------------------------
-- Remove raid restrictions (no reload required)
----------------------------------------------------------------------
do
-- Function to set raid restrictions
local function SetRaidFunc()
if LeaPlusLC["NoRaidRestrictions"] == "On" then
SetAllowLowLevelRaid(true)
else
SetAllowLowLevelRaid(false)
end
end
-- Run function when option is clicked and on startup (if enabled)
LeaPlusCB["NoRaidRestrictions"]:HookScript("OnClick", SetRaidFunc)
if LeaPlusLC["NoRaidRestrictions"] == "On" then SetRaidFunc() end
end
----------------------------------------------------------------------
-- Disable screen glow (no reload required)
----------------------------------------------------------------------
do
-- Function to set screen glow
local function SetGlow()
if LeaPlusLC["NoScreenGlow"] == "On" then
SetCVar("ffxGlow", "0")
else
SetCVar("ffxGlow", "1")
end
end
-- Set screen glow on startup and when option is clicked (if enabled)
LeaPlusCB["NoScreenGlow"]:HookScript("OnClick", SetGlow)
if LeaPlusLC["NoScreenGlow"] == "On" then SetGlow() end
end
----------------------------------------------------------------------
-- Disable screen effects (no reload required)
----------------------------------------------------------------------
do
-- Function to set screen effects
local function SetEffects()
if LeaPlusLC["NoScreenEffects"] == "On" then
SetCVar("ffxDeath", "0")
SetCVar("ffxNether", "0")
SetCVar("ffxVenari", "0")
SetCVar("ffxLingeringVenari", "0")
else
SetCVar("ffxDeath", "1")
SetCVar("ffxNether", "1")
SetCVar("ffxVenari", "1")
SetCVar("ffxLingeringVenari", "1")
end
end
-- Set screen effects when option is clicked and on startup (if enabled)
LeaPlusCB["NoScreenEffects"]:HookScript("OnClick", SetEffects)
if LeaPlusLC["NoScreenEffects"] == "On" then SetEffects() end
end
----------------------------------------------------------------------
-- Max camera zoom (no reload required)
----------------------------------------------------------------------
do
-- Function to set camera zoom
local function SetZoom()
if LeaPlusLC["MaxCameraZoom"] == "On" then
SetCVar("cameraDistanceMaxZoomFactor", 2.6)
else
SetCVar("cameraDistanceMaxZoomFactor", 1.9)
end
end
-- Set camera zoom when option is clicked and on startup (if enabled)
LeaPlusCB["MaxCameraZoom"]:HookScript("OnClick", SetZoom)
if LeaPlusLC["MaxCameraZoom"] == "On" then SetZoom() end
end
----------------------------------------------------------------------
-- Universal group chat color (no reload required)
----------------------------------------------------------------------
do
-- Function to set chat colors
local function SetCol()
if LeaPlusLC["UnivGroupColor"] == "On" then
ChangeChatColor("RAID", 0.67, 0.67, 1)
ChangeChatColor("RAID_LEADER", 0.46, 0.78, 1)
ChangeChatColor("INSTANCE_CHAT", 0.67, 0.67, 1)
ChangeChatColor("INSTANCE_CHAT_LEADER", 0.46, 0.78, 1)
else
ChangeChatColor("RAID", 1, 0.50, 0)
ChangeChatColor("RAID_LEADER", 1, 0.28, 0.04)
ChangeChatColor("INSTANCE_CHAT", 1, 0.50, 0)
ChangeChatColor("INSTANCE_CHAT_LEADER", 1, 0.28, 0.04)
end
end
-- Set chat colors when option is clicked and on startup (if enabled)
LeaPlusCB["UnivGroupColor"]:HookScript("OnClick", SetCol)
if LeaPlusLC["UnivGroupColor"] == "On" then SetCol() end
end
----------------------------------------------------------------------
-- Minimap button (no reload required)
----------------------------------------------------------------------
do
-- Minimap button click function
local function MiniBtnClickFunc(arg1)
-- Prevent options panel from showing if Blizzard Store is showing
if StoreFrame and StoreFrame:GetAttribute("isshown") then return end
-- Left button down
if arg1 == "LeftButton" then
-- Control key toggles target tracking
if IsControlKeyDown() and not IsShiftKeyDown() and not IsAltKeyDown() then
for i = 1, C_Minimap.GetNumTrackingTypes() do
local name, texture, active, category = C_Minimap.GetTrackingInfo(i)
if name == MINIMAP_TRACKING_TARGET then
if active then
C_Minimap.SetTracking(i, false)
LeaPlusLC:DisplayMessage(L["Target Tracking Disabled"], true)
else
C_Minimap.SetTracking(i, true)
LeaPlusLC:DisplayMessage(L["Target Tracking Enabled"], true)
end
end
end
return
end
-- Shift key toggles music
if IsShiftKeyDown() and not IsControlKeyDown() and not IsAltKeyDown() then
Sound_ToggleMusic()
return
end
-- Shift key and control key toggles Zygor addon
if IsShiftKeyDown() and IsControlKeyDown() and not IsAltKeyDown() then
LeaPlusLC:ZygorToggle()
return
end
-- Alt key toggles error messages
if IsAltKeyDown() and not IsControlKeyDown() and not IsShiftKeyDown() then
if LeaPlusDB["HideErrorMessages"] == "On" then -- Checks global
if LeaPlusLC["ShowErrorsFlag"] == 1 then
LeaPlusLC["ShowErrorsFlag"] = 0
LeaPlusLC:DisplayMessage(L["Error messages will be shown"], true)
else
LeaPlusLC["ShowErrorsFlag"] = 1
LeaPlusLC:DisplayMessage(L["Error messages will be hidden"], true)
end
return
end
return
end
-- Control key and alt key toggles maximised window mode
if IsControlKeyDown() and IsAltKeyDown() and not IsShiftKeyDown() then
if LeaPlusLC:PlayerInCombat() then
return
else
SetCVar("gxMaximize", tostring(1 - GetCVar("gxMaximize")))
UpdateWindow()
end
return
end
-- No modifier key toggles the options panel
if LeaPlusLC:IsPlusShowing() then
LeaPlusLC:HideFrames()
LeaPlusLC:HideConfigPanels()
else
LeaPlusLC:HideFrames()
LeaPlusLC["PageF"]:Show()
end
LeaPlusLC["Page"..LeaPlusLC["LeaStartPage"]]:Show()
end
-- Right button down
if arg1 == "RightButton" then
-- No modifier key toggles the options panel
if LeaPlusLC:IsPlusShowing() then
LeaPlusLC:HideFrames()
LeaPlusLC:HideConfigPanels()
else
LeaPlusLC:HideFrames()
LeaPlusLC["PageF"]:Show()
end
LeaPlusLC["Page" .. LeaPlusLC["LeaStartPage"]]:Show()
end
end
-- Create minimap button using LibDBIcon
local miniButton = LibStub("LibDataBroker-1.1"):NewDataObject("Leatrix_Plus", {
type = "data source",
text = "Leatrix Plus",
icon = "Interface\\HELPFRAME\\ReportLagIcon-Movement",
OnClick = function(self, btn)
MiniBtnClickFunc(btn)
end,
OnTooltipShow = function(tooltip)
if not tooltip or not tooltip.AddLine then return end
tooltip:AddLine("Leatrix Plus")
end,
})
local icon = LibStub("LibDBIcon-1.0", true)
icon:Register("Leatrix_Plus", miniButton, LeaPlusDB)
-- Function to toggle LibDBIcon
local function SetLibDBIconFunc()
if LeaPlusLC["ShowMinimapIcon"] == "On" then
LeaPlusDB["hide"] = false
icon:Show("Leatrix_Plus")
else
LeaPlusDB["hide"] = true
icon:Hide("Leatrix_Plus")
end
end
-- Set LibDBIcon when option is clicked and on startup
LeaPlusCB["ShowMinimapIcon"]:HookScript("OnClick", SetLibDBIconFunc)
SetLibDBIconFunc()
-- Add Leatrix Plus to addon compartment frame (not used for the moment)
--[[AddonCompartmentFrame:RegisterAddon({
text = L["Leatrix Plus"],
icon = "Interface\\HELPFRAME\\ReportLagIcon-Movement",
func = function(self, void, void, void, btn)
MiniBtnClickFunc(btn)
end,
})]]
end
----------------------------------------------------------------------
-- Show volume control on character frame
----------------------------------------------------------------------
if LeaPlusLC["ShowVolume"] == "On" then
-- Function to update master volume
local function MasterVolUpdate()
if LeaPlusLC["ShowVolume"] == "On" then
-- Set the volume
SetCVar("Sound_MasterVolume", LeaPlusLC["LeaPlusMaxVol"]);
-- Format the slider text
LeaPlusCB["LeaPlusMaxVol"].f:SetFormattedText("%.0f", LeaPlusLC["LeaPlusMaxVol"] * 20)
end
end
-- Create slider control
LeaPlusLC["LeaPlusMaxVol"] = tonumber(GetCVar("Sound_MasterVolume"))
LeaPlusLC:MakeSL(CharacterModelScene, "LeaPlusMaxVol", "", 0, 1, 0.05, -34, -328, "%.2f")
LeaPlusCB["LeaPlusMaxVol"]:SetWidth(64)
-- Set slider control value when shown
LeaPlusCB["LeaPlusMaxVol"]:SetScript("OnShow", function()
LeaPlusCB["LeaPlusMaxVol"]:SetValue(GetCVar("Sound_MasterVolume"))
end)
-- Update volume when slider control is changed
LeaPlusCB["LeaPlusMaxVol"]:HookScript("OnValueChanged", function()
if IsMouseButtonDown("RightButton") and IsShiftKeyDown() then
-- Dual layout is active so don't adjust slider
LeaPlusCB["LeaPlusMaxVol"].f:SetFormattedText("%.0f", LeaPlusLC["LeaPlusMaxVol"] * 20)
LeaPlusCB["LeaPlusMaxVol"]:Hide()
LeaPlusCB["LeaPlusMaxVol"]:Show()
return
else
-- Set sound level and refresh slider
MasterVolUpdate()
end
end)
-- Dual layout
local function SetVolumePlacement()
if LeaPlusLC["ShowVolumeInFrame"] == "On" then
LeaPlusCB["LeaPlusMaxVol"]:ClearAllPoints();
LeaPlusCB["LeaPlusMaxVol"]:SetPoint("TOPLEFT", 72, -276)
else
LeaPlusCB["LeaPlusMaxVol"]:ClearAllPoints();
LeaPlusCB["LeaPlusMaxVol"]:SetPoint("TOPLEFT", -34, -328)
end
end
LeaPlusCB["LeaPlusMaxVol"]:SetScript('OnMouseDown', function(self, btn)
if btn == "RightButton" and IsShiftKeyDown() then
if LeaPlusLC["ShowVolumeInFrame"] == "On" then LeaPlusLC["ShowVolumeInFrame"] = "Off" else LeaPlusLC["ShowVolumeInFrame"] = "On" end
SetVolumePlacement();
end
end)
CharacterModelScene:HookScript("OnShow",function()
SetVolumePlacement()
end)
-- ElvUI skin for slider control
if LeaPlusLC.ElvUI then
_G.LeaPlusGlobalVolumeButton = LeaPlusCB["LeaPlusMaxVol"]
LeaPlusLC.ElvUI:GetModule("Skins"):HandleSliderFrame(_G.LeaPlusGlobalVolumeButton, false)
end
end
----------------------------------------------------------------------
-- Use arrow keys in chat
----------------------------------------------------------------------
if LeaPlusLC["UseArrowKeysInChat"] == "On" and not LeaLockList["UseArrowKeysInChat"] then
-- Enable arrow keys for normal and existing chat frames
for i = 1, 50 do
if _G["ChatFrame" .. i] then
_G["ChatFrame" .. i .. "EditBox"]:SetAltArrowKeyMode(false)
end
end
-- Enable arrow keys for temporary chat frames
hooksecurefunc("FCF_OpenTemporaryWindow", function()
local cf = FCF_GetCurrentChatFrame():GetName() or nil
if cf then
_G[cf .. "EditBox"]:SetAltArrowKeyMode(false)
end
end)
end
----------------------------------------------------------------------
-- Hide social button
----------------------------------------------------------------------
if LeaPlusLC["NoSocialButton"] == "On" and not LeaLockList["NoSocialButton"] then
-- Create hidden frame to store social button
local tframe = CreateFrame("FRAME")
tframe:Hide()
QuickJoinToastButton:SetParent(tframe)
end
----------------------------------------------------------------------
-- L43: Manage widget top
----------------------------------------------------------------------
if LeaPlusLC["ManageWidgetTop"] == "On" and not LeaLockList["ManageWidgetTop"] then
-- Create and manage container for UIWidgetTopCenterContainerFrame
local topCenterHolder = CreateFrame("Frame", nil, UIParent)
topCenterHolder:SetPoint("TOP", UIParent, "TOP", 0, -15)
topCenterHolder:SetSize(10, 58)
local topCenterContainer = _G.UIWidgetTopCenterContainerFrame
topCenterContainer:ClearAllPoints()
topCenterContainer:SetPoint('CENTER', topCenterHolder)
hooksecurefunc(topCenterContainer, 'SetPoint', function(self, void, b)
if b and (b ~= topCenterHolder) then
-- Reset parent if it changes from topCenterHolder
self:ClearAllPoints()
self:SetPoint('CENTER', topCenterHolder)
self:SetParent(topCenterHolder)
end
end)
-- Allow widget frame to be moved
topCenterHolder:SetMovable(true)
topCenterHolder:SetUserPlaced(true)
topCenterHolder:SetDontSavePosition(true)
topCenterHolder:SetClampedToScreen(false)
-- Set widget frame position at startup
topCenterHolder:ClearAllPoints()
topCenterHolder:SetPoint(LeaPlusLC["WidgetTopA"], UIParent, LeaPlusLC["WidgetTopR"], LeaPlusLC["WidgetTopX"], LeaPlusLC["WidgetTopY"])
topCenterHolder:SetScale(LeaPlusLC["WidgetTopScale"])
UIWidgetTopCenterContainerFrame:SetScale(LeaPlusLC["WidgetTopScale"])
-- Create drag frame
local dragframe = CreateFrame("FRAME", nil, nil, "BackdropTemplate")
dragframe:SetPoint("CENTER", topCenterHolder, "CENTER", 0, 1)
dragframe:SetBackdropColor(0.0, 0.5, 1.0)
dragframe:SetBackdrop({edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = { left = 0, right = 0, top = 0, bottom = 0}})
dragframe:SetToplevel(true)
dragframe:Hide()
dragframe:SetScale(LeaPlusLC["WidgetTopScale"])
dragframe.t = dragframe:CreateTexture()
dragframe.t:SetAllPoints()
dragframe.t:SetColorTexture(0.0, 1.0, 0.0, 0.5)
dragframe.t:SetAlpha(0.5)
dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge')
dragframe.f:SetPoint('CENTER', 0, 0)
dragframe.f:SetText(L["Widget Top"])
-- Click handler
dragframe:SetScript("OnMouseDown", function(self, btn)
-- Start dragging if left clicked
if btn == "LeftButton" then
topCenterHolder:StartMoving()
end
end)
dragframe:SetScript("OnMouseUp", function()
-- Save frame position
topCenterHolder:StopMovingOrSizing()
LeaPlusLC["WidgetTopA"], void, LeaPlusLC["WidgetTopR"], LeaPlusLC["WidgetTopX"], LeaPlusLC["WidgetTopY"] = topCenterHolder:GetPoint()
topCenterHolder:SetMovable(true)
topCenterHolder:ClearAllPoints()
topCenterHolder:SetPoint(LeaPlusLC["WidgetTopA"], UIParent, LeaPlusLC["WidgetTopR"], LeaPlusLC["WidgetTopX"], LeaPlusLC["WidgetTopY"])
end)
-- Snap-to-grid
do
local frame, grid = dragframe, 10
local w, h = 0, 60
local xpos, ypos, scale, uiscale
frame:RegisterForDrag("RightButton")
frame:HookScript("OnDragStart", function()
frame:SetScript("OnUpdate", function()
scale, uiscale = frame:GetScale(), UIParent:GetScale()
xpos, ypos = GetCursorPosition()
xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2
ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2
topCenterHolder:ClearAllPoints()
topCenterHolder:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos)
end)
end)
frame:HookScript("OnDragStop", function()
frame:SetScript("OnUpdate", nil)
frame:GetScript("OnMouseUp")()
end)
end
-- Create configuration panel
local WidgetTopPanel = LeaPlusLC:CreatePanel("Manage widget top", "WidgetTopPanel")
-- Create Titan Panel screen adjust warning
local titanFrame = CreateFrame("FRAME", nil, WidgetTopPanel)
titanFrame:SetAllPoints()
titanFrame:Hide()
LeaPlusLC:MakeTx(titanFrame, "Warning", 16, -172)
titanFrame.txt = LeaPlusLC:MakeWD(titanFrame, "Titan Panel screen adjust needs to be disabled for the frame to be saved correctly.", 16, -192, 500)
titanFrame.txt:SetWordWrap(false)
titanFrame.txt:SetWidth(520)
titanFrame.btn = LeaPlusLC:CreateButton("fixTitanBtn", titanFrame, "Okay, disable screen adjust for me", "TOPLEFT", 16, -212, 0, 25, true, "Click to disable Titan Panel screen adjust. Your UI will be reloaded.")
titanFrame.btn:SetScript("OnClick", function()
TitanPanelSetVar("ScreenAdjust", 1)
ReloadUI()
end)
LeaPlusLC:MakeTx(WidgetTopPanel, "Scale", 16, -72)
LeaPlusLC:MakeSL(WidgetTopPanel, "WidgetTopScale", "Drag to set the widget top scale.", 0.5, 2, 0.05, 16, -92, "%.2f")
-- Set scale when slider is changed
LeaPlusCB["WidgetTopScale"]:HookScript("OnValueChanged", function()
topCenterHolder:SetScale(LeaPlusLC["WidgetTopScale"])
UIWidgetTopCenterContainerFrame:SetScale(LeaPlusLC["WidgetTopScale"])
dragframe:SetScale(LeaPlusLC["WidgetTopScale"])
-- Show formatted slider value
LeaPlusCB["WidgetTopScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["WidgetTopScale"] * 100)
end)
-- Hide frame alignment grid with panel
WidgetTopPanel:HookScript("OnHide", function()
LeaPlusLC.grid:Hide()
end)
-- Toggle grid button
local WidgetTopToggleGridButton = LeaPlusLC:CreateButton("WidgetTopToggleGridButton", WidgetTopPanel, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.")
LeaPlusCB["WidgetTopToggleGridButton"]:ClearAllPoints()
LeaPlusCB["WidgetTopToggleGridButton"]:SetPoint("LEFT", WidgetTopPanel.h, "RIGHT", 10, 0)
LeaPlusCB["WidgetTopToggleGridButton"]:SetScript("OnClick", function()
if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end
end)
WidgetTopPanel:HookScript("OnHide", function()
if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end
end)
-- Help button tooltip
WidgetTopPanel.h.tiptext = L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid."]
-- Back button handler
WidgetTopPanel.b:SetScript("OnClick", function()
WidgetTopPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show()
return
end)
-- Reset button handler
WidgetTopPanel.r:SetScript("OnClick", function()
-- Reset position and scale
LeaPlusLC["WidgetTopA"] = "TOP"
LeaPlusLC["WidgetTopR"] = "TOP"
LeaPlusLC["WidgetTopX"] = 0
LeaPlusLC["WidgetTopY"] = -15
LeaPlusLC["WidgetTopScale"] = 1
topCenterHolder:ClearAllPoints()
topCenterHolder:SetPoint(LeaPlusLC["WidgetTopA"], UIParent, LeaPlusLC["WidgetTopR"], LeaPlusLC["WidgetTopX"], LeaPlusLC["WidgetTopY"])
-- Refresh configuration panel
WidgetTopPanel:Hide(); WidgetTopPanel:Show()
dragframe:Show()
-- Show frame alignment grid
LeaPlusLC.grid:Show()
end)
-- Show configuration panel when options panel button is clicked
LeaPlusCB["ManageWidgetTopButton"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["WidgetTopA"] = "CENTER"
LeaPlusLC["WidgetTopR"] = "CENTER"
LeaPlusLC["WidgetTopX"] = 0
LeaPlusLC["WidgetTopY"] = -160
LeaPlusLC["WidgetTopScale"] = 1.25
topCenterHolder:ClearAllPoints()
topCenterHolder:SetPoint(LeaPlusLC["WidgetTopA"], UIParent, LeaPlusLC["WidgetTopR"], LeaPlusLC["WidgetTopX"], LeaPlusLC["WidgetTopY"])
topCenterHolder:SetScale(LeaPlusLC["WidgetTopScale"])
UIWidgetTopCenterContainerFrame:SetScale(LeaPlusLC["WidgetTopScale"])
else
-- Show Titan Panel screen adjust warning if Titan Panel is installed with screen adjust enabled
if select(2, GetAddOnInfo("Titan")) then
if IsAddOnLoaded("Titan") then
if TitanPanelSetVar and TitanPanelGetVar then
if not TitanPanelGetVar("ScreenAdjust") then
titanFrame:Show()
end
end
end
end
-- Find out if the UI has a non-standard scale
if GetCVar("useuiscale") == "1" then
LeaPlusLC["gscale"] = GetCVar("uiscale")
else
LeaPlusLC["gscale"] = 1
end
-- Set drag frame size according to UI scale
dragframe:SetWidth(160 * LeaPlusLC["gscale"])
dragframe:SetHeight(79 * LeaPlusLC["gscale"])
-- Show configuration panel
WidgetTopPanel:Show()
LeaPlusLC:HideFrames()
dragframe:Show()
-- Show frame alignment grid
LeaPlusLC.grid:Show()
end
end)
-- Hide drag frame when configuration panel is closed
WidgetTopPanel:HookScript("OnHide", function() dragframe:Hide() end)
end
----------------------------------------------------------------------
-- L45: Manage control
----------------------------------------------------------------------
if LeaPlusLC["ManageControl"] == "On" and not LeaLockList["ManageControl"] then
-- Allow control frame to be moved
LossOfControlFrame:SetMovable(true)
LossOfControlFrame:SetUserPlaced(true)
LossOfControlFrame:SetDontSavePosition(true)
LossOfControlFrame:SetClampedToScreen(true)
-- Set control frame position at startup
LossOfControlFrame:ClearAllPoints()
LossOfControlFrame:SetPoint(LeaPlusLC["ControlA"], UIParent, LeaPlusLC["ControlR"], LeaPlusLC["ControlX"], LeaPlusLC["ControlY"])
LossOfControlFrame:SetScale(LeaPlusLC["ControlScale"])
-- Create drag frame
local dragframe = CreateFrame("FRAME", nil, nil, "BackdropTemplate")
dragframe:SetBackdropColor(0.0, 0.5, 1.0)
dragframe:SetBackdrop({edgeFile = "Interface/Tooltips/UI-Tooltip-Border", tile = false, tileSize = 0, edgeSize = 16, insets = { left = 0, right = 0, top = 0, bottom = 0}})
dragframe:SetToplevel(true)
dragframe:Hide()
dragframe:SetScale(LeaPlusLC["ControlScale"])
dragframe:SetFrameStrata("HIGH") -- Exception for LossOfControlFrame
dragframe.t = dragframe:CreateTexture()
dragframe.t:SetAllPoints()
dragframe.t:SetColorTexture(0.0, 1.0, 0.0, 0.5)
dragframe.t:SetAlpha(0.5)
dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge')
dragframe.f:SetPoint('CENTER', 0, 0)
dragframe.f:SetText(L["Control"])
-- Click handler
dragframe:SetScript("OnMouseDown", function(self, btn)
-- Start dragging if left clicked
if btn == "LeftButton" then
LossOfControlFrame:StartMoving()
end
end)
dragframe:SetScript("OnMouseUp", function()
-- Save frame positions
LossOfControlFrame:StopMovingOrSizing()
LeaPlusLC["ControlA"], void, LeaPlusLC["ControlR"], LeaPlusLC["ControlX"], LeaPlusLC["ControlY"] = LossOfControlFrame:GetPoint()
LossOfControlFrame:SetMovable(true)
LossOfControlFrame:ClearAllPoints()
LossOfControlFrame:SetPoint(LeaPlusLC["ControlA"], UIParent, LeaPlusLC["ControlR"], LeaPlusLC["ControlX"], LeaPlusLC["ControlY"])
end)
-- Snap-to-grid
do
local frame, grid = dragframe, 10
local w, h = 230, 56
local xpos, ypos, scale, uiscale
frame:RegisterForDrag("RightButton")
frame:HookScript("OnDragStart", function()
frame:SetScript("OnUpdate", function()
scale, uiscale = frame:GetScale(), UIParent:GetScale()
xpos, ypos = GetCursorPosition()
xpos = floor((xpos / scale / uiscale) / grid) * grid - w / 2
ypos = ceil((ypos / scale / uiscale) / grid) * grid + h / 2
LossOfControlFrame:ClearAllPoints()
LossOfControlFrame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", xpos, ypos)
end)
end)
frame:HookScript("OnDragStop", function()
frame:SetScript("OnUpdate", nil)
frame:GetScript("OnMouseUp")()
end)
end
-- Create configuration panel
local ControlPanel = LeaPlusLC:CreatePanel("Manage control", "ControlPanel")
LeaPlusLC:MakeTx(ControlPanel, "Scale", 16, -72)
LeaPlusLC:MakeSL(ControlPanel, "ControlScale", "Drag to set the control frame scale.", 0.5, 2, 0.05, 16, -92, "%.2f")
-- Set scale when slider is changed
LeaPlusCB["ControlScale"]:HookScript("OnValueChanged", function()
LossOfControlFrame:SetScale(LeaPlusLC["ControlScale"])
dragframe:SetScale(LeaPlusLC["ControlScale"])
-- Show formatted slider value
LeaPlusCB["ControlScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["ControlScale"] * 100)
end)
-- Hide frame alignment grid with panel
ControlPanel:HookScript("OnHide", function()
LeaPlusLC.grid:Hide()
end)
-- Toggle grid button
local ControlToggleGridButton = LeaPlusLC:CreateButton("ControlToggleGridButton", ControlPanel, "Toggle Grid", "TOPLEFT", 16, -72, 0, 25, true, "Click to toggle the frame alignment grid.")
LeaPlusCB["ControlToggleGridButton"]:ClearAllPoints()
LeaPlusCB["ControlToggleGridButton"]:SetPoint("LEFT", ControlPanel.h, "RIGHT", 10, 0)
LeaPlusCB["ControlToggleGridButton"]:SetScript("OnClick", function()
if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end
end)
ControlPanel:HookScript("OnHide", function()
if LeaPlusLC.grid then LeaPlusLC.grid:Hide() end
end)
-- Help button tooltip
ControlPanel.h.tiptext = L["Drag the frame overlay with the left button to position it freely or with the right button to position it using snap-to-grid."]
-- Back button handler
ControlPanel.b:SetScript("OnClick", function()
ControlPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show()
return
end)
-- Reset button handler
ControlPanel.r:SetScript("OnClick", function()
-- Reset position and scale
LeaPlusLC["ControlA"] = "CENTER"
LeaPlusLC["ControlR"] = "CENTER"
LeaPlusLC["ControlX"] = 0
LeaPlusLC["ControlY"] = 0
LeaPlusLC["ControlScale"] = 1
LossOfControlFrame:ClearAllPoints()
LossOfControlFrame:SetPoint(LeaPlusLC["ControlA"], UIParent, LeaPlusLC["ControlR"], LeaPlusLC["ControlX"], LeaPlusLC["ControlY"])
-- Refresh configuration panel
ControlPanel:Hide(); ControlPanel:Show()
dragframe:Show()
-- Show frame alignment grid
LeaPlusLC.grid:Show()
end)
-- Show configuration panel when options panel button is clicked
LeaPlusCB["ManageControlButton"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["ControlA"] = "CENTER"
LeaPlusLC["ControlR"] = "CENTER"
LeaPlusLC["ControlX"] = 0
LeaPlusLC["ControlY"] = 0
LeaPlusLC["ControlScale"] = 1
LossOfControlFrame:ClearAllPoints()
LossOfControlFrame:SetPoint(LeaPlusLC["ControlA"], UIParent, LeaPlusLC["ControlR"], LeaPlusLC["ControlX"], LeaPlusLC["ControlY"])
LossOfControlFrame:SetScale(LeaPlusLC["ControlScale"])
else
-- Find out if the UI has a non-standard scale
if GetCVar("useuiscale") == "1" then
LeaPlusLC["gscale"] = GetCVar("uiscale")
else
LeaPlusLC["gscale"] = 1
end
-- Set drag frame size and position according to UI scale
dragframe:SetWidth(196 * LeaPlusLC["gscale"])
dragframe:SetHeight(76 * LeaPlusLC["gscale"])
dragframe:ClearAllPoints()
dragframe:SetPoint("CENTER", LossOfControlFrame, "CENTER", -2 * LeaPlusLC["gscale"], 0 * LeaPlusLC["gscale"])
-- Show configuration panel
ControlPanel:Show()
LeaPlusLC:HideFrames()
dragframe:Show()
-- Show frame alignment grid
LeaPlusLC.grid:Show()
end
end)
-- Hide drag frame when configuration panel is closed
ControlPanel:HookScript("OnHide", function() dragframe:Hide() end)
end
----------------------------------------------------------------------
-- Hide chat buttons
----------------------------------------------------------------------
if LeaPlusLC["NoChatButtons"] == "On" and not LeaLockList["NoChatButtons"] then
-- Create hidden frame to store unwanted frames (more efficient than creating functions)
local tframe = CreateFrame("FRAME")
tframe:Hide()
-- Function to enable mouse scrolling with CTRL and SHIFT key modifiers
local function AddMouseScroll(chtfrm)
if _G[chtfrm] then
_G[chtfrm]:SetScript("OnMouseWheel", function(self, direction)
if direction == 1 then
if IsControlKeyDown() then
self:ScrollToTop()
elseif IsShiftKeyDown() then
self:PageUp()
else
self:ScrollUp()
end
else
if IsControlKeyDown() then
self:ScrollToBottom()
elseif IsShiftKeyDown() then
self:PageDown()
else
self:ScrollDown()
end
end
end)
_G[chtfrm]:EnableMouseWheel(true)
end
end
-- Function to hide chat buttons
local function HideButtons(chtfrm)
_G[chtfrm .. "ButtonFrameMinimizeButton"]:SetParent(tframe)
_G[chtfrm .. "ButtonFrameMinimizeButton"]:Hide();
_G[chtfrm .. "ButtonFrame"]:SetSize(0.1,0.1)
_G[chtfrm].ScrollBar:SetParent(tframe)
_G[chtfrm].ScrollBar:Hide()
end
-- Function to highlight chat tabs and click to scroll to bottom
local function HighlightTabs(chtfrm)
-- Hide bottom button
_G[chtfrm].ScrollToBottomButton:SetSize(0.1, 0.1) -- Positions it away
-- Remove click from the bottom button
_G[chtfrm].ScrollToBottomButton:SetScript("OnClick", nil)
-- Remove textures
_G[chtfrm].ScrollToBottomButton:SetNormalTexture("")
_G[chtfrm].ScrollToBottomButton:SetHighlightTexture("")
_G[chtfrm].ScrollToBottomButton:SetPushedTexture("")
_G[chtfrm].ScrollToBottomButton:SetDisabledTexture("")
-- Always scroll to bottom when clicking a tab
_G[chtfrm .. "Tab"]:HookScript("OnClick", function(self,arg1)
if arg1 == "LeftButton" then
_G[chtfrm]:ScrollToBottom()
end
end)
-- Create new bottom button under tab
_G[chtfrm .. "Tab"].newglow = _G[chtfrm .. "Tab"]:CreateTexture(nil, "BACKGROUND")
_G[chtfrm .. "Tab"].newglow:ClearAllPoints()
_G[chtfrm .. "Tab"].newglow:SetPoint("BOTTOMLEFT", _G[chtfrm .. "Tab"], "BOTTOMLEFT", 0, 0)
_G[chtfrm .. "Tab"].newglow:SetTexture("Interface\\ChatFrame\\ChatFrameTab-NewMessage")
_G[chtfrm .. "Tab"].newglow:SetWidth(_G[chtfrm .. "Tab"]:GetWidth())
_G[chtfrm .. "Tab"].newglow:SetVertexColor(0.6, 0.6, 1, 1)
_G[chtfrm .. "Tab"].newglow:Hide()
-- Show new bottom button when old one glows
_G[chtfrm].ScrollToBottomButton.Flash:HookScript("OnShow", function(self,arg1)
_G[chtfrm .. "Tab"].newglow:Show()
end)
_G[chtfrm].ScrollToBottomButton.Flash:HookScript("OnHide", function(self,arg1)
_G[chtfrm .. "Tab"].newglow:Hide()
end)
-- Match new bottom button size to tab
_G[chtfrm .. "Tab"]:HookScript("OnSizeChanged", function()
_G[chtfrm .. "Tab"].newglow:SetWidth(_G[chtfrm .. "Tab"]:GetWidth())
end)
end
-- Set options for normal and existing chat frames
for i = 1, 50 do
if _G["ChatFrame" .. i] then
AddMouseScroll("ChatFrame" .. i);
HideButtons("ChatFrame" .. i);
HighlightTabs("ChatFrame" .. i)
end
end
-- Do the functions above for temporary chat frames
hooksecurefunc("FCF_OpenTemporaryWindow", function(chatType)
local cf = FCF_GetCurrentChatFrame():GetName() or nil
if cf then
-- Set options for temporary frame
AddMouseScroll(cf)
HideButtons(cf)
HighlightTabs(cf)
-- Create new bottom button under tab
_G[cf .. "Tab"].newglow = _G[cf .. "Tab"]:CreateTexture(nil, "BACKGROUND")
_G[cf .. "Tab"].newglow:ClearAllPoints()
_G[cf .. "Tab"].newglow:SetPoint("BOTTOMLEFT", _G[cf .. "Tab"], "BOTTOMLEFT", 0, 0)
_G[cf .. "Tab"].newglow:SetTexture("Interface\\ChatFrame\\ChatFrameTab-NewMessage")
_G[cf .. "Tab"].newglow:SetWidth(_G[cf .. "Tab"]:GetWidth())
_G[cf .. "Tab"].newglow:SetVertexColor(0.6, 0.6, 1, 1)
_G[cf .. "Tab"].newglow:Hide()
-- Show new bottom button when old one glows
_G[cf].ScrollToBottomButton.Flash:HookScript("OnShow", function(self,arg1)
_G[cf .. "Tab"].newglow:Show()
end)
_G[cf].ScrollToBottomButton.Flash:HookScript("OnHide", function(self,arg1)
_G[cf .. "Tab"].newglow:Hide()
end)
-- Match new bottom button size to tab
_G[cf .. "Tab"]:HookScript("OnSizeChanged", function()
_G[cf .. "Tab"].newglow:SetWidth(_G[cf .. "Tab"]:GetWidth())
end)
end
end)
-- Hide text to speech button
TextToSpeechButton:SetParent(tframe)
-- Move voice chat and chat menu buttons inside the chat frame
ChatFrameChannelButton:ClearAllPoints()
ChatFrameChannelButton:SetPoint("TOPRIGHT", ChatFrame1Background, "TOPRIGHT", 1, -3)
ChatFrameChannelButton:SetSize(26,25)
ChatFrameToggleVoiceDeafenButton:ClearAllPoints()
ChatFrameToggleVoiceDeafenButton:SetPoint("TOP", ChatFrameChannelButton, "BOTTOM", 0, -2)
ChatFrameToggleVoiceDeafenButton:SetSize(26,25)
ChatFrameToggleVoiceMuteButton:ClearAllPoints()
ChatFrameToggleVoiceMuteButton:SetPoint("TOP", ChatFrameToggleVoiceDeafenButton, "BOTTOM", 0, -2)
ChatFrameToggleVoiceMuteButton:SetSize(26,25)
ChatFrameMenuButton:ClearAllPoints()
ChatFrameMenuButton:SetPoint("BOTTOMRIGHT", ChatFrame1Background, "BOTTOMRIGHT", 3, 18)
ChatFrameMenuButton:SetSize(29,29)
-- Function to set voice chat and chat menu buttons
local function SetChatButtonFrameButtons()
if LeaPlusLC["ShowVoiceButtons"] == "On" then
-- Show voice chat buttons
ChatFrameChannelButton:SetParent(UIParent)
ChatFrameToggleVoiceDeafenButton:SetParent(UIParent)
ChatFrameToggleVoiceMuteButton:SetParent(UIParent)
else
-- Hide voice chat buttons
ChatFrameChannelButton:SetParent(tframe)
ChatFrameToggleVoiceDeafenButton:SetParent(tframe)
ChatFrameToggleVoiceMuteButton:SetParent(tframe)
end
if LeaPlusLC["ShowChatMenuButton"] == "On" then
-- Show chat menu button
ChatFrameMenuButton:SetParent(UIParent)
else
-- Hide chat menu button
ChatFrameMenuButton:SetParent(tframe)
end
end
-- Create configuration panel
local HideChatButtonsPanel = LeaPlusLC:CreatePanel("Hide chat buttons", "HideChatButtonsPanel")
-- Add checkboxes
LeaPlusLC:MakeTx(HideChatButtonsPanel, "General", 16, -72)
LeaPlusLC:MakeCB(HideChatButtonsPanel, "ShowVoiceButtons", "Show voice chat buttons", 16, -92, false, "If checked, voice chat buttons will be shown.")
LeaPlusLC:MakeCB(HideChatButtonsPanel, "ShowChatMenuButton", "Show chat menu button", 16, -112, false, "If checked, the chat menu button will be shown.")
-- Help button hidden
HideChatButtonsPanel.h:Hide()
-- Back button handler
HideChatButtonsPanel.b:SetScript("OnClick", function()
HideChatButtonsPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page3"]:Show()
return
end)
-- Reset button handler
HideChatButtonsPanel.r:SetScript("OnClick", function()
-- Reset checkboxes
LeaPlusLC["ShowVoiceButtons"] = "Off"
LeaPlusLC["ShowChatMenuButton"] = "Off"
-- Refresh panel
SetChatButtonFrameButtons()
HideChatButtonsPanel:Hide(); HideChatButtonsPanel:Show()
end)
-- Show panal when options panel button is clicked
LeaPlusCB["NoChatButtonsBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["ShowVoiceButtons"] = "On"
LeaPlusLC["ShowChatMenuButton"] = "Off"
SetChatButtonFrameButtons()
else
HideChatButtonsPanel:Show()
LeaPlusLC:HideFrames()
end
end)
-- Run function when options are clicked and on startup
LeaPlusCB["ShowVoiceButtons"]:HookScript("OnClick", SetChatButtonFrameButtons)
LeaPlusCB["ShowChatMenuButton"]:HookScript("OnClick", SetChatButtonFrameButtons)
SetChatButtonFrameButtons()
end
----------------------------------------------------------------------
-- Recent chat window
----------------------------------------------------------------------
if LeaPlusLC["RecentChatWindow"] == "On" and not LeaLockList["RecentChatWindow"] then
-- Create recent chat frame
local editFrame = CreateFrame("ScrollFrame", nil, UIParent, "InputScrollFrameTemplate")
-- Set frame parameters
editFrame:ClearAllPoints()
editFrame:SetPoint("BOTTOM", 0, 130)
editFrame:SetSize(600, LeaPlusLC["RecentChatSize"])
editFrame:SetFrameStrata("MEDIUM")
editFrame:SetToplevel(true)
editFrame:Hide()
editFrame.CharCount:Hide()
-- Add background color
editFrame.t = editFrame:CreateTexture(nil, "BACKGROUND")
editFrame.t:SetAllPoints()
editFrame.t:SetColorTexture(0.00, 0.00, 0.0, 0.6)
-- Set textures
editFrame.LeftTex:SetTexture(editFrame.RightTex:GetTexture()); editFrame.LeftTex:SetTexCoord(1, 0, 0, 1)
editFrame.BottomTex:SetTexture(editFrame.TopTex:GetTexture()); editFrame.BottomTex:SetTexCoord(0, 1, 1, 0)
editFrame.BottomRightTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.BottomRightTex:SetTexCoord(0, 1, 1, 0)
editFrame.BottomLeftTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.BottomLeftTex:SetTexCoord(1, 0, 1, 0)
editFrame.TopLeftTex:SetTexture(editFrame.TopRightTex:GetTexture()); editFrame.TopLeftTex:SetTexCoord(1, 0, 0, 1)
-- Create title bar
local titleFrame = CreateFrame("ScrollFrame", nil, editFrame, "InputScrollFrameTemplate")
titleFrame:ClearAllPoints()
titleFrame:SetPoint("TOP", 0, 32)
titleFrame:SetSize(600, 24)
titleFrame:SetFrameStrata("MEDIUM")
titleFrame:SetToplevel(true)
titleFrame:SetHitRectInsets(-6, -6, -6, -6)
titleFrame.CharCount:Hide()
titleFrame.t = titleFrame:CreateTexture(nil, "BACKGROUND")
titleFrame.t:SetAllPoints()
titleFrame.t:SetColorTexture(0.00, 0.00, 0.0, 0.6)
titleFrame.LeftTex:SetTexture(titleFrame.RightTex:GetTexture()); titleFrame.LeftTex:SetTexCoord(1, 0, 0, 1)
titleFrame.BottomTex:SetTexture(titleFrame.TopTex:GetTexture()); titleFrame.BottomTex:SetTexCoord(0, 1, 1, 0)
titleFrame.BottomRightTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.BottomRightTex:SetTexCoord(0, 1, 1, 0)
titleFrame.BottomLeftTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.BottomLeftTex:SetTexCoord(1, 0, 1, 0)
titleFrame.TopLeftTex:SetTexture(titleFrame.TopRightTex:GetTexture()); titleFrame.TopLeftTex:SetTexCoord(1, 0, 0, 1)
-- Add message count
titleFrame.m = titleFrame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
titleFrame.m:SetPoint("LEFT", 4, 0)
titleFrame.m:SetText(L["Messages"] .. ": 0")
titleFrame.m:SetFont(titleFrame.m:GetFont(), 16, nil)
-- Add right-click to close message
titleFrame.x = titleFrame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
titleFrame.x:SetPoint("RIGHT", -4, 0)
titleFrame.x:SetText(L["Drag to size"] .. " | " .. L["Right-click to close"])
titleFrame.x:SetFont(titleFrame.x:GetFont(), 16, nil)
titleFrame.x:SetWidth(600 - titleFrame.m:GetStringWidth() - 30)
titleFrame.x:SetWordWrap(false)
titleFrame.x:SetJustifyH("RIGHT")
local titleBox = titleFrame.EditBox
titleBox:Hide()
titleBox:SetEnabled(false)
-- Drag to resize
editFrame:SetResizable(true)
editFrame:SetResizeBounds(600, 170, 600, 560)
titleFrame:HookScript("OnMouseDown", function(self, btn)
if btn == "LeftButton" then
editFrame:StartSizing("TOP")
end
end)
titleFrame:HookScript("OnMouseUp", function(self, btn)
if btn == "LeftButton" then
editFrame:StopMovingOrSizing()
LeaPlusLC["RecentChatSize"] = editFrame:GetHeight()
elseif btn == "MiddleButton" then
-- Reset frame size
LeaPlusLC["RecentChatSize"] = 170
editFrame:SetSize(600, LeaPlusLC["RecentChatSize"])
editFrame:ClearAllPoints()
editFrame:SetPoint("BOTTOM", 0, 130)
end
end)
-- Create editbox
local editBox = editFrame.EditBox
editBox:SetAltArrowKeyMode(false)
editBox:SetTextInsets(4, 4, 4, 4)
editBox:SetWidth(editFrame:GetWidth() - 30)
editBox:SetSecurityDisablePaste()
editBox:SetMaxLetters(0)
-- Manage focus
editBox:HookScript("OnEditFocusLost", function()
if MouseIsOver(titleFrame) and IsMouseButtonDown("LeftButton") then
editBox:SetFocus()
end
end)
-- Close frame with right-click of editframe or editbox
local function CloseRecentChatWindow()
editBox:SetText("")
editBox:ClearFocus()
editFrame:Hide()
end
editFrame:SetScript("OnMouseDown", function(self, btn)
if btn == "RightButton" then CloseRecentChatWindow() end
end)
editBox:SetScript("OnMouseDown", function(self, btn)
if btn == "RightButton" then CloseRecentChatWindow() end
end)
titleFrame:HookScript("OnMouseDown", function(self, btn)
if btn == "RightButton" then CloseRecentChatWindow() end
end)
-- Disable text changes while still allowing editing controls to work
editBox:EnableKeyboard(false)
editBox:SetScript("OnKeyDown", function() end)
--- Clear highlighted text if escape key is pressed
editBox:HookScript("OnEscapePressed", function()
editBox:HighlightText(0, 0)
editBox:ClearFocus()
end)
-- Clear highlighted text and clear focus if enter key is pressed
editBox:SetScript("OnEnterPressed", function()
editBox:HighlightText(0, 0)
editBox:ClearFocus()
end)
-- Populate recent chat frame with chat messages
local function ShowChatbox(chtfrm)
editBox:SetText("")
local NumMsg = chtfrm:GetNumMessages()
local StartMsg = 1
if NumMsg > 128 then StartMsg = NumMsg - 127 end
local totalMsgCount = 0
for iMsg = StartMsg, NumMsg do
local chatMessage, r, g, b, chatTypeID = chtfrm:GetMessageInfo(iMsg)
if chatMessage then
-- Handle Battle.net messages
if string.match(chatMessage, "k:(%d+):(%d+):BN_WHISPER:")
or string.match(chatMessage, "k:(%d+):(%d+):BN_INLINE_TOAST_ALERT:")
or string.match(chatMessage, "k:(%d+):(%d+):BN_INLINE_TOAST_BROADCAST:")
then
local ctype
if string.match(chatMessage, "k:(%d+):(%d+):BN_WHISPER:") then
ctype = "BN_WHISPER"
elseif string.match(chatMessage, "k:(%d+):(%d+):BN_INLINE_TOAST_ALERT:") then
ctype = "BN_INLINE_TOAST_ALERT"
elseif string.match(chatMessage, "k:(%d+):(%d+):BN_INLINE_TOAST_BROADCAST:") then
ctype = "BN_INLINE_TOAST_BROADCAST"
end
local id = tonumber(string.match(chatMessage, "k:(%d+):%d+:" .. ctype .. ":"))
local totalBNFriends = BNGetNumFriends()
for friendIndex = 1, totalBNFriends do
local accountInfo = C_BattleNet.GetFriendAccountInfo(friendIndex)
local bnetAccountID = accountInfo.bnetAccountID
local battleTag = accountInfo.battleTag
if id == bnetAccountID then
battleTag = strsplit("#", battleTag)
chatMessage = chatMessage:gsub("(|HBNplayer%S-|k)(%d-)(:%S-" .. ctype .. "%S-|h)%[(%S-)%](|?h?)(:?)", "[" .. battleTag .. "]:")
end
end
end
-- Handle colors
if r and g and b then
local colorCode = RGBToColorCode(r, g, b)
chatMessage = colorCode .. chatMessage
end
chatMessage = gsub(chatMessage, "|T.-|t", "") -- Remove textures
chatMessage = gsub(chatMessage, "|A.-|a", "") -- Remove atlases
editBox:Insert(chatMessage .. "|r|n")
end
totalMsgCount = totalMsgCount + 1
end
titleFrame.m:SetText(L["Messages"] .. ": " .. totalMsgCount)
editFrame:SetVerticalScroll(0)
editFrame.ScrollBar:ScrollToEnd()
editFrame:Show()
editBox:ClearFocus()
end
-- Hook normal chat frame tab clicks
for i = 1, 50 do
if _G["ChatFrame" .. i] then
_G["ChatFrame" .. i .. "Tab"]:HookScript("OnClick", function()
if IsControlKeyDown() then
editBox:SetFont(_G["ChatFrame" .. i]:GetFont())
ShowChatbox(_G["ChatFrame" .. i])
end
end)
end
end
-- Hook temporary chat frame tab clicks
hooksecurefunc("FCF_OpenTemporaryWindow", function()
local cf = FCF_GetCurrentChatFrame():GetName() or nil
if cf then
_G[cf .. "Tab"]:HookScript("OnClick", function()
if IsControlKeyDown() then
editBox:SetFont(_G[cf]:GetFont())
ShowChatbox(_G[cf])
end
end)
end
end)
end
----------------------------------------------------------------------
-- Hide alerts
----------------------------------------------------------------------
if LeaPlusLC["NoAlerts"] == "On" then
hooksecurefunc(AlertFrame, "RegisterEvent", function(self, event)
AlertFrame:UnregisterEvent(event)
end)
AlertFrame:UnregisterAllEvents()
end
----------------------------------------------------------------------
-- Show cooldowns
----------------------------------------------------------------------
if LeaPlusLC["ShowCooldowns"] == "On" then
-- Create main table structure in saved variables if it doesn't exist
if LeaPlusDB["Cooldowns"] == nil then
LeaPlusDB["Cooldowns"] = {}
end
-- Create class tables if they don't exist
for index = 1, GetNumClasses() do
local classDisplayName, classTag, classID = GetClassInfo(index)
if LeaPlusDB["Cooldowns"][classTag] == nil then
LeaPlusDB["Cooldowns"][classTag] = {}
end
end
-- Get current class and spec
local PlayerClass = select(2, UnitClass("player"))
local activeSpec = GetSpecialization() or 1
-- Create local tables to store cooldown frames and editboxes
local icon = {} -- Used to store cooldown frames
local SpellEB = {} -- Used to store editbox values
local iCount = 5 -- Number of cooldowns
-- Create cooldown frames
for i = 1, iCount do
-- Create cooldown frame
icon[i] = CreateFrame("Frame", nil, UIParent)
icon[i]:SetFrameStrata("MEDIUM")
icon[i]:SetWidth(21)
icon[i]:SetHeight(21)
-- Create cooldown icon
icon[i].c = CreateFrame("Cooldown", nil, icon[i], "CooldownFrameTemplate")
icon[i].c:SetAllPoints()
icon[i].c:SetReverse(true)
-- Create blank texture (will be assigned a cooldown texture later)
icon[i].t = icon[i]:CreateTexture(nil,"BACKGROUND")
icon[i].t:SetAllPoints()
-- Show icon above target frame and set initial scale
icon[i]:ClearAllPoints()
icon[i]:SetPoint("TOPLEFT", TargetFrame, "TOPLEFT", 6 + (22 * (i - 1)), 5)
icon[i]:SetScale(TargetFrame:GetScale())
-- Show tooltip
icon[i]:SetScript("OnEnter", function(self)
GameTooltip:SetOwner(self, "ANCHOR_BOTTOMRIGHT", 15, -25)
GameTooltip:SetText(GetSpellInfo(LeaPlusCB["Spell" .. i]:GetText()))
end)
-- Hide tooltip
icon[i]:SetScript("OnLeave", GameTooltip_Hide)
end
-- Change cooldown icon scale when player frame scale changes
PlayerFrame:HookScript("OnSizeChanged", function()
if LeaPlusLC["CooldownsOnPlayer"] == "On" then
for i = 1, iCount do
icon[i]:SetScale(PlayerFrame:GetScale())
end
end
end)
-- Change cooldown icon scale when target frame scale changes
TargetFrame:HookScript("OnSizeChanged", function()
if LeaPlusLC["CooldownsOnPlayer"] == "Off" then
for i = 1, iCount do
icon[i]:SetScale(TargetFrame:GetScale())
end
end
end)
-- Function to show cooldown textures in the cooldown frames (run when icons are loaded or changed)
local function ShowIcon(i, id, owner)
local void
-- Get spell information
local spell, void, path = GetSpellInfo(id)
if spell and path then
-- Set icon texture to the spell texture
icon[i].t:SetTexture(path)
-- Handle events
icon[i]:RegisterUnitEvent("UNIT_AURA", owner)
icon[i]:RegisterUnitEvent("UNIT_PET", "player")
icon[i]:SetScript("OnEvent", function(self, event, arg1, updatedAuras)
-- If pet was dismissed (or otherwise disappears such as when flying), hide pet cooldowns
if event == "UNIT_PET" then
if not UnitExists("pet") then
if LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"] then
icon[i]:Hide()
end
end
-- Ensure cooldown belongs to the owner we are watching (player or pet)
elseif arg1 == owner then
-- Hide the cooldown frame (required for cooldowns to disappear after the duration)
icon[i]:Hide()
-- If buff matches cooldown we want, start the cooldown
AuraUtil.ForEachAura(owner, "HELPFUL", nil, function(aura)
if aura.spellId and aura.spellId == id and aura.expirationTime and aura.duration then
icon[i]:Show()
CooldownFrame_Set(icon[i].c, aura.expirationTime - aura.duration, aura.duration, 1)
end
end, true)
end
end)
else
-- Spell does not exist so stop watching it
icon[i]:SetScript("OnEvent", nil)
icon[i]:Hide()
end
end
-- Create configuration panel
local CooldownPanel = LeaPlusLC:CreatePanel("Show cooldowns", "CooldownPanel")
-- Function to refresh the editbox tooltip with the spell name
local function RefSpellTip(self,elapsed)
local spellinfo, void, icon = GetSpellInfo(self:GetText())
if spellinfo and spellinfo ~= "" and icon and icon ~= "" then
GameTooltip:SetOwner(self, "ANCHOR_NONE")
GameTooltip:ClearAllPoints()
GameTooltip:SetPoint("RIGHT", self, "LEFT", -10, 0)
GameTooltip:SetText("|T" .. icon .. ":0|t " .. spellinfo, nil, nil, nil, nil, true)
else
GameTooltip:Hide()
end
end
-- Function to create spell ID editboxes and pet checkboxes
local function MakeSpellEB(num, x, y, tab, shifttab)
-- Create editbox for spell ID
SpellEB[num] = LeaPlusLC:CreateEditBox("Spell" .. num, CooldownPanel, 70, 6, "TOPLEFT", x, y - 20, "Spell" .. tab, "Spell" .. shifttab)
SpellEB[num]:SetNumeric(true)
-- Set initial value (for current spec)
SpellEB[num]:SetText(LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. num .. "Idn"] or "")
-- Refresh tooltip when mouse is hovering over the editbox
SpellEB[num]:SetScript("OnEnter", function()
SpellEB[num]:SetScript("OnUpdate", RefSpellTip)
end)
SpellEB[num]:SetScript("OnLeave", function()
SpellEB[num]:SetScript("OnUpdate", nil)
GameTooltip:Hide()
end)
-- Create checkbox for pet cooldown
LeaPlusLC:MakeCB(CooldownPanel, "Spell" .. num .."Pet", "", 462, y - 20, false, "")
LeaPlusCB["Spell" .. num .."Pet"]:SetHitRectInsets(0, 0, 0, 0)
end
-- Add titles
LeaPlusLC:MakeTx(CooldownPanel, "Spell ID", 384, -92)
LeaPlusLC:MakeTx(CooldownPanel, "Pet", 462, -92)
-- Add editboxes and checkboxes
MakeSpellEB(1, 386, -92, "2", "5")
MakeSpellEB(2, 386, -122, "3", "1")
MakeSpellEB(3, 386, -152, "4", "2")
MakeSpellEB(4, 386, -182, "5", "3")
MakeSpellEB(5, 386, -212, "1", "4")
-- Add checkboxes
LeaPlusLC:MakeTx(CooldownPanel, "Settings", 16, -72)
LeaPlusLC:MakeCB(CooldownPanel, "ShowCooldownID", "Show the spell ID in buff icon tooltips", 16, -92, false, "If checked, spell IDs will be shown in buff icon tooltips located in the buff frame and under the target frame.");
LeaPlusLC:MakeCB(CooldownPanel, "NoCooldownDuration", "Hide cooldown duration numbers (if enabled)", 16, -112, false, "If checked, cooldown duration numbers will not be shown over the cooldowns.|n|nIf unchecked, cooldown duration numbers will be shown over the cooldowns if they are enabled in the game options panel ('ActionBars' menu).")
LeaPlusLC:MakeCB(CooldownPanel, "CooldownsOnPlayer", "Show cooldowns above the player frame", 16, -132, false, "If checked, cooldown icons will be shown above the player frame.|n|nIf unchecked, cooldown icons will be shown above the target frame.")
-- Function to save the panel control settings and refresh the cooldown icons
local function SavePanelControls()
for i = 1, iCount do
-- Refresh the cooldown texture
icon[i].c:SetCooldown(0,0)
-- Show icons above target or player frame
icon[i]:ClearAllPoints()
if LeaPlusLC["CooldownsOnPlayer"] == "On" then
icon[i]:SetPoint("TOPLEFT", PlayerFrame, "TOPLEFT", 90 + (24 * (i - 1)), -2)
icon[i]:SetScale(PlayerFrame:GetScale())
else
icon[i]:SetPoint("TOPLEFT", TargetFrame, "TOPLEFT", 25 + (24 * (i - 1)), -2)
icon[i]:SetScale(TargetFrame:GetScale())
end
-- Save control states to globals
LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Idn"] = SpellEB[i]:GetText()
LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"] = LeaPlusCB["Spell" .. i .."Pet"]:GetChecked()
-- Set cooldowns
if LeaPlusCB["Spell" .. i .."Pet"]:GetChecked() then
ShowIcon(i, tonumber(SpellEB[i]:GetText()), "pet")
else
ShowIcon(i, tonumber(SpellEB[i]:GetText()), "player")
end
-- Show or hide cooldown duration
if LeaPlusLC["NoCooldownDuration"] == "On" then
icon[i].c:SetHideCountdownNumbers(true)
else
icon[i].c:SetHideCountdownNumbers(false)
end
-- Show or hide cooldown icons depending on current buffs
local newowner
local newspell = tonumber(SpellEB[i]:GetText())
if newspell then
if LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"] then
newowner = "pet"
else
newowner = "player"
end
-- Hide cooldown icon
icon[i]:Hide()
-- If buff matches spell we want, show cooldown icon
AuraUtil.ForEachAura(newowner, "HELPFUL", nil, function(aura)
if aura.spellId and aura.spellId == newspell and aura.expirationTime and aura.duration then
icon[i]:Show()
CooldownFrame_Set(icon[i].c, aura.expirationTime - aura.duration, aura.duration, 1)
end
end, true)
end
end
end
-- Update cooldown icons when checkboxes are clicked
LeaPlusCB["NoCooldownDuration"]:HookScript("OnClick", SavePanelControls)
LeaPlusCB["CooldownsOnPlayer"]:HookScript("OnClick", SavePanelControls)
-- Help button tooltip
CooldownPanel.h.tiptext = L["Enter the spell IDs for the cooldown icons that you want to see.|n|nIf a cooldown icon normally appears under the pet frame, check the pet checkbox.|n|nCooldown icons are saved to your class and specialisation."]
-- Back button handler
CooldownPanel.b:SetScript("OnClick", function()
CooldownPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show()
return
end)
-- Reset button handler
CooldownPanel.r:SetScript("OnClick", function()
-- Reset the checkboxes
LeaPlusLC["ShowCooldownID"] = "On"
LeaPlusLC["NoCooldownDuration"] = "On"
LeaPlusLC["CooldownsOnPlayer"] = "Off"
for i = 1, iCount do
-- Reset the panel controls
SpellEB[i]:SetText("");
LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"] = false
-- Hide cooldowns and clear scripts
icon[i]:Hide()
icon[i]:SetScript("OnEvent", nil)
end
CooldownPanel:Hide(); CooldownPanel:Show()
end)
-- Save settings when changed
for i = 1, iCount do
-- Set initial checkbox states
LeaPlusCB["Spell" .. i .."Pet"]:SetChecked(LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"])
-- Set checkbox states when shown
LeaPlusCB["Spell" .. i .."Pet"]:SetScript("OnShow", function()
LeaPlusCB["Spell" .. i .."Pet"]:SetChecked(LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"])
end)
-- Set states when changed
SpellEB[i]:SetScript("OnTextChanged", SavePanelControls)
LeaPlusCB["Spell" .. i .."Pet"]:SetScript("OnClick", SavePanelControls)
end
-- Show cooldowns on startup
SavePanelControls()
-- Show panel when configuration button is clicked
LeaPlusCB["CooldownsButton"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- No preset profile
else
-- Show panel
CooldownPanel:Show()
LeaPlusLC:HideFrames()
end
end)
-- Create spec tag banner fontstring
local specTagSpecID = GetSpecialization()
local specTagSpecInfoID, specTagName = GetSpecializationInfo(specTagSpecID)
local specTagBanner = CooldownPanel:CreateFontString(nil, 'ARTWORK', 'GameFontNormal')
specTagBanner:SetPoint("TOPLEFT", 384, -72)
specTagBanner:SetText(specTagName)
-- Set controls when spec changes
local swapFrame = CreateFrame("FRAME")
swapFrame:RegisterEvent("PLAYER_SPECIALIZATION_CHANGED")
swapFrame:SetScript("OnEvent", function()
-- Store new spec
activeSpec = GetSpecialization()
-- Update controls for new spec
for i = 1, iCount do
SpellEB[i]:SetText(LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Idn"] or "")
LeaPlusCB["Spell" .. i .. "Pet"]:SetChecked(LeaPlusDB["Cooldowns"][PlayerClass]["S" .. activeSpec .. "R" .. i .. "Pet"] or false)
end
-- Update spec tag banner with new spec
local specTagSpecInfoID, specTagName = GetSpecializationInfo(activeSpec)
specTagBanner:SetText(specTagName)
-- Refresh configuration panel
if CooldownPanel:IsShown() then
CooldownPanel:Hide(); CooldownPanel:Show()
end
-- Save settings
SavePanelControls()
end)
-- Function to show spell ID in tooltips
local function CooldownIDFunc(unit, target, index, auratype)
if LeaPlusLC["ShowCooldownID"] == "On" and auratype ~= "HARMFUL" then
local spellid = select(10, UnitAura(target, index))
if spellid then
GameTooltip:AddLine(L["Spell ID"] .. ": " .. spellid)
GameTooltip:Show()
end
end
end
-- Add spell ID to tooltip when buff frame buffs are hovered
hooksecurefunc(GameTooltip, 'SetUnitAura', CooldownIDFunc)
-- Add spell ID to tooltip when target frame buffs are hovered
hooksecurefunc(GameTooltip, 'SetUnitBuff', CooldownIDFunc)
end
----------------------------------------------------------------------
-- Lockout sharing
----------------------------------------------------------------------
if LeaPlusLC["LockoutSharing"] == "On" then
-- Set the social menu option (sharing will be disabled but the checkbox will be set on next reload)
ShowAccountAchievements(true)
end
----------------------------------------------------------------------
-- Combat plates
----------------------------------------------------------------------
if LeaPlusLC["CombatPlates"] == "On" then
-- Toggle nameplates with combat
local f = CreateFrame("Frame")
f:RegisterEvent("PLAYER_REGEN_DISABLED")
f:RegisterEvent("PLAYER_REGEN_ENABLED")
f:SetScript("OnEvent", function(self, event)
SetCVar("nameplateShowEnemies", event == "PLAYER_REGEN_DISABLED" and 1 or 0)
end)
-- Run combat check on startup
SetCVar("nameplateShowEnemies", UnitAffectingCombat("player") and 1 or 0)
end
----------------------------------------------------------------------
-- Enhance tooltip
----------------------------------------------------------------------
if LeaPlusLC["TipModEnable"] == "On" and not LeaLockList["TipModEnable"] then
----------------------------------------------------------------------
-- Position the tooltip
----------------------------------------------------------------------
-- Position general tooltip
hooksecurefunc("GameTooltip_SetDefaultAnchor", function(tooltip, parent)
if LeaPlusLC["TooltipAnchorMenu"] ~= 1 then
if (not tooltip or not parent) then
return
end
if GetMouseFocus() == WorldFrame then
if LeaPlusLC["TooltipAnchorMenu"] == 2 then
tooltip:SetOwner(parent, "ANCHOR_CURSOR")
return
elseif LeaPlusLC["TooltipAnchorMenu"] == 3 then
tooltip:SetOwner(parent, "ANCHOR_CURSOR_LEFT", LeaPlusLC["TipCursorX"], LeaPlusLC["TipCursorY"])
return
elseif LeaPlusLC["TooltipAnchorMenu"] == 4 then
tooltip:SetOwner(parent, "ANCHOR_CURSOR_RIGHT", LeaPlusLC["TipCursorX"], LeaPlusLC["TipCursorY"])
return
end
end
end
end)
----------------------------------------------------------------------
-- Tooltip Configuration
----------------------------------------------------------------------
local LT = {}
-- Create locale specific level string
LT["LevelLocale"] = strtrim(strtrim(string.gsub(TOOLTIP_UNIT_LEVEL, "%%s", "")))
if GameLocale == "ruRU" then
LT["LevelLocale"] = "-ro уровня"
end
-- Tooltip
LT["ColorBlind"] = GetCVar("colorblindMode")
---------------------------------------------------------------------------------------------------------
-- Tooltip movement settings
---------------------------------------------------------------------------------------------------------
-- Create tooltip customisation side panel
local SideTip = LeaPlusLC:CreatePanel("Enhance tooltip", "SideTip")
-- Add controls
LeaPlusLC:MakeTx(SideTip, "Settings", 16, -72)
LeaPlusLC:MakeCB(SideTip, "TipShowRank", "Show guild ranks for your guild", 16, -92, false, "If checked, guild ranks will be shown for players in your guild.")
LeaPlusLC:MakeCB(SideTip, "TipShowOtherRank", "Show guild ranks for other guilds", 16, -112, false, "If checked, guild ranks will be shown for players who are not in your guild.")
LeaPlusLC:MakeCB(SideTip, "TipShowTarget", "Show the unit's target", 16, -132, false, "If checked, unit targets will be shown.")
-- LeaPlusLC:MakeCB(SideTip, "TipShowMythic", "Show mythic score", 16, -152, false, "If checked, the unit's mythic score will be shown if it is above zero.")
LeaPlusLC:MakeCB(SideTip, "TipBackSimple", "Color the backdrops based on faction", 16, -152, false, "If checked, backdrops will be tinted blue (friendly) or red (hostile).")
LeaPlusLC:MakeCB(SideTip, "TipNoHealthBar", "Hide the health bar", 16, -172, true, "If checked, the health bar will not be shown.")
LeaPlusLC:MakeTx(SideTip, "Hide tooltips", 16, -212)
LeaPlusLC:MakeCB(SideTip, "TipHideInCombat", "Hide tooltips for world units during combat", 16, -232, false, "If checked, tooltips for world units will be hidden during combat.")
LeaPlusLC:MakeCB(SideTip, "TipHideShiftOverride", "Show tooltips with shift key", 16, -252, false, "If checked, you can hold shift while tooltips are hidden to show them temporarily.")
-- Handle show tooltips with shift key lock
local function SetTipHideShiftOverrideFunc()
if LeaPlusLC["TipHideInCombat"] == "On" then
LeaPlusLC:LockItem(LeaPlusCB["TipHideShiftOverride"], false)
else
LeaPlusLC:LockItem(LeaPlusCB["TipHideShiftOverride"], true)
end
end
LeaPlusCB["TipHideInCombat"]:HookScript("OnClick", SetTipHideShiftOverrideFunc)
SetTipHideShiftOverrideFunc()
LeaPlusLC:CreateDropDown("TooltipAnchorMenu", "Anchor", SideTip, 146, "TOPLEFT", 356, -115, {L["None"], L["Cursor"], L["Cursor Left"], L["Cursor Right"]}, "")
local XOffsetHeading = LeaPlusLC:MakeTx(SideTip, "X Offset", 356, -132)
LeaPlusLC:MakeSL(SideTip, "TipCursorX", "Drag to set the cursor X offset.", -128, 128, 1, 356, -152, "%.0f")
local YOffsetHeading = LeaPlusLC:MakeTx(SideTip, "Y Offset", 356, -182)
LeaPlusLC:MakeSL(SideTip, "TipCursorY", "Drag to set the cursor Y offset.", -128, 128, 1, 356, -202, "%.0f")
LeaPlusLC:MakeTx(SideTip, "Scale", 356, -232)
LeaPlusLC:MakeSL(SideTip, "LeaPlusTipSize", "Drag to set the tooltip scale.", 0.50, 2.00, 0.05, 356, -252, "%.2f")
-- Function to enable or disable anchor controls
local function SetAnchorControls()
-- Set the X and Y sliders
if LeaPlusLC["TooltipAnchorMenu"] == 1 or LeaPlusLC["TooltipAnchorMenu"] == 2 then
-- Dropdown is set to none or cursor so disable X and Y offset sliders
LeaPlusLC:LockItem(LeaPlusCB["TipCursorX"], true)
LeaPlusLC:LockItem(LeaPlusCB["TipCursorY"], true)
XOffsetHeading:SetAlpha(0.3)
YOffsetHeading:SetAlpha(0.3)
LeaPlusCB["TipCursorX"]:SetScript("OnEnter", nil)
LeaPlusCB["TipCursorY"]:SetScript("OnEnter", nil)
else
-- Dropdown is set to cursor left or cursor right so enable X and Y offset sliders
LeaPlusLC:LockItem(LeaPlusCB["TipCursorX"], false)
LeaPlusLC:LockItem(LeaPlusCB["TipCursorY"], false)
XOffsetHeading:SetAlpha(1.0)
YOffsetHeading:SetAlpha(1.0)
LeaPlusCB["TipCursorX"]:SetScript("OnEnter", LeaPlusLC.TipSee)
LeaPlusCB["TipCursorY"]:SetScript("OnEnter", LeaPlusLC.TipSee)
end
end
-- Set controls when anchor dropdown menu is changed and on startup
LeaPlusCB["ListFrameTooltipAnchorMenu"]:HookScript("OnHide", SetAnchorControls)
SetAnchorControls()
-- Help button hidden
SideTip.h:Hide()
-- Back button handler
SideTip.b:SetScript("OnClick", function()
SideTip:Hide()
LeaPlusLC["PageF"]:Show()
LeaPlusLC["Page5"]:Show()
return
end)
-- Reset button handler
SideTip.r.tiptext = SideTip.r.tiptext .. "|n|n" .. L["Note that this will not reset settings that require a UI reload."]
SideTip.r:SetScript("OnClick", function()
LeaPlusLC["TipShowRank"] = "On"
LeaPlusLC["TipShowOtherRank"] = "Off"
LeaPlusLC["TipShowTarget"] = "On"
--LeaPlusLC["TipShowMythic"] = "Off"
LeaPlusLC["TipBackSimple"] = "Off"
LeaPlusLC["TipHideInCombat"] = "Off"; SetTipHideShiftOverrideFunc()
LeaPlusLC["TipHideShiftOverride"] = "On"
LeaPlusLC["LeaPlusTipSize"] = 1.00
LeaPlusLC["TooltipAnchorMenu"] = 1
LeaPlusLC["TipCursorX"] = 0
LeaPlusLC["TipCursorY"] = 0
SetAnchorControls()
LeaPlusLC:SetTipScale()
SideTip:Hide(); SideTip:Show()
end)
-- Move the tooltip
LeaPlusCB["MoveTooltipButton"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["TipShowRank"] = "On"
LeaPlusLC["TipShowOtherRank"] = "Off"
LeaPlusLC["TipShowTarget"] = "On"
--LeaPlusLC["TipShowMythic"] = "On"
LeaPlusLC["TipBackSimple"] = "On"
LeaPlusLC["TipHideInCombat"] = "Off"; SetTipHideShiftOverrideFunc()
LeaPlusLC["TipHideShiftOverride"] = "On"
LeaPlusLC["LeaPlusTipSize"] = 1.25
LeaPlusLC["TooltipAnchorMenu"] = 1
LeaPlusLC["TipCursorX"] = 0
LeaPlusLC["TipCursorY"] = 0
SetAnchorControls()
LeaPlusLC:SetTipScale()
LeaPlusLC:SetDim()
LeaPlusLC:ReloadCheck()
SideTip:Show(); SideTip:Hide() -- Needed to update tooltip scale
LeaPlusLC["PageF"]:Hide(); LeaPlusLC["PageF"]:Show()
else
-- Show tooltip configuration panel
LeaPlusLC:HideFrames()
SideTip:Show()
end
end)
-- Hide health bar
if LeaPlusLC["TipNoHealthBar"] == "On" then
GameTooltipStatusBarTexture:SetTexture("")
end
---------------------------------------------------------------------------------------------------------
-- Tooltip scale settings
---------------------------------------------------------------------------------------------------------
-- Function to set the tooltip scale
local function SetTipScale()
-- General tooltip
if GameTooltip then GameTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
-- Friends
if FriendsTooltip then FriendsTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
-- AutoCompleteBox
if AutoCompleteBox then AutoCompleteBox:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
-- Reputation
if ReputationParagonTooltip then ReputationParagonTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
-- Pet battles and battle pets
if PetBattlePrimaryAbilityTooltip then PetBattlePrimaryAbilityTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
if PetBattlePrimaryUnitTooltip then PetBattlePrimaryUnitTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
if BattlePetTooltip then BattlePetTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
if FloatingBattlePetTooltip then FloatingBattlePetTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
-- Garrison
if FloatingGarrisonFollowerTooltip then FloatingGarrisonFollowerTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
if FloatingGarrisonFollowerAbilityTooltip then FloatingGarrisonFollowerAbilityTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
if FloatingGarrisonMissionTooltip then FloatingGarrisonMissionTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
if FloatingGarrisonShipyardFollowerTooltip then FloatingGarrisonShipyardFollowerTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
-- Order Hall
if GarrisonFollowerMissionAbilityWithoutCountersTooltip then GarrisonFollowerMissionAbilityWithoutCountersTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
if GarrisonFollowerAbilityWithoutCountersTooltip then GarrisonFollowerAbilityWithoutCountersTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
-- Items (links, comparisons)
if ItemRefTooltip then ItemRefTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
if ItemRefShoppingTooltip1 then ItemRefShoppingTooltip1:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
if ItemRefShoppingTooltip2 then ItemRefShoppingTooltip2:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
if ShoppingTooltip1 then ShoppingTooltip1:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
if ShoppingTooltip2 then ShoppingTooltip2:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
-- World map (story)
if QuestScrollFrame.WarCampaignTooltip then QuestScrollFrame.WarCampaignTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
if QuestScrollFrame.StoryTooltip then
QuestScrollFrame.StoryTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"])
QuestScrollFrame.StoryTooltip:SetFrameStrata("TOOLTIP")
end
-- Minimap (PVP queue status)
if QueueStatusFrame then QueueStatusFrame:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
-- Embedded item tooltip (as used in PVP UI)
if EmbeddedItemTooltip then EmbeddedItemTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
-- Nameplate tooltip
if NamePlateTooltip then NamePlateTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"]) end
-- Set slider formatted text
LeaPlusCB["LeaPlusTipSize"].f:SetFormattedText("%.0f%%", LeaPlusLC["LeaPlusTipSize"] * 100)
end
-- Give function a file level scope
LeaPlusLC.SetTipScale = SetTipScale
-- Set tooltip scale when slider or checkbox changes and on startup
LeaPlusCB["LeaPlusTipSize"]:HookScript("OnValueChanged", SetTipScale)
SetTipScale()
----------------------------------------------------------------------
-- Contribution frame
----------------------------------------------------------------------
local function ContributionTipFunc()
-- Function to set tooltip scale
local function SetContributionTipScale()
ContributionBuffTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"])
end
-- Set tooltip scale when slider changes and on startup
LeaPlusCB["LeaPlusTipSize"]:HookScript("OnValueChanged", SetContributionTipScale)
SetContributionTipScale()
end
-- Run function when Blizzard addon has loaded
if IsAddOnLoaded("Blizzard_Contribution") then
ContributionTipFunc()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_Contribution" then
ContributionTipFunc()
waitFrame:UnregisterAllEvents()
end
end)
end
----------------------------------------------------------------------
-- Pet Journal tooltips
----------------------------------------------------------------------
local function PetJournalTipFunc()
-- Function to set tooltip scale
local function SetPetJournalTipScale()
PetJournalPrimaryAbilityTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"])
end
-- Set tooltip scale when slider changes and on startup
LeaPlusCB["LeaPlusTipSize"]:HookScript("OnValueChanged", SetPetJournalTipScale)
SetPetJournalTipScale()
end
-- Run function when Blizzard addon has loaded
if IsAddOnLoaded("Blizzard_Collections") then
PetJournalTipFunc()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_Collections" then
PetJournalTipFunc()
waitFrame:UnregisterAllEvents()
end
end)
end
----------------------------------------------------------------------
-- Encounter Journal tooltips
----------------------------------------------------------------------
local function EncounterJournalTipFunc()
-- Function to set tooltip scale
local function SetEncounterJournalTipScale()
EncounterJournalTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"])
end
-- Set tooltip scale when slider changes and on startup
LeaPlusCB["LeaPlusTipSize"]:HookScript("OnValueChanged", SetEncounterJournalTipScale)
SetEncounterJournalTipScale()
end
-- Run function when Blizzard addon has loaded
if IsAddOnLoaded("Blizzard_EncounterJournal") then
EncounterJournalTipFunc()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_EncounterJournal" then
EncounterJournalTipFunc()
waitFrame:UnregisterAllEvents()
end
end)
end
----------------------------------------------------------------------
-- Perks program tooltip (trading post)
----------------------------------------------------------------------
local function PerksProgramTipFunc()
-- Set tooltip scale
PerksProgramTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"])
end
-- Run function when Blizzard addon has loaded
if IsAddOnLoaded("Blizzard_PerksProgram") then
PerksProgramTipFunc()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_PerksProgram" then
PerksProgramTipFunc()
waitFrame:UnregisterAllEvents()
end
end)
end
----------------------------------------------------------------------
-- Death Recap frame tooltips
----------------------------------------------------------------------
local function DeathRecapFrameFunc()
-- Simple fix to prevent mousing over units behind the frame
DeathRecapFrame:EnableMouse(true)
end
-- Run function when Blizzard addon has loaded
if IsAddOnLoaded("Blizzard_DeathRecap") then
DeathRecapFrameFunc()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_DeathRecap" then
DeathRecapFrameFunc()
waitFrame:UnregisterAllEvents()
end
end)
end
----------------------------------------------------------------------
-- Garrison tooltips
----------------------------------------------------------------------
local function GarrisonFunc()
-- Function to set tooltip scale
local function SetGarrisonTipScale()
GarrisonFollowerTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"])
GarrisonFollowerAbilityTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"])
GarrisonMissionMechanicTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"])
GarrisonMissionMechanicFollowerCounterTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"])
GarrisonBuildingFrame.BuildingLevelTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"])
GarrisonBonusAreaTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"])
GarrisonShipyardMapMissionTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"])
GarrisonShipyardFollowerTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"])
end
-- Set tooltip scale when slider changes and on startup
LeaPlusCB["LeaPlusTipSize"]:HookScript("OnValueChanged", SetGarrisonTipScale)
SetGarrisonTipScale()
end
-- Run function when Blizzard addon has loaded
if IsAddOnLoaded("Blizzard_GarrisonUI") then
GarrisonFunc()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_GarrisonUI" then
GarrisonFunc()
waitFrame:UnregisterAllEvents()
end
end)
end
---------------------------------------------------------------------------------------------------------
-- Total RP 3
---------------------------------------------------------------------------------------------------------
-- Total RP 3
local function TotalRP3Func()
if TRP3_MainTooltip and TRP3_CharacterTooltip then
-- Function to set tooltip scale
local function SetTotalRP3TipScale()
TRP3_MainTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"])
TRP3_CharacterTooltip:SetScale(LeaPlusLC["LeaPlusTipSize"])
end
-- Set tooltip scale when slider changes and on startup
LeaPlusCB["LeaPlusTipSize"]:HookScript("OnValueChanged", SetTotalRP3TipScale)
SetTotalRP3TipScale()
end
end
-- Run function when Total RP 3 addon has loaded
if IsAddOnLoaded("totalRP3") then
TotalRP3Func()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "totalRP3" then
TotalRP3Func()
waitFrame:UnregisterAllEvents()
end
end)
end
---------------------------------------------------------------------------------------------------------
-- Other tooltip code
---------------------------------------------------------------------------------------------------------
-- Colorblind setting change
SideTip:RegisterEvent("CVAR_UPDATE");
SideTip:SetScript("OnEvent", function(self, event, arg1, arg2)
if (arg1 == "colorblindMode") then
LT["ColorBlind"] = arg2
end
end)
-- Store locals
local TipMClass = LOCALIZED_CLASS_NAMES_MALE
local TipFClass = LOCALIZED_CLASS_NAMES_FEMALE
local GetPlayerMythicPlusRatingSummary = C_PlayerInfo.GetPlayerMythicPlusRatingSummary
local GetDungeonScoreRarityColor = C_ChallengeMode.GetDungeonScoreRarityColor
local GetRGBAsBytes = GetRGBAsBytes
-- Level string
local LevelString, LevelString2
if GameLocale == "ruRU" then
-- Level string for ruRU
LevelString = "уровня"
LevelString2 = "уровень"
else
-- Level string for all other locales
LevelString = string.lower(TOOLTIP_UNIT_LEVEL:gsub("%%s",".+"))
LevelString2 = ""
end
-- Tag locale (code construction from tiplang)
local ttYou, ttLevel, ttBoss, ttElite, ttRare, ttRareElite, ttRareBoss, ttTarget
if GameLocale == "zhCN" then ttYou = "" ; ttLevel = "等级" ; ttBoss = "首领" ; ttElite = "精英" ; ttRare = "精良" ; ttRareElite = "精良 精英" ; ttRareBoss = "精良 首领" ; ttTarget = "目标"
elseif GameLocale == "zhTW" then ttYou = "" ; ttLevel = "等級" ; ttBoss = "首領" ; ttElite = "精英" ; ttRare = "精良" ; ttRareElite = "精良 精英" ; ttRareBoss = "精良 首領" ; ttTarget = "目標"
elseif GameLocale == "ruRU" then ttYou = "ВЫ" ; ttLevel = "Уровень" ; ttBoss = "босс" ; ttElite = "элита" ; ttRare = "Редкое" ; ttRareElite = "Редкое элита" ; ttRareBoss = "Редкое босс" ; ttTarget = "Цель"
elseif GameLocale == "koKR" then ttYou = "당신" ; ttLevel = "레벨" ; ttBoss = "우두머리" ; ttElite = "정예" ; ttRare = "희귀" ; ttRareElite = "희귀 정예" ; ttRareBoss = "희귀 우두머리" ; ttTarget = "대상"
elseif GameLocale == "esMX" then ttYou = "" ; ttLevel = "Nivel" ; ttBoss = "Jefe" ; ttElite = "Élite" ; ttRare = "Raro" ; ttRareElite = "Raro Élite" ; ttRareBoss = "Raro Jefe" ; ttTarget = "Objetivo"
elseif GameLocale == "ptBR" then ttYou = "VOCÊ" ; ttLevel = "Nível" ; ttBoss = "Chefe" ; ttElite = "Elite" ; ttRare = "Raro" ; ttRareElite = "Raro Elite" ; ttRareBoss = "Raro Chefe" ; ttTarget = "Alvo"
elseif GameLocale == "deDE" then ttYou = "SIE" ; ttLevel = "Stufe" ; ttBoss = "Boss" ; ttElite = "Elite" ; ttRare = "Selten" ; ttRareElite = "Selten Elite" ; ttRareBoss = "Selten Boss" ; ttTarget = "Ziel"
elseif GameLocale == "esES" then ttYou = "" ; ttLevel = "Nivel" ; ttBoss = "Jefe" ; ttElite = "Élite" ; ttRare = "Raro" ; ttRareElite = "Raro Élite" ; ttRareBoss = "Raro Jefe" ; ttTarget = "Objetivo"
elseif GameLocale == "frFR" then ttYou = "TOI" ; ttLevel = "Niveau" ; ttBoss = "Boss" ; ttElite = "Élite" ; ttRare = "Rare" ; ttRareElite = "Rare Élite" ; ttRareBoss = "Rare Boss" ; ttTarget = "Cible"
elseif GameLocale == "itIT" then ttYou = "TU" ; ttLevel = "Livello" ; ttBoss = "Boss" ; ttElite = "Élite" ; ttRare = "Raro" ; ttRareElite = "Raro Élite" ; ttRareBoss = "Raro Boss" ; ttTarget = "Bersaglio"
else ttYou = "YOU" ; ttLevel = "Level" ; ttBoss = "Boss" ; ttElite = "Elite" ; ttRare = "Rare" ; ttRareElite = "Rare Elite" ; ttRareBoss = "Rare Boss" ; ttTarget = "Target"
end
-- Show tooltip
local function ShowTip(self)
-- Required for Dragonflight (or not self:IsTooltipType(Enum.TooltipDataType.Unit))
if self ~= GameTooltip then return end
-- Do nothing if CTRL, SHIFT and ALT are being held
if IsControlKeyDown() and IsAltKeyDown() and IsShiftKeyDown() then
return
end
-- Get unit information
if GetMouseFocus() == WorldFrame then
LT["Unit"] = "mouseover"
-- Hide and quit if tips should be hidden during combat
if LeaPlusLC["TipHideInCombat"] == "On" and UnitAffectingCombat("player") then
if not IsShiftKeyDown() or LeaPlusLC["TipHideShiftOverride"] == "Off" then
GameTooltip:Hide()
return
end
end
else
LT["Unit"] = select(2, GameTooltip:GetUnit())
if not (LT["Unit"]) then return end
end
-- Quit if unit has no reaction to player
LT["Reaction"] = UnitReaction(LT["Unit"], "player") or nil
if not LT["Reaction"] then
return
end
-- Quit if unit is a wild pet
if UnitIsWildBattlePet(LT["Unit"]) then return end
-- Setup variables
LT["TipUnitName"], LT["TipUnitRealm"] = UnitName(LT["Unit"])
LT["TipIsPlayer"] = UnitIsPlayer(LT["Unit"])
LT["UnitLevel"] = UnitEffectiveLevel(LT["Unit"])
LT["RealLevel"] = UnitLevel(LT["Unit"])
LT["UnitClass"] = UnitClassBase(LT["Unit"])
LT["PlayerControl"] = UnitPlayerControlled(LT["Unit"])
LT["PlayerRace"] = UnitRace(LT["Unit"])
-- Get guild information
if LT["TipIsPlayer"] then
local unitGuild, unitRank = GetGuildInfo(LT["Unit"])
if unitGuild and unitRank then
-- Unit is guilded
if LT["ColorBlind"] == "1" then
LT["GuildLine"], LT["InfoLine"], LT["SpecLine"] = 2, 4, 5
else
LT["GuildLine"], LT["InfoLine"], LT["SpecLine"] = 2, 3, 4
end
LT["GuildName"], LT["GuildRank"] = unitGuild, unitRank
else
-- Unit is not guilded
LT["GuildName"] = nil
if LT["ColorBlind"] == "1" then
LT["GuildLine"], LT["InfoLine"], LT["SpecLine"] = 0, 3, 4
else
LT["GuildLine"], LT["InfoLine"], LT["SpecLine"] = 0, 2, 3
end
end
-- Lower information and specialisation lines if unit is charmed
if UnitIsCharmed(LT["Unit"]) then
LT["InfoLine"] = LT["InfoLine"] + 1
LT["SpecLine"] = LT["SpecLine"] + 1
end
end
-- Determine class color
if LT["UnitClass"] then
-- Define male or female (for certain locales)
LT["Sex"] = UnitSex(LT["Unit"])
if LT["Sex"] == 2 then
LT["Class"] = TipMClass[LT["UnitClass"]]
else
LT["Class"] = TipFClass[LT["UnitClass"]]
end
-- Define class color
LT["ClassCol"] = LeaPlusLC["RaidColors"][LT["UnitClass"]]
LT["LpTipClassColor"] = "|cff" .. string.format("%02x%02x%02x", LT["ClassCol"].r * 255, LT["ClassCol"].g * 255, LT["ClassCol"].b * 255)
end
----------------------------------------------------------------------
-- Name line
----------------------------------------------------------------------
if ((LT["TipIsPlayer"]) or (LT["PlayerControl"])) or LT["Reaction"] > 4 then
-- If it's a player show name in class color
if LT["TipIsPlayer"] then
LT["NameColor"] = LT["LpTipClassColor"]
else
-- If not, set to green or blue depending on PvP status
if UnitIsPVP(LT["Unit"]) then
LT["NameColor"] = "|cff00ff00"
else
LT["NameColor"] = "|cff00aaff"
end
end
-- Show name
LT["NameText"] = UnitPVPName(LT["Unit"]) or LT["TipUnitName"]
-- Show realm
if LT["TipUnitRealm"] then
LT["NameText"] = LT["NameText"] .. " - " .. LT["TipUnitRealm"]
end
-- Show dead units in grey
if UnitIsDeadOrGhost(LT["Unit"]) then
LT["NameColor"] = "|c88888888"
end
-- Show mythic score
--if LT["TipIsPlayer"] and LeaPlusLC["TipShowMythic"] == "On" then
-- LT["MythicScore"] = GetPlayerMythicPlusRatingSummary(LT["Unit"]).currentSeasonScore
-- if LT["MythicScore"] > 0 then
-- LT["MythicColor"] = string.format('%02x%02x%02x', GetDungeonScoreRarityColor(GetPlayerMythicPlusRatingSummary(LT["Unit"]).currentSeasonScore):GetRGBAsBytes())
-- LT["NameText"] = LT["NameText"] .. " |cff" .. LT["MythicColor"] .. "(" .. LT["MythicScore"] .. ")|r"
-- end
--end
-- Show name line
_G["GameTooltipTextLeft1"]:SetText(LT["NameColor"] .. LT["NameText"] .. "|cffffffff|r")
elseif UnitIsDeadOrGhost(LT["Unit"]) then
-- Show grey name for other dead units
_G["GameTooltipTextLeft1"]:SetText("|c88888888" .. (_G["GameTooltipTextLeft1"]:GetText() or "") .. "|cffffffff|r")
return
end
----------------------------------------------------------------------
-- Guild line
----------------------------------------------------------------------
if LT["TipIsPlayer"] and LT["GuildName"] then
-- Show guild line
if UnitIsInMyGuild(LT["Unit"]) then
if LeaPlusLC["TipShowRank"] == "On" then
_G["GameTooltipTextLeft" .. LT["GuildLine"]]:SetText("|c00aaaaff" .. LT["GuildName"] .. " - " .. LT["GuildRank"] .. "|r")
else
_G["GameTooltipTextLeft" .. LT["GuildLine"]]:SetText("|c00aaaaff" .. LT["GuildName"] .. "|cffffffff|r")
end
else
if LeaPlusLC["TipShowOtherRank"] == "On" then
_G["GameTooltipTextLeft" .. LT["GuildLine"]]:SetText("|c00aaaaff" .. LT["GuildName"] .. " - " .. LT["GuildRank"] .. "|r")
else
_G["GameTooltipTextLeft" .. LT["GuildLine"]]:SetText("|c00aaaaff" .. LT["GuildName"] .. "|cffffffff|r")
end
end
end
----------------------------------------------------------------------
-- Information line (level, class, race)
----------------------------------------------------------------------
if LT["TipIsPlayer"] then
if GameLocale == "ruRU" then
LT["InfoText"], LT["SpecText"] = "", ""
-- Show race
if LT["PlayerRace"] then
LT["InfoText"] = LT["InfoText"] .. LT["PlayerRace"] .. ","
end
-- Show specialisation
-- LT["InfoText"] = LT["InfoText"] .. " " .. LT["LpTipClassColor"] .. LT["Class"] .. "|r " or LT["InfoText"] .. "|r "
LT["SpecText"] = _G["GameTooltipTextLeft" .. LT["SpecLine"]]:GetText()
_G["GameTooltipTextLeft" .. LT["SpecLine"]]:SetText(LT["LpTipClassColor"] .. LT["SpecText"] .. "|r")
-- Show level
if LT["Reaction"] < 5 then
if LT["UnitLevel"] == -1 then
LT["InfoText"] = LT["InfoText"] .. ("|cffff3333" .. "??-ro" .. " " .. ttLevel .. "|cffffffff")
else
LT["LevelDifficulty"] = C_PlayerInfo.GetContentDifficultyCreatureForPlayer(LT["Unit"])
LT["LevelColor"] = GetDifficultyColor(LT["LevelDifficulty"])
LT["LevelColor"] = string.format('%02x%02x%02x', LT["LevelColor"].r * 255, LT["LevelColor"].g * 255, LT["LevelColor"].b * 255)
LT["InfoText"] = LT["InfoText"] .. ("|cff" .. LT["LevelColor"] .. LT["UnitLevel"] .. LT["LevelLocale"] .. "|cffffffff")
end
else
if LT["UnitLevel"] ~= LT["RealLevel"] then
LT["InfoText"] = LT["InfoText"] .. LT["UnitLevel"] .. " (" .. LT["RealLevel"] .. ") " .. LT["LevelLocale"]
else
LT["InfoText"] = LT["InfoText"] .. LT["UnitLevel"] .. LT["LevelLocale"]
end
end
-- Show information line
_G["GameTooltipTextLeft" .. LT["InfoLine"]]:SetText(LT["InfoText"] .. "|cffffffff|r")
else
-- Show level
if LT["Reaction"] < 5 then
if LT["UnitLevel"] == -1 then
LT["InfoText"] = ("|cffff3333" .. ttLevel .. " ??|cffffffff")
else
LT["LevelDifficulty"] = C_PlayerInfo.GetContentDifficultyCreatureForPlayer(LT["Unit"])
LT["LevelColor"] = GetDifficultyColor(LT["LevelDifficulty"])
LT["LevelColor"] = string.format('%02x%02x%02x', LT["LevelColor"].r * 255, LT["LevelColor"].g * 255, LT["LevelColor"].b * 255)
LT["InfoText"] = ("|cff" .. LT["LevelColor"] .. LT["LevelLocale"] .. " " .. LT["UnitLevel"] .. "|cffffffff")
end
else
if LT["UnitLevel"] ~= LT["RealLevel"] then
LT["InfoText"] = LT["LevelLocale"] .. " " .. LT["UnitLevel"] .. " (" .. LT["RealLevel"] .. ")"
else
LT["InfoText"] = LT["LevelLocale"] .. " " .. LT["UnitLevel"]
end
end
-- Show race
if LT["PlayerRace"] then
LT["InfoText"] = LT["InfoText"] .. " " .. LT["PlayerRace"]
end
-- Show specialisation
-- LT["InfoText"] = LT["InfoText"] .. " " .. LT["LpTipClassColor"] .. LT["Class"] or LT["InfoText"]
LT["SpecText"] = _G["GameTooltipTextLeft" .. LT["SpecLine"]]:GetText()
_G["GameTooltipTextLeft" .. LT["SpecLine"]]:SetText(LT["LpTipClassColor"] .. LT["SpecText"] .. "|r")
-- Show information line
_G["GameTooltipTextLeft" .. LT["InfoLine"]]:SetText(LT["InfoText"] .. "|cffffffff|r")
end
end
----------------------------------------------------------------------
-- Mob name in brighter red (alive) and steel blue (tap denied)
----------------------------------------------------------------------
if not (LT["TipIsPlayer"]) and LT["Reaction"] < 4 and not (LT["PlayerControl"]) then
if UnitIsTapDenied(LT["Unit"]) then
LT["NameText"] = "|c8888bbbb" .. LT["TipUnitName"] .. "|r"
else
LT["NameText"] = "|cffff3333" .. LT["TipUnitName"] .. "|r"
end
_G["GameTooltipTextLeft1"]:SetText(LT["NameText"])
end
----------------------------------------------------------------------
-- Mob level in color (neutral or lower)
----------------------------------------------------------------------
if UnitCanAttack(LT["Unit"], "player") and not (LT["TipIsPlayer"]) and LT["Reaction"] < 5 and not (LT["PlayerControl"]) then
-- Find the level line
LT["MobInfoLine"] = 0
local line2, line3, line4
if _G["GameTooltipTextLeft2"] then line2 = _G["GameTooltipTextLeft2"]:GetText() end
if _G["GameTooltipTextLeft3"] then line3 = _G["GameTooltipTextLeft3"]:GetText() end
if _G["GameTooltipTextLeft4"] then line4 = _G["GameTooltipTextLeft4"]:GetText() end
if GameLocale == "ruRU" then -- Additional check for ruRU
if line2 and string.lower(line2):find(LevelString2) then LT["MobInfoLine"] = 2 end
if line3 and string.lower(line3):find(LevelString2) then LT["MobInfoLine"] = 3 end
if line4 and string.lower(line4):find(LevelString2) then LT["MobInfoLine"] = 4 end
end
if line2 and string.lower(line2):find(LevelString) then LT["MobInfoLine"] = 2 end
if line3 and string.lower(line3):find(LevelString) then LT["MobInfoLine"] = 3 end
if line4 and string.lower(line4):find(LevelString) then LT["MobInfoLine"] = 4 end
-- Show level line
if LT["MobInfoLine"] > 1 then
if GameLocale == "ruRU" then
LT["InfoText"] = ""
-- Show creature type and classification
LT["CreatureType"] = UnitCreatureType(LT["Unit"])
if (LT["CreatureType"]) and not (LT["CreatureType"] == "Not specified") then
LT["InfoText"] = LT["InfoText"] .. "|cffffffff" .. LT["CreatureType"] .. "|cffffffff "
end
-- Level ?? mob
if LT["UnitLevel"] == -1 then
LT["InfoText"] = LT["InfoText"] .. "|cffff3333" .. "??-ro " .. ttLevel .. "|cffffffff "
-- Mobs within level range
else
LT["MobDifficulty"] = C_PlayerInfo.GetContentDifficultyCreatureForPlayer(LT["Unit"])
LT["MobColor"] = GetDifficultyColor(LT["MobDifficulty"])
LT["MobColor"] = string.format('%02x%02x%02x', LT["MobColor"].r * 255, LT["MobColor"].g * 255, LT["MobColor"].b * 255)
LT["InfoText"] = LT["InfoText"] .. "|cff" .. LT["MobColor"] .. LT["UnitLevel"] .. LT["LevelLocale"] .. "|cffffffff "
end
else
-- Level ?? mob
if LT["UnitLevel"] == -1 then
LT["InfoText"] = "|cffff3333" .. ttLevel .. " ??|cffffffff "
-- Mobs within level range
else
LT["MobDifficulty"] = C_PlayerInfo.GetContentDifficultyCreatureForPlayer(LT["Unit"])
LT["MobColor"] = GetDifficultyColor(LT["MobDifficulty"])
LT["MobColor"] = string.format('%02x%02x%02x', LT["MobColor"].r * 255, LT["MobColor"].g * 255, LT["MobColor"].b * 255)
LT["InfoText"] = "|cff" .. LT["MobColor"] .. LT["LevelLocale"] .. " " .. LT["UnitLevel"] .. "|cffffffff "
end
-- Show creature type and classification
LT["CreatureType"] = UnitCreatureType(LT["Unit"])
if (LT["CreatureType"]) and not (LT["CreatureType"] == "Not specified") then
LT["InfoText"] = LT["InfoText"] .. "|cffffffff" .. LT["CreatureType"] .. "|cffffffff "
end
end
-- Rare, elite and boss mobs
LT["Special"] = UnitClassification(LT["Unit"])
if LT["Special"] then
if LT["Special"] == "elite" then
if strfind(_G["GameTooltipTextLeft" .. LT["MobInfoLine"]]:GetText(), "(" .. ttBoss .. ")") then
LT["Special"] = "(" .. ttBoss .. ")"
else
LT["Special"] = "(" .. ttElite .. ")"
end
elseif LT["Special"] == "rare" then
LT["Special"] = "|c00e066ff(" .. ttRare .. ")"
elseif LT["Special"] == "rareelite" then
if strfind(_G["GameTooltipTextLeft" .. LT["MobInfoLine"]]:GetText(), "(" .. ttBoss .. ")") then
LT["Special"] = "|c00e066ff(" .. ttRareBoss .. ")"
else
LT["Special"] = "|c00e066ff(" .. ttRareElite .. ")"
end
elseif LT["Special"] == "worldboss" then
LT["Special"] = "(" .. ttBoss .. ")"
elseif LT["UnitLevel"] == -1 and LT["Special"] == "normal" and strfind(_G["GameTooltipTextLeft" .. LT["MobInfoLine"]]:GetText(), "(" .. ttBoss .. ")") then
LT["Special"] = "(" .. ttBoss .. ")"
else
LT["Special"] = nil
end
if (LT["Special"]) then
LT["InfoText"] = LT["InfoText"] .. LT["Special"]
end
end
-- Show mob info line
_G["GameTooltipTextLeft" .. LT["MobInfoLine"]]:SetText(LT["InfoText"])
end
end
----------------------------------------------------------------------
-- Backdrop color
----------------------------------------------------------------------
if LeaPlusLC["TipBackSimple"] == "On" then
LT["TipFaction"] = UnitFactionGroup(LT["Unit"])
if UnitCanAttack("player", LT["Unit"]) and not (UnitIsDeadOrGhost(LT["Unit"])) and not (LT["TipFaction"] == nil) and not (LT["TipFaction"] == UnitFactionGroup("player")) then
-- Hostile faction
GameTooltip.NineSlice:SetCenterColor(0.5, 0.0, 0.0)
else
-- Friendly faction
GameTooltip.NineSlice:SetCenterColor(0.0, 0.0, 0.5)
end
end
----------------------------------------------------------------------
-- Show target
----------------------------------------------------------------------
if LeaPlusLC["TipShowTarget"] == "On" then
-- Get target
LT["Target"] = UnitName(LT["Unit"] .. "target");
-- If target doesn't exist, quit
if LT["Target"] == nil or LT["Target"] == "" then return end
-- If target is you, set target to YOU
if (UnitIsUnit(LT["Target"], "player")) then
LT["Target"] = ("|c12ff4400" .. ttYou)
-- If it's not you, but it's a player, show target in class color
elseif UnitIsPlayer(LT["Unit"] .. "target") then
LT["TargetBase"] = UnitClassBase(LT["Unit"] .. "target")
LT["TargetCol"] = LeaPlusLC["RaidColors"][LT["TargetBase"]]
LT["TargetCol"] = "|cff" .. string.format('%02x%02x%02x', LT["TargetCol"].r * 255, LT["TargetCol"].g * 255, LT["TargetCol"].b * 255)
LT["Target"] = (LT["TargetCol"] .. LT["Target"])
end
-- Add target line
GameTooltip:AddLine(ttTarget .. ": " .. LT["Target"])
end
end
TooltipDataProcessor.AddTooltipPostCall(Enum.TooltipDataType.Unit, ShowTip)
end
----------------------------------------------------------------------
-- Move chat editbox to top
----------------------------------------------------------------------
if LeaPlusLC["MoveChatEditBoxToTop"] == "On" and not LeaLockList["MoveChatEditBoxToTop"] then
-- Set options for normal chat frames
for i = 1, 50 do
if _G["ChatFrame" .. i] then
-- Position the editbox
_G["ChatFrame" .. i .. "EditBox"]:ClearAllPoints();
_G["ChatFrame" .. i .. "EditBox"]:SetPoint("TOPLEFT", _G["ChatFrame" .. i], 0, 0);
_G["ChatFrame" .. i .. "EditBox"]:SetWidth(_G["ChatFrame" .. i]:GetWidth());
-- Ensure editbox width matches chatframe width
_G["ChatFrame" .. i]:HookScript("OnSizeChanged", function()
_G["ChatFrame" .. i .. "EditBox"]:SetWidth(_G["ChatFrame" .. i]:GetWidth())
end)
end
end
-- Do the functions above for other chat frames (pet battles, whispers, etc)
hooksecurefunc("FCF_OpenTemporaryWindow", function()
local cf = FCF_GetCurrentChatFrame():GetName() or nil
if cf then
-- Position the editbox
_G[cf .. "EditBox"]:ClearAllPoints();
_G[cf .. "EditBox"]:SetPoint("TOPLEFT", cf, "TOPLEFT", 0, 0);
_G[cf .. "EditBox"]:SetWidth(_G[cf]:GetWidth());
-- Ensure editbox width matches chatframe width
_G[cf]:HookScript("OnSizeChanged", function()
_G[cf .. "EditBox"]:SetWidth(_G[cf]:GetWidth())
end)
end
end)
end
----------------------------------------------------------------------
-- Show borders
----------------------------------------------------------------------
if LeaPlusLC["ShowBorders"] == "On" then
-- Create border textures
local BordTop = WorldFrame:CreateTexture(nil, "ARTWORK"); BordTop:SetColorTexture(0, 0, 0, 1); BordTop:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 0, 0); BordTop:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", 0, 0)
local BordBot = WorldFrame:CreateTexture(nil, "ARTWORK"); BordBot:SetColorTexture(0, 0, 0, 1); BordBot:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", 0, 0); BordBot:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", 0, 0)
local BordLeft = WorldFrame:CreateTexture(nil, "ARTWORK"); BordLeft:SetColorTexture(0, 0, 0, 1); BordLeft:SetPoint("TOPLEFT", UIParent, "TOPLEFT", 0, 0); BordLeft:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", 0, 0)
local BordRight = WorldFrame:CreateTexture(nil, "ARTWORK"); BordRight:SetColorTexture(0, 0, 0, 1); BordRight:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", 0, 0); BordRight:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", 0, 0)
-- Create border configuration panel
local bordersPanel = LeaPlusLC:CreatePanel("Show borders", "bordersPanel")
-- Function to set border parameters
local function RefreshBorders()
-- Set border size and transparency
BordTop:SetHeight(LeaPlusLC["BordersTop"]); BordTop:SetAlpha(1 - LeaPlusLC["BordersAlpha"])
BordBot:SetHeight(LeaPlusLC["BordersBottom"]); BordBot:SetAlpha(1 - LeaPlusLC["BordersAlpha"])
BordLeft:SetWidth(LeaPlusLC["BordersLeft"]); BordLeft:SetAlpha(1 - LeaPlusLC["BordersAlpha"])
BordRight:SetWidth(LeaPlusLC["BordersRight"]); BordRight:SetAlpha(1 - LeaPlusLC["BordersAlpha"])
-- Show formatted slider value
LeaPlusCB["BordersAlpha"].f:SetFormattedText("%.0f%%", LeaPlusLC["BordersAlpha"] * 100)
end
-- Create slider controls
LeaPlusLC:MakeTx(bordersPanel, "Top", 16, -72)
LeaPlusLC:MakeSL(bordersPanel, "BordersTop", "Drag to set the size of the top border.", 0, 300, 5, 16, -92, "%.0f")
LeaPlusCB["BordersTop"]:HookScript("OnValueChanged", RefreshBorders)
LeaPlusLC:MakeTx(bordersPanel, "Bottom", 16, -132)
LeaPlusLC:MakeSL(bordersPanel, "BordersBottom", "Drag to set the size of the bottom border.", 0, 300, 5, 16, -152, "%.0f")
LeaPlusCB["BordersBottom"]:HookScript("OnValueChanged", RefreshBorders)
LeaPlusLC:MakeTx(bordersPanel, "Left", 186, -72)
LeaPlusLC:MakeSL(bordersPanel, "BordersLeft", "Drag to set the size of the left border.", 0, 300, 5, 186, -92, "%.0f")
LeaPlusCB["BordersLeft"]:HookScript("OnValueChanged", RefreshBorders)
LeaPlusLC:MakeTx(bordersPanel, "Right", 186, -132)
LeaPlusLC:MakeSL(bordersPanel, "BordersRight", "Drag to set the size of the right border.", 0, 300, 5, 186, -152, "%.0f")
LeaPlusCB["BordersRight"]:HookScript("OnValueChanged", RefreshBorders)
LeaPlusLC:MakeTx(bordersPanel, "Transparency", 356, -132)
LeaPlusLC:MakeSL(bordersPanel, "BordersAlpha", "Drag to set the transparency of the borders.", 0, 0.9, 0.1, 356, -152, "%.1f")
LeaPlusCB["BordersAlpha"]:HookScript("OnValueChanged", RefreshBorders)
-- Help button hidden
bordersPanel.h:Hide()
-- Back button handler
bordersPanel.b:SetScript("OnClick", function()
bordersPanel:Hide()
LeaPlusLC["PageF"]:Show()
LeaPlusLC["Page5"]:Show()
return
end)
-- Reset button handler
bordersPanel.r:SetScript("OnClick", function()
LeaPlusLC["BordersTop"] = 0
LeaPlusLC["BordersBottom"] = 0
LeaPlusLC["BordersLeft"] = 0
LeaPlusLC["BordersRight"] = 0
LeaPlusLC["BordersAlpha"] = 0
bordersPanel:Hide(); bordersPanel:Show()
RefreshBorders()
end)
-- Configuration button handler
LeaPlusCB["ModBordersBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["BordersTop"] = 0
LeaPlusLC["BordersBottom"] = 0
LeaPlusLC["BordersLeft"] = 0
LeaPlusLC["BordersRight"] = 0
LeaPlusLC["BordersAlpha"] = 0.7
RefreshBorders()
else
bordersPanel:Show()
LeaPlusLC:HideFrames()
end
end)
-- Set borders on startup
RefreshBorders()
-- Hide borders when cinematic is shown
hooksecurefunc(CinematicFrame, "Hide", function()
BordTop:Show(); BordBot:Show(); BordLeft:Show(); BordRight:Show()
end)
hooksecurefunc(CinematicFrame, "Show", function()
BordTop:Hide(); BordBot:Hide(); BordLeft:Hide(); BordRight:Hide()
end)
end
----------------------------------------------------------------------
-- Silence rested emotes
----------------------------------------------------------------------
-- Manage emotes
if LeaPlusLC["NoRestedEmotes"] == "On" then
-- Zone table English , French , German , Italian , Russian , S Chinese , Spanish , T Chinese ,
local zonetable = { "The Halfhill Market" , "Marché de Micolline" , "Der Halbhügelmarkt" , "Il Mercato di Mezzocolle" , "Рынок Полугорья" , "半山市集" , "El Mercado del Alcor" , "半丘市集" ,
"The Grim Guzzler" , "Le Sinistre écluseur" , "Zum Grimmigen Säufer" , "Torvo Beone" , "Трактир Угрюмый обжора" , "黑铁酒吧" , "Tragapenas" , "黑鐵酒吧" ,
"The Summer Terrace" , "La terrasse Estivale" , "Die Sommerterrasse" , "Terrazza Estiva" , "Летняя терраса" , "夏之台" , "El Bancal del Verano" , "夏日露臺" ,
}
-- Function to set rested state
local function UpdateEmoteSound()
-- Find character's current zone
local szone = GetSubZoneText() or "None"
-- Find out if emote sounds are disabled or enabled
local emoset = GetCVar("Sound_EnableEmoteSounds")
if IsResting() then
-- Character is resting so silence emotes
if emoset ~= "0" then
SetCVar("Sound_EnableEmoteSounds", "0")
end
return
end
-- Traverse zone table and silence emotes if character is in a designated zone
for k, v in next, zonetable do
if szone == zonetable[k] then
if emoset ~= "0" then
SetCVar("Sound_EnableEmoteSounds", "0")
end
return
end
end
-- Silence emotes if character is in a pet battle
if C_PetBattles.IsInBattle() then
if emoset ~= "0" then
SetCVar("Sound_EnableEmoteSounds", "0")
end
return
end
-- If the above didn't return, emote sounds should be enabled
if emoset ~= "1" then
SetCVar("Sound_EnableEmoteSounds", "1")
end
return
end
-- Set emote sound when pet battles start and end
hooksecurefunc("PetBattleFrame_Display", UpdateEmoteSound)
hooksecurefunc("PetBattleFrame_Remove", UpdateEmoteSound)
-- Set emote sound when rest state or zone changes
local RestEvent = CreateFrame("FRAME")
RestEvent:RegisterEvent("PLAYER_UPDATE_RESTING")
RestEvent:RegisterEvent("ZONE_CHANGED_NEW_AREA")
RestEvent:RegisterEvent("ZONE_CHANGED")
RestEvent:RegisterEvent("ZONE_CHANGED_INDOORS")
RestEvent:SetScript("OnEvent", UpdateEmoteSound)
-- Set sound setting at startup
UpdateEmoteSound()
end
----------------------------------------------------------------------
-- Final code for Player
----------------------------------------------------------------------
-- Show first run message
if not LeaPlusDB["FirstRunMessageSeen"] then
C_Timer.After(1, function()
LeaPlusLC:Print(L["Enter"] .. " |cff00ff00" .. "/ltp" .. "|r " .. L["or click the minimap button to open Leatrix Plus."])
LeaPlusDB["FirstRunMessageSeen"] = true
end)
end
-- Register logout event to save settings
LpEvt:RegisterEvent("PLAYER_LOGOUT")
-- Release memory
LeaPlusLC.Player = nil
end
----------------------------------------------------------------------
-- L50: RunOnce
----------------------------------------------------------------------
function LeaPlusLC:RunOnce()
----------------------------------------------------------------------
-- Flares (world markers)
----------------------------------------------------------------------
do
local raidTable = {L["Flare: Square"], L["Flare: Triangle"], L["Flare: Diamond"], L["Flare: Cross"], L["Flare: Star"], L["Flare: Circle"], L["Flare: Moon"], L["Flare: Skull"], L["Flare: Clear all"]}
for i = 1, 9 do
_G["BINDING_NAME_CLICK " .. "LeaPlusGlobalFlare" .. i ..":LeftButton"] = raidTable[i]
local btn = CreateFrame("Button", "LeaPlusGlobalFlare" .. i, nil, "SecureActionButtonTemplate")
btn:SetAttribute("type", "macro")
if i == 9 then
btn:SetAttribute("macrotext", "/clearworldmarker 0")
else
btn:SetAttribute("macrotext", "/clearworldmarker " .. i .. "\n/worldmarker " .. i)
end
-- btn:RegisterForClicks("AnyDown") -- Shadowlands
btn:RegisterForClicks("AnyUp", "AnyDown") -- Currently needed in Dragonflight
end
end
----------------------------------------------------------------------
-- Frame alignment grid
----------------------------------------------------------------------
do
-- Create frame alignment grid
local grid = CreateFrame('FRAME')
LeaPlusLC.grid = grid
grid:Hide()
grid:SetAllPoints(UIParent)
local w, h = GetScreenWidth() * UIParent:GetEffectiveScale(), GetScreenHeight() * UIParent:GetEffectiveScale()
local ratio = w / h
local sqsize = w / 20
local wline = floor(sqsize - (sqsize % 2))
local hline = floor(sqsize / ratio - ((sqsize / ratio) % 2))
-- Plot vertical lines
for i = 0, wline do
local t = LeaPlusLC.grid:CreateTexture(nil, 'BACKGROUND')
if i == wline / 2 then t:SetColorTexture(1, 0, 0, 0.5) else t:SetColorTexture(0, 0, 0, 0.5) end
t:SetPoint('TOPLEFT', grid, 'TOPLEFT', i * w / wline - 1, 0)
t:SetPoint('BOTTOMRIGHT', grid, 'BOTTOMLEFT', i * w / wline + 1, 0)
end
-- Plot horizontal lines
for i = 0, hline do
local t = LeaPlusLC.grid:CreateTexture(nil, 'BACKGROUND')
if i == hline / 2 then t:SetColorTexture(1, 0, 0, 0.5) else t:SetColorTexture(0, 0, 0, 0.5) end
t:SetPoint('TOPLEFT', grid, 'TOPLEFT', 0, -i * h / hline + 1)
t:SetPoint('BOTTOMRIGHT', grid, 'TOPRIGHT', 0, -i * h / hline - 1)
end
end
----------------------------------------------------------------------
-- Media player
----------------------------------------------------------------------
function LeaPlusLC:MediaFunc()
-- Create tables for list data
local ListData, playlist = {}, {}
local scrollFrame, willPlay, musicHandle, ZonePage, LastPlayed, LastFolder, TempFolder, HeadingOfClickedTrack, LastMusicHandle
local numButtons = 15
local uframe = CreateFrame("FRAME")
-- These categories will not appear in random track selections
local randomBannedList = {L["Narration"], L["Cinematics"], "MUS_51_DarkmoonFaire_MerryGoRound_01#34440"}
-- Get media table
local ZoneList = Leatrix_Plus["ZoneList"]
-- Show relevant list items
local function UpdateList()
FauxScrollFrame_Update(scrollFrame, #ListData, numButtons, 16)
for index = 1, numButtons do
local offset = index + FauxScrollFrame_GetOffset(scrollFrame)
local button = scrollFrame.buttons[index]
button.index = offset
if offset <= #ListData then
-- Show zone listing or track listing
button:SetText(ListData[offset].zone or ListData[offset])
-- Set width of highlight texture
if button:GetTextWidth() > 290 then
button.t:SetSize(290, 16)
else
button.t:SetSize(button:GetTextWidth(), 16)
end
-- Show the button
button:Show()
-- Hide highlight bar texture by default
button.s:Hide()
-- Hide highlight bar if the button is a heading
if strfind(button:GetText(), "|c") then button.t:Hide() end
-- Show last played track highlight bar texture
if LastPlayed == button:GetText() then
local HeadingOfCurrentFolder = ListData[1]
if HeadingOfCurrentFolder == HeadingOfClickedTrack then
button.s:Show()
end
end
-- Show last played folder highlight bar texture
if LastFolder == button:GetText() then
button.s:Show()
end
-- Set width of highlight bar
if button:GetTextWidth() > 290 then
button.s:SetSize(290, 16)
else
button.s:SetSize(button:GetTextWidth(), 16)
end
-- Limit click to label width
local bWidth = button:GetFontString():GetStringWidth() or 0
if bWidth > 290 then bWidth = 290 end
button:SetHitRectInsets(0, 454 - bWidth, 0, 0)
-- Disable label click movement
button:SetPushedTextOffset(0, 0)
-- Disable word wrap and set width
button:GetFontString():SetWidth(290)
button:GetFontString():SetWordWrap(false)
else
button:Hide()
end
end
end
-- Give function file level scope (it's used in SetPlusScale to set the highlight bar scale)
LeaPlusLC.UpdateList = UpdateList
-- Right-button click to go back
local function BackClick()
-- Return to the current zone list (back button)
if type(ListData[1]) == "string" then
-- Strip the color code from the list data
local nocol = string.gsub(ListData[1], "|cffffd800", "")
-- Strip the zone
local backzone = strsplit(":", nocol, 2)
-- Don't go back if random or search category is being shown
if backzone == L["Random"] or backzone == L["Search"] then return end
-- Show the tracklist continent
if ZoneList[backzone] then ListData = ZoneList[backzone] end
UpdateList()
scrollFrame:SetVerticalScroll(ZonePage or 0)
end
end
-- Function to make navigation menu buttons
local function MakeButton(where, y)
local mbtn = CreateFrame("Button", nil, LeaPlusLC["Page9"])
mbtn:Show()
mbtn:SetAlpha(1.0)
mbtn:SetPoint("TOPLEFT", 146, y)
-- Create hover texture
mbtn.t = mbtn:CreateTexture(nil, "BACKGROUND")
mbtn.t:SetColorTexture(0.3, 0.3, 0.00, 0.8)
mbtn.t:SetAlpha(0.7)
mbtn.t:SetAllPoints()
mbtn.t:Hide()
-- Create highlight texture
mbtn.s = mbtn:CreateTexture(nil, "BACKGROUND")
mbtn.s:SetColorTexture(0.3, 0.3, 0.00, 0.8)
mbtn.s:SetAlpha(1.0)
mbtn.s:SetAllPoints()
mbtn.s:Hide()
-- Create fontstring
mbtn.f = mbtn:CreateFontString(nil, 'ARTWORK', 'GameFontNormal')
mbtn.f:SetPoint('LEFT', 1, 0)
mbtn.f:SetText(L[where])
mbtn:SetScript("OnEnter", function()
mbtn.t:Show()
end)
mbtn:SetScript("OnLeave", function()
mbtn.t:Hide()
end)
-- Set button size when shown
mbtn:SetScript("OnShow", function()
mbtn:SetSize(mbtn.f:GetStringWidth() + 1, 16)
end)
mbtn:SetScript("OnClick", function()
-- Show zone listing for clicked item
ListData = ZoneList[where]
UpdateList()
end)
return mbtn, mbtn.s
end
-- Create a table for each button
local conbtn = {}
for q, w in pairs(ZoneList) do
conbtn[q] = {}
end
-- Create buttons
local function MakeButtonNow(title, anchor)
conbtn[title], conbtn[title].s = MakeButton(title, height)
conbtn[title]:ClearAllPoints()
if title == L["Zones"] then
-- Set first button position
conbtn[title]:SetPoint("TOPLEFT", LeaPlusLC["Page9"], "TOPLEFT", 145, -70)
elseif anchor then
-- Set subsequent button positions
conbtn[title]:SetPoint("TOPLEFT", conbtn[anchor], "BOTTOMLEFT", 0, 0)
conbtn[title].f:SetText(L[title])
end
end
MakeButtonNow(L["Zones"])
MakeButtonNow(L["Dungeons"], L["Zones"])
MakeButtonNow(L["Various"], L["Dungeons"])
MakeButtonNow(L["Movies"], L["Various"])
MakeButtonNow(L["Random"], L["Movies"])
MakeButtonNow(L["Search"]) -- Positioned when search editbox is created
-- Show button highlight for clicked button
for q, w in pairs(ZoneList) do
if type(w) == "string" and conbtn[w] then
conbtn[w]:HookScript("OnClick", function()
-- Hide all button highlights
for k, v in pairs(ZoneList) do
if type(v) == "string" and conbtn[v] then
conbtn[v].s:Hide()
end
end
-- Show clicked button highlight
conbtn[w].s:Show()
LeaPlusDB["MusicContinent"] = w
scrollFrame:SetVerticalScroll(0)
-- Set TempFolder for listings without folders
if w == L["Random"] then TempFolder = L["Random"] end
if w == L["Search"] then TempFolder = L["Search"] end
end)
end
end
-- Create scroll bar
scrollFrame = CreateFrame("ScrollFrame", "LeaPlusScrollFrame", LeaPlusLC["Page9"], "FauxScrollFrameTemplate")
scrollFrame:SetPoint("TOPLEFT", 0, -32)
scrollFrame:SetPoint("BOTTOMRIGHT", -30, 50)
scrollFrame:SetFrameLevel(10)
scrollFrame:SetScript("OnVerticalScroll", function(self, offset)
FauxScrollFrame_OnVerticalScroll(self, offset, 16, UpdateList)
end)
-- Add stop button
local stopBtn = LeaPlusLC:CreateButton("StopMusicBtn", LeaPlusLC["Page9"], "Stop", "TOPLEFT", 146, -292, 0, 25, true, "")
stopBtn:Hide(); stopBtn:Show()
LeaPlusLC:LockItem(stopBtn, true)
stopBtn:SetScript("OnClick", function()
if musicHandle then
StopSound(musicHandle)
musicHandle = nil
-- Hide highlight bars
LastPlayed = ""
LastFolder = ""
UpdateList()
end
-- Cancel sound file music timer
if LeaPlusLC.TrackTimer then LeaPlusLC.TrackTimer:Cancel() end
-- Lock button and unregister next track events
LeaPlusLC:LockItem(stopBtn, true)
uframe:UnregisterEvent("SOUNDKIT_FINISHED")
uframe:UnregisterEvent("LOADING_SCREEN_DISABLED")
end)
-- Store currently playing track number
local tracknumber = 1
-- Function to play a track and show the static highlight bar
local function PlayTrack()
-- Play tracks
if musicHandle then StopSound(musicHandle) end
local file, soundID, trackTime
if playlist[tracknumber]:match("([^,]+)%#([^,]+)%#([^,]+)") then
-- Music file with track time
file, soundID, trackTime = playlist[tracknumber]:match("([^,]+)%#([^,]+)%#([^,]+)")
willPlay, musicHandle = PlaySoundFile(soundID, "Master", false, true)
else
-- Sound kit without track time
file, soundID = playlist[tracknumber]:match("([^,]+)%#([^,]+)")
willPlay, musicHandle = PlaySound(soundID, "Master", false, true)
end
-- Cancel existing music timer for a sound file
if LeaPlusLC.TrackTimer then LeaPlusLC.TrackTimer:Cancel() end
if playlist[tracknumber]:match("([^,]+)%#([^,]+)%#([^,]+)") then
-- Track is a sound file with track time so create track timer
LeaPlusLC.TrackTimer = C_Timer.NewTimer(trackTime + 1, function()
if musicHandle then StopSound(musicHandle) end
if tracknumber == #playlist then
-- Playlist is at the end, restart from first track
tracknumber = 1
end
PlayTrack()
end)
end
-- Store its handle for later use
LastMusicHandle = musicHandle
LastPlayed = playlist[tracknumber]
tracknumber = tracknumber + 1
-- Show static highlight bar
for index = 1, numButtons do
local button = scrollFrame.buttons[index]
local item = button:GetText()
if item then
if item:match("([^,]+)%#([^,]+)%#([^,]+)") then
-- Music file with track time
local item, void, void = item:match("([^,]+)%#([^,]+)%#([^,]+)")
if item then
if item == file and LastFolder == TempFolder then
button.s:Show()
else
button.s:Hide()
end
end
else
-- Sound kit without track time
local item, void = item:match("([^,]+)%#([^,]+)")
if item then
if item == file and LastFolder == TempFolder then
button.s:Show()
else
button.s:Hide()
end
end
end
end
end
end
-- Create editbox for search
local sBox = LeaPlusLC:CreateEditBox("MusicSearchBox", LeaPlusLC["Page9"], 78, 10, "TOPLEFT", 150, -260, "MusicSearchBox", "MusicSearchBox")
sBox:SetMaxLetters(50)
-- Position search button above editbox
conbtn[L["Search"]]:ClearAllPoints()
conbtn[L["Search"]]:SetPoint("BOTTOMLEFT", sBox, "TOPLEFT", -4, 0)
-- Set initial search data
for q, w in pairs(ZoneList) do
if conbtn[w] then
conbtn[w]:HookScript("OnClick", function()
if w == L["Search"] then
ListData[1] = "|cffffd800" .. L["Search"]
if #ListData == 1 then
ListData[2] = "|cffffffaa{" .. L["enter zone or track name"] .. "}"
end
UpdateList()
else
sBox:ClearFocus()
end
end)
end
end
-- Function to show search results
local function ShowSearchResults()
-- Get unescaped editbox text
local searchText = gsub(strlower(sBox:GetText()), '(['..("%^$().[]*+-?"):gsub("(.)", "%%%1")..'])', "%%%1")
-- Wipe the track listing
wipe(ListData)
-- Set the track list heading
ListData[1] = "|cffffd800" .. L["Search"]
-- Show the subheading only if no search results are being shown
if searchText == "" then
ListData[2] = "|cffffffaa{" .. L["enter zone or track name"] .. "}"
else
ListData[2] = ""
end
-- Traverse music listing and populate ListData
if searchText ~= "" then
local word1, word2, word3, word4, word5 = strsplit(" ", (strtrim(searchText):gsub("%s+", " ")))
_G.LeaPlusGlobalHash = {}
local hash = LeaPlusGlobalHash
local trackCount = 0
for i, e in pairs(ZoneList) do
if ZoneList[e] then
for a, b in pairs(ZoneList[e]) do
if b.tracks then
for k, v in pairs(b.tracks) do
if (strfind(v, "#") or strfind(v, "|r")) and (strfind(strlower(v), word1) or strfind(strlower(b.zone), word1) or strfind(strlower(b.category), word1)) then
if not word2 or word2 ~= "" and (strfind(strlower(v), word2) or strfind(strlower(b.zone), word2) or strfind(strlower(b.category), word2)) then
if not word3 or word3 ~= "" and (strfind(strlower(v), word3) or strfind(strlower(b.zone), word3) or strfind(strlower(b.category), word3)) then
if not word4 or word4 ~= "" and (strfind(strlower(v), word4) or strfind(strlower(b.zone), word4) or strfind(strlower(b.category), word4)) then
if not word5 or word5 ~= "" and (strfind(strlower(v), word5) or strfind(strlower(b.zone), word5) or strfind(strlower(b.category), word5)) then
-- Show category
if not hash[b.category] then
tinsert(ListData, "|cffffffff")
if b.category == e then
-- No category so just show ZoneList entry (such as Various)
tinsert(ListData, "|cffffd800" .. e)
else
-- Category exists so show that
tinsert(ListData, "|cffffd800" .. e .. ": " .. b.category)
end
hash[b.category] = true
end
-- Show track
tinsert(ListData, "|Cffffffaa" .. b.zone .. " |r" .. v)
trackCount = trackCount + 1
hash[v] = true
end
end
end
end
end
end
end
end
end
end
-- Set results tag
if trackCount == 1 then
ListData[2] = "|cffffffaa{" .. trackCount .. " " .. L["result"] .. "}"
else
ListData[2] = "|cffffffaa{" .. trackCount .. " " .. L["results"] .. "}"
end
end
-- Refresh the track listing
UpdateList()
-- Set track listing to top
scrollFrame:SetVerticalScroll(0)
end
-- Populate ListData when editbox is changed by user
sBox:HookScript("OnTextChanged", function(self, userInput)
if userInput then
-- Show search page
conbtn[L["Search"]]:Click()
-- If search results are currently playing, stop playback since search results will be changed
if LastFolder == L["Search"] then stopBtn:Click() end
-- Show search results
ShowSearchResults()
end
end)
-- Populate ListData when editbox enter key is pressed
sBox:HookScript("OnEnterPressed", function()
-- Show search page
conbtn[L["Search"]]:Click()
-- If search results are currently playing, stop playback since search results will be changed
if LastFolder == L["Search"] then stopBtn:Click() end
-- Show search results
ShowSearchResults()
end)
-- Function to get random argument for random track listing
local function GetRandomArgument(...)
return (select(random(select("#", ...)), ...))
end
-- Function to show random track listing
local function ShowRandomList()
-- If random track is currently playing, stop playback since random track list will be changed
if LastFolder == L["Random"] then
stopBtn:Click()
end
-- Wipe the track listing for random
wipe(ListData)
-- Set the track list heading
ListData[1] = "|cffffd800" .. L["Random"]
ListData[2] = "|Cffffffaa{" .. L["click here for new selection"] .. "}" -- Must be capital |C
ListData[3] = "|cffffd800"
ListData[4] = "|cffffd800" .. L["Selection of music tracks"] -- Must be lower case |c
-- Populate list data until it contains desired number of tracks
while #ListData < 50 do
-- Get random category
local rCategory = GetRandomArgument(L["Zones"], L["Dungeons"], L["Various"])
-- Get random zone within category
local rZone = random(1, #ZoneList[rCategory])
-- Get random track within zone
local rTrack = ZoneList[rCategory][rZone].tracks[random(1, #ZoneList[rCategory][rZone].tracks)]
-- Insert track into ListData if it's not a duplicate or on the banned list
if rTrack and rTrack ~= "" and strfind(rTrack, "#") and not tContains(ListData, "|Cffffffaa" .. ZoneList[rCategory][rZone].zone .. " |r" .. rTrack) then
if not tContains(randomBannedList, L[ZoneList[rCategory][rZone].zone]) and not tContains(randomBannedList, rTrack) then
tinsert(ListData, "|Cffffffaa" .. ZoneList[rCategory][rZone].zone .. " |r" .. rTrack)
end
end
end
-- Refresh the track listing
UpdateList()
-- Set track listing to top
scrollFrame:SetVerticalScroll(0)
end
-- Show random track listing on startup when random button is clicked
for q, w in pairs(ZoneList) do
if conbtn[w] then
conbtn[w]:HookScript("OnClick", function()
if w == L["Random"] then
-- Generate initial playlist for first run
if #ListData == 0 then
ShowRandomList()
end
end
end)
end
end
-- Create list items
scrollFrame.buttons = {}
for i = 1, numButtons do
scrollFrame.buttons[i] = CreateFrame("Button", nil, LeaPlusLC["Page9"])
local button = scrollFrame.buttons[i]
button:SetSize(470 - 14, 16)
button:SetNormalFontObject("GameFontHighlightLeft")
button:SetPoint("TOPLEFT", 246, -62+ -(i - 1) * 16 - 8)
-- Create highlight bar texture
button.t = button:CreateTexture(nil, "BACKGROUND")
button.t:SetPoint("TOPLEFT", button, 0, 0)
button.t:SetSize(516, 16)
button.t:SetColorTexture(0.3, 0.3, 0.0, 0.8)
button.t:SetAlpha(0.7)
button.t:Hide()
-- Create last playing highlight bar texture
button.s = button:CreateTexture(nil, "BACKGROUND")
button.s:SetPoint("TOPLEFT", button, 0, 0)
button.s:SetSize(516, 16)
button.s:SetColorTexture(0.3, 0.4, 0.00, 0.6)
button.s:Hide()
button:SetScript("OnEnter", function()
-- Highlight links only
if not string.match(button:GetText() or "", "|c") then
button.t:Show()
end
end)
button:SetScript("OnLeave", function()
button.t:Hide()
end)
button:RegisterForClicks("LeftButtonUp", "RightButtonUp")
-- Handler for playing next SoundKit track in playlist
uframe:SetScript("OnEvent", function(self, event, stoppedHandle)
if event == "SOUNDKIT_FINISHED" then
-- Do nothing if stopped sound kit handle doesnt match last played track handle
if LastMusicHandle and LastMusicHandle ~= stoppedHandle then return end
-- Reset track number if playlist has reached the end
if tracknumber == #playlist then tracknumber = 1 end
-- Play next track
PlayTrack()
elseif event == "LOADING_SCREEN_DISABLED" then
-- Restart player if it stopped between tracks during loading screen
if playlist and tracknumber and playlist[tracknumber] and not willPlay and not musicHandle then
tracknumber = tracknumber - 1
C_Timer.After(0.1, PlayTrack)
end
end
end)
-- Click handler for track, zone and back button
button:SetScript("OnClick", function(self, btn)
if btn == "LeftButton" then
-- Remove focus from search box
sBox:ClearFocus()
-- Get clicked track text
local item = self:GetText()
-- Do nothing if its a blank line or informational heading
if not item or strfind(item, "|c") then return end
if item == "|Cffffffaa{" .. L["click here for new selection"] .. "}" then -- must be capital |C
-- Create new random track listing
ShowRandomList()
return
elseif strfind(item, "#") then
-- Enable sound if required
if GetCVar("Sound_EnableAllSound") == "0" then SetCVar("Sound_EnableAllSound", "1") end
-- Disable music if it's currently enabled
if GetCVar("Sound_EnableMusic") == "1" then SetCVar("Sound_EnableMusic", "0") end
-- Add all tracks to playlist
wipe(playlist)
local StartItem = 0
-- Get item clicked row number
for index = 1, #ListData do
local item = ListData[index]
if self:GetText() == item then StartItem = index end
end
-- Add all items from clicked item onwards to playlist
for index = StartItem, #ListData do
local item = ListData[index]
if item then
if strfind(item, "#") then
tinsert(playlist, item)
end
end
end
-- Add all items up to clicked item to playlist
for index = 1, StartItem do
local item = ListData[index]
if item then
if strfind(item, "#") then
tinsert(playlist, item)
end
end
end
-- Enable the stop button
LeaPlusLC:LockItem(stopBtn, false)
-- Set Temp Folder to Random if track is in Random
if ListData[1] == "|cffffd800" .. L["Random"] then TempFolder = L["Random"] end
-- Set Temp Folder to Search if track is in Search
if ListData[1] == "|cffffd800" .. L["Search"] then TempFolder = L["Search"] end
-- Store information about the track we are about to play
tracknumber = 1
LastPlayed = item
LastFolder = TempFolder
HeadingOfClickedTrack = ListData[1]
-- Play first track
PlayTrack()
-- Play subsequent tracks
uframe:RegisterEvent("SOUNDKIT_FINISHED")
uframe:RegisterEvent("LOADING_SCREEN_DISABLED")
return
elseif strfind(item, "|r") then
-- A movie was clicked
local movieName, movieID = item:match("([^,]+)%|r([^,]+)")
movieID = strtrim(movieID, "()")
if IsMoviePlayable(movieID) then
stopBtn:Click()
LeaPlusLC.MoviePlaying = true
MovieFrame_PlayMovie(MovieFrame, movieID)
LeaPlusLC.MoviePlaying = false
else
LeaPlusLC:Print("Movie not playable.")
end
return
else
-- A zone was clicked so show track listing
ZonePage = scrollFrame:GetVerticalScroll()
-- Find the track listing for the clicked zone
for q, w in pairs(ZoneList) do
for k, v in pairs(ZoneList[w]) do
if item == v.zone then
-- Show track listing
TempFolder = item
LeaPlusDB["MusicZone"] = item
ListData = v.tracks
UpdateList()
-- Hide hover highlight if track under pointer is a heading
if strfind(scrollFrame.buttons[i]:GetText(), "|c") then
scrollFrame.buttons[i].t:Hide()
end
-- Show top of track list
scrollFrame:SetVerticalScroll(0)
return
end
end
end
end
elseif btn == "RightButton" then
-- Back button was clicked
BackClick()
end
end)
end
-- Right-click to go back (from anywhere on the main content area of the panel)
LeaPlusLC["PageF"]:HookScript("OnMouseUp", function(self, btn)
if LeaPlusLC["Page9"]:IsShown() and LeaPlusLC["Page9"]:IsMouseOver(0, 0, 0, -440) == false and LeaPlusLC["Page9"]:IsMouseOver(-330, 0, 0, 0) == false then
if btn == "RightButton" then
BackClick()
end
end
end)
-- Delete the global scroll frame pointer
_G.LeaPlusScrollFrame = nil
-- Set zone listing on startup
if LeaPlusDB["MusicContinent"] and LeaPlusDB["MusicContinent"] ~= "" then
-- Saved music continent exists
if conbtn[LeaPlusDB["MusicContinent"]] then
-- Saved continent is valid button so click it
conbtn[LeaPlusDB["MusicContinent"]]:Click()
else
-- Saved continent is not valid button so click default button
conbtn[L["Zones"]]:Click()
end
else
-- Saved music continent does not exist so click default button
conbtn[L["Zones"]]:Click()
end
UpdateList()
-- Manage events
LeaPlusLC["Page9"]:RegisterEvent("PLAYER_LOGOUT")
LeaPlusLC["Page9"]:RegisterEvent("UI_SCALE_CHANGED")
LeaPlusLC["Page9"]:SetScript("OnEvent", function(self, event)
if event == "PLAYER_LOGOUT" then
-- Stop playing at reload or logout
if musicHandle then
StopSound(musicHandle)
end
elseif event == "UI_SCALE_CHANGED" then
-- Refresh list
UpdateList()
end
end)
end
-- Run on startup
LeaPlusLC:MediaFunc()
-- Release memory
LeaPlusLC.MediaFunc = nil
----------------------------------------------------------------------
-- Panel alpha
----------------------------------------------------------------------
-- Function to set panel alpha
local function SetPlusAlpha()
-- Set panel alpha
LeaPlusLC["PageF"].t:SetAlpha(1 - LeaPlusLC["PlusPanelAlpha"])
-- Show formatted value
LeaPlusCB["PlusPanelAlpha"].f:SetFormattedText("%.0f%%", LeaPlusLC["PlusPanelAlpha"] * 100)
end
-- Set alpha on startup
SetPlusAlpha()
-- Set alpha after changing slider
LeaPlusCB["PlusPanelAlpha"]:HookScript("OnValueChanged", SetPlusAlpha)
----------------------------------------------------------------------
-- Panel scale
----------------------------------------------------------------------
-- Function to set panel scale
local function SetPlusScale()
-- Reset panel position
LeaPlusLC["MainPanelA"], LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"] = "CENTER", "CENTER", 0, 0
if LeaPlusLC["PageF"]:IsShown() then
LeaPlusLC["PageF"]:Hide()
LeaPlusLC["PageF"]:Show()
end
-- Set panel scale
LeaPlusLC["PageF"]:SetScale(LeaPlusLC["PlusPanelScale"])
-- Update music player highlight bar scale
LeaPlusLC:UpdateList()
end
-- Set scale on startup
LeaPlusLC["PageF"]:SetScale(LeaPlusLC["PlusPanelScale"])
-- Set scale and reset panel position after changing slider
LeaPlusCB["PlusPanelScale"]:HookScript("OnMouseUp", SetPlusScale)
LeaPlusCB["PlusPanelScale"]:HookScript("OnMouseWheel", SetPlusScale)
-- Show formatted slider value
LeaPlusCB["PlusPanelScale"]:HookScript("OnValueChanged", function()
LeaPlusCB["PlusPanelScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["PlusPanelScale"] * 100)
end)
----------------------------------------------------------------------
-- Block friend requests
----------------------------------------------------------------------
-- Function to decline friend requests
local function DeclineReqs()
if LeaPlusLC["NoFriendRequests"] == "On" then
for i = BNGetNumFriendInvites(), 1, -1 do
local id, player = BNGetFriendInviteInfo(i)
if id and player then
BNDeclineFriendInvite(id)
C_Timer.After(0.1, function()
LeaPlusLC:Print(L["A friend request from"] .. " " .. player .. " " .. L["was automatically declined."])
end)
end
end
end
end
-- Event frame for incoming friend requests
local DecEvt = CreateFrame("FRAME")
DecEvt:SetScript("OnEvent", DeclineReqs)
-- Function to register or unregister the event
local function ControlEvent()
if LeaPlusLC["NoFriendRequests"] == "On" then
DecEvt:RegisterEvent("BN_FRIEND_INVITE_ADDED")
DeclineReqs()
else
DecEvt:UnregisterEvent("BN_FRIEND_INVITE_ADDED")
end
end
-- Set event status when option is enabled
LeaPlusCB["NoFriendRequests"]:HookScript("OnClick", ControlEvent)
-- Set event status on startup
ControlEvent()
----------------------------------------------------------------------
-- Invite from whisper (configuration panel)
----------------------------------------------------------------------
-- Create configuration panel
local InvPanel = LeaPlusLC:CreatePanel("Invite from whispers", "InvPanel")
-- Add editbox
LeaPlusLC:MakeTx(InvPanel, "Settings", 16, -72)
LeaPlusLC:MakeCB(InvPanel, "InviteFriendsOnly", "Restrict to friends", 16, -92, false, "If checked, group invites will only be sent to friends.|n|nIf unchecked, group invites will be sent to everyone.")
LeaPlusLC:MakeTx(InvPanel, "Keyword", 356, -72)
local KeyBox = LeaPlusLC:CreateEditBox("KeyBox", InvPanel, 140, 10, "TOPLEFT", 356, -92, "KeyBox", "KeyBox")
-- Function to show the keyword in the option tooltip
local function SetKeywordTip()
LeaPlusCB["InviteFromWhisper"].tiptext = gsub(LeaPlusCB["InviteFromWhisper"].tiptext, "(|cffffffff)[^|]*(|r)", "%1" .. LeaPlusLC["InvKey"] .. "%2")
end
-- Function to save the keyword
local function SetInvKey()
local keytext = KeyBox:GetText()
if keytext and keytext ~= "" then
LeaPlusLC["InvKey"] = strtrim(KeyBox:GetText())
else
LeaPlusLC["InvKey"] = "inv"
end
-- Show the keyword in the option tooltip
SetKeywordTip()
end
-- Show the keyword in the option tooltip on startup
SetKeywordTip()
-- Save the keyword when it changes
KeyBox:SetScript("OnTextChanged", SetInvKey)
-- Refresh editbox with trimmed keyword when edit focus is lost (removes additional spaces)
KeyBox:SetScript("OnEditFocusLost", function()
KeyBox:SetText(LeaPlusLC["InvKey"])
end)
-- Help button hidden
InvPanel.h:Hide()
-- Back button handler
InvPanel.b:SetScript("OnClick", function()
-- Save the keyword
SetInvKey()
-- Show the options panel
InvPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page2"]:Show()
return
end)
-- Add reset button
InvPanel.r:SetScript("OnClick", function()
-- Settings
LeaPlusLC["InviteFriendsOnly"] = "Off"
-- Reset the keyword to default
LeaPlusLC["InvKey"] = "inv"
-- Set the editbox to default
KeyBox:SetText("inv")
-- Save the keyword
SetInvKey()
-- Refresh panel
InvPanel:Hide(); InvPanel:Show()
end)
-- Ensure keyword is a string on startup
LeaPlusLC["InvKey"] = tostring(LeaPlusLC["InvKey"]) or "inv"
-- Set editbox value when shown
KeyBox:HookScript("OnShow", function()
KeyBox:SetText(LeaPlusLC["InvKey"])
end)
-- Configuration button handler
LeaPlusCB["InvWhisperBtn"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["InviteFriendsOnly"] = "On"
LeaPlusLC["InvKey"] = "inv"
KeyBox:SetText(LeaPlusLC["InvKey"])
SetInvKey()
else
-- Show panel
InvPanel:Show()
LeaPlusLC:HideFrames()
end
end)
----------------------------------------------------------------------
-- Create panel in game options panel
----------------------------------------------------------------------
do
local interPanel = CreateFrame("FRAME")
interPanel.name = "Leatrix Plus"
local maintitle = LeaPlusLC:MakeTx(interPanel, "Leatrix Plus", 0, 0)
maintitle:SetFont(maintitle:GetFont(), 72)
maintitle:ClearAllPoints()
maintitle:SetPoint("TOP", 0, -72)
local expTitle = LeaPlusLC:MakeTx(interPanel, "Shadowlands", 0, 0)
expTitle:SetFont(expTitle:GetFont(), 32)
expTitle:ClearAllPoints()
expTitle:SetPoint("TOP", 0, -152)
local subTitle = LeaPlusLC:MakeTx(interPanel, "www.leatrix.com", 0, 0)
subTitle:SetFont(subTitle:GetFont(), 20)
subTitle:ClearAllPoints()
subTitle:SetPoint("BOTTOM", 0, 72)
local slashTitle = LeaPlusLC:MakeTx(interPanel, "/ltp", 0, 0)
slashTitle:SetFont(slashTitle:GetFont(), 72)
slashTitle:ClearAllPoints()
slashTitle:SetPoint("BOTTOM", subTitle, "TOP", 0, 40)
local pTex = interPanel:CreateTexture(nil, "BACKGROUND")
pTex:SetAllPoints()
pTex:SetTexture("Interface\\GLUES\\Models\\UI_MainMenu\\swordgradient2")
pTex:SetAlpha(0.2)
pTex:SetTexCoord(0, 1, 1, 0)
expTitle:SetText(L["Dragonflight"])
local category = Settings.RegisterCanvasLayoutCategory(interPanel, L["Leatrix Plus"])
Settings.RegisterAddOnCategory(category)
end
----------------------------------------------------------------------
-- Final code for RunOnce
----------------------------------------------------------------------
-- Update addon memory usage (speeds up initial value)
UpdateAddOnMemoryUsage();
-- Release memory
LeaPlusLC.RunOnce = nil
end
----------------------------------------------------------------------
-- L60: Default events
----------------------------------------------------------------------
local function eventHandler(self, event, arg1, arg2, ...)
----------------------------------------------------------------------
-- Invite from whisper
----------------------------------------------------------------------
if event == "CHAT_MSG_WHISPER" or event == "CHAT_MSG_BN_WHISPER" then
if (not UnitExists("party1") or UnitIsGroupLeader("player") or UnitIsGroupAssistant("player")) and strlower(strtrim(arg1)) == strlower(LeaPlusLC["InvKey"]) then
if not LeaPlusLC:IsInLFGQueue() then
if event == "CHAT_MSG_WHISPER" then
local void, void, void, void, viod, void, void, void, void, guid = ...
if LeaPlusLC:FriendCheck(arg2, guid) or LeaPlusLC["InviteFriendsOnly"] == "Off" then
C_PartyInfo.InviteUnit(arg2)
end
elseif event == "CHAT_MSG_BN_WHISPER" then
local presenceID = select(11, ...)
if presenceID and BNIsFriend(presenceID) then
local index = BNGetFriendIndex(presenceID)
if index then
local accountInfo = C_BattleNet.GetFriendAccountInfo(index)
local gameAccountInfo = accountInfo.gameAccountInfo
local gameAccountID = gameAccountInfo.gameAccountID
if gameAccountID then
BNInviteFriend(gameAccountID)
end
end
end
end
end
end
return
end
----------------------------------------------------------------------
-- Block duel requests
----------------------------------------------------------------------
if event == "DUEL_REQUESTED" and not LeaPlusLC:FriendCheck(arg1) then
CancelDuel()
StaticPopup_Hide("DUEL_REQUESTED")
return
end
----------------------------------------------------------------------
-- Block pet battle duel requests
----------------------------------------------------------------------
if event == "PET_BATTLE_PVP_DUEL_REQUESTED" and not LeaPlusLC:FriendCheck(arg1) then
C_PetBattles.CancelPVPDuel()
return
end
----------------------------------------------------------------------
-- Accept summon
----------------------------------------------------------------------
if event == "CONFIRM_SUMMON" then
if not UnitAffectingCombat("player") then
local sName = C_SummonInfo.GetSummonConfirmSummoner()
local sLocation = C_SummonInfo.GetSummonConfirmAreaName()
LeaPlusLC:Print(L["The summon from"] .. " " .. sName .. " (" .. sLocation .. ") " .. L["will be automatically accepted in 10 seconds unless cancelled."])
C_Timer.After(10, function()
local sNameNew = C_SummonInfo.GetSummonConfirmSummoner()
local sLocationNew = C_SummonInfo.GetSummonConfirmAreaName()
if sName == sNameNew and sLocation == sLocationNew then
-- Automatically accept summon after 10 seconds if summoner name and location have not changed
C_SummonInfo.ConfirmSummon()
StaticPopup_Hide("CONFIRM_SUMMON")
end
end)
end
return
end
----------------------------------------------------------------------
-- Block party invites and party from friends
----------------------------------------------------------------------
if event == "PARTY_INVITE_REQUEST" then
-- If a friend, accept if you're accepting friends and not in Dungeon Finder
local void, void, void, void, guid = ...
if (LeaPlusLC["AcceptPartyFriends"] == "On" and LeaPlusLC:FriendCheck(arg1, guid)) then
if not LeaPlusLC:IsInLFGQueue() then
AcceptGroup()
for i=1, STATICPOPUP_NUMDIALOGS do
if _G["StaticPopup"..i].which == "PARTY_INVITE" then
_G["StaticPopup"..i].inviteAccepted = 1
StaticPopup_Hide("PARTY_INVITE")
break
elseif _G["StaticPopup"..i].which == "PARTY_INVITE_XREALM" then
_G["StaticPopup"..i].inviteAccepted = 1
StaticPopup_Hide("PARTY_INVITE_XREALM")
break
end
end
-- Confirm invite to party sync group request
if QuestSessionManager.ConfirmInviteToGroupReceivedDialog.ButtonContainer.Confirm:IsShown() then
QuestSessionManager.ConfirmInviteToGroupReceivedDialog.ButtonContainer.Confirm:Click()
end
return
end
end
-- If not a friend and you're blocking invites, decline
if LeaPlusLC["NoPartyInvites"] == "On" then
if LeaPlusLC:FriendCheck(arg1, guid) then
return
else
DeclineGroup()
StaticPopup_Hide("PARTY_INVITE")
StaticPopup_Hide("PARTY_INVITE_XREALM")
-- Decline invite to party sync group request
if QuestSessionManager.ConfirmInviteToGroupReceivedDialog.ButtonContainer.Decline:IsShown() then
QuestSessionManager.ConfirmInviteToGroupReceivedDialog.ButtonContainer.Decline:Click()
end
return
end
end
return
end
----------------------------------------------------------------------
-- Disable loot warnings
----------------------------------------------------------------------
-- Disable warnings for attempting to roll Need or Disenchant on loot
if event == "CONFIRM_LOOT_ROLL" or event == "CONFIRM_DISENCHANT_ROLL" then
ConfirmLootRoll(arg1, arg2)
StaticPopup_Hide("CONFIRM_LOOT_ROLL")
return
end
-- Disable warning for attempting to loot a Bind on Pickup item
if event == "LOOT_BIND_CONFIRM" then
ConfirmLootSlot(arg1, arg2)
StaticPopup_Hide("LOOT_BIND",...)
return
end
-- Disable warning for attempting to vendor an item within its refund window
if event == "MERCHANT_CONFIRM_TRADE_TIMER_REMOVAL" then
SellCursorItem()
return
end
-- Disable warning for attempting to mail an item within its refund window
if event == "MAIL_LOCK_SEND_ITEMS" then
RespondMailLockSendItem(arg1, true)
return
end
----------------------------------------------------------------------
-- Hide the combat log
----------------------------------------------------------------------
if event == "UPDATE_CHAT_WINDOWS" then
ChatFrame2Tab:EnableMouse(false)
ChatFrame2Tab:SetText(" ") -- Needs to be something for chat settings to function
ChatFrame2Tab:SetScale(0.01)
ChatFrame2Tab:SetWidth(0.01)
ChatFrame2Tab:SetHeight(0.01)
end
----------------------------------------------------------------------
-- L62: Profile events
----------------------------------------------------------------------
if event == "ADDON_LOADED" then
if arg1 == "Leatrix_Plus" then
-- Replace old var names with new ones
local function UpdateVars(oldvar, newvar)
if LeaPlusDB[oldvar] and not LeaPlusDB[newvar] then LeaPlusDB[newvar] = LeaPlusDB[oldvar]; LeaPlusDB[oldvar] = nil end
end
UpdateVars("MinimapMod", "MinimapModder") -- 9.2.26 (24th August 2022)
UpdateVars("RestorechatMessages", "RestoreChatMessages") -- 9.2.36 (20th September 2022)
-- Minimum faster auto loot delay changed from 0.0 to 0.1 in 10.0.20
if LeaPlusDB["LeaPlusFasterLootDelay"] and LeaPlusDB["LeaPlusFasterLootDelay"] == 0 then
LeaPlusDB["LeaPlusFasterLootDelay"] = 0.1
end
if LeaPlusDB["AutoQuestNoDaily"] and not LeaPlusDB["AutoQuestDaily"] then
if LeaPlusDB["AutoQuestNoDaily"] == "On" then
LeaPlusDB["AutoQuestDaily"] = "Off"
else
LeaPlusDB["AutoQuestDaily"] = "On"
end
LeaPlusDB["AutoQuestNoDaily"] = nil
end
-- Mute game sounds split with Mute mount sounds
if LeaPlusDB["MuteGameSounds"] == "On" and not LeaPlusDB["MuteMountSounds"] then
if LeaPlusDB["MuteAerials"] == "On"
or LeaPlusDB["MuteAirships"] == "On"
or LeaPlusDB["MuteBanLu"] == "On"
or LeaPlusDB["MuteBikes"] == "On"
or LeaPlusDB["MuteBrooms"] == "On"
or LeaPlusDB["MuteDragonriding"] == "On"
or LeaPlusDB["MuteFurlines"] == "On"
or LeaPlusDB["MuteGyrocopters"] == "On"
or LeaPlusDB["MuteHovercraft"] == "On"
or LeaPlusDB["MuteMechSteps"] == "On"
or LeaPlusDB["MuteMechsuits"] == "On"
or LeaPlusDB["MuteOttuks"] == "On"
or LeaPlusDB["MuteRazorwings"] == "On"
or LeaPlusDB["MuteRockets"] == "On"
or LeaPlusDB["MuteSoulEaters"] == "On"
or LeaPlusDB["MuteSoulseekers"] == "On"
or LeaPlusDB["MuteStriders"] == "On"
or LeaPlusDB["MuteTravelers"] == "On"
or LeaPlusDB["MuteUnicorns"] == "On"
or LeaPlusDB["MuteZeppelins"] == "On"
then
LeaPlusLC["MuteMountSounds"] = "On"
LeaPlusDB["MuteMountSounds"] = "On"
end
end
-- Automation
LeaPlusLC:LoadVarChk("AutomateQuests", "Off") -- Automate quests
LeaPlusLC:LoadVarChk("AutoQuestShift", "Off") -- Automate quests requires shift
LeaPlusLC:LoadVarChk("AutoQuestRegular", "On") -- Accept regular quests
LeaPlusLC:LoadVarChk("AutoQuestDaily", "On") -- Accept daily quests
LeaPlusLC:LoadVarChk("AutoQuestWeekly", "On") -- Accept weekly quests
LeaPlusLC:LoadVarChk("AutoQuestCompleted", "On") -- Turn-in completed quests
LeaPlusLC:LoadVarNum("AutoQuestKeyMenu", 1, 1, 4) -- Automate quests override key
LeaPlusLC:LoadVarChk("AutomateGossip", "Off") -- Automate gossip
LeaPlusLC:LoadVarChk("AutoAcceptSummon", "Off") -- Accept summon
LeaPlusLC:LoadVarChk("AutoAcceptRes", "Off") -- Accept resurrection
LeaPlusLC:LoadVarChk("AutoResNoCombat", "On") -- Accept resurrection exclude combat
LeaPlusLC:LoadVarChk("AutoReleasePvP", "Off") -- Release in PvP
LeaPlusLC:LoadVarChk("AutoReleaseNoAlterac", "Off") -- Release in PvP Exclude Alterac Valley
LeaPlusLC:LoadVarChk("AutoReleaseNoWintergsp", "Off") -- Release in PvP Exclude Wintergrasp
LeaPlusLC:LoadVarChk("AutoReleaseNoTolBarad", "Off") -- Release in PvP Exclude Tol Barad (PvP)
LeaPlusLC:LoadVarChk("AutoReleaseNoAshran", "Off") -- Release in PvP Exclude Ashran
LeaPlusLC:LoadVarNum("AutoReleaseDelay", 0, 0, 3000) -- Release in PvP Delay
LeaPlusLC:LoadVarChk("AutoSellJunk", "Off") -- Sell junk automatically
LeaPlusLC:LoadVarChk("AutoSellShowSummary", "On") -- Sell junk summary in chat
LeaPlusLC:LoadVarChk("AutoSellNoKeeperTahult", "On") -- Sell junk exclude Keeper Ta'hult
LeaPlusLC:LoadVarChk("AutoSellExcludeMyChar", "On") -- Sell junk exclude gear designed for my character
LeaPlusLC:LoadVarChk("AutoSellExcludeMyAlts", "On") -- Sell junk exclude gear designed for my alts
LeaPlusLC:LoadVarChk("AutoSellNoGreyGear", "Off") -- Sell junk exclude all grey gear
LeaPlusLC:LoadVarStr("AutoSellExcludeList", "") -- Sell junk exclude list
LeaPlusLC:LoadVarChk("AutoRepairGear", "Off") -- Repair automatically
LeaPlusLC:LoadVarChk("AutoRepairGuildFunds", "On") -- Repair using guild funds
LeaPlusLC:LoadVarChk("AutoRepairShowSummary", "On") -- Repair show summary in chat
-- Social
LeaPlusLC:LoadVarChk("NoDuelRequests", "Off") -- Block duels
LeaPlusLC:LoadVarChk("NoPetDuels", "Off") -- Block pet battle duels
LeaPlusLC:LoadVarChk("NoPartyInvites", "Off") -- Block party invites
LeaPlusLC:LoadVarChk("NoFriendRequests", "Off") -- Block friend requests
LeaPlusLC:LoadVarChk("NoSharedQuests", "Off") -- Block shared quests
LeaPlusLC:LoadVarChk("AcceptPartyFriends", "Off") -- Party from friends
LeaPlusLC:LoadVarChk("SyncFromFriends", "Off") -- Sync from friends
LeaPlusLC:LoadVarChk("AutoConfirmRole", "Off") -- Queue from friends
LeaPlusLC:LoadVarChk("InviteFromWhisper", "Off") -- Invite from whispers
LeaPlusLC:LoadVarChk("InviteFriendsOnly", "Off") -- Restrict invites to friends
LeaPlusLC["InvKey"] = LeaPlusDB["InvKey"] or "inv" -- Invite from whisper keyword
LeaPlusLC:LoadVarChk("FriendlyCommunities", "Off") -- Friendly communities
LeaPlusLC:LoadVarChk("FriendlyGuild", "On") -- Friendly guild
-- Chat
LeaPlusLC:LoadVarChk("UseEasyChatResizing", "Off") -- Use easy resizing
LeaPlusLC:LoadVarChk("NoCombatLogTab", "Off") -- Hide the combat log
LeaPlusLC:LoadVarChk("NoChatButtons", "Off") -- Hide chat buttons
LeaPlusLC:LoadVarChk("ShowVoiceButtons", "Off") -- Show voice buttons
LeaPlusLC:LoadVarChk("ShowChatMenuButton", "Off") -- Show chat menu button
LeaPlusLC:LoadVarChk("NoSocialButton", "Off") -- Hide social button
LeaPlusLC:LoadVarChk("UnclampChat", "Off") -- Unclamp chat frame
LeaPlusLC:LoadVarChk("MoveChatEditBoxToTop", "Off") -- Move editbox to top
LeaPlusLC:LoadVarChk("SetChatFontSize", "Off") -- Set chat font size
LeaPlusLC:LoadVarNum("LeaPlusChatFontSize", 20, 12, 48) -- Chat font size value
LeaPlusLC:LoadVarChk("NoStickyChat", "Off") -- Disable sticky chat
LeaPlusLC:LoadVarChk("UseArrowKeysInChat", "Off") -- Use arrow keys in chat
LeaPlusLC:LoadVarChk("NoChatFade", "Off") -- Disable chat fade
LeaPlusLC:LoadVarChk("UnivGroupColor", "Off") -- Universal group color
LeaPlusLC:LoadVarChk("RecentChatWindow", "Off") -- Recent chat window
LeaPlusLC:LoadVarNum("RecentChatSize", 170, 170, 600) -- Recent chat size
LeaPlusLC:LoadVarChk("MaxChatHstory", "Off") -- Increase chat history
LeaPlusLC:LoadVarChk("FilterChatMessages", "Off") -- Filter chat messages
LeaPlusLC:LoadVarChk("BlockSpellLinks", "Off") -- Block spell links
LeaPlusLC:LoadVarChk("BlockDrunkenSpam", "Off") -- Block drunken spam
LeaPlusLC:LoadVarChk("BlockDuelSpam", "Off") -- Block duel spam
LeaPlusLC:LoadVarChk("RestoreChatMessages", "Off") -- Restore chat messages
-- Text
LeaPlusLC:LoadVarChk("HideErrorMessages", "Off") -- Hide error messages
LeaPlusLC:LoadVarChk("NoHitIndicators", "Off") -- Hide portrait text
LeaPlusLC:LoadVarChk("HideZoneText", "Off") -- Hide zone text
LeaPlusLC:LoadVarChk("HideKeybindText", "Off") -- Hide keybind text
LeaPlusLC:LoadVarChk("HideMacroText", "Off") -- Hide macro text
LeaPlusLC:LoadVarChk("MailFontChange", "Off") -- Resize mail text
LeaPlusLC:LoadVarNum("LeaPlusMailFontSize", 15, 10, 30) -- Mail text slider
LeaPlusLC:LoadVarChk("QuestFontChange", "Off") -- Resize quest text
LeaPlusLC:LoadVarNum("LeaPlusQuestFontSize", 12, 10, 30) -- Quest text slider
-- Interface
LeaPlusLC:LoadVarChk("MinimapModder", "Off") -- Enhance minimap
LeaPlusLC:LoadVarChk("SquareMinimap", "On") -- Square minimap
LeaPlusLC:LoadVarChk("ShowWhoPinged", "On") -- Show who pinged
LeaPlusLC:LoadVarChk("HideMiniAddonMenu", "On") -- Hide addon menu
LeaPlusLC:LoadVarChk("UnclampMinimap", "Off") -- Unclamp minimap cluster
LeaPlusLC:LoadVarChk("CombineAddonButtons", "Off") -- Combine addon buttons
LeaPlusLC:LoadVarStr("MiniExcludeList", "") -- Minimap exclude list
LeaPlusLC:LoadVarChk("HideMiniAddonButtons", "On") -- Hide addon buttons
LeaPlusLC:LoadVarNum("MiniClusterScale", 1, 0.5, 2) -- Minimap cluster scale
LeaPlusLC:LoadVarChk("MinimapNoScale", "Off") -- Minimap not minimap
LeaPlusLC:LoadVarAnc("MinimapA", "TOPRIGHT") -- Minimap anchor
LeaPlusLC:LoadVarAnc("MinimapR", "TOPRIGHT") -- Minimap relative
LeaPlusLC:LoadVarNum("MinimapX", -17, -5000, 5000) -- Minimap X
LeaPlusLC:LoadVarNum("MinimapY", -22, -5000, 5000) -- Minimap Y
LeaPlusLC:LoadVarChk("TipModEnable", "Off") -- Enhance tooltip
LeaPlusLC:LoadVarChk("TipShowRank", "On") -- Show rank for your guild
LeaPlusLC:LoadVarChk("TipShowOtherRank", "Off") -- Show rank for other guilds
LeaPlusLC:LoadVarChk("TipShowTarget", "On") -- Show target
--LeaPlusLC:LoadVarChk("TipShowMythic", "Off") -- Show mythic score
LeaPlusLC:LoadVarChk("TipBackSimple", "Off") -- Color backdrops
LeaPlusLC:LoadVarChk("TipHideInCombat", "Off") -- Hide tooltips during combat
LeaPlusLC:LoadVarChk("TipHideShiftOverride", "On") -- Hide tooltips shift override
LeaPlusLC:LoadVarChk("TipNoHealthBar", "Off") -- Hide health bar
LeaPlusLC:LoadVarNum("LeaPlusTipSize", 1.00, 0.50, 2.00) -- Tooltip scale slider
LeaPlusLC:LoadVarNum("TooltipAnchorMenu", 1, 1, 4) -- Tooltip anchor menu
LeaPlusLC:LoadVarNum("TipCursorX", 0, -128, 128) -- Tooltip cursor X offset
LeaPlusLC:LoadVarNum("TipCursorY", 0, -128, 128) -- Tooltip cursor Y offset
LeaPlusLC:LoadVarChk("EnhanceDressup", "Off") -- Enhance dressup
LeaPlusLC:LoadVarChk("DressupItemButtons", "On") -- Dressup item buttons
LeaPlusLC:LoadVarChk("DressupAnimControl", "On") -- Dressup animation control
LeaPlusLC:LoadVarChk("DressupWiderPreview", "On") -- Dressup wider character preview
LeaPlusLC:LoadVarChk("DressupMoreZoomOut", "Off") -- Dressup increase zoom out distance
LeaPlusLC:LoadVarChk("DressupTransmogAnim", "Off") -- Dressup show transmogrify animation control
LeaPlusLC:LoadVarNum("DressupFasterZoom", 3, 1, 10) -- Dressup zoom speed
LeaPlusLC:LoadVarChk("ShowVolume", "Off") -- Show volume slider
LeaPlusLC:LoadVarChk("ShowVolumeInFrame", "Off") -- Volume slider dual layout
LeaPlusLC:LoadVarChk("ShowCooldowns", "Off") -- Show cooldowns
LeaPlusLC:LoadVarChk("ShowCooldownID", "On") -- Show cooldown ID in tips
LeaPlusLC:LoadVarChk("NoCooldownDuration", "On") -- Hide cooldown duration
LeaPlusLC:LoadVarChk("CooldownsOnPlayer", "Off") -- Anchor to player
LeaPlusLC:LoadVarChk("DurabilityStatus", "Off") -- Show durability status
LeaPlusLC:LoadVarChk("ShowPetSaveBtn", "Off") -- Show pet save button
LeaPlusLC:LoadVarChk("ShowRaidToggle", "Off") -- Show raid button
LeaPlusLC:LoadVarChk("ShowTrainAllButton", "Off") -- Show train all button
LeaPlusLC:LoadVarChk("ShowBorders", "Off") -- Show borders
LeaPlusLC:LoadVarNum("BordersTop", 0, 0, 300) -- Top border
LeaPlusLC:LoadVarNum("BordersBottom", 0, 0, 300) -- Bottom border
LeaPlusLC:LoadVarNum("BordersLeft", 0, 0, 300) -- Left border
LeaPlusLC:LoadVarNum("BordersRight", 0, 0, 300) -- Right border
LeaPlusLC:LoadVarNum("BordersAlpha", 0, 0, 0.9) -- Border alpha
LeaPlusLC:LoadVarChk("ShowPlayerChain", "Off") -- Show player chain
LeaPlusLC:LoadVarNum("PlayerChainMenu", 1, 1, 3) -- Player chain dropdown value
LeaPlusLC:LoadVarChk("ShowReadyTimer", "Off") -- Show ready timer
LeaPlusLC:LoadVarChk("ShowWowheadLinks", "Off") -- Show Wowhead links
LeaPlusLC:LoadVarChk("WowheadLinkComments", "Off") -- Show Wowhead links to comments
-- Frames
LeaPlusLC:LoadVarChk("ManageWidgetTop", "Off") -- Manage widget top
LeaPlusLC:LoadVarAnc("WidgetTopA", "TOP") -- Manage widget top anchor
LeaPlusLC:LoadVarAnc("WidgetTopR", "TOP") -- Manage widget top relative
LeaPlusLC:LoadVarNum("WidgetTopX", 0, -5000, 5000) -- Manage widget top position X
LeaPlusLC:LoadVarNum("WidgetTopY", -15, -5000, 5000) -- Manage widget top position Y
LeaPlusLC:LoadVarNum("WidgetTopScale", 1, 0.5, 2) -- Manage widget top scale
LeaPlusLC:LoadVarChk("ManageControl", "Off") -- Manage control
LeaPlusLC:LoadVarAnc("ControlA", "CENTER") -- Manage control anchor
LeaPlusLC:LoadVarAnc("ControlR", "CENTER") -- Manage control relative
LeaPlusLC:LoadVarNum("ControlX", 0, -5000, 5000) -- Manage control position X
LeaPlusLC:LoadVarNum("ControlY", 0, -5000, 5000) -- Manage control position Y
LeaPlusLC:LoadVarNum("ControlScale", 1, 0.5, 2) -- Manage control scale
LeaPlusLC:LoadVarChk("ClassColFrames", "Off") -- Class colored frames
LeaPlusLC:LoadVarChk("ClassColPlayer", "On") -- Class colored player frame
LeaPlusLC:LoadVarChk("ClassColTarget", "On") -- Class colored target frame
LeaPlusLC:LoadVarChk("NoAlerts", "Off") -- Hide alerts
LeaPlusLC:LoadVarChk("HideBodyguard", "Off") -- Hide bodyguard window
LeaPlusLC:LoadVarChk("HideTalkingFrame", "Off") -- Hide talking frame
LeaPlusLC:LoadVarChk("HideCleanupBtns", "Off") -- Hide clean-up buttons
LeaPlusLC:LoadVarChk("HideBossBanner", "Off") -- Hide boss banner
LeaPlusLC:LoadVarChk("HideEventToasts", "Off") -- Hide event toasts
LeaPlusLC:LoadVarChk("NoClassBar", "Off") -- Hide stance bar
LeaPlusLC:LoadVarChk("NoCommandBar", "Off") -- Hide order hall bar
LeaPlusLC:LoadVarChk("NoRestedSleep", "Off") -- Hide rested sleep
-- System
LeaPlusLC:LoadVarChk("NoScreenGlow", "Off") -- Disable screen glow
LeaPlusLC:LoadVarChk("NoScreenEffects", "Off") -- Disable screen effects
LeaPlusLC:LoadVarChk("SetWeatherDensity", "Off") -- Set weather density
LeaPlusLC:LoadVarNum("WeatherLevel", 3, 0, 3) -- Weather density level
LeaPlusLC:LoadVarChk("MaxCameraZoom", "Off") -- Max camera zoom
LeaPlusLC:LoadVarChk("NoRestedEmotes", "Off") -- Silence rested emotes
LeaPlusLC:LoadVarChk("MuteGameSounds", "Off") -- Mute game sounds
LeaPlusLC:LoadVarChk("MuteMountSounds", "Off") -- Mute mount sounds
LeaPlusLC:LoadVarChk("MuteCustomSounds", "Off") -- Mute custom sounds
LeaPlusLC:LoadVarStr("MuteCustomList", "") -- Mute custom sounds list
LeaPlusLC:LoadVarChk("NoPetAutomation", "Off") -- Disable pet automation
LeaPlusLC:LoadVarChk("CharAddonList", "Off") -- Show character addons
LeaPlusLC:LoadVarChk("NoRaidRestrictions", "Off") -- Remove raid restrictions
LeaPlusLC:LoadVarChk("NoConfirmLoot", "Off") -- Disable loot warnings
LeaPlusLC:LoadVarChk("FasterLooting", "Off") -- Faster auto loot
LeaPlusLC:LoadVarNum("LeaPlusFasterLootDelay", 0.3, 0.1, 0.3) -- Faster auto loot delay
LeaPlusLC:LoadVarChk("FasterMovieSkip", "Off") -- Faster movie skip
LeaPlusLC:LoadVarChk("CombatPlates", "Off") -- Combat plates
LeaPlusLC:LoadVarChk("EasyItemDestroy", "Off") -- Easy item destroy
LeaPlusLC:LoadVarChk("LockoutSharing", "Off") -- Lockout sharing
LeaPlusLC:LoadVarChk("NoTransforms", "Off") -- Remove transforms
-- Settings
LeaPlusLC:LoadVarChk("ShowMinimapIcon", "On") -- Show minimap button
LeaPlusLC:LoadVarNum("PlusPanelScale", 1, 1, 2) -- Panel scale
LeaPlusLC:LoadVarNum("PlusPanelAlpha", 0, 0, 1) -- Panel alpha
-- Panel position
LeaPlusLC:LoadVarAnc("MainPanelA", "CENTER") -- Panel anchor
LeaPlusLC:LoadVarAnc("MainPanelR", "CENTER") -- Panel relative
LeaPlusLC:LoadVarNum("MainPanelX", 0, -5000, 5000) -- Panel X axis
LeaPlusLC:LoadVarNum("MainPanelY", 0, -5000, 5000) -- Panel Y axis
-- Start page
LeaPlusLC:LoadVarNum("LeaStartPage", 0, 0, LeaPlusLC["NumberOfPages"])
-- Lock conflicting options
do
-- Function to disable and lock an option and add a note to the tooltip
local function Lock(option, reason, optmodule)
LeaLockList[option] = LeaPlusLC[option]
LeaPlusLC:LockItem(LeaPlusCB[option], true)
LeaPlusCB[option].tiptext = LeaPlusCB[option].tiptext .. "|n|n|cff00AAFF" .. reason
if optmodule then
LeaPlusCB[option].tiptext = LeaPlusCB[option].tiptext .. " " .. optmodule .. " " .. L["module"]
end
LeaPlusCB[option].tiptext = LeaPlusCB[option].tiptext .. "."
-- Remove hover from configuration button if there is one
local temp = {LeaPlusCB[option]:GetChildren()}
if temp and temp[1] and temp[1].t and temp[1].t:GetTexture() == 311225 then
temp[1]:SetHighlightTexture(0)
temp[1]:SetScript("OnEnter", nil)
end
end
-- Disable items that conflict with Glass
if LeaPlusLC.Glass then
local reason = L["Cannot be used with Glass"]
Lock("UseEasyChatResizing", reason) -- Use easy resizing
Lock("NoCombatLogTab", reason) -- Hide the combat log
Lock("NoChatButtons", reason) -- Hide chat buttons
Lock("NoSocialButton", reason) -- Hide social button
Lock("UnclampChat", reason) -- Unclamp chat frame
Lock("MoveChatEditBoxToTop", reason) -- Move editbox to top
Lock("SetChatFontSize", reason) -- Set chat font size
Lock("NoChatFade", reason) -- Disable chat fade
Lock("RecentChatWindow", reason) -- Recent chat window
end
-- Disable items that conflict with ElvUI
if LeaPlusLC.ElvUI then
local E = LeaPlusLC.ElvUI
if E and E.private then
local reason = L["Cannot be used with ElvUI"]
-- Chat
if E.private.chat.enable then
Lock("UseEasyChatResizing", reason, "Chat") -- Use easy resizing
Lock("NoCombatLogTab", reason, "Chat") -- Hide the combat log
Lock("NoChatButtons", reason, "Chat") -- Hide chat buttons
Lock("NoSocialButton", reason, "Chat") -- Hide social button
Lock("UnclampChat", reason, "Chat") -- Unclamp chat frame
Lock("SetChatFontSize", reason, "Chat") -- Set chat font size
Lock("NoStickyChat", reason, "Chat") -- Disable sticky chat
Lock("UseArrowKeysInChat", reason, "Chat") -- Use arrow keys in chat
Lock("NoChatFade", reason, "Chat") -- Disable chat fade
Lock("MaxChatHstory", reason, "Chat") -- Increase chat history
Lock("RestoreChatMessages", reason, "Chat") -- Restore chat messages (E.db.chat.chatHistory)
end
-- Minimap
if E.private.general.minimap.enable then
Lock("MinimapModder", reason, "Minimap") -- Enhance minimap
end
-- UnitFrames
if E.private.unitframe.enable then
Lock("ShowRaidToggle", reason, "UnitFrames") -- Show raid button
end
-- ActionBars
if E.private.actionbar.enable then
Lock("NoClassBar", reason, "ActionBars") -- Hide stance bar
Lock("HideKeybindText", reason, "ActionBars") -- Hide keybind text
Lock("HideMacroText", reason, "ActionBars") -- Hide macro text
end
-- Bags
if E.private.bags.enable then
Lock("HideCleanupBtns", reason, "Bags") -- Hide clean-up buttons
end
-- Tooltip
if E.private.tooltip.enable then
Lock("TipModEnable", reason, "Tooltip") -- Enhance tooltip
end
-- UnitFrames: Disabled Blizzard: Player
if E.private.unitframe.disabledBlizzardFrames.player then
Lock("ShowPlayerChain", reason, "UnitFrames (Disabled Blizzard Frames Player)") -- Show player chain
Lock("NoHitIndicators", reason, "UnitFrames (Disabled Blizzard Frames Player)") -- Hide portrait numbers
Lock("NoRestedSleep", reason, "UnitFrames (Disabled Blizzard Frames Player)") -- Hide rested sleep
end
-- UnitFrames: Disabled Blizzard: Player, Target or Focus
if E.private.unitframe.disabledBlizzardFrames.player or E.private.unitframe.disabledBlizzardFrames.target or E.private.unitframe.disabledBlizzardFrames.focus then
Lock("ClassColFrames", reason, "UnitFrames (Disabled Blizzard Frames Player, Target and Focus)") -- Class-colored frames
end
-- Base
do
Lock("ManageWidgetTop", reason) -- Manage widget top
Lock("ManageControl", reason) -- Manage control
end
end
EnableAddOn("Leatrix_Plus")
end
end
-- Lock options currently not compatible with Dragonflight (LeaPlusLC.DF)
local function LockDF(option, reason)
LeaPlusLC[option] = "Off"
LeaPlusDB[option] = "Off"
LeaPlusLC:LockItem(LeaPlusCB[option], true)
if reason then
LeaPlusCB[option].tiptext = LeaPlusCB[option].tiptext .. "|n|n|cff00AAFF" .. L[reason]
end
end
-- Run other startup items
LeaPlusLC:Live()
LeaPlusLC:Isolated()
LeaPlusLC:RunOnce()
LeaPlusLC:SetDim()
end
return
end
if event == "PLAYER_LOGIN" then
LeaPlusLC:Player()
collectgarbage()
return
end
-- Save locals back to globals on logout
if event == "PLAYER_LOGOUT" then
-- Run the logout function without wipe flag
LeaPlusLC:PlayerLogout(false)
-- Automation
LeaPlusDB["AutomateQuests"] = LeaPlusLC["AutomateQuests"]
LeaPlusDB["AutoQuestShift"] = LeaPlusLC["AutoQuestShift"]
LeaPlusDB["AutoQuestRegular"] = LeaPlusLC["AutoQuestRegular"]
LeaPlusDB["AutoQuestDaily"] = LeaPlusLC["AutoQuestDaily"]
LeaPlusDB["AutoQuestWeekly"] = LeaPlusLC["AutoQuestWeekly"]
LeaPlusDB["AutoQuestCompleted"] = LeaPlusLC["AutoQuestCompleted"]
LeaPlusDB["AutoQuestKeyMenu"] = LeaPlusLC["AutoQuestKeyMenu"]
LeaPlusDB["AutomateGossip"] = LeaPlusLC["AutomateGossip"]
LeaPlusDB["AutoAcceptSummon"] = LeaPlusLC["AutoAcceptSummon"]
LeaPlusDB["AutoAcceptRes"] = LeaPlusLC["AutoAcceptRes"]
LeaPlusDB["AutoResNoCombat"] = LeaPlusLC["AutoResNoCombat"]
LeaPlusDB["AutoReleasePvP"] = LeaPlusLC["AutoReleasePvP"]
LeaPlusDB["AutoReleaseNoAlterac"] = LeaPlusLC["AutoReleaseNoAlterac"]
LeaPlusDB["AutoReleaseNoWintergsp"] = LeaPlusLC["AutoReleaseNoWintergsp"]
LeaPlusDB["AutoReleaseNoTolBarad"] = LeaPlusLC["AutoReleaseNoTolBarad"]
LeaPlusDB["AutoReleaseNoAshran"] = LeaPlusLC["AutoReleaseNoAshran"]
LeaPlusDB["AutoReleaseDelay"] = LeaPlusLC["AutoReleaseDelay"]
LeaPlusDB["AutoSellJunk"] = LeaPlusLC["AutoSellJunk"]
LeaPlusDB["AutoSellShowSummary"] = LeaPlusLC["AutoSellShowSummary"]
LeaPlusDB["AutoSellNoKeeperTahult"] = LeaPlusLC["AutoSellNoKeeperTahult"]
LeaPlusDB["AutoSellExcludeMyChar"] = LeaPlusLC["AutoSellExcludeMyChar"]
LeaPlusDB["AutoSellExcludeMyAlts"] = LeaPlusLC["AutoSellExcludeMyAlts"]
LeaPlusDB["AutoSellNoGreyGear"] = LeaPlusLC["AutoSellNoGreyGear"]
LeaPlusDB["AutoSellExcludeList"] = LeaPlusLC["AutoSellExcludeList"]
LeaPlusDB["AutoRepairGear"] = LeaPlusLC["AutoRepairGear"]
LeaPlusDB["AutoRepairGuildFunds"] = LeaPlusLC["AutoRepairGuildFunds"]
LeaPlusDB["AutoRepairShowSummary"] = LeaPlusLC["AutoRepairShowSummary"]
-- Social
LeaPlusDB["NoDuelRequests"] = LeaPlusLC["NoDuelRequests"]
LeaPlusDB["NoPetDuels"] = LeaPlusLC["NoPetDuels"]
LeaPlusDB["NoPartyInvites"] = LeaPlusLC["NoPartyInvites"]
LeaPlusDB["NoFriendRequests"] = LeaPlusLC["NoFriendRequests"]
LeaPlusDB["NoSharedQuests"] = LeaPlusLC["NoSharedQuests"]
LeaPlusDB["AcceptPartyFriends"] = LeaPlusLC["AcceptPartyFriends"]
LeaPlusDB["SyncFromFriends"] = LeaPlusLC["SyncFromFriends"]
LeaPlusDB["AutoConfirmRole"] = LeaPlusLC["AutoConfirmRole"]
LeaPlusDB["InviteFromWhisper"] = LeaPlusLC["InviteFromWhisper"]
LeaPlusDB["InviteFriendsOnly"] = LeaPlusLC["InviteFriendsOnly"]
LeaPlusDB["InvKey"] = LeaPlusLC["InvKey"]
LeaPlusDB["FriendlyCommunities"] = LeaPlusLC["FriendlyCommunities"]
LeaPlusDB["FriendlyGuild"] = LeaPlusLC["FriendlyGuild"]
-- Chat
LeaPlusDB["UseEasyChatResizing"] = LeaPlusLC["UseEasyChatResizing"]
LeaPlusDB["NoCombatLogTab"] = LeaPlusLC["NoCombatLogTab"]
LeaPlusDB["NoChatButtons"] = LeaPlusLC["NoChatButtons"]
LeaPlusDB["ShowVoiceButtons"] = LeaPlusLC["ShowVoiceButtons"]
LeaPlusDB["ShowChatMenuButton"] = LeaPlusLC["ShowChatMenuButton"]
LeaPlusDB["NoSocialButton"] = LeaPlusLC["NoSocialButton"]
LeaPlusDB["UnclampChat"] = LeaPlusLC["UnclampChat"]
LeaPlusDB["MoveChatEditBoxToTop"] = LeaPlusLC["MoveChatEditBoxToTop"]
LeaPlusDB["SetChatFontSize"] = LeaPlusLC["SetChatFontSize"]
LeaPlusDB["LeaPlusChatFontSize"] = LeaPlusLC["LeaPlusChatFontSize"]
LeaPlusDB["NoStickyChat"] = LeaPlusLC["NoStickyChat"]
LeaPlusDB["UseArrowKeysInChat"] = LeaPlusLC["UseArrowKeysInChat"]
LeaPlusDB["NoChatFade"] = LeaPlusLC["NoChatFade"]
LeaPlusDB["UnivGroupColor"] = LeaPlusLC["UnivGroupColor"]
LeaPlusDB["RecentChatWindow"] = LeaPlusLC["RecentChatWindow"]
LeaPlusDB["RecentChatSize"] = LeaPlusLC["RecentChatSize"]
LeaPlusDB["MaxChatHstory"] = LeaPlusLC["MaxChatHstory"]
LeaPlusDB["FilterChatMessages"] = LeaPlusLC["FilterChatMessages"]
LeaPlusDB["BlockSpellLinks"] = LeaPlusLC["BlockSpellLinks"]
LeaPlusDB["BlockDrunkenSpam"] = LeaPlusLC["BlockDrunkenSpam"]
LeaPlusDB["BlockDuelSpam"] = LeaPlusLC["BlockDuelSpam"]
LeaPlusDB["RestoreChatMessages"] = LeaPlusLC["RestoreChatMessages"]
-- Text
LeaPlusDB["HideErrorMessages"] = LeaPlusLC["HideErrorMessages"]
LeaPlusDB["NoHitIndicators"] = LeaPlusLC["NoHitIndicators"]
LeaPlusDB["HideZoneText"] = LeaPlusLC["HideZoneText"]
LeaPlusDB["HideKeybindText"] = LeaPlusLC["HideKeybindText"]
LeaPlusDB["HideMacroText"] = LeaPlusLC["HideMacroText"]
LeaPlusDB["MailFontChange"] = LeaPlusLC["MailFontChange"]
LeaPlusDB["LeaPlusMailFontSize"] = LeaPlusLC["LeaPlusMailFontSize"]
LeaPlusDB["QuestFontChange"] = LeaPlusLC["QuestFontChange"]
LeaPlusDB["LeaPlusQuestFontSize"] = LeaPlusLC["LeaPlusQuestFontSize"]
-- Interface
LeaPlusDB["MinimapModder"] = LeaPlusLC["MinimapModder"]
LeaPlusDB["SquareMinimap"] = LeaPlusLC["SquareMinimap"]
LeaPlusDB["ShowWhoPinged"] = LeaPlusLC["ShowWhoPinged"]
LeaPlusDB["HideMiniAddonMenu"] = LeaPlusLC["HideMiniAddonMenu"]
LeaPlusDB["UnclampMinimap"] = LeaPlusLC["UnclampMinimap"]
LeaPlusDB["CombineAddonButtons"] = LeaPlusLC["CombineAddonButtons"]
LeaPlusDB["MiniExcludeList"] = LeaPlusLC["MiniExcludeList"]
LeaPlusDB["HideMiniAddonButtons"] = LeaPlusLC["HideMiniAddonButtons"]
LeaPlusDB["MiniClusterScale"] = LeaPlusLC["MiniClusterScale"]
LeaPlusDB["MinimapNoScale"] = LeaPlusLC["MinimapNoScale"]
LeaPlusDB["MinimapA"] = LeaPlusLC["MinimapA"]
LeaPlusDB["MinimapR"] = LeaPlusLC["MinimapR"]
LeaPlusDB["MinimapX"] = LeaPlusLC["MinimapX"]
LeaPlusDB["MinimapY"] = LeaPlusLC["MinimapY"]
LeaPlusDB["TipModEnable"] = LeaPlusLC["TipModEnable"]
LeaPlusDB["TipShowRank"] = LeaPlusLC["TipShowRank"]
LeaPlusDB["TipShowOtherRank"] = LeaPlusLC["TipShowOtherRank"]
LeaPlusDB["TipShowTarget"] = LeaPlusLC["TipShowTarget"]
--LeaPlusDB["TipShowMythic"] = LeaPlusLC["TipShowMythic"]
LeaPlusDB["TipBackSimple"] = LeaPlusLC["TipBackSimple"]
LeaPlusDB["TipHideInCombat"] = LeaPlusLC["TipHideInCombat"]
LeaPlusDB["TipHideShiftOverride"] = LeaPlusLC["TipHideShiftOverride"]
LeaPlusDB["TipNoHealthBar"] = LeaPlusLC["TipNoHealthBar"]
LeaPlusDB["LeaPlusTipSize"] = LeaPlusLC["LeaPlusTipSize"]
LeaPlusDB["TooltipAnchorMenu"] = LeaPlusLC["TooltipAnchorMenu"]
LeaPlusDB["TipCursorX"] = LeaPlusLC["TipCursorX"]
LeaPlusDB["TipCursorY"] = LeaPlusLC["TipCursorY"]
LeaPlusDB["EnhanceDressup"] = LeaPlusLC["EnhanceDressup"]
LeaPlusDB["DressupItemButtons"] = LeaPlusLC["DressupItemButtons"]
LeaPlusDB["DressupAnimControl"] = LeaPlusLC["DressupAnimControl"]
LeaPlusDB["DressupWiderPreview"] = LeaPlusLC["DressupWiderPreview"]
LeaPlusDB["DressupMoreZoomOut"] = LeaPlusLC["DressupMoreZoomOut"]
LeaPlusDB["DressupTransmogAnim"] = LeaPlusLC["DressupTransmogAnim"]
LeaPlusDB["DressupFasterZoom"] = LeaPlusLC["DressupFasterZoom"]
LeaPlusDB["ShowVolume"] = LeaPlusLC["ShowVolume"]
LeaPlusDB["ShowVolumeInFrame"] = LeaPlusLC["ShowVolumeInFrame"]
LeaPlusDB["ShowCooldowns"] = LeaPlusLC["ShowCooldowns"]
LeaPlusDB["ShowCooldownID"] = LeaPlusLC["ShowCooldownID"]
LeaPlusDB["NoCooldownDuration"] = LeaPlusLC["NoCooldownDuration"]
LeaPlusDB["CooldownsOnPlayer"] = LeaPlusLC["CooldownsOnPlayer"]
LeaPlusDB["DurabilityStatus"] = LeaPlusLC["DurabilityStatus"]
LeaPlusDB["ShowPetSaveBtn"] = LeaPlusLC["ShowPetSaveBtn"]
LeaPlusDB["ShowRaidToggle"] = LeaPlusLC["ShowRaidToggle"]
LeaPlusDB["ShowTrainAllButton"] = LeaPlusLC["ShowTrainAllButton"]
LeaPlusDB["ShowBorders"] = LeaPlusLC["ShowBorders"]
LeaPlusDB["BordersTop"] = LeaPlusLC["BordersTop"]
LeaPlusDB["BordersBottom"] = LeaPlusLC["BordersBottom"]
LeaPlusDB["BordersLeft"] = LeaPlusLC["BordersLeft"]
LeaPlusDB["BordersRight"] = LeaPlusLC["BordersRight"]
LeaPlusDB["BordersAlpha"] = LeaPlusLC["BordersAlpha"]
LeaPlusDB["ShowPlayerChain"] = LeaPlusLC["ShowPlayerChain"]
LeaPlusDB["PlayerChainMenu"] = LeaPlusLC["PlayerChainMenu"]
LeaPlusDB["ShowReadyTimer"] = LeaPlusLC["ShowReadyTimer"]
LeaPlusDB["ShowWowheadLinks"] = LeaPlusLC["ShowWowheadLinks"]
LeaPlusDB["WowheadLinkComments"] = LeaPlusLC["WowheadLinkComments"]
-- Frames
LeaPlusDB["ManageWidgetTop"] = LeaPlusLC["ManageWidgetTop"]
LeaPlusDB["WidgetTopA"] = LeaPlusLC["WidgetTopA"]
LeaPlusDB["WidgetTopR"] = LeaPlusLC["WidgetTopR"]
LeaPlusDB["WidgetTopX"] = LeaPlusLC["WidgetTopX"]
LeaPlusDB["WidgetTopY"] = LeaPlusLC["WidgetTopY"]
LeaPlusDB["WidgetTopScale"] = LeaPlusLC["WidgetTopScale"]
LeaPlusDB["ManageControl"] = LeaPlusLC["ManageControl"]
LeaPlusDB["ControlA"] = LeaPlusLC["ControlA"]
LeaPlusDB["ControlR"] = LeaPlusLC["ControlR"]
LeaPlusDB["ControlX"] = LeaPlusLC["ControlX"]
LeaPlusDB["ControlY"] = LeaPlusLC["ControlY"]
LeaPlusDB["ControlScale"] = LeaPlusLC["ControlScale"]
LeaPlusDB["ClassColFrames"] = LeaPlusLC["ClassColFrames"]
LeaPlusDB["ClassColPlayer"] = LeaPlusLC["ClassColPlayer"]
LeaPlusDB["ClassColTarget"] = LeaPlusLC["ClassColTarget"]
LeaPlusDB["NoAlerts"] = LeaPlusLC["NoAlerts"]
LeaPlusDB["HideBodyguard"] = LeaPlusLC["HideBodyguard"]
LeaPlusDB["HideTalkingFrame"] = LeaPlusLC["HideTalkingFrame"]
LeaPlusDB["HideCleanupBtns"] = LeaPlusLC["HideCleanupBtns"]
LeaPlusDB["HideBossBanner"] = LeaPlusLC["HideBossBanner"]
LeaPlusDB["HideEventToasts"] = LeaPlusLC["HideEventToasts"]
LeaPlusDB["NoClassBar"] = LeaPlusLC["NoClassBar"]
LeaPlusDB["NoCommandBar"] = LeaPlusLC["NoCommandBar"]
LeaPlusDB["NoRestedSleep"] = LeaPlusLC["NoRestedSleep"]
-- System
LeaPlusDB["NoScreenGlow"] = LeaPlusLC["NoScreenGlow"]
LeaPlusDB["NoScreenEffects"] = LeaPlusLC["NoScreenEffects"]
LeaPlusDB["SetWeatherDensity"] = LeaPlusLC["SetWeatherDensity"]
LeaPlusDB["WeatherLevel"] = LeaPlusLC["WeatherLevel"]
LeaPlusDB["MaxCameraZoom"] = LeaPlusLC["MaxCameraZoom"]
LeaPlusDB["NoRestedEmotes"] = LeaPlusLC["NoRestedEmotes"]
LeaPlusDB["MuteGameSounds"] = LeaPlusLC["MuteGameSounds"]
LeaPlusDB["MuteMountSounds"] = LeaPlusLC["MuteMountSounds"]
LeaPlusDB["MuteCustomSounds"] = LeaPlusLC["MuteCustomSounds"]
LeaPlusDB["MuteCustomList"] = LeaPlusLC["MuteCustomList"]
LeaPlusDB["NoPetAutomation"] = LeaPlusLC["NoPetAutomation"]
LeaPlusDB["CharAddonList"] = LeaPlusLC["CharAddonList"]
LeaPlusDB["NoRaidRestrictions"] = LeaPlusLC["NoRaidRestrictions"]
LeaPlusDB["NoConfirmLoot"] = LeaPlusLC["NoConfirmLoot"]
LeaPlusDB["FasterLooting"] = LeaPlusLC["FasterLooting"]
LeaPlusDB["LeaPlusFasterLootDelay"] = LeaPlusLC["LeaPlusFasterLootDelay"]
LeaPlusDB["FasterMovieSkip"] = LeaPlusLC["FasterMovieSkip"]
LeaPlusDB["CombatPlates"] = LeaPlusLC["CombatPlates"]
LeaPlusDB["EasyItemDestroy"] = LeaPlusLC["EasyItemDestroy"]
LeaPlusDB["LockoutSharing"] = LeaPlusLC["LockoutSharing"]
LeaPlusDB["NoTransforms"] = LeaPlusLC["NoTransforms"]
-- Settings
LeaPlusDB["ShowMinimapIcon"] = LeaPlusLC["ShowMinimapIcon"]
LeaPlusDB["PlusPanelScale"] = LeaPlusLC["PlusPanelScale"]
LeaPlusDB["PlusPanelAlpha"] = LeaPlusLC["PlusPanelAlpha"]
-- Panel position
LeaPlusDB["MainPanelA"] = LeaPlusLC["MainPanelA"]
LeaPlusDB["MainPanelR"] = LeaPlusLC["MainPanelR"]
LeaPlusDB["MainPanelX"] = LeaPlusLC["MainPanelX"]
LeaPlusDB["MainPanelY"] = LeaPlusLC["MainPanelY"]
-- Start page
LeaPlusDB["LeaStartPage"] = LeaPlusLC["LeaStartPage"]
-- Mute game sounds (LeaPlusLC["MuteGameSounds"])
for k, v in pairs(LeaPlusLC["muteTable"]) do
LeaPlusDB[k] = LeaPlusLC[k]
end
-- Mute mount sounds (LeaPlusLC["MuteMountSounds"])
for k, v in pairs(LeaPlusLC["mountTable"]) do
LeaPlusDB[k] = LeaPlusLC[k]
end
-- Remove transforms (LeaPlusLC["NoTransforms"])
for k, v in pairs(LeaPlusLC["transTable"]) do
LeaPlusDB[k] = LeaPlusLC[k]
end
end
end
-- Register event handler
LpEvt:SetScript("OnEvent", eventHandler)
----------------------------------------------------------------------
-- L70: Player logout
----------------------------------------------------------------------
-- Player Logout
function LeaPlusLC:PlayerLogout(wipe)
----------------------------------------------------------------------
-- Restore default values for options that do not require reloads
----------------------------------------------------------------------
-- Disable screen glow (LeaPlusLC["NoScreenGlow"])
if wipe then
-- Disable screen glow (LeaPlusLC["NoScreenGlow"])
SetCVar("ffxGlow", "1")
-- Disable screen effects (LeaPlusLC["NoScreenEffects"])
SetCVar("ffxDeath", "1")
SetCVar("ffxNether", "1")
SetCVar("ffxVenari", "1")
SetCVar("ffxLingeringVenari", "1")
-- Set weather density (LeaPlusLC["SetWeatherDensity"])
SetCVar("WeatherDensity", "3")
SetCVar("RAIDweatherDensity", "3")
-- Remove raid restrictions (LeaPlusLC["NoRaidRestrictions"])
SetAllowLowLevelRaid(false)
-- Max camera zoom (LeaPlusLC["MaxCameraZoom"])
SetCVar("cameraDistanceMaxZoomFactor", 1.9)
-- Universal group color (LeaPlusLC["UnivGroupColor"])
ChangeChatColor("RAID", 1, 0.50, 0)
ChangeChatColor("RAID_LEADER", 1, 0.28, 0.04)
ChangeChatColor("INSTANCE_CHAT", 1, 0.50, 0)
ChangeChatColor("INSTANCE_CHAT_LEADER", 1, 0.28, 0.04)
-- Mute game sounds (LeaPlusLC["MuteGameSounds"])
for k, v in pairs(LeaPlusLC["muteTable"]) do
for i, e in pairs(v) do
local file, soundID = e:match("([^,]+)%#([^,]+)")
UnmuteSoundFile(soundID)
end
end
-- Mute mount sounds (LeaPlusLC["MuteMountSounds"])
for k, v in pairs(LeaPlusLC["mountTable"]) do
for i, e in pairs(v) do
local file, soundID = e:match("([^,]+)%#([^,]+)")
UnmuteSoundFile(soundID)
end
end
end
----------------------------------------------------------------------
-- Restore default values for options that require reloads
----------------------------------------------------------------------
-- Silence rested emotes
if LeaPlusDB["NoRestedEmotes"] == "On" then
if wipe or (not wipe and LeaPlusLC["NoRestedEmotes"] == "Off") then
SetCVar("Sound_EnableEmoteSounds", "1")
end
end
-- Set chat font size
if LeaPlusDB["SetChatFontSize"] == "On" and not LeaLockList["SetChatFontSize"] then
if wipe or (not wipe and LeaPlusLC["SetChatFontSize"] == "Off") then
for i = 1, 50 do
if _G["ChatFrame" .. i] then
LeaPlusLC["LeaPlusChatFontSize"] = CHAT_FRAME_DEFAULT_FONT_SIZE
FCF_SetChatWindowFontSize(self, _G["ChatFrame" .. i], CHAT_FRAME_DEFAULT_FONT_SIZE)
end
end
end
end
end
----------------------------------------------------------------------
-- Options panel functions
----------------------------------------------------------------------
-- Function to add textures to panels
function LeaPlusLC:CreateBar(name, parent, width, height, anchor, r, g, b, alp, tex)
local ft = parent:CreateTexture(nil, "BORDER")
ft:SetTexture(tex)
ft:SetSize(width, height)
ft:SetPoint(anchor)
ft:SetVertexColor(r ,g, b, alp)
if name == "MainTexture" then
ft:SetTexCoord(0.09, 1, 0, 1);
end
end
-- Create a configuration panel
function LeaPlusLC:CreatePanel(title, globref)
-- Create the panel
local Side = CreateFrame("Frame", nil, UIParent)
-- Make it a system frame
_G["LeaPlusGlobalPanel_" .. globref] = Side
table.insert(UISpecialFrames, "LeaPlusGlobalPanel_" .. globref)
-- Store it in the configuration panel table
tinsert(LeaConfigList, Side)
-- Set frame parameters
Side:Hide();
Side:SetSize(570, 370);
Side:SetClampedToScreen(true)
Side:SetClampRectInsets(500, -500, -300, 300)
Side:SetFrameStrata("FULLSCREEN_DIALOG")
-- Set the background color
Side.t = Side:CreateTexture(nil, "BACKGROUND")
Side.t:SetAllPoints()
Side.t:SetColorTexture(0.05, 0.05, 0.05, 0.9)
-- Add a close Button
Side.c = LeaPlusLC:CreateCloseButton(Side, 30, 30, "TOPRIGHT", 0, 0)
Side.c:SetScript("OnClick", function() Side:Hide() end)
-- Add reset, help and back buttons
Side.r = LeaPlusLC:CreateButton("ResetButton", Side, "Reset", "TOPLEFT", 16, -292, 0, 25, true, "Click to reset the settings on this page.")
Side.h = LeaPlusLC:CreateButton("HelpButton", Side, "Help", "TOPLEFT", 76, -292, 0, 25, true, "No help is available for this page.")
Side.b = LeaPlusLC:CreateButton("BackButton", Side, "Back to Main Menu", "TOPRIGHT", -16, -292, 0, 25, true, "Click to return to the main menu.")
-- Reposition help button so it doesn't overlap reset button
Side.h:ClearAllPoints()
Side.h:SetPoint("LEFT", Side.r, "RIGHT", 10, 0)
-- Remove the click texture from the help button
Side.h:SetPushedTextOffset(0, 0)
-- Add a reload button and syncronise it with the main panel reload button
local reloadb = LeaPlusLC:CreateButton("ConfigReload", Side, "Reload", "BOTTOMRIGHT", -16, 10, 0, 25, true, LeaPlusCB["ReloadUIButton"].tiptext)
LeaPlusLC:LockItem(reloadb,true)
reloadb:SetScript("OnClick", ReloadUI)
reloadb.f = reloadb:CreateFontString(nil, 'ARTWORK', 'GameFontNormalSmall')
reloadb.f:SetHeight(32);
reloadb.f:SetPoint('RIGHT', reloadb, 'LEFT', -10, 0)
reloadb.f:SetText(LeaPlusCB["ReloadUIButton"].f:GetText())
reloadb.f:Hide()
LeaPlusCB["ReloadUIButton"]:HookScript("OnEnable", function()
LeaPlusLC:LockItem(reloadb, false)
reloadb.f:Show()
end)
LeaPlusCB["ReloadUIButton"]:HookScript("OnDisable", function()
LeaPlusLC:LockItem(reloadb, true)
reloadb.f:Hide()
end)
-- Set textures
LeaPlusLC:CreateBar("FootTexture", Side, 570, 48, "BOTTOM", 0.5, 0.5, 0.5, 1.0, "Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated.png")
LeaPlusLC:CreateBar("MainTexture", Side, 570, 323, "TOPRIGHT", 0.7, 0.7, 0.7, 0.7, "Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated.png")
-- Allow movement
Side:EnableMouse(true)
Side:SetMovable(true)
Side:RegisterForDrag("LeftButton")
Side:SetScript("OnDragStart", Side.StartMoving)
Side:SetScript("OnDragStop", function ()
Side:StopMovingOrSizing();
Side:SetUserPlaced(false);
-- Save panel position
LeaPlusLC["MainPanelA"], void, LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"] = Side:GetPoint()
end)
-- Set panel attributes when shown
Side:SetScript("OnShow", function()
Side:ClearAllPoints()
Side:SetPoint(LeaPlusLC["MainPanelA"], UIParent, LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"])
Side:SetScale(LeaPlusLC["PlusPanelScale"])
Side.t:SetAlpha(1 - LeaPlusLC["PlusPanelAlpha"])
end)
-- Add title
Side.f = Side:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge')
Side.f:SetPoint('TOPLEFT', 16, -16);
Side.f:SetText(L[title])
-- Add description
Side.v = Side:CreateFontString(nil, 'ARTWORK', 'GameFontHighlightSmall')
Side.v:SetHeight(32);
Side.v:SetPoint('TOPLEFT', Side.f, 'BOTTOMLEFT', 0, -8);
Side.v:SetPoint('RIGHT', Side, -32, 0)
Side.v:SetJustifyH('LEFT'); Side.v:SetJustifyV('TOP');
Side.v:SetText(L["Configuration Panel"])
-- Prevent options panel from showing while side panel is showing
LeaPlusLC["PageF"]:HookScript("OnShow", function()
if Side:IsShown() then LeaPlusLC["PageF"]:Hide(); end
end)
-- Return the frame
return Side
end
-- Define subheadings
function LeaPlusLC:MakeTx(frame, title, x, y)
local text = frame:CreateFontString(nil, 'ARTWORK', 'GameFontNormal')
text:SetPoint("TOPLEFT", x, y)
text:SetText(L[title])
return text
end
-- Define text
function LeaPlusLC:MakeWD(frame, title, x, y)
local text = frame:CreateFontString(nil, 'ARTWORK', 'GameFontHighlight')
text:SetPoint("TOPLEFT", x, y)
text:SetText(L[title])
text:SetJustifyH"LEFT";
return text
end
-- Create a slider control (uses standard template)
function LeaPlusLC:MakeSL(frame, field, caption, low, high, step, x, y, form)
-- Create slider control
local Slider = CreateFrame("Slider", "LeaPlusGlobalSlider" .. field, frame, "OptionssliderTemplate")
LeaPlusCB[field] = Slider;
Slider:SetMinMaxValues(low, high)
Slider:SetValueStep(step)
Slider:EnableMouseWheel(true)
Slider:SetPoint('TOPLEFT', x,y)
Slider:SetWidth(100)
Slider:SetHeight(20)
Slider:SetHitRectInsets(0, 0, 0, 0);
Slider.tiptext = L[caption]
Slider:SetScript("OnEnter", LeaPlusLC.TipSee)
Slider:SetScript("OnLeave", GameTooltip_Hide)
-- Remove slider text
_G[Slider:GetName().."Low"]:SetText('');
_G[Slider:GetName().."High"]:SetText('');
-- Create slider label
Slider.f = Slider:CreateFontString(nil, 'BACKGROUND')
Slider.f:SetFontObject('GameFontHighlight')
Slider.f:SetPoint('LEFT', Slider, 'RIGHT', 12, 0)
Slider.f:SetFormattedText("%.2f", Slider:GetValue())
-- Process mousewheel scrolling
Slider:SetScript("OnMouseWheel", function(self, arg1)
if Slider:IsEnabled() then
local step = step * arg1
local value = self:GetValue()
if step > 0 then
self:SetValue(min(value + step, high))
else
self:SetValue(max(value + step, low))
end
end
end)
-- Process value changed
Slider:SetScript("OnValueChanged", function(self, value)
local value = floor((value - low) / step + 0.5) * step + low
Slider.f:SetFormattedText(form, value)
LeaPlusLC[field] = value
end)
-- Set slider value when shown
Slider:SetScript("OnShow", function(self)
self:SetValue(LeaPlusLC[field])
end)
end
-- Create a checkbox control (uses standard template)
function LeaPlusLC:MakeCB(parent, field, caption, x, y, reload, tip, tipstyle)
-- Create the checkbox
local Cbox = CreateFrame('CheckButton', nil, parent, "ChatConfigCheckButtonTemplate")
LeaPlusCB[field] = Cbox
Cbox:SetPoint("TOPLEFT",x, y)
Cbox:SetScript("OnEnter", LeaPlusLC.TipSee)
Cbox:SetScript("OnLeave", GameTooltip_Hide)
-- Add label and tooltip
Cbox.f = Cbox:CreateFontString(nil, 'ARTWORK', 'GameFontHighlight')
Cbox.f:SetPoint('LEFT', 20, 0)
if reload then
-- Checkbox requires UI reload
Cbox.f:SetText(L[caption] .. "*")
Cbox.tiptext = L[tip] .. "|n|n* " .. L["Requires UI reload."]
else
-- Checkbox does not require UI reload
Cbox.f:SetText(L[caption])
Cbox.tiptext = L[tip]
end
-- Set label parameters
Cbox.f:SetJustifyH("LEFT")
Cbox.f:SetWordWrap(false)
-- Set maximum label width
if parent:GetParent() == LeaPlusLC["PageF"] then
-- Main panel checkbox labels
if Cbox.f:GetWidth() > 152 then
Cbox.f:SetWidth(152)
LeaPlusLC["TruncatedLabelsList"] = LeaPlusLC["TruncatedLabelsList"] or {}
LeaPlusLC["TruncatedLabelsList"][Cbox.f] = L[caption]
end
-- Set checkbox click width
if Cbox.f:GetStringWidth() > 152 then
Cbox:SetHitRectInsets(0, -142, 0, 0)
else
Cbox:SetHitRectInsets(0, -Cbox.f:GetStringWidth() + 4, 0, 0)
end
else
-- Configuration panel checkbox labels (other checkboxes either have custom functions or blank labels)
if Cbox.f:GetWidth() > 302 then
Cbox.f:SetWidth(302)
LeaPlusLC["TruncatedLabelsList"] = LeaPlusLC["TruncatedLabelsList"] or {}
LeaPlusLC["TruncatedLabelsList"][Cbox.f] = L[caption]
end
-- Set checkbox click width
if Cbox.f:GetStringWidth() > 302 then
Cbox:SetHitRectInsets(0, -292, 0, 0)
else
Cbox:SetHitRectInsets(0, -Cbox.f:GetStringWidth() + 4, 0, 0)
end
end
-- Set default checkbox state and click area
Cbox:SetScript('OnShow', function(self)
if LeaPlusLC[field] == "On" then
self:SetChecked(true)
else
self:SetChecked(false)
end
end)
-- Process clicks
Cbox:SetScript('OnClick', function()
if Cbox:GetChecked() then
LeaPlusLC[field] = "On"
else
LeaPlusLC[field] = "Off"
end
LeaPlusLC:SetDim(); -- Lock invalid options
LeaPlusLC:ReloadCheck(); -- Show reload button if needed
LeaPlusLC:Live(); -- Run live code
end)
end
-- Create an editbox (uses standard template)
function LeaPlusLC:CreateEditBox(frame, parent, width, maxchars, anchor, x, y, tab, shifttab)
-- Create editbox
local eb = CreateFrame("EditBox", nil, parent, "InputBoxTemplate")
LeaPlusCB[frame] = eb
eb:SetPoint(anchor, x, y)
eb:SetWidth(width)
eb:SetHeight(24)
eb:SetFontObject("GameFontNormal")
eb:SetTextColor(1.0, 1.0, 1.0)
eb:SetAutoFocus(false)
eb:SetMaxLetters(maxchars)
eb:SetScript("OnEscapePressed", eb.ClearFocus)
eb:SetScript("OnEnterPressed", eb.ClearFocus)
-- Add editbox border and backdrop
eb.f = CreateFrame("FRAME", nil, eb, "BackdropTemplate")
eb.f:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = false, tileSize = 16, edgeSize = 16, insets = { left = 5, right = 5, top = 5, bottom = 5 }})
eb.f:SetPoint("LEFT", -6, 0)
eb.f:SetWidth(eb:GetWidth()+6)
eb.f:SetHeight(eb:GetHeight())
eb.f:SetBackdropColor(1.0, 1.0, 1.0, 0.3)
-- Move onto next editbox when tab key is pressed
eb:SetScript("OnTabPressed", function(self)
self:ClearFocus()
if IsShiftKeyDown() then
LeaPlusCB[shifttab]:SetFocus()
else
LeaPlusCB[tab]:SetFocus()
end
end)
return eb
end
-- Create a standard button (using standard button template)
function LeaPlusLC:CreateButton(name, frame, label, anchor, x, y, width, height, reskin, tip, naked)
local mbtn = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
LeaPlusCB[name] = mbtn
mbtn:SetSize(width, height)
mbtn:SetPoint(anchor, x, y)
mbtn:SetHitRectInsets(0, 0, 0, 0)
mbtn:SetText(L[label])
-- Create fontstring so the button can be sized correctly
mbtn.f = mbtn:CreateFontString(nil, 'ARTWORK', 'GameFontNormal')
mbtn.f:SetText(L[label])
if width > 0 then
-- Button should have static width
mbtn:SetWidth(width)
else
-- Button should have variable width
mbtn:SetWidth(mbtn.f:GetStringWidth() + 20)
end
-- Tooltip handler
mbtn.tiptext = L[tip]
mbtn:SetScript("OnEnter", LeaPlusLC.TipSee)
mbtn:SetScript("OnLeave", GameTooltip_Hide)
-- Texture the button
if reskin then
-- Set skinned button textures
if not naked then
mbtn:SetNormalTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus.blp")
mbtn:GetNormalTexture():SetTexCoord(0.5, 1, 0, 1)
end
mbtn:SetHighlightTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus.blp")
mbtn:GetHighlightTexture():SetTexCoord(0, 0.5, 0, 1)
-- Hide the default textures
mbtn:HookScript("OnShow", function() mbtn.Left:Hide(); mbtn.Middle:Hide(); mbtn.Right:Hide() end)
mbtn:HookScript("OnEnable", function() mbtn.Left:Hide(); mbtn.Middle:Hide(); mbtn.Right:Hide() end)
mbtn:HookScript("OnDisable", function() mbtn.Left:Hide(); mbtn.Middle:Hide(); mbtn.Right:Hide() end)
mbtn:HookScript("OnMouseDown", function() mbtn.Left:Hide(); mbtn.Middle:Hide(); mbtn.Right:Hide() end)
mbtn:HookScript("OnMouseUp", function() mbtn.Left:Hide(); mbtn.Middle:Hide(); mbtn.Right:Hide() end)
end
return mbtn
end
-- Create a dropdown menu (using custom function to avoid taint)
function LeaPlusLC:CreateDropDown(ddname, label, parent, width, anchor, x, y, items, tip)
-- Add the dropdown name to a table
tinsert(LeaDropList, ddname)
-- Populate variable with item list
LeaPlusLC[ddname.."Table"] = items
-- Create outer frame
local frame = CreateFrame("FRAME", nil, parent); frame:SetWidth(width); frame:SetHeight(42); frame:SetPoint("BOTTOMLEFT", parent, anchor, x, y);
frame.innerFrame = frame
-- Create dropdown inside outer frame
local dd = CreateFrame("Frame", nil, frame); dd:SetPoint("BOTTOMLEFT", -16, -8); dd:SetPoint("BOTTOMRIGHT", 15, -4); dd:SetHeight(32);
-- Create dropdown textures
local lt = dd:CreateTexture(nil, "ARTWORK"); lt:SetTexture("Interface\\Glues\\CharacterCreate\\CharacterCreate-LabelFrame"); lt:SetTexCoord(0, 0.1953125, 0, 1); lt:SetPoint("TOPLEFT", dd, 0, 17); lt:SetWidth(25); lt:SetHeight(64); frame.lt = lt
local rt = dd:CreateTexture(nil, "BORDER"); rt:SetTexture("Interface\\Glues\\CharacterCreate\\CharacterCreate-LabelFrame"); rt:SetTexCoord(0.8046875, 1, 0, 1); rt:SetPoint("TOPRIGHT", dd, 0, 17); rt:SetWidth(25); rt:SetHeight(64); frame.rt = rt
local mt = dd:CreateTexture(nil, "BORDER"); mt:SetTexture("Interface\\Glues\\CharacterCreate\\CharacterCreate-LabelFrame"); mt:SetTexCoord(0.1953125, 0.8046875, 0, 1); mt:SetPoint("LEFT", lt, "RIGHT"); mt:SetPoint("RIGHT", rt, "LEFT"); mt:SetHeight(64); frame.mt = mt
-- Create dropdown label
local lf = dd:CreateFontString(nil, "OVERLAY", "GameFontNormal"); lf:SetPoint("TOPLEFT", frame, 0, 0); lf:SetPoint("TOPRIGHT", frame, -5, 0); lf:SetJustifyH("LEFT"); lf:SetText(L[label])
-- Create dropdown placeholder for value (set it using OnShow)
local value = dd:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
value:SetPoint("LEFT", lt, 26, 2); value:SetPoint("RIGHT", rt, -43, 0); value:SetJustifyH("LEFT"); value:SetWordWrap(false)
dd:SetScript("OnShow", function() value:SetText(LeaPlusLC[ddname.."Table"][LeaPlusLC[ddname]]) end)
frame.placeholder = value
-- Create dropdown button (clicking it opens the dropdown list)
local dbtn = CreateFrame("Button", nil, dd)
dbtn:SetPoint("TOPRIGHT", rt, -16, -18); dbtn:SetWidth(24); dbtn:SetHeight(24)
dbtn:SetNormalTexture("Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Up"); dbtn:SetPushedTexture("Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Down"); dbtn:SetDisabledTexture("Interface\\ChatFrame\\UI-ChatIcon-ScrollDown-Disabled"); dbtn:SetHighlightTexture("Interface\\Buttons\\UI-Common-MouseHilight"); dbtn:GetHighlightTexture():SetBlendMode("ADD")
dbtn.tiptext = tip; dbtn:SetScript("OnEnter", LeaPlusLC.ShowDropTip)
dbtn:SetScript("OnLeave", GameTooltip_Hide)
frame.btn = dbtn
-- Create dropdown list
local ddlist = CreateFrame("Frame", nil, frame, "BackdropTemplate")
LeaPlusCB["ListFrame"..ddname] = ddlist
ddlist:SetPoint("TOP",0, -42)
ddlist:SetWidth(frame:GetWidth())
ddlist:SetHeight((#items * 16) + 16 + 16)
ddlist:SetBackdrop({bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background-Dark", edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = false, tileSize = 0, edgeSize = 32, insets = { left = 4, right = 4, top = 4, bottom = 4}})
ddlist:Hide()
-- Hide list if parent is closed
parent:HookScript("OnHide", function() ddlist:Hide() end)
-- Create checkmark (it marks the currently selected item)
local ddlistchk = CreateFrame("FRAME", nil, ddlist)
ddlistchk:SetHeight(16); ddlistchk:SetWidth(16);
ddlistchk.t = ddlistchk:CreateTexture(nil, "ARTWORK"); ddlistchk.t:SetAllPoints(); ddlistchk.t:SetTexture("Interface\\Common\\UI-DropDownRadioChecks"); ddlistchk.t:SetTexCoord(0, 0.5, 0.5, 1.0);
frame.check = ddlistchk
-- Create dropdown list items
for k, v in pairs(items) do
local dditem = CreateFrame("Button", nil, LeaPlusCB["ListFrame"..ddname])
LeaPlusCB["Drop"..ddname..k] = dditem;
dditem:Show();
dditem:SetWidth(ddlist:GetWidth()-22)
dditem:SetHeight(16)
dditem:SetPoint("TOPLEFT", 12, -k * 16)
dditem.f = dditem:CreateFontString(nil, 'ARTWORK', 'GameFontHighlight');
dditem.f:SetPoint('LEFT', 16, 0)
dditem.f:SetText(items[k])
dditem.f:SetWordWrap(false)
dditem.f:SetJustifyH("LEFT")
dditem.f:SetWidth(ddlist:GetWidth()-36)
dditem.t = dditem:CreateTexture(nil, "BACKGROUND")
dditem.t:SetAllPoints()
dditem.t:SetColorTexture(0.3, 0.3, 0.00, 0.8)
dditem.t:Hide();
dditem:SetScript("OnEnter", function() dditem.t:Show() end)
dditem:SetScript("OnLeave", function() dditem.t:Hide() end)
dditem:SetScript("OnClick", function()
LeaPlusLC[ddname] = k
value:SetText(LeaPlusLC[ddname.."Table"][k])
ddlist:Hide(); -- Must be last in click handler as other functions hook it
end)
-- Show list when button is clicked
dbtn:SetScript("OnClick", function()
-- Show the dropdown
if ddlist:IsShown() then ddlist:Hide() else
ddlist:Show();
ddlistchk:SetPoint("TOPLEFT",10,select(5,LeaPlusCB["Drop"..ddname..LeaPlusLC[ddname]]:GetPoint()))
ddlistchk:Show();
end;
-- Hide all other dropdowns except the one we're dealing with
for void,v in pairs(LeaDropList) do
if v ~= ddname then
LeaPlusCB["ListFrame"..v]:Hide();
end
end
end)
-- Expand the clickable area of the button to include the entire menu width
dbtn:SetHitRectInsets(-width+28, 0, 0, 0);
end
return frame
end
----------------------------------------------------------------------
-- Create main options panel frame
----------------------------------------------------------------------
function LeaPlusLC:CreateMainPanel()
-- Create the panel
local PageF = CreateFrame("Frame", nil, UIParent);
-- Make it a system frame
_G["LeaPlusGlobalPanel"] = PageF
table.insert(UISpecialFrames, "LeaPlusGlobalPanel")
-- Set frame parameters
LeaPlusLC["PageF"] = PageF
PageF:SetSize(570,370)
PageF:Hide();
PageF:SetFrameStrata("FULLSCREEN_DIALOG")
PageF:SetClampedToScreen(true)
PageF:SetClampRectInsets(500, -500, -300, 300)
PageF:EnableMouse(true)
PageF:SetMovable(true)
PageF:RegisterForDrag("LeftButton")
PageF:SetScript("OnDragStart", PageF.StartMoving)
PageF:SetScript("OnDragStop", function ()
PageF:StopMovingOrSizing();
PageF:SetUserPlaced(false);
-- Save panel position
LeaPlusLC["MainPanelA"], void, LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"] = PageF:GetPoint()
end)
-- Add background color
PageF.t = PageF:CreateTexture(nil, "BACKGROUND")
PageF.t:SetAllPoints()
PageF.t:SetColorTexture(0.05, 0.05, 0.05, 0.9)
-- Add textures
LeaPlusLC:CreateBar("FootTexture", PageF, 570, 48, "BOTTOM", 0.5, 0.5, 0.5, 1.0, "Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated.png")
LeaPlusLC:CreateBar("MainTexture", PageF, 440, 323, "TOPRIGHT", 0.7, 0.7, 0.7, 0.7, "Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated.png")
LeaPlusLC:CreateBar("MenuTexture", PageF, 130, 323, "TOPLEFT", 0.7, 0.7, 0.7, 0.7, "Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated.png")
-- Set panel position when shown
PageF:SetScript("OnShow", function()
PageF:ClearAllPoints()
PageF:SetPoint(LeaPlusLC["MainPanelA"], UIParent, LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"])
end)
-- Add main title (shown above menu in the corner)
PageF.mt = PageF:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge')
PageF.mt:SetPoint('TOPLEFT', 16, -16)
PageF.mt:SetText("Leatrix Plus")
-- Add version text (shown underneath main title)
PageF.v = PageF:CreateFontString(nil, 'ARTWORK', 'GameFontHighlightSmall')
PageF.v:SetHeight(32);
PageF.v:SetPoint('TOPLEFT', PageF.mt, 'BOTTOMLEFT', 0, -8);
PageF.v:SetPoint('RIGHT', PageF, -32, 0)
PageF.v:SetJustifyH('LEFT'); PageF.v:SetJustifyV('TOP');
PageF.v:SetNonSpaceWrap(true); PageF.v:SetText(L["Version"] .. " " .. LeaPlusLC["AddonVer"])
-- Add reload UI Button
local reloadb = LeaPlusLC:CreateButton("ReloadUIButton", PageF, "Reload", "BOTTOMRIGHT", -16, 10, 0, 25, true, "Your UI needs to be reloaded for some of the changes to take effect.|n|nYou don't have to click the reload button immediately but you do need to click it when you are done making changes and you want the changes to take effect.")
LeaPlusLC:LockItem(reloadb,true)
reloadb:SetScript("OnClick", ReloadUI)
reloadb.f = reloadb:CreateFontString(nil, 'ARTWORK', 'GameFontNormalSmall')
reloadb.f:SetHeight(32);
reloadb.f:SetPoint('RIGHT', reloadb, 'LEFT', -10, 0)
reloadb.f:SetText(L["Your UI needs to be reloaded."])
reloadb.f:Hide()
-- Add close Button (LeaPlusLC.DF: Using custom template)
local CloseB = LeaPlusLC:CreateCloseButton(PageF, 30, 30, "TOPRIGHT", 0, 0)
CloseB:SetScript("OnClick", LeaPlusLC.HideFrames)
-- Add web link Button
local PageFAlertButton = LeaPlusLC:CreateButton("PageFAlertButton", PageF, "You should keybind web link!", "BOTTOMLEFT", 16, 10, 0, 25, true, "You should set a keybind for the web link feature. It's very useful.|n|nOpen the key bindings window (accessible from the game menu) and click Leatrix Plus.|n|nSet a keybind for Show web link.|n|nNow when your pointer is over an item, NPC, mount, pet, spell, talent, toy or player (and more), press your keybind to get a web link.", true)
PageFAlertButton:SetPushedTextOffset(0, 0)
PageF:HookScript("OnShow", function()
if GetBindingKey("LEATRIX_PLUS_GLOBAL_WEBLINK") then PageFAlertButton:Hide() else PageFAlertButton:Show() end
end)
-- Release memory
LeaPlusLC.CreateMainPanel = nil
end
LeaPlusLC:CreateMainPanel();
----------------------------------------------------------------------
-- L80: Commands
----------------------------------------------------------------------
-- Slash command function
function LeaPlusLC:SlashFunc(str)
if str and str ~= "" then
-- Get parameters in lower case with duplicate spaces removed
local str, arg1, arg2, arg3 = strsplit(" ", string.lower(str:gsub("%s+", " ")))
-- Traverse parameters
if str == "wipe" then
-- Wipe settings
LeaPlusLC:PlayerLogout(true) -- Run logout function with wipe parameter
wipe(LeaPlusDB)
LpEvt:UnregisterAllEvents(); -- Don't save any settings
ReloadUI();
elseif str == "nosave" then
-- Prevent Leatrix Plus from overwriting LeaPlusDB at next logout
LpEvt:UnregisterEvent("PLAYER_LOGOUT")
LeaPlusLC:Print("Leatrix Plus will not overwrite LeaPlusDB at next logout.")
return
elseif str == "reset" then
-- Reset panel positions
LeaPlusLC["MainPanelA"], LeaPlusLC["MainPanelR"], LeaPlusLC["MainPanelX"], LeaPlusLC["MainPanelY"] = "CENTER", "CENTER", 0, 0
LeaPlusLC["PlusPanelScale"] = 1
LeaPlusLC["PlusPanelAlpha"] = 0
LeaPlusLC["PageF"]:SetScale(1)
LeaPlusLC["PageF"].t:SetAlpha(1 - LeaPlusLC["PlusPanelAlpha"])
-- Refresh panels
LeaPlusLC["PageF"]:ClearAllPoints()
LeaPlusLC["PageF"]:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
-- Reset currently showing configuration panel
for k, v in pairs(LeaConfigList) do
if v:IsShown() then
v:ClearAllPoints()
v:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
v:SetScale(1)
v.t:SetAlpha(1 - LeaPlusLC["PlusPanelAlpha"])
end
end
-- Refresh Leatrix Plus settings menu only
if LeaPlusLC["Page8"]:IsShown() then
LeaPlusLC["Page8"]:Hide()
LeaPlusLC["Page8"]:Show()
end
elseif str == "hk" then
-- Print lifetime honorable kills
local chagmsg = L["Lifetime honorable kills"]
local ltphk = GetStatistic(588)
if ltphk == "--" then ltphk = "0" end
chagmsg = chagmsg .. ": |cffffffff" .. ltphk
LeaPlusLC:Print(chagmsg)
return
elseif str == "taint" then
-- Set taint log level
if arg1 and arg1 ~= "" then
arg1 = tonumber(arg1)
if arg1 and arg1 >= 0 and arg1 <= 2 then
if arg1 == 0 then
-- Disable taint log
ConsoleExec("taintLog 0")
LeaPlusLC:Print("Taint level: Disabled (0).")
elseif arg1 == 1 then
-- Basic taint log
ConsoleExec("taintLog 1")
LeaPlusLC:Print("Taint level: Basic (1).")
elseif arg1 == 2 then
-- Full taint log
ConsoleExec("taintLog 2")
LeaPlusLC:Print("Taint level: Full (2).")
end
else
LeaPlusLC:Print("Invalid taint level.")
end
else
-- Show current taint level
local taintCurrent = GetCVar("taintLog")
if taintCurrent == "0" then
LeaPlusLC:Print("Taint level: Disabled (0).")
elseif taintCurrent == "1" then
LeaPlusLC:Print("Taint level: Basic (1).")
elseif taintCurrent == "2" then
LeaPlusLC:Print("Taint level: Full (2).")
end
end
return
elseif str == "quest" then
-- Show quest completed status
if arg1 and arg1 ~= "" then
if tonumber(arg1) and tonumber(arg1) < 999999999 then
LeaPlusLC.LoadQuestEventFrame = LeaPlusLC.LoadQuestEventFrame or CreateFrame("FRAME")
LeaPlusLC.LoadQuestEventFrame:SetScript("OnEvent", function(self, event, questID, success)
if tonumber(questID) == tonumber(arg1) then
LeaPlusLC.LoadQuestEventFrame:UnregisterEvent("QUEST_DATA_LOAD_RESULT")
local tempGetQuestInfo = C_QuestLog.GetTitleForQuestID
local questCompleted = C_QuestLog.IsQuestFlaggedCompleted(arg1)
local questTitle = C_TaskQuest.GetQuestInfoByQuestID(arg1) or tempGetQuestInfo(arg1)
if questTitle then
if success then
if questCompleted then
LeaPlusLC:Print(questTitle .. " (" .. arg1 .. "):" .. "|cffffffff " .. L["Completed."])
else
LeaPlusLC:Print(questTitle .. " (" .. arg1 .. "):" .. "|cffffffff " .. L["Not completed."])
end
else
LeaPlusLC:Print(questTitle .. " (" .. arg1 .. "):" .. "|cffffffff " .. L["Error retrieving quest."])
end
else
LeaPlusLC:Print("Invalid quest ID.")
return
end
end
end)
LeaPlusLC.LoadQuestEventFrame:RegisterEvent("QUEST_DATA_LOAD_RESULT")
C_QuestLog.RequestLoadQuestByID(arg1)
else
LeaPlusLC:Print("Invalid quest ID.")
end
else
LeaPlusLC:Print("Missing quest ID.")
end
return
elseif str == "gstaff" then
-- Buy 10 x Rough Wooden Staff from Larana Drome in Scribes' Sacellum, Dalaran, Northrend (used for testing)
local npcName = UnitName("target")
local npcGuid = UnitGUID("target") or nil
local errmsg = "Requires you to be interacting with Larana Drome. She can be found at Scribes' Sacellum, Dalaran, Northrend."
if npcName and npcGuid then
local void, void, void, void, void, npcID = strsplit("-", npcGuid)
if npcID and npcID == "28723" then
local id, ida, idb = 0, GetMerchantItemID(5), GetMerchantItemID(6)
if ida == 1515 then id = 5 elseif idb == 1515 then id = 6 end
if id > 0 then
for k = 1, 10 do
BuyMerchantItem(id)
end
end
else
LeaPlusLC:Print(errmsg)
end
else
LeaPlusLC:Print(errmsg)
end
return
elseif str == "rest" then
-- Show rested bubbles
LeaPlusLC:Print(L["Rested bubbles"] .. ": |cffffffff" .. (math.floor(20 * (GetXPExhaustion() or 0) / UnitXPMax("player") + 0.5)))
return
elseif str == "zygor" then
-- Toggle Zygor addon
LeaPlusLC:ZygorToggle()
return
elseif str == "npcid" then
-- Print NPC ID
local npcName = UnitName("target")
local npcGuid = UnitGUID("target") or nil
if npcName and npcGuid then
local void, void, void, void, void, npcID = strsplit("-", npcGuid)
if npcID then
LeaPlusLC:Print(npcName .. ": |cffffffff" .. npcID)
end
end
return
elseif str == "id" then
-- Show web link for tooltip
if not LeaPlusLC.WowheadLock then
-- Set Wowhead link prefix
if GameLocale == "deDE" then LeaPlusLC.WowheadLock = "de.wowhead.com"
elseif GameLocale == "esMX" then LeaPlusLC.WowheadLock = "es.wowhead.com"
elseif GameLocale == "esES" then LeaPlusLC.WowheadLock = "es.wowhead.com"
elseif GameLocale == "frFR" then LeaPlusLC.WowheadLock = "fr.wowhead.com"
elseif GameLocale == "itIT" then LeaPlusLC.WowheadLock = "it.wowhead.com"
elseif GameLocale == "ptBR" then LeaPlusLC.WowheadLock = "pt.wowhead.com"
elseif GameLocale == "ruRU" then LeaPlusLC.WowheadLock = "ru.wowhead.com"
elseif GameLocale == "koKR" then LeaPlusLC.WowheadLock = "ko.wowhead.com"
elseif GameLocale == "zhCN" then LeaPlusLC.WowheadLock = "cn.wowhead.com"
elseif GameLocale == "zhTW" then LeaPlusLC.WowheadLock = "cn.wowhead.com"
else LeaPlusLC.WowheadLock = "wowhead.com"
end
end
if not LeaPlusLC.BlizzardLock then
-- Set Blizzard link prefix (https://wowpedia.fandom.com/wiki/Localization) (region will be added by website automatically)
if GameLocale == "deDE" then LeaPlusLC.BlizzardLock = "https://worldofwarcraft.com/de-de/character/eu/" -- Germany
elseif GameLocale == "frFR" then LeaPlusLC.BlizzardLock = "https://worldofwarcraft.com/fr-fr/character/eu/" -- France
elseif GameLocale == "itIT" then LeaPlusLC.BlizzardLock = "https://worldofwarcraft.com/it-it/character/eu/" -- Italy
elseif GameLocale == "ruRU" then LeaPlusLC.BlizzardLock = "https://worldofwarcraft.com/ru-ru/character/eu/" -- Russia
elseif GameLocale == "koKR" then LeaPlusLC.BlizzardLock = "https://worldofwarcraft.com/ko-kr/character/kr/" -- Korea
elseif GameLocale == "zhTW" then LeaPlusLC.BlizzardLock = "https://worldofwarcraft.com/zh-tw/character/tw/" -- Tiawan
elseif GameLocale == "esES" and GetCurrentRegion() == 1 then LeaPlusLC.BlizzardLock = "https://worldofwarcraft.com/es-es/character/us/" -- Spain (esES connected to US)
elseif GameLocale == "esES" and GetCurrentRegion() == 3 then LeaPlusLC.BlizzardLock = "https://worldofwarcraft.com/es-es/character/eu/" -- Spain (esES connected to EU)
elseif GameLocale == "esMX" and GetCurrentRegion() == 1 then LeaPlusLC.BlizzardLock = "https://worldofwarcraft.com/es-mx/character/us/" -- Mexico (esMX connected to US)
elseif GameLocale == "esMX" and GetCurrentRegion() == 3 then LeaPlusLC.BlizzardLock = "https://worldofwarcraft.com/es-mx/character/eu/" -- Spain (esMX connected to EU)
elseif GameLocale == "ptBR" and GetCurrentRegion() == 1 then LeaPlusLC.BlizzardLock = "https://worldofwarcraft.com/pt-br/character/us/" -- Brazil (ptBR connected to US)
elseif GameLocale == "ptBR" and GetCurrentRegion() == 3 then LeaPlusLC.BlizzardLock = "https://worldofwarcraft.com/pt-br/character/eu/" -- Portugal (ptBR connected to US)
elseif GameLocale == "enUS" and GetCurrentRegion() == 3 then LeaPlusLC.BlizzardLock = "https://worldofwarcraft.com/en-gb/character/eu/" -- UK (enUS connected to Europe)
else LeaPlusLC.BlizzardLock = "https://worldofwarcraft.com/en-us/character/us/" -- US (default)
end
end
-- Store frame under mouse
local mouseFocus = GetMouseFocus()
-- Floating battle pet tooltip (linked in chat)
if mouseFocus == FloatingBattlePetTooltip and FloatingBattlePetTooltip.Name then
local tipTitle = FloatingBattlePetTooltip.Name:GetText()
if tipTitle then
local speciesId, petGUID = C_PetJournal.FindPetIDByName(tipTitle, false)
if petGUID then
local speciesID, customName, level, xp, maxXp, displayID, isFavorite, name, icon, petType, creatureID = C_PetJournal.GetPetInfoByPetID(petGUID)
LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/npc=" .. creatureID)
LeaPlusLC.FactoryEditBox.f:SetText(L["Pet"] .. ": " .. name .. " (" .. creatureID .. ")")
return
end
end
end
-- Floating pet battle ability tooltip (linked in chat)
if FloatingPetBattleAbilityTooltip and mouseFocus == FloatingPetBattleAbilityTooltip and FloatingPetBattleAbilityTooltip.Name then
local tipTitle = FloatingPetBattleAbilityTooltip.Name:GetText()
if tipTitle then
LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/search?q=" .. tipTitle, false)
LeaPlusLC.FactoryEditBox.f:SetText("|cffff0000" .. L["Pet Ability"] .. ": " .. tipTitle)
return
end
end
-- Pet journal ability tooltip (tooltip in pet journal)
if PetJournalPrimaryAbilityTooltip and PetJournalPrimaryAbilityTooltip:IsShown() and PetJournalPrimaryAbilityTooltip.Name then
local tipTitle = PetJournalPrimaryAbilityTooltip.Name:GetText()
if tipTitle then
LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/search?q=" .. tipTitle, false)
LeaPlusLC.FactoryEditBox.f:SetText("|cffff0000" .. L["Pet Ability"] .. ": " .. tipTitle)
return
end
end
-- ItemRefTooltip or GameTooltip
local tooltip
if mouseFocus == ItemRefTooltip then tooltip = ItemRefTooltip else tooltip = GameTooltip end
-- Process tooltip
if tooltip:IsShown() then
-- Item
local void, itemLink = tooltip:GetItem()
if itemLink then
local itemID = GetItemInfoFromHyperlink(itemLink)
if itemID then
LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/item=" .. itemID, false)
LeaPlusLC.FactoryEditBox.f:SetText(L["Item"] .. ": " .. itemLink .. " (" .. itemID .. ")")
return
end
end
-- Spell
local name, spellID = tooltip:GetSpell()
if name and spellID then
LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/spell=" .. spellID, false)
LeaPlusLC.FactoryEditBox.f:SetText(L["Spell"] .. ": " .. name .. " (" .. spellID .. ")")
return
end
-- NPC
local npcName = UnitName("mouseover")
local npcGuid = UnitGUID("mouseover") or nil
if npcName and npcGuid then
local void, void, void, void, void, npcID = strsplit("-", npcGuid)
if npcID then
LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/npc=" .. npcID, false)
LeaPlusLC.FactoryEditBox.f:SetText(L["NPC"] .. ": " .. npcName .. " (" .. npcID .. ")")
return
end
end
-- Buffs and debuffs
for i = 1, BUFF_MAX_DISPLAY do
if _G["BuffButton" .. i] and mouseFocus == _G["BuffButton" .. i] then
local spellName, void, void, void, void, void, void, void, void, spellID = UnitBuff("player", i)
if spellName and spellID then
LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/spell=" .. spellID, false)
LeaPlusLC.FactoryEditBox.f:SetText(L["Spell"] .. ": " .. spellName .. " (" .. spellID .. ")")
end
return
end
end
for i = 1, DEBUFF_MAX_DISPLAY do
if _G["DebuffButton" .. i] and mouseFocus == _G["DebuffButton" .. i] then
local spellName, void, void, void, void, void, void, void, void, spellID = UnitDebuff("player", i)
if spellName and spellID then
LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/spell=" .. spellID, false)
LeaPlusLC.FactoryEditBox.f:SetText(L["Spell"] .. ": " .. spellName .. " (" .. spellID .. ")")
end
return
end
end
-- Pet, player and unknown tooltip (this must be last)
local tipTitle = GameTooltipTextLeft1:GetText()
if tipTitle then
local speciesId, petGUID = C_PetJournal.FindPetIDByName(GameTooltipTextLeft1:GetText(), false)
if petGUID then
-- Pet
local speciesID, customName, level, xp, maxXp, displayID, isFavorite, name, icon, petType, creatureID = C_PetJournal.GetPetInfoByPetID(petGUID)
LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/npc=" .. creatureID)
LeaPlusLC.FactoryEditBox.f:SetText(L["Pet"] .. ": " .. name .. " (" .. creatureID .. ")")
return
else
-- Show armory link for players outside zhCN
local unitFocus
if mouseFocus == WorldFrame then unitFocus = "mouseover" else unitFocus = select(2, GameTooltip:GetUnit()) end
if unitFocus and UnitIsPlayer(unitFocus) then
-- Show armory link
local name, realm = UnitName(unitFocus)
local class = UnitClassBase(unitFocus)
if class then
local color = RAID_CLASS_COLORS[class]
local escapeColor = string.format("|cff%02x%02x%02x", color.r*255, color.g*255, color.b*255)
if not realm then realm = GetNormalizedRealmName() end
if name and realm then
-- Debug
-- local realm = "StrandoftheAncients" -- Debug
-- Chinese armory not available
if GameLocale == "zhCN" then return end
-- Fix non-standard names
if realm == "Area52" then realm = "Area-52"
elseif realm == "AzjolNerub" then realm = "AzjolNerub"
elseif realm == "Chantséternels" then realm = "Chants-Éternels"
elseif realm == "ConfrérieduThorium" then realm = "Confrérie-du-Thorium"
elseif realm == "ConseildesOmbres" then realm = "Conseil-des-Ombres"
elseif realm == "CultedelaRivenoire" then realm = "Culte-de-la-Rive-noire"
elseif realm == "DerRatvonDalaran" then realm = "Der-Rat-von-Dalaran"
elseif realm == "DieewigeWacht" then realm = "Die-ewige-Wacht"
elseif realm == "FestungderStürme" then realm = "Festung-der-Stürme"
elseif realm == "KultderVerdammten" then realm = "Kult-der-Verdammten"
elseif realm == "LaCroisadeécarlate" then realm = "La-Croisade-Écarlate"
elseif realm == "MarécagedeZangar" then realm = "Marécage-de-Zangar"
elseif realm == "Pozzodell'Eternità" then realm = "Pozzo-dellEternità"
elseif realm == "Templenoir" then realm = "Temple-noir"
elseif realm == "VanCleef" then realm = "Vancleef"
elseif realm == "ZirkeldesCenarius" then realm = "Zirkel-des-Cenarius"
-- Fix Russian names
elseif realm == "СвежевательДуш" then realm = "Свежеватель-Душ"
elseif realm == "СтражСмерти" then realm = "Страж-Смерти"
elseif realm == "Ревущийфьорд" then realm = "Ревущий-фьорд"
elseif realm == "ТкачСмерти" then realm = "Ткач-Смерти"
elseif realm == "Борейскаятундра" then realm = "Борейская-тундра"
elseif realm == "Ясеневыйлес" then realm = "Ясеневый-лес"
elseif realm == "ПиратскаяБухта" then realm = "Пиратская-Бухта"
elseif realm == "ВечнаяПесня" then realm = "Вечная-Песня"
elseif realm == "ЧерныйШрам" then realm = "Черный-Шрам"
elseif realm == "ВестникРока" then realm = "Вестник-Рока"
-- Fix all other names
else
-- Realm name is not one of the above so fix it
realm = realm:gsub("(%l[of])(%u)", "-%1-%2") -- Add hyphen after of if capital follows of (CavernsofTime becomes Cavernsof-Time)
realm = realm:gsub("(ofthe)", "-of-the-") -- Replace ofthe with -of-the- (ShrineoftheDormantFlame becomes Shrine-of-the-DormantFlame)
realm = realm:gsub("(%l)(%u)", "%1 %2") -- Add space before capital letters (CavernsofTime becomes Cavernsof Time)
realm = realm:gsub(" ", "-") -- Replace space with hyphen (Cavernsof Time becomes Cavernsof-Time)
realm = realm:gsub("'", "") -- Remove apostrophe
realm = realm:gsub("[(]", "-") -- Replace opening parentheses with hyphen
realm = realm:gsub("[)]", "") -- Remove closing parentheses
end
-- print(realm) -- Debug
LeaPlusLC:ShowSystemEditBox(LeaPlusLC.BlizzardLock .. strlower(realm) .. "/" .. strlower(name))
realm = realm:gsub("-", " ") -- Replace hyphen with space
LeaPlusLC.FactoryEditBox.f:SetText(escapeColor .. L["Player"] .. ": " .. name .. " (" .. realm .. ")")
return
end
end
else
-- Unknown tooltip
-- if mouseFocus ~= WorldFrame then
tipTitle = tipTitle:gsub("|c%x%x%x%x%x%x%x%x", "") -- Remove color tag
LeaPlusLC:ShowSystemEditBox("https://" .. LeaPlusLC.WowheadLock .. "/search?q=" .. tipTitle, false)
LeaPlusLC.FactoryEditBox.f:SetText("|cffff0000" .. L["Link will search Wowhead"])
return
-- end
end
end
end
end
return
elseif str == "mountid" then
-- Get mount ID by mount name
if not arg1 or arg1 == "" then LeaPlusLC:Print("Missing mount name.") return end
local mounts = C_MountJournal.GetMountIDs()
local mountSuccess = false
for i = 1, #mounts do
local creatureName, spellID, icon, active, isUsable, sourceType = C_MountJournal.GetMountInfoByID(mounts[i])
if strfind(strlower(creatureName), strlower(arg1)) then
LeaPlusLC:Print(creatureName .. ": |cffffffff" .. mounts[i] .. "|r")
mountSuccess = true
end
end
if not mountSuccess then LeaPlusLC:Print("Mount not found.") end
return
elseif str == "petid" then
-- Get pet ID by pet name
if not arg1 or arg1 == "" then LeaPlusLC:Print("Missing pet name.") return end
local numPets = C_PetJournal.GetNumPets()
local petSuccess = false
for i = 1, numPets do
local petID, speciesID, isOwned, customName, level, favorite, isRevoked, name, icon, petType, creatureID, sourceText, description, isWildPet, canBattle, tradable, unique = C_PetJournal.GetPetInfoByIndex(i, false)
if strfind(strlower(name), strlower(arg1)) then
if isOwned then
LeaPlusLC:Print(name .. ": |cffffffff" .. petID .. " |cff00ff00(" .. level .. ")|r")
petSuccess = true
elseif not petSuccess then
LeaPlusLC:Print("You do not own this pet. Only owned pets can be searched.")
return
end
end
end
if not petSuccess then
LeaPlusLC:Print("Pet not found. Only owned pets that are currently showing in the journal can be searched.")
end
return
elseif str == "tooltip" then
-- Print tooltip frame name
local enumf = EnumerateFrames()
while enumf do
if (enumf:GetObjectType() == "GameTooltip" or strfind((enumf:GetName() or ""):lower(),"tip")) and enumf:IsVisible() and enumf:GetPoint() then
print(enumf:GetName())
end
enumf = EnumerateFrames(enumf)
end
collectgarbage()
return
elseif str == "soil" then
-- Enable dark soil and jelly deposit scanning
if not LeaPlusLC["DarkScriptlEnabled"] then
GameTooltip:HookScript("OnUpdate", function()
local a = _G["GameTooltipTextLeft1"]:GetText() or ""
if a == "Dark Soil" or a == "Jelly Deposit" or a == "Gersahl Shrub" then
PlaySound(8959, "Master")
end
end)
-- Add Friendly Alpaca spawn locations to Uldum map
if TomTom then
for void, v in next, ({{15,62},{24,9},{28,49},{30,29},{39,10},{42,70},{46,48},{53,19},{55,69},{63,53},{63,14},{70,39},{76,68}}) do
TomTom:AddWaypoint(1527, v[1]/100, v[2]/100, {title = "Friendly Alpaca"})
end
end
LeaPlusLC["DarkScriptlEnabled"] = true
LeaPlusLC:Print("Dark Soil scanning activated. Reload UI to exit.")
else
LeaPlusLC:Print("Dark Soil scanning is already activated. You only need to run this once. Reload UI to exit.")
end
return
elseif str == "rsnd" then
-- Restart sound system
if LeaPlusCB["StopMusicBtn"] then LeaPlusCB["StopMusicBtn"]:Click() end
Sound_GameSystem_RestartSoundSystem()
LeaPlusLC:Print("Sound system restarted.")
return
elseif str == "event" then
-- List events (used for debug)
LeaPlusLC["DbF"] = LeaPlusLC["DbF"] or CreateFrame("FRAME")
if not LeaPlusLC["DbF"]:GetScript("OnEvent") then
LeaPlusLC:Print("Tracing started.")
LeaPlusLC["DbF"]:RegisterAllEvents()
LeaPlusLC["DbF"]:SetScript("OnEvent", function(self, event)
if event == "ACTIONBAR_UPDATE_COOLDOWN"
or event == "BAG_UPDATE_COOLDOWN"
or event == "CHAT_MSG_TRADESKILLS"
or event == "COMBAT_LOG_EVENT_UNFILTERED"
or event == "CURSOR_CHANGED"
or event == "ITEM_DATA_LOAD_RESULT"
or event == "SPELL_UPDATE_COOLDOWN"
or event == "SPELL_UPDATE_USABLE"
or event == "UNIT_POWER_FREQUENT"
or event == "UPDATE_INVENTORY_DURABILITY"
or event == "UPDATE_SHAPESHIFT_COOLDOWN"
or event == "UPDATE_UI_WIDGET"
or event == "WORLD_CURSOR_TOOLTIP_UPDATE"
then return
else
print(event)
end
end)
else
LeaPlusLC["DbF"]:UnregisterAllEvents()
LeaPlusLC["DbF"]:SetScript("OnEvent", nil)
LeaPlusLC:Print("Tracing stopped.")
end
return
elseif str == "game" then
-- Show game build
local version, build, gdate, tocversion = GetBuildInfo()
LeaPlusLC:Print(L["World of Warcraft"] .. ": |cffffffff" .. version .. "." .. build .. " (" .. gdate .. ") (" .. tocversion .. ")")
return
elseif str == "config" then
-- Show maximum camera distance
LeaPlusLC:Print(L["Camera distance"] .. ": |cffffffff" .. GetCVar("cameraDistanceMaxZoomFactor"))
-- Show screen effects
LeaPlusLC:Print(L["Shaders"] .. ": |cffffffff" .. GetCVar("ffxGlow") .. ", " .. GetCVar("ffxDeath") .. ", " .. GetCVar("ffxNether"))
-- Show particle density
LeaPlusLC:Print(L["Particle density"] .. ": |cffffffff" .. GetCVar("particleDensity"))
LeaPlusLC:Print(L["Weather density"] .. ": |cffffffff" .. GetCVar("weatherDensity"))
LeaPlusLC:Print(L["Field of view"] .. ": |cffffffff" .. GetCVar("camerafov"))
-- Show config
LeaPlusLC:Print("SynchroniseConfig: |cffffffff" .. GetCVar("synchronizeConfig"))
-- Show raid restrictions
local unRaid = GetAllowLowLevelRaid()
if unRaid and unRaid == true then
LeaPlusLC:Print("GetAllowLowLevelRaid: |cffffffff" .. "True")
else
LeaPlusLC:Print("GetAllowLowLevelRaid: |cffffffff" .. "False")
end
-- Show achievement sharing
local achhidden = AreAccountAchievementsHidden()
if achhidden then
LeaPlusLC:Print("Account achievements are hidden.")
else
LeaPlusLC:Print("Account achievements are being shared.")
end
return
elseif str == "move" then
-- Move minimap
MinimapZoneTextButton:Hide()
MinimapBorderTop:SetTexture("")
MiniMapWorldMapButton:Hide()
MinimapBackdrop:ClearAllPoints()
MinimapBackdrop:SetPoint("CENTER", UIParent, "CENTER", -330, -75)
Minimap:SetPoint("CENTER", UIParent, "CENTER", -320, -50)
return
elseif str == "tipcol" then
-- Show default tooltip title color
if GameTooltipTextLeft1:IsShown() then
local r, g, b, a = GameTooltipTextLeft1:GetTextColor()
r = r <= 1 and r >= 0 and r or 0
g = g <= 1 and g >= 0 and g or 0
b = b <= 1 and b >= 0 and b or 0
LeaPlusLC:Print(L["Tooltip title color"] .. ": " .. strupper(string.format("%02x%02x%02x", r * 255, g * 255, b * 255) .. "."))
else
LeaPlusLC:Print("No tooltip showing.")
end
return
elseif str == "list" then
-- Enumerate frames
local frame = EnumerateFrames()
while frame do
if (frame:IsVisible() and MouseIsOver(frame)) then
LeaPlusLC:Print(frame:GetName() or string.format("[Unnamed Frame: %s]", tostring(frame)))
end
frame = EnumerateFrames(frame)
end
return
elseif str == "nohelp" then
-- Set most help plates to seen
for i = 1, 100 do
SetCVarBitfield("closedInfoFrames", i, true)
end
return
elseif str == "grid" then
-- Toggle frame alignment grid
if LeaPlusLC.grid:IsShown() then LeaPlusLC.grid:Hide() else LeaPlusLC.grid:Show() end
return
elseif str == "chk" then
-- List truncated checkbox labels
if LeaPlusLC["TruncatedLabelsList"] then
for i, v in pairs(LeaPlusLC["TruncatedLabelsList"]) do
LeaPlusLC:Print(LeaPlusLC["TruncatedLabelsList"][i])
end
else
LeaPlusLC:Print("Checkbox labels are Ok.")
end
return
elseif str == "cv" then
-- Print and set console variable setting
if arg1 and arg1 ~= "" then
if GetCVar(arg1) then
if arg2 and arg2 ~= "" then
if tonumber(arg2) then
SetCVar(arg1, arg2)
else
LeaPlusLC:Print("Value must be a number.")
return
end
end
LeaPlusLC:Print(arg1 .. ": |cffffffff" .. GetCVar(arg1))
else
LeaPlusLC:Print("Invalid console variable.")
end
else
LeaPlusLC:Print("Missing console variable.")
end
return
elseif str == "torch" or str == "t" then
-- Torch toggle
if tonumber(GetCVar("gamma")) ~= 1.1 then
SetCVar("gamma", 1.1)
LeaPlusLC:DisplayMessage(L["Torch Off"], true)
else
SetCVar("gamma", 1.3)
LeaPlusLC:DisplayMessage(L["Torch On"], true)
end
return
elseif str == "play" then
-- Play sound ID
if arg1 and arg1 ~= "" then
if tonumber(arg1) then
-- Stop last played sound ID
if LeaPlusLC.SNDcanitHandle then
StopSound(LeaPlusLC.SNDcanitHandle)
end
-- Play sound ID
LeaPlusLC.SNDcanitPlay, LeaPlusLC.SNDcanitHandle = PlaySound(arg1, "Master", false, false)
if not LeaPlusLC.SNDcanitPlay then LeaPlusLC:Print(L["Invalid sound ID"] .. ": |cffffffff" .. arg1) end
else
LeaPlusLC:Print(L["Invalid sound ID"] .. ": |cffffffff" .. arg1)
end
else
LeaPlusLC:Print("Missing sound ID.")
end
return
elseif str == "stop" then
-- Stop last played sound ID
if LeaPlusLC.SNDcanitHandle then
StopSound(LeaPlusLC.SNDcanitHandle)
end
return
elseif str == "team" then
-- Assign battle pet team
local p1, s1p1, s1p2, s1p3, p2, s2p1, s2p2, s2p3, p3, s3p1, s3p2, s3p3 = strsplit(",", arg1 or "", 12)
if p1 and s1p1 and s1p2 and s1p3 and p2 and s2p1 and s2p2 and s2p3 and p3 and s3p1 and s3p2 and s3p3 then
if LeaPlusLC:PlayerInCombat() then
return
else
-- Ensure all 3 slots are unlocked
for i = 1, 3 do
local void, void, void, void, isLocked = C_PetJournal.GetPetLoadOutInfo(i)
if isLocked and isLocked == true then
LeaPlusLC:Print("All 3 battle pet slots need to be unlocked.")
return
end
end
-- Assign pets
C_PetJournal.SetPetLoadOutInfo(1, p1)
C_PetJournal.SetAbility(1, 1, s1p1)
C_PetJournal.SetAbility(1, 2, s1p2)
C_PetJournal.SetAbility(1, 3, s1p3)
C_PetJournal.SetPetLoadOutInfo(2, p2)
C_PetJournal.SetAbility(2, 1, s2p1)
C_PetJournal.SetAbility(2, 2, s2p2)
C_PetJournal.SetAbility(2, 3, s2p3)
C_PetJournal.SetPetLoadOutInfo(3, p3)
C_PetJournal.SetAbility(3, 1, s3p1)
C_PetJournal.SetAbility(3, 2, s3p2)
C_PetJournal.SetAbility(3, 3, s3p3)
if PetJournal and PetJournal:IsShown() then
PetJournal_UpdatePetLoadOut()
end
end
else
LeaPlusLC:Print("Invalid battle pet team parameter.")
end
return
elseif str == "wipecds" then
-- Wipe cooldowns
LeaPlusDB["Cooldowns"] = nil
ReloadUI()
return
elseif str == "tipchat" then
-- Print tooltip contents in chat
local numLines = GameTooltip:NumLines()
if numLines then
for i = 1, numLines do
print(_G["GameTooltipTextLeft" .. i]:GetText() or "")
end
end
return
elseif str == "tiplang" then
-- Tooltip tag locale code constructor
local msg = ""
msg = msg .. 'if GameLocale == "' .. GameLocale .. '" then '
msg = msg .. 'ttLevel = "' .. LEVEL .. '"; '
msg = msg .. 'ttBoss = "' .. BOSS .. '"; '
msg = msg .. 'ttElite = "' .. ELITE .. '"; '
msg = msg .. 'ttRare = "' .. ITEM_QUALITY3_DESC .. '"; '
msg = msg .. 'ttRareElite = "' .. ITEM_QUALITY3_DESC .. " " .. ELITE .. '"; '
msg = msg .. 'ttRareBoss = "' .. ITEM_QUALITY3_DESC .. " " .. BOSS .. '"; '
msg = msg .. 'ttTarget = "' .. TARGET .. '"; '
msg = msg .. "end"
print(msg)
return
elseif str == "con" then
-- Show the developer console
C_Console.SetFontHeight(28)
DeveloperConsole:Toggle(true)
return
elseif str == "movlist" then
-- List playable movie IDs
local count = 0
for i = 1, 1000 do
if IsMoviePlayable(i) then
print(i)
count = count + 1
end
end
LeaPlusLC:Print("Total movies: |cffffffff" .. count)
return
elseif str == "movietime" then
-- Show movie length
if not LeaPlusLC.movieTimeLoaded then
hooksecurefunc(MovieFrame, "Show", function()
LeaPlusLC.startMovieTime = GetTime()
end)
hooksecurefunc(MovieFrame, "Hide", function()
LeaPlusLC.endMovieTime = GetTime()
local ttime = LeaPlusLC.endMovieTime - LeaPlusLC.startMovieTime
print(string.format("%0.0f", ttime))
end)
LeaPlusLC.movieTimeLoaded = true
LeaPlusLC:Print("MovieTime loaded.")
else
LeaPlusLC:Print("MovieTime is already loaded.")
end
return
elseif str == "movie" then
-- Playback movie by ID
arg1 = tonumber(arg1)
if arg1 and arg1 ~= "" then
if IsMoviePlayable(arg1) then
MovieFrame_PlayMovie(MovieFrame, arg1)
else
LeaPlusLC:Print("Movie not playable.")
end
else
LeaPlusLC:Print("Missing movie ID.")
end
return
elseif str == "cin" then
-- Play opening cinematic (only works if character has never gained XP) (used for testing)
OpeningCinematic()
return
elseif str == "skit" then
-- Play a test sound kit
PlaySound("1020", "Master", false, true)
return
elseif str == "dup" then
-- Print music track duplicates
local mask, found, badidfound = false, false, false
for i, e in pairs(Leatrix_Plus["ZoneList"]) do
if Leatrix_Plus["ZoneList"][e] then
for a, b in pairs(Leatrix_Plus["ZoneList"][e]) do
local same = {}
if b.tracks then
for k, v in pairs(b.tracks) do
-- Check for bad sound IDs
if not strfind(v, "|c") then
if not v:match("([^,]+)%#([^,]+)%#([^,]+)") then
local temFile, temSoundID = v:match("([^,]+)%#([^,]+)")
if temSoundID then
local temPlay, temHandle = PlaySound(temSoundID, "Master", false, true)
if temHandle then StopSound(temHandle) end
temPlay, temHandle = PlaySound(temSoundID, "Master", false, true)
if not temPlay and not temHandle then
print("|cffff5400" .. L["Bad ID"] .. ": |r" .. e, v)
badidfound = true
else
if temHandle then StopSound(temHandle) end
end
end
end
-- Check for duplicate IDs
if tContains(same, v) and mask == false then
mask = true
found = true
print("|cffec51ff" .. L["Dup ID"] .. ": |r" .. e, v)
end
tinsert(same, v)
mask = false
end
end
end
end
end
end
if badidfound == false then
LeaPlusLC:Print("No bad sound IDs found.")
end
if found == false then
LeaPlusLC:Print("No media duplicates found.")
end
Sound_GameSystem_RestartSoundSystem()
collectgarbage()
return
elseif str == "enigma" then
-- Enigma
if not LeaPlusLC.enimgaFrame then
local selectedBtn
local bt = {}
local eData = {
{[9]=1, [10]=1, [11]=1, [12]=1, [13]=1, [20]=1, [23]=1, [24]=1, [25]=1, [26]=1, [27]=1, [30]=1, [37]=1, [38]=1, [39]=1, [40]=1, [41]=2, "L4, U2, R4, U2, L4",},
{[9]=1, [11]=1, [12]=1, [13]=1, [16]=1, [18]=1, [20]=1, [23]=1, [24]=1, [25]=1, [27]=1, [34]=1, [41]=2, "U4, L2, D2, L2, U2",},
{[9]=1, [10]=1, [11]=1, [12]=1, [19]=1, [25]=1, [26]=1, [32]=1, [39]=1, [40]=1, [41]=2, "L2, U2, R1, U2, L3",},
{[9]=1, [10]=1, [11]=1, [18]=1, [23]=1, [24]=1, [25]=1, [30]=1, [37]=1, [38]=1, [39]=1, [40]=1, [41]=2, "L4, U2, R2, U2, L2",},
{[9]=1, [10]=1, [11]=1, [12]=1, [13]=1, [16]=1, [23]=1, [25]=1, [26]=1, [27]=1, [30]=1, [32]=1, [34]=1, [37]=1, [38]=1, [39]=1, [41]=2, "U2, L2, D2, L2, U4, R4",},
{[12]=1,[13]=1, [18]=1, [19]=1, [25]=1, [32]=1, [33]=1, [40]=1, [41]=2, "L1, U1, L1, U2, R1, U1, R1",},
{[9]=1, [11]=1, [12]=1, [13]=1, [16]=1, [18]=1, [20]=1, [23]=1, [25]=1, [27]=1, [30]=1, [31]=1, [32]=1, [34]=1, [41]=2, "U4, L2, D3, L2, U3",},
{[9]=1, [10]=1, [17]=1, [24]=1, [25]=1, [32]=1, [33]=1, [40]=1, [41]=2, "L1, U1, L1, U1, L1, U2, L1",},
{[9]=1, [16]=1, [17]=1, [18]=1, [19]=1, [20]=1, [27]=1, [34]=1, [41]=2, "U3, L4, U1",},
{[9]=1, [10]=1, [11]=1, [12]=1, [13]=1, [16]=1, [23]=1, [24]=1, [25]=1, [26]=1, [33]=1, [40]=1, [41]=2, "L1, U2, L3, U2, R4",},
{[9]=1, [10]=1, [11]=1, [12]=1, [13]=1, [16]=1, [23]=1, [30]=1, [37]=1, [38]=1, [39]=1, [40]=1, [41]=2, "L4, U4, R4",},
{[11]=1,[12]=1, [13]=1, [18]=1, [23]=1, [24]=1, [25]=1, [30]=1, [37]=1, [38]=1, [39]=1, [40]=1, [41]=2, "L4, U2, R2, U2, R2",},
{[13]=1,[20]=1, [23]=1, [24]=1, [25]=1, [26]=1, [27]=1, [30]=1, [37]=1, [38]=1, [39]=1, [40]=1, [41]=2, "L4, U2, R4, U2",},
}
-- Create frame
local eFrame = CreateFrame("Frame", nil, UIParent)
eFrame:SetPoint("TOP", 0, 0)
eFrame:SetSize(1222, 134)
eFrame.b = eFrame:CreateTexture(nil, "BACKGROUND")
eFrame.b:SetAllPoints()
eFrame.b:SetColorTexture(0, 0, 0, 1)
eFrame:SetFrameStrata("FULLSCREEN_DIALOG")
eFrame:SetScale(0.9)
eFrame:SetToplevel(true)
eFrame:EnableMouse(true)
LeaPlusLC.enimgaFrame = eFrame
-- Right-click to exit
eFrame:SetScript("OnMouseDown", function(self, btn)
if btn == "RightButton" then
eFrame:Hide()
end
end)
-- Create title fontstring
eFrame.f = eFrame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
eFrame.f:SetPoint("BOTTOMLEFT", 10, 10)
eFrame.f:SetText(L["Choose an Enigma pattern"])
eFrame.f:SetFont(eFrame.f:GetFont(), 24, nil)
-- Create close fontstring
eFrame.x = eFrame:CreateFontString(nil, "ARTWORK", "GameFontNormalLarge")
eFrame.x:SetPoint("BOTTOMRIGHT", -10, 10)
eFrame.x:SetText(L["Right-click to close"])
eFrame.x:SetFont(eFrame.f:GetFont(), 24, nil)
-- Create buttons
for eBtn = 1, #eData do
local b = CreateFrame("Button", nil, eFrame)
tinsert(bt, b)
b:SetSize(94, 94)
b:SetPoint("TOPLEFT", ((eBtn - 1) % 13) * 94, -2)
-- Button highlight bar
b.line = b:CreateTexture(nil, "ARTWORK")
b.line:SetTexture("Interface\\PLAYERFRAME\\DruidLunarBarHorizontal")
b.line:SetSize(84, 6)
b.line:SetPoint("BOTTOM", 0, -4)
b.line:Hide()
-- Button textures
for row = 0, 7 - 1 do
for col = 0, 7 - 1 do
local t = b:CreateTexture(nil, "ARTWORK")
t:SetSize(12, 12)
t:SetPoint("TOPLEFT", 5 + col * 12, - 5 - row * 12)
local c = eData[eBtn][row * 7 + col + 1]
-- Do nothing if element is the solution
if c and strfind(c, ",") then c = nil end
-- Color textures
if c == 2 then
-- Starting block
t:SetColorTexture(0, 1, 0)
elseif c then
-- Path
t:SetColorTexture(1, 1, 1)
else
-- Background
t:SetColorTexture(.4, .4, .9)
end
end
end
-- Button scripts
b:SetScript("OnEnter", function()
bt[eBtn].line:Show()
end)
b:SetScript("OnLeave", function()
if b ~= selectedBtn then bt[eBtn].line:Hide() end
end)
b:SetScript("OnMouseDown", function(self, btn)
if btn == "RightButton" then
-- Right-click to exit
eFrame:Hide()
return
else
-- Deselect all buttons
for test = 1, #bt do
bt[test].line:Hide()
end
-- Select current button
bt[eBtn].line:Show()
selectedBtn = b
PlaySound(115, "Master", false, true)
-- Print button data
eFrame.f:SetText(L["Enigma"] .. " " .. eBtn .. ": |cffffffff" .. eData[eBtn][#eData[eBtn]])
end
end)
end
else
-- Toggle frame
if LeaPlusLC.enimgaFrame:IsShown() then
LeaPlusLC.enimgaFrame:Hide()
else
LeaPlusLC.enimgaFrame:Show()
end
end
return
elseif str == "showinst" then
-- List instance IDs for currently selected Encounter Journal expansion filter dropdown
for i = 1, 5000 do
local instanceID, name, description, bgImage, buttonImage, loreImage, dungeonAreaMapID, link = EJ_GetInstanceByIndex(i, false)
if instanceID then print(instanceID, name) end
end
for i = 1, 5000 do
local instanceID, name, description, bgImage, buttonImage, loreImage, dungeonAreaMapID, link = EJ_GetInstanceByIndex(i, true)
if instanceID then print(instanceID, name) end
end
return
elseif str == "marker" then
-- Prevent showing raid target markers on self
if not LeaPlusLC.MarkerFrame then
LeaPlusLC.MarkerFrame = CreateFrame("FRAME")
LeaPlusLC.MarkerFrame:RegisterEvent("RAID_TARGET_UPDATE")
end
LeaPlusLC.MarkerFrame.Update = true
if LeaPlusLC.MarkerFrame.Toggle == false then
-- Show markers
LeaPlusLC.MarkerFrame:SetScript("OnEvent", nil)
LeaPlusLC:DisplayMessage(L["Self Markers Allowed"], true)
LeaPlusLC.MarkerFrame.Toggle = true
else
-- Hide markers
SetRaidTarget("player", 0)
LeaPlusLC.MarkerFrame:SetScript("OnEvent", function()
if LeaPlusLC.MarkerFrame.Update == true then
LeaPlusLC.MarkerFrame.Update = false
SetRaidTarget("player", 0)
end
LeaPlusLC.MarkerFrame.Update = true
end)
LeaPlusLC:DisplayMessage(L["Self Markers Blocked"], true)
LeaPlusLC.MarkerFrame.Toggle = false
end
return
elseif str == "exit" then
-- Exit a vehicle
VehicleExit()
return
elseif str == "pos" then
-- Map POI code builder
local mapID = C_Map.GetBestMapForUnit("player") or nil
local mapName = C_Map.GetMapInfo(mapID).name or nil
local mapRects = {}
local tempVec2D = CreateVector2D(0, 0)
local void
-- Get player map position
tempVec2D.x, tempVec2D.y = UnitPosition("player")
if not tempVec2D.x then return end
local mapRect = mapRects[mapID]
if not mapRect then
mapRect = {}
void, mapRect[1] = C_Map.GetWorldPosFromMapPos(mapID, CreateVector2D(0, 0))
void, mapRect[2] = C_Map.GetWorldPosFromMapPos(mapID, CreateVector2D(1, 1))
mapRect[2]:Subtract(mapRect[1])
mapRects[mapID] = mapRect
end
tempVec2D:Subtract(mapRects[mapID][1])
local pX, pY = tempVec2D.y/mapRects[mapID][2].y, tempVec2D.x/mapRects[mapID][2].x
pX = string.format("%0.1f", 100 * pX)
pY = string.format("%0.1f", 100 * pY)
if mapID and mapName and pX and pY then
ChatFrame1:Clear()
local dnType, dnTex = "Dungeon", "dnTex"
if arg1 == "raid" then dnType, dnTex = "Raid", "rdTex" end
if arg1 == "portal" then dnType = "Portal" end
print('[' .. mapID .. '] = --[[' .. mapName .. ']] {{"Dungeon", ' .. pX .. ', ' .. pY .. ', L[' .. '"Name"' .. '], L[' .. '"' .. dnType .. '"' .. ']},},')
end
return
elseif str == "mapref" then
-- Print map reveal structure code
if not WorldMapFrame:IsShown() then
LeaPlusLC:Print("Open the map first!")
return
end
ChatFrame1:Clear()
local msg = ""
local mapID = WorldMapFrame.mapID
local mapName = C_Map.GetMapInfo(mapID).name
local mapArt = C_Map.GetMapArtID(mapID)
msg = msg .. "--[[" .. mapName .. "]] [" .. mapArt .. "] = {"
local exploredMapTextures = C_MapExplorationInfo.GetExploredMapTextures(mapID);
if exploredMapTextures then
for i, exploredTextureInfo in ipairs(exploredMapTextures) do
local twidth = exploredTextureInfo.textureWidth or 0
if twidth > 0 then
local theight = exploredTextureInfo.textureHeight or 0
local offsetx = exploredTextureInfo.offsetX
local offsety = exploredTextureInfo.offsetY
local filedataIDS = exploredTextureInfo.fileDataIDs
msg = msg .. "[" .. '"' .. twidth .. ":" .. theight .. ":" .. offsetx .. ":" .. offsety .. '"' .. "] = " .. '"'
for fileData = 1, #filedataIDS do
msg = msg .. filedataIDS[fileData]
if fileData < #filedataIDS then
msg = msg .. ", "
else
msg = msg .. '",'
if i < #exploredMapTextures then
msg = msg .. " "
end
end
end
end
end
msg = msg .. "},"
print(msg)
end
return
elseif str == "map" then
-- Set map by ID, print currently showing map ID or print character map ID
if not arg1 then
-- Print map ID
if WorldMapFrame:IsShown() then
-- Show world map ID
local mapID = WorldMapFrame.mapID or nil
local artID = C_Map.GetMapArtID(mapID) or nil
local mapName = C_Map.GetMapInfo(mapID).name or nil
if mapID and artID and mapName then
LeaPlusLC:Print(mapID .. " (" .. artID .. "): " .. mapName .. " (map)")
end
else
-- Show character map ID
local mapID = C_Map.GetBestMapForUnit("player") or nil
local artID = C_Map.GetMapArtID(mapID) or nil
local mapName = C_Map.GetMapInfo(mapID).name or nil
if mapID and artID and mapName then
LeaPlusLC:Print(mapID .. " (" .. artID .. "): " .. mapName .. " (player)")
end
end
return
elseif not tonumber(arg1) or not C_Map.GetMapInfo(arg1) then
-- Invalid map ID
LeaPlusLC:Print("Invalid map ID.")
else
-- Set map by ID
WorldMapFrame:SetMapID(tonumber(arg1))
end
return
elseif str == "cls" then
-- Clear chat frame
ChatFrame1:Clear()
return
elseif str == "al" then
-- Enable auto loot
SetCVar("autoLootDefault", "1")
LeaPlusLC:Print("Auto loot is now enabled.")
return
elseif str == "realm" then
-- Show list of connected realms
local titleRealm = GetRealmName()
local userRealm = GetNormalizedRealmName()
local connectedServers = GetAutoCompleteRealms()
if titleRealm and userRealm and connectedServers then
LeaPlusLC:Print(L["Connections for"] .. "|cffffffff " .. titleRealm)
if #connectedServers > 0 then
local count = 1
for i = 1, #connectedServers do
if userRealm ~= connectedServers[i] then
LeaPlusLC:Print(count .. ". " .. connectedServers[i])
count = count + 1
end
end
else
LeaPlusLC:Print("None")
end
end
return
elseif str == "deletelooms" then
-- Delete heirlooms from bags
for bag = 0, 4 do
for slot = 1, C_Container.GetContainerNumSlots(bag) do
local name = C_Container.GetContainerItemLink(bag, slot)
if name and string.find(name, "00ccff") then
print(name)
PickupContainerItem(bag, slot)
DeleteCursorItem()
end
end
end
return
elseif str == "help" then
-- Help panel
if not LeaPlusLC.HelpFrame then
local frame = CreateFrame("FRAME", nil, UIParent)
frame:SetSize(570, 380); frame:SetFrameStrata("FULLSCREEN_DIALOG"); frame:SetFrameLevel(100)
frame.tex = frame:CreateTexture(nil, "BACKGROUND"); frame.tex:SetAllPoints(); frame.tex:SetColorTexture(0.05, 0.05, 0.05, 0.9)
frame.close = LeaPlusLC:CreateCloseButton(frame, 30, 30, "TOPRIGHT", 0, 0)
frame.close:SetScript("OnClick", function() frame:Hide() end)
frame:ClearAllPoints(); frame:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
frame:SetClampedToScreen(true)
frame:SetClampRectInsets(450, -450, -300, 300)
frame:EnableMouse(true)
frame:SetMovable(true)
frame:RegisterForDrag("LeftButton")
frame:SetScript("OnDragStart", frame.StartMoving)
frame:SetScript("OnDragStop", function() frame:StopMovingOrSizing() frame:SetUserPlaced(false) end)
frame:Hide()
LeaPlusLC:CreateBar("HelpPanelMainTexture", frame, 570, 380, "TOPRIGHT", 0.7, 0.7, 0.7, 0.7, "Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated.png")
-- Panel contents
local col1, col2, color1 = 10, 120, "|cffffffaa"
LeaPlusLC:MakeTx(frame, "Leatrix Plus Help", col1, -10)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp|r", col1, -30)
LeaPlusLC:MakeWD(frame, "Toggle opttions panel.", col2, -30)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp reset", col1, -50)
LeaPlusLC:MakeWD(frame, "Reset addon panel position and scale.", col2, -50)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp wipe", col1, -70)
LeaPlusLC:MakeWD(frame, "Wipe all addon settings (reloads UI).", col2, -70)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp realm", col1, -90)
LeaPlusLC:MakeWD(frame, "Show realms connected to yours.", col2, -90)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp rest", col1, -110)
LeaPlusLC:MakeWD(frame, "Show number of rested XP bubbles remaining.", col2, -110)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp quest <id>", col1, -130)
LeaPlusLC:MakeWD(frame, "Show quest completion status for <quest id>.", col2, -130)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp hk", col1, -150)
LeaPlusLC:MakeWD(frame, "Show your lifetime honorable kills.", col2, -150)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp grid", col1, -170)
LeaPlusLC:MakeWD(frame, "Toggle a frame alignment grid.", col2, -170)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp id", col1, -190)
LeaPlusLC:MakeWD(frame, "Show a web link for whatever the pointer is over.", col2, -190)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp zygor", col1, -210)
LeaPlusLC:MakeWD(frame, "Toggle the Zygor addon (reloads UI).", col2, -210)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp movie <id>", col1, -230)
LeaPlusLC:MakeWD(frame, "Play a movie by its ID.", col2, -230)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp enigma", col1, -250)
LeaPlusLC:MakeWD(frame, "Toggle the Enigmatic quest solver.", col2, -250)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp marker", col1, -270)
LeaPlusLC:MakeWD(frame, "Block target markers (toggle) (requires assistant or leader in raid).", col2, -270)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp rsnd", col1, -290)
LeaPlusLC:MakeWD(frame, "Restart the sound system.", col2, -290)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp ra", col1, -310)
LeaPlusLC:MakeWD(frame, "Announce target in General chat channel (useful for rares).", col2, -310)
LeaPlusLC:MakeWD(frame, color1 .. "/ltp con", col1, -330)
LeaPlusLC:MakeWD(frame, "Launch the developer console with a large font.", col2, -330)
LeaPlusLC:MakeWD(frame, color1 .. "/rl", col1, -350)
LeaPlusLC:MakeWD(frame, "Reload the UI.", col2, -350)
LeaPlusLC.HelpFrame = frame
_G["LeaPlusGlobalHelpPanel"] = frame
table.insert(UISpecialFrames, "LeaPlusGlobalHelpPanel")
end
if LeaPlusLC.HelpFrame:IsShown() then LeaPlusLC.HelpFrame:Hide() else LeaPlusLC.HelpFrame:Show() end
return
elseif str == "who" then
-- Print out who list URLs
ChatFrame1:Clear()
local realmName = gsub(GetRealmName(), " ", "-")
for i = 1,C_FriendList.GetNumWhoResults() do
local p = C_FriendList.GetWhoInfo(i)
if not string.find(p.fullName, "-") then
print("https://worldofwarcraft.com/en-gb/character/eu/" .. realmName .. "/" .. p.fullName .. "/collections/pets")
end
end
return
elseif str == "ra" then
-- Announce target name, health percentage, coordinates and map pin link in General chat channel
local genChannel
if GameLocale == "deDE" then genChannel = "Allgemein"
elseif GameLocale == "esMX" then genChannel = "General"
elseif GameLocale == "esES" then genChannel = "General"
elseif GameLocale == "frFR" then genChannel = "Général"
elseif GameLocale == "itIT" then genChannel = "Generale"
elseif GameLocale == "ptBR" then genChannel = "Geral"
elseif GameLocale == "ruRU" then genChannel = "Общий"
elseif GameLocale == "koKR" then genChannel = "공개"
elseif GameLocale == "zhCN" then genChannel = "综合"
elseif GameLocale == "zhTW" then genChannel = "綜合"
else genChannel = "General"
end
if genChannel then
local index = GetChannelName(genChannel)
if index and index > 0 then
local mapID = C_Map.GetBestMapForUnit("player")
if C_Map.CanSetUserWaypointOnMap(mapID) then
local pos = C_Map.GetPlayerMapPosition(mapID, "player")
if pos.x and pos.x ~= "0" and pos.y and pos.y ~= "0" then
local mapPoint = UiMapPoint.CreateFromVector2D(mapID, pos)
if mapPoint then
local uHealth = UnitHealth("target")
local uHealthMax = UnitHealthMax("target")
-- Store original pin if there is one
local currentPin = C_Map.GetUserWaypointHyperlink()
-- Set map pin and get the link
C_Map.SetUserWaypoint(mapPoint)
local myPin = C_Map.GetUserWaypointHyperlink()
-- Put original pin back if there was one
if currentPin then
C_Timer.After(0.1, function()
local oldPin = C_Map.GetUserWaypointFromHyperlink(currentPin)
C_Map.SetUserWaypoint(oldPin)
end)
end
-- Announce in chat
if uHealth and uHealth > 0 and uHealthMax and uHealthMax > 0 and myPin then
-- Get unit classification (elite, rare, rare elite or boss)
local unitType, unitTag = UnitClassification("target"), ""
if unitType then
if unitType == "rare" or unitType == "rareelite" then unitTag = "(" .. L["Rare"] .. ") " elseif unitType == "worldboss" then unitTag = "(" .. L["Boss"] .. ") " end
end
SendChatMessage(format("%%t " .. unitTag .. "(%d%%)%s", uHealth / uHealthMax * 100, " ") .. " " .. myPin, "CHANNEL", nil, index)
-- SendChatMessage(format("%%t " .. unitTag .. "(%d%%)%s", uHealth / uHealthMax * 100, " ") .. " " .. myPin, "WHISPER", nil, GetUnitName("player")) -- Debug
C_Map.ClearUserWaypoint()
else
LeaPlusLC:Print("Invalid target.")
end
else
LeaPlusLC:Print("Cannot announce in this zone.")
end
else
LeaPlusLC:Print("Cannot announce in this zone.")
end
else
LeaPlusLC:Print("Cannot announce in this zone.")
end
else
LeaPlusLC:Print("Cannot find General chat channel.")
end
end
return
elseif str == "camp" then
-- Camp
if not LeaPlusLC.NoCampFrame then
-- Load LibChatAnims
Leatrix_Plus:LeaPlusLCA()
-- Chat filter
function LeaPlusLC.CampFilterFunc(self, event, msg)
if msg:match(_G["MARKED_AFK_MESSAGE"]:gsub("%%s", "%s-"))
or msg:match(_G["MARKED_AFK"])
or msg:match(_G["CLEARED_AFK"])
or msg:match(_G["IDLE_MESSAGE"])
then return true
end
end
LeaPlusLC.NoCampFrame = CreateFrame("FRAME", nil, UIParent)
end
if LeaPlusLC.NoCampFrame:IsEventRegistered("PLAYER_CAMPING") then
-- Disable camp
LeaPlusLC.NoCampFrame:UnregisterEvent("PLAYER_CAMPING")
ChatFrame_RemoveMessageEventFilter("CHAT_MSG_SYSTEM", LeaPlusLC.CampFilterFunc)
LeaPlusLC:Print("Camping enabled. You will camp.")
else
-- Enable camp
LeaPlusLC.NoCampFrame:RegisterEvent("PLAYER_CAMPING")
ChatFrame_AddMessageEventFilter("CHAT_MSG_SYSTEM", LeaPlusLC.CampFilterFunc)
LeaPlusLC:Print("Camping disabled. You won't camp.")
end
-- Event handler
LeaPlusLC.NoCampFrame:SetScript("OnEvent", function()
local p = StaticPopup_Visible("CAMP")
_G[p .. "Button1"]:Click()
end)
return
elseif str == "ach" then
-- Set Instance Achievement Tracker window properties
if AchievementTracker then
AchievementTracker:SetScale(1.4)
AchievementTracker:SetClampRectInsets(500, -500, -10, 300)
table.insert(UISpecialFrames, "AchievementTracker")
LeaPlusLC:Print("IAT scale set and window can now be closed with escape.")
end
return
elseif str == "blanchy" then
-- Sound alert when Dead Blanchy emotes nearby
LeaPlusLC.BlanchyFrame = LeaPlusLC.BlanchyFrame or CreateFrame("FRAME")
if LeaPlusLC.BlanchyFrame:IsEventRegistered("CHAT_MSG_MONSTER_EMOTE") then
C_Map.ClearUserWaypoint()
LeaPlusLC.BlanchyFrame:UnregisterEvent("CHAT_MSG_MONSTER_EMOTE")
LeaPlusLC:Print("Dead Blanchy alert disabled.")
else
C_Map.SetUserWaypoint(UiMapPoint.CreateFromVector2D(1525, CreateVector2D(63.1/100, 43.0/100)))
LeaPlusLC.BlanchyFrame:RegisterEvent("CHAT_MSG_MONSTER_EMOTE")
LeaPlusLC:Print("Dead Blanchy alert active. Spawn point has been pinned to the Revendreth map. An alert will sound 20 times when Blanchy emotes nearby.")
end
LeaPlusLC.BlanchyFrame:SetScript("OnEvent", function(self, event, void, pname)
if pname == L["Dead Blanchy"] then
C_Timer.NewTicker(1, function() PlaySound(8959, "Master") end, 20)
end
end)
return
elseif str == "perf" then
-- Average FPS during combat
local fTab = {}
if not LeaPlusLC.perf then
LeaPlusLC.perf = CreateFrame("FRAME")
end
local fFrm = LeaPlusLC.perf
local k, startTime = 0, 0
if fFrm:IsEventRegistered("PLAYER_REGEN_DISABLED") then
fFrm:UnregisterAllEvents()
fFrm:SetScript("OnUpdate", nil)
LeaPlusLC:Print("PERF unloaded.")
else
fFrm:RegisterEvent("PLAYER_REGEN_DISABLED")
fFrm:RegisterEvent("PLAYER_REGEN_ENABLED")
LeaPlusLC:Print("Waiting for combat to start...")
end
fFrm:SetScript("OnEvent", function(self, event)
if event == "PLAYER_REGEN_DISABLED" then
LeaPlusLC:Print("Monitoring FPS during combat...")
fFrm:SetScript("OnUpdate", function()
k = k + 1
fTab[k] = GetFramerate()
end)
startTime = GetTime()
else
fFrm:SetScript("OnUpdate", nil)
local tSum = 0
for i = 1, #fTab do
tSum = tSum + fTab[i]
end
local timeTaken = string.format("%.0f", GetTime() - startTime)
if tSum > 0 then
LeaPlusLC:Print("Average FPS for " .. timeTaken .. " seconds of combat: " .. string.format("%.0f", tSum / #fTab))
end
end
end)
return
elseif str == "col" then
-- Convert color values
LeaPlusLC:Print("|n")
local r, g, b = tonumber(arg1), tonumber(arg2), tonumber(arg3)
if r and g and b then
-- RGB source
LeaPlusLC:Print("Source: |cffffffff" .. r .. " " .. g .. " " .. b .. " ")
-- RGB to Hex
if r > 1 and g > 1 and b > 1 then
-- RGB to Hex
LeaPlusLC:Print("Hex: |cffffffff" .. strupper(string.format("%02x%02x%02x", r, g, b)) .. " (from RGB)")
else
-- Wow to Hex
LeaPlusLC:Print("Hex: |cffffffff" .. strupper(string.format("%02x%02x%02x", r * 255, g * 255, b * 255)) .. " (from Wow)")
-- Wow to RGB
local rwow = string.format("%.0f", r * 255)
local gwow = string.format("%.0f", g * 255)
local bwow = string.format("%.0f", b * 255)
if rwow ~= "0.0" and gwow ~= "0.0" and bwow ~= "0.0" then
LeaPlusLC:Print("RGB: |cffffffff" .. rwow .. " " .. gwow .. " " .. bwow .. " (from Wow)")
end
end
-- RGB to Wow
local rwow = string.format("%.1f", r / 255)
local gwow = string.format("%.1f", g / 255)
local bwow = string.format("%.1f", b / 255)
if rwow ~= "0.0" and gwow ~= "0.0" and bwow ~= "0.0" then
LeaPlusLC:Print("Wow: |cffffffff" .. rwow .. " " .. gwow .. " " .. bwow)
end
LeaPlusLC:Print("|n")
elseif arg1 and strlen(arg1) == 6 and strmatch(arg1,"%x") and arg2 == nil and arg3 == nil then
-- Hex source
local rhex, ghex, bhex = string.sub(arg1, 1, 2), string.sub(arg1, 3, 4), string.sub(arg1, 5, 6)
if strmatch(rhex,"%x") and strmatch(ghex,"%x") and strmatch(bhex,"%x") then
LeaPlusLC:Print("Source: |cffffffff" .. strupper(arg1))
LeaPlusLC:Print("Wow: |cffffffff" .. string.format("%.1f", tonumber(rhex, 16) / 255) .. " " .. string.format("%.1f", tonumber(ghex, 16) / 255) .. " " .. string.format("%.1f", tonumber(bhex, 16) / 255))
LeaPlusLC:Print("RGB: |cffffffff" .. tonumber(rhex, 16) .. " " .. tonumber(ghex, 16) .. " " .. tonumber(bhex, 16))
else
LeaPlusLC:Print("Invalid arguments.")
end
LeaPlusLC:Print("|n")
else
LeaPlusLC:Print("Invalid arguments.")
end
return
elseif str == "click" then
-- Click a button so a user can test if it is allowed
local frame = GetMouseFocus()
local ftype = frame:GetObjectType()
if frame and ftype and ftype == "Button" then
frame:Click()
else
LeaPlusLC:Print("Hover the pointer over a button.")
end
return
elseif str == "frame" then
-- Print frame name under mouse
local frame = GetMouseFocus()
local ftype = frame:GetObjectType()
if frame and ftype then
local fname = frame:GetName()
local issecure, tainted = issecurevariable(fname)
if issecure then issecure = "Yes" else issecure = "No" end
if tainted then tainted = "Yes" else tainted = "No" end
if fname then
LeaPlusLC:Print("Name: |cffffffff" .. fname)
LeaPlusLC:Print("Type: |cffffffff" .. ftype)
LeaPlusLC:Print("Secure: |cffffffff" .. issecure)
LeaPlusLC:Print("Tainted: |cffffffff" .. tainted)
end
end
return
elseif str == "arrow" then
-- Arrow (left: drag, shift/ctrl: rotate, mouseup: loc, pointer must be on arrow stem)
local f = CreateFrame("Frame", nil, WorldMapFrame.ScrollContainer)
f:SetSize(64, 64)
f:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
f:SetFrameLevel(500)
f:SetParent(WorldMapFrame.ScrollContainer)
f:SetScale(0.6)
f.t = f:CreateTexture(nil, "ARTWORK")
f.t:SetAtlas("Garr_LevelUpgradeArrow")
f.t:SetAllPoints()
f.f = f:CreateFontString(nil, "ARTWORK", "GameFontNormal")
f.f:SetText("0.0")
local x = 0
f:SetScript("OnUpdate", function()
if IsShiftKeyDown() then
x = x + 0.01
if x > 6.3 then x = 0 end
f.t:SetRotation(x)
f.f:SetFormattedText("%.1f", x)
elseif IsControlKeyDown() then
x = x - 0.01
if x < 0 then x = 6.3 end
f.t:SetRotation(x)
f.f:SetFormattedText("%.1f", x)
end
-- Print coordinates when mouse is in right place
local x, y = WorldMapFrame.ScrollContainer:GetNormalizedCursorPosition()
if x and y and x > 0 and y > 0 then
if MouseIsOver(f, -31, 31, 31, -31) then
ChatFrame1:Clear()
print(('{"Arrow", ' .. floor(x * 1000 + 0.5) / 10) .. ',', (floor(y * 1000 + 0.5) / 10) .. ', L["Step 1"], L["Start here."], arTex, nil, nil, nil, nil, nil, ' .. f.f:GetText() .. "},")
PlaySoundFile(567412, "Master", false, true)
end
end
end)
f:SetMovable(true)
f:SetScript("OnMouseDown", function(self, btn)
if btn == "LeftButton" then
f:StartMoving()
end
end)
f:SetScript("OnMouseUp", function()
f:StopMovingOrSizing()
--ChatFrame1:Clear()
--local x, y = WorldMapFrame.ScrollContainer:GetNormalizedCursorPosition()
--if x and y and x > 0 and y > 0 and MouseIsOver(f) then
-- print(('{"Arrow", ' .. floor(x * 1000 + 0.5) / 10) .. ',', (floor(y * 1000 + 0.5) / 10) .. ', L["Step 1"], L["Start here."], ' .. f.f:GetText() .. "},")
--end
end)
return
elseif str == "dis" then
-- Disband group
if not LeaPlusLC:IsInLFGQueue() and not IsInGroup(LE_PARTY_CATEGORY_INSTANCE) then
local x = GetNumGroupMembers() or 0
for i = x, 1, -1 do
if GetNumGroupMembers() > 0 then
local name = GetRaidRosterInfo(i)
if name and name ~= UnitName("player") then
UninviteUnit(name)
end
end
end
else
LeaPlusLC:Print("You cannot do that while in group finder.")
end
return
elseif str == "reinv" then
-- Disband and reinvite raid
if not LeaPlusLC:IsInLFGQueue() and not IsInGroup(LE_PARTY_CATEGORY_INSTANCE) then
if UnitIsGroupLeader("player") then
-- Disband
local groupNames = {}
local x = GetNumGroupMembers() or 0
for i = x, 1, -1 do
if GetNumGroupMembers() > 0 then
local name = GetRaidRosterInfo(i)
if name and name ~= UnitName("player") then
UninviteUnit(name)
tinsert(groupNames, name)
end
end
end
-- Reinvite
C_Timer.After(0.1, function()
for k, v in pairs(groupNames) do
C_PartyInfo.InviteUnit(v)
end
end)
else
LeaPlusLC:Print("You need to be group leader.")
end
else
LeaPlusLC:Print("You cannot do that while in group finder.")
end
return
elseif str == "limit" then
-- Sound Limit
if not LeaPlusLC.MuteFrame then
-- Panel frame
local frame = CreateFrame("FRAME", nil, UIParent)
frame:SetSize(294, 86); frame:SetFrameStrata("FULLSCREEN_DIALOG"); frame:SetFrameLevel(100); frame:SetScale(2)
frame.tex = frame:CreateTexture(nil, "BACKGROUND"); frame.tex:SetAllPoints(); frame.tex:SetColorTexture(0.05, 0.05, 0.05, 0.9)
frame.close = LeaPlusLC:CreateCloseButton(frame, 30, 30, "TOPRIGHT", 0, 0)
frame.close:SetScript("OnClick", function() frame:Hide() end)
frame:ClearAllPoints(); frame:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
frame:SetClampedToScreen(true)
frame:EnableMouse(true)
frame:SetMovable(true)
frame:RegisterForDrag("LeftButton")
frame:SetScript("OnDragStart", frame.StartMoving)
frame:SetScript("OnDragStop", function() frame:StopMovingOrSizing() frame:SetUserPlaced(false) end)
frame:Hide()
LeaPlusLC:CreateBar("MutePanelMainTexture", frame, 294, 86, "TOPRIGHT", 0.7, 0.7, 0.7, 0.7, "Interface\\ACHIEVEMENTFRAME\\UI-GuildAchievement-Parchment-Horizontal-Desaturated.png")
-- Panel contents
LeaPlusLC:MakeTx(frame, "Sound Limit", 16, -12)
local endBox = LeaPlusLC:CreateEditBox("SoundEndBox", frame, 116, 10, "TOPLEFT", 16, -32, "SoundEndBox", "SoundEndBox")
endBox:SetText(5000000)
endBox:SetScript("OnMouseWheel", function(self, delta)
local endSound = tonumber(endBox:GetText())
if endSound then
if delta == 1 then endSound = endSound + LeaPlusLC.SoundByte else endSound = endSound - LeaPlusLC.SoundByte end
if endSound < 1 then endSound = 1 elseif endSound >= 5000000 then endSound = 5000000 end
endBox:SetText(endSound)
else
endSound = 100000
endBox:SetText(endSound)
end
end)
-- Set limit button
frame.btn = LeaPlusLC:CreateButton("muteRangeButton", frame, "SET LIMIT", "TOPLEFT", 16, -72, 0, 25, true, "Click to set the sound file limit. Use the mousewheel on the editbox along with the step buttons below to adjust the sound limit. Acceptable range is from 1 to 5000000. Sound files higher than this limit will be muted.")
frame.btn:ClearAllPoints()
frame.btn:SetPoint("LEFT", endBox, "RIGHT", 10, 0)
frame.btn:SetScript("OnClick", function()
local endSound = tonumber(endBox:GetText())
if endSound then
if endSound > 5000000 then endSound = 5000000 endBox:SetText(endSound) end
frame.btn:SetText("WAIT")
C_Timer.After(0.1, function()
for i = 1, 5000000 do
MuteSoundFile(i)
end
for i = 1, endSound do
UnmuteSoundFile(i)
end
Sound_GameSystem_RestartSoundSystem()
frame.btn:SetText("SET LIMIT")
end)
else
frame.btn:SetText("INVALID")
frame.btn:EnableMouse(false)
C_Timer.After(2, function()
frame.btn:SetText("SET LIMIT")
frame.btn:EnableMouse(true)
end)
end
end)
-- Mute all button
frame.MuteAllBtn = LeaPlusLC:CreateButton("muteMuteAllButton", frame, "MUTE ALL", "TOPLEFT", 16, -92, 0, 25, true, "Click to mute every sound in the game.")
frame.MuteAllBtn:SetScale(0.5)
frame.MuteAllBtn:ClearAllPoints()
frame.MuteAllBtn:SetPoint("TOPLEFT", frame.btn, "TOPRIGHT", 20, 0)
frame.MuteAllBtn:SetScript("OnClick", function()
frame.MuteAllBtn:SetText("WAIT")
C_Timer.After(0.1, function()
for i = 1, 5000000 do
MuteSoundFile(i)
end
Sound_GameSystem_RestartSoundSystem()
frame.MuteAllBtn:SetText("MUTE ALL")
end)
return
end)
-- Unmute all button
frame.UnmuteAllBtn = LeaPlusLC:CreateButton("muteUnmuteAllButton", frame, "UNMUTE ALL", "TOPLEFT", 16, -92, 0, 25, true, "Click to unmute every sound in the game.")
frame.UnmuteAllBtn:SetScale(0.5)
frame.UnmuteAllBtn:ClearAllPoints()
frame.UnmuteAllBtn:SetPoint("TOPLEFT", frame.MuteAllBtn, "BOTTOMLEFT", 0, -10)
frame.UnmuteAllBtn:SetScript("OnClick", function()
frame.UnmuteAllBtn:SetText("WAIT")
C_Timer.After(0.1, function()
for i = 1, 5000000 do
UnmuteSoundFile(i)
end
Sound_GameSystem_RestartSoundSystem()
frame.UnmuteAllBtn:SetText("UNMUTE ALL")
end)
return
end)
-- Step buttons
frame.millionBtn = LeaPlusLC:CreateButton("SoundMillionButton", frame, "1000000", "TOPLEFT", 26, -122, 0, 25, true, "Set the editbox step value to 1000000.")
frame.millionBtn:SetScale(0.5)
frame.hundredThousandBtn = LeaPlusLC:CreateButton("SoundHundredThousandButton", frame, "100000", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 100000.")
frame.hundredThousandBtn:ClearAllPoints()
frame.hundredThousandBtn:SetPoint("LEFT", frame.millionBtn, "RIGHT", 10, 0)
frame.hundredThousandBtn:SetScale(0.5)
frame.tenThousandBtn = LeaPlusLC:CreateButton("SoundTenThousandButton", frame, "10000", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 10000.")
frame.tenThousandBtn:ClearAllPoints()
frame.tenThousandBtn:SetPoint("LEFT", frame.hundredThousandBtn, "RIGHT", 10, 0)
frame.tenThousandBtn:SetScale(0.5)
frame.thousandBtn = LeaPlusLC:CreateButton("SoundThousandButton", frame, "1000", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 1000.")
frame.thousandBtn:ClearAllPoints()
frame.thousandBtn:SetPoint("LEFT", frame.tenThousandBtn, "RIGHT", 10, 0)
frame.thousandBtn:SetScale(0.5)
frame.hundredBtn = LeaPlusLC:CreateButton("SoundHundredButton", frame, "100", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 100.")
frame.hundredBtn:ClearAllPoints()
frame.hundredBtn:SetPoint("LEFT", frame.thousandBtn, "RIGHT", 10, 0)
frame.hundredBtn:SetScale(0.5)
frame.tenBtn = LeaPlusLC:CreateButton("SoundTenButton", frame, "10", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 10.")
frame.tenBtn:ClearAllPoints()
frame.tenBtn:SetPoint("LEFT", frame.hundredBtn, "RIGHT", 10, 0)
frame.tenBtn:SetScale(0.5)
frame.oneBtn = LeaPlusLC:CreateButton("SoundTenButton", frame, "1", "TOPLEFT", 16, -112, 0, 25, true, "Set the editbox step value to 1.")
frame.oneBtn:ClearAllPoints()
frame.oneBtn:SetPoint("LEFT", frame.tenBtn, "RIGHT", 10, 0)
frame.oneBtn:SetScale(0.5)
local function DimAllBoxes()
frame.millionBtn:SetAlpha(0.3)
frame.hundredThousandBtn:SetAlpha(0.3)
frame.tenThousandBtn:SetAlpha(0.3)
frame.thousandBtn:SetAlpha(0.3)
frame.hundredBtn:SetAlpha(0.3)
frame.tenBtn:SetAlpha(0.3)
frame.oneBtn:SetAlpha(0.3)
end
LeaPlusLC.SoundByte = 1000000
DimAllBoxes()
frame.millionBtn:SetAlpha(1)
-- Step button handlers
frame.millionBtn:SetScript("OnClick", function()
LeaPlusLC.SoundByte = 1000000
DimAllBoxes()
frame.millionBtn:SetAlpha(1)
end)
frame.hundredThousandBtn:SetScript("OnClick", function()
LeaPlusLC.SoundByte = 100000
DimAllBoxes()
frame.hundredThousandBtn:SetAlpha(1)
end)
frame.tenThousandBtn:SetScript("OnClick", function()
LeaPlusLC.SoundByte = 10000
DimAllBoxes()
frame.tenThousandBtn:SetAlpha(1)
end)
frame.thousandBtn:SetScript("OnClick", function()
LeaPlusLC.SoundByte = 1000
DimAllBoxes()
frame.thousandBtn:SetAlpha(1)
end)
frame.hundredBtn:SetScript("OnClick", function()
LeaPlusLC.SoundByte = 100
DimAllBoxes()
frame.hundredBtn:SetAlpha(1)
end)
frame.tenBtn:SetScript("OnClick", function()
LeaPlusLC.SoundByte = 10
DimAllBoxes()
frame.tenBtn:SetAlpha(1)
end)
frame.oneBtn:SetScript("OnClick", function()
LeaPlusLC.SoundByte = 1
DimAllBoxes()
frame.oneBtn:SetAlpha(1)
end)
-- Final code
LeaPlusLC.MuteFrame = frame
_G["LeaPlusGlobalMutePanel"] = frame
table.insert(UISpecialFrames, "LeaPlusGlobalMutePanel")
end
if LeaPlusLC.MuteFrame:IsShown() then LeaPlusLC.MuteFrame:Hide() else LeaPlusLC.MuteFrame:Show() end
return
elseif str == "tz" then
-- Tazavesh Helper
if arg1 and arg ~= "" then
-- Aggramar's Vault
if not string.find(arg1, "o") or not string.find(arg1, "y") or not string.find(arg1, "p") or not string.find(arg1, "b") then
LeaPlusLC:Print("Valid letters are O (Orange), Y (Yellow), P (Purple), B (Blue).")
return
end
arg1 = arg1:gsub("%w", {["o"] = "ORANGE,", ["y"] = "YELLOW,", ["p"] = "PURPLE,", ["b"] = "BLUE,"})
local a, b, c, d = arg1:match("([^,]+),([^,]+),([^,]+),([^,]+)")
if a and b and c and d then
local chatDestination
if IsInRaid() then
return
elseif IsInGroup(LE_PARTY_CATEGORY_INSTANCE) then
chatDestination = "INSTANCE_CHAT"
elseif IsInGroup(LE_PARTY_CATEGORY_HOME) then
chatDestination = "PARTY"
end
LeaPlusLC:Print("Letters need to be in clockwise order as they appear.")
SendChatMessage("Quickly take orbs to these positions and click.", chatDestination)
SendChatMessage(a .. ": Front left of boss (north)", chatDestination)
SendChatMessage(b .. ": Front right of boss (east)", chatDestination)
SendChatMessage(d .. ": Back left of boss (west)", chatDestination)
SendChatMessage(c .. ": Back right of boss (south)", chatDestination)
end
return
end
-- Myza's Oasis
local target
for i = 1, 40 do
local void, void, void, void, length, expire, void, void, void, spellID = UnitDebuff("player", i)
if spellID then
if spellID == 352125 or spellID == 358911 or spellID == 358912 then
target = "Xy'ghana"
elseif spellID == 352127 or spellID == 358905 or spellID == 358906 then
target = "Xy'aqida"
elseif spellID == 352128 or spellID == 358907 or spellID == 358908 then
target = "Xy'tadir"
elseif spellID == 352129 or spellID == 358915 or spellID == 358916 then
target = "Xy'nara"
elseif spellID == 352130 or spellID == 358900 or spellID == 358901 then
target = "Xy'mal"
elseif spellID == 352131 or spellID == 358917 or spellID == 358918 then
target = "Xy'jahid"
elseif spellID == 352132 or spellID == 358903 or spellID == 358904 then
target = "Xy'kitaab"
elseif spellID == 352133 or spellID == 358913 or spellID == 358914 then
target = "Xy'har"
elseif spellID == 352134 or spellID == 358909 or spellID == 358910 then
target = "Xy'zaro"
-- elseif spellID == 15007 then target = "Ghost" -- Resurrection sickness (debug)
end
end
end
if target and target ~= "" then
LeaPlusLC:ShowSystemEditBox("/tar" .. " " .. target, true)
LeaPlusLC.FactoryEditBox.f:SetText(L["Myza's Oasis"] .. ": " .. target)
end
return
elseif str == "mem" or str == "m" then
-- Show addon panel with memory usage
if LeaPlusLC.ShowMemoryUsage then
LeaPlusLC:ShowMemoryUsage(LeaPlusLC["Page8"], "TOPLEFT", 146, -262)
end
-- Prevent options panel from showing if Blizzard Store is showing
if StoreFrame and StoreFrame:GetAttribute("isshown") then return end
-- Toggle the options panel if game options panel is not showing
if LeaPlusLC:IsPlusShowing() then
LeaPlusLC:HideFrames()
LeaPlusLC:HideConfigPanels()
else
LeaPlusLC:HideFrames()
LeaPlusLC["PageF"]:Show()
end
LeaPlusLC["Page"..LeaPlusLC["LeaStartPage"]]:Show()
return
elseif str == "gossinfo" then
-- Print gossip frame information
if GossipFrame:IsShown() then
local npcName = UnitName("target")
local npcGuid = UnitGUID("target") or nil
if npcName and npcGuid then
local void, void, void, void, void, npcID = strsplit("-", npcGuid)
if npcID then
LeaPlusLC:Print(npcName .. ": |cffffffff" .. npcID)
end
end
LeaPlusLC:Print("Available quests: |cffffffff" .. C_GossipInfo.GetNumAvailableQuests())
LeaPlusLC:Print("Active quests: |cffffffff" .. C_GossipInfo.GetNumActiveQuests())
local gossipInfoTable = C_GossipInfo.GetOptions()
if gossipInfoTable and gossipInfoTable[1] and gossipInfoTable[1].name then
LeaPlusLC:Print("Gossip count: |cffffffff" .. #gossipInfoTable)
LeaPlusLC:Print("Gossip name: |cffffffff" .. gossipInfoTable[1].name)
else
LeaPlusLC:Print("Gossip info: |cffffffff" .. "Nil")
end
if GossipTitleButton1 and GossipTitleButton1:GetText() then
LeaPlusLC:Print("First option: |cffffffff" .. GossipTitleButton1:GetText())
end
-- LeaPlusLC:Print("Gossip text: |cffffffff" .. GetGossipText())
if not IsShiftKeyDown() then
SelectGossipOption(1)
end
else
LeaPlusLC:Print("Gossip frame not open.")
end
return
elseif str == "traits" then
-- Set dragonriding traits
if IsAddOnLoaded("Blizzard_GenericTraitUI") and GenericTraitFrame:IsShown() then
local c = C_Traits.GetConfigIDBySystemID(1)
for count = 1, 10 do
for i, n in ipairs(C_Traits.GetTreeNodes(672)) do
local f = C_Traits.GetNodeInfo(c, n)
if #f.entryIDs < 2 then
-- One trait only
C_Traits.PurchaseRank(c, n)
else
-- Two trait choices
C_Traits.SetSelection(c, n, f.entryIDs[2]) -- 1 for left-side trait, 2 for right-side trait
end
end
end
-- Save changes
C_Traits.CommitConfig(c)
-- Reload to clear everything
ReloadUI()
else
LeaPlusLC:Print("Open the dragonriding trait frame first!")
end
return
elseif str == "admin" then
-- Preset profile (used for testing)
LpEvt:UnregisterAllEvents() -- Prevent changes
wipe(LeaPlusDB) -- Wipe settings
LeaPlusLC:PlayerLogout(true) -- Reset permanent settings
-- Automation
LeaPlusDB["AutomateQuests"] = "On" -- Automate quests
LeaPlusDB["AutoQuestShift"] = "Off" -- Automate quests requires shift
LeaPlusDB["AutoQuestRegular"] = "On" -- Accept regular quests
LeaPlusDB["AutoQuestDaily"] = "On" -- Accept daily quests
LeaPlusDB["AutoQuestWeekly"] = "On" -- Accept weekly quests
LeaPlusDB["AutoQuestCompleted"] = "On" -- Turn-in completed quests
LeaPlusDB["AutoQuestKeyMenu"] = 1 -- Automate quests override key
LeaPlusDB["AutomateGossip"] = "On" -- Automate gossip
LeaPlusDB["AutoAcceptSummon"] = "On" -- Accept summon
LeaPlusDB["AutoAcceptRes"] = "On" -- Accept resurrection
LeaPlusDB["AutoReleasePvP"] = "On" -- Release in PvP
LeaPlusDB["AutoSellJunk"] = "On" -- Sell junk automatically
LeaPlusDB["AutoSellExcludeMyAlts"] = "Off" -- Sell junk exclude gear designed for my alts
LeaPlusDB["AutoSellExcludeList"] = "" -- Sell junk exclusions list
LeaPlusDB["AutoRepairGear"] = "On" -- Repair automatically
-- Social
LeaPlusDB["NoDuelRequests"] = "On" -- Block duels
LeaPlusDB["NoPetDuels"] = "On" -- Block pet battle duels
LeaPlusDB["NoPartyInvites"] = "Off" -- Block party invites
LeaPlusDB["NoFriendRequests"] = "Off" -- Block friend requests
LeaPlusDB["NoSharedQuests"] = "Off" -- Block shared quests
LeaPlusDB["AcceptPartyFriends"] = "On" -- Party from friends
LeaPlusDB["SyncFromFriends"] = "On" -- Sync from friends
LeaPlusDB["AutoConfirmRole"] = "On" -- Queue from friends
LeaPlusDB["InviteFromWhisper"] = "On" -- Invite from whispers
LeaPlusDB["InviteFriendsOnly"] = "On" -- Restrict invites to friends
LeaPlusDB["FriendlyCommunities"] = "On" -- Friendly communities
LeaPlusDB["FriendlyGuild"] = "On" -- Friendly guild
-- Chat
LeaPlusDB["UseEasyChatResizing"] = "On" -- Use easy resizing
LeaPlusDB["NoCombatLogTab"] = "On" -- Hide the combat log
LeaPlusDB["NoChatButtons"] = "On" -- Hide chat buttons
LeaPlusDB["ShowVoiceButtons"] = "On" -- Show voice buttons
LeaPlusDB["ShowChatMenuButton"] = "Off" -- Show chat menu button
LeaPlusDB["NoSocialButton"] = "On" -- Hide social button
LeaPlusDB["UnclampChat"] = "On" -- Unclamp chat frame
LeaPlusDB["MoveChatEditBoxToTop"] = "On" -- Move editbox to top
LeaPlusDB["SetChatFontSize"] = "On" -- Set chat font size
LeaPlusDB["LeaPlusChatFontSize"] = 20 -- Chat font size value
LeaPlusDB["NoStickyChat"] = "On" -- Disable sticky chat
LeaPlusDB["UseArrowKeysInChat"] = "On" -- Use arrow keys in chat
LeaPlusDB["NoChatFade"] = "On" -- Disable chat fade
LeaPlusDB["UnivGroupColor"] = "On" -- Universal group color
LeaPlusDB["RecentChatWindow"] = "On" -- Recent chat window
LeaPlusDB["RecentChatSize"] = 170 -- Recent chat size
LeaPlusDB["MaxChatHstory"] = "Off" -- Increase chat history
LeaPlusDB["FilterChatMessages"] = "On" -- Filter chat messages
LeaPlusDB["BlockSpellLinks"] = "On" -- Block spell links
LeaPlusDB["BlockDrunkenSpam"] = "On" -- Block drunken spam
LeaPlusDB["BlockDuelSpam"] = "On" -- Block duel spam
LeaPlusDB["RestoreChatMessages"] = "On" -- Restore chat messages
-- Text
LeaPlusDB["HideErrorMessages"] = "On" -- Hide error messages
LeaPlusDB["NoHitIndicators"] = "On" -- Hide portrait text
LeaPlusDB["HideKeybindText"] = "On" -- Hide keybind text
LeaPlusDB["HideMacroText"] = "On" -- Hide macro text
LeaPlusDB["MailFontChange"] = "On" -- Resize mail text
LeaPlusDB["LeaPlusMailFontSize"] = 22 -- Mail font size
LeaPlusDB["QuestFontChange"] = "On" -- Resize quest text
LeaPlusDB["LeaPlusQuestFontSize"] = 18 -- Quest font size
-- Interface
LeaPlusDB["MinimapModder"] = "On" -- Enhance minimap
LeaPlusDB["SquareMinimap"] = "On" -- Square minimap
LeaPlusDB["ShowWhoPinged"] = "On" -- Show who pinged
LeaPlusDB["HideMiniAddonMenu"] = "On" -- Hide addon menu
LeaPlusDB["UnclampMinimap"] = "On" -- Unclamp minimap cluster
LeaPlusDB["CombineAddonButtons"] = "On" -- Combine addon buttons
LeaPlusDB["MiniExcludeList"] = "BugSack, Leatrix_Plus" -- Excluded addon list
LeaPlusDB["MiniClusterScale"] = 1 -- Minimap cluster scale
LeaPlusDB["MinimapNoScale"] = "Off" -- Minimap not minimap
LeaPlusDB["MinimapA"] = "TOPRIGHT" -- Minimap anchor
LeaPlusDB["MinimapR"] = "TOPRIGHT" -- Minimap relative
LeaPlusDB["MinimapX"] = 0 -- Minimap X
LeaPlusDB["MinimapY"] = 0 -- Minimap Y
LeaPlusDB["TipModEnable"] = "On" -- Enhance tooltip
LeaPlusDB["TipBackSimple"] = "On" -- Color backdrops
LeaPlusDB["LeaPlusTipSize"] = 1.25 -- Tooltip scale slider
LeaPlusDB["TooltipAnchorMenu"] = 1 -- Tooltip anchor
LeaPlusDB["TipCursorX"] = 0 -- X offset
LeaPlusDB["TipCursorY"] = 0 -- Y offset
LeaPlusDB["EnhanceDressup"] = "On" -- Enhance dressup
LeaPlusDB["DressupWiderPreview"] = "On" -- Enhance dressup wider character preview
LeaPlusDB["DressupMoreZoomOut"] = "Off" -- Enhance dressup increase zoom out distance
LeaPlusDB["DressupTransmogAnim"] = "Off" -- Enhance dressup transmogrify animation control
LeaPlusDB["DressupFasterZoom"] = 3 -- Dressup zoom speed
LeaPlusDB["ShowVolume"] = "On" -- Show volume slider
LeaPlusDB["ShowCooldowns"] = "On" -- Show cooldowns
LeaPlusDB["DurabilityStatus"] = "On" -- Show durability status
LeaPlusDB["ShowPetSaveBtn"] = "On" -- Show pet save button
LeaPlusDB["ShowRaidToggle"] = "On" -- Show raid toggle button
LeaPlusDB["ShowTrainAllButton"] = "On" -- Show train all button
LeaPlusDB["ShowBorders"] = "On" -- Show borders
LeaPlusDB["ShowPlayerChain"] = "On" -- Show player chain
LeaPlusDB["PlayerChainMenu"] = 1 -- Player chain style
LeaPlusDB["ShowReadyTimer"] = "On" -- Show ready timer
LeaPlusDB["ShowWowheadLinks"] = "On" -- Show Wowhead links
LeaPlusDB["WowheadLinkComments"] = "On" -- Show Wowhead links to comments
-- Interface: Manage frames
LeaPlusDB["ManageWidgetTop"] = "On" -- Manage widget top
LeaPlusDB["WidgetTopA"] = "TOP" -- Manage widget top anchor
LeaPlusDB["WidgetTopR"] = "TOP" -- Manage widget top relative
LeaPlusDB["WidgetTopX"] = 0 -- Manage widget top position X
LeaPlusDB["WidgetTopY"] = -432 -- Manage widget top position Y
LeaPlusDB["WidgetTopScale"] = 1.25 -- Manage widget top scale
LeaPlusDB["ManageControl"] = "On" -- Manage control
LeaPlusDB["ControlA"] = "CENTER" -- Manage control anchor
LeaPlusDB["ControlR"] = "CENTER" -- Manage control relative
LeaPlusDB["ControlX"] = 0 -- Manage control position X
LeaPlusDB["ControlY"] = 0 -- Manage control position Y
LeaPlusDB["ControlScale"] = 1.00 -- Manage control scale
LeaPlusDB["ClassColFrames"] = "On" -- Class colored frames
LeaPlusDB["NoAlerts"] = "On" -- Hide alerts
LeaPlusDB["HideBodyguard"] = "On" -- Hide bodyguard window
LeaPlusDB["HideTalkingFrame"] = "On" -- Hide talking frame
LeaPlusDB["HideCleanupBtns"] = "On" -- Hide cleanup buttons
LeaPlusDB["HideBossBanner"] = "On" -- Hide boss banner
LeaPlusDB["HideEventToasts"] = "On" -- Hide event toasts
LeaPlusDB["NoClassBar"] = "On" -- Hide stance bar
LeaPlusDB["NoCommandBar"] = "On" -- Hide order hall bar
LeaPlusDB["NoRestedSleep"] = "On" -- Hide rested sleep
-- System
LeaPlusDB["NoScreenGlow"] = "On" -- Disable screen glow
LeaPlusDB["NoScreenEffects"] = "On" -- Disable screen effects
LeaPlusDB["SetWeatherDensity"] = "On" -- Set weather density
LeaPlusDB["WeatherLevel"] = 0 -- Weather density level
LeaPlusDB["MaxCameraZoom"] = "On" -- Max camera zoom
LeaPlusDB["NoRestedEmotes"] = "On" -- Silence rested emotes
LeaPlusDB["MuteGameSounds"] = "On" -- Mute game sounds
LeaPlusDB["MuteMountSounds"] = "On" -- Mute mount sounds
LeaPlusDB["MuteCustomSounds"] = "On" -- Mute custom sounds
LeaPlusDB["MuteCustomList"] = "" -- Mute custom sounds list
LeaPlusDB["NoPetAutomation"] = "On" -- Disable pet automation
LeaPlusDB["CharAddonList"] = "On" -- Show character addons
LeaPlusDB["NoRaidRestrictions"] = "On" -- Remove raid restrictions
LeaPlusDB["NoConfirmLoot"] = "On" -- Disable loot warnings
LeaPlusDB["FasterLooting"] = "On" -- Faster auto loot
LeaPlusDB["LeaPlusFasterLootDelay"] = 0.3 -- Faster loot delay
LeaPlusDB["FasterMovieSkip"] = "On" -- Faster movie skip
LeaPlusDB["CombatPlates"] = "On" -- Combat plates
LeaPlusDB["EasyItemDestroy"] = "On" -- Easy item destroy
LeaPlusDB["LockoutSharing"] = "On" -- Lockout sharing
LeaPlusDB["NoTransforms"] = "On" -- Remove transforms
-- Function to assign cooldowns
local function setIcon(pclass, pspec, sp1, pt1, sp2, pt2, sp3, pt3, sp4, pt4, sp5, pt5)
-- Set spell ID
if sp1 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R1Idn"] = "" else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R1Idn"] = sp1 end
if sp2 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R2Idn"] = "" else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R2Idn"] = sp2 end
if sp3 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R3Idn"] = "" else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R3Idn"] = sp3 end
if sp4 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R4Idn"] = "" else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R4Idn"] = sp4 end
if sp5 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R5Idn"] = "" else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R5Idn"] = sp5 end
-- Set pet checkbox
if pt1 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R1Pet"] = false else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R1Pet"] = true end
if pt2 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R2Pet"] = false else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R2Pet"] = true end
if pt3 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R3Pet"] = false else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R3Pet"] = true end
if pt4 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R4Pet"] = false else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R4Pet"] = true end
if pt5 == 0 then LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R5Pet"] = false else LeaPlusDB["Cooldowns"][pclass]["S" .. pspec .. "R5Pet"] = true end
end
-- Create main table
LeaPlusDB["Cooldowns"] = {}
-- Create class tables
for index = 1, GetNumClasses() do
local classDisplayName, classTag, classID = GetClassInfo(index)
LeaPlusDB["Cooldowns"][classTag] = {}
end
-- Assign cooldowns
setIcon("WARRIOR", 1, --[[Arms]] --[[1]] 32216, 0, --[[2]] 209574, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) -- Victory Rush, Shattered Defences
setIcon("WARRIOR", 2, --[[Fury]] --[[1]] 32216, 0, --[[2]] 184362, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) -- Victory Rush, Enrage
setIcon("WARRIOR", 3, --[[Protection]] --[[1]] 32216, 0, --[[2]] 190456, 0, --[[3]] 132404, 0, --[[4]] 0, 0, --[[5]] 0, 0) -- Victory Rush, Ignore Pain, Shield Block
setIcon("PALADIN", 1, --[[Holy]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 203539, 0, --[[5]] 203538, 0) -- nil, nil, nil, Wisdom, Kings
setIcon("PALADIN", 2, --[[Protection]] --[[1]] 132403, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) -- Shield of the Righteous, nil, nil, nil, nil
setIcon("PALADIN", 3, --[[Retribution]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 203539, 0, --[[5]] 203538, 0) -- nil, nil, nil, Wisdom, Kings
setIcon("SHAMAN", 1, --[[Elemental]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 215864, 0, --[[5]] 546, 0) -- nil, nil, nil, Rainfall, Water Walking
setIcon("SHAMAN", 2, --[[Enhancement]] --[[1]] 194084, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 215864, 0, --[[5]] 546, 0) -- Flametongue, nil, nil, Rainfall, Water Walking
setIcon("SHAMAN", 3, --[[Resto]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 215864, 0, --[[5]] 546, 0) -- nil, nil, nil, Rainfall, Water Walking
setIcon("ROGUE", 1, --[[Assassination]] --[[1]] 1784, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 2823, 0, --[[5]] 3408, 0) -- Stealth, nil, nil, Deadly Poison, Crippling Poison
setIcon("ROGUE", 2, --[[Outlaw]] --[[1]] 1784, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 2823, 0, --[[5]] 3408, 0) -- Stealth, nil, nil, Deadly Poison, Crippling Poison
setIcon("ROGUE", 3, --[[Subtetly]] --[[1]] 1784, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 2823, 0, --[[5]] 3408, 0) -- Stealth, nil, nil, Deadly Poison, Crippling Poison
setIcon("DRUID", 1, --[[Balance]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0)
setIcon("DRUID", 2, --[[Feral]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0)
setIcon("DRUID", 3, --[[Guardian]] --[[1]] 192081, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) -- Ironfur
setIcon("DRUID", 4, --[[Resto]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0)
setIcon("MONK", 1, --[[Brewmaster]] --[[1]] 125359, 0, --[[2]] 115307, 0, --[[3]] 124274, 0, --[[4]] 124273, 0, --[[5]] 116781, 0) -- Tiger Power, Shuffle, Moderate Stagger, Heavy Stagger, Legacy of the White Tiger
setIcon("MONK", 2, --[[Mistweaver]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0)
setIcon("MONK", 3, --[[Windwalker]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0)
setIcon("MAGE", 1, --[[Arcane]] --[[1]] 235450, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 1459, 0) -- Prismatic Barrier, nil, nil, nil, Arcane Intellect
setIcon("MAGE", 2, --[[Fire]] --[[1]] 235313, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 1459, 0) -- Blazing Barrier, nil, nil, nil, Arcane Intellect
setIcon("MAGE", 3, --[[Frost]] --[[1]] 11426, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 1459, 0) -- Ice Barrier, nil, nil, nil, Arcane Intellect
setIcon("WARLOCK", 1, --[[Affliction]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0)
setIcon("WARLOCK", 2, --[[Demonology]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0)
setIcon("WARLOCK", 3, --[[Destruction]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0)
setIcon("PRIEST", 1, --[[Discipline]] --[[1]] 17, 0, --[[2]] 194384, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) -- Power Word: Shield
setIcon("PRIEST", 2, --[[Holy]] --[[1]] 17, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) -- Power Word: Shield
setIcon("PRIEST", 3, --[[Shadow]] --[[1]] 17, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0) -- Power Word: Shield
setIcon("HUNTER", 1, --[[Beast Mastery]] --[[1]] 136, 1, --[[2]] 118455, 1, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 5384, 0) -- Mend Pet, nil, nil, nil, Feign Death
setIcon("HUNTER", 2, --[[Marksmanship]] --[[1]] 136, 1, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 5384, 0) -- Mend Pet, nil, nil, nil, Feign Death
setIcon("HUNTER", 3, --[[Survival]] --[[1]] 136, 1, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 5384, 0) -- Mend Pet, nil, nil, nil, Feign Death
setIcon("DEATHKNIGHT", 1, --[[Blood]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 195181, 0) -- nil, nil, nil, nil, Bone Shield
setIcon("DEATHKNIGHT", 2, --[[Frost]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0)
setIcon("DEATHKNIGHT", 3, --[[Unholy]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0)
setIcon("DEMONHUNTER", 1, --[[Havoc]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 0, 0)
setIcon("DEMONHUNTER", 2, --[[Vengeance]] --[[1]] 0, 0, --[[2]] 0, 0, --[[3]] 0, 0, --[[4]] 0, 0, --[[5]] 203819, 0) -- nil, nil, nil, nil, Demon Spikes
-- Mute game sounds (LeaPlusLC["MuteGameSounds"])
for k, v in pairs(LeaPlusLC["muteTable"]) do
LeaPlusDB[k] = "On"
end
LeaPlusDB["MuteReady"] = "Off" -- Mute ready check
LeaPlusDB["MuteVigor"] = "Off" -- Mute vigor
-- Mute mount sounds (LeaPlusLC["MuteMountSounds"])
for k, v in pairs(LeaPlusLC["mountTable"]) do
LeaPlusDB[k] = "On"
end
-- Remove transforms (LeaPlusLC["NoTransforms"])
for k, v in pairs(LeaPlusLC["transTable"]) do
LeaPlusDB[k] = "On"
end
-- Set chat font sizes
for i = 1, 50 do if _G["ChatFrame" .. i] then FCF_SetChatWindowFontSize(self, _G["ChatFrame" .. i], 18) end end
-- Reload
ReloadUI()
else
LeaPlusLC:Print("Invalid parameter.")
end
return
else
-- Prevent options panel from showing if Blizzard Store is showing
if StoreFrame and StoreFrame:GetAttribute("isshown") then return end
-- Toggle the options panel if game options panel is not showing
if LeaPlusLC:IsPlusShowing() then
LeaPlusLC:HideFrames()
LeaPlusLC:HideConfigPanels()
else
LeaPlusLC:HideFrames()
LeaPlusLC["PageF"]:Show()
end
LeaPlusLC["Page"..LeaPlusLC["LeaStartPage"]]:Show()
end
end
-- Slash command for global function
_G.SLASH_Leatrix_Plus1 = "/ltp"
_G.SLASH_Leatrix_Plus2 = "/leaplus"
SlashCmdList["Leatrix_Plus"] = function(self)
-- Run slash command function
LeaPlusLC:SlashFunc(self)
end
-- Slash command for UI reload
_G.SLASH_LEATRIX_PLUS_RL1 = "/rl"
SlashCmdList["LEATRIX_PLUS_RL"] = function()
ReloadUI()
end
----------------------------------------------------------------------
-- L90: Create options panel pages (no content yet)
----------------------------------------------------------------------
-- Function to add menu button
function LeaPlusLC:MakeMN(name, text, parent, anchor, x, y, width, height)
local mbtn = CreateFrame("Button", nil, parent)
LeaPlusLC[name] = mbtn
mbtn:Show();
mbtn:SetSize(width, height)
mbtn:SetAlpha(1.0)
mbtn:SetPoint(anchor, x, y)
mbtn.t = mbtn:CreateTexture(nil, "BACKGROUND")
mbtn.t:SetAllPoints()
mbtn.t:SetColorTexture(0.3, 0.3, 0.00, 0.8)
mbtn.t:SetAlpha(0.7)
mbtn.t:Hide()
mbtn.s = mbtn:CreateTexture(nil, "BACKGROUND")
mbtn.s:SetAllPoints()
mbtn.s:SetColorTexture(0.3, 0.3, 0.00, 0.8)
mbtn.s:Hide()
mbtn.f = mbtn:CreateFontString(nil, 'ARTWORK', 'GameFontNormal')
mbtn.f:SetPoint('LEFT', 16, 0)
mbtn.f:SetText(L[text])
mbtn:SetScript("OnEnter", function()
mbtn.t:Show()
end)
mbtn:SetScript("OnLeave", function()
mbtn.t:Hide()
end)
return mbtn, mbtn.s
end
-- Function to create individual options panel pages
function LeaPlusLC:MakePage(name, title, menu, menuname, menuparent, menuanchor, menux, menuy, menuwidth, menuheight)
-- Create frame
local oPage = CreateFrame("Frame", nil, LeaPlusLC["PageF"])
LeaPlusLC[name] = oPage
oPage:SetAllPoints(LeaPlusLC["PageF"])
oPage:Hide()
-- Add page title
oPage.s = oPage:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge')
oPage.s:SetPoint('TOPLEFT', 146, -16)
oPage.s:SetText(L[title])
-- Add menu item if needed
if menu then
LeaPlusLC[menu], LeaPlusLC[menu .. ".s"] = LeaPlusLC:MakeMN(menu, menuname, menuparent, menuanchor, menux, menuy, menuwidth, menuheight)
LeaPlusLC[name]:SetScript("OnShow", function() LeaPlusLC[menu .. ".s"]:Show(); end)
LeaPlusLC[name]:SetScript("OnHide", function() LeaPlusLC[menu .. ".s"]:Hide(); end)
end
return oPage
end
-- Create options pages
LeaPlusLC["Page0"] = LeaPlusLC:MakePage("Page0", "Home" , "LeaPlusNav0", "Home" , LeaPlusLC["PageF"], "TOPLEFT", 16, -72, 112, 20)
LeaPlusLC["Page1"] = LeaPlusLC:MakePage("Page1", "Automation" , "LeaPlusNav1", "Automation" , LeaPlusLC["PageF"], "TOPLEFT", 16, -112, 112, 20)
LeaPlusLC["Page2"] = LeaPlusLC:MakePage("Page2", "Social" , "LeaPlusNav2", "Social" , LeaPlusLC["PageF"], "TOPLEFT", 16, -132, 112, 20)
LeaPlusLC["Page3"] = LeaPlusLC:MakePage("Page3", "Chat" , "LeaPlusNav3", "Chat" , LeaPlusLC["PageF"], "TOPLEFT", 16, -152, 112, 20)
LeaPlusLC["Page4"] = LeaPlusLC:MakePage("Page4", "Text" , "LeaPlusNav4", "Text" , LeaPlusLC["PageF"], "TOPLEFT", 16, -172, 112, 20)
LeaPlusLC["Page5"] = LeaPlusLC:MakePage("Page5", "Interface" , "LeaPlusNav5", "Interface" , LeaPlusLC["PageF"], "TOPLEFT", 16, -192, 112, 20)
LeaPlusLC["Page6"] = LeaPlusLC:MakePage("Page6", "Frames" , "LeaPlusNav6", "Frames" , LeaPlusLC["PageF"], "TOPLEFT", 16, -212, 112, 20)
LeaPlusLC["Page7"] = LeaPlusLC:MakePage("Page7", "System" , "LeaPlusNav7", "System" , LeaPlusLC["PageF"], "TOPLEFT", 16, -232, 112, 20)
LeaPlusLC["Page8"] = LeaPlusLC:MakePage("Page8", "Settings" , "LeaPlusNav8", "Settings" , LeaPlusLC["PageF"], "TOPLEFT", 16, -272, 112, 20)
LeaPlusLC["Page9"] = LeaPlusLC:MakePage("Page9", "Media" , "LeaPlusNav9", "Media" , LeaPlusLC["PageF"], "TOPLEFT", 16, -292, 112, 20)
-- Page navigation mechanism
for i = 0, LeaPlusLC["NumberOfPages"] do
LeaPlusLC["LeaPlusNav"..i]:SetScript("OnClick", function()
LeaPlusLC:HideFrames()
LeaPlusLC["PageF"]:Show()
LeaPlusLC["Page"..i]:Show()
LeaPlusLC["LeaStartPage"] = i
end)
end
-- Use a variable to contain the page number (makes it easier to move options around)
local pg;
----------------------------------------------------------------------
-- LC0: Welcome
----------------------------------------------------------------------
pg = "Page0"
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Welcome to Leatrix Plus.", 146, -72)
LeaPlusLC:MakeWD(LeaPlusLC[pg], "To begin, choose an options page.", 146, -92)
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Support", 146, -132);
LeaPlusLC:MakeWD(LeaPlusLC[pg], "www.leatrix.com", 146, -152)
----------------------------------------------------------------------
-- LC1: Automation
----------------------------------------------------------------------
pg = "Page1"
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Character" , 146, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutomateQuests" , "Automate quests" , 146, -92, false, "If checked, quests will be selected, accepted and turned-in automatically.|n|nQuests which require gold, currency, a crafting reagent or an account-bound item will not be turned-in automatically.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutomateGossip" , "Automate gossip" , 146, -112, false, "If checked, you can hold down the alt key while opening a gossip window to automatically select a single gossip option.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoAcceptSummon" , "Accept summon" , 146, -132, false, "If checked, summon requests will be accepted automatically unless you are in combat.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoAcceptRes" , "Accept resurrection" , 146, -152, false, "If checked, resurrection requests will be accepted automatically.|n|nResurrection requests from a Brazier of Awakening or a Failure Detection Pylon will not be accepted automatically.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoReleasePvP" , "Release in PvP" , 146, -172, false, "If checked, you will release automatically after you die in Ashran, Tol Barad (PvP), Wintergrasp or any battleground.|n|nYou will not release automatically if you have the ability to self-resurrect (soulstone, reincarnation, etc).")
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Vendors" , 340, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoSellJunk" , "Sell junk automatically" , 340, -92, true, "If checked, all grey items in your bags will be sold automatically when you visit a merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoRepairGear" , "Repair automatically" , 340, -112, false, "If checked, your gear will be repaired automatically when you visit a suitable merchant.|n|nYou can hold the shift key down when you talk to a merchant to override this setting.")
LeaPlusLC:CfgBtn("AutomateQuestsBtn", LeaPlusCB["AutomateQuests"])
LeaPlusLC:CfgBtn("AutoAcceptResBtn", LeaPlusCB["AutoAcceptRes"])
LeaPlusLC:CfgBtn("AutoReleasePvPBtn", LeaPlusCB["AutoReleasePvP"])
LeaPlusLC:CfgBtn("AutoSellJunkBtn", LeaPlusCB["AutoSellJunk"])
LeaPlusLC:CfgBtn("AutoRepairBtn", LeaPlusCB["AutoRepairGear"])
----------------------------------------------------------------------
-- LC2: Social
----------------------------------------------------------------------
pg = "Page2"
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Blocks" , 146, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoDuelRequests" , "Block duels" , 146, -92, false, "If checked, duel requests will be blocked unless the player requesting the duel is a friend.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoPetDuels" , "Block pet battle duels" , 146, -112, false, "If checked, pet battle duel requests will be blocked unless the player requesting the duel is a friend.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoPartyInvites" , "Block party invites" , 146, -132, false, "If checked, party invitations will be blocked unless the player inviting you is a friend.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoFriendRequests" , "Block friend requests" , 146, -152, false, "If checked, BattleTag and Real ID friend requests will be automatically declined.|n|nEnabling this option will automatically decline any pending requests.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoSharedQuests" , "Block shared quests" , 146, -172, false, "If checked, shared quests will be declined unless the player sharing the quest is a friend.")
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Groups" , 340, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "AcceptPartyFriends" , "Party from friends" , 340, -92, false, "If checked, party invitations from friends will be automatically accepted unless you are queued in Dungeon Finder.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "SyncFromFriends" , "Sync from friends" , 340, -112, false, "If checked, party sync requests from friends will be automatically accepted.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "AutoConfirmRole" , "Queue from friends" , 340, -132, false, "If checked, requests initiated by your party leader to join the Dungeon Finder queue will be automatically accepted if the party leader is a friend.|n|nThis option requires that you have selected a role for your character in the Dungeon Finder window.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "InviteFromWhisper" , "Invite from whispers" , 340, -152, false, L["If checked, a group invite will be sent to anyone who whispers you with a set keyword as long as you are ungrouped, group leader or raid assistant and not queued for a dungeon or raid.|n|nFriends who message the keyword using Battle.net will not be sent a group invite if they are appearing offline. They need to either change their online status or use character whispers."] .. "|n|n" .. L["Keyword"] .. ": |cffffffff" .. "dummy" .. "|r")
-- Show footer
LeaPlusLC:MakeFT(LeaPlusLC[pg], "For all of the social options above, you can treat guild members and members of your communities as friends too.", 146, 380, 96)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "FriendlyGuild" , "Guild" , 146, -282, false, "If checked, members of your guild will be treated as friends for all of the options on this page.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "FriendlyCommunities" , "Communities" , 340, -282, false, "If checked, members of your communities will be treated as friends for all of the options on this page.")
if LeaPlusCB["FriendlyGuild"].f:GetStringWidth() > 90 then
LeaPlusCB["FriendlyGuild"].f:SetWidth(90)
end
if LeaPlusCB["FriendlyCommunities"].f:GetStringWidth() > 90 then
LeaPlusCB["FriendlyCommunities"].f:SetWidth(90)
end
LeaPlusCB["FriendlyCommunities"]:ClearAllPoints()
LeaPlusCB["FriendlyCommunities"]:SetPoint("LEFT", LeaPlusCB["FriendlyGuild"], "RIGHT", LeaPlusCB["FriendlyGuild"].f:GetWidth() + 6, 0)
LeaPlusLC:CfgBtn("InvWhisperBtn", LeaPlusCB["InviteFromWhisper"])
----------------------------------------------------------------------
-- LC3: Chat
----------------------------------------------------------------------
pg = "Page3"
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Chat Frame" , 146, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "UseEasyChatResizing" , "Use easy resizing" , 146, -92, true, "If checked, dragging the General chat tab will expand the chat frame upwards.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoCombatLogTab" , "Hide the combat log" , 146, -112, true, "If checked, the combat log will be hidden.|n|nThe combat log must be docked in order for this option to work.|n|nIf the combat log is undocked, you can dock it by dragging the tab (and reloading your UI) or by resetting the chat windows (from the chat menu).")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoChatButtons" , "Hide chat buttons" , 146, -132, true, "If checked, chat frame buttons will be hidden.|n|nClicking chat tabs will automatically show the latest messages.|n|nUse the mouse wheel to scroll through the chat history. Hold down SHIFT for page jump or CTRL to jump to the top or bottom of the chat history.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoSocialButton" , "Hide social button" , 146, -152, true, "If checked, the social button and quick-join notification will be hidden.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "UnclampChat" , "Unclamp chat frame" , 146, -172, true, "If checked, you will be able to drag the chat frame to the edge of the screen.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "MoveChatEditBoxToTop" , "Move editbox to top" , 146, -192, true, "If checked, the editbox will be moved to the top of the chat frame.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "SetChatFontSize" , "Set chat font size" , 146, -212, true, "If checked, you will be able to set the chat font size.|n|nThis option offers a greater range of chat font sizes than the default UI and your chosen chat font size is saved account-wide.|n|nNote that enabling this option will prevent you from using the default UI to change the chat font size.")
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Mechanics" , 340, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoStickyChat" , "Disable sticky chat" , 340, -92, true, "If checked, sticky chat will be disabled.|n|nNote that this does not apply to temporary chat windows.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "UseArrowKeysInChat" , "Use arrow keys in chat" , 340, -112, true, "If checked, you can press the arrow keys to move the insertion point left and right in the chat frame.|n|nIf unchecked, the arrow keys will use the default keybind setting.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoChatFade" , "Disable chat fade" , 340, -132, true, "If checked, chat text will not fade out after a time period.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "UnivGroupColor" , "Universal group color" , 340, -152, false, "If checked, raid chat and instance chat will both be colored blue (to match the default party chat color).")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "RecentChatWindow" , "Recent chat window" , 340, -172, true, "If checked, you can hold down the control key and click a chat tab to view recent chat in a copy-friendly window.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "MaxChatHstory" , "Increase chat history" , 340, -192, true, "If checked, your chat history will increase to 4096 lines. If unchecked, the default will be used (128 lines).|n|nEnabling this option may prevent some chat text from showing during login.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "FilterChatMessages" , "Filter chat messages" , 340, -212, true, "If checked, you can block spell links, drunken spam and duel spam.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "RestoreChatMessages" , "Restore chat messages" , 340, -232, true, "If checked, recent chat will be restored when you reload your interface.")
LeaPlusLC:CfgBtn("NoChatButtonsBtn", LeaPlusCB["NoChatButtons"])
LeaPlusLC:CfgBtn("SetChatFontSizeBtn", LeaPlusCB["SetChatFontSize"])
LeaPlusLC:CfgBtn("FilterChatMessagesBtn", LeaPlusCB["FilterChatMessages"])
----------------------------------------------------------------------
-- LC4: Text
----------------------------------------------------------------------
pg = "Page4"
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Visibility" , 146, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideErrorMessages" , "Hide error messages" , 146, -92, true, "If checked, most error messages (such as 'Not enough rage') will not be shown. Some important errors are excluded.|n|nIf you have the minimap button enabled, you can hold down the alt key and click it to toggle error messages without affecting this setting.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoHitIndicators" , "Hide portrait numbers" , 146, -112, true, "If checked, damage and healing numbers in the player and pet portrait frames will be hidden.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideZoneText" , "Hide zone text" , 146, -132, true, "If checked, zone text will not be shown (eg. 'Ironforge').")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideKeybindText" , "Hide keybind text" , 146, -152, true, "If checked, keybind text will not be shown on action buttons.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideMacroText" , "Hide macro text" , 146, -172, true, "If checked, macro text will not be shown on action buttons.")
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Text Size" , 340, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "MailFontChange" , "Resize mail text" , 340, -92, true, "If checked, you will be able to change the font size of standard mail text.|n|nThis does not affect mail created using templates (such as auction house invoices).")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "QuestFontChange" , "Resize quest text" , 340, -112, true, "If checked, you will be able to change the font size of quest text.|n|nEnabling this option will also change the text size of other frames which inherit the same font (such as the Dungeon Finder frame).")
LeaPlusLC:CfgBtn("MailTextBtn", LeaPlusCB["MailFontChange"])
LeaPlusLC:CfgBtn("QuestTextBtn", LeaPlusCB["QuestFontChange"])
----------------------------------------------------------------------
-- LC5: Interface
----------------------------------------------------------------------
pg = "Page5"
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Enhancements" , 146, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "MinimapModder" , "Enhance minimap" , 146, -92, true, "If checked, you will be able to customise the minimap.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "TipModEnable" , "Enhance tooltip" , 146, -112, true, "If checked, the tooltip will be color coded and you will be able to modify the tooltip layout and scale.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "EnhanceDressup" , "Enhance dressup" , 146, -132, true, "If checked, gear toggle buttons will be added to the dressup frame and model positioning controls will be removed.")
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Extras" , 340, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowVolume" , "Show volume slider" , 340, -92, true, "If checked, a master volume slider will be shown in the character frame.|n|nThe volume slider can be placed in either of two locations in the character frame. To toggle between them, hold the shift key down and right-click the slider.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowCooldowns" , "Show cooldowns" , 340, -112, true, "If checked, you will be able to place up to five beneficial cooldown icons above the target frame.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "DurabilityStatus" , "Show durability status" , 340, -132, true, "If checked, a button will be added to the character frame which will show your equipped item durability when you hover the pointer over it.|n|nIn addition, an overall percentage will be shown in the chat frame when you die.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowPetSaveBtn" , "Show pet save button" , 340, -152, true, "If checked, you will be able to save your current battle pet team (including abilities) to a single command.|n|nA button will be added to the Pet Journal. Clicking the button will toggle showing the assignment command for your current team. Pressing CTRL/C will copy the command to memory.|n|nYou can then paste the command (with CTRL/V) into the chat window or a macro to instantly assign your team.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowRaidToggle" , "Show raid button" , 340, -172, true, "If checked, the button to toggle the raid container frame will be shown just above the raid management frame (left side of the screen) instead of in the raid management frame itself.|n|nThis allows you to toggle the raid container frame without needing to open the raid management frame.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowTrainAllButton" , "Show train all button" , 340, -192, true, "If checked, a button will be added to the skill trainer frame which will allow you to train all available skills instantly.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowBorders" , "Show borders" , 340, -212, true, "If checked, you will be able to show customisable borders around the edges of the screen.|n|nThe borders are placed on top of the game world but under the UI so you can place UI elements over them.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowPlayerChain" , "Show player chain" , 340, -232, true, "If checked, you will be able to show a rare, elite or rare elite chain around the player frame.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowReadyTimer" , "Show ready timer" , 340, -252, true, "If checked, a timer will be shown under the dungeon ready frame and the PvP encounter ready frame so that you know how long you have left to click the enter button.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowWowheadLinks" , "Show Wowhead links" , 340, -272, true, "If checked, Wowhead links will be shown in the world map frame and the achievements frame.")
LeaPlusLC:CfgBtn("ModMinimapBtn", LeaPlusCB["MinimapModder"])
LeaPlusLC:CfgBtn("MoveTooltipButton", LeaPlusCB["TipModEnable"])
LeaPlusLC:CfgBtn("EnhanceDressupBtn", LeaPlusCB["EnhanceDressup"])
LeaPlusLC:CfgBtn("CooldownsButton", LeaPlusCB["ShowCooldowns"])
LeaPlusLC:CfgBtn("ModBordersBtn", LeaPlusCB["ShowBorders"])
LeaPlusLC:CfgBtn("ModPlayerChain", LeaPlusCB["ShowPlayerChain"])
LeaPlusLC:CfgBtn("ShowWowheadLinksBtn", LeaPlusCB["ShowWowheadLinks"])
----------------------------------------------------------------------
-- LC6: Frames
----------------------------------------------------------------------
pg = "Page6"
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Features" , 146, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageWidgetTop" , "Manage widget top" , 146, -92, true, "If checked, you will be able to change the position and scale of the widget top frame.|n|nThe widget top frame is commonly used for showing PvP scores and tracking objectives.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageControl" , "Manage control" , 146, -112, true, "If checked, you will be able to change the position and scale of the loss of control frame.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ClassColFrames" , "Class colored frames" , 146, -132, true, "If checked, class coloring will be used in the player frame, target frame and focus frame.")
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Visibility" , 340, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoAlerts" , "Hide alerts" , 340, -92, true, "If checked, alert frames will not be shown.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideBodyguard" , "Hide bodyguard gossip" , 340, -112, true, "If checked, the gossip window will not be shown when you talk to an active garrison bodyguard.|n|nYou can hold the shift key down when you talk to a bodyguard to override this setting.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideTalkingFrame" , "Hide talking frame" , 340, -132, true, "If checked, the talking frame will not be shown.|n|nThe talking frame normally appears in the lower portion of the screen when certain NPCs communicate with you.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideCleanupBtns" , "Hide clean-up buttons" , 340, -152, true, "If checked, the backpack clean-up button and the bank frame clean-up button will not be shown.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideBossBanner" , "Hide boss banner" , 340, -172, true, "If checked, the boss banner will not be shown.|n|nThe boss banner appears when a boss is defeated. It shows the name of the boss and the loot that was distributed.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "HideEventToasts" , "Hide event toasts" , 340, -192, true, "If checked, event toasts will not be shown.|n|nEvent toasts are used for encounter objectives, level-ups, pet battle rewards, etc.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoClassBar" , "Hide stance bar" , 340, -212, true, "If checked, the stance bar will not be shown.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoCommandBar" , "Hide order hall bar" , 340, -232, true, "If checked, the order hall command bar will not be shown.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoRestedSleep" , "Hide rested sleep" , 340, -252, true, "If checked, the player frame rested sleep animation will not be shown.")
LeaPlusLC:CfgBtn("ManageWidgetTopButton", LeaPlusCB["ManageWidgetTop"])
LeaPlusLC:CfgBtn("ManageControlButton", LeaPlusCB["ManageControl"])
LeaPlusLC:CfgBtn("ClassColFramesBtn", LeaPlusCB["ClassColFrames"])
----------------------------------------------------------------------
-- LC7: System
----------------------------------------------------------------------
pg = "Page7"
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Graphics and Sound" , 146, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoScreenGlow" , "Disable screen glow" , 146, -92, false, "If checked, the screen glow will be disabled.|n|nEnabling this option will also disable the drunken haze effect.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoScreenEffects" , "Disable screen effects" , 146, -112, false, "If checked, the grey screen of death, the netherworld effect and the Cloak of Ven'ari effect will be disabled.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "SetWeatherDensity" , "Set weather density" , 146, -132, false, "If checked, you will be able to set the density of weather effects.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "MaxCameraZoom" , "Max camera zoom" , 146, -152, false, "If checked, you will be able to zoom out to a greater distance.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoRestedEmotes" , "Silence rested emotes" , 146, -172, true, "If checked, emote sounds will be silenced while your character is:|n|n- resting|n- in a pet battle|n- at the Halfhill Market|n- at the Grim Guzzler|n|nEmote sounds will be enabled when none of the above apply.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "MuteGameSounds" , "Mute game sounds" , 146, -192, false, "If checked, you will be able to mute a selection of game sounds.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "MuteMountSounds" , "Mute mount sounds" , 146, -212, false, "If checked, you will be able to mute a selection of mount sounds.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "MuteCustomSounds" , "Mute custom sounds" , 146, -232, false, "If checked, you will be able to mute your own choice of sounds.")
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Game Options" , 340, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "CharAddonList" , "Show character addons" , 340, -92, true, "If checked, the addon list (accessible from the game menu) will show character based addons by default.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoPetAutomation" , "Disable pet automation" , 340, -112, true, "If checked, battle pets which are automatically summoned will be dismissed within a few seconds.|n|nThis includes dragging a pet onto the first team slot in the pet journal and entering a battle pet team save command.|n|nNote that pets which are automatically summoned during combat will be dismissed when combat ends.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoRaidRestrictions" , "Remove raid restrictions" , 340, -132, false, "If checked, converting a party group to a raid group will succeed even if there are low level characters in the group.|n|nEveryone in the group needs to have Leatrix Plus installed with this option enabled.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoConfirmLoot" , "Disable loot warnings" , 340, -152, false, "If checked, confirmations will no longer appear when you choose a loot roll option or attempt to sell or mail a tradable item.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "FasterLooting" , "Faster auto loot" , 340, -172, true, "If checked, the amount of time it takes to auto loot creatures will be significantly reduced.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "FasterMovieSkip" , "Faster movie skip" , 340, -192, true, "If checked, you will be able to cancel cinematics without being prompted for confirmation.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "CombatPlates" , "Combat plates" , 340, -212, true, "If checked, enemy nameplates will be shown during combat and hidden when combat ends.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "EasyItemDestroy" , "Easy item destroy" , 340, -232, true, "If checked, you will no longer need to type delete when destroying a superior quality item.|n|nIn addition, item links will be shown in all item destroy confirmation windows.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "LockoutSharing" , "Lockout sharing" , 340, -252, true, "If checked, the 'Display only character achievements to others' setting in the game options panel ('Social' menu) will be permanently checked and locked.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoTransforms" , "Remove transforms" , 340, -272, false, "If checked, you will be able to have certain transforms removed automatically when they are applied to your character.|n|nYou can choose the transforms in the configuration panel.|n|nExamples include Weighted Jack-o'-Lantern and Hallowed Wand.|n|nTransforms applied during combat will be removed when combat ends.")
LeaPlusLC:CfgBtn("SetWeatherDensityBtn", LeaPlusCB["SetWeatherDensity"])
LeaPlusLC:CfgBtn("MuteGameSoundsBtn", LeaPlusCB["MuteGameSounds"])
LeaPlusLC:CfgBtn("MuteMountSoundsBtn", LeaPlusCB["MuteMountSounds"])
LeaPlusLC:CfgBtn("MuteCustomSoundsBtn", LeaPlusCB["MuteCustomSounds"])
LeaPlusLC:CfgBtn("FasterLootingBtn", LeaPlusCB["FasterLooting"])
LeaPlusLC:CfgBtn("NoTransformsBtn", LeaPlusCB["NoTransforms"])
----------------------------------------------------------------------
-- LC8: Settings
----------------------------------------------------------------------
pg = "Page8"
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Addon" , 146, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowMinimapIcon" , "Show minimap button" , 146, -92, false, "If checked, a minimap button will be available.|n|nClick - Toggle options panel.|n|nSHIFT-click - Toggle music.|n|nCTRL-click - Toggle minimap target tracking.|n|nALT-click - Toggle errors (if enabled).|n|nCTRL/SHIFT-click - Toggle Zygor (if installed).|n|nCTRL/ALT-click - Toggle windowed mode.")
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Scale", 340, -72)
LeaPlusLC:MakeSL(LeaPlusLC[pg], "PlusPanelScale", "Drag to set the scale of the Leatrix Plus panel.", 1, 2, 0.1, 340, -92, "%.1f")
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Transparency", 340, -132)
LeaPlusLC:MakeSL(LeaPlusLC[pg], "PlusPanelAlpha", "Drag to set the transparency of the Leatrix Plus panel.", 0, 1, 0.1, 340, -152, "%.1f")