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.

11653 lines
593 KiB

----------------------------------------------------------------------
-- Leatrix Plus 9.1.01 (7th July 2021)
----------------------------------------------------------------------
-- 01:Functions 20:Live 50:RunOnce 70:Logout
-- 02:Locks 30:Isolated 60:Events 80:Commands
-- 03:Restarts 40:Player 62:Profile 90:Panel
----------------------------------------------------------------------
-- Leatrix Plus
----------------------------------------------------------------------
-- Create global table
_G.LeaPlusDB = _G.LeaPlusDB or {}
-- Create locals
local LeaPlusLC, LeaPlusCB, LeaDropList, LeaConfigList = {}, {}, {}, {}
local ClientVersion = GetBuildInfo()
local GameLocale = GetLocale()
local void
-- Version
LeaPlusLC["AddonVer"] = "9.1.01"
-- 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 < 90000 then
-- Game client is Wow Classic
C_Timer.After(2, function()
print(L["LEATRIX PLUS: WRONG VERSION INSTALLED!"])
end)
return
end
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")
----------------------------------------------------------------------
-- 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
-- Display on-screen message
function LeaPlusLC:DisplayMessage(self)
ActionStatus:DisplayMessage(self)
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
-- Show tooltips for checkboxes
function LeaPlusLC:TipSee()
GameTooltip:SetOwner(self, "ANCHOR_NONE")
local parent = self: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
-- 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 or guild (does not check realm as realm is unknown for some checks)
function LeaPlusLC:FriendCheck(name)
-- 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 if name matches with or without realm
local charFriendName = C_FriendList.GetFriendInfoByIndex(i).name
charFriendName = strsplit("-", charFriendName, 2)
if name == charFriendName 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 roster (new members may need to press J to refresh roster)
local gCount = GetNumGuildMembers()
for i = 1, gCount do
local gName, void, void, void, void, void, void, void, gOnline, void, void, void, void, gMobile = GetGuildRosterInfo(i)
if gOnline and not gMobile then
gName = strsplit("-", gName, 2)
if gName == name then
return true
end
end
end
end
-- Convert color code (from RGB or RGB Percent to Hex or Hex Percent and vice versa)
function LeaPlusLC:ConvertColor(r, g, b)
if r and g and b then
LeaPlusLC:Print("Source: |cffffffff" .. r .. " " .. g .. " " .. b .. " ")
-- Source is RGB or RGB Percent
local r = r <= 255 and r >= 0 and r or 0
local g = g <= 255 and g >= 0 and g or 0
local b = b <= 255 and b >= 0 and b or 0
-- RGB Percent to Hex
LeaPlusLC:Print("RGB Percent to Hex: |cffffffff" .. strupper(string.format("%02x%02x%02x", r * 255, g * 255, b * 255)))
-- RGB to Hex
LeaPlusLC:Print("RGB to Hex: |cffffffff" .. strupper(string.format("%02x%02x%02x", r, g, b)))
else
LeaPlusLC:Print("Source: |cffffffff" .. r)
-- Source is Hex
local rhex, ghex, bhex = string.sub(r, 1, 2), string.sub(r, 3, 4), string.sub(r, 5, 6)
-- Hex to RGB Percent
LeaPlusLC:Print("Hex to RGB Percent: |cffffffff" .. string.format("%.2f", tonumber(rhex, 16) / 255) .. " " .. string.format("%.2f", tonumber(ghex, 16) / 255) .. " " .. string.format("%.2f", tonumber(bhex, 16) / 255))
-- Hex to RGB
LeaPlusLC:Print("Hex to RGB: |cffffffff" .. tonumber(rhex, 16) .. " " .. tonumber(ghex, 16) .. " " .. tonumber(bhex, 16))
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("AutoRepairGear", "AutoRepairBtn", false) -- Repair automatically
LeaPlusLC:LockOption("InviteFromWhisper", "InvWhisperBtn", false) -- Invite from whispers
LeaPlusLC:LockOption("NoChatButtons", "NoChatButtonsBtn", true) -- Hide chat buttons
LeaPlusLC:LockOption("MailFontChange", "MailTextBtn", true) -- Resize mail text
LeaPlusLC:LockOption("QuestFontChange", "QuestTextBtn", true) -- Resize quest text
LeaPlusLC:LockOption("MinimapMod", "ModMinimapBtn", true) -- Enhance minimap
LeaPlusLC:LockOption("TipModEnable", "MoveTooltipButton", true) -- Enhance tooltip
LeaPlusLC:LockOption("ShowCooldowns", "CooldownsButton", true) -- Show cooldowns
LeaPlusLC:LockOption("ShowBorders", "ModBordersBtn", true) -- Show borders
LeaPlusLC:LockOption("ShowPlayerChain", "ModPlayerChain", true) -- Show player chain
LeaPlusLC:LockOption("FrmEnabled", "MoveFramesButton", true) -- Manage frames
LeaPlusLC:LockOption("ManageBuffs", "ManageBuffsButton", true) -- Manage buffs
LeaPlusLC:LockOption("ManagePowerBar", "ManagePowerBarButton", true) -- Manage power bar
LeaPlusLC:LockOption("ManageWidget", "ManageWidgetButton", true) -- Manage widget
LeaPlusLC:LockOption("ManageFocus", "ManageFocusButton", true) -- Manage focus
LeaPlusLC:LockOption("ClassColFrames", "ClassColFramesBtn", true) -- Class colored frames
LeaPlusLC:LockOption("SetWeatherDensity", "SetWeatherDensityBtn", false) -- Set weather density
LeaPlusLC:LockOption("MuteGameSounds", "MuteGameSoundsBtn", false) -- Mute game sounds
end
----------------------------------------------------------------------
-- L03: Restarts
----------------------------------------------------------------------
-- Set the reload button state
function LeaPlusLC:ReloadCheck()
-- Chat
if (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["NoStickyChat"] ~= LeaPlusDB["NoStickyChat"]) -- Disable sticky chat
or (LeaPlusLC["NoStickyEditbox"] ~= LeaPlusDB["NoStickyEditbox"]) -- Disable sticky editbox
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
-- 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["MailFontChange"] ~= LeaPlusDB["MailFontChange"]) -- Resize mail text
or (LeaPlusLC["QuestFontChange"] ~= LeaPlusDB["QuestFontChange"]) -- Resize quest text
-- Interface
or (LeaPlusLC["MinimapMod"] ~= LeaPlusDB["MinimapMod"]) -- Enhance minimap
or (LeaPlusLC["TipModEnable"] ~= LeaPlusDB["TipModEnable"]) -- Enhance tooltip
or (LeaPlusLC["EnhanceDressup"] ~= LeaPlusDB["EnhanceDressup"]) -- Enhance dressup
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["ShowBorders"] ~= LeaPlusDB["ShowBorders"]) -- Show borders
or (LeaPlusLC["ShowPlayerChain"] ~= LeaPlusDB["ShowPlayerChain"]) -- Show player chain
or (LeaPlusLC["ShowWowheadLinks"] ~= LeaPlusDB["ShowWowheadLinks"]) -- Show Wowhead links
-- Frames
or (LeaPlusLC["FrmEnabled"] ~= LeaPlusDB["FrmEnabled"]) -- Manage frames
or (LeaPlusLC["ManageBuffs"] ~= LeaPlusDB["ManageBuffs"]) -- Manage buffs
or (LeaPlusLC["ManagePowerBar"] ~= LeaPlusDB["ManagePowerBar"]) -- Manage power bar
or (LeaPlusLC["ManageWidget"] ~= LeaPlusDB["ManageWidget"]) -- Manage widget
or (LeaPlusLC["ManageFocus"] ~= LeaPlusDB["ManageFocus"]) -- Manage focus
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["HideLevelUpDisplay"] ~= LeaPlusDB["HideLevelUpDisplay"]) -- Hide level-up display
or (LeaPlusLC["NoGryphons"] ~= LeaPlusDB["NoGryphons"]) -- Hide gryphons
or (LeaPlusLC["NoClassBar"] ~= LeaPlusDB["NoClassBar"]) -- Hide stance bar
or (LeaPlusLC["NoCommandBar"] ~= LeaPlusDB["NoCommandBar"]) -- Hide order hall bar
-- System
or (LeaPlusLC["NoRestedEmotes"] ~= LeaPlusDB["NoRestedEmotes"]) -- Silence rested emotes
or (LeaPlusLC["NoBagAutomation"] ~= LeaPlusDB["NoBagAutomation"]) -- Disable bag automation
or (LeaPlusLC["NoPetAutomation"] ~= LeaPlusDB["NoPetAutomation"]) -- Disable pet automation
or (LeaPlusLC["CharAddonList"] ~= LeaPlusDB["CharAddonList"]) -- Show character addons
or (LeaPlusLC["SaveProfFilters"] ~= LeaPlusDB["SaveProfFilters"]) -- Save profession filters
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
-- Settings
or (LeaPlusLC["EnableHotkey"] ~= LeaPlusDB["EnableHotkey"]) -- Enable hotkey
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 = ""
for i = 1, GetNumSubgroupMembers() do
if UnitIsGroupLeader("party" .. i) then
leader = UnitName("party" .. i)
break
end
end
if LeaPlusLC:FriendCheck(leader) 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
----------------------------------------------------------------------
-- Release in PvP
----------------------------------------------------------------------
if LeaPlusLC["AutoReleasePvP"] == "On" then
LpEvt:RegisterEvent("PLAYER_DEAD");
else
LpEvt:UnregisterEvent("PLAYER_DEAD");
end
----------------------------------------------------------------------
-- Accept resurrection
----------------------------------------------------------------------
if LeaPlusLC["AutoAcceptRes"] == "On" then
LpEvt:RegisterEvent("RESURRECT_REQUEST");
else
LpEvt:UnregisterEvent("RESURRECT_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()
----------------------------------------------------------------------
-- 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
RunScript('StaticPopupDialogs["DELETE_ITEM"].OnHyperlinkEnter = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkEnter')
RunScript('StaticPopupDialogs["DELETE_ITEM"].OnHyperlinkLeave = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkLeave')
RunScript('StaticPopupDialogs["DELETE_QUEST_ITEM"].OnHyperlinkEnter = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkEnter')
RunScript('StaticPopupDialogs["DELETE_QUEST_ITEM"].OnHyperlinkLeave = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkLeave')
RunScript('StaticPopupDialogs["DELETE_GOOD_QUEST_ITEM"].OnHyperlinkEnter = StaticPopupDialogs["DELETE_GOOD_ITEM"].OnHyperlinkEnter')
RunScript('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())
-- 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)
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())
-- 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
----------------------------------------------------------------------
-- Mute game sounds (no reload required)
----------------------------------------------------------------------
do
-- Create soundtable
local muteTable = {
["MuteFizzle"] = { "sound/spells/fizzle/fizzlefirea.ogg#569773", "sound/spells/fizzle/FizzleFrostA.ogg#569775", "sound/spells/fizzle/FizzleHolyA.ogg#569772", "sound/spells/fizzle/FizzleNatureA.ogg#569774", "sound/spells/fizzle/FizzleShadowA.ogg#569776",},
["MuteInterface"] = { "sound/interface/iUiInterfaceButtonA.ogg#567481", "sound/interface/uChatScrollButton.ogg#567407", "sound/interface/uEscapeScreenClose.ogg#567464", "sound/interface/uEscapeScreenOpen.ogg#567490",},
["MuteSniffing"] = { "sound/creature/worgenfemale/worgenfemale_emotesniff_01.ogg#564422", "sound/creature/worgenfemale/worgenfemale_emotesniff_02.ogg#564378", "sound/creature/worgenfemale/worgenfemale_emotesniff_03.ogg#564383", "sound/creature/worgenfemale/worgenmale_emotesniff_01.ogg#564560", "sound/creature/worgenfemale/worgenmale_emotesniff_02.ogg#564544", "sound/creature/worgenfemale/worgenmale_emotesniff_03.ogg#564536",},
["MuteTravelers"] = {
-- Mighty Caravan Brutosaur (sound/creature/tortollan_male)
"vo_801_tortollan_male_04_m.ogg#1998112", "vo_801_tortollan_male_05_m.ogg#1998113", "vo_801_tortollan_male_06_m.ogg#1998114", "vo_801_tortollan_male_07_m.ogg#1998115", "vo_801_tortollan_male_08_m.ogg#1998116", "vo_801_tortollan_male_09_m.ogg#1998117", "vo_801_tortollan_male_10_m.ogg#1998118", "vo_801_tortollan_male_11_m.ogg#1998119",
-- Traveler's Tundra Mammoth (sound/creature/npcdraeneimalestandard, sound/creature/goblinmalezanynpc, sound/creature/trollfemalelaidbacknpc, sound/creature/trollfemalelaidbacknpc)
"npcdraeneimalestandardvendor01.ogg#557341", "npcdraeneimalestandardvendor02.ogg#557335", "npcdraeneimalestandardvendor03.ogg#557328", "npcdraeneimalestandardvendor04.ogg#557331", "npcdraeneimalestandardvendor05.ogg#557325", "npcdraeneimalestandardvendor06.ogg#557324",
"npcdraeneimalestandardfarewell01.ogg#557342", "npcdraeneimalestandardfarewell02.ogg#557326", "npcdraeneimalestandardfarewell03.ogg#557322", "npcdraeneimalestandardfarewell05.ogg#557332", "npcdraeneimalestandardfarewell06.ogg#557338", "npcdraeneimalestandardfarewell08.ogg#557334",
"goblinmalezanynpcvendor01.ogg#550818", "goblinmalezanynpcvendor02.ogg#550817", "goblinmalezanynpcgreeting01.ogg#550805", "goblinmalezanynpcgreeting02.ogg#550813", "goblinmalezanynpcgreeting03.ogg#550819", "goblinmalezanynpcgreeting04.ogg#550806", "goblinmalezanynpcgreeting05.ogg#550820", "goblinmalezanynpcgreeting06.ogg#550809",
"goblinmalezanynpcfarewell01.ogg#550807", "goblinmalezanynpcfarewell03.ogg#550808", "goblinmalezanynpcfarewell04.ogg#550812",
"trollfemalelaidbacknpcvendor01.ogg#562812","trollfemalelaidbacknpcvendor02.ogg#562802", "trollfemalelaidbacknpcgreeting01.ogg#562815","trollfemalelaidbacknpcgreeting02.ogg#562814", "trollfemalelaidbacknpcgreeting03.ogg#562816", "trollfemalelaidbacknpcgreeting04.ogg#562807", "trollfemalelaidbacknpcgreeting05.ogg#562804", "trollfemalelaidbacknpcgreeting06.ogg#562803",
"trollfemalelaidbacknpcfarewell01.ogg#562809", "trollfemalelaidbacknpcfarewell02.ogg#562808", "trollfemalelaidbacknpcfarewell03.ogg#562813", "trollfemalelaidbacknpcfarewell04.ogg#562817", "trollfemalelaidbacknpcfarewell05.ogg#562806",
-- Grand Expedition Yak (sound/creature/grummlekooky, sound/creature/grummlestandard)
"vo_grummle_kooky_vendor_01.ogg#640180", "vo_grummle_kooky_vendor_02.ogg#640182", "vo_grummle_kooky_vendor_03.ogg#640184",
"vo_grummle_kooky_farewell_01.ogg#640158", "vo_grummle_kooky_farewell_02.ogg#640160", "vo_grummle_kooky_farewell_03.ogg#640162", "vo_grummle_kooky_farewell_04.ogg#640164",
"vo_grummle_standard_vendor_01.ogg#640336", "vo_grummle_standard_vendor_02.ogg#640338", "vo_grummle_standard_vendor_03.ogg#640340",
"vo_grummle_standard_farewell_01.ogg#640314", "vo_grummle_standard_farewell_02.ogg#640316", "vo_grummle_standard_farewell_03.ogg#640318", "vo_grummle_standard_farewell_04.ogg#640320",
},
-- Shouts
["MuteBattleShouts"] = {
-- Dark Iron Dwarf (sound/character/pc_dark_iron_dwarf_female, sound/character/pc_dark_iron_dwarf_male)
"vo_801_pc_-_darkiron_dwarf_female_battleshout_01.ogg#1906526", "vo_801_pc_-_darkiron_dwarf_female_battleshout_02.ogg#1906527", "vo_801_pc_-_darkiron_dwarf_female_battleshout_03.ogg#1906528", "vo_801_pc_-_darkiron_dwarf_female_battleshout_04.ogg#1906529", "vo_801_pc_-_darkiron_dwarf_female_battleshout_05.ogg#1906530",
"vo_801_pc_-_darkiron_dwarf_male_battleshout_01.ogg#1906599", "vo_801_pc_-_darkiron_dwarf_male_battleshout_02.ogg#1906600", "vo_801_pc_-_darkiron_dwarf_male_battleshout_03.ogg#1906601", "vo_801_pc_-_darkiron_dwarf_male_battleshout_04.ogg#1906602",
-- Draenei (sound/character/draeneifemalepc, sound/character/draeneimalepc)
"vo_draeneifemale_main_battleshoutlarge_01.ogg#1385370", "vo_draeneifemale_main_battleshoutlarge_02.ogg#1385371", "vo_draeneifemale_main_battleshoutlarge_03.ogg#1385372", "vo_draeneifemale_main_battleshoutlarge_04.ogg#1385373", "vo_draeneifemale_main_battleshoutlarge_05.ogg#1385374", "vo_draeneifemale_main_battleshoutlarge_06.ogg#1385375",
"vo_draeneimale_main_battleshoutlarge_01.ogg#1385420", "vo_draeneimale_main_battleshoutlarge_02.ogg#1385421", "vo_draeneimale_main_battleshoutlarge_03.ogg#1385422", "vo_draeneimale_main_battleshoutlarge_04.ogg#1385423", "vo_draeneimale_main_battleshoutlarge_05.ogg#1385424", "vo_draeneimale_main_battleshoutlarge_06.ogg#1385425",
-- Dwarf (sound/character/playerexertions/dwarffemalefinal, sound/character/playerexertions/dwarfmalefinal)
"vo_dwarffemale_main_battleshoutlarge_01.ogg#1512949", "vo_dwarffemale_main_battleshoutlarge_02.ogg#1512950", "vo_dwarffemale_main_battleshoutlarge_03.ogg#1512951", "vo_dwarffemale_main_battleshoutlarge_04.ogg#1512952", "vo_dwarffemale_main_battleshoutlarge_05.ogg#1512953",
"vo_dwarfmale_main_battleshoutlarge_01.ogg#1512848", "vo_dwarfmale_main_battleshoutlarge_02.ogg#1512849", "vo_dwarfmale_main_battleshoutlarge_03.ogg#1512850", "vo_dwarfmale_main_battleshoutlarge_04.ogg#1512851", "vo_dwarfmale_main_battleshoutlarge_05.ogg#1512852",
-- Gnome (sound/character/gnome/gnomevocalfemale, sound/character/playerexertions/gnomemalefinal)
"vo_gnomefemale_main_battleshoutlarge_01.ogg#1385458", "vo_gnomefemale_main_battleshoutlarge_02.ogg#1385459", "vo_gnomefemale_main_battleshoutlarge_03.ogg#1385460", "vo_gnomefemale_main_battleshoutlarge_04.ogg#1385461", "vo_gnomefemale_main_battleshoutlarge_05.ogg#1385462", "vo_gnomefemale_main_battleshoutlarge_06.ogg#1385463", "vo_gnomefemale_main_battleshoutlarge_07.ogg#1385464",
"vo_gnomemale_main_battleshoutlarge_01.ogg#1512976", "vo_gnomemale_main_battleshoutlarge_02.ogg#1512977", "vo_gnomemale_main_battleshoutlarge_03.ogg#1512978", "vo_gnomemale_main_battleshoutlarge_04.ogg#1512979", "vo_gnomemale_main_battleshoutlarge_05.ogg#1512980",
-- Human (sound/character/playerexertions/humanfemalefinal, sound/character/playerexertions/humanmalefinal)
"vo_humanfemale_main_battleshout_01.ogg#1343353", "vo_humanfemale_main_battleshout_02.ogg#1343354", "vo_humanfemale_main_battleshout_03.ogg#1343355", "vo_humanfemale_main_battleshout_04.ogg#1343356", "vo_humanfemale_main_battleshout_05.ogg#1343357", "vo_humanfemale_main_battleshout_06.ogg#1343358", "vo_humanfemale_main_battleshout_07.ogg#1343359", "vo_humanfemale_main_battleshout_08.ogg#1343360", "vo_humanfemale_main_battleshout_09.ogg#1343361",
"vo_humanmale_battleshout_01.ogg#1343322", "vo_humanmale_battleshout_02.ogg#1343323", "vo_humanmale_battleshout_03.ogg#1343324", "vo_humanmale_battleshout_04.ogg#1343325", "vo_humanmale_battleshout_05.ogg#1343326", "vo_humanmale_battleshout_06.ogg#1343327", "vo_humanmale_battleshout_07.ogg#1343328", "vo_humanmale_battleshout_08.ogg#1343329",
-- Kul Tiran (sound/character/pc_kul_tiran_human_female, sound/character/pc_kul_tiran_human_male)
"vo_815_pc_kul_tiran_human_female_intimidatingshout_01.ogg#2735388", "vo_815_pc_kul_tiran_human_female_intimidatingshout_02.ogg#2735389", "vo_815_pc_kul_tiran_human_female_intimidatingshout_03.ogg#2735390", "vo_815_pc_kul_tiran_human_female_intimidatingshout_04.ogg#2735391",
"vo_815_pc_kul_tiran_human_male_battlecry_01.ogg#2735439", "vo_815_pc_kul_tiran_human_male_battlecry_02.ogg#2735440", "vo_815_pc_kul_tiran_human_male_battlecry_03.ogg#2735441", "vo_815_pc_kul_tiran_human_male_battlecry_04.ogg#2735442", "vo_815_pc_kul_tiran_human_male_breathing_01.ogg#2735443",
-- Lightforged Draenei (sound/character/pc_-_lightforged_draenei_female, sound/character/pc_-_lightforged_draenei_male)
"vo_735_pc_-_lightforged_draenei_female_battleshout_01.ogg#1835517", "vo_735_pc_-_lightforged_draenei_female_battleshout_02.ogg#1835518", "vo_735_pc_-_lightforged_draenei_female_battleshout_03.ogg#1835519", "vo_735_pc_-_lightforged_draenei_female_battleshout_04.ogg#1835520", "vo_735_pc_-_lightforged_draenei_female_battleshout_05.ogg#1835521",
"vo_735_pc_-_lightforged_draenei_male_battleshout_01.ogg#1835609", "vo_735_pc_-_lightforged_draenei_male_battleshout_02.ogg#1835610", "vo_735_pc_-_lightforged_draenei_male_battleshout_03.ogg#1835611", "vo_735_pc_-_lightforged_draenei_male_battleshout_04.ogg#1835612", "vo_735_pc_-_lightforged_draenei_male_battleshout_05.ogg#1835613",
-- Mechagnome (sound/character/pc_mechagnome_female, sound/character/pc_mechagnome_male)
"vo_83_pc_mechagnome_female_battleshout_01.ogg#3189373", "vo_83_pc_mechagnome_female_battleshout_02.ogg#3189374", "vo_83_pc_mechagnome_female_battleshout_03.ogg#3189375", "vo_83_pc_mechagnome_female_battleshout_03.ogg#3189375",
"vo_83_pc_mechagnome_male_battleshout_02.ogg#3187600", "vo_83_pc_mechagnome_male_battleshout_03.ogg#3187601", "vo_83_pc_mechagnome_male_battleshout_04.ogg#3187602", "vo_83_pc_mechagnome_male_battleshout_05.ogg#3187603",
-- Night Elf (sound/character/nightelf/nightelffemale, sound/character/pcdhnightelfmale/)
"nightelffemale/vo_nightelffemale_main_battleshoutlarge_01.ogg#1383638", "nightelffemale/vo_nightelffemale_main_battleshoutlarge_02.ogg#1383639", "nightelffemale/vo_nightelffemale_main_battleshoutlarge_03.ogg#1383640", "nightelffemale/vo_nightelffemale_main_battleshoutlarge_04.ogg#1383641", "nightelffemale/vo_nightelffemale_main_battleshoutlarge_05.ogg#1383642", "nightelffemale/vo_nightelffemale_main_battleshoutlarge_06.ogg#1383643", "nightelffemale/vo_nightelffemale_main_battleshoutlarge_07.ogg#1383644", "nightelffemale/vo_nightelffemale_main_battleshoutlarge_08.ogg#1383645", "nightelffemale/vo_nightelffemale_main_battleshoutlarge_09.ogg#1383646",
"vo_dhnightelfmale_charge_01.ogg#1389714", "vo_dhnightelfmale_charge_02.ogg#1389715", "vo_dhnightelfmale_charge_03.ogg#1389716", "vo_dhnightelfmale_charge_04.ogg#1389717", "vo_dhnightelfmale_charge_05.ogg#1389718", "vo_dhnightelfmale_charge_06.ogg#1389719", "vo_dhnightelfmale_charge_07.ogg#1389720", "vo_dhnightelfmale_charge_08.ogg#1389721",
-- Night Elf Demon Hunter (sound/character/pcdhnightelffemale, sound/character/pcdhnightelfmale)
"vo_dhnightelffemale_battleshoutlarge_01.ogg#1502181", "vo_dhnightelffemale_battleshoutlarge_02.ogg#1502182", "vo_dhnightelffemale_battleshoutlarge_03.ogg#1502183", "vo_dhnightelffemale_battleshoutlarge_04.ogg#1502184", "vo_dhnightelffemale_battleshoutlarge_05.ogg#1502185", "vo_dhnightelffemale_battleshoutlarge_06.ogg#1502186", "vo_dhnightelffemale_battleshoutlarge_07.ogg#1502187",
"vo_nightelfmale_main_battleshoutlarge_01.ogg#1512783", "vo_nightelfmale_main_battleshoutlarge_02.ogg#1512784", "vo_nightelfmale_main_battleshoutlarge_03.ogg#1512785", "vo_nightelfmale_main_battleshoutlarge_04.ogg#1512786",
-- Void Elf (sound/character/pc_-_void_elf_female, sound/character/pc_-_void_elf_male)
"vo_735_pc_-_void_elf_female_battleshout_01.ogg#1835914", "vo_735_pc_-_void_elf_female_battleshout_02.ogg#1835915", "vo_735_pc_-_void_elf_female_battleshout_03.ogg#1835916", "vo_735_pc_-_void_elf_female_battleshout_04.ogg#1835918", "vo_735_pc_-_void_elf_female_battleshout_05.ogg#1835919",
"vo_735_pc_-_void_elf_male_battleshout_01.ogg#1836016", "vo_735_pc_-_void_elf_male_battleshout_02.ogg#1836017", "vo_735_pc_-_void_elf_male_battleshout_03.ogg#1836019", "vo_735_pc_-_void_elf_male_battleshout_04.ogg#1836020", "vo_735_pc_-_void_elf_male_battleshout_05.ogg#1836021",
-- Worgen (sound/character/pcworgenfemale, sound/character/pcworgenmale)
"vo_worgenfemale_battleshoutlarge_01.ogg#1502111", "vo_worgenfemale_battleshoutlarge_02.ogg#1502112", "vo_worgenfemale_battleshoutlarge_03.ogg#1502113", "vo_worgenfemale_battleshoutlarge_04.ogg#1502114", "vo_worgenfemale_battleshoutlarge_05.ogg#1502115",
"vo_worgenmale_main_battleshoutlarge_01.ogg#1502135", "vo_worgenmale_main_battleshoutlarge_02.ogg#1502136", "vo_worgenmale_main_battleshoutlarge_03.ogg#1502137", "vo_worgenmale_main_battleshoutlarge_04.ogg#1502138", "vo_worgenmale_main_battleshoutlarge_05.ogg#1502139", "vo_worgenmale_main_battleshoutlarge_06.ogg#1502140",
-- Blood elf (sound/character/bloodelffemalepc, sound/character/bloodelfmalepc)
"vo_bloodelffemale_main_battleshoutlarge_01.ogg#1385124", "vo_bloodelffemale_main_battleshoutlarge_02.ogg#1385125", "vo_bloodelffemale_main_battleshoutlarge_03.ogg#1385126", "vo_bloodelffemale_main_battleshoutlarge_04.ogg#1385127", "vo_bloodelffemale_main_battleshoutlarge_05.ogg#1385128", "vo_bloodelffemale_main_battleshoutlarge_06.ogg#1385129",
"vo_bloodelfmale_main_battleshoutlarge_01.ogg#1385087", "vo_bloodelfmale_main_battleshoutlarge_02.ogg#1385088", "vo_bloodelfmale_main_battleshoutlarge_03.ogg#1385089", "vo_bloodelfmale_main_battleshoutlarge_04.ogg#1385090", "vo_bloodelfmale_main_battleshoutlarge_05.ogg#1385091", "vo_bloodelfmale_main_battleshoutlarge_06.ogg#1385092",
-- Blood Elf Demon Hunter (sound/character/pcdhbloodelffemale, sound/character/pcdhbloodelfmale)
"vo_dhbloodelffemale_metamorph_main_battleshoutlarge_01.ogg#1389747", "vo_dhbloodelffemale_metamorph_main_battleshoutlarge_02.ogg#1389748", "vo_dhbloodelffemale_metamorph_main_battleshoutlarge_03.ogg#1389749", "vo_dhbloodelffemale_metamorph_main_battleshoutlarge_04.ogg#1389750", "vo_dhbloodelffemale_metamorph_main_battleshoutlarge_05.ogg#1389751", "vo_dhbloodelffemale_metamorph_main_battleshoutlarge_06.ogg#1389752", "vo_dhbloodelffemale_metamorph_main_battleshoutlarge_07.ogg#1389753", "vo_dhbloodelffemale_metamorph_main_battleshoutlarge_08.ogg#1389754",
"vo_dhbloodelffemale_battleshoutlarge_01.ogg#1389813", "vo_dhbloodelffemale_battleshoutlarge_02.ogg#1389814", "vo_dhbloodelffemale_battleshoutlarge_03.ogg#1389815", "vo_dhbloodelffemale_battleshoutlarge_04.ogg#1389816", "vo_dhbloodelffemale_battleshoutlarge_05.ogg#1389817", "vo_dhbloodelffemale_battleshoutlarge_06.ogg#1389818",
"vo_dhbloodelfmale_main_battleshoutlarge_01.ogg#1502201", "vo_dhbloodelfmale_main_battleshoutlarge_02.ogg#1502202", "vo_dhbloodelfmale_main_battleshoutlarge_03.ogg#1502203", "vo_dhbloodelfmale_main_battleshoutlarge_04.ogg#1502204", "vo_dhbloodelfmale_main_battleshoutlarge_05.ogg#1502205", "vo_dhbloodelfmale_main_battleshoutlarge_06.ogg#1502206", "vo_dhbloodelfmale_main_battleshoutlarge_07.ogg#1502207", "vo_dhbloodelfmale_main_battleshoutlarge_08.ogg#1502208", "vo_dhbloodelfmale_main_battleshoutlarge_09.ogg#1502209", "vo_dhbloodelfmale_main_battleshoutlarge_010.ogg#1502210", "vo_dhbloodelfmale_main_battleshoutlarge_011.ogg#1502211",
-- Goblin (sound/character/goblinfemale, sound/character/pcgoblinmale)
"goblinfemale/vo_goblinfemale_main_battleshoutlarge_01.ogg#1385054", "goblinfemale/vo_goblinfemale_main_battleshoutlarge_02.ogg#1385055", "goblinfemale/vo_goblinfemale_main_battleshoutlarge_03.ogg#1385056", "goblinfemale/vo_goblinfemale_main_battleshoutlarge_04.ogg#1385057", "goblinfemale/vo_goblinfemale_main_battleshoutlarge_05.ogg#1385058", "goblinfemale/vo_goblinfemale_main_battleshoutlarge_06.ogg#1385059", "goblinfemale/vo_goblinfemale_main_battleshoutlarge_07.ogg#1385060",
"pcgoblinmale/vo_goblinmale_main_battleshoutlarge_01.ogg#1385350", "pcgoblinmale/vo_goblinmale_main_battleshoutlarge_02.ogg#1385351", "pcgoblinmale/vo_goblinmale_main_battleshoutlarge_03.ogg#1385352", "pcgoblinmale/vo_goblinmale_main_battleshoutlarge_04.ogg#1385353", "pcgoblinmale/vo_goblinmale_main_battleshoutlarge_05.ogg#1385354", "pcgoblinmale/vo_goblinmale_main_battleshoutlarge_06.ogg#1385355", "pcgoblinmale/vo_goblinmale_main_battleshoutlarge_07.ogg#1385356",
-- Highmountain Tauren (sound/character/pc_-_highmountain_tauren_female, sound/character/pc_-_highmountain_tauren_male)
"vo_735_pc_-_highmountain_tauren_female_battleshout_01.ogg#1835373", "vo_735_pc_-_highmountain_tauren_female_battleshout_02.ogg#1835374", "vo_735_pc_-_highmountain_tauren_female_battleshout_03.ogg#1835375", "vo_735_pc_-_highmountain_tauren_female_battleshout_04.ogg#1835376", "vo_735_pc_-_highmountain_tauren_female_battleshout_05.ogg#1835377",
"vo_735_pc_-_highmountain_tauren_male_battleshout_01.ogg#1835438", "vo_735_pc_-_highmountain_tauren_male_battleshout_02.ogg#1835439", "vo_735_pc_-_highmountain_tauren_male_battleshout_03.ogg#1835440", "vo_735_pc_-_highmountain_tauren_male_battleshout_04.ogg#1835441", "vo_735_pc_-_highmountain_tauren_male_battleshout_05.ogg#1835442",
-- Mag'har Orc (sound/character/pc_maghar_orc_female, sound/character/pc_maghar_orc_male)
"vo_801_pc_maghar_orc_female_battleshout_01.ogg#2026032", "vo_801_pc_maghar_orc_female_battleshout_02.ogg#2026033", "vo_801_pc_maghar_orc_female_battleshout_03.ogg#2026034", "vo_801_pc_maghar_orc_female_battleshout_04.ogg#2026035", "vo_801_pc_maghar_orc_female_battleshout_05.ogg#2026036",
"vo_801_pc_maghar_orc_male_battleshout_01.ogg#2025879", "vo_801_pc_maghar_orc_male_battleshout_02.ogg#2025880", "vo_801_pc_maghar_orc_male_battleshout_03.ogg#2025881", "vo_801_pc_maghar_orc_male_battleshout_04.ogg#2025882", "vo_801_pc_maghar_orc_male_battleshout_05.ogg#2025883",
-- Nightborne (sound/character/pc_-_nightborne_elf_female, sound/character/pc_-_nightborne_elf_male)
"vo_735_pc_-_nightborne_elf_female_battleshout_01.ogg#1835708", "vo_735_pc_-_nightborne_elf_female_battleshout_02.ogg#1835709", "vo_735_pc_-_nightborne_elf_female_battleshout_03.ogg#1835711", "vo_735_pc_-_nightborne_elf_female_battleshout_04.ogg#1835712", "vo_735_pc_-_nightborne_elf_female_battleshout_05.ogg#1835713",
"vo_735_pc_-_nightborne_elf_male_battleshout_01.ogg#1835806", "vo_735_pc_-_nightborne_elf_male_battleshout_02.ogg#1835807", "vo_735_pc_-_nightborne_elf_male_battleshout_03.ogg#1835808", "vo_735_pc_-_nightborne_elf_male_battleshout_04.ogg#1835810", "vo_735_pc_-_nightborne_elf_male_battleshout_05.ogg#1835811",
-- Orc (sound/character/orc/female, sound/character/orc/orcmale)
"vo_orcfemale_main_battleshoutlarge_01.ogg#1385014", "vo_orcfemale_main_battleshoutlarge_02.ogg#1385015", "vo_orcfemale_main_battleshoutlarge_03.ogg#1385016", "vo_orcfemale_main_battleshoutlarge_04.ogg#1385017", "vo_orcfemale_main_battleshoutlarge_05.ogg#1385018", "vo_orcfemale_main_battleshoutlarge_06.ogg#1385019", "vo_orcfemale_main_battleshoutlarge_07.ogg#1385020",
"vo_orcmale_main_battleshoutlarge_01.ogg#1384088", "vo_orcmale_main_battleshoutlarge_02.ogg#1384089", "vo_orcmale_main_battleshoutlarge_03.ogg#1384090", "vo_orcmale_main_battleshoutlarge_04.ogg#1384091", "vo_orcmale_main_battleshoutlarge_05.ogg#1384092", "vo_orcmale_main_battleshoutlarge_06.ogg#1384093",
-- Tauren (sound/character/tauren/female, sound/character/playerexertions/taurenmalefinal)
"vo_taurenfemale_main_battleshoutlarge_01.ogg#1384942", "vo_taurenfemale_main_battleshoutlarge_02.ogg#1384943", "vo_taurenfemale_main_battleshoutlarge_03.ogg#1384944", "vo_taurenfemale_main_battleshoutlarge_04.ogg#1384945", "vo_taurenfemale_main_battleshoutlarge_05.ogg#1384946", "vo_taurenfemale_main_battleshoutlarge_06.ogg#1384947", "vo_taurenfemale_main_battleshoutlarge_07.ogg#1384948",
"vo_taurenmale_battleshoutlarge_01.ogg#1502087", "vo_taurenmale_battleshoutlarge_02.ogg#1502088", "vo_taurenmale_battleshoutlarge_03.ogg#1502089", "vo_taurenmale_battleshoutlarge_04.ogg#1502090", "vo_taurenmale_battleshoutlarge_05.ogg#1502091",
-- Troll (sound/character/playerexertions/trollfemalefinal, sound/character/playerexertions/trollmalefinal)
"trollfemalefinal/vo_trollfemale_battleshoutlarge_01.ogg#1502160", "trollfemalefinal/vo_trollfemale_battleshoutlarge_02.ogg#1502161", "trollfemalefinal/vo_trollfemale_battleshoutlarge_03.ogg#1502162", "trollfemalefinal/vo_trollfemale_battleshoutlarge_04.ogg#1502163", "trollfemalefinal/vo_trollfemale_battleshoutlarge_05.ogg#1502164",
"vo_trollmale_main_battleshoutlarge_01.ogg#1512813", "vo_trollmale_main_battleshoutlarge_02.ogg#1512814", "vo_trollmale_main_battleshoutlarge_03.ogg#1512815", "vo_trollmale_main_battleshoutlarge_04.ogg#1512816",
-- Undead (sound/character/scourge/scourgefemale, sound/character/playerexertions/undeadmalefinal)
"vo_undeadfemale_main_battleshoutlarge_01.ogg#1385487", "vo_undeadfemale_main_battleshoutlarge_02.ogg#1385488", "vo_undeadfemale_main_battleshoutlarge_03.ogg#1385489", "vo_undeadfemale_main_battleshoutlarge_04.ogg#1385490", "vo_undeadfemale_main_battleshoutlarge_05.ogg#1385491", "vo_undeadfemale_main_battleshoutlarge_06.ogg#1385492", "vo_undeadfemale_main_battleshoutlarge_07.ogg#1385493",
"vo_undeadmale_main_battleshoutlarge_01.ogg#1383691", "vo_undeadmale_main_battleshoutlarge_02.ogg#1383692", "vo_undeadmale_main_battleshoutlarge_03.ogg#1383693", "vo_undeadmale_main_battleshoutlarge_04.ogg#1383694", "vo_undeadmale_main_battleshoutlarge_05.ogg#1383695", "vo_undeadmale_main_battleshoutlarge_06.ogg#1383696", "vo_undeadmale_main_battleshoutlarge_07.ogg#1383697", "vo_undeadmale_main_battleshoutlarge_08.ogg#1383698", "vo_undeadmale_main_battleshoutlarge_09.ogg#1383699",
-- Vulpera (sound/character/pc_vulpera_female, sound/character/pc_vulpera_male)
"vo_83_pc_vulpera_female_battleshout_01.ogg#3188440", "vo_83_pc_vulpera_female_battleshout_02.ogg#3188441", "vo_83_pc_vulpera_female_battleshout_03.ogg#3188442", "vo_83_pc_vulpera_female_battleshout_04.ogg#3188443",
"vo_83_pc_vulpera_male_battleshout_01.ogg#3188670", "vo_83_pc_vulpera_male_battleshout_02.ogg#3188671", "vo_83_pc_vulpera_male_battleshout_03.ogg#3188672", "vo_83_pc_vulpera_male_battleshout_04.ogg#3188673", "vo_83_pc_vulpera_male_battleshout_05.ogg#3188674",
-- Zandalari Troll (sound/character/pc_zandalari_troll_female, sound/character/pc_zandalari_troll_male)
"vo_801_pc_-_zandalari_troll_female_battleshout_01.ogg#2735187", "vo_801_pc_-_zandalari_troll_female_battleshout_02.ogg#2735188", "vo_801_pc_-_zandalari_troll_female_battleshout_03.ogg#2735189", "vo_801_pc_-_zandalari_troll_female_battleshout_04.ogg#2735190", "vo_801_pc_-_zandalari_troll_female_battleshout_05.ogg#2735191",
"vo_801_pc_-_zandalari_troll_male_battleshout_01.ogg#2699280", "vo_801_pc_-_zandalari_troll_male_battleshout_02.ogg#2699281", "vo_801_pc_-_zandalari_troll_male_battleshout_03.ogg#2699282", "vo_801_pc_-_zandalari_troll_male_battleshout_04.ogg#2699283", "vo_801_pc_-_zandalari_troll_male_battleshout_05.ogg#2699284",
-- Pandaren (sound/character/pcpandarenfemale, sound/character/pcpandarenmale)
"vo_pandarenfemale_main_battleshoutlarge_01.ogg#1384044", "vo_pandarenfemale_main_battleshoutlarge_02.ogg#1384045", "vo_pandarenfemale_main_battleshoutlarge_03.ogg#1384046", "vo_pandarenfemale_main_battleshoutlarge_04.ogg#1384047", "vo_pandarenfemale_main_battleshoutlarge_05.ogg#1384048", "vo_pandarenfemale_main_battleshoutlarge_06.ogg#1384049", "vo_pandarenfemale_main_battleshoutlarge_07.ogg#1384050",
"vo_pandarenmale_main_battleshoutlarge_01.ogg#1384979", "vo_pandarenmale_main_battleshoutlarge_02.ogg#1384980", "vo_pandarenmale_main_battleshoutlarge_03.ogg#1384981", "vo_pandarenmale_main_battleshoutlarge_04.ogg#1384982", "vo_pandarenmale_main_battleshoutlarge_05.ogg#1384983", "vo_pandarenmale_main_battleshoutlarge_06.ogg#1384984", "vo_pandarenmale_main_battleshoutlarge_07.ogg#1384985",
},
-- Ban-LU
["MuteBanLu"] = {
-- Ban-Lu (sound/creature/ban-lu)
"vo_72_ban-lu_01_m.ogg#1593212", "vo_72_ban-lu_02_m.ogg#1593213", "vo_72_ban-lu_03_m.ogg#1593214", "vo_72_ban-lu_04_m.ogg#1593215", "vo_72_ban-lu_05_m.ogg#1593216", "vo_72_ban-lu_06_m.ogg#1593217", "vo_72_ban-lu_07_m.ogg#1593218", "vo_72_ban-lu_08_m.ogg#1593219", "vo_72_ban-lu_09_m.ogg#1593220", "vo_72_ban-lu_10_m.ogg#1593221", "vo_72_ban-lu_11_m.ogg#1593222", "vo_72_ban-lu_12_m.ogg#1593223", "vo_72_ban-lu_13_m.ogg#1593224", "vo_72_ban-lu_14_m.ogg#1593225", "vo_72_ban-lu_15_m.ogg#1593226", "vo_72_ban-lu_16_m.ogg#1593227", "vo_72_ban-lu_17_m.ogg#1593228", "vo_72_ban-lu_18_m.ogg#1593229", "vo_72_ban-lu_19_m.ogg#1593230", "vo_72_ban-lu_20_m.ogg#1593231", "vo_72_ban-lu_21_m.ogg#1593232", "vo_72_ban-lu_22_m.ogg#1593233", "vo_72_ban-lu_23_m.ogg#1593234", "vo_72_ban-lu_24_m.ogg#1593235", "vo_72_ban-lu_25_m.ogg#1593236",
},
-- Bikes
["MuteBikes"] = {
-- Mekgineer's Chopper/Mechano Hog/Chauffeured (sound/vehicles/motorcyclevehicle, sound/vehicles)
"motorcyclevehicleattackthrown.ogg#569858", "motorcyclevehiclejumpend1.ogg#569863", "motorcyclevehiclejumpend2.ogg#569857", "motorcyclevehiclejumpend3.ogg#569855", "motorcyclevehiclejumpstart1.ogg#569856", "motorcyclevehiclejumpstart2.ogg#569862", "motorcyclevehiclejumpstart3.ogg#569860", "motorcyclevehicleloadthrown.ogg#569861", "motorcyclevehiclestand.ogg#569859", "motorcyclevehiclewalkrun.ogg#569854", "vehicle_ground_gearshift_1.ogg#598748", "vehicle_ground_gearshift_2.ogg#598736", "vehicle_ground_gearshift_3.ogg#569852", "vehicle_ground_gearshift_4.ogg#598745", "vehicle_ground_gearshift_5.ogg#569845",
-- Alliance Chopper (sound/vehicles/veh_alliancechopper)
"veh_alliancechopper_revs01.ogg#1046321", "veh_alliancechopper_revs02.ogg#1046322", "veh_alliancechopper_revs03.ogg#1046323", "veh_alliancechopper_revs04.ogg#1046324", "veh_alliancechopper_revs05.ogg#1046325", "veh_alliancechopper_idle.ogg#1046320", "veh_alliancechopper_summon.ogg#1046327", "veh_alliancechopper_run_constant.ogg#1046326",
-- Horde Chopper (sound/vehicles)
"veh_hordechopper_rev01.ogg#1045061", "veh_hordechopper_rev02.ogg#1045062", "veh_hordechopper_rev03.ogg#1045063", "veh_hordechopper_rev04.ogg#1045064", "veh_hordechopper_rev05.ogg#1045065", "veh_hordechopper_idle.ogg#1046318", "veh_hordechopper_dismount.ogg#1045060", "veh_hordechopper_summon.ogg#1045070", "veh_hordechopper_jumpstart.ogg#1046319", "veh_hordechopper_run_constant.ogg#1045066", "veh_hordechopper_run_gearchange01.ogg#1045067", "veh_hordechopper_run_gearchange02.ogg#1045068", "veh_hordechopper_run_gearchange03.ogg#1045069",
-- Summon and dismount (sound/doodad)
"go_6ih_ironhorde_troopboat_open01.ogg#975574", "go_6ih_ironhorde_troopboat_open02.ogg#975576", "go_6ih_ironhorde_troopboat_open03.ogg#975578",
},
-- Balls
["MuteBalls"] = {
-- Foot Ball (sound/item/weapons/mace2h)
"2hmacehitstone1b.ogg#567794", "2hmacehitstone1c.ogg#567797", "2hmacehitstone1a.ogg#567804",
-- Net sound (sound/spells)
"sound/spells/thrownet.ogg#569368",
-- The Pigskin (sound/item/weapons/weaponswings) (not used currently as the sound is more common and probably not annoying)
-- "fx_whoosh_small_revamp_01.ogg#1302923", "fx_whoosh_small_revamp_02.ogg#1302924", "fx_whoosh_small_revamp_03.ogg#1302925", "fx_whoosh_small_revamp_04.ogg#1302926", "fx_whoosh_small_revamp_05.ogg#1302927", "fx_whoosh_small_revamp_06.ogg#1302928", "fx_whoosh_small_revamp_07.ogg#1302929", "fx_whoosh_small_revamp_08.ogg#1302930", "fx_whoosh_small_revamp_09.ogg#1302931", "fx_whoosh_small_revamp_10.ogg#1302932",
},
-- Vaults
["MuteVaults"] = {
-- Mechanical guild vault idle sound (such as those found in Booty Bay and Winterspring)
"sound/doodad/guildvault_goblin_01stand.ogg#566289",
},
-- Trains
["MuteTrains"] = {
--[[Blood Elf]] "sound#539219", "sound#539203", "sound#1313588", "sound#1306531",
--[[Draenei]] "sound#539516", "sound#539730",
--[[Dwarf]] "sound#539802", "sound#539881",
--[[Gnome]] "sound#540271", "sound#540275",
--[[Goblin]] "sound#541769", "sound#542017",
--[[Human]] "sound#540535", "sound#540734",
--[[Night Elf]] "sound#540870", "sound#540947", "sound#1316209", "sound#1304872",
--[[Orc]] "sound#541157", "sound#541239",
--[[Pandaren]] "sound#636621", "sound#630296", "sound#630298",
--[[Tauren]] "sound#542818", "sound#542896",
--[[Troll]] "sound#543085", "sound#543093",
--[[Undead]] "sound#542526", "sound#542600",
--[[Worgen]] "sound#542035", "sound#542206", "sound#541463", "sound#541601",
--[[Dark Iron]] "sound#1902030", "sound#1902543",
--[[Highmount]] "sound#1730534", "sound#1730908",
--[[Kul Tiran]] "sound#2531204", "sound#2491898",
--[[Lightforg]] "sound#1731282", "sound#1731656",
--[[MagharOrc]] "sound#1951457", "sound#1951458",
--[[Mechagnom]] "sound#3107651", "sound#3107182",
--[[Nightborn]] "sound#1732030", "sound#1732405",
--[[Void Elf]] "sound#1732785", "sound#1733163",
--[[Vulpera]] "sound#3106252", "sound#3106717",
--[[Zandalari]] "sound#1903049", "sound#1903522",
},
-- Hovercraft
["MuteHovercraft"] = {
"sound/creature/goblinhovercraft/mon_goblinhovercraft_drive01.ogg#1859976",
"sound/creature/goblinhovercraft/mon_goblinhovercraft_enginesputter_pop_01.ogg#1859968",
"sound/creature/goblinhovercraft/mon_goblinhovercraft_enginesputter_pop_02.ogg#1859967",
"sound/creature/goblinhovercraft/mon_goblinhovercraft_enginesputter_pop_03.ogg#1859966",
"sound/creature/goblinhovercraft/mon_goblinhovercraft_enginesputter_pop_04.ogg#1859965",
"sound/creature/goblinhovercraft/mon_goblinhovercraft_fly.ogg#1859977",
"sound/creature/goblinhovercraft/mon_goblinhovercraft_idle01.ogg#1859978",
"sound/creature/goblinhovercraft/mon_goblinhovercraft_mountspecial.ogg#2059826",
},
-- Mechsuits
["MuteMechsuits"] = {
-- Footsteps (sound/creature/goblinshredder/footstep_goblinshreddermount_general_)
"01.ogg#893935", "02.ogg#893937", "03.ogg#893939", "04.ogg#893941", "05.ogg#893943", "06.ogg#893945", "07.ogg#893947", "08.ogg#893949",
-- Flight start (sound/creature/goblinshredder/mon_goblinshredder_mount_flightstart_)
"01.ogg#898428", "02.ogg#898430", "03.ogg#898432", "04.ogg#898434", "05.ogg#898436",
-- Gears (sound/creature/goblinshredder/mon_goblinshredder_mount_gears_)
"01.ogg#899109", "02.ogg#899113", "03.ogg#899115", "04.ogg#899117", "05.ogg#899119", "06.ogg#899121", "07.ogg#899123", "08.ogg#899125", "09.ogg#899127", "010.ogg#899111",
-- Land (sound/creature/goblinshredder/mon_goblinshredder_mount_land_)
"01.ogg#899129", "02.ogg#899131", "03.ogg#899133", "04.ogg#899135", "05.ogg#899137",
-- Special (sound/creature/goblinshredder/mon_goblinshredder_mount_special_)
"01.ogg#898438", "02.ogg#898440", "03.ogg#898442", "04.ogg#898444", "05.ogg#898446",
-- Take flight gear shift (sound/creature/goblinshredder/mon_goblinshredder_mount_takeflightgearshift_)
"01.ogg#899139", "02.ogg#899141", "03.ogg#899143", "04.ogg#899145", "05.ogg#899147", "06.ogg#899149",
-- Take flight gear shift no boom (sound/creature/goblinshredder/mon_goblinshredder_mount_takeflightgearshiftnoboom_)
"01.ogg#903314", "02.ogg#903316", "03.ogg#903318", "04.ogg#903320", "05.ogg#903322", "06.ogg#903324",
-- General (sound/creature/goblinshredder/mon_goblinshredder_mount_)
"flightbackward_lp.ogg#898320", "flightend.ogg#899247", "flightidle_lp.ogg#898322", "flightleftright_lp.ogg#898324", "flightrun_lp.ogg#898326", "idlestand_lp.ogg#898328", "swim_lp.ogg#898330", "swimwaterlayer_lp.ogg#901303",
-- Engine loop (sound/creature/goblinshredder/)
"goblinshredderloop.ogg#550824",
-- Felsteel Annihilator (sound/doodad/)
"steamtankdrive.ogg#566270",
},
-- Ready check
["MuteReady"] = {
"sound/interface/levelup2.ogg#567478",
},
-- Jet Aerial Units (sound/creature/hunterkiller/)
["MuteAerials"] = {
"mon_hunterkiller_creature_exertion_01.ogg#2906076",
"mon_hunterkiller_creature_exertion_02.ogg#2906075",
"mon_hunterkiller_creature_exertion_03.ogg#2906074",
"mon_hunterkiller_creatureloop.ogg#2909111",
},
-- Events
["MuteEvents"] = {
-- Headless Horseman (sound/creature/headlesshorseman/)
"horseman_beckon_01.ogg#551670",
"horseman_bodydefeat_01.ogg#551706",
"horseman_bomb_01.ogg#551705",
"horseman_conflag_01.ogg#551686",
"horseman_death_01.ogg#551695",
"horseman_failing_01.ogg#551684",
"horseman_failing_02.ogg#551700",
"horseman_fire_01.ogg#551673",
"horseman_laugh_01.ogg#551703",
"horseman_laugh_02.ogg#551682",
"horseman_out_01.ogg#551680",
"horseman_request_01.ogg#551687",
"horseman_return_01.ogg#551698",
"horseman_slay_01.ogg#551676",
"horseman_special_01.ogg#551696",
},
-- Gyrocopters
["MuteGyrocopters"] = {
-- Mimiron's Head (sound/creature/mimironheadmount/)
"mimironheadmount_jumpend.ogg#595097",
"mimironheadmount_jumpstart.ogg#595103",
"mimironheadmount_run.ogg#555364",
"mimironheadmount_walk.ogg#595100",
-- Gyrocopter (such as Mecha-Mogul MK2) (sound/creature/gyrocopter/)
"gyrocopterfly.ogg#551390",
"gyrocopterflyidle.ogg#551398",
"gyrocopterflyup.ogg#551389",
"gyrocoptergearshift1.ogg#551384",
"gyrocoptergearshift2.ogg#551391",
"gyrocoptergearshift3.ogg#551387",
"gyrocopterjumpend.ogg#551396",
"gyrocopterjumpstart.ogg#551399",
"gyrocopterrun.ogg#551386",
"gyrocoptershuffleleftorright1.ogg#551385",
"gyrocoptershuffleleftorright2.ogg#551382",
"gyrocoptershuffleleftorright3.ogg#551392",
"gyrocopterstallinair.ogg#551395",
"gyrocopterstallinairlong.ogg#551394",
"gyrocopterstallongroundlong.ogg#551393",
"gyrocopterstand.ogg#551383",
"gyrocopterstandvar1_a.ogg#551388",
"gyrocopterstandvar1_b.ogg#551397",
"gyrocopterstandvar1_bnew.ogg#551400",
"gyrocopterstandvar1_bnew.ogg#551400",
-- Gear shift sounds (sound/vehicles/)
"vehicle_airplane_gearshift_1.ogg#569846",
"vehicle_airplane_gearshift_2.ogg#598739",
"vehicle_airplane_gearshift_3.ogg#569851",
"vehicle_airplane_gearshift_4.ogg#598742",
"vehicle_airplane_gearshift_5.ogg#598733",
"vehicle_airplane_gearshift_6.ogg#569850",
-- Gyrocopter summon (also used with bikes)
-- "sound/spells/summongyrocopter.ogg#568252",
},
-- Unicorns (sound/creature/hornedhorse/)
["MuteUnicorns"] = {
"mon_hornedhorse_chuff_01.ogg#1489497",
"mon_hornedhorse_chuff_02.ogg#1489498",
"mon_hornedhorse_chuff_03.ogg#1489499",
"mon_hornedhorse_mountspecial_01.ogg#1489503",
"mon_hornedhorse_mountspecial_02.ogg#1489504",
"mon_hornedhorse_mountspecial_03.ogg#1489505",
"mon_hornedhorse_preaggro_01.ogg#1489506",
"mon_hornedhorse_preaggro_02.ogg#1489507",
"mon_hornedhorse_preaggro_03.ogg#1489508",
"mon_hornedhorse_preaggro_04.ogg#1489509",
"mon_hornedhorse_aggro_01.ogg#1489484",
"mon_hornedhorse_aggro_02.ogg#1489485",
"mon_hornedhorse_aggro_03.ogg#1489486",
"mon_hornedhorse_wound_01.ogg#1489510",
"mon_hornedhorse_wound_02.ogg#1489511",
"mon_hornedhorse_wound_03.ogg#1489512",
"mon_hornedhorse_wound_04.ogg#1489513",
"mon_hornedhorse_wound_05.ogg#1489514",
"mon_hornedhorse_wound_06.ogg#1489515",
"mon_hornedhorse_wound_07.ogg#1489516",
"mon_hornedhorse_woundcrit_01.ogg#1489517",
"mon_hornedhorse_woundcrit_02.ogg#1489518",
"mon_hornedhorse_woundcrit_03.ogg#1489519",
"mon_hornedhorse_woundcrit_04.ogg#1489520",
},
-- Singing Sunflower (sound/event/)
["MuteSunflower"] = {
"event_pvz_babbling.ogg#567354",
"event_pvz_dadadoo.ogg#567327",
"event_pvz_doobeedoo.ogg#567317",
"event_pvz_lalala.ogg#567338",
"event_pvz_sunflower.ogg#567374",
"event_pvz_zombieonyourlawn.ogg#567295",
},
-- Rockets (sound/creature/rocketmount/)
["MuteRockets"] = {
"rocketmountfly.ogg#595154",
"rocketmountjumpland1.ogg#559355",
"rocketmountjumpland2.ogg#559352",
"rocketmountjumpland3.ogg#559353",
"rocketmountshuffleleft_right1.ogg#595151",
"rocketmountshuffleleft_right2.ogg#595163",
"rocketmountshuffleleft_right3.ogg#595160",
"rocketmountshuffleleft_right4.ogg#595157",
"rocketmountstand_idle.ogg#559354",
"rocketmountwalk.ogg#595148",
"rocketmountwalkup.ogg#559351",
},
-- Soulseekers (Corridor Creeper, etc)
["MuteSoulseekers"] = {
-- sound/creature/mawsworn
"mon_mawsworn_loop_01_171773.ogg#3747229",
"mon_mawsworn_loop_02_171773.ogg#3747231",
"mon_mawsworn_loop_03_171773.ogg#3747239",
-- sound/creature/jailerhound
"mon_jailerhound_aggro_00_158899.ogg#3603946",
"mon_jailerhound_aggro_01_158899.ogg#3603947",
"mon_jailerhound_aggro_02_158899.ogg#3603948",
"mon_jailerhound_alert_00_158898.ogg#3603962",
"mon_jailerhound_alert_01_158898.ogg#3603963",
"mon_jailerhound_alert_02_158898.ogg#3603964",
-- sound/creature/talethi's_target
"mon_talethi's_target_fidget01_01_168902.ogg#3745490",
"mon_talethi's_target_fidget01_02_168902.ogg#3745492",
"mon_talethi's_target_fidget01_03_168902.ogg#3745494",
"mon_talethi's_target_fidget01_04_168902.ogg#3745496",
"mon_talethi's_target_fidget01_05_168902.ogg#3745498",
"mon_talethi's_target_fidget01_06_168902.ogg#3745500",
"mon_talethi's_target_fidget01_07_168902.ogg#3745502",
"mon_talethi's_target_fidget01_08_168902.ogg#3745504",
"mon_talethi's_target_fidget01_09_168902.ogg#3745506",
"mon_talethi's_target_fidget01_10_168902.ogg#3745508",
"mon_talethi's_target_fidget01_11_168902.ogg#3745510",
"mon_talethi's_target_fidget01_12_168902.ogg#3745512",
"mon_talethi's_target_fidget01_13_168902.ogg#3745514",
"mon_talethi's_target_fidget01_14_168902.ogg#3745516",
"mon_talethi's_target_fidget01_15_168902.ogg#3745518",
"mon_talethi's_target_fidget01_16_168902.ogg#3745520",
},
}
-- 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, "MuteFizzle", "Fizzle", 16, -92, false, "If checked, the spell fizzle sounds will be muted.")
LeaPlusLC:MakeCB(SoundPanel, "MuteInterface", "Interface", 16, -112, 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, "MuteSniffing", "Sniffing", 16, -132, false, "If checked, the worgen sniffing sounds will be muted.")
LeaPlusLC:MakeCB(SoundPanel, "MuteTrains", "Trains", 16, -152, false, "If checked, train sounds will be muted.")
LeaPlusLC:MakeCB(SoundPanel, "MuteBalls", "Balls", 16, -172, false, "If checked, the Foot Ball sounds will be muted.")
LeaPlusLC:MakeCB(SoundPanel, "MuteEvents", "Events", 16, -192, false, "If checked, holiday event sounds will be muted.|n|nThis applies to Headless Horseman.")
LeaPlusLC:MakeCB(SoundPanel, "MuteVaults", "Vaults", 16, -212, false, "If checked, the mechanical guild vault idle sound will be muted.")
LeaPlusLC:MakeCB(SoundPanel, "MuteReady", "Ready", 16, -232, false, "If checked, the ready check sound will be muted.")
LeaPlusLC:MakeTx(SoundPanel, "Mounts", 140, -72)
LeaPlusLC:MakeCB(SoundPanel, "MuteBikes", "Bikes", 140, -92, false, "If checked, most of the bike mount sounds will be muted.")
LeaPlusLC:MakeCB(SoundPanel, "MuteTravelers", "Travelers", 140, -112, 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(SoundPanel, "MuteUnicorns", "Unicorns", 140, -132, false, "If checked, unicorns will be quieter.|n|nThis applies to Lucid Nightmare, Wild Dreamrunner, Pureheart Courser and other unicorn mounts.")
LeaPlusLC:MakeCB(SoundPanel, "MuteGyrocopters", "Gyrocopters", 140, -152, 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(SoundPanel, "MuteRockets", "Rockets", 140, -172, false, "If checked, rockets will be muted.")
LeaPlusLC:MakeCB(SoundPanel, "MuteMechsuits", "Mechsuits", 140, -192, false, "If checked, mechsuits will be quieter.|n|nThis applies to Felsteel Annihilator, Lightforged Warframe, Sky Golem and other mechsuits.")
LeaPlusLC:MakeCB(SoundPanel, "MuteAerials", "Aerials", 140, -212, false, "If checked, jet aerial units will be quieter.|n|nThis applies to Aerial Unit R-21X and Rustbolt Resistor.")
LeaPlusLC:MakeCB(SoundPanel, "MuteHovercraft", "Hovercraft", 140, -232, false, "If checked, hovercraft will be quieter.|n|nThis applies to Xiwyllag ATV.")
LeaPlusLC:MakeTx(SoundPanel, "Mounts", 264, -72)
LeaPlusLC:MakeCB(SoundPanel, "MuteSoulseekers", "Soulseekers", 264, -92, false, "If checked, soulseekers will be quieter.|n|nThis applies to Corridor Creeper, Mawsworn Soulhunter and Bound Shadehound.")
LeaPlusLC:MakeCB(SoundPanel, "MuteBanLu", "Ban-Lu", 264, -112, false, "If checked, Ban-Lu will no longer talk to you.")
LeaPlusLC:MakeTx(SoundPanel, "Pets", 388, -72)
LeaPlusLC:MakeCB(SoundPanel, "MuteSunflower", "Sunflower", 388, -92, false, "If checked, the Singing Sunflower pet will be muted.")
LeaPlusLC:MakeTx(SoundPanel, "Combat", 388, -132)
LeaPlusLC:MakeCB(SoundPanel, "MuteBattleShouts", "Shouts", 388, -152, false, "If checked, battle shouts heard when casting specific spells will be muted.")
-- Set click width for sounds checkboxes
for k, v in pairs(muteTable) 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
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"
SetupMute()
else
SoundPanel:Show()
LeaPlusLC:HideFrames()
end
end)
end
----------------------------------------------------------------------
-- Save profession filters
----------------------------------------------------------------------
if LeaPlusLC["SaveProfFilters"] == "On" then
-- Main function
local function SetProfFilterFunc()
local ts = {}
local tradeEvent = CreateFrame("FRAME")
tradeEvent:RegisterEvent("TRADE_SKILL_DATA_SOURCE_CHANGED")
tradeEvent:SetScript("OnEvent", function()
-- Do nothing if trade skill UI is not open and loaded
if not C_TradeSkillUI.IsTradeSkillReady() then return end
-- Get current trade skill
local tradeSkillID = C_TradeSkillUI.GetTradeSkillLine()
if not tradeSkillID then return end
-- Set has materials checkbox
if ts["TradeSkillShowOnlyHasMaterials" .. tradeSkillID] then
C_TradeSkillUI.SetOnlyShowMakeableRecipes(ts["TradeSkillShowOnlyHasMaterials" .. tradeSkillID])
else
C_TradeSkillUI.SetOnlyShowMakeableRecipes(false)
end
-- Set has skill up checkbox
if ts["TradeSkillShowOnlySkillUps" .. tradeSkillID] then
C_TradeSkillUI.SetOnlyShowSkillUpRecipes(ts["TradeSkillShowOnlySkillUps" .. tradeSkillID])
else
C_TradeSkillUI.SetOnlyShowSkillUpRecipes(false)
end
-- Set slots filter
if ts["TradeSkillInventorySlot" .. tradeSkillID] then
C_TradeSkillUI.SetInventorySlotFilter(ts["TradeSkillInventorySlot" .. tradeSkillID], true, true)
end
-- Set category filter
if ts["TradeSkillRecipeCategory" .. tradeSkillID] then
C_TradeSkillUI.SetRecipeCategoryFilter(ts["TradeSkillRecipeCategory" .. tradeSkillID], ts["TradeSkillRecipeSubCategory" .. tradeSkillID])
end
-- Set source filter
local numSources = C_PetJournal.GetNumPetSources()
if numSources then
for i = 1, numSources do
if ts["TradeSkillSource" .. tradeSkillID .. i] then
C_TradeSkillUI.SetRecipeSourceTypeFilter(i, ts["TradeSkillSource" .. tradeSkillID .. i])
else
C_TradeSkillUI.SetRecipeSourceTypeFilter(i, false)
end
end
end
end)
-- Save has materials checkbox
hooksecurefunc(C_TradeSkillUI, "SetOnlyShowMakeableRecipes", function(state)
if not C_TradeSkillUI.IsTradeSkillReady() then return end
local tradeSkillID = C_TradeSkillUI.GetTradeSkillLine()
if tradeSkillID then
ts["TradeSkillShowOnlyHasMaterials" .. tradeSkillID] = state
end
end)
-- Save has skill up checkbox
hooksecurefunc(C_TradeSkillUI, "SetOnlyShowSkillUpRecipes", function(state)
if not C_TradeSkillUI.IsTradeSkillReady() then return end
local tradeSkillID = C_TradeSkillUI.GetTradeSkillLine()
if tradeSkillID then
ts["TradeSkillShowOnlySkillUps" .. tradeSkillID] = state
end
end)
-- Save slots filter
hooksecurefunc(C_TradeSkillUI, "SetInventorySlotFilter", function(state)
if not C_TradeSkillUI.IsTradeSkillReady() then return end
local tradeSkillID = C_TradeSkillUI.GetTradeSkillLine()
if tradeSkillID then
ts["TradeSkillInventorySlot" .. tradeSkillID] = state
end
end)
-- Save category filter
hooksecurefunc(C_TradeSkillUI, "SetRecipeCategoryFilter", function(categoryID, subCategoryID)
if not C_TradeSkillUI.IsTradeSkillReady() then return end
if categoryID then
local tradeSkillID = C_TradeSkillUI.GetTradeSkillLine()
if tradeSkillID then
ts["TradeSkillRecipeCategory" .. tradeSkillID] = categoryID
ts["TradeSkillRecipeSubCategory" .. tradeSkillID] = subCategoryID
end
end
end)
-- Save source filter
hooksecurefunc(C_TradeSkillUI, "SetRecipeSourceTypeFilter", function(sourceType, filtered)
if not C_TradeSkillUI.IsTradeSkillReady() then return end
local tradeSkillID = C_TradeSkillUI.GetTradeSkillLine()
if tradeSkillID then
ts["TradeSkillSource" .. tradeSkillID .. sourceType] = filtered
end
end)
-- Clear some settings when filter bar is closed
TradeSkillFrame.RecipeList.FilterBar.ExitButton:HookScript("OnClick", function()
local tradeSkillID = C_TradeSkillUI.GetTradeSkillLine()
if tradeSkillID then
ts["TradeSkillRecipeCategory" .. tradeSkillID] = nil -- Category
ts["TradeSkillRecipeSubCategory" .. tradeSkillID] = nil -- Subcategory
ts["TradeSkillInventorySlot" .. tradeSkillID] = nil -- Slots
-- Clear sources
local numSources = C_PetJournal.GetNumPetSources()
if numSources then
for i = 1, numSources do
ts["TradeSkillSource" .. tradeSkillID .. i] = nil
end
end
end
end)
-- Clear some settings on startup
C_TradeSkillUI.SetOnlyShowMakeableRecipes(false) -- Has materials
C_TradeSkillUI.SetOnlyShowSkillUpRecipes(false) -- Has skill up
C_TradeSkillUI.ClearRecipeSourceTypeFilter() -- Sources
end
-- Run function when Blizzard addon has loaded
if IsAddOnLoaded("Blizzard_TradeSkillUI") then
SetProfFilterFunc()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_TradeSkillUI" then
SetProfFilterFunc()
waitFrame:UnregisterAllEvents()
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" then
-- Process normal and existing chat frames on startup
for i = 1, 50 do
if _G["ChatFrame" .. i] then
_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
-- 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
hooksecurefunc("AchievementFrameAchievements_SelectButton", function(self)
local achievementID = self.id or nil
if achievementID then
-- Set editbox text
aEB:SetText("https://" .. wowheadLoc .. "/achievement=" .. achievementID)
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(self.id)
if achievementLink then
aEB.tiptext = achievementLink:match("%[(.-)%]") .. "|n" .. L["Press CTRL/C to copy."]
end
-- Show the editbox
aEB:Show()
end
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)
-- Hide editbox when achievement is deselected
hooksecurefunc("AchievementFrameAchievements_ClearSelection", function(self) aEB:Hide() end)
hooksecurefunc("AchievementCategoryButton_OnClick", function(self) aEB: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: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
mEB:SetText("https://" .. wowheadLoc .. "/quest=" .. questID)
-- 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
----------------------------------------------------------------------
-- Nude and tabard buttons
----------------------------------------------------------------------
-- Add buttons to main dressup frames
LeaPlusLC:CreateButton("DressUpNudeBtn", DressUpFrame, "Nude", "BOTTOMLEFT", 106, 79, 80, 22, false, "")
LeaPlusCB["DressUpNudeBtn"]:ClearAllPoints()
LeaPlusCB["DressUpNudeBtn"]:SetPoint("RIGHT", DressUpFrameResetButton, "LEFT", 0, 0)
LeaPlusCB["DressUpNudeBtn"]:SetScript("OnClick", function()
local playerActor = DressUpFrame.ModelScene:GetPlayerActor()
playerActor:Undress()
end)
LeaPlusLC:CreateButton("DressUpTabBtn", DressUpFrame, "Tabard", "BOTTOMLEFT", 26, 79, 80, 22, false, "")
LeaPlusCB["DressUpTabBtn"]:ClearAllPoints()
LeaPlusCB["DressUpTabBtn"]:SetPoint("RIGHT", LeaPlusCB["DressUpNudeBtn"], "LEFT", 0, 0)
LeaPlusCB["DressUpTabBtn"]:SetScript("OnClick", function()
local playerActor = DressUpFrame.ModelScene:GetPlayerActor()
playerActor:UndressSlot(19)
end)
-- Only show dressup buttons if its a player (reset button will show too)
hooksecurefunc(DressUpFrameResetButton, "Show", function()
LeaPlusCB["DressUpNudeBtn"]:Show()
LeaPlusCB["DressUpTabBtn"]:Show()
end)
hooksecurefunc(DressUpFrameResetButton, "Hide", function()
LeaPlusCB["DressUpNudeBtn"]:Hide()
LeaPlusCB["DressUpTabBtn"]:Hide()
end)
----------------------------------------------------------------------
-- Controls
----------------------------------------------------------------------
-- Hide controls for character sheet
CharacterModelFrameControlFrame:HookScript("OnShow", function()
CharacterModelFrameControlFrame: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)
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()
if not IsAltKeyDown() then return end
local gossipInfoTable = C_GossipInfo.GetOptions()
if gossipInfoTable[1].type == "gossip" then
C_GossipInfo.SelectOption(1)
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
end
end
-- Process gossip
if C_GossipInfo.GetNumOptions() == 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
----------------------------------------------------------------------
-- Enable hotkey
----------------------------------------------------------------------
if LeaPlusLC["EnableHotkey"] == "On" then
-- Create global binding function
local BindBtn = CreateFrame("Button", "LeaPlusGlobalBinding", LeaPlusGlobalPanel)
BindBtn:SetScript("OnClick", function() LeaPlusLC:SlashFunc() end)
-- Clear all bindings bound to panel and set hotkey
ClearOverrideBindings(LeaPlusGlobalPanel)
SetOverrideBindingClick(LeaPlusGlobalPanel, true, "CTRL-Z", "LeaPlusGlobalBinding")
end
----------------------------------------------------------------------
-- Faster looting
----------------------------------------------------------------------
if LeaPlusLC["FasterLooting"] == "On" then
-- Time delay
local tDelay = 0
-- Fast loot function
local function FastLoot()
if GetTime() - tDelay >= 0.3 then
tDelay = GetTime()
if GetCVarBool("autoLootDefault") ~= IsModifiedClick("AUTOLOOTTOGGLE") then
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
----------------------------------------------------------------------
-- Disable bag automation
----------------------------------------------------------------------
if LeaPlusLC["NoBagAutomation"] == "On" then
RunScript("hooksecurefunc('OpenAllBags', CloseAllBags)")
RunScript("hooksecurefunc('OpenAllBagsMatchingContext', CloseAllBags)")
end
----------------------------------------------------------------------
-- Hide level-up display
----------------------------------------------------------------------
if LeaPlusLC["HideLevelUpDisplay"] == "On" then
if LevelUpDisplay then
-- Patch 9.0.5
-- Create holder
local LevelUpDisplayHolder = CreateFrame("Frame", nil, UIParent)
-- Move LevelUpDisplay
LevelUpDisplay:ClearAllPoints()
if not IsAddOnLoaded("ElvUI") then
LevelUpDisplay:SetPoint("TOP", LevelUpDisplayHolder)
end
-- Maintain position of LevelUpDisplay
hooksecurefunc(LevelUpDisplay, "SetPoint", function(frame, void, anchor)
if anchor ~= LevelUpDisplayHolder then
frame:ClearAllPoints()
if not IsAddOnLoaded("ElvUI") then
frame:SetPoint("TOP", LevelUpDisplayHolder)
end
end
end)
-- Force zone text to show while LevelUpDisplay is showing
ZoneTextFrame:HookScript("OnEvent", function(self, event)
if LevelUpDisplay: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)
else
-- Patch 9.1
hooksecurefunc(EventToastManagerFrame, "Show", EventToastManagerFrame.Hide)
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" 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
-- Function to hide the talking frame
local function NoTalkingHeads()
hooksecurefunc(TalkingHeadFrame, "Show", function(self)
self:Hide()
end)
end
-- Run function when Blizzard addon is loaded
if IsAddOnLoaded("Blizzard_TalkingHeadUI") then
NoTalkingHeads()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_TalkingHeadUI" then
NoTalkingHeads()
waitFrame:UnregisterAllEvents()
end
end)
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, "AutoQuestShift", "Require shift key for quest automation", 16, -92, false, "If checked, you will need to hold the shift key down for quests to be automated.|n|nIf unchecked, holding shift will prevent quests from being automated.")
LeaPlusLC:MakeCB(QuestPanel, "AutoQuestAvailable", "Accept available quests automatically", 16, -112, false, "If checked, available quests will be accepted automatically.")
LeaPlusLC:MakeCB(QuestPanel, "AutoQuestCompleted", "Turn-in completed quests automatically", 16, -132, false, "If checked, completed quests will be turned-in automatically.")
LeaPlusLC:MakeCB(QuestPanel, "AutoQuestNoDaily", "Don't accept daily quests automatically", 16, -152, false, "If checked, daily quests will not be accepted automatically.")
LeaPlusLC:MakeCB(QuestPanel, "AutoQuestNoWeekly", "Don't accept weekly quests automatically", 16, -172, false, "If checked, weekly quests will not be accepted automatically.")
-- 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["AutoQuestAvailable"] = "On"
LeaPlusLC["AutoQuestCompleted"] = "On"
LeaPlusLC["AutoQuestNoDaily"] = "Off"
LeaPlusLC["AutoQuestNoWeekly"] = "Off"
-- 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["AutoQuestAvailable"] = "On"
LeaPlusLC["AutoQuestCompleted"] = "On"
LeaPlusLC["AutoQuestNoDaily"] = "Off"
LeaPlusLC["AutoQuestNoWeekly"] = "Off"
else
QuestPanel:Show()
LeaPlusLC:HideFrames()
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)
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
then
return true
end
end
end
-- Function to check if quest requires currency or a crafting reagent
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 = GetQuestItemInfo("required", i)
if name then
local itemID = GetItemInfoInstant(name)
if itemID then
local void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void, isCraftingReagent = GetItemInfo(itemID)
if isCraftingReagent then
-- Item is a crafting reagent so do nothing
return true
end
if itemID == 104286 then -- Quivering Firestorm Egg
return true
end
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
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
-- Event handler
qFrame:SetScript("OnEvent", function(self, event, arg1)
-- 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 IsShiftKeyDown() then return
elseif LeaPlusLC["AutoQuestShift"] == "Off" and IsShiftKeyDown() then return
end
----------------------------------------------------------------------
-- Accept quests automatically
----------------------------------------------------------------------
-- Accept quests with a quest detail window
if event == "QUEST_DETAIL" then
if LeaPlusLC["AutoQuestAvailable"] == "On" then
-- Don't accept daily quests if option to exclude them is enabled
if LeaPlusLC["AutoQuestNoDaily"] == "On" and QuestIsDaily() then return end
-- Don't accept weekly quests if option to exclude them is enabled
if LeaPlusLC["AutoQuestNoWeekly"] == "On" 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["AutoQuestAvailable"] == "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() or GossipFrameGreetingPanel:IsShown() then
-- 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["AutoQuestAvailable"] == "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 ~= 2 or LeaPlusLC["AutoQuestNoDaily"] == "Off" then
if frequency ~= 3 or LeaPlusLC["AutoQuestNoWeekly"] == "Off" then
return SelectAvailableQuest(i)
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
return C_GossipInfo.SelectActiveQuest(titleIndex)
end
end
end
-- Select gossip available quests
if LeaPlusLC["AutoQuestAvailable"] == "On" then
local GossipQuests = C_GossipInfo.GetAvailableQuests()
for titleIndex, questInfo in ipairs(GossipQuests) do
if questInfo.frequency ~= 2 or LeaPlusLC["AutoQuestNoDaily"] == "Off" then
if questInfo.frequency ~= 3 or LeaPlusLC["AutoQuestNoWeekly"] == "Off" then
if not questInfo.questID or not IsQuestIDBlocked(questInfo.questID) and DoesQuestHaveRequirementsMet(questInfo.questID) then
return C_GossipInfo.SelectAvailableQuest(titleIndex)
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")
gFrame:SetScript("OnEvent", function()
-- Do nothing if shift is being held
if IsShiftKeyDown() then return end
-- Traverse faction IDs for known bodyguards (http://www.wowhead.com/factions/warlords-of-draenor/barracks-bodyguards)
local id = GetFriendshipReputation();
if id then
if id == 1733 -- Delvar Ironfist
or id == 1736 -- Tormmok
or id == 1737 -- Talonpriest Ishaal
or id == 1738 -- Defender Illona
or id == 1739 -- Vivianne
or id == 1740 -- Aeda Brightdawn
or id == 1741 -- Leorajh
then
-- Close gossip window if it's for a cooperating (active) bodyguard
if UnitCanCooperate("target", "player") then
C_GossipInfo.CloseGossip()
end
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 (no reload required)
----------------------------------------------------------------------
do
-- 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 SellJunkFrame = CreateFrame("FRAME")
local SellJunkTicker, mBagID, mBagSlot
-- Function to stop selling
local function StopSelling()
if SellJunkTicker then SellJunkTicker:Cancel() end
StartMsg:Hide()
SellJunkFrame:UnregisterEvent("ITEM_LOCKED")
SellJunkFrame:UnregisterEvent("ITEM_UNLOCKED")
end
-- Vendor function
local function SellJunkFunc()
-- Variables
local SoldCount, Rarity, ItemPrice = 0, 0, 0
local CurrentItemLink, void
-- Traverse bags and sell grey items
for BagID = 0, 4 do
for BagSlot = 1, GetContainerNumSlots(BagID) do
CurrentItemLink = GetContainerItemLink(BagID, BagSlot)
if CurrentItemLink then
void, void, Rarity, void, void, void, void, void, void, void, ItemPrice = GetItemInfo(CurrentItemLink)
local void, itemCount = GetContainerItemInfo(BagID, BagSlot)
if Rarity == 0 and ItemPrice ~= 0 then
SoldCount = SoldCount + 1
if MerchantFrame:IsShown() then
-- If merchant frame is open, vendor the item
UseContainerItem(BagID, BagSlot)
-- Perform actions on first iteration
if SellJunkTicker._remainingIterations == IterationCount then
-- Calculate total price
totalPrice = totalPrice + (ItemPrice * itemCount)
-- Store first sold bag slot for analysis
if SoldCount == 1 then
mBagID, mBagSlot = BagID, BagSlot
end
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 then
LeaPlusLC:Print(L["Sold junk for"] .. " " .. GetCoinText(totalPrice) .. ".")
end
end
end
-- Function to setup events
local function SetupEvents()
if LeaPlusLC["AutoSellJunk"] == "On" then
SellJunkFrame:RegisterEvent("MERCHANT_SHOW");
SellJunkFrame:RegisterEvent("MERCHANT_CLOSED");
else
SellJunkFrame:UnregisterEvent("MERCHANT_SHOW")
SellJunkFrame:UnregisterEvent("MERCHANT_CLOSED")
end
end
-- Setup events when option is clicked and on startup (if option is enabled)
LeaPlusCB["AutoSellJunk"]:HookScript("OnClick", SetupEvents)
if LeaPlusLC["AutoSellJunk"] == "On" then SetupEvents() end
-- Event handler
SellJunkFrame:SetScript("OnEvent", function(self, event)
if event == "MERCHANT_SHOW" then
-- Reset variables
totalPrice, mBagID, mBagSlot = 0, -1, -1
-- Do nothing if shift key is held down
if IsShiftKeyDown() then return end
-- Cancel existing ticker if present
if SellJunkTicker then SellJunkTicker:Cancel() end
-- Sell grey items using ticker (ends when all grey items are sold or iteration count reached)
SellJunkTicker = C_Timer.NewTicker(0.2, SellJunkFunc, IterationCount)
SellJunkFrame:RegisterEvent("ITEM_LOCKED")
SellJunkFrame:RegisterEvent("ITEM_UNLOCKED")
elseif event == "ITEM_LOCKED" then
StartMsg:Show()
SellJunkFrame:UnregisterEvent("ITEM_LOCKED")
elseif event == "ITEM_UNLOCKED" then
SellJunkFrame:UnregisterEvent("ITEM_UNLOCKED")
-- Check whether vendor refuses to buy items
if mBagID and mBagSlot and mBagID ~= -1 and mBagSlot ~= -1 then
local texture, count, locked = GetContainerItemInfo(mBagID, mBagSlot)
if count and not locked then
-- Item has been unlocked but still not sold so stop selling
StopSelling()
end
end
elseif event == "MERCHANT_CLOSED" then
-- If merchant frame is closed, stop selling
StopSelling()
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
LeaPlusLC:Print(L["Repaired for"] .. " " .. GetCoinText(RepairCost) .. ".")
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.")
-- 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"
-- 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"
else
RepairPanel:Show()
LeaPlusLC:HideFrames()
end
end)
end
----------------------------------------------------------------------
-- Hide the combat log
----------------------------------------------------------------------
if LeaPlusLC["NoCombatLogTab"] == "On" 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
-- ElvUI Fix
local eFixFuncApplied, eFixHookApplied
local function ElvUIFix()
if eFixFuncApplied then return end
local E = unpack(ElvUI)
if E.private.chat.enable then
C_Timer.After(2, function()
LeaPlusLC:Print("To hide the combat log, you need to disable the chat module in ElvUI.")
return
end)
end
hooksecurefunc(E, "PLAYER_ENTERING_WORLD", function()
if eFixHookApplied then return end
ChatFrame2Tab:EnableMouse(false)
ChatFrame2Tab:SetText(" ")
ChatFrame2Tab:SetScale(0.01)
ChatFrame2Tab:SetWidth(0.01)
ChatFrame2Tab:SetHeight(0.01)
eFixHookApplied = true
end)
eFixFuncApplied = true
end
-- Run ElvUI fix when ElvUI has loaded
if IsAddOnLoaded("ElvUI") then
ElvUIFix()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "ElvUI" then
ElvUIFix()
waitFrame:UnregisterAllEvents()
end
end)
end
end
----------------------------------------------------------------------
-- Show player chain
----------------------------------------------------------------------
if LeaPlusLC["ShowPlayerChain"] == "On" then
-- Ensure chain doesnt clip through pet portrait and rune frame
PetPortrait:GetParent():SetFrameLevel(4)
RuneFrame:SetFrameLevel(4)
-- 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["RARE"], L["ELITE"], L["RARE ELITE"]}, "")
-- 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 -- Rare
PlayerFrameTexture:SetTexture("Interface\\TargetingFrame\\UI-TargetingFrame-Rare.blp");
elseif chain == 2 then -- Elite
PlayerFrameTexture:SetTexture("Interface\\TargetingFrame\\UI-TargetingFrame-Elite.blp");
elseif chain == 3 then -- Rare Elite
PlayerFrameTexture:SetTexture("Interface\\TargetingFrame\\UI-TargetingFrame-Rare-Elite.blp");
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"] = 2
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"] = 3;
SetChainStyle();
else
LeaPlusLC:HideFrames();
ChainPanel:Show();
end
end)
end
----------------------------------------------------------------------
-- Show raid frame toggle button
----------------------------------------------------------------------
if LeaPlusLC["ShowRaidToggle"] == "On" 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" then
hooksecurefunc(PlayerHitIndicator, "Show", PlayerHitIndicator.Hide)
hooksecurefunc(PetHitIndicator, "Show", PetHitIndicator.Hide)
end
----------------------------------------------------------------------
-- Class colored frames
----------------------------------------------------------------------
if LeaPlusLC["ClassColFrames"] == "On" then
-- Create background frame for player frame
local PlayFN = CreateFrame("FRAME", nil, PlayerFrame)
PlayFN:Hide()
PlayFN:SetWidth(TargetFrameNameBackground:GetWidth())
PlayFN:SetHeight(TargetFrameNameBackground:GetHeight())
local void, void, void, x, y = TargetFrameNameBackground:GetPoint()
PlayFN:SetPoint("TOPLEFT", PlayerFrame, "TOPLEFT", -x, y)
PlayFN.t = PlayFN:CreateTexture(nil, "BORDER")
PlayFN.t:SetAllPoints()
PlayFN.t:SetTexture("Interface\\TargetingFrame\\UI-TargetingFrame-LevelBackground")
local c = LeaPlusLC["RaidColors"][select(2, UnitClass("player"))]
if c then PlayFN.t: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 TargetFrameNameBackground:SetVertexColor(c.r, c.g, c.b) end
end
if UnitIsPlayer("focus") then
local c = LeaPlusLC["RaidColors"][select(2, UnitClass("focus"))]
if c then FocusFrameNameBackground: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
hooksecurefunc("FocusFrame_SetSmallSize", function()
if LeaPlusLC["ClassColTarget"] == "On" then
TargetFrameCol()
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
----------------------------------------------------------------------
-- Minimap customisation
----------------------------------------------------------------------
if LeaPlusLC["MinimapMod"] == "On" then
----------------------------------------------------------------------
-- Configuration panel
----------------------------------------------------------------------
-- Create configuration panel
local SideMinimap = LeaPlusLC:CreatePanel("Enhance minimap", "SideMinimap")
-- Hide panel during combat
SideMinimap:RegisterEvent("PLAYER_REGEN_DISABLED")
SideMinimap:SetScript("OnEvent", SideMinimap.Hide)
-- Add checkboxes
LeaPlusLC:MakeTx(SideMinimap, "Settings", 16, -72)
LeaPlusLC:MakeCB(SideMinimap, "HideZoneTextBar", "Hide the zone text bar", 16, -92, false, "If checked, the zone text bar will be hidden. The tracking button tooltip will show zone information.")
LeaPlusLC:MakeCB(SideMinimap, "HideMiniZoomBtns", "Hide the zoom buttons", 16, -112, false, "If checked, the zoom buttons will be hidden. You can use the mousewheel to zoom regardless of this setting.")
LeaPlusLC:MakeCB(SideMinimap, "HideMiniClock", "Hide the clock", 16, -132, false, "If checked, the clock will be hidden.")
-- Add slider control
LeaPlusLC:MakeTx(SideMinimap, "Scale", 356, -72)
LeaPlusLC:MakeSL(SideMinimap, "MinimapScale", "Drag to set the minimap scale.|n|nNote that if you are using the default action bars, rescaling the minimap will also rescale the right action bars at startup so you may want to leave this at 100%.", 1, 2, 0.1, 356, -92, "%.2f")
----------------------------------------------------------------------
-- Hide the zone text bar
----------------------------------------------------------------------
-- Store Blizzard handlers
local origMiniMapTrackingButtonOnEnter = MiniMapTrackingButton:GetScript("OnEnter")
local zonta, zontp, zontr, zontx, zonty = MinimapZoneTextButton:GetPoint()
-- Function to show zone tooltip
local function ShowZoneTip(doNotShow)
if LeaPlusLC["HideZoneTextBar"] == "On" then
-- Show zone information in tooltip
local zoneName = GetZoneText()
local subzoneName = GetSubZoneText()
if subzoneName == zoneName then subzoneName = "" end
-- Change the owner and position (needed for Minimap_SetTooltip)
GameTooltip:SetOwner(MinimapZoneTextButton, "ANCHOR_LEFT")
MinimapZoneTextButton:SetAllPoints(MiniMapTrackingButton)
-- Show the tooltip
local pvpType, isSubZonePvP, factionName = GetZonePVPInfo()
Minimap_SetTooltip(pvpType, factionName)
GameTooltip:Show()
if doNotShow == true then GameTooltip:Hide() end
else
MinimapZoneTextButton:ClearAllPoints()
MinimapZoneTextButton:SetPoint(zonta, zontp, zontr, zontx, zonty)
end
end
-- Function to set the zone text bar position
local function SetTitleBarPos()
if OrderHallCommandBar then
if OrderHallCommandBar:IsShown() then
-- Order hall command bar is showing so move minimap cluster to top
MinimapCluster:ClearAllPoints()
MinimapCluster:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", 0, 0)
if LeaPlusLC["HideZoneTextBar"] == "Off" then
-- Zone text bar is showing so hide it as it will be behind the order hall command bar
MinimapBorderTop:SetTexture("")
MinimapZoneTextButton:Hide()
MiniMapWorldMapButton:Hide()
end
else
-- Order hall command bar is not showing
if LeaPlusLC["HideZoneTextBar"] == "On" then
-- Zone text bar is being hidden so move minimap cluster down below the order hall command bar
MinimapCluster:ClearAllPoints()
MinimapCluster:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", 0, 20)
else
-- Zone text bar is not being hidden so move order hall command bar to top
MinimapCluster:ClearAllPoints()
MinimapCluster:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", 0, 0)
-- Show zone text bar
MinimapZoneTextButton:Show()
MiniMapWorldMapButton:Show()
MinimapBorderTop:SetTexture("Interface\\Minimap\\UI-Minimap-Border")
end
end
else
-- Order hall command bar has not been loaded by the game yet
if LeaPlusLC["HideZoneTextBar"] == "On" then
MinimapCluster:ClearAllPoints()
MinimapCluster:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", 0, 20)
else
MinimapCluster:ClearAllPoints()
MinimapCluster:SetPoint("TOPRIGHT", UIParent, "TOPRIGHT", 0, 0)
end
end
end
-- Function to toggle the zone text bar
local function SetMiniZoneText()
if LeaPlusLC["HideZoneTextBar"] == "On" then
-- Hide the zone text bar
MinimapZoneTextButton:Hide()
MiniMapWorldMapButton:Hide()
MinimapBorderTop:SetTexture("")
-- Move the minimap up to the top
SetTitleBarPos()
-- Set the tooltip of the tracking button as the zone name
MiniMapTrackingButton:SetScript("OnEnter", ShowZoneTip)
else
-- Show the zone text bar
MinimapZoneTextButton:Show()
MiniMapWorldMapButton:Show()
MinimapBorderTop:SetTexture("Interface\\Minimap\\UI-Minimap-Border")
-- Move the minimap to its original position
SetTitleBarPos()
-- Set the tooltip of the tracking button as the original one
MiniMapTrackingButton:SetScript("OnEnter", origMiniMapTrackingButtonOnEnter)
end
end
-- Set the zone text bar layout and tooltip position when option is clicked
LeaPlusCB["HideZoneTextBar"]:HookScript("OnClick", function()
SetMiniZoneText()
ShowZoneTip(true)
end)
-- Set the zone text bar layout on startup
SetMiniZoneText()
-- Function to move the minimap down when order hall bar is shown or option is clicked
local function ManageCommandBar()
-- Set zone text bar when order hall bar is shown
OrderHallCommandBar:HookScript("OnShow", function()
C_Timer.After(0.1, function()
if OrderHallCommandBar:IsShown() then
SetTitleBarPos()
end
end)
end)
-- Set zone text bar when order hall bar is hidden
OrderHallCommandBar:HookScript("OnHide", SetTitleBarPos)
end
-- Run function when Blizzard addon has loaded
if IsAddOnLoaded("Blizzard_OrderHallUI") then
ManageCommandBar()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_OrderHallUI" then
ManageCommandBar()
waitFrame:UnregisterAllEvents()
end
end)
end
----------------------------------------------------------------------
-- Hide the zoom buttons
----------------------------------------------------------------------
-- Function to toggle the zoom buttons
local function ToggleZoomButtons()
if LeaPlusLC["HideMiniZoomBtns"] == "On" then
MinimapZoomIn:Hide()
MinimapZoomOut:Hide()
else
MinimapZoomIn:Show()
MinimapZoomOut:Show()
end
end
-- Set the zoom buttons when the option is clicked and on startup
LeaPlusCB["HideMiniZoomBtns"]:HookScript("OnClick", ToggleZoomButtons)
ToggleZoomButtons()
----------------------------------------------------------------------
-- Hide the clock
----------------------------------------------------------------------
-- Function to show or hide the clock
local function SetMiniClock()
if IsAddOnLoaded("Blizzard_TimeManager") then
if LeaPlusLC["HideMiniClock"] == "On" then
TimeManagerClockButton:Hide()
else
TimeManagerClockButton:Show()
end
end
end
-- Run function when Blizzard addon is loaded
if IsAddOnLoaded("Blizzard_TimeManager") then
SetMiniClock()
else
local waitFrame = CreateFrame("FRAME")
waitFrame:RegisterEvent("ADDON_LOADED")
waitFrame:SetScript("OnEvent", function(self, event, arg1)
if arg1 == "Blizzard_TimeManager" then
SetMiniClock()
waitFrame:UnregisterAllEvents()
end
end)
end
-- Update the clock when the checkbox is clicked
LeaPlusCB["HideMiniClock"]:HookScript("OnClick", SetMiniClock)
----------------------------------------------------------------------
-- Enable mousewheel zoom
----------------------------------------------------------------------
-- Function to control mousewheel zoom
local function MiniZoom(self, arg1)
if arg1 > 0 and self:GetZoom() < 5 then
-- Zoom in
MinimapZoomOut:Enable()
self:SetZoom(self:GetZoom() + 1)
if(Minimap:GetZoom() == (Minimap:GetZoomLevels() - 1)) then
MinimapZoomIn:Disable()
end
elseif arg1 < 0 and self:GetZoom() > 0 then
-- Zoom out
MinimapZoomIn:Enable()
self:SetZoom(self:GetZoom() - 1)
if(Minimap:GetZoom() == 0) then
MinimapZoomOut:Disable()
end
end
end
-- Enable mousewheel zoom
Minimap:EnableMouseWheel(true)
Minimap:SetScript("OnMouseWheel", MiniZoom)
----------------------------------------------------------------------
-- Minimap scale
----------------------------------------------------------------------
-- Function to set the minimap scale
local function SetMiniScale()
MinimapCluster:SetScale(LeaPlusLC["MinimapScale"])
-- Set slider formatted text
LeaPlusCB["MinimapScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["MinimapScale"] * 100)
end
-- Set minimap scale when slider is changed and on startup
LeaPlusCB["MinimapScale"]:HookScript("OnValueChanged", SetMiniScale)
SetMiniScale()
----------------------------------------------------------------------
-- Buttons
----------------------------------------------------------------------
-- Help button tooltip
SideMinimap.h.tiptext = L["This panel will close automatically if you enter combat."]
-- Back button handler
SideMinimap.b:SetScript("OnClick", function()
SideMinimap:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page5"]:Show()
return
end)
-- Reset button handler
SideMinimap.r:SetScript("OnClick", function()
LeaPlusLC["HideZoneTextBar"] = "Off"; SetMiniZoneText(); ShowZoneTip(true)
LeaPlusLC["HideMiniZoomBtns"] = "Off"; ToggleZoomButtons()
LeaPlusLC["HideMiniClock"] = "Off"; SetMiniClock()
LeaPlusLC["MinimapScale"] = 1; SetMiniScale()
SideMinimap:Hide(); SideMinimap:Show()
end)
-- Configuration button handler
LeaPlusCB["ModMinimapBtn"]:SetScript("OnClick", function()
if LeaPlusLC:PlayerInCombat() then
return
else
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["HideZoneTextBar"] = "On"; SetMiniZoneText(); ShowZoneTip(true)
LeaPlusLC["HideMiniZoomBtns"] = "Off"; ToggleZoomButtons()
LeaPlusLC["HideMiniClock"] = "Off"; SetMiniClock()
LeaPlusLC["MinimapScale"] = 1.30; SetMiniScale()
else
-- Show configuration panel
SideMinimap:Show()
LeaPlusLC:HideFrames()
end
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, 36, 1, 16, -92, "%.0f")
-- Function to update the font size
local function QuestSizeUpdate()
QuestTitleFont:SetFont(QuestFont:GetFont(), LeaPlusLC["LeaPlusQuestFontSize"] + 3, nil)
QuestFont:SetFont(QuestFont:GetFont(), LeaPlusLC["LeaPlusQuestFontSize"] + 1, nil)
QuestFontNormalSmall:SetFont(QuestFontNormalSmall:GetFont(), LeaPlusLC["LeaPlusQuestFontSize"], nil)
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, 36, 1, 16, -92, "%.0f")
-- Function to set the text size
local function MailSizeUpdate()
local MailFont = QuestFont:GetFont();
OpenMailBodyText:SetFont(MailFont, LeaPlusLC["LeaPlusMailFontSize"])
SendMailBodyEditBox:SetFont(MailFont, LeaPlusLC["LeaPlusMailFontSize"])
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" 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" then
local stancebar = CreateFrame("FRAME", nil, UIParent)
stancebar:Hide()
StanceBarFrame:UnregisterAllEvents()
StanceBarFrame:SetParent(stancebar)
end
----------------------------------------------------------------------
-- Hide gryphons
----------------------------------------------------------------------
if LeaPlusLC["NoGryphons"] == "On" then
MainMenuBarArtFrame.LeftEndCap:Hide();
MainMenuBarArtFrame.RightEndCap:Hide();
end
----------------------------------------------------------------------
-- Disable chat fade
----------------------------------------------------------------------
if LeaPlusLC["NoChatFade"] == "On" 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" 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" 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()
----------------------------------------------------------------------
-- Disable sticky editbox
----------------------------------------------------------------------
if LeaPlusLC["NoStickyEditbox"] == "On" then
hooksecurefunc("ChatEdit_OnEditFocusLost", function(self)
ChatEdit_DeactivateChat(self)
ChatEdit_ClearChat(self)
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
if UnitGUID(unit) == details.guid then
local requesterName = UnitName(unit)
if requesterName and LeaPlusLC:FriendCheck(requesterName) 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")
else
SetCVar("ffxDeath", "1")
SetCVar("ffxNether", "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 options panel is showing
if InterfaceOptionsFrame:IsShown() or VideoOptionsFrame:IsShown() or ChatConfigFrame:IsShown() then return end
-- 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() then
for i = 1, GetNumTrackingTypes() do
local name, texture, active, category = GetTrackingInfo(i)
if name == MINIMAP_TRACKING_TARGET then
if active then
SetTracking(i, false)
LeaPlusLC:DisplayMessage(L["Target Tracking Disabled"], true);
else
SetTracking(i, true)
LeaPlusLC:DisplayMessage(L["Target Tracking Enabled"], true);
end
end
end
return
end
-- Shift key toggles music
if IsShiftKeyDown() and not IsControlKeyDown() then
Sound_ToggleMusic();
return
end
-- Shift key and control key toggles Zygor addon
if IsShiftKeyDown() and IsControlKeyDown() then
LeaPlusLC:ZygorToggle();
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
-- Control key toggles error messages
if 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
-- Shift key toggles stopwatch
if IsShiftKeyDown() and not IsControlKeyDown() then
Stopwatch_Toggle()
return
end
-- Shift key and control key toggles maximised window mode
if IsShiftKeyDown() and IsControlKeyDown() 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
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()
end
----------------------------------------------------------------------
-- Show volume control on character sheet
----------------------------------------------------------------------
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(CharacterModelFrame, "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)
CharacterModelFrame:HookScript("OnShow",function()
SetVolumePlacement();
end)
end
----------------------------------------------------------------------
-- Use arrow keys in chat
----------------------------------------------------------------------
if LeaPlusLC["UseArrowKeysInChat"] == "On" 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" then
-- Create hidden frame to store social button
local tframe = CreateFrame("FRAME")
tframe:Hide()
QuickJoinToastButton:SetParent(tframe)
end
----------------------------------------------------------------------
-- L41: Manage buffs
----------------------------------------------------------------------
if LeaPlusLC["ManageBuffs"] == "On" then
-- Allow buff frame to be moved
BuffFrame:SetMovable(true)
BuffFrame:SetUserPlaced(true)
BuffFrame:SetDontSavePosition(true)
BuffFrame:SetClampedToScreen(true)
-- Set buff frame position at startup
BuffFrame:ClearAllPoints()
BuffFrame:SetPoint(LeaPlusLC["BuffFrameA"], UIParent, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"])
BuffFrame:SetScale(LeaPlusLC["BuffFrameScale"])
TemporaryEnchantFrame:SetScale(LeaPlusLC["BuffFrameScale"])
-- Set buff frame position when the game resets it
hooksecurefunc("UIParent_UpdateTopFramePositions", function()
BuffFrame:SetMovable(true)
BuffFrame:ClearAllPoints()
BuffFrame:SetPoint(LeaPlusLC["BuffFrameA"], UIParent, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"])
end)
-- Create drag frame
local dragframe = CreateFrame("FRAME", nil, nil, "BackdropTemplate")
dragframe:SetPoint("TOPRIGHT", BuffFrame, "TOPRIGHT", 0, 2.5)
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["BuffFrameScale"])
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["Buffs"])
-- Click handler
dragframe:SetScript("OnMouseDown", function(self, btn)
-- Start dragging if left clicked
if btn == "LeftButton" then
BuffFrame:StartMoving()
end
end)
dragframe:SetScript("OnMouseUp", function()
-- Save frame positions
BuffFrame:StopMovingOrSizing()
LeaPlusLC["BuffFrameA"], void, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"] = BuffFrame:GetPoint()
BuffFrame:SetMovable(true)
BuffFrame:ClearAllPoints()
BuffFrame:SetPoint(LeaPlusLC["BuffFrameA"], UIParent, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"])
end)
-- Create configuration panel
local BuffPanel = LeaPlusLC:CreatePanel("Manage buffs", "BuffPanel")
LeaPlusLC:MakeTx(BuffPanel, "Scale", 16, -72)
LeaPlusLC:MakeSL(BuffPanel, "BuffFrameScale", "Drag to set the buffs frame scale.", 0.5, 2, 0.05, 16, -92, "%.2f")
-- Set scale when slider is changed
LeaPlusCB["BuffFrameScale"]:HookScript("OnValueChanged", function()
BuffFrame:SetScale(LeaPlusLC["BuffFrameScale"])
TemporaryEnchantFrame:SetScale(LeaPlusLC["BuffFrameScale"])
dragframe:SetScale(LeaPlusLC["BuffFrameScale"])
-- Show formatted slider value
LeaPlusCB["BuffFrameScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["BuffFrameScale"] * 100)
end)
-- Help button tooltip
BuffPanel.h.tiptext = L["Drag the frame overlay to position the frame."]
-- Back button handler
BuffPanel.b:SetScript("OnClick", function()
BuffPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show()
return
end)
-- Reset button handler
BuffPanel.r:SetScript("OnClick", function()
-- Reset position and scale
LeaPlusLC["BuffFrameA"] = "TOPRIGHT"
LeaPlusLC["BuffFrameR"] = "TOPRIGHT"
LeaPlusLC["BuffFrameX"] = -205
LeaPlusLC["BuffFrameY"] = -13
LeaPlusLC["BuffFrameScale"] = 1
BuffFrame:ClearAllPoints()
BuffFrame:SetPoint(LeaPlusLC["BuffFrameA"], UIParent, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"])
-- Refresh configuration panel
BuffPanel:Hide(); BuffPanel:Show()
dragframe:Show()
end)
-- Show configuration panel when options panel button is clicked
LeaPlusCB["ManageBuffsButton"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["BuffFrameA"] = "TOPRIGHT"
LeaPlusLC["BuffFrameR"] = "TOPRIGHT"
LeaPlusLC["BuffFrameX"] = -271
LeaPlusLC["BuffFrameY"] = 0
LeaPlusLC["BuffFrameScale"] = 0.80
BuffFrame:ClearAllPoints()
BuffFrame:SetPoint(LeaPlusLC["BuffFrameA"], UIParent, LeaPlusLC["BuffFrameR"], LeaPlusLC["BuffFrameX"], LeaPlusLC["BuffFrameY"])
BuffFrame:SetScale(LeaPlusLC["BuffFrameScale"])
TemporaryEnchantFrame:SetScale(LeaPlusLC["BuffFrameScale"])
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 according to UI scale
dragframe:SetWidth(280 * LeaPlusLC["gscale"])
dragframe:SetHeight(225 * LeaPlusLC["gscale"])
-- Show configuration panel
BuffPanel:Show()
LeaPlusLC:HideFrames()
dragframe:Show()
end
end)
-- Hide drag frame when configuration panel is closed
BuffPanel:HookScript("OnHide", function() dragframe:Hide() end)
end
----------------------------------------------------------------------
-- L42: Manage frames
----------------------------------------------------------------------
-- Frame Movement
if LeaPlusLC["FrmEnabled"] == "On" then
-- Lock the player and target frames
PlayerFrame:RegisterForDrag()
TargetFrame:RegisterForDrag()
-- Remove integrated movement functions to avoid conflicts
_G.PlayerFrame_ResetUserPlacedPosition = function() end
_G.TargetFrame_ResetUserPlacedPosition = function() end
_G.PlayerFrame_SetLocked = function() end
_G.TargetFrame_SetLocked = function() end
-- Create frame table (used for local traversal)
local FrameTable = {DragPlayerFrame = PlayerFrame, DragTargetFrame = TargetFrame, DragGhostFrame = GhostFrame, DragMirrorTimer1 = MirrorTimer1}
-- Create main table structure in saved variables if it doesn't exist
if (LeaPlusDB["Frames"]) == nil then
LeaPlusDB["Frames"] = {}
end
-- Create frame based table structure in saved variables if it doesn't exist and set initial scales
for k,v in pairs(FrameTable) do
local vf = v:GetName()
-- Create frame table structure if it doesn't exist
if not LeaPlusDB["Frames"][vf] then
LeaPlusDB["Frames"][vf] = {}
end
-- Set saved scale value to default if it doesn't exist
if not LeaPlusDB["Frames"][vf]["Scale"] then
LeaPlusDB["Frames"][vf]["Scale"] = 1.00
end
-- Set frame scale to saved value
_G[vf]:SetScale(LeaPlusDB["Frames"][vf]["Scale"])
-- Don't save frame position
_G[vf]:SetMovable(true)
_G[vf]:SetUserPlaced(true)
_G[vf]:SetDontSavePosition(true)
end
-- Set frames to manual values
local function LeaFramesSetPos(frame, point, parent, relative, xoff, yoff)
frame:SetMovable(true)
frame:ClearAllPoints()
frame:SetPoint(point, parent, relative, xoff, yoff)
end
-- Set frames to default values
local function LeaPlusFramesDefaults()
LeaFramesSetPos(PlayerFrame , "TOPLEFT" , UIParent, "TOPLEFT" , -19, -4)
LeaFramesSetPos(TargetFrame , "TOPLEFT" , UIParent, "TOPLEFT" , 250, -4)
LeaFramesSetPos(GhostFrame , "TOP" , UIParent, "TOP" , -5, -29)
LeaFramesSetPos(MirrorTimer1 , "TOP" , UIParent, "TOP" , -5, -96)
end
-- Create configuration panel
local SideFrames = LeaPlusLC:CreatePanel("Manage frames", "SideFrames")
-- Variable used to store currently selected frame
local currentframe
-- Create scale title
LeaPlusLC:MakeTx(SideFrames, "Scale", 16, -72)
-- Set initial slider value (will be changed when drag frames are selected)
LeaPlusLC["FrameScale"] = 1.00
-- Create scale slider
LeaPlusLC:MakeSL(SideFrames, "FrameScale", "Drag to set the scale of the selected frame.", 0.5, 3.0, 0.05, 16, -92, "%.2f")
LeaPlusCB["FrameScale"]:HookScript("OnValueChanged", function(self, value)
if currentframe then -- If a frame is selected
-- Set real and drag frame scale
LeaPlusDB["Frames"][currentframe]["Scale"] = value
_G[currentframe]:SetScale(LeaPlusDB["Frames"][currentframe]["Scale"])
LeaPlusLC["Drag" .. currentframe]:SetScale(LeaPlusDB["Frames"][currentframe]["Scale"])
-- If target frame scale is changed, also change combo point frame
if currentframe == "TargetFrame" then
ComboFrame:SetScale(LeaPlusDB["Frames"]["TargetFrame"]["Scale"])
end
-- Set slider formatted text
LeaPlusCB["FrameScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["FrameScale"] * 100)
end
end)
-- Set initial scale slider state and value
LeaPlusCB["FrameScale"]:HookScript("OnShow", function()
if not currentframe then
-- No frame selected so select the player frame
currentframe = PlayerFrame:GetName()
LeaPlusLC["DragPlayerFrame"].t:SetColorTexture(0.0, 1.0, 0.0,0.5)
end
-- Set the scale slider value to the selected frame
LeaPlusCB["FrameScale"]:SetValue(LeaPlusDB["Frames"][currentframe]["Scale"])
-- Set slider formatted text
LeaPlusCB["FrameScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["FrameScale"] * 100)
end)
-- Help button tooltip
SideFrames.h.tiptext = L["Drag the frame overlays to position the frames.|n|nTo change the scale of a frame, click it to select it then adjust the scale slider.|n|nThis panel will close automatically if you enter combat."]
-- Back button handler
SideFrames.b:SetScript("OnClick", function()
-- Hide outer control frame
SideFrames:Hide()
-- Hide drag frames
for k, void in pairs(FrameTable) do
LeaPlusLC[k]:Hide()
end
-- Show options panel at frame section
LeaPlusLC["PageF"]:Show()
LeaPlusLC["Page6"]:Show()
end)
-- Reset button handler
SideFrames.r:SetScript("OnClick", function()
if LeaPlusLC:PlayerInCombat() then
-- If player is in combat, print error and stop
return
else
-- Set frames to default positions (presets)
LeaPlusFramesDefaults()
for k,v in pairs(FrameTable) do
local vf = v:GetName()
-- Store frame locations
LeaPlusDB["Frames"][vf]["Point"], void, LeaPlusDB["Frames"][vf]["Relative"], LeaPlusDB["Frames"][vf]["XOffset"], LeaPlusDB["Frames"][vf]["YOffset"] = _G[vf]:GetPoint()
-- Reset real frame scales and save them
LeaPlusDB["Frames"][vf]["Scale"] = 1.00
_G[vf]:SetScale(LeaPlusDB["Frames"][vf]["Scale"])
-- Reset drag frame scales
LeaPlusLC[k]:SetScale(LeaPlusDB["Frames"][vf]["Scale"])
end
-- Set combo frame scale to match target frame scale
ComboFrame:SetScale(LeaPlusDB["Frames"]["TargetFrame"]["Scale"])
-- Set the scale slider value to the selected frame scale
LeaPlusCB["FrameScale"]:SetValue(LeaPlusDB["Frames"][currentframe]["Scale"])
-- Refresh the panel
SideFrames:Hide(); SideFrames:Show()
end
end)
-- Show drag frames with configuration panel
SideFrames:HookScript("OnShow", function()
for k, void in pairs(FrameTable) do
LeaPlusLC[k]:Show()
end
end)
SideFrames:HookScript("OnHide", function()
for k, void in pairs(FrameTable) do
LeaPlusLC[k]:Hide()
end
end)
-- Save frame positions
local function SaveAllFrames()
for k, v in pairs(FrameTable) do
local vf = v:GetName()
-- Stop real frames from moving
v:StopMovingOrSizing()
-- Save frame positions
LeaPlusDB["Frames"][vf]["Point"], void, LeaPlusDB["Frames"][vf]["Relative"], LeaPlusDB["Frames"][vf]["XOffset"], LeaPlusDB["Frames"][vf]["YOffset"] = v:GetPoint()
v:SetMovable(true)
v:ClearAllPoints()
v:SetPoint(LeaPlusDB["Frames"][vf]["Point"], UIParent, LeaPlusDB["Frames"][vf]["Relative"], LeaPlusDB["Frames"][vf]["XOffset"], LeaPlusDB["Frames"][vf]["YOffset"])
end
end
-- Prevent changes during combat
SideFrames:RegisterEvent("PLAYER_REGEN_DISABLED")
SideFrames:SetScript("OnEvent", function()
-- Hide controls frame
SideFrames:Hide()
-- Hide drag frames
for k,void in pairs(FrameTable) do
LeaPlusLC[k]:Hide()
end
-- Save frame positions
SaveAllFrames()
end)
-- Create drag frames
local function LeaPlusMakeDrag(dragframe,realframe)
local dragframe = CreateFrame("Frame", nil, nil, "BackdropTemplate")
LeaPlusLC[dragframe] = dragframe
dragframe:SetSize(realframe:GetSize())
dragframe:SetPoint("TOP", realframe, "TOP", 0, 2.5)
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:SetFrameStrata("HIGH")
-- Set frame clamps
realframe:SetClampedToScreen(false)
-- Hide the drag frame and make real frame movable
dragframe:Hide()
realframe:SetMovable(true)
-- Click handler
dragframe:SetScript("OnMouseDown", function(self, btn)
-- Start dragging if left clicked
if btn == "LeftButton" then
realframe:SetMovable(true)
realframe:StartMoving()
end
-- Set all drag frames to blue then tint the selected frame to green
for k,v in pairs(FrameTable) do
LeaPlusLC[k].t:SetColorTexture(0.0, 0.5, 1.0, 0.5)
end
dragframe.t:SetColorTexture(0.0, 1.0, 0.0, 0.5)
-- Set currentframe variable to selected frame and set the scale slider value
currentframe = realframe:GetName();
LeaPlusCB["FrameScale"]:SetValue(LeaPlusDB["Frames"][currentframe]["Scale"])
end)
dragframe:SetScript("OnMouseUp", function()
-- Save frame positions
SaveAllFrames();
end)
dragframe.t = dragframe:CreateTexture()
dragframe.t:SetAllPoints()
dragframe.t:SetColorTexture(0.0, 0.5, 1.0, 0.5)
dragframe.t:SetAlpha(0.5)
dragframe.f = dragframe:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge')
dragframe.f:SetPoint('CENTER', 0, 0)
-- Add titles
if realframe:GetName() == "PlayerFrame" then dragframe.f:SetText(L["Player"]) end
if realframe:GetName() == "TargetFrame" then dragframe.f:SetText(L["Target"]) end
if realframe:GetName() == "MirrorTimer1" then dragframe.f:SetText(L["Timer"]) end
if realframe:GetName() == "GhostFrame" then dragframe.f:SetText(L["Ghost"]) end
return LeaPlusLC[dragframe]
end
for k,v in pairs(FrameTable) do
LeaPlusLC[k] = LeaPlusMakeDrag(k,v)
end
-- Set frame scales
for k,v in pairs(FrameTable) do
local vf = v:GetName()
_G[vf]:SetScale(LeaPlusDB["Frames"][vf]["Scale"])
LeaPlusLC[k]:SetScale(LeaPlusDB["Frames"][vf]["Scale"])
end
ComboFrame:SetScale(LeaPlusDB["Frames"]["TargetFrame"]["Scale"]);
-- Load defaults first then overwrite with saved values if they exist
LeaPlusFramesDefaults()
if LeaPlusDB["Frames"] then
for k,v in pairs(FrameTable) do
local vf = v:GetName()
if LeaPlusDB["Frames"][vf] then
if LeaPlusDB["Frames"][vf]["Point"] and LeaPlusDB["Frames"][vf]["Relative"] and LeaPlusDB["Frames"][vf]["XOffset"] and LeaPlusDB["Frames"][vf]["YOffset"] then
_G[vf]:SetMovable(true)
_G[vf]:ClearAllPoints()
_G[vf]:SetPoint(LeaPlusDB["Frames"][vf]["Point"], UIParent, LeaPlusDB["Frames"][vf]["Relative"], LeaPlusDB["Frames"][vf]["XOffset"], LeaPlusDB["Frames"][vf]["YOffset"])
end
end
end
end
-- Add move button
LeaPlusCB["MoveFramesButton"]:SetScript("OnClick", function()
if LeaPlusLC:PlayerInCombat() then
return
else
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaFramesSetPos(PlayerFrame , "TOPLEFT" , UIParent, "TOPLEFT" , "-35" , "-14")
LeaFramesSetPos(TargetFrame , "TOPLEFT" , UIParent, "TOPLEFT" , "190" , "-14")
LeaFramesSetPos(GhostFrame , "CENTER" , UIParent, "CENTER" , "3" , "-142")
LeaFramesSetPos(MirrorTimer1 , "TOP" , UIParent, "TOP" , "0" , "-120")
-- Player
LeaPlusDB["Frames"]["PlayerFrame"]["Scale"] = 1.20;
PlayerFrame:SetScale(LeaPlusDB["Frames"]["PlayerFrame"]["Scale"])
LeaPlusLC["DragPlayerFrame"]:SetScale(LeaPlusDB["Frames"]["PlayerFrame"]["Scale"])
-- Target
LeaPlusDB["Frames"]["TargetFrame"]["Scale"] = 1.20;
TargetFrame:SetScale(LeaPlusDB["Frames"]["TargetFrame"]["Scale"])
LeaPlusLC["DragTargetFrame"]:SetScale(LeaPlusDB["Frames"]["TargetFrame"]["Scale"])
-- Set the slider to the selected frame (if there is one)
if currentframe then LeaPlusCB["FrameScale"]:SetValue(LeaPlusDB["Frames"][currentframe]["Scale"]); end
-- Save locations
for k,v in pairs(FrameTable) do
local vf = v:GetName()
LeaPlusDB["Frames"][vf]["Point"], void, LeaPlusDB["Frames"][vf]["Relative"], LeaPlusDB["Frames"][vf]["XOffset"], LeaPlusDB["Frames"][vf]["YOffset"] = _G[vf]:GetPoint()
end
else
-- Show mover frame
SideFrames:Show()
LeaPlusLC:HideFrames()
-- 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 all scaled sizes
for k,v in pairs(FrameTable) do
LeaPlusLC[k]:SetWidth(v:GetWidth() * LeaPlusLC["gscale"])
LeaPlusLC[k]:SetHeight(v:GetHeight() * LeaPlusLC["gscale"])
end
-- Set specific scaled sizes for stubborn frames
LeaPlusLC["DragMirrorTimer1"]:SetSize(206 * LeaPlusLC["gscale"], 50 * LeaPlusLC["gscale"])
LeaPlusLC["DragGhostFrame"]:SetSize(130 * LeaPlusLC["gscale"], 46 * LeaPlusLC["gscale"])
end
end
end)
end
----------------------------------------------------------------------
-- L43: Manage widget
----------------------------------------------------------------------
if LeaPlusLC["ManageWidget"] == "On" 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["WidgetA"], UIParent, LeaPlusLC["WidgetR"], LeaPlusLC["WidgetX"], LeaPlusLC["WidgetY"])
topCenterHolder:SetScale(LeaPlusLC["WidgetScale"])
UIWidgetTopCenterContainerFrame:SetScale(LeaPlusLC["WidgetScale"])
-- 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["WidgetScale"])
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"])
-- 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["WidgetA"], void, LeaPlusLC["WidgetR"], LeaPlusLC["WidgetX"], LeaPlusLC["WidgetY"] = topCenterHolder:GetPoint()
topCenterHolder:SetMovable(true)
topCenterHolder:ClearAllPoints()
topCenterHolder:SetPoint(LeaPlusLC["WidgetA"], UIParent, LeaPlusLC["WidgetR"], LeaPlusLC["WidgetX"], LeaPlusLC["WidgetY"])
end)
-- Create configuration panel
local WidgetPanel = LeaPlusLC:CreatePanel("Manage widget", "WidgetPanel")
-- Create Titan Panel screen adjust warning
local titanFrame = CreateFrame("FRAME", nil, WidgetPanel)
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(WidgetPanel, "Scale", 16, -72)
LeaPlusLC:MakeSL(WidgetPanel, "WidgetScale", "Drag to set the widget scale.", 0.5, 2, 0.05, 16, -92, "%.2f")
-- Set scale when slider is changed
LeaPlusCB["WidgetScale"]:HookScript("OnValueChanged", function()
topCenterHolder:SetScale(LeaPlusLC["WidgetScale"])
UIWidgetTopCenterContainerFrame:SetScale(LeaPlusLC["WidgetScale"])
dragframe:SetScale(LeaPlusLC["WidgetScale"])
-- Show formatted slider value
LeaPlusCB["WidgetScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["WidgetScale"] * 100)
end)
-- Help button tooltip
WidgetPanel.h.tiptext = L["Drag the frame overlay to position the frame."]
-- Back button handler
WidgetPanel.b:SetScript("OnClick", function()
WidgetPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show()
return
end)
-- Reset button handler
WidgetPanel.r:SetScript("OnClick", function()
-- Reset position and scale
LeaPlusLC["WidgetA"] = "TOP"
LeaPlusLC["WidgetR"] = "TOP"
LeaPlusLC["WidgetX"] = 0
LeaPlusLC["WidgetY"] = -15
LeaPlusLC["WidgetScale"] = 1
topCenterHolder:ClearAllPoints()
topCenterHolder:SetPoint(LeaPlusLC["WidgetA"], UIParent, LeaPlusLC["WidgetR"], LeaPlusLC["WidgetX"], LeaPlusLC["WidgetY"])
-- Refresh configuration panel
WidgetPanel:Hide(); WidgetPanel:Show()
dragframe:Show()
end)
-- Show configuration panel when options panel button is clicked
LeaPlusCB["ManageWidgetButton"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["WidgetA"] = "CENTER"
LeaPlusLC["WidgetR"] = "CENTER"
LeaPlusLC["WidgetX"] = 0
LeaPlusLC["WidgetY"] = -160
LeaPlusLC["WidgetScale"] = 1.25
topCenterHolder:ClearAllPoints()
topCenterHolder:SetPoint(LeaPlusLC["WidgetA"], UIParent, LeaPlusLC["WidgetR"], LeaPlusLC["WidgetX"], LeaPlusLC["WidgetY"])
topCenterHolder:SetScale(LeaPlusLC["WidgetScale"])
UIWidgetTopCenterContainerFrame:SetScale(LeaPlusLC["WidgetScale"])
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
WidgetPanel:Show()
LeaPlusLC:HideFrames()
dragframe:Show()
end
end)
-- Hide drag frame when configuration panel is closed
WidgetPanel:HookScript("OnHide", function() dragframe:Hide() end)
end
----------------------------------------------------------------------
-- L44: Manage focus
----------------------------------------------------------------------
if LeaPlusLC["ManageFocus"] == "On" then
-- Remove integrated movement function to avoid conflicts
_G.FocusFrame_SetLock = function() end
_G.FocusFrame_SetSmallSize = function() end
-- Allow focus frame to be moved
FocusFrame:SetMovable(true)
FocusFrame:SetUserPlaced(true)
FocusFrame:SetDontSavePosition(true)
FocusFrame:SetClampedToScreen(true)
-- Set focus frame position at startup
FocusFrame:ClearAllPoints()
FocusFrame:SetPoint(LeaPlusLC["FocusA"], UIParent, LeaPlusLC["FocusR"], LeaPlusLC["FocusX"], LeaPlusLC["FocusY"])
FocusFrame:SetScale(LeaPlusLC["FocusScale"])
-- 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["FocusScale"])
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["Focus"])
-- Click handler
dragframe:SetScript("OnMouseDown", function(self, btn)
-- Start dragging if left clicked
if btn == "LeftButton" then
FocusFrame:StartMoving()
end
end)
dragframe:SetScript("OnMouseUp", function()
-- Save frame positions
FocusFrame:StopMovingOrSizing()
LeaPlusLC["FocusA"], void, LeaPlusLC["FocusR"], LeaPlusLC["FocusX"], LeaPlusLC["FocusY"] = FocusFrame:GetPoint()
FocusFrame:SetMovable(true)
FocusFrame:ClearAllPoints()
FocusFrame:SetPoint(LeaPlusLC["FocusA"], UIParent, LeaPlusLC["FocusR"], LeaPlusLC["FocusX"], LeaPlusLC["FocusY"])
end)
-- Create configuration panel
local FocusPanel = LeaPlusLC:CreatePanel("Manage focus", "FocusPanel")
LeaPlusLC:MakeTx(FocusPanel, "Scale", 16, -72)
LeaPlusLC:MakeSL(FocusPanel, "FocusScale", "Drag to set the focus frame scale.", 0.5, 2, 0.05, 16, -92, "%.2f")
-- Hide panel during combat
FocusPanel:RegisterEvent("PLAYER_REGEN_DISABLED")
FocusPanel:SetScript("OnEvent", FocusPanel.Hide)
-- Set scale when slider is changed
LeaPlusCB["FocusScale"]:HookScript("OnValueChanged", function()
FocusFrame:SetScale(LeaPlusLC["FocusScale"])
dragframe:SetScale(LeaPlusLC["FocusScale"])
-- Show formatted slider value
LeaPlusCB["FocusScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["FocusScale"] * 100)
end)
-- Help button tooltip
FocusPanel.h.tiptext = L["Drag the frame overlay to position the frame.|n|nThis panel will close automatically if you enter combat."]
-- Back button handler
FocusPanel.b:SetScript("OnClick", function()
FocusPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show()
return
end)
-- Reset button handler
FocusPanel.r:SetScript("OnClick", function()
-- Reset position and scale
LeaPlusLC["FocusA"] = "CENTER"
LeaPlusLC["FocusR"] = "CENTER"
LeaPlusLC["FocusX"] = 0
LeaPlusLC["FocusY"] = 0
LeaPlusLC["FocusScale"] = 1
FocusFrame:ClearAllPoints()
FocusFrame:SetPoint(LeaPlusLC["FocusA"], UIParent, LeaPlusLC["FocusR"], LeaPlusLC["FocusX"], LeaPlusLC["FocusY"])
-- Refresh configuration panel
FocusPanel:Hide(); FocusPanel:Show()
dragframe:Show()
end)
-- Show configuration panel when options panel button is clicked
LeaPlusCB["ManageFocusButton"]:SetScript("OnClick", function()
if LeaPlusLC:PlayerInCombat() then
return
else
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["FocusA"] = "TOPLEFT"
LeaPlusLC["FocusR"] = "TOPLEFT"
LeaPlusLC["FocusX"] = 250
LeaPlusLC["FocusY"] = -240
LeaPlusLC["FocusScale"] = 1.00
FocusFrame:ClearAllPoints()
FocusFrame:SetPoint(LeaPlusLC["FocusA"], UIParent, LeaPlusLC["FocusR"], LeaPlusLC["FocusX"], LeaPlusLC["FocusY"])
FocusFrame:SetScale(LeaPlusLC["FocusScale"])
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", FocusFrame, "CENTER", -18 * LeaPlusLC["gscale"], 6 * LeaPlusLC["gscale"])
-- Show configuration panel
FocusPanel:Show()
LeaPlusLC:HideFrames()
dragframe:Show()
end
end
end)
-- Hide drag frame when configuration panel is closed
FocusPanel:HookScript("OnHide", function() dragframe:Hide() end)
end
----------------------------------------------------------------------
-- L45: Manage power bar
----------------------------------------------------------------------
if LeaPlusLC["ManagePowerBar"] == "On" then
-- Allow power bar to be moved
PlayerPowerBarAlt:SetMovable(true)
PlayerPowerBarAlt:SetUserPlaced(true)
PlayerPowerBarAlt:SetDontSavePosition(true)
PlayerPowerBarAlt:SetClampedToScreen(true)
-- Set power bar position at startup
PlayerPowerBarAlt:ClearAllPoints()
PlayerPowerBarAlt:SetPoint(LeaPlusLC["PowerBarA"], UIParent, LeaPlusLC["PowerBarR"], LeaPlusLC["PowerBarX"], LeaPlusLC["PowerBarY"])
PlayerPowerBarAlt:SetScale(LeaPlusLC["PowerBarScale"])
-- Create drag frame
local dragframe = CreateFrame("FRAME", nil, nil, "BackdropTemplate")
dragframe:SetPoint("CENTER", PlayerPowerBarAlt, "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["PowerBarScale"])
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["Power"])
-- Click handler
dragframe:SetScript("OnMouseDown", function(self, btn)
-- Start dragging if left clicked
if btn == "LeftButton" then
PlayerPowerBarAlt:StartMoving()
end
end)
dragframe:SetScript("OnMouseUp", function()
-- Save frame positions
PlayerPowerBarAlt:StopMovingOrSizing()
LeaPlusLC["PowerBarA"], void, LeaPlusLC["PowerBarR"], LeaPlusLC["PowerBarX"], LeaPlusLC["PowerBarY"] = PlayerPowerBarAlt:GetPoint()
PlayerPowerBarAlt:SetMovable(true)
PlayerPowerBarAlt:ClearAllPoints()
PlayerPowerBarAlt:SetPoint(LeaPlusLC["PowerBarA"], UIParent, LeaPlusLC["PowerBarR"], LeaPlusLC["PowerBarX"], LeaPlusLC["PowerBarY"])
end)
-- Create configuration panel
local PowerPanel = LeaPlusLC:CreatePanel("Manage power bar", "PowerPanel")
-- Create Dominos Encounter warning
local dominosFrame = CreateFrame("FRAME", nil, PowerPanel)
dominosFrame:SetAllPoints()
dominosFrame:Hide()
LeaPlusLC:MakeTx(dominosFrame, "Warning", 16, -172)
LeaPlusLC:MakeWD(dominosFrame, "Dominos Encounter needs to be disabled.", 16, -192, 500)
dominosFrame.btn = LeaPlusLC:CreateButton("fixDominosBtn", dominosFrame, "Okay, disable Dominos Encounter for me", "TOPLEFT", 16, -212, 0, 25, true, "Click to disable Dominos Encounter for all characters on this realm. This is required for the power bar position to be saved correctly. Your UI will be reloaded.")
dominosFrame.btn:SetScript("OnClick", function()
DisableAddOn("Dominos_Encounter", true)
ReloadUI()
end)
LeaPlusLC:MakeTx(PowerPanel, "Scale", 16, -72)
LeaPlusLC:MakeSL(PowerPanel, "PowerBarScale", "Drag to set the power bar scale.", 0.5, 2, 0.05, 16, -92, "%.2f")
-- Set scale when slider is changed
LeaPlusCB["PowerBarScale"]:HookScript("OnValueChanged", function()
PlayerPowerBarAlt:SetScale(LeaPlusLC["PowerBarScale"])
dragframe:SetScale(LeaPlusLC["PowerBarScale"])
-- Show formatted slider value
LeaPlusCB["PowerBarScale"].f:SetFormattedText("%.0f%%", LeaPlusLC["PowerBarScale"] * 100)
end)
-- Help button tooltip
PowerPanel.h.tiptext = L["Drag the frame overlay to position the frame."]
-- Back button handler
PowerPanel.b:SetScript("OnClick", function()
PowerPanel:Hide(); LeaPlusLC["PageF"]:Show(); LeaPlusLC["Page6"]:Show()
return
end)
-- Reset button handler
PowerPanel.r:SetScript("OnClick", function()
-- Reset position and scale
LeaPlusLC["PowerBarA"] = "BOTTOM"
LeaPlusLC["PowerBarR"] = "BOTTOM"
LeaPlusLC["PowerBarX"] = 0
LeaPlusLC["PowerBarY"] = 115
LeaPlusLC["PowerBarScale"] = 1
PlayerPowerBarAlt:ClearAllPoints()
PlayerPowerBarAlt:SetPoint(LeaPlusLC["PowerBarA"], UIParent, LeaPlusLC["PowerBarR"], LeaPlusLC["PowerBarX"], LeaPlusLC["PowerBarY"])
-- Refresh configuration panel
PowerPanel:Hide(); PowerPanel:Show()
dragframe:Show()
end)
-- Show configuration panel when options panel button is clicked
LeaPlusCB["ManagePowerBarButton"]:SetScript("OnClick", function()
if IsShiftKeyDown() and IsControlKeyDown() then
-- Preset profile
LeaPlusLC["PowerBarA"] = "CENTER"
LeaPlusLC["PowerBarR"] = "CENTER"
LeaPlusLC["PowerBarX"] = 0
LeaPlusLC["PowerBarY"] = -160
LeaPlusLC["PowerBarScale"] = 1.25
PlayerPowerBarAlt:ClearAllPoints()
PlayerPowerBarAlt:SetPoint(LeaPlusLC["PowerBarA"], UIParent, LeaPlusLC["PowerBarR"], LeaPlusLC["PowerBarX"], LeaPlusLC["PowerBarY"])
PlayerPowerBarAlt:SetScale(LeaPlusLC["PowerBarScale"])
else
-- Show Dominos Encounter warning if Dominos Encounter is installed
if select(2, GetAddOnInfo("Dominos_Encounter")) then
if IsAddOnLoaded("Dominos_Encounter") then
dominosFrame:Show()
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(210 * LeaPlusLC["gscale"])
dragframe:SetHeight(46 * LeaPlusLC["gscale"])
-- Show configuration panel
PowerPanel:Show()
LeaPlusLC:HideFrames()
dragframe:Show()
end
end)
-- Hide drag frame when configuration panel is closed
PowerPanel:HookScript("OnHide", function() dragframe:Hide() end)
end
----------------------------------------------------------------------
-- Hide chat buttons
----------------------------------------------------------------------
if LeaPlusLC["NoChatButtons"] == "On" 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)
-- Set position of bottom button
_G[chtfrm].ScrollToBottomButton.Flash:SetTexture("Interface/BUTTONS/GRADBLUE.png")
_G[chtfrm].ScrollToBottomButton:ClearAllPoints()
_G[chtfrm].ScrollToBottomButton:SetPoint("BOTTOM",_G[chtfrm .. "Tab"],0,-4)
_G[chtfrm].ScrollToBottomButton:Show()
_G[chtfrm].ScrollToBottomButton:SetWidth(_G[chtfrm .. "Tab"]:GetWidth() - 12)
_G[chtfrm].ScrollToBottomButton:SetHeight(24)
-- Resize bottom button according to tab size
_G[chtfrm .. "Tab"]:SetScript("OnSizeChanged", function()
for j = 1, 50 do
-- Resize bottom button to tab width
if _G["ChatFrame" .. j] and _G["ChatFrame" .. j].ScrollToBottomButton then
_G["ChatFrame" .. j].ScrollToBottomButton:SetWidth(_G["ChatFrame" .. j .. "Tab"]:GetWidth() - 12)
end
end
-- If combat log is hidden, resize it's bottom button
if LeaPlusLC["NoCombatLogTab"] == "On" then
if _G["ChatFrame2"].ScrollToBottomButton then
-- Resize combat log bottom button
_G["ChatFrame2"].ScrollToBottomButton:SetWidth(0.1);
end
end
end)
-- 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("")
-- 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)
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)
-- Resize flashing alert to match tab width
_G[cf .. "Tab"]:SetScript("OnSizeChanged", function()
_G[cf].ScrollToBottomButton:SetWidth(_G[cf .. "Tab"]:GetWidth()-10)
end)
end
end)
-- 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" 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)
local titleBox = titleFrame.EditBox
titleBox:Hide()
titleBox:SetEnabled(false)
-- Drag to resize
editFrame:SetResizable(true)
editFrame:SetMinResize(600, 170)
editFrame:SetMaxResize(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:SetFont(editBox:GetFont(), 16)
-- 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
editBox:Insert(chatMessage .. "|r|n")
end
totalMsgCount = totalMsgCount + 1
end
titleFrame.m:SetText(L["Messages"] .. ": " .. totalMsgCount)
editFrame:SetVerticalScroll(0)
C_Timer.After(0.1, function() editFrame.ScrollBar.ScrollDownButton:Click() end)
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
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
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("BACKGROUND")
icon[i]:SetWidth(20)
icon[i]:SetHeight(20)
-- 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)
-- Set top level and raise frame strata (ensures tooltips show properly)
icon[i]:SetToplevel(true)
icon[i]:SetFrameStrata("LOW")
-- Handle events
icon[i]:RegisterUnitEvent("UNIT_AURA", owner)
icon[i]:RegisterUnitEvent("UNIT_PET", "player")
icon[i]:SetScript("OnEvent", function(self, event, arg1)
-- 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
for q = 1, 40 do
local void, void, void, void, length, expire, void, void, void, spellID = UnitBuff(owner, q)
if spellID and id == spellID then
icon[i]:Show()
local start = expire - length
CooldownFrame_Set(icon[i].c, start, length, 1)
end
end
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 ~= "" 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", 116 + (22 * (i - 1)), 5)
icon[i]:SetScale(PlayerFrame:GetScale())
else
icon[i]:SetPoint("TOPLEFT", TargetFrame, "TOPLEFT", 6 + (22 * (i - 1)), 5)
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
for q = 1, 40 do
local void, void, void, void, length, expire, void, void, void, spellID = UnitBuff(newowner, q)
if spellID and newspell == spellID then
icon[i]:Show()
-- Set the cooldown to the buff cooldown
CooldownFrame_Set(icon[i].c, expire - length, length, 1)
end
end
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)
if LeaPlusLC["ShowCooldownID"] == "On" 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
-- Check the display menu option, update the game options panel and lockout changes
ShowAccountAchievements(true)
InterfaceOptionsSocialPanelShowAccountAchievments:SetChecked(true)
InterfaceOptionsPanel_CheckButton_Update(InterfaceOptionsSocialPanelShowAccountAchievments)
InterfaceOptionsSocialPanelShowAccountAchievments:Disable()
InterfaceOptionsSocialPanelShowAccountAchievments:SetAlpha(0.5)
InterfaceOptionsSocialPanelShowAccountAchievmentsText:SetText(InterfaceOptionsSocialPanelShowAccountAchievmentsText:GetText() .. "|n" .. L["Managed by Leatrix Plus"])
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" 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 LeaPlusLC["TooltipAnchorMenu"] == 2 or GetMouseFocus() ~= WorldFrame then
local a,b,c,d,e = tooltip:GetPoint()
if a ~= "BOTTOMRIGHT" or c ~= "BOTTOMRIGHT" then
tooltip:ClearAllPoints()
end
tooltip:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"]);
return
else
if LeaPlusLC["TooltipAnchorMenu"] == 3 then
tooltip:SetOwner(parent, "ANCHOR_CURSOR")
return
elseif LeaPlusLC["TooltipAnchorMenu"] == 4 then
tooltip:SetOwner(parent, "ANCHOR_CURSOR_LEFT", LeaPlusLC["TipCursorX"], LeaPlusLC["TipCursorY"])
return
elseif LeaPlusLC["TooltipAnchorMenu"] == 5 then
tooltip:SetOwner(parent, "ANCHOR_CURSOR_RIGHT", LeaPlusLC["TipCursorX"], LeaPlusLC["TipCursorY"])
return
end
end
end
end)
-- Position pet battle ability tooltips
hooksecurefunc("PetBattleAbilityTooltip_Show", function(void, parent)
if LeaPlusLC["TooltipAnchorMenu"] ~= 1 then
if parent == UIParent then
local a,b,c,d,e = PetBattlePrimaryAbilityTooltip:GetPoint()
if a ~= "BOTTOMRIGHT" or c ~= "BOTTOMRIGHT" then
PetBattlePrimaryAbilityTooltip:ClearAllPoints()
end
PetBattlePrimaryAbilityTooltip:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"]);
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"] = string.gsub(LT["LevelLocale"], "", "")
end
-- Tooltip
LT["ColorBlind"] = GetCVar("colorblindMode")
-- Create drag frame
local TipDrag = CreateFrame("Frame", nil, UIParent, "BackdropTemplate")
TipDrag:SetToplevel(true);
TipDrag:SetClampedToScreen(false);
TipDrag:SetSize(130, 64);
TipDrag:Hide();
TipDrag:SetFrameStrata("TOOLTIP")
TipDrag:SetMovable(true)
TipDrag:SetBackdropColor(0.0, 0.5, 1.0);
TipDrag:SetBackdrop({
edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
tile = false, tileSize = 0, edgeSize = 16,
insets = { left = 0, right = 0, top = 0, bottom = 0 }});
-- Show text in drag frame
TipDrag.f = TipDrag:CreateFontString(nil, 'ARTWORK', 'GameFontNormalLarge')
TipDrag.f:SetPoint("CENTER", 0, 0)
TipDrag.f:SetText(L["Tooltip"])
-- Create texture
TipDrag.t = TipDrag:CreateTexture();
TipDrag.t:SetAllPoints();
TipDrag.t:SetColorTexture(0.0, 0.5, 1.0, 0.5);
TipDrag.t:SetAlpha(0.5);
---------------------------------------------------------------------------------------------------------
-- 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, "TipBackSimple", "Color the backdrops based on faction", 16, -152, false, "If checked, backdrops will be tinted blue (friendly) or red (hostile).")
LeaPlusLC:MakeCB(SideTip, "TipHideInCombat", "Hide tooltips for world units during combat", 16, -172, false, "If checked, tooltips for world units will be hidden during combat.|n|nYou can hold the shift key down to override this setting.")
LeaPlusLC:CreateDropDown("TooltipAnchorMenu", "Anchor", SideTip, 146, "TOPLEFT", 356, -115, {L["None"], L["Overlay"], 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()
-- Hide overlay if anchor is set to none
if LeaPlusLC["TooltipAnchorMenu"] == 1 then
TipDrag:Hide()
else
TipDrag:Show()
end
-- Set the X and Y sliders
if LeaPlusLC["TooltipAnchorMenu"] == 1 or LeaPlusLC["TooltipAnchorMenu"] == 2 or LeaPlusLC["TooltipAnchorMenu"] == 3 then
-- Dropdown is set to screen 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();
if TipDrag:IsShown() then
TipDrag:Hide();
end
LeaPlusLC["PageF"]:Show();
LeaPlusLC["Page5"]:Show();
return
end)
-- Reset button handler
SideTip.r:SetScript("OnClick", function()
LeaPlusLC["TipShowRank"] = "On"
LeaPlusLC["TipShowOtherRank"] = "Off"
LeaPlusLC["TipShowTarget"] = "On"
LeaPlusLC["TipBackSimple"] = "Off"
LeaPlusLC["TipHideInCombat"] = "Off"
LeaPlusLC["LeaPlusTipSize"] = 1.00
LeaPlusLC["TipOffsetX"] = -13
LeaPlusLC["TipOffsetY"] = 94
LeaPlusLC["TooltipAnchorMenu"] = 1
LeaPlusLC["TipCursorX"] = 0
LeaPlusLC["TipCursorY"] = 0
TipDrag:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"]);
SetAnchorControls()
LeaPlusLC:SetTipScale()
SideTip:Hide(); SideTip:Show();
end)
-- Show drag frame with configuration panel if anchor is not set to none
SideTip:HookScript("OnShow", function()
if LeaPlusLC["TooltipAnchorMenu"] == 1 then
TipDrag:Hide()
else
TipDrag:Show()
end
end)
SideTip:HookScript("OnHide", function() TipDrag:Hide() end)
-- Control movement functions
local void, LTax, LTay, LTbx, LTby, LTcx, LTcy
TipDrag:SetScript("OnMouseDown", function(self, btn)
if btn == "LeftButton" then
void, void, void, LTax, LTay = TipDrag:GetPoint()
TipDrag:StartMoving()
void, void, void, LTbx, LTby = TipDrag:GetPoint()
end
end)
TipDrag:SetScript("OnMouseUp", function(self, btn)
if btn == "LeftButton" then
void, void, void, LTcx, LTcy = TipDrag:GetPoint()
TipDrag:StopMovingOrSizing();
LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"] = LTcx - LTbx + LTax, LTcy - LTby + LTay
TipDrag:ClearAllPoints()
TipDrag:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"])
end
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["TipBackSimple"] = "On"
LeaPlusLC["TipHideInCombat"] = "Off"
LeaPlusLC["LeaPlusTipSize"] = 1.25
LeaPlusLC["TipOffsetX"] = -13
LeaPlusLC["TipOffsetY"] = 94
LeaPlusLC["TooltipAnchorMenu"] = 2
LeaPlusLC["TipCursorX"] = 0
LeaPlusLC["TipCursorY"] = 0
TipDrag:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"]);
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()
-- Set scale
TipDrag:SetScale(LeaPlusLC["LeaPlusTipSize"])
-- Set position of the drag frame
TipDrag:SetPoint("BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", LeaPlusLC["TipOffsetX"], LeaPlusLC["TipOffsetY"])
end
end)
---------------------------------------------------------------------------------------------------------
-- Tooltip scale settings
---------------------------------------------------------------------------------------------------------
-- Function to set the tooltip scale
local function SetTipScale()
if LeaPlusLC["TipModEnable"] == "On" then
-- 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
-- Leatrix Plus
TipDrag:SetScale(LeaPlusLC["LeaPlusTipSize"])
-- Set slider formatted text
LeaPlusCB["LeaPlusTipSize"].f:SetFormattedText("%.0f%%", LeaPlusLC["LeaPlusTipSize"] * 100)
end
return
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
----------------------------------------------------------------------
-- 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
---------------------------------------------------------------------------------------------------------
-- Other tooltip code
---------------------------------------------------------------------------------------------------------
-- Colorblind setting change
TipDrag:RegisterEvent("CVAR_UPDATE");
TipDrag:SetScript("OnEvent", function(self, event, arg1, arg2)
if (arg1 == "USE_COLORBLIND_MODE") then
LT["ColorBlind"] = arg2;
end
end)
-- Store locals
local TipMClass = LOCALIZED_CLASS_NAMES_MALE
local TipFClass = LOCALIZED_CLASS_NAMES_FEMALE
-- 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()
-- 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") and not IsShiftKeyDown() then
GameTooltip:Hide()
return
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"] = 2, 4
else
LT["GuildLine"], LT["InfoLine"] = 2, 3
end
LT["GuildName"], LT["GuildRank"] = unitGuild, unitRank
else
-- Unit is not guilded
LT["GuildName"] = nil
if LT["ColorBlind"] == "1" then
LT["GuildLine"], LT["InfoLine"] = 0, 3
else
LT["GuildLine"], LT["InfoLine"] = 0, 2
end
end
-- Lower information line if unit is charmed
if UnitIsCharmed(LT["Unit"]) then
LT["InfoLine"] = LT["InfoLine"] + 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 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
-- 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 class
LT["InfoText"] = LT["InfoText"] .. " " .. LT["LpTipClassColor"] .. LT["Class"] or LT["InfoText"]
-- Show information line
_G["GameTooltipTextLeft" .. LT["InfoLine"]]:SetText(LT["InfoText"] .. "|cffffffff|r")
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
-- 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
-- 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
----------------------------------------------------------------------
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
if LeaPlusLC["TipBackSimple"] == "On" then
GameTooltip:SetBackdropColor(0.5, 0.0, 0.0);
else
GameTooltip:SetBackdropColor(0.0, 0.0, 0.0);
end
else
-- Friendly faction
if LeaPlusLC["TipBackSimple"] == "On" then
GameTooltip:SetBackdropColor(0.0, 0.0, 0.5);
else
GameTooltip:SetBackdropColor(0.0, 0.0, 0.0);
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
GameTooltip:HookScript("OnTooltipSetUnit", ShowTip)
end
----------------------------------------------------------------------
-- Move chat editbox to top
----------------------------------------------------------------------
if LeaPlusLC["MoveChatEditBoxToTop"] == "On" 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()
----------------------------------------------------------------------
-- Media player
----------------------------------------------------------------------
function LeaPlusLC:MediaFunc()
-- Create tables for list data and zone listing
local ListData, ZoneList, playlist = {}, {}, {}
local scrollFrame, willPlay, musicHandle, ZonePage, LastPlayed, LastFolder, TempFolder, HeadingOfClickedTrack, LastMusicHandle
local numButtons = 15
local uframe = CreateFrame("FRAME")
local prefol = "|cffffffaa{" .. L["right-click to go back"] .. "}"
-- These categories will not appear in random track selections
local randomBannedList = {L["Narration"], L["Cinematics"], "MUS_51_DarkmoonFaire_MerryGoRound_01#34440"}
-- Create a table for each heading
ZoneList = {L["Zones"], L["Dungeons"], L["Various"], L["Random"], L["Search"], L["Movies"]}
for k, v in ipairs(ZoneList) do
ZoneList[v] = {}
end
-- Function to create a table for each zone
local function Zn(where, category, zone, tracklist)
tinsert(ZoneList[where], {category = category, zone = zone, tracks = tracklist})
end
-- Debug
-- Zn(L["Zones"], L["Eastern Kingdoms"], "Debug1", {"|cffffd800" .. L["Zones"] .. ": Debug1", "1020#1020", "1021#1021", "1022#1022", "1023#1023", "1024#1024",})
-- Zn(L["Zones"], L["Eastern Kingdoms"], "Debug2", {"|cffffd800" .. L["Zones"] .. ": Debug2", "1020#1020",})
-- Zn(L["Zones"], L["Eastern Kingdoms"], "Debug3", {"|cffffd800" .. L["Zones"] .. ": Debug2", "1020#1020", "sound/creature/hagara/vo_ds_hagara_crystalhit_01.ogg#574431#1",})
-- Zones: Eastern Kingdoms
Zn(L["Zones"], L["Eastern Kingdoms"], "|cffffd800" .. L["Eastern Kingdoms"], {""})
Zn(L["Zones"], L["Eastern Kingdoms"], L["Arathi Highlands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Arathi Highlands"], prefol, "MUS_ArathiHighlands_GD#22292", "MUS_ArathiHighlands_GN#22293", "Zone-Desert Cave#5394", "Zone-Jungle Day#2525", "Zone-Mountain Night#2537", "Zone-Haunted#2990", "Zone-Orgrimmar#2901", "Zone-Volcanic Day#2529" , "Zone - Plaguelands#6066", "Moment - Battle05#6253", "Moment - Gloomy01#6074", "Moment-Stormwind08#5294",}) -- "Zone-Mystery#6065"
Zn(L["Zones"], L["Eastern Kingdoms"], L["Badlands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Badlands"], prefol, "MUS_Badlands_GD#22294", "MUS_BadlandsGoblin#22695", "MUS_BadlandsOgre#22691", "MUS_NewKargath#22692", "MUS_ScarOfTheWorldBreaker#22693", "MUS_TombOfTheWatchers#22694",})
Zn(L["Zones"], L["Eastern Kingdoms"], L["Blasted Lands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Blasted Lands"], prefol, "MUS_BlastedLands_GD#22296", "MUS_BlastedLandsGilnean#22688", "MUS_BlastedLandsHuman#22684", "MUS_BlastedLandsOgre#22682", "MUS_BlastedLandsShadowsworn#22679", "MUS_BlastedLandsTainted#22683", "MUS_BloodwashCavern#22680", "MUS_NethergardeMines#22686", "MUS_SunveilExcursion#22689", "MUS_TheDarkPortalIntro#22690",})
Zn(L["Zones"], L["Eastern Kingdoms"], L["Burning Steppes"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Burning Steppes"], prefol, "MUS_BurningSteppes#22298", "MUS_BurningSteppesBlackrock#22674", "MUS_BlackwingDescent#23171", "MUS_DreadmaulRock#22675", "MUS_FireplumeRidge#22737", "MUS_MorgansVigil#22677", "Zone-Cursed Land Felwood#5455", "Zone-CursedLandFelwoodFurbolg#5456", "Zone-Orgrimmar#2901", "Zone-Volcanic Day#2529", "Zone - Plaguelands#6066",}) -- "Zone-Mystery#6065", "Zone-Soggy Night#6836", "Zone-Soggy Day#7082"
Zn(L["Zones"], L["Eastern Kingdoms"], L["Cape of Stranglethorn"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Cape of Stranglethorn"], prefol, "MUS_CapeStranglethornA#22656", "MUS_StranglethornGoblin#23781", "MUS_StranglethornTrollB#22653", "MUS_StranglethornTrollA#22654", "Zone-Jungle Day#2525", "Zone-Soggy Night#6836", "Zone-Soggy Day#7082",}) -- "Zone-Mystery#6065"
Zn(L["Zones"], L["Eastern Kingdoms"], L["Dun Morogh"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Dun Morogh"], prefol, "MUS_DunMorogh_GD#22303", "MUS_DunMoroghTroll#22745", "MUS_ColdMountain_GU#22154", "MUS_DarkIronforge_GU#22160", "MUS_Gnomeregan#22756", "MUS_NewTinkertown#22753", "Zone-Evil Forest Night#2534", "Zone-Mountain Night#2537", "Zone-TavernAlliance#4516", "Zone-TavernDwarf01#11806",}) -- "Zone-Mystery#6065"
Zn(L["Zones"], L["Eastern Kingdoms"], L["Duskwood"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Duskwood"], prefol, "MUS_DuskwoodHaunted#22757", "MUS_DuskwoodHuman#22759", "MUS_DuskwoodWorgen#22758", "MUS_DuskwoodUndead#22760", "MUS_DustwallowOgre#22765", "MUS_HushedBank#22762", "MUS_TwilightGrove#22764", "Zone-EnchantedForest Night#2540", "Zone-EvilForest Day#2524", "Zone-Cursed Land Felwood#5455", "Zone-Volcanic Day#2529", "Zone - Plaguelands#6066",})
Zn(L["Zones"], L["Eastern Kingdoms"], L["Eastern Plaguelands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Eastern Plaguelands"], prefol, "MUS_EasternPlaguelands#22307", "MUS_EPlaguelandsArgent#22767", "MUS_EPlaguelandsCursed#22772", "MUS_EPlaguelandsHaunted#22766", "MUS_EPlaguelandsNerubian#22768", "MUS_LightsHopeChapel#22769", "MUS_QuelLithienLodge#22770", "MUS_Stratholme#22773", "Zone-EbonHArcherusWalk#14960", "Zone-EbonHDeathsBreachWalk#14961", "Zone-Haunted#2990", "Zone-OutlandCorruptRetail#10901", "Zone-Undercity#5074",}) -- "Zone-Mystery#6065", "Zone-Soggy Day#7082", "Zone-Soggy Night#6836", "Moment - Corrupt#9871"
Zn(L["Zones"], L["Eastern Kingdoms"], L["Elwynn Forest"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Elwynn Forest"], prefol, "Zone-Forest Day#2523", "Zone-Stormwind#2532", "Zone-TavernAlliance#4516",}) -- "Zone - Plaguelands#6066", "MUS_HillsbradFoothills_GD#22315", "MUS_HillsbradFoothills_GN#22316"
Zn(L["Zones"], L["Eastern Kingdoms"], L["Eversong Woods"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Eversong Woods"], prefol, "Zone-EversongDay#9789", "Zone-EversongNight#9790", "Zone-EversongRuinsDay#9797", "Zone-EversongRuinsNight#9798", "Zone-EversongBuildingsDay#9795", "Zone-EversongBuildingsNight#9796", "Zone-GhostlandsScenicWalk#9901", "Zone-SilvermoonDay#9793", "Zone-SilvermoonNight#9794",})
Zn(L["Zones"], L["Eastern Kingdoms"], L["Ghostlands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Ghostlands"], prefol, "Zone-GhostlandsDay#9803", "Zone-GhostlandsNight#9804", "Zone-GhostlandsEversongDarkWalk#10869", "Zone-GhostlandsShalandisWalk#10867", "Zone-DeatholmeDay#9805", "Zone-DeatholmeNight#9806", "Zone-Desert Cave#5394", "Zone-EversongBuildingsDay#9795", "Zone-EversongBuildingsNight#9796", "Zone-Haunted#2990", "Zone-ZulamanWalkingUni#12133", "Zone - Plaguelands#6066",}) -- "Moment - Corrupt#9871"
Zn(L["Zones"], L["Eastern Kingdoms"], L["Hillsbrad Foothills"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Hillsbrad Foothills"], prefol, "MUS_HillsbradFoothills_GD#22315", "MUS_HillsbradCursed#22789", "MUS_DurnholdeKeep#22788", "MUS_SludgeFields#22791", "MUS_TarrenMill#22790",})
Zn(L["Zones"], L["Eastern Kingdoms"], L["Hinterlands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Hinterlands"], prefol, "MUS_TheHinterlands_GD#22335", "MUS_HinterlandsMystical#22588", "MUS_HinterlandsNightElf#22565", "MUS_HinterlandsTrollA#22562", "MUS_HinterlandsTrollB#22564", "MUS_HinterlandsUndead#22563",})
Zn(L["Zones"], L["Eastern Kingdoms"], L["Isle of Quel'Danas"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Isle of Quel'Danas"], prefol, "Zone-GhostlandsDay#9803", "Zone-GhostlandsNight#9804", "Zone-QuelDanasDay#12528", "Zone-QuelDanasNight#12529",})
Zn(L["Zones"], L["Eastern Kingdoms"], L["Loch Modan"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Loch Modan"], prefol, "MUS_LochModan_GD#22319", "MUS_LochModanAlt_GD#22793", "MUS_LochModanOgre#22797", "MUS_LochModanTwilight#22799", "MUS_FarstriderLodgeIntro#22798", "MUS_IronbandsExcavationSite#22795", "MUS_IronwingCavernIntro#22796",})
Zn(L["Zones"], L["Eastern Kingdoms"], L["Northern Stranglethorn"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Northern Stranglethorn"], prefol, "MUS_NorthStranglethornA#22655", "MUS_StranglethornOgre#23780", "MUS_StranglethornTrollA#22654", "MUS_StranglethornVale_GU#22208", "MUS_ZandalariTroll#24681", "Zone-Jungle Day#2525", "Zone-Soggy Night#6836", "Zone-Soggy Day#7082", "Zone - Plaguelands#6066", "Moment - Zul Gurub#8452",}) -- "Zone-Mystery#6065"
Zn(L["Zones"], L["Eastern Kingdoms"], L["Redridge Mountains"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Redridge Mountains"], prefol, "MUS_RedridgeMountains_GD#22701", "MUS_RedridgeBlackrock#22703", "MUS_Redridge_GD#22321",})
Zn(L["Zones"], L["Eastern Kingdoms"], L["Ruins of Gilneas"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Ruins of Gilneas"], prefol, "MUS_GilneasForsaken#23086", "MUS_GilneasTown#23085", "MUS_Scarred_UU#22198", "MUS_Shadows_UU#22200",})
Zn(L["Zones"], L["Eastern Kingdoms"], L["Searing Gorge"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Searing Gorge"], prefol, "MUS_SearingGorgeA#22668", "MUS_SearingGorgeTwilight#22669", "MUS_TheCauldron#22671", "MUS_TheSlagPit#22673", "Zone-Volcanic Day#2529",}) -- "Zone-Desert Day#4754", "Zone-Desert Night#4755", "Zone-Jungle Day#2525", "Zone-Mystery#6065"
Zn(L["Zones"], L["Eastern Kingdoms"], L["Silverpine Forest"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Silverpine Forest"], prefol, "MUS_SilverpineForsaken#22665", "MUS_SilverpineHaunted#22667", "MUS_SilverpineHuman#22664", "MUS_SilverpineWorgen#22666", "MUS_ShadowfangKeep#23610", "Zone-Cursed Land Felwood#5455", "Zone-DarkForest#5376", "Zone-EvilForest Day#2524", "Zone-Haunted#2990", "Zone-TavernUndead#12137",}) -- "Moment - Battle04#6079"
Zn(L["Zones"], L["Eastern Kingdoms"], L["Swamp of Sorrows"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Swamp of Sorrows"], prefol, "MUS_SwampOfSorrowsDraenei#22541", "MUS_SwampOfSorrowsGoblin#22539", "MUS_SwampOfSorrowsTroll#22542", "Zone-Evil Forest Night#2534", "Zone-Soggy Night#6836", "Zone-Soggy Day#7082", "Zone - Plaguelands#6066",}) -- "Zone-Mystery#6065", "Moment - Battle05#6253", "Moment - Battle02#6262", "Moment - Battle06#6350"
Zn(L["Zones"], L["Eastern Kingdoms"], L["Tirisfal Glades"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Tirisfal Glades"], prefol, "MUS_TirisfalHaunted#22651", "MUS_UndercityAlt#22650", "MUS_70_Artif_TombofTyr_Walk#77240", "MUS_50_SM_Dungeon_ScarletEntranceWalk#33719", "MUS_50_SM_Dungeon_VestibuleWalk#33721", "Zone-EvilForest Day#2524", "Zone-Haunted#2990", "Zone-Undercity#5074", "Zone - Plaguelands#6066", "Zone-TavernHorde01#5355", "Zone-TavernUndead#12137", "Moment-Haunted02#5174", "MUS_61_GarrisonMusicBox_15#49540",})
Zn(L["Zones"], L["Eastern Kingdoms"], L["Tol Barad"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Tol Barad"], prefol, "MUS_TolBarad_BG#23627",})
Zn(L["Zones"], L["Eastern Kingdoms"], L["Twilight Highlands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Twilight Highlands"], prefol, "MUS_TwilightHighlands_GD (1)#23144", "MUS_TwilightHighlands_GN (1)#23145", "MUS_TwilightHighlandsCrystal#23159", "MUS_TwilightHighlandsHuman#23158", "MUS_TwilightHighlandsTwilightDay#23146", "MUS_TwilightOgre#23150", "MUS_BastionOfTwilight#23167", "MUS_Crushblow#23153", "MUS_DarkshoreCoast#23002", "MUS_GrimBatol#22637", "MUS_GrimBatolDungeonAlt#23169", "MUS_Krazzworks#23160", "MUS_TwilightHive#23796", "Zone-Forest Day#2523", "Zone-Volcanic Day#2529",})
Zn(L["Zones"], L["Eastern Kingdoms"], L["Vashj'ir"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Vashj'ir"], prefol, "MUS_AbyssalDepths_GN#22347", "MUS_KelpForest_GN#22349", "MUS_ShimmeringExpanse_GN#22351", "Zone-TavernPirate#11805",})
Zn(L["Zones"], L["Eastern Kingdoms"], L["Western Plaguelands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Western Plaguelands"], prefol, "MUS_WPlaguelands_GD#22352", "MUS_WPlaguelands_GN#22353", "MUS_WestPlaguelands_Cursed#22560", "MUS_WestPlaguelands_Haunted#22561", "Zone-Cursed Land Felwood#5455", "Zone-Haunted#2990", "Zone-Volcanic Day#2529", "Moment - Gloomy01#6074",}) -- "Zone-Soggy Night#6836", "Zone-Soggy Day#7082"
Zn(L["Zones"], L["Eastern Kingdoms"], L["Westfall"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Westfall"], prefol, "MUS_WestfallA#22645", "MUS_WestfallB#22646", "MUS_Deadmines#23609", "Zone-BarrenDry Night#2536", "Zone-EvilForest Day#2524", "Zone-Forest Day#2523", "Zone-Plains Day#2528",}) -- "Zone-Mystery#6065", "Zone-Orgrimmar#2901"
Zn(L["Zones"], L["Eastern Kingdoms"], L["Wetlands"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Wetlands"], prefol, "MUS_Wetlands_GD#22356", "MUS_Wetlands_GN#22357", "MUS_WetlandsHuman#22639", "MUS_WetlandsOrcs#22632", "MUS_WetlandsNightElf#22635", "Zone-Forest Day#2523", "Zone-Haunted#2990", "Zone-Jungle Day#2525", "Zone-Night Forest#2533", "Zone-Soggy Night#6836", "Zone-Soggy Day#7082", "Zone - Plaguelands#6066", "Zone-TavernAlliance#4516", "Zone-TavernPirate#11805",}) -- "Zone-Mystery#6065"
-- Zones: Kalimdor
Zn(L["Zones"], L["Kalimdor"], "|cffffd800", {""})
Zn(L["Zones"], L["Kalimdor"], "|cffffd800" .. L["Kalimdor"], {""})
Zn(L["Zones"], L["Kalimdor"], L["Ashenvale"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Ashenvale"], prefol, "MUS_AshenvaleBarrowDen#22939", "MUS_AshenvaleDemon#22936", "MUS_AshenvaleForsaken#22929", "MUS_AshenvaleFurbolg#22930", "MUS_AshenvaleNaga#22951", "MUS_AshenvaleSatyr#22946", "MUS_AshenvaleTwilight#22942", "MUS_BoughShadow#22932", "MUS_MaestrasPost#22943", "MUS_Thunderpeak#22960", "Zone-Crossroads#7097", "Zone-Cursed Land Felwood#5455", "Zone-CursedLandFelwoodFurbolg#5456", "Zone-Darnassus#3920", "Zone-Desert Day#4754", "Zone-Desert Night#4755", "Zone-EnchantedForest Day#2530", "Zone-EnchantedForest Night#2540", "Zone-Jungle Day#2525", "Zone - Plaguelands#6066", "Zone-OutlandsHordeBase9785", "Zone-TavernHorde#5234", "Zone-TavernOrc#12328",}) -- "Zone-Mystery#6065", "Moment - Battle06#6350"
Zn(L["Zones"], L["Kalimdor"], L["Azshara"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Azshara"], prefol, "MUS_Azshara_GN (1)#22965", "MUS_AzsharaCoast#22967", "MUS_AzsharaGoblin#22970", "MUS_AzsharaHaunted#22975", "MUS_AzsharaNaga#22981", "MUS_AzsharaTwilight#22983", "MUS_GallywixsVillaIntro#22546", "MUS_SecretLab#22987", "MUS_70_Zone_Highmountain_Azshara_HulnFlashback_Walk#22964", "Zone-Crossroads#7097", "Zone-Darnassus#3920", "Zone-Desert Day#4754", "Zone-Desert Cave#5394", "Zone-Haunted#2990", "Zone-Jungle Day#2525", "Zone-Mountain Night#2537", "Zone - Plaguelands#6066",}) -- "Zone-Mystery#6065", "Moment - Battle05#6253"
Zn(L["Zones"], L["Kalimdor"], L["Azuremyst Isle"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Azuremyst Isle"], prefol, "Zone-AzureMystWalking#9975", "Zone-AzuremystNagaWalking#9458", "Zone-AzuremystOwlWalking#10605", "Zone-OutlandsAllianceBase#9786",}) -- "Zone-Mystery#6065"
Zn(L["Zones"], L["Kalimdor"], L["Bloodmyst Isle"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Bloodmyst Isle"], prefol, "MUS_70_Zone_Highmountain_DrogbarEarth_Walk#76613", "Zone-AzuremystNagaWalking#9458", "Zone-BloodmystSatyrWalkingUni#9460",})
Zn(L["Zones"], L["Kalimdor"], L["Darkshore"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Darkshore"], prefol, "MUS_Darkshore_GD (1)#22992", "MUS_Darkshore_GN (1)#22993", "MUS_DarkshoreCoast#23002", "MUS_DarkshoreForsaken#23009", "MUS_DarkshoreTroll#22996", "MUS_DarkshoreTwilight#23000", "MUS_BlazingStrand#22994", "MUS_EyeOfTheVortex#23007", "MUS_GroveOfTheAncients#22999", "MUS_Nazjvel#23004", "MUS_ShatterSpearPass#22995", "MUS_TheVortex#23008", "Zone - Plaguelands#6066", "Zone-Soggy Night#6836", "Zone-Soggy Day#7082",}) -- "Zone-Mystery#6065"
Zn(L["Zones"], L["Kalimdor"], L["Desolace"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Desolace"], prefol, "MUS_Desolace_GD#22241", "MUS_Desolace_GD (1)#23013", "MUS_DesolaceBurningBlade#23023", "MUS_DesolaceCoast#23027", "MUS_DesolaceNightElf#23021", "MUS_GelkisVillageIntro#23016", "MUS_GhostwalkerPost#23017", "MUS_KarnumsGlade#23018", "MUS_MannorocCovenIntro#23020", "MUS_RanazjarIsle#23022", "MUS_ShadowpreyVillage#23024", "MUS_SlitherbladeShoreIntro#23026", "MUS_ThunksAbodeIntro#23029", "MUS_ValleyOfBonesIntro#23030",})
Zn(L["Zones"], L["Kalimdor"], L["Durotar"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Durotar"], prefol, "MUS_Durotar_GD (1)#23032", "MUS_Durotar_GN (1)#23033", "MUS_DurotarCoast#23036", "MUS_DurotarTroll#23034", "MUS_BurningBladeCoven#23039", "MUS_SpitescaleCavern#23044", "Zone-Desert Cave#5394", "Zone-Jungle Day#2525", "Zone-Orgrimmar_Day#36308", "Zone-Orgrimmar_Night#36309", "Zone-Orgrimmar#2901", "Zone-Plains Day#2528", "Zone-TavernOrc#12328",}) -- "Zone-Mystery#6065"
Zn(L["Zones"], L["Kalimdor"], L["Dustwallow Marsh"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Dustwallow Marsh"], prefol, "MUS_Dustwallow_GD#22247", "MUS_Dustwallow_GN#22248", "MUS_DustwallowGoblin#22595", "MUS_DustwallowGrimtotem#22589", "MUS_DustwallowHaunted#22591", "MUS_DustwallowHuman#22590", "MUS_DustwallowJungle#22592", "MUS_DustwallowTauren#22594", "MUS_StonemaulRuins#22596", "MUS_50_Scenario_AllianceTheramore#34012", "MUS_50_Scenario_HordeTheramore#34013", "Zone-Evil Forest Night#2534", "Zone-Jungle Day#2525", "Zone-Stormwind#2532", "Zone-Volcanic Day#2529", "Zone - Orgrimmar02#6146", "Moment-Orc Barren#7474", "Moment-StormwindSouthSeas#6837",})
Zn(L["Zones"], L["Kalimdor"], L["Felwood"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Felwood"], prefol, "MUS_Felwood#22250", "MUS_FelwoodNightElf#22629", "MUS_FelwoodDruid#22631", "MUS_FelwoodHorde#22630", "Zone-Cursed Land Felwood#5455", "Zone-CursedLandFelwoodFurbolg#5456", "Zone-EvilForest Day#2524", "Zone-Soggy Day#7082", "Zone-Soggy Night#6836",})
Zn(L["Zones"], L["Kalimdor"], L["Feralas"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Feralas"], prefol, "MUS_Feralas_GD#22252", "MUS_Feralas_GN#22253", "MUS_FeralasBugs#22627", "MUS_FeralasGrimtotem#22604", "MUS_FeralasHaunted#22600", "MUS_FeralasHorde#22626", "MUS_FeralasNightElf#22603", "MUS_FeralasTauren#22599", "MUS_DreamBough#22601", "Zone-EnchantedForest Day#2530", "Zone-EnchantedForest Night#2540", "Zone-Desert Day#4754", "Zone-Desert Cave#5394", "Zone-Soggy Night#6836", "Zone-Soggy Day#7082", "Zone-TavernTauren#12329", "Zone-Volcanic Day#2529", "Zone - Plaguelands#6066", "Moment - Gloomy01#6074",}) -- "Zone-Mystery#6065", "Moment-Spooky01#5037"
Zn(L["Zones"], L["Kalimdor"], L["Moonglade"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Moonglade"], prefol, "MUS_Moonglade#22860", "MUS_StormrageBarrowDens#22864", "Zone-CursedLandFelwoodFurbolg#5456", "Zone-EvilForest Day#2524", "Zone-TavernTempleofTheMoon#12136",})
Zn(L["Zones"], L["Kalimdor"], L["Mount Hyjal"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Mount Hyjal"], prefol, "MUS_MountHyjal_GD#22906", "MUS_MountHyjal_GN#22907", "MUS_HyjalDruid#22914", "MUS_HyjalFire#22912", "MUS_HyjalLight#22923", "MUS_HyjalLycan#22920", "MUS_HyjalOgre#22913", "MUS_HyjalTwilightDay#22911", "MUS_HyjalTwilightFire#22908", "MUS_LakeEdunel#22915", "MUS_LeyarasSorrow#22918", "MUS_Nordrassil#22922",})
Zn(L["Zones"], L["Kalimdor"], L["Mulgore"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Mulgore"], prefol, "MUS_Mulgore_GD#22260", "MUS_Mulgore_GN#22262", "MUS_MulgoreGrimtotem#22812", "MUS_MulgoreTauren#22810", "MUS_Bael'dunDigsite#22809", "MUS_VentureCoMine#22808", "Zone-Desert Cave#5394", "Zone-Plains Day#2528", "Zone-Soggy Night#6836", "Zone-Soggy Day#7082", "Zone-Volcanic Day#2529", "Zone - Plaguelands#6066",})
Zn(L["Zones"], L["Kalimdor"], L["Northern Barrens"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Northern Barrens"], prefol, "MUS_NorthBarrens_GD#22815", "MUS_NorthBarrens_GN#22816", "MUS_NorthBarrensGreen#22818", "MUS_NorthBarrensOrcs#22824", "MUS_NorthBarrensTauren#22825", "MUS_BoulderLodeMine#22819", "MUS_DreadmistPeak#22820", "MUS_SouthBarrensHuman#22839", "MUS_TheSludgeFen#22828", "MUS_TheWailingCaverns#22829", "Zone-BarrenDry Night#2536", "Zone-Desert Day#4754", "Zone-Desert Night#4755", "Zone-Jungle Day#2525", "Zone-Thunderbluff#7077", "Zone-Undead Dance#7083", "Zone-Undercity#5074", "Zone-Volcanic Day#2529", "Zone - Plaguelands#6066", "Zone-TavernAlliance#4516", "Zone-TavernPirate#11805",}) -- "Moment - Battle06#6350"
Zn(L["Zones"], L["Kalimdor"], L["Silithus"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Silithus"], prefol, "MUS_Silithus_GD#22268", "MUS_Silithus_GN#22269", "MUS_SilithusDark#22559", "MUS_SilithusTwilight#22558", "AhnQirajInteriorCenterRoom#8579", "AhnQirajKingRoom#8578", "AhnQirajTriangleRoomWalking#8577", "Zone - AhnQirajExterior#8531", "Zone Music - AhnQirajInteriorWa#8563", "Zone-Desert Day#4754", "Zone-Desert Night#4755", "Zone-Soggy Night#6836", "Zone-Soggy Day#7082", "Zone-TavernNightElf02#80449",}) -- "Zone-Mystery#6065"
Zn(L["Zones"], L["Kalimdor"], L["Southern Barrens"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Southern Barrens"], prefol, "MUS_SouthBarrens_GD#22270", "MUS_SouthBarrens_GN#22271", "MUS_SouthBarrenDwarf#22833", "MUS_SouthBarrensGreen#22846", "MUS_SouthBarrensHuman#22839", "MUS_SouthBarrensTaurens#22832", "MUS_Battlescar#22835", "MUS_DesolationHold#22837", "MUS_FrazzlecrazMotherlode#22841",}) -- "Moment - Battle04#6079"
Zn(L["Zones"], L["Kalimdor"], L["Stonetalon Mountains"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Stonetalon Mountains"], prefol, "MUS_StonetalonDruid#22856", "MUS_StonetalonGrimtotem#22848", "MUS_StonetalonNightElf#22855", "MUS_StonetalonOrcs#22854", "MUS_StonetalonTauren#22849", "MUS_StoneTalon_GU#22205", "MUS_KromgarFortress#22853", "MUS_TheSludgeworks#22850", "MUS_TheTalonDen#22857", "MUS_WebwinderHollow#22858", "MUS_WindshearHold#22859", "Zone-BarrenDry Night#2536", "Zone-EvilForest Day#2524", "Zone-Jungle Day#2525", "Zone-Night Forest#2533", "Zone - Plaguelands#6066", "Zone-TavernHorde#5234",})
Zn(L["Zones"], L["Kalimdor"], L["Tanaris"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Tanaris"], prefol, "MUS_Tanaris_GD#22274", "MUS_Tanaris_GN#22275", "MUS_TanarisBugs#22873", "MUS_TanarisOgre#22868", "MUS_TanarisTrollA#22867", "MUS_TanarisTrollB#22871", "MUS_Gadgetzan#22866", "MUS_Uldum_GD#22284", "MUS_Uldum_GN#22285", "MUS_43_WellOfEternity_AzsharaWalk#26581", "MUS_43_HourOfTwilight_GeneralWalk#26604", "Zone-CavernsofTimeWalk#10764", "Zone-Desert Day#4754", "Zone-Desert Night#4755", "Zone-Jungle Day#2525", "Zone-Volcanic Day#2529", "MUS_715_TavernGoblin#80448",})
Zn(L["Zones"], L["Kalimdor"], L["Teldrassil"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Teldrassil"], prefol, "MUS_BanethilBarrowDen#22885", "Zone-Darnassus#3920", "Zone-EnchantedForest Day#2530", "Zone-EnchantedForest Night#2540", "Zone-Evil Forest Night#2534", "Zone-Soggy Night#6836", "Zone-Soggy Day#7082",}) -- "Zone-Mystery#6065"
Zn(L["Zones"], L["Kalimdor"], L["Thousand Needles"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Thousand Needles"], prefol, "MUS_ThousandNeedles_GD#22280", "MUS_ThousandNeedlesGoblin#22729", "MUS_ThousandNeedlesGrimtotem#22730", "MUS_ThousandNeedlesTwilight#22733", "Zone-Desert Day#4754", "Zone-Desert Cave#5394", "Zone-Plains Day#2528", "Zone-Soggy Night#6836", "Zone-Soggy Day#7082", "Zone-Undead Dance#7083", "Zone-Undercity#5074", "Zone-TavernPirate#11805",}) -- "Zone-Mystery#6065"
Zn(L["Zones"], L["Kalimdor"], L["Uldum"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Uldum"], prefol, "MUS_Uldum_GD#22284", "MUS_Uldum_GN#22285", "MUS_LostCityOfTheTolvir#23173", "MUS_Skywall#23175", "Zone-UldumAlt#23068",})
Zn(L["Zones"], L["Kalimdor"], L["Un'Goro Crater"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Un'Goro Crater"], prefol, "MUS_FireplumeRidge#22737", "MUS_GolakkaHotSprings#22738", "MUS_UngoroBugs#22740", "Zone-Desert Day#4754", "Zone-Desert Night#4755", "Zone-Jungle Day#2525", "Zone-Soggy Night#6836", "Zone-UlduarStoneBattleWalk#14939",}) -- "Zone-Mystery#6065"
Zn(L["Zones"], L["Kalimdor"], L["Winterspring"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Winterspring"], prefol, "MUS_Winterspring_GD#22288", "MUS_Winterspring_GN#22289", "MUS_WinterspringGoblin#22569", "MUS_WinterspringHaunted#22567", "MUS_WinterspringNightElf#22568", "MUS_HyjalTwilightDay#22911", "Zone-EvilForest Day#2524", "Zone - Plaguelands#6066", "Moment - Gloomy01#6074", "MUS_715_TavernGoblin#80448",}) -- "Zone-Mystery#6065", "Zone-Soggy Night#6836", "Zone-Soggy Day#7082"
-- Zones: Outland
Zn(L["Zones"], L["Outland"], "|cffffd800", {""})
Zn(L["Zones"], L["Outland"], "|cffffd800" .. L["Outland"], {""})
Zn(L["Zones"], L["Outland"], L["Blade's Edge Mountains"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Blade's Edge Mountains"], prefol, "Zone-BladesEdge#9002", "Zone-BladesedgeDryForest#10609", "Zone-BladesEdgeGruulsLairWalk#10730", "Zone-OutlandsHordeBase#9785", "Zone-Shaman#10163", "Zone-ZangarmarshCoilfangWalk#10726",})
Zn(L["Zones"], L["Outland"], L["Hellfire Peninsula"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Hellfire Peninsula"], prefol, "Zone-HellfirePeninsula#9773", "Zone-ThrallmarWalk#10864", "Zone-OutlandBloodElfBase#10606", "Zone-OutlandDraeneiBase#10607", "Zone-OutlandsAllianceBase#9786",}) -- "Zone - Plaguelands#6066"
Zn(L["Zones"], L["Outland"], L["Nagrand"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Nagrand"], prefol, "Zone-NagrandDay#9012", "Zone-NagrandNight#9013", "Zone-OutlandsHordeBase#9785", "Zone-OutlandDraeneiBase#10607",}) -- "Zone-Volcanic Day#2529"
Zn(L["Zones"], L["Outland"], L["Netherstorm"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Netherstorm"], prefol, "Zone-Netherstorm#9284", "Zone-NetherplantWalking#10847", "Zone-NetherstormEco-Domes#10849", "Zone-OutlandBloodElfHostile#10856", "Zone-OutlandDraeneiBase#10607",})
Zn(L["Zones"], L["Outland"], L["Shadowmoon Valley"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Shadowmoon Valley"], prefol, "Zone-ZangarmarshCoilfangWalk#10726", "Zone-OutlandCorruptWalk#10848", "Zone-OutlandsHordeBase#9785", "Zone-OutlandsAllianceBase#9786", "Zone-OutlandDraeneiBase#10607", "Zone-BlackTempleWalk#11696", "Zone-BlackTempleKaraborWalk#11697", "Zone-BlackTempleSanctuaryWalk#11699", "Zone-BlackTempleAnguishWalk#11700", "Zone-BlackTempleVigilWalk#11701", "Zone-BlackTempleReliquaryWalk#11702", "Zone-BlackTempleDenWalk#11703",})
Zn(L["Zones"], L["Outland"], L["Terokkar Forest"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Terokkar Forest"], prefol, "Zone-Terokkar#9150", "Zone-TerokkarAchinounWalk#10729", "Zone-BoneWastesUni#9991", "Zone-OutlandBloodElfHostile#10856", "Zone-OutlandDraeneiBase#10607", "Zone-OutlandsHordeBase#9785", "Zone-OutlandsAllianceBase#9786",})
Zn(L["Zones"], L["Outland"], L["Zangarmarsh"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Zangarmarsh"], prefol, "Zone-ZangarMarsh#9149", "Zone-ZangarmarshCoilfangWalk#10726", "Zone-ExodarWalking#9972", "Zone-OutlandsHordeBase#9785", "Zone-OutlandDraeneiBase#10607", "Zone-TavernNightElf02#80449",}) -- "Moment - Gloomy01#6074"
-- Zones: Northrend
Zn(L["Zones"], L["Northrend"], "|cffffd800", {""})
Zn(L["Zones"], L["Northrend"], "|cffffd800" .. L["Northrend"], {""})
Zn(L["Zones"], L["Northrend"], L["Borean Tundra"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Borean Tundra"], prefol, "Zone-BoreanTundraDay#12746", "Zone-BoreanTundraNight#12747", "Zone-BoreanTundraTuskarrDay#12562", "Zone-BoreanTundraTuskarrNight#12561", "Zone-BoreanTundraGeyserFields#15101", "Zone-TaunkaDay#12802", "Zone-TaunkaNight#12803", "Zone-ColdarraGeneralWalk#14958", "Zone-ColdarraNexusEXT#14959", "Zone-NorthrenScourge#15049", "Zone-NorthrenOrcGeneralDay#15041", "Zone-NorthrenOrcGeneralNight#15042", "Zone-NorthrenRiplashDay#15044", "Zone-NorthrenRiplashNight#15045", "Zone-NorthrenDarker#15050", "Zone-NexusC#15059", "Zone-NexusD#15060", "Zone - NaxxramsDeathKnight#8687", "Zone-TavernAlliance#4516",})
Zn(L["Zones"], L["Northrend"], L["Crystalsong Forest"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Crystalsong Forest"], prefol, "Zone-CrystalSongForest#14905", "Zone-DalaranCity#14906", "Zone-DalaranCityCitadelInterior#14995", "Zone-DalaranSewersWalkUni#14908", "Zone-TavernAlliance#4516", "Zone-TavernHorde#5234", "MUS_60_Proudmoore_03#49358",})
Zn(L["Zones"], L["Northrend"], L["Dragonblight"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Dragonblight"], prefol, "Zone-DragonblightDay#12744", "Zone-DragonblightNight#12745", "Zone-DragonblightTuskarrDay#12563", "Zone-DragonblightTuskarrNight#12564", "Zone-DragonBlightWyrmrestDay#15121", "Zone-DragonBlightWyrmrestNight#15122", "Zone-NaxxramasAbominationBoss#8888", "Zone-NaxxramasAbomination#8883", "Zone-NaxxramasSpider#8884", "Zone-NaxxramasPlagueBoss#8886", "Zone-NaxxramasPlague#8885", "Zone-NaxxramasSpiderBoss#8887", "Zone-NaxxramasKelthuzad#8889", "Zone-NaxxramasFrostWyrm#8890", "Zone - NaxxramsDeathKnight#8687", "Zone-TaunkaDay#12802", "Zone-TaunkaNight#12803", "Zone-SholazarWalkDay#14893", "Zone-SholazarWalkNight#14894", "Zone-NorthrenOrcGeneralDay#15041", "Zone-NorthrenOrcGeneralNight#15042", "Zone-NorthrenRiplashDay#15044", "Zone-NorthrenRiplashNight#15045", "Zone-NorthrenTroll#15048", "Zone-NorthrenScourge#15049", "Zone-NorthrenDarker#15050", "Zone-AzjolNerubA#15096",}) -- "Zone-Haunted#2990", "Moment - Gloomy02#6075", "Zone-Soggy Night#6836", "Zone-Soggy Day#7082", "Zone-EbonHDeathsBreachWalk#14961", "Zone-EbonHNewAvalonWalk#14964"
Zn(L["Zones"], L["Northrend"], L["Grizzly Hills"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Grizzly Hills"], prefol, "Zone-GrizzlyHillsDay#12816", "Zone-GrizzlyHillsNight#12817", "Zone-GrizzlyHillsDayB#15036", "Zone-GrizzlyHillsNightB#15037", "Zone-GrizzlyHillsDayC#15038", "Zone-GrizzlyHillsNightC#15039", "Zone-GrizzlyHillsNightC-withTotems#77323", "Zone-TaunkaDay#12802", "Zone-TaunkaNight#12803", "Zone-IronDwarfDay#12824", "Zone-IronDwarfNight#12825", "Zone-VrykulWalk#14997", "Zone-NorthrenOrcGeneralDay#15041", "Zone-NorthrenOrcGeneralNight#15042", "Zone-NorthrenRiplashDay#15044", "Zone-NorthrenRiplashNight#15045", "Zone-NorthrenTroll#15048",}) -- "Zone-Mystery#6065", "Zone-EbonHNewAvalonWalk#14964"
Zn(L["Zones"], L["Northrend"], L["Howling Fjord"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Howling Fjord"], prefol, "Zone-HowlingFjordDay#12800", "Zone-HowlingFjordNight#12801", "Zone-HowlingFjordTuskarrDay#12565", "Zone-HowlingFjordTuskarrNight#12566", "Zone-TaunkaDay#12802", "Zone-TaunkaNight#12803", "Zone-IronDwarfDay#12824", "Zone-IronDwarfNight#12825", "Zone-VrykulWalk#14997", "Zone-TavernUndead#12137", "Zone-TavernAlliance#4516",}) -- "Zone-Cursed Land Felwood#5455", "Zone-Mystery#6065", "Zone-EbonHNewAvalonWalk#14964"
Zn(L["Zones"], L["Northrend"], L["Icecrown"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Icecrown"], prefol, "Zone-IcecrownGeneralWalkDay#13801", "Zone-IcecrownGeneralWalkNight#13802", "Zone-ColdarraGeneralWalk#14958", "Zone-UtgardeA#15062", "Zone-VrykulWalk#14997", "Zone-NorthrenScourge#15049", "Zone-NorthrenDarker#15050", "Zone-IcecrownDungeonWalk#17278", "AT_TournamentNightWalk#15850", "AT_TournamentDayWalk#15851",}) -- "Zone - Plaguelands#6066", "Zone-EbonHNewAvalonWalk#14964"
Zn(L["Zones"], L["Northrend"], L["Sholazar Basin"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Sholazar Basin"], prefol, "Zone-SholazarWalkDay#14893", "Zone-SholazarWalkNight#14894", "Zone-MakersTerrace#14896", "Zone-FireWalk#14897", "Zone-Pillartops#14898", "Zone-PathofLife#14902", "Zone-UlduarStoneGeneralWalk#14937",})
Zn(L["Zones"], L["Northrend"], L["Storm Peaks"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Storm Peaks"], prefol, "Zone-StormpeaksDay#13799", "Zone-StormpeaksNight#13800", "Zone-IronDwarfDay#12824", "Zone-IronDwarfNight#12825", "Zone-UlduarStoneBattleWalk#14939", "Zone-VrykulWalk#14997", "Zone-NorthrenDarker#15050", "UR_FormationGroundsWalk#15862",}) -- "Zone-Mystery#6065", "Zone-Soggy Night#6836", "Zone-Soggy Day#7082", "Moment-Monestery#7519", "Zone-EbonHNewAvalonWalk#14964"
Zn(L["Zones"], L["Northrend"], L["Wintergrasp"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Wintergrasp"], prefol, "Zone-WintergraspContested#14912", "Zone-UldarLightningGeneralWalk#14942",})
Zn(L["Zones"], L["Northrend"], L["Zul'Drak"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Zul'Drak"], prefol, "Zone-ZulDrakGeneralWalkDay#13804", "Zone-ZulDrakGeneralWalkNight#13805", "Zone-ZuldrakMamtoth#15114", "Zone-ZuldrakQuetzlun#15115", "Zone-ZuldrakRhunok#15116", "Zone-ZuldrakSsertus#15117", "Zone-EbonHDeathsBreachWalk#14961", "Zone-DraktharonRaptorPens#15087", "Zone-NorthrenScourge#15049", "Zone - NaxxramsDeathKnight#8687",})
-- Zones: Maelstrom
Zn(L["Zones"], L["Maelstrom"], "|cffffd800", {""})
Zn(L["Zones"], L["Maelstrom"], "|cffffd800" .. L["Maelstrom"], {""})
Zn(L["Zones"], L["Maelstrom"], L["Deepholm"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Deepholm"], prefol, "MUS_Deepholme#23056", "MUS_DeepholmeTwilight#23057", "MUS_DeepholmeCrystal#23058", "MUS_Bloodtrail#23063",})
Zn(L["Zones"], L["Maelstrom"], L["Kezan"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Kezan"], prefol, "MUS_Kezan#22254", "MUS_KajaMine#22550", "MUS_KajaroField#22552", "MUS_Drudgetown#22544", "MUS_FirstBankOfKezan#22545", "MUS_GallywixsVilla#22547", "MUS_GallywixsYacht#22549", "MUS_TheSlick#22555", "MUS_ThePipe#22557",})
Zn(L["Zones"], L["Maelstrom"], L["Lost Isles"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Lost Isles & Kazan"], prefol, "MUS_LostIsles_GD#23101", "MUS_LostIsles_GN#23102", "MUS_LostIslesMining#23107", "MUS_LostIslesPygmy#23122", "MUS_LostIslesNaga#23137", "MUS_KajamiteCavern#23115", "MUS_KTCOilPlatform#23117", "MUS_WarchiefsLookout#23142", "MUS_HordeBaseCamp#23113",})
-- Zones: Pandaria
Zn(L["Zones"], L["Pandaria"], "|cffffd800", {""})
Zn(L["Zones"], L["Pandaria"], "|cffffd800" .. L["Pandaria"], {""})
Zn(L["Zones"], L["Pandaria"], L["Dread Wastes"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Dread Wastes"], prefol, "MUS_50_DreadWastes_General_Walk#29201", "MUS_50_DW_AmberglowHollow_Walk#33841", "MUS_50_DW_RikkitunVillage_Walk#33822", "MUS_50_DW_TheSunsetBrewgarden_Walk#33829", "MUS_50_DW_TheHorridMarch_TheThunderingRun_Walk#33831", "MUS_50_DW_TerraceofGurthan_Walk#33832", "MUS_50_DW_ForgottenMire_Walk#33834", "MUS_50_DW_TheBrinyMuck_Walk#33843", "MUS_50_DW_LakeOfStars_Walk#33835", "MUS_50_DW_SoggysGamble_Walk#33836", "MUS_50_DW_KypaIk_Walk#33839", "MUS_50_DW_Klaxxivess_Walk#33840", "MUS_50_DW_WhisperingStones_Walk#33844", "MUS_50_MischiefMakers_GeneralWalk#33537", "PVP-Battle Grounds--DeepwindGorge#37659",})
Zn(L["Zones"], L["Pandaria"], L["Isle of Thunder"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Isle of Thunder"], prefol, "MUS_52_IOTK_IsleOfThunder_General_Walk#36641", "MUS_52_IOTK_Zandalari1_General_Walk#36642", "MUS_52_IOTK_Zandalari2_General_Walk#36644", "MUS_52_IOTK_Zandalari3_General_Walk#36678", "MUS_52_IOTK_Saurok_Walk#36681", "MUS_52_IOTK_MoguGraveyard_Walk#36769", "MUS_52_IOTK_MoguCaves_Walk#36781", "MUS_52_IOTK_Raid_Wing3_AncientMogu_Walk#36782", "MUS_52_IOTK_LootRoom_Intensity1#36909", "MUS_52_IOTK_LootRoom_Intensity2#36910", "MUS_52_IOTK_LootRoom_Intensity3#36911", "MUS_52_IOTK_LootRoom_Intensity0#36916", "MUS_52_IOTK_ShadoPan_Walk#36967", "MUS_52_IOTK_HordeHub_Walk#36770", "MUS_52_IOTK_AllianceHub_Walk#36771", "MUS_52_TKRaid_ThroneOfThunder_Main#36702",})
Zn(L["Zones"], L["Pandaria"], L["Jade Forest"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Jade Forest"], prefol, "MUS_50_JF_JadeForest_GeneralWalk_Day#29196", "MUS_50_JF_JadeForest_GeneralWalk_Night#31837", "MUS_50_JF_SerpentsHeart_Day#31838", "MUS_50_JF_SerpentsHeart_Night#31839", "MUS_50_JF_TempleoftheJadeSerpent_CourtyardWalk#29202", "MUS_50_JF_Windspire_Walk#30621", "MUS_50_JF_JadeForest_VillageWalk#33641", "MUS_50_JF_LairoftheJadeWitch_Walk#34014", "MUS_50_JF_EmperorsOmen_Walk#34022", "MUS_50_SpiritCave_Walk#29218", "MUS_50_Spirits_B#33112", "MUS_50_Hozen_Walk_Day#30437", "MUS_50_Hozen_Walk_Night#33640", "MUS_50_Mogu_Walk#30527", "MUS_50_Jinyu_Day#31124", "MUS_50_Jinyu_Night#33639", "MUS_50_PandarenTavern_A#33540", "MUS_50_TJS_FountainoftheEverseeing_Walk#30456", "MUS_50_TJS_Dungeon_FountainoftheEverseeing_Walk#31987", "MUS_50_TJS_Dungeon_ShaofDoubt_Battle#31990", "MUS_50_TJS_Dungeon_ScrollkeepersSanctum_Battle#31991", "MUS_50_TJS_Dungeon_TempleoftheJadeSerpent_GeneralWalk#31992",}) -- "Zone-IcecrownGeneralWalkDay#13801", "Zone-IcecrownGeneralWalkNight#13802"
Zn(L["Zones"], L["Pandaria"], L["Krasarang Wilds"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Krasarang Wilds"], prefol, "MUS_50_KW_TurtleBeach_Day#33376", "MUS_50_KW_TurtleBeach_Night#33379", "MUS_50_KW_KrasarangWilds_Jungle#33894", "MUS_50_KW_KrasarangWilds_Coast#33895", "MUS_50_KW_TempleoftheRedCrane_Walk#33897", "MUS_50_KW_Hozen_Walk#33898", "MUS_51_KW_KrasarangWilds_Goblin_Walk#34884", "MUS_51_KW_KrasarangWilds_MoguCave#34885", "MUS_51_KW_LionsLanding_Day_Walk#34880", "MUS_51_KW_LionsLanding_Night_Walk#34881", "MUS_51_KW_DominationPoint_Walk#34883", "MUS_50_Mogu_Walk#30527", "MUS_50_Jinyu_Day#31124", "MUS_50_Jinyu_Night#33639", "MUS_50_GSS_SerpentSpine_VEB_DW_Walk#34001", "MUS_50_CaveGeneric_A#34021", "MUS_51_Scenario_ALittlePatience#34979",}) -- "MUS_Kezan#22254", "MUS_MulgoreTauren#22810", "MUS_FrazzlecrazMotherlode#22841", "MUS_DesolaceNightElf#23021", "MUS_43_DarkmoonFaire_IslandWalk#26536"
Zn(L["Zones"], L["Pandaria"], L["Kun-Lai Summit"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Kun-Lai Summit"], prefol, "MUS_50_KLS_ValleyofEmperors_GeneralWalk#33885", "MUS_50_KLS_Mountains_GeneralWalk_Day#33865", "MUS_50_KLS_Mountains_GeneralWalk_Night#33866", "MUS_50_KLS_MountainHozen_Walk#33869", "MUS_50_KLS_YaungolAdvance_Walk#33867", "MUS_50_KLS_GrummleCamp_Walk#33870", "MUS_50_KLS_TempleoftheWhiteTiger_Walk#33872", "MUS_50_KLS_PeakofSerenity_Walk#33874", "MUS_50_KLS_PeakofSerenity_MistweaverWalk#33875", "MUS_50_KLS_PeakofSerenity_BrewmasterWalk#33876", "MUS_50_KLS_PeakofSerenity_WindwalkerWalk#33877", "MUS_50_KLS_PeakofSerenity_CraneWalk#33878", "MUS_50_KLS_ZouchinVillage_Walk#33880", "MUS_50_KLS_IsleofReckoning_Walk#33881", "MUS_50_KLS_ShadopanDefenseForce#33882", "MUS_50_KLS_TheBurlapTrail_Walk#33883", "MUS_50_KLS_YakWash_Walk#33886", "MUS_50_Jinyu_Day#31124", "MUS_50_Jinyu_Night#33639", "MUS_50_Spirits_B#33112", "MUS_50_MischiefMakers_GeneralWalk#33537", "MUS_50_PandarenTavern_A#33540", "MUS_50_SPM_Dungeon_ShadoPan_GeneralWalk#33651", "MUS_50_SPM_ShadoPan_GeneralWalk#33694",}) -- "Zone-Desert Cave#5394", "Zone - Plaguelands#6066"
Zn(L["Zones"], L["Pandaria"], L["Timeless Isle"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Timeless Isle"], prefol, "MUS_54_TI_TimelessIsle_Intro#39124", "MUS_54_TI_TimelessIsle_GeneralWalk_Day#39129", "MUS_54_TI_TimelessIsle_GeneralWalk_Night#39128", "MUS_54_TI_Timeless_VillageWalk#39126", "MUS_54_TI_Timeless_CelestialCourt#39687", "MUS_54_TI_Timeless_OrdonSantuary#39688", "MUS_54_TI_Timeless_FirewalkersPath#39689",})
Zn(L["Zones"], L["Pandaria"], L["Townlong Steppes"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Townlong Steppes"], prefol, "MUS_50_TownlongSteppes_GeneralWalk_Day#30435", "MUS_50_TownlongSteppes_GeneralWalk_Night#31836", "MUS_50_TS_SikvessLair_Walk#33855", "MUS_50_TS_FarwatchOverlook_Walk#33856", "MUS_50_TS_GaoRan_Walk#33859", "MUS_50_TS_Sravess_Walk#33961", "MUS_50_TS_Sumprush_Walk#33858", "MUS_50_TS_HatredsVice_Walk#33861", "MUS_50_TS_FireCampGaiCho_Walk#33934", "MUS_50_TS_GaiChoBattlefield_Walk#33935", "MUS_50_SiegeofNiuzaoTemple_Hero#30624", "MUS_50_Spirits_B#33112",}) -- "Zone-Mystery#6065"
Zn(L["Zones"], L["Pandaria"], L["Vale of Eternal Blossoms"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Vale of Eternal Blossoms"], prefol, "MUS_50_VEB_ValeofEternalBlossom_GeneralDay_Walk#29205", "MUS_50_VEB_ValeofEternalBlossom_GeneralNight_Walk#30638", "MUS_50_VEB_TheGoldenPagoda_Walk#33780", "MUS_50_VEB_AncestralRise_Walk#33781", "MUS_50_VEB_MSP_Exterior_Walk#33785", "MUS_50_VEB_Shrine_TheStarsBazaar_A_Walk#33786", "MUS_50_VEB_Shrine_TheEmperorsStep_A_Walk#33787", "MUS_50_VEB_Shrine_TheGoldenLantern_Walk#33789", "MUS_50_VEB_Shrine_ChamberofReflection_A_Walk#33791", "MUS_50_VEB_Shrine_PathofSerentiy_A_Walk#33796", "MUS_50_VEB_Shrine_EtherealCorridor_A_Walk#33797", "MUS_50_VEB_Shrine_ChamberofEnlightenment_A_Walk#33798", "MUS_50_VEB_Shrine_TheCelestialVault_A_Walk#33799", "MUS_50_VEB_Shrine_TheKeggary_Walk#33808", "MUS_50_VEB_RuinsRise_Walk#33810", "MUS_50_VEB_RuinsofGuoLai_Walk#33811", "MUS_50_VEB_TheFiveSisters_Walk#33812", "MUS_50_VEB_SettingSunGarrison_Walk#33813", "MUS_50_VEB_SettingSunGarrison_Brewery_Walk#33814", "MUS_50_VEB_TheSilentSanctuary_Walk#33815", "MUS_50_VEB_TheGoldenRose#33816", "MUS_50_VEB_WhitepetalLake_Walk#33817", "MUS_50_VEB_TheSummerFields_Walk#33991", "MUS_54_VEB_Corrupted_Worst_Day#39683", "MUS_54_VEB_Corrupted_Worst_Night#39684", "MUS_54_VEB_Corrupted_Moderate_Day#39685", "MUS_54_VEB_Corrupted_Moderate_Night#39686", "MUS_50_VEB_Shrine_ChamberofEnlightenment_H_Walk#39697", "MUS_50_VEB_Shrine_TheEmperorsStep_H_Walk#39698", "MUS_50_VEB_Shrine_PathofSerentiy_H_Walk#39699", "MUS_50_VEB_Shrine_EtherealCorridor_H_Walk#39700", "MUS_50_VEB_Shrine_TheCelestialVault_H_Walk#39701", "MUS_50_VEB_Shrine_TheStarsBazaar_H_Walk#39702",})
Zn(L["Zones"], L["Pandaria"], L["Valley of the Four Winds"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Valley of the Four Winds"], prefol, "MUS_50_VFW_TheHeartlandWalk_Day#31830", "MUS_50_VFW_TheHeartlandWalk_Night#30533", "MUS_50_VFW_GeneralWalk_Day#33686", "MUS_50_VFW_GeneralWalk_Night#33687", "MUS_50_VFW_PeacefulWalk#33689", "MUS_50_VFW_WindsEdgeWalk#33690", "MUS_50_VFW_BreweryWalk#33691", "MUS_50_VFW_TheHiddenMaster_Walk#33688", "MUS_50_Hozen_Walk_Day#30437", "MUS_50_Spirits_B#33112", "MUS_50_Jinyu_Day#31124", "MUS_50_MischiefMakers_GeneralWalk#33537", "MUS_50_PandarenTavern_A#33540", "MUS_50_GSS_SerpentSpine_VFW_DW_Walk#34002",})
Zn(L["Zones"], L["Pandaria"], L["Wandering Isle"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Wandering Isle"], prefol, "MUS_50_WanderingIsle_GeneralWalk#25837", "MUS_50_WanderingIsle_GeneralIndoors#25838", "MUS_50_WanderingIsle_PeiWuWalk#25833", "MUS_50_WanderingIsle_HozenWalk#25834", "MUS_50_WanderingIsle_SpiritsWalk#25835", "MUS_50_WanderingIsle_WoodofStavesWalk#25836", "MUS_50_WanderingIsle_TrainingWalk#25851", "MUS_50_WanderingIsle_TempleWalk#25854", "MUS_50_WanderingIsle_Temple_PreFire#33596", "MUS_50_WanderingIsle_Temple_Water/Earth#33597", "MUS_50_WanderingIsle_Temple_Air#33598",})
-- Zones: Draenor
Zn(L["Zones"], L["Draenor"], "|cffffd800", {""})
Zn(L["Zones"], L["Draenor"], "|cffffd800" .. L["Draenor"], {""})
Zn(L["Zones"], L["Draenor"], L["Ashran"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Ashran"], prefol, "MUS_60_PVP_Ashran_GeneralWalk#48481", "MUS_60_PVP_Ashran_AmphitheaterofAnnihilation_Walk#48500", "MUS_60_PVP_Ashran_AshmaulBurialGrounds#48482", "MUS_60_PVP_Ashran_MoltenQuarry_Walk#48485", "MUS_60_PVP_Ashran_OgreMine_Walk#48486", "MUS_60_PVP_Ashran_RingOfConquest_Walk#48641", "MUS_60_PVP_Ashran_RoadofGlory_Walk#48480", "MUS_60_PVP_Ashran_Stormshield_Battle#48537", "MUS_60_PVP_Ashran_Stormshield_Messhall_Harp#47068", "MUS_60_PVP_Ashran_Stormshield_Walk#48487", "MUS_60_PVP_Ashran_Warspear_Battle#48538", "MUS_60_PVP_Ashran_Warspear_Walk#48488", "PVP-AshranEventActive#47160",})
Zn(L["Zones"], L["Draenor"], L["Frostfire Ridge"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Frostfire Ridge"], prefol, "MUS_60_FFR_General_Walk#49001", "MUS_60_FFR_General_Night_Walk#49355", "MUS_60_FFR_DarkRock#49005", "MUS_60_FFR_Fel_Walk#49194", "MUS_60_FFR_Frostwolf_Walk#49189", "MUS_60_FFR_IronHorde_Walk#49191", "MUS_60_FFR_Mushroom_Sea_Walk#49193", "MUS_60_FFR_Ogre_Battle#49195", "MUS_60_FFR_Ogre_Walk#49192", "MUS_60_FFR_Thunderlord_Walk#49190",})
Zn(L["Zones"], L["Draenor"], L["Gorgrond"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Gorgrond"], prefol, "MUS_60_Gorgrond_Blackrock_Walk#48914", "MUS_60_Gorgrond_CrimsonFen_Walk#48915", "MUS_60_Gorgrond_Jungle_Walk#48912", "MUS_60_Gorgrond_LaughingSkull_Walk#48909", "MUS_60_Gorgrond_Mushroom_Sea_Walk#48911", "MUS_60_Gorgrond_Wasteland_Walk#48913",})
Zn(L["Zones"], L["Draenor"], L["Nagrand (Draenor)"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Nagrand"], prefol, "MUS_60_NGD_General_Walk#49065", "MUS_60_NGD_General_Night_Walk#49066", "MUS_60_NGD_BurningBlade_Walk#49076", "MUS_60_NGD_IronHorde_Walk#49072", "MUS_60_NGD_Mushroom_Walk#49070", "MUS_60_NGD_Ogre_Walk#49068", "MUS_60_NGD_OrcAncestors_Walk#49078", "MUS_60_NGD_Oshu'gun_Walk#49069", "MUS_60_NGD_RingofTrials_ArenaFloor_Battle#49077", "MUS_60_NGD_Underpale_Walk#49075", "MUS_60_NGD_Warsong_Walk#49067",})
Zn(L["Zones"], L["Draenor"], L["Shadowmoon Valley (Draenor)"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Shadowmoon Valley"], prefol, "MUS_60_SMV_General_Walk#48553", "MUS_60_SMV_General_Night_Walk#48554", "MUS_60_SMV_Cultist_Walk#48555", "MUS_60_SMV_DarkDraenei_Walk#49030", "MUS_60_SMV_Draenei_Karabor_Walk#48562", "MUS_60_SMV_Draenei_Walk#48559", "MUS_60_SMV_Fel_Walk#48556", "MUS_60_SMV_IronHorde_Walk#49031", "MUS_60_SMV_MoonMagic_Walk#48560", "MUS_60_SMV_Mushroom_Walk#48561", "MUS_60_SMV_NerzhulFinale_CultistBattle_Phase#49254", "MUS_60_SMV_Podling_Walk#48558", "MUS_60_SMV_Primals_Walk#48557", "MUS_60_SMV_YrelsCoronation_Phase_Playlist#49250", "MUS_60_SMV_Vignette_VindicatorTorvath#43487",})
Zn(L["Zones"], L["Draenor"], L["Spires of Arak"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Spires of Arak"], prefol, "MUS_60_SOA_General_Walk#48883", "MUS_60_SOA_AdmiralTaylorsGarrison_Inn#49032", "MUS_60_SOA_AdmiralTaylorsGarrison_Walk#48896", "MUS_60_SOA_Arakkoa_BombingRun#49174", "MUS_60_SOA_Arakkoa_Exiles_Walk#48894", "MUS_60_SOA_Arakkoa_Exiles_Night_Walk#49034", "MUS_60_SOA_Arakkoa_High_Walk#48885", "MUS_60_SOA_AvatarofTerokk_Phase#49176", "MUS_60_SOA_Axefall_Garrison_Walk#49037", "MUS_60_SOA_Bladefist_Walk#49035", "MUS_60_SOA_Goblin_Walk#48887", "MUS_60_SOA_Mushroom_Walk#48897", "MUS_60_SOA_SethekkHollow_Walk#48895", "MUS_60_SOA_Southport_Garrison_Walk#49036",})
Zn(L["Zones"], L["Draenor"], L["Talador"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Talador"], prefol, "MUS_60_TD_General_Walk#49079", "MUS_60_TD_Arakkoa_Walk#49085", "MUS_60_TD_Auchindoun_Walk#49082", "MUS_60_TD_CrystalMine_Walk#49088", "MUS_60_TD_DeathwebHollow_Walk#49087", "MUS_60_TD_Draenei_Walk#49081", "MUS_60_TD_DraeneiHoly_Walk#49083", "MUS_60_TD_DraeneiWartorn_Walk#49089", "MUS_60_TD_Fel_Walk#49084", "MUS_60_TD_Ogre_Walk#49086", "MUS_60_TD_Zangarra_Walk#49354",})
Zn(L["Zones"], L["Draenor"], L["Tanaan Jungle"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Tanaan Jungle"], prefol, "MUS_60_TJ_BlackrockQuarry_Walk#48335", "MUS_60_TJ_Guldan_Walk#48333", "MUS_60_TJ_HeartBlood_Walk#48334", "MUS_60_TJ_KargathProvingGrounds_Walk#48296", "MUS_60_TJ_PathofGlory_Walk#48298", "MUS_60_TJ_UmbralHalls_Walk#48299",})
-- Zones: Broken Isles
Zn(L["Zones"], L["Broken Isles"], "|cffffd800", {""})
Zn(L["Zones"], L["Broken Isles"], "|cffffd800" .. L["Broken Isles"], {""})
Zn(L["Zones"], L["Broken Isles"], L["Antoran Wastes (Argus)"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Antoran Wastes (Argus)"], prefol, "MUS_73_AntoranWastes_GeneralWalk#90584", "MUS_73_AntoranWastes_FullLegionWalk#90587", "MUS_73_AntoranWastes_HoldoutWalk#90586", "MUS_70_Invasion_Legion_GeneralWalk#75371", "MUS_70_Mardum_TheDoomFortress#56362", "MUS_73_Vindicaar_Walk_OverAntoranWastes_Gold#90700", "MUS_73_RAID_AntorusGeneralWalk#90609",})
Zn(L["Zones"], L["Broken Isles"], L["Azsuna"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Azsuna"], prefol, "MUS_70_Zone_Azsuna_GeneralWalk_Day#73363", "MUS_70_Zone_Azsuna_GeneralWalk_Night#73362", "MUS_70_Zone_Azsuna_Artif_Walk#77082", "MUS_70_Zone_Azsuna_Legion_WalkE#75106", "MUS_70_Zone_Azsuna_Sombre_Walk#77083", "MUS_70_Zone_Azsuna_WalkB#75104", "MUS_70_Zone_Azsuna_WalkC#75105", "MUS_70_Zone_Azsuna_WalkD#75216",})
Zn(L["Zones"], L["Broken Isles"], L["Broken Shore"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Broken Shore"], prefol, "MUS_70_BrokenShore_GeneralWalk_A#75355", "MUS_70_BrokenShore_Alliance_Walk#75363", "MUS_70_BrokenShore_Ashbringer_Moment#53990", "MUS_70_BrokenShore_Horde_Walk#75366", "MUS_70_BrokenShore_Legion_Walk_TensionA#75367", "MUS_70_BrokenShore_Legion_Walk_TensionB#75368", "MUS_70_Artif_BrokenShore_BattleWalk#53988", "MUS_70_Artif_BrokenShore_CaveWalk#53989",})
Zn(L["Zones"], L["Broken Isles"], L["Dalaran"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Dalaran"], prefol, "MUS_70_Zone_Dalaran_Ext_GeneralWalk_DAY#70715", "MUS_70_Zone_Dalaran_Ext_GeneralWalk_NIGHT#70716", "MUS_70_Zone_Dalaran_Ext_KrasusLanding#75072", "MUS_70_Zone_Dalaran_Mage_OH_Bold#75109", "MUS_70_Zone_Dalaran_Mage_OH_Light#75108", "MUS_70_Zone_Dalaran_Mage_Walk_A#75050", "MUS_70_Zone_Dalaran_Mage_Walk_B#75052", "MUS_70_Zone_Dalaran_Rogue_Walk_A#75292", "MUS_70_Zone_Dalaran_Rogue_Walk_B#75293", "MUS_70_Zone_Dalaran_Sewers_Walk_A#75048", "MUS_70_Zone_Dalaran_Sewers_Walk_B#75049",}) -- "MUS_70_Zone_Dalaran_Brewfest_Beergarden#75107", "MUS_70_Zone_Dalaran_Sewer_DwarfBardEmitter#75094"
Zn(L["Zones"], L["Broken Isles"], L["Highmountain"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Highmountain"], prefol, "MUS_70_Zone_Highmountain_Mountain_General_Walk#73367", "MUS_70_Zone_Highmountain_Azshara_HulnFlashback_Walk#22964", "MUS_70_Zone_Highmountain_Bloodtotem#73366", "MUS_70_Zone_Highmountain_Coast_Walk#76578", "MUS_70_Zone_Highmountain_DrogbarEarth_Walk#76613", "MUS_70_Zone_Highmountain_HunterLodge_Walk#76579", "MUS_70_Zone_Highmountain_River#76575", "MUS_70_Zone_Highmountain_ThunderTotem_Inn#76616", "MUS_70_Zone_Highmountain_ThunderTotem_Walk#76577",})
Zn(L["Zones"], L["Broken Isles"], L["Krokuun (Argus)"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Krokuun (Argus)"], prefol, "mus_73_krokuun_generalwalk#90541", "mus_73_krokuun_battlefieldwalk#90542", "mus_73_krokuun_courtoftheavenger#90545", "mus_73_krokuun_xenedarlandingwalk#90543", "mus_73_vindicaar_walk_overkrokuun_gold#90698",})
Zn(L["Zones"], L["Broken Isles"], L["Mac'Aree (Argus)"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Mac'Aree (Argus)"], prefol, "MUS_73_MacAree_GeneralWalk#90485", "MUS_73_MacAree_VoidFullWalk#90509", "MUS_73_MacAree_KiljaedenWalk#90510", "MUS_73_TheSeatoftheTriumvirate_VoidMediumWalk#90573", "MUS_73_Vindicaar_Walk_OverMacAree_Gold#90699",})
Zn(L["Zones"], L["Broken Isles"], L["Mardum"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Mardum"], prefol, "MUS_70_Mardum_WalkA#56358", "MUS_70_Mardum_WalkB#56361", "MUS_70_Mardum_WalkC#56360", "MUS_70_Mardum_IllidariFoothold#56363", "MUS_70_Mardum_TheDoomFortress#56362",})
Zn(L["Zones"], L["Broken Isles"], L["Stormheim"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Stormheim"], prefol, "MUS_70_Zone_Stormheim_General_Walk#73360", "MUS_70_Zone_Stormheim_DarkCoast_Walk#76490", "MUS_70_Zone_Stormheim_Mountain_Walk#76489", "MUS_70_Zone_Stormheim_Mystic_Walk#76491", "MUS_70_Zone_Stormheim_Valor_Walk#76492", "MUS_70_Zone_Stormheim_Village_Walk#73361",})
Zn(L["Zones"], L["Broken Isles"], L["Suramar"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Suramar"], prefol, "MUS_70_Zone_Suramar_Forest_General_Walk#73358", "MUS_70_Zone_Suramar_MoonGuard_Walk#73359", "MUS_70_Zone_Suramar_Sombre_Walk#76667", "MUS_70_Zone_SuramarCity_Corrupted_Walk#76670", "MUS_70_Zone_SuramarCity_Magnificent_Walk#76669", "MUS_70_Zone_SuramarCity_Occupied_Walk#76668", "MUS_70_Zone_Stormheim_General_Walk#73360", "MUS_70_Zone_Stormheim_Village_Walk#73361",})
Zn(L["Zones"], L["Broken Isles"], L["Val'sharah"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Val'sharah"], prefol, "MUS_70_Zone_ValSharah_GeneralWalk_Day#73365", "MUS_70_Zone_ValSharah_GeneralWalk_Night#73364", "MUS_70_Zone_ValSharah_Dark_Walk#76207", "MUS_70_Zone_ValSharah_Gilnean_Walk#76210", "MUS_70_Zone_ValSharah_NightElf_BarrowDens_Walk#51337", "MUS_70_Zone_ValSharah_NightElf_Druid_Walk#76204", "MUS_70_Zone_ValSharah_NightElf_Ruins_Walk#76206", "MUS_70_Zone_ValSharah_NightElf_TempleWalk#76205",})
-- Zones: Kul Tiras
Zn(L["Zones"], L["Kul Tiras"], "|cffffd800", {""})
Zn(L["Zones"], L["Kul Tiras"], "|cffffd800" .. L["Kul Tiras"], {""})
Zn(L["Zones"], L["Kul Tiras"], L["Drustvar"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Drustvar"], prefol, "MUS_80_Drustvar_AromsStand#115790", "MUS_80_Drustvar_Chandlery#116862", "MUS_80_Drustvar_Corlain#115798", "MUS_80_Drustvar_CrimsonForest#115793", "MUS_80_Drustvar_Fallhaven_Day#116808", "MUS_80_Drustvar_Fallhaven_Night#116809", "MUS_80_Drustvar_HighroadPass#115787", "MUS_80_Drustvar_Town#93658", "MUS_80_Drustvar_Waycrest#115809", "MUS_80_Vol'dun_Azerite#116567",})
Zn(L["Zones"], L["Kul Tiras"], L["Mechagon"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Mechagon"], prefol, "MUS_82_Mechagon_GeneralWalk#137815", "MUS_82_Mechagon_BondosYard#138271", "MUS_82_Mechagon_ForestWalk#138266", "MUS_82_Mechagon_Rustbolt#138270", "MUS_82_Mechagon_ScrapboneDenWalk#138267", "MUS_82_Mechagon_WesternSprayWalk#138269",})
Zn(L["Zones"], L["Kul Tiras"], L["Stormsong Valley"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Stormsong Valley"], prefol, "MUS_80_StormsongValley_Walk_Day#116050", "MUS_80_StormsongValley_Walk_Night#116068", "MUS_80_StormsongValley_Ashvane#116055", "MUS_80_StormsongValley_Horde#116057", "MUS_80_StormsongValley_Naga#116054", "MUS_80_StormsongValley_OldGods#116056", "MUS_80_StormsongValley_Quilboar#116052", "MUS_80_StormsongValley_ShrineofStorms#116091", "MUS_80_StormsongValley_Tortollan#116070",})
Zn(L["Zones"], L["Kul Tiras"], L["Tiragarde Sound"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Tiragarde Sound"], prefol, "MUS_80_TiragardeSound_Walk_Day#115888", "MUS_80_TiragardeSound_Walk_Night#115896", "MUS_80_TiragardeSound_Anglepoint_OldGods#116661", "MUS_80_TiragardeSound_Ashvane#115988", "MUS_80_TiragardeSound_Boralus_Day#116005", "MUS_80_TiragardeSound_Boralus_Night#116006", "MUS_80_TiragardeSound_Estate_Day#115967", --[["MUS_80_TiragardeSound_Estate_Night#115968",]] "MUS_80_TirgardeSound_Freehold#116110", "MUS_80_TiragardeSound_SirenSong#115999", "MUS_80_TiragardeSound_SirenSong_Cave#116659", "MUS_80_TiragardeSound_Proudmore_Day#116290", "MUS_80_TiragardeSound_Proudmore_Night#116291", "MUS_80_TiragardeSound_VigilHill_Day#115997", --[["MUS_80_TiragardeSound_VigilHill_Night#115998",]] "MUS_80_TiragardeSound_Witch#116660", --[["MUS_80_TiragardeSound_Taverns_Day#116559", "MUS_80_TiragardeSound_Taverns_Night#116560",]] "MUS_80_Vol'dun_Azerite#116567",})
-- Zones: Zandalar
Zn(L["Zones"], L["Zandalar"], "|cffffd800", {""})
Zn(L["Zones"], L["Zandalar"], "|cffffd800" .. L["Zandalar"], {""})
Zn(L["Zones"], L["Zandalar"], L["Nazjatar"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Nazjatar"], prefol, "MUS_82_Nazjatar_GeneralWalk_01#137770", "MUS_82_Nazjatar_AzsharaWalk_01#138519", "MUS_82_Nazjatar_CaveWalk_01#138516", "MUS_82_Nazjatar_HubWalk_01#138520", "MUS_82_Nazjatar_LandingWalk_01#138506", "MUS_82_Nazjatar_SeaweedWalk_01#138513", "MUS_82_Nazjatar_ZinAzshariWalk_01#138508",})
Zn(L["Zones"], L["Zandalar"], L["Nazmir"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Nazmir"], prefol, "MUS_80_Nazmir_GeneralWalk_Day#93666", "MUS_80_Nazmir_GeneralWalk_Night#116065", "MUS_80_Nazmir_Jurassic#116224", "MUS_80_Nazmir_Naga#116115", "MUS_80_Nazmir_Necropolis#116108", "MUS_80_Nazmir_Sethrak#116116", "MUS_80_Nazmir_Void#93672",})
Zn(L["Zones"], L["Zandalar"], L["Vol'dun"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Vol'dun"], prefol, "MUS_80_Vol'dun_GeneralWalk_Day#116281", --[["MUS_80_Vol'dun_GeneralWalk_Night#116284",]] "MUS_80_Vol'dun_Ashvane#116538", "MUS_80_Vol'dun_Azerite#116567", "MUS_80_Vol'dun_Distorted#116561", "MUS_80_Vol'dun_Naga#116486", "MUS_80_Vol'dun_Sethrak#116484", "MUS_80_Vol'dun_Tortollan#116485", "MUS_80_Nazmir_Necropolis#116108",})
Zn(L["Zones"], L["Zandalar"], L["Zuldazar"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Zuldazar"], prefol, "MUS_80_Zuldazar_GeneralWalk_Day#116611", --[["MUS_80_Zuldazar_GeneralWalk_Night#116629",]] "MUS_80_Zuldazar_Atal'Dazar#117049", "MUS_80_Zuldazar_Azerite#116609", "MUS_80_Zuldazar_BloodMagic#117025", "MUS_80_Zuldazar_Dazar'alor_Day#116674", "MUS_80_Zuldazar_Dazar'alor_Night#116986", --[["MUS_80_Zuldazar_Gral'sGrotto#117011",]] "MUS_80_Zuldazar_Naga#116962", "MUS_80_Zuldazar_Sethrak#116951", "MUS_80_Zuldazar_Tortollan#116964", "MUS_80_DGN_CityofGold_Grand#93663",})
-- Zones: Shadowlands
Zn(L["Zones"], L["Shadowlands"], "|cffffd800", {""})
Zn(L["Zones"], L["Shadowlands"], "|cffffd800" .. L["Shadowlands"], {""})
Zn(L["Zones"], L["Shadowlands"], L["Exile's Reach"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Exile's Reach"], prefol, "MUS_NPE_GeneralWalk#136278", "MUS_NPE_BattleIntro#136271", "MUS_NPE_BoatIntro#136272", "MUS_NPE_BoatWalk#136273", "MUS_NPE_Camp#136274", "MUS_NPE_DarkmaulCitadel#136277", "MUS_NPE_Harpy#136279", "MUS_NPE_OnFire#136276", "MUS_NPE_Outro#136270", "MUS_NPE_Quillboar#136280", "MUS_NPE_RTC_Attack(NYI)#136297",})
Zn(L["Zones"], L["Shadowlands"], L["Ardenweald"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Ardenweald"], prefol, "ZONE_90_AW_Tree_Withered#173914", "ZONE_90_AW_Tree_WinterQueenRoom#173966", "ZONE_90_AW_Tree_InDanger#173913", "ZONE_90_AW_Tree_Healthy#173969", "ZONE_90_AW_Tree_Drust#173912", "ZONE_90_AW_Serene#173964", "ZONE_90_AW_Mischief_GossamerCliffs#173977", "ZONE_90_AW_Mischief#173976", "ZONE_90_AW_MelancholyDream_GeneralWalk#173962", "ZONE_90_AW_Hunger#173909", "ZONE_90_AW_Hollow_Drust#173911", "ZONE_90_AW_Hollow#173908", "ZONE_90_AW_HeartofTheForest#174034", "ZONE_90_AW_GroveofAwakening#173967", "ZONE_90_AW_Dreamer#173968", "ZONE_90_AW_Devious#173975", "ZONE_90_AW_Amphitheater#173970",})
Zn(L["Zones"], L["Shadowlands"], L["Bastion"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Bastion"], prefol, "ZONE_90_BA_Broker_Walk#173825", "ZONE_90_BA_ElysianHold_Kyrian_Walk#173691", "ZONE_90_BA_Forsworn_HEAVY_Walk#173688", "ZONE_90_BA_Forsworn_LIGHT_Walk#173687", "ZONE_90_BA_Forsworn_MEDIUM_Walk#173686", "ZONE_90_BA_Garden_Walk#173684", "ZONE_90_BA_General_Walk#173683", "ZONE_90_BA_Kyrian_Meditative_Walk#173685", "ZONE_90_BA_Kyrian_Temple_Walk#173758", "ZONE_90_BA_Kyrian_Training_GardenWalk#173826", "ZONE_90_BA_Kyrian_Training_Walk#173689", "ZONE_90_BA_Maldraxxus_Walk#173847", "ZONE_90_BA_MirisChapel#173850",})
Zn(L["Zones"], L["Shadowlands"], L["Maldraxxus"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Maldraxxus"], prefol, "ZONE_90_MX_Maldraxxus_GeneralWalk#174450", "ZONE_90_MX_HouseofConstructs_Walk#174451", "ZONE_90_MX_HouseoftheChosen_Walk#174452", "ZONE_90_MX_HouseofEyes_Walk#174455", "ZONE_90_MX_HouseofPlagues_Walk#174453", "ZONE_90_MX_HouseofRituals_Walk#174454", "ZONE_90_MX_HouseofRituals_Domination#174531", "ZONE_90_MX_Necropolis_Walk#174457", "ZONE_90_MX_TheaterofPain_Walk#174456" --[["ZONE_90_MX_Cov_SeatofthePrimus_Walk#174529", "ZONE_90_MX_Cov_SeatofthePrimus_BleakRedoubt#177748", "ZONE_90_MX_Cov_SeatofthePrimus_Halls#177753"]],})
Zn(L["Zones"], L["Shadowlands"], L["Maw"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Maw"], prefol, "ZONE_90_MAW_Wilds_GeneralWalk#174983", "ZONE_90_MAW_Crystal_Walk#175583", "ZONE_90_MAW_Fortress_Walk#175584", "ZONE_90_MAW_Torghast_InteriorWalk#175661", "ZONE_90_MAW_Prologue_General_Walk#176906", "ZONE_90_MAW_Prologue_Hero_Action#176908", "ZONE_90_MAW_Prologue_Hero_Ambient#176909", "ZONE_90_MAW_AW_CovCh2_TyrandeInMaw_Walk#177217", "ZONE_90_MAW_AW_CovCh2_TyrandeInTorghast_Walk#177218",})
Zn(L["Zones"], L["Shadowlands"], L["Oribos"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Oribos"], prefol, "ZONE_90_OR_RingofFates#173954", "ZONE_90_OR_RingofTransference#173953",})
Zn(L["Zones"], L["Shadowlands"], L["Revendreth"] , { "|cffffd800" .. L["Zones"] .. ": " .. L["Revendreth"], prefol, "Zone_90_RD_EmberCourt_GeneralWalk#172764", "ZONE_90_RD_Forest_GeneralWalk#174072", "ZONE_90_RD_Ruins#174073", "ZONE_90_RD_Courtyard#174074", "ZONE_90_RD_Decadence#174075", "ZONE_90_RD_Sinister#174077", "ZONE_90_RD_Swamp#174078", "ZONE_90_RD_Sinfall#174079", --[["ZONE_90_RD_Interior#174080",]] "ZONE_90_RD_Scortched#174076",})
-- Dungeons: World of Warcraft
Zn(L["Dungeons"], L["World of Warcraft"], "|cffffd800" .. L["World of Warcraft"], {""})
Zn(L["Dungeons"], L["World of Warcraft"], L["Blackfathom Deeps"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Blackfathom Deeps"], prefol, "Zone-Desert Day#4754", "Zone-Desert Night#4755",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Blackrock Depths"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Blackrock Depths"], prefol, "Zone-Volcanic Day#2529",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Blackrock Spire"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Blackrock Spire"], prefol, "Orgrimmar Walking#5055", "Zone-CursedLand Felwood#5455", "Zone-VolcanicCave#2539",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Blackwing Lair"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Blackwing Lair"], prefol, "Zone - Plaguelands#6066",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Deadmines"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Deadmines"], prefol, "MUS_Deadmines#23609", "MUS_ChoGall_E#22151", "Zone-Orgrimmar#2901", "Moment-Spooky01#5037",}) -- "Zone-Mystery#6065"
Zn(L["Dungeons"], L["World of Warcraft"], L["Dire Maul"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Dire Maul"], prefol, "Zone-EnchantedForest Day#2530", "Zone-EnchantedForest Night#2540", "Zone-Evil Forest Night#2534",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Gnomeregan"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Gnomeregan"], prefol, "Zone-Gnomeragon#7341",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Maraudon"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Maraudon"], prefol, "Zone-BarrenDry Night#2536", "Zone-Soggy Day#7082", "Zone-Soggy Night#6836",}) -- "Moment - Battle02#6262"
Zn(L["Dungeons"], L["World of Warcraft"], L["Molten Core"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Molten Core"], prefol, "Moment - Battle01#6077", "Moment - Battle02#6262", "Moment - Battle03#6078", "Moment - Battle04#6079", "Moment - Battle05#6253", "Moment - Battle06#6350",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Razorfen Downs"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Razorfen Downs"], prefol, "Zone-Undercity#5074", "Zone-Undead Dance#7083",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Razorfen Kraul"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Razorfen Kraul"], prefol, "Zone-Desert Cave#5394",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Ruins of Ahn'Qiraj"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Ruins of Ahn'Qiraj"], prefol, "Zone - AhnQirajExterior#8531",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Scarlet Halls"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Scarlet Halls"], prefol, "MUS_50_SM_Dungeon_TrainingWalk#33725", "MUS_50_ScarletMonastery_A_Hero#30478",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Scarlet Monastery"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Scarlet Monastery"], prefol, "MUS_50_SM_Dungeon_ChapelGardensWalk#33738", "MUS_50_SM_Dungeon_CrusaderWalk#33740", "MUS_50_SM_Dungeon_TunnelsWalk#33723", "MUS_50_SM_Dungeon_VestibuleWalk#33721", "MUS_50_ScarletMonastery_A_Hero#30478", "MUS_Haunted_UU#22182",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Scholomance"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Scholomance"], prefol, "MUS_50_Scholomance_Walk#33521", "MUS_50_Scholomance_ChamberofSummoning#33511", "MUS_50_Scholomance_HeadmastersStudy#33513", "MUS_50_Scholomance_TheReliquary#33510", "MUS_50_Scholomance_TheUpperStudy#33512",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Shadowfang Keep"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Shadowfang Keep"], prefol, "MUS_ShadowfangKeep#23610", "MUS_Scarred_UU#22198", "MUS_Shadows_UU#22200", "Zone-EvilForest Day#2524",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Stockade"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Stockade"], prefol, "StomWindJail#4223",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Stratholme"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Stratholme"], prefol, "Zone-Undercity#5074",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Sunken Temple"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Sunken Temple"], prefol, "MUS_SwampOfSorrowsTroll#22542", "Zone-Soggy Day#7082", "Zone-Soggy Night#6836", "Moment - Battle02#6262", "Moment - Battle05#6253", "Moment - Battle06#6350",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Temple of Ahn'Qiraj"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Temple of Ahn'Qiraj"], prefol, "AhnQirajInteriorCenterRoom#8579", "AhnQirajKingRoom#8578", "AhnQirajTriangleRoomWalking#8577", "Zone - AhnQirajExterior#8531", "Zone Music - AhnQirajInteriorWa#8563",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Uldaman"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Uldaman"], prefol, "Zone-Volcanic Day#2529", "Moment-Battle05#6253", "Moment-Battle06#6350",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Wailing Caverns"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Wailing Caverns"], prefol, "MUS_TheWailingCaverns#22829", "Zone-Jungle Day#2525", "Zone-Jungle Night#2535", "Zone - Plaguelands#6066",})
Zn(L["Dungeons"], L["World of Warcraft"], L["Zul'Farrak"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Zul'Farrak"], prefol, "MUS_TanarisTrollA#22867",})
-- Dungeons: The Burning Crusade
Zn(L["Dungeons"], L["The Burning Crusade"], "|cffffd800", {""})
Zn(L["Dungeons"], L["The Burning Crusade"], "|cffffd800" .. L["The Burning Crusade"], {""})
Zn(L["Dungeons"], L["The Burning Crusade"], L["Black Morass"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Black Morass"], prefol, "Zone-CavernsofTimeBlackMorassWa#10731",})
Zn(L["Dungeons"], L["The Burning Crusade"], L["Black Temple"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Black Temple"], prefol, "Zone-BlackTempleWalk#11696", "Zone-BlackTempleKaraborWalk#11697", "Zone-BlackTempleSanctuaryWalk#11699", "Zone-BlackTempleAnguishWalk#11700", "Zone-BlackTempleVigilWalk#11701", "Zone-BlackTempleReliquaryWalk#11702", "Zone-BlackTempleDenWalk#11703", "Event_BlackTemplePreludeEvent01#11716",})
Zn(L["Dungeons"], L["The Burning Crusade"], L["Coilfang Reservoir"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Coilfang Reservoir"], prefol, "Zone-ZangarmarshCoilfangWalk#10726",})
Zn(L["Dungeons"], L["The Burning Crusade"], L["Hellfire Ramparts"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Hellfire Ramparts"], prefol, "Zone-HellfireCitadelRampartsWal#10727",})
Zn(L["Dungeons"], L["The Burning Crusade"], L["Hyjal Summit"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Hyjal Summit"], prefol, "Zone-HyjalPastNordrassilWalk#11652", "Zone-HyjalPastSummitWalk#11653",})
Zn(L["Dungeons"], L["The Burning Crusade"], L["Karazhan"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Karazhan"], prefol, "Zone-KarazhanGeneralDefault#12154", "Zone-KarazhanFoyerWalk#12156", "Zone-KarazhanStableWalk#12159", "Zone-KarazhanOperaWalk#12163", "Zone-KarazhanBackstageWalk#12162", "Zone-KarazhanLibraryWalk#12164", "Zone-KarazhanTowerNetherspiteW#12170", "Zone-KarazhanMalchezaarWalk#12168",})
Zn(L["Dungeons"], L["The Burning Crusade"], L["Magisters' Terrace"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Magisters' Terrace"], prefol, "Zone-MagistersTerraceWalking#12532", "Zone-MagistersTerraceIntWalking#12533", "Zone-MagistersTerraceKaelThas#12531",})
Zn(L["Dungeons"], L["The Burning Crusade"], L["Old Hillsbrad Foothills"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Old Hillsbrad Foothills"], prefol, "MUS_DurnholdeKeep#22788", "MUS_TarrenMill#22790", "Zone-CavernsoftimeHillsbradExtW#10770",})
Zn(L["Dungeons"], L["The Burning Crusade"], L["Sunwell Plateau"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Sunwell Plateau"], prefol, "Zone-SunwellPlateauWalking#12536",})
Zn(L["Dungeons"], L["The Burning Crusade"], L["Tempest Keep"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Tempest Keep"], prefol, "Zone-TempestKeepWalkingUni#12128", "Zone-TempestKeepBosses#12129",})
-- Dungeons: Wrath of the Lich King
Zn(L["Dungeons"], L["Wrath of the Lich King"], "|cffffd800", {""})
Zn(L["Dungeons"], L["Wrath of the Lich King"], "|cffffd800" .. L["Wrath of the Lich King"], {""})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Ahn'kahet (Old Kingdom)"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Ahn'kahet (Old Kingdom)"], prefol, "Zone-AzjolNerubC#15098", "Zone-AzjolNerubD#15099", "Zone-AzjolNerubE#15100",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Azjol-Nerub"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Azjol-Nerub"], prefol, "Zone-AzjolNerubA#15096", "Zone-AzjolNerubE#15100", "Zone-AzjolNerubB#15097", "Zone-AzjolNerubD#15099",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Culling of Stratholme"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Culling of Stratholme"], prefol, "Zone-StratholmePastOutdoorsDay#14920", "Zone-StratholmePastOutdoorsNigh#14921",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Drak'Tharon Keep"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Drak'Tharon Keep"], prefol, "Zone-DraktharonRaptorPens#15087",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Eye of Eternity"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Eye of Eternity"], prefol, "Zone-NexusGeneralWalkE#15061",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Forge of Souls"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Forge of Souls"], prefol, "Zone-ForgeOfSoulsWalk#17277", "MUS_70_Artif_DK_IcecrownWalk#77050", "Event-Bronjahm#17280",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Gundrak"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Gundrak"], prefol, "Zone-GundrakGeneralWalk#15089", "Zone-GundrakCaveofMamtoth#15092", "Zone-GundrakDenofSseratus#15090", "Zone-GundrakPoolofTwisted#15093", "Zone-GundrakChamberofAkali#15094", "Zone-GundrakTombofAncients#15091",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Halls of Lightning"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Halls of Lightning"], prefol, "Zone-UldarLightningGeneralWalk#14942", "Zone-UldarLightningBattleWalk#14945",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Halls of Reflection"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Halls of Reflection"], prefol, "Zone-IcecrownDungeonWalk#17278", "Event-HallsofReflection1#17282", "Event-HallsofReflection2#17283",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Halls of Stone"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Halls of Stone"], prefol, "Zone-UlduarStoneGeneralWalk#14937", "Zone-UlduarStoneBattleWalk#14939", "Zone-UlduarRaidGeneralWalk#15838",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Icecrown Citadel"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Icecrown Citadel"], prefol, "Zone-IcecrownRaidFloor2Intro#17291", "Zone-IcecrownRaidFloor2Plague#17294", "Zone-IcecrownRaidFloor2Spire#17296", "Zone-IcecrownRaidFloor2Valithria#17300", "Zone-IcecrownRaidFloor2Frost#17298", "Zone-IcecrownDungeonWalk#17278", "Zone-CrimsonHallWalk#17287", "Zone-ForgeOfSoulsWalk#17277", "Zone-FrostmourneWalk#17286", "Zone-PitofSaron#17310", "Zone-SindragosaWalk#17288",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Naxxramas"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Naxxramas"], prefol, "NaxxramasAbominationWing#8675", "NaxxramasPlagueWing#8678", "NaxxramasSpiderWing#8679", "Zone-NaxxramasAbominationBoss#8888", "Zone-NaxxramasPlagueBoss#8886", "Zone-NaxxramasSpiderBoss#8887", "Zone-NaxxramasKelthuzad#8889", "Zone-NaxxramasFrostWyrm#8890", "Zone - NaxxramsDeathKnight#8687",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Nexus"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Nexus"], prefol, "Zone-NexusGeneralWalkA#15057", "Zone-NexusGeneralWalkB#15058", "Zone-NexusGeneralWalkC#15059", "Zone-NexusGeneralWalkD#15060",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Obsidian Sanctum"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Obsidian Sanctum"], prefol, "Zone-ChamberAspects01Day#15077", "Zone-ChamberAspects01Night#15078",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Oculus"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Oculus"], prefol, "Zone-NexusGeneralWalkE#15061", "Zone-ColdarraNexusEXT#14959",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Onyxia's Lair"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Onyxia's Lair"], prefol, "Moment-Orc Barren#7474",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Pit of Saron"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Pit of Saron"], prefol, "Zone-PitofSaronEntry#17308", "Zone-PitofSaron#17310", "Zone-PitofSaronTyrannus#17314",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Ruby Sanctum"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Ruby Sanctum"], prefol, "RubySanctumWalk#17672",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Ulduar"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Ulduar"], prefol, "UR_UlduarRaidGeneralWalk#15838", "UR_BaseCampWalk#15854", "UR_CelestialHallWalk#15842", "UR_ConservatoryWalk#15843", "UR_CorridorsOfIngenuityWalk#15841", "UR_DescentWalk#15839", "UR_KingLlaneWalk#15835", "UR_PrisonOfYoggSaronWalk#15840", "UR_RazorscalesAerieWalk#15868", "UR_SparkOfImaginationWalk#15847", "UR_TheColossalForgeWalk#15865", "UR_TheScrapyardWalk#15871", "UR_TramHallWalk#15901", "UR_WyrmrestTempleWalk#15837",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Utgarde Keep"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Utgarde Keep"], prefol, "Zone-UtgardeA#15062", "Zone-UtgardeE#15066", "Music_Temp_95#14871",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Utgarde Pinnacle"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Utgarde Pinnacle"], prefol, "Zone-UtgardeA#15062", "Zone-UtgardeD#15065", "Music_Temp_95#14871", "Music_Temp_98#14874",})
Zn(L["Dungeons"], L["Wrath of the Lich King"], L["Vault of Archavon"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Vault of Archavon"], prefol, "Zone-UldarLightningGeneralWalk#14942",})
-- Dungeons: Cataclysm
Zn(L["Dungeons"], L["Cataclysm"], "|cffffd800", {""})
Zn(L["Dungeons"], L["Cataclysm"], "|cffffd800" .. L["Cataclysm"], {""})
Zn(L["Dungeons"], L["Cataclysm"], L["Bastion of Twilight"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Bastion of Twilight"], prefol, "MUS_BastionOfTwilight#23167",})
Zn(L["Dungeons"], L["Cataclysm"], L["Blackrock Caverns"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Blackrock Caverns"], prefol, "MUS_BlackrockCaverns#23170",})
Zn(L["Dungeons"], L["Cataclysm"], L["Blackwing Descent"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Blackwing Descent"], prefol, "MUS_BlackwingDescent#23171",})
Zn(L["Dungeons"], L["Cataclysm"], L["Dragon Soul"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Dragon Soul"], prefol, "MUS_43_DragonSoul_DWBackWalk#26618", "MUS_43_DragonSoul_EyeOfEternityWalk#26616", "MUS_43_DragonSoul_MaelstromWalk#26619", "MUS_43_DragonSoul_OldGodWalk#26614", "MUS_43_DragonSoul_SkyfireWalk#26617", "MUS_43_DragonSoul_WyrmrestSummitWalk#26615", "MUS_43_DragonSoul_WyrmrestWalk#26611",})
Zn(L["Dungeons"], L["Cataclysm"], L["End Time"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["End Time"], prefol, "MUS_43_EndTime_GeneralWalk#26573", "MUS_43_EndTime_EmeraldWalk#26574", "MUS_43_EndTime_MurozondIntro#26571", "Zone-NorthrenRiplashDay#15044", "Zone-NorthrenRiplashNight#15045",})
Zn(L["Dungeons"], L["Cataclysm"], L["Firelands"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Firelands"], prefol, "MUS_FL_FirelandsA_01#25396", "MUS_FL_FirelandsA_02#25397", "MUS_FL_FirelandsA_03#25398", "MUS_FL_FirelandsA_04#25399", "MUS_FL_FirelandsB_01#25400", "MUS_FL_FirelandsB_02#25401", "MUS_FL_FirelandsB_03#25402", "MUS_FL_FirelandsB_04#25403", "MUS_FL_FirelandsB_05#25404", "MUS_FL_DruidofFlameA_03#25389", "MUS_FL_DruidofFlameA_02#25390", "MUS_FL_DruidofFlameA_01#25391", "MUS_FL_DruidofFlameB_01#25392", "MUS_FL_DruidofFlameB_02#25393", "MUS_FL_DruidofFlameB_03#25394", "MUS_FL_DruidofFlameB_04#25395",})
Zn(L["Dungeons"], L["Cataclysm"], L["Grim Batol"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Grim Batol"], prefol, "MUS_GrimBatol#22637", "MUS_GrimBatolDungeonAlt#23169",})
Zn(L["Dungeons"], L["Cataclysm"], L["Halls of Origination"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Halls of Origination"], prefol, "MUS_HallsOfOriginationInt#23174",})
Zn(L["Dungeons"], L["Cataclysm"], L["Hour of Twilight"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Hour of Twilight"], prefol, "MUS_43_HourOfTwilight_GeneralWalk#26604", "MUS_43_HourOfTwilight_WyrmrestWalk#26610",})
Zn(L["Dungeons"], L["Cataclysm"], L["Lost City of the Tol'vir"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Lost City of the Tol'vir"], prefol, "MUS_LostCityOfTheTolvir#23173",})
Zn(L["Dungeons"], L["Cataclysm"], L["Stonecore"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Stonecore"], prefol, "MUS_Stonecore#23166",})
Zn(L["Dungeons"], L["Cataclysm"], L["Throne of the Four Winds"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Throne of the Four Winds"], prefol, "MUS_Skywall#23175",})
Zn(L["Dungeons"], L["Cataclysm"], L["Throne of the Tides"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Throne of the Tides"], prefol, "MUS_ThroneOfTheTides#23172",})
Zn(L["Dungeons"], L["Cataclysm"], L["Well of Eternity"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Well of Eternity"], prefol, "MUS_43_WellOfEternity_AzsharaWalk#26581", "MUS_43_WellOfEternity_IllidanWalk#26582", "MUS_43_WellOfEternity_MannorothWalk#26583",})
Zn(L["Dungeons"], L["Cataclysm"], L["Zul'Aman"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Zul'Aman"], prefol, "Zone-ZulamanWalkingUni#12133",})
Zn(L["Dungeons"], L["Cataclysm"], L["Zul'Gurub"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Zul'Gurub"], prefol, "MUS_ZA_altarofthebloodgod#24656", "MUS_ZA_mandokirsdomain#24652", "MUS_ZA_templeofbethekk#24654", "MUS_ZA_thecacheofmadness#24653", "MUS_ZA_thedevilsterrace#24655", "MUS_ZandalariTroll#24681", "Zone-Jungle Day#2525", "Zone-Jungle Night#2535",})
-- Dungeons: Mists of Pandaria
Zn(L["Dungeons"], L["Mists of Pandaria"], "|cffffd800", {""})
Zn(L["Dungeons"], L["Mists of Pandaria"], "|cffffd800" .. L["Mists of Pandaria"], {""})
Zn(L["Dungeons"], L["Mists of Pandaria"], L["Heart Of Fear"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Heart Of Fear"], prefol, "Zone-50-HOF-Raid-AmberWalk#33709", "Zone-50-HOF-Raid-AntechamberWalk#33700", "Zone-50-HOF-Raid-AtriumWalk#33707", "Zone-50-HOF-Raid-OratoriumWalk#33701", "Zone-50-HOF-Raid-StagingDreadWalk#33706", "Zone-50-HOF-Raid-StairwayWalk#33704", "Zone-50-HOF-Raid-TrainingWalk#33703",})
Zn(L["Dungeons"], L["Mists of Pandaria"], L["Gate of the Setting Sun"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Gate of the Setting Sun"], prefol, "MUS_50_GSS_Dungeon_GeneralWalk#33602",})
Zn(L["Dungeons"], L["Mists of Pandaria"], L["Mogu'shan Palace"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Mogu'shan Palace"], prefol, "MUS_50_MSP_Dungeon_BossWalk#33195", "MUS_50_MSP_Dungeon_ShaWalk#33196", "MUS_50_MSP_Dungeon_ShrineWalk#33215",})
Zn(L["Dungeons"], L["Mists of Pandaria"], L["Mogu'shan Vaults"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Mogu'shan Vaults"], prefol, "MUS_50_MSV_Raid_MoguShanVaults_GeneralWalk#29209",})
Zn(L["Dungeons"], L["Mists of Pandaria"], L["Shado-Pan Monastery"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Shado-Pan Monastery"], prefol, "MUS_50_SPM_Dungeon_ShadoPan_GeneralWalk#33651",})
Zn(L["Dungeons"], L["Mists of Pandaria"], L["Siege of Orgrimmar"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Siege of Orgrimmar"], prefol, "MUS_54_SOR_FULLRAID_GeneralWalk#39709", "MUS_54_SOR_Gates_CleftofShadows_Walk#39707", "MUS_54_SOR_Gates_DarkspearOffensive_Walk#39705", "MUS_54_SOR_Gates_Exterior_GeneralWalk#39703", "MUS_54_SOR_InnerSanctum_Garrosh_Sha_Walk#39680", "MUS_54_SOR_InnerSanctum_Garrosh_SWHarbor_Walk#39681", "MUS_54_SOR_OrgrimmarRaid_Walk_FirstHalf_Internal#39652", "MUS_54_SOR_OrgrimmarRaid_Walk_FirstHalf_External#39648", "MUS_54_SOR_OrgrimmarRaid_Walk_SecondHalf_Internal#39647", "MUS_54_SOR_OrgrimmarRaid_Walk_SecondHalf_External#39649", "MUS_54_SOR_Underhold_General_Walk#39711", "MUS_54_SOR_Underhold_Menagerie_Walk#39712", "MUS_54_SOR_Underhold_Arsenal_Walk#39713", "MUS_54_SOR_Underhold_Siegeworks_Walk#39714", "MUS_54_SOR_Vale_Immerseus_Walk#39691", "MUS_54_SOR_Vale_ScarredVale_Walk#39693", "MUS_54_SOR_Vale_NorushenRoom_Walk#39695",})
Zn(L["Dungeons"], L["Mists of Pandaria"], L["Siege of Niuzao Temple"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Siege of Niuzao Temple"], prefol, "MUS_50_SoN_Dungeon_HallowedOutTreeWalk#33612", "MUS_50_SoN_Dungeon_NiuzaoExteriorWalk#33614",})
Zn(L["Dungeons"], L["Mists of Pandaria"], L["Stormstout Brewery"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Stormstout Brewery"], prefol, "MUS_50_SSB_Dungeon_StormstoutBrewhall_INTRO#33756", "MUS_50_SSB_Dungeon_StormstoutBrewhall_Walk#33757",})
Zn(L["Dungeons"], L["Mists of Pandaria"], L["Temple of the Jade Serpent"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Temple of the Jade Serpent"], prefol, "MUS_50_TJS_Dungeon_FountainoftheEverseeing_Walk#31987", "MUS_50_TJS_Dungeon_ShaofDoubt_Battle#31990", "MUS_50_TJS_Dungeon_ScrollkeepersSanctum_Battle#31991", "MUS_50_TJS_Dungeon_TempleoftheJadeSerpent_GeneralWalk#31992",})
Zn(L["Dungeons"], L["Mists of Pandaria"], L["Terrace of Endless Spring"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Terrace of Endless Spring"], prefol, "MUS_50_TES_Raid_TerraceofEndlessSpring_GeneralWalk#33625",})
Zn(L["Dungeons"], L["Mists of Pandaria"], L["Throne of Thunder"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Throne of Thunder"], prefol, "MUS_52_TKRaid_ThroneOfThunder_Main#36702", "MUS_52_TKRaid_Wing3_FleshShaping_Walk#36920", "MUS_52_TKRaid_Wing1_Troll_Walk#36921", "MUS_52_TKRaid_Wing2_Creatures_Walk#36922", "MUS_52_TKRaid_Wing4_Palace_Walk#36923", "MUS_52_TKRaid_Wing1_Troll_Battle#37010",})
-- Dungeons: Warlords of Draenor
Zn(L["Dungeons"], L["Warlords of Draenor"], "|cffffd800", {""})
Zn(L["Dungeons"], L["Warlords of Draenor"], "|cffffd800" .. L["Warlords of Draenor"], {""})
Zn(L["Dungeons"], L["Warlords of Draenor"], L["Auchindoun"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Auchindoun"], prefol, "Zone-60-Dungeon-Auchindoun-NaveOfEternalRest-Battle#49196", "Zone-60-Dungeon-Auchindoun-CongregationOfSouls#49200", "Zone-60-Dungeon-Auchindoun-EasternTransept#49198", "Zone-60-Dungeon-Auchindoun-WesternTransept-Battle#49197",})
Zn(L["Dungeons"], L["Warlords of Draenor"], L["Blackrock Foundry"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Blackrock Foundry"], prefol, "MUS_60_Dungeon_BlackRock_Foundry_General#49225",})
Zn(L["Dungeons"], L["Warlords of Draenor"], L["Bloodmaul Slag Mines"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Bloodmaul Slag Mines"], prefol, "MUS_60_FFR_Ogre_Walk#49192", "MUS_60_FFR_Ogre_Battle#49195",})
Zn(L["Dungeons"], L["Warlords of Draenor"], L["Everbloom"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Everbloom"], prefol, "MUS_60_Dungeon_Everbloom_Stormwind#49219", "MUS_60_Dungeon_Everbloom_PoolsofLife#49220", "MUS_60_Dungeon_Everbloom_Verdant_Grove#49221", "MUS_60_Dungeon_Everbloom_Xeritacs_Burrow#49222", "MUS_60_Dungeon_Everbloom_VioletBluff#49223",})
Zn(L["Dungeons"], L["Warlords of Draenor"], L["Hellfire Citadel"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Hellfire Citadel"], prefol, "MUS_62_Tanaan_HFC_IronHorde_Cathedral_Walk#51515", "MUS_62_Tanaan_HFC_IronHorde_Fel_Walk#51519", "MUS_62_Tanaan_HFC_Boss_Battle#51573", "MUS_62_Tanaan_HFC_Kilrogg_Batlle#51574", "MUS_62_Tanaan_HFC_Fel_Walk#51520", "MUS_62_Tanaan_HFC_Archimonde_Battle#51525", "MUS_62_Tanaan_HFC_Eredar_Walk#51521", "MUS_62_Tanaan_HFC_Iskar_Battle#51522", "MUS_62_Tanaan_HFC_Grommash_Battle#51523", "MUS_62_Tanaan_HFC_Archimonde_TwistingNether_Walk#51526",})
Zn(L["Dungeons"], L["Warlords of Draenor"], L["Highmaul"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Highmaul"], prefol, "MUS_60_Dungeon_Highmaul_General#49276", "MUS_60_Dungeon_Highmaul_ImperatorsRise#49351", "MUS_60_Dungeon_Highmaul_PathOfVictors#49345", "MUS_60_Dungeon_Highmaul_TheUnderbelly#49282",})
Zn(L["Dungeons"], L["Warlords of Draenor"], L["Iron Docks"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Iron Docks"], prefol, "MUS_60_Dungeon_IronDocks_Walk#49187", "MUS_60_Dungeon_IronDocks_BlackhandsMight#49188",})
Zn(L["Dungeons"], L["Warlords of Draenor"], L["Shadowmoon Burial Grounds"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Shadowmoon Burial Grounds"], prefol, "MUS_60_Dungeon_SMBurialGrounds_Walk#49206", "MUS_60_Dungeon_SMBurialGrounds_CryptsoftheAncients#49208", "MUS_60_Dungeon_SMBurialGrounds_PoolsofReflection#49209", "MUS_60_Dungeon_SMBurialGrounds_AltarofShadow#49210",})
Zn(L["Dungeons"], L["Warlords of Draenor"], L["Skyreach"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Skyreach"], prefol, "MUS_60_Dungeon_Skyreach_General_A#49129",})
-- Dungeons: Legion
Zn(L["Dungeons"], L["Legion"], "|cffffd800", {""})
Zn(L["Dungeons"], L["Legion"], "|cffffd800" .. L["Legion"], {""})
Zn(L["Dungeons"], L["Legion"], L["Antorus, the Burning Throne"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Antorus, the Burning Throne"], prefol, "MUS_73_RAID_AntorusGeneralWalk#90609", "MUS_73_RAID_AntorusBattleWalk#90610", "MUS_73_RAID_AntorusElunariaWalk#90611", "MUS_73_RAID_BurningThroneWalk#90612",})
Zn(L["Dungeons"], L["Legion"], L["Arcway"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Arcway"], prefol, "MUS_60_FFR_Ogre_Walk#49192",})
Zn(L["Dungeons"], L["Legion"], L["Black Rook Hold"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Black Rook Hold"], prefol, "MUS_70_BlackRookHold_WalkA#76004", "MUS_70_BlackRookHold_WalkB#76007", "MUS_70_BlackRookHold_WalkC#76009",})
Zn(L["Dungeons"], L["Legion"], L["Cathedral of Eternal Night"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Cathedral of Eternal Night"], prefol, "MUS_72_ToS_Dungeon_GeneralWalk#85030", "MUS_72_ToS_Dungeon_GardenWalk#85032", "MUS_72_ToS_Dungeon_ChapelWalk#85031", "MUS_72_ToS_Dungeon_LegionWalk#85033", "MUS_72_ToS_Dungeon_LibraryWalk#85169",})
Zn(L["Dungeons"], L["Legion"], L["Court of Stars"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Court of Stars"], prefol, "MUS_70_DGN_SuramarCityDungeon_Walk01#76837", "MUS_70_DGN_SuramarCityDungeon_Walk02#76838",})
Zn(L["Dungeons"], L["Legion"], L["Darkheart Thicket"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Darkheart Thicket"], prefol, "MUS_70_Nightmare_Orchestral#73385", "MUS_70_Nightmare_Solo#73392", "MUS_70_Nightmare_Synth#73386",})
Zn(L["Dungeons"], L["Legion"], L["Emerald Nightmare"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Emerald Nightmare"], prefol, "MUS_70_Nightmare_Orchestral#73385", "MUS_70_Nightmare_Solo#73392", "MUS_70_Nightmare_Synth#73386", "MUS_70_Nightmare_TheEmeraldDream_Walk#76859",})
Zn(L["Dungeons"], L["Legion"], L["Eye of Azshara"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Eye of Azshara"], prefol, "MUS_70_EyeofAzshara_Walk_A#75040", "MUS_70_EyeofAzshara_Walk_B#74971", "MUS_70_EyeofAzshara_Walk_C#74973", "MUS_70_EyeofAzshara_Walk_D#74983",})
Zn(L["Dungeons"], L["Legion"], L["Halls of Valor"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Halls of Valor"], prefol, "MUS_70_HallsofValor_WalkA#75676", "MUS_70_HallsofValor_WalkB#75678", "MUS_70_HallsofValor_WalkC#75679",})
Zn(L["Dungeons"], L["Legion"], L["Maw of Souls"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Maw of Souls"], prefol, "MUS_70_MawofSouls_WalkA#75548", "MUS_70_MawofSouls_WalkB#75549", "MUS_70_MawofSouls_WalkC#75551",})
Zn(L["Dungeons"], L["Legion"], L["Neltharion's Lair"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Neltharion's Lair"], prefol, "MUS_70_NetharionsLair_WalkA#75947", "MUS_70_NetharionsLair_WalkB#75949", "MUS_70_NetharionsLair_WalkC#75953", "MUS_70_NetharionsLair_WalkD#75954",})
Zn(L["Dungeons"], L["Legion"], L["Nighthold"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Nighthold"], prefol, "MUS_62_Tanaan_HFC_Archimonde_Battle#51525", "MUS_71_TheNightholdIndoorWalk#79673", "MUS_71_TheNightholdOutdoorWalk#79674", "MUS_71_TheNightholdBattleHeavy#79675", "MUS_71_TheNightholdLegionFel#79676",})
Zn(L["Dungeons"], L["Legion"], L["Return to Karazhan"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Return to Karazhan"], prefol, "MUS_71_KarazhanGeneralDefault#79499",})
Zn(L["Dungeons"], L["Legion"], L["Seat of the Triumvirate"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Seat of the Triumvirate"], prefol, "MUS_73_TheSeatoftheTriumvirate_VoidFullWalk#90572", "MUS_73_TheSeatoftheTriumvirate_VoidMediumWalk#90573",})
Zn(L["Dungeons"], L["Legion"], L["Tomb of Sargeras"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Tomb of Sargeras"], prefol, "MUS_72_ToS_Raid_GeneralWalk#85171", "MUS_72_ToS_Raid_LegionWalk#85887", "MUS_72_ToS_Raid_TitanWalk#85888", "MUS_72_ToS_Raid_NightElfWalk#85889", "MUS_72_ToS_Raid_Naga_GeneralWalk#86406", "MUS_72_ToS_Raid_Naga_BossWalk#86407",})
Zn(L["Dungeons"], L["Legion"], L["Trial of Valor"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Trial of Valor"], prefol, "MUS_70_HallsofValor_WalkA#75676", "MUS_70_HallsofValor_WalkB#75678", "MUS_70_HallsofValor_WalkC#75679", "MUS_70_Zone_Stormheim_Mystic_Walk#76491", "MUS_71_TrialOfValor-DarkCoast-Walk#79719",})
Zn(L["Dungeons"], L["Legion"], L["Vault of the Wardens"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Vault of the Wardens"], prefol, "MUS_70_VOTW_Walk_A#74778",})
Zn(L["Dungeons"], L["Legion"], L["Violet Hold"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Violet Hold"], prefol, "Zone-VioletHoldWalkUni#14910",})
-- Dungeons: Battle for Azeroth
Zn(L["Dungeons"], L["Battle for Azeroth"], "|cffffd800", {""})
Zn(L["Dungeons"], L["Battle for Azeroth"], "|cffffd800" .. L["Battle for Azeroth"], {""})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Atal'Dazar"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Atal'Dazar"], prefol, "MUS_80_DGN_CityofGold#93663",})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Battle of Dazar'alor"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Battle of Dazar'alor"], prefol, "MUS_81_RAID_Zuldazar_Alliance_BloodMoon#126421", "MUS_81_RAID_Zuldazar_Alliance_Port#126352", "MUS_81_RAID_Zuldazar_Horde_Walk#125915", "MUS_81_RAID_Zuldazar_Horde_Port#126348", "MUS_81_RAID_Zuldazar_Pyramid#126329", "MUS_81_RAID_Zuldazar_Boss_Jaina02#126356",})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Crucible of Storms"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Crucible of Storms"], prefol, "MUS_815_CrucibleofStorms#129930", "MUS_815_RAID_CrucibleofStorms_GeneralWalk01#129976", "MUS_815_RAID_CrucibleofStorms_Boss01#129975", "MUS_815_RAID_CrucibleofStorms_Boss02#129979", "MUS_80_DGN_ShrineOfStorms_Shadows#116123",})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Eternal Palace"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Eternal Palace"], prefol, "MUS_82_EternalPalace_Raid_UnderwaterlWalk#138630",})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Freehold"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Freehold"], prefol, "MUS_70_Nightmare_Solo#73392", "MUS_80_DGN_Freehold_Outskirts#93660",})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Kings' Rest"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Kings' Rest"], prefol, "MUS_80_DGN_King'sRest#117218",})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Motherlode"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Motherlode"], prefol, "MUS_80_DGN_TheMotherlode_General_Walk#117425", "MUS_80_DGN_TheMotherlode_BombArea_Walk#117427",})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Ny'alotha"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Ny'alotha"], prefol, "RAID_83_Nyalotha_Nzoth_Mind_GeneralWalk#148259", "RAID_83_Nyalotha_ExteriorWalk_A#148228", "RAID_83_Nyalotha_ExteriorWalk_B#148232", "RAID_83_Nyalotha_InteriorWalk_A#148227", "RAID_83_Nyalotha_InteriorWalk_B#148233", "RAID_83_Nyalotha_InteriorWalk_C#148234", "RAID_83_Nyalotha_Wrathion#148215",})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Operation Mechagon"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Operation Mechagon"], prefol, "MUS_82_DGN_Mechagon_IslandWalk#138441",})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Shrine of the Storm"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Shrine of the Storm"], prefol, "MUS_80_DGN_ShrineOfStorms_Walk#116118", "MUS_80_DGN_ShrineOfStorms_Shadows#116123",})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Siege of Boralus"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Siege of Boralus"], prefol, "MUS_80_DGN_SiegeOfBoralus_Walk#116219", "MUS_80_DGN_SiegeOfBoralus_Kraken#116225",})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Temple of Sethraliss"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Temple of Sethraliss"], prefol, "MUS_80_DGN_TempleofSethraliss#117251",})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Tol Dagor"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Tol Dagor"], prefol, "MUS_80_DGN_TolDagor_Outside#116230", "MUS_80_DGN_TolDagor_Armory#117224",})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Uldir"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Uldir"], prefol, "MUS_80_RAID_Uldir_Blood#117988", "MUS_80_RAID_Uldir_Corruption#117670", "MUS_80_RAID_Uldir_G'huun_Intro#118031", "MUS_80_RAID_Uldir_Taloc_Intro#118029", "MUS_80_RAID_Uldir_Zul_Intro#118030",})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Underrot"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Underrot"], prefol, "MUS_80_DGN_TheUnderrot#117262",})
Zn(L["Dungeons"], L["Battle for Azeroth"], L["Waycrest Manor"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Waycrest Manor"], prefol, "MUS_80_DGN_WaycrestManor_Outdoors#117086",})
-- Dungeons: Shadowlands
Zn(L["Dungeons"], L["Shadowlands"], "|cffffd800", {""})
Zn(L["Dungeons"], L["Shadowlands"], "|cffffd800" .. L["Shadowlands"], {""})
Zn(L["Dungeons"], L["Shadowlands"], L["Castle Nathria"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Castle Nathria"], prefol, "RAID_90_RD_Chamber_General_Walk#176510", "RAID_90_RD_Dark_Walk#176521", "RAID_90_RD_Ballroom_AfterFight#175697", "RAID_90_RD_Ballroom_Combat#175695", "RAID_90_RD_Ballroom_DanceTilYouDie#175696", "RAID_90_RD_Ballroom_Distant#176497", --[["RAID_90_RD_Ballroom_Intermission#174982",]] "RAID_90_RD_Ballroom_PreFight#175700", "RAID_90_RD_Master_BattleA#176530", "RAID_90_RD_Master_BattleB#176532", "RAID_90_RD_Master_BattleC#176533", "RAID_90_RD_Master_FinaleRP#176537", "RAID_90_RD_Sewer_Walk#176523", "RAID_90_RD_CastleNathria_Battle01#176545", "RAID_90_RD_CastleNathria_Battle02#176546",})
Zn(L["Dungeons"], L["Shadowlands"], L["De Other Side"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["De Other Side"], prefol, "DGN_90_AW_DeOtherSide_AW_Walk#175994", "DGN_90_AW_DeOtherSide_AW_Battle#175995", "DGN_90_AW_DeOtherSide_Final_Battle#175999", "DGN_90_AW_DeOtherSide_MG_Battle#175998", "DGN_90_AW_DeOtherSide_MG_Walk#175997", "DGN_90_AW_DeOtherSide_Start#175990", "DGN_90_AW_DeOtherSide_ZG_Battle#175993", "DGN_90_AW_DeOtherSide_ZG_Walk#175992",})
Zn(L["Dungeons"], L["Shadowlands"], L["Halls of Atonement"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Halls of Atonement"], prefol, "DGN_90_RD_HallsOfAtonement_Walk#176112", "DGN_90_RD_HallsOfAtonement_Cathedral#176114",})
Zn(L["Dungeons"], L["Shadowlands"], L["Mists of Tirna Scithe"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Mists of Tirna Scithe"], prefol, "DGN_90_AW_MistsofTirnaScithe_Oaken#175982", "DGN_90_AW_MistsofTirnaScithe_MistVeil#175983", "DGN_90_AW_MistsofTirnaScithe_Tirna#175984", "DGN_90_AW_MistsofTirnaScithe_AfterMistCaller#175986",})
Zn(L["Dungeons"], L["Shadowlands"], L["Necrotic Wake"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Necrotic Wake"], prefol, "DGN_90_BA_NecroticWake_GeneralWalk#175827", "DGN_90_BA_NecroticWake_NecropolisInterior#175828",})
Zn(L["Dungeons"], L["Shadowlands"], L["Plaguefall"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Plaguefall"], prefol, "DGN_90_MX_Plaguefall_GeneralWalk#175823", "DGN_90_MX_Plaguefall_InteriorWalk#175824",})
Zn(L["Dungeons"], L["Shadowlands"], L["Sanctum of Domination"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Sanctum of Domination"], prefol, "mus_90_maw_torghast_ambient_h_2#184680",})
Zn(L["Dungeons"], L["Shadowlands"], L["Sanguine Depths"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Sanguine Depths"], prefol, "DGN_90_RD_SanguineDepths_Walk1#176107", "DGN_90_RD_SanguineDepths_Walk2#176108", "DGN_90_RD_SanguineDepths_Battle#176111",})
Zn(L["Dungeons"], L["Shadowlands"], L["Spires of Ascension"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Spires of Ascension"], prefol, "DGN_90_BA_SpiresofAscension_Walk1#175978", "DGN_90_BA_SpiresofAscension_Walk2#175979",})
Zn(L["Dungeons"], L["Shadowlands"], L["Tazavesh"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Tazavesh"], prefol, "mus_91_tavazesh_1_a#185588", "mus_91_tavazesh_1_b#186013", "mus_91_tavazesh_1_m#185599",})
Zn(L["Dungeons"], L["Shadowlands"], L["Theater of Pain"] , { "|cffffd800" .. L["Dungeons"] .. ": " .. L["Theater of Pain"], prefol, "DGN_90_MX_TheaterofPain_GeneralWalk#175703", "DGN_90_MX_TheaterofPain_AbomWalk#175704", "DGN_90_MX_TheaterofPain_LichWalk#175706", "DGN_90_MX_TheaterofPain_BATTLE#175702",})
-- Various
Zn(L["Various"], L["Various"], "|cffffd800" .. L["Various"], {""})
Zn(L["Various"], L["Various"], L["Allied Races"], { "|cffffd800" .. L["Various"] .. ": " .. L["Allied Races"], prefol,
"|cffffd800", "|cffffd800" .. L["Dark Iron Dwarves"], "MUS_80_AlliedRace_DarkIronDwarf_Intro#117230", "MUS_80_AlliedRace_DarkIronDwarf_Intro02#117258", "MUS_80_AlliedRace_DarkIronDwarf_Intro03#117261", "MUS_80_AlliedRace_DarkIronDwarf01_Start#117245", "MUS_80_AlliedRace_DarkIronDwarf02_Start#117246", "MUS_80_AlliedRace_DarkIronDwarf_Scenario_SFC#117250", "MUS_80_AlliedRace_DarkIronDwarf_Scenario_Firelands#117260",
"|cffffd800", "|cffffd800" .. L["Highmountain Tauren"], "MUS_735_AR_RTC_HighmountainTauren_Flythrough#98204",
"|cffffd800", "|cffffd800" .. L["Kul Tiran Humans"], "MUS_815_AlliedRace_KulTiran_Harbormaster#129703", "MUS_815_AlliedRace_KulTiran_Brennadam#129705", "MUS_815_AlliedRace_KulTiran_Atwater#129706", "MUS_815_AlliedRace_KulTiran_FogtideComplete#129715", "MUS_815_AlliedRace_KulTiran_Boat#129717", "MUS_815_AlliedRace_KulTiran_EvergreenGrove#129733",
"|cffffd800", "|cffffd800" .. L["Lightforged Draenei"], "MUS_735_AR_RTC_LightforgedDraenei_Flythrough#98201", "MUS_735_AlliedRace_LightforgedDraenei_Vindicaar_01#97314", "MUS_735_AlliedRace_LightforgedDraenei_ForgeofAeons#97316", "MUS_735_AR_RTC_LightforgedDraenei_PreScenario_01#98199", "MUS_735_AR_RTC_LightforgedDraenei_PreScenario_02#98200",
"|cffffd800", "|cffffd800" .. L["Mag'har Orcs"], "MUS_80_AlliedRace_Mag'harOrc_Intro#117279", "MUS_80_AlliedRace_Mag'harOrc02_Intro#117436", "MUS_80_AlliedRace_Mag'harOrc01#117280", "MUS_80_AlliedRace_Mag'harOrc02#117281", "MUS_80_AlliedRace_Mag'harOrc_Light#117286", "MUS_80_AlliedRace_Mag'harOrc_Light_Intro#117441",
"|cffffd800", "|cffffd800" .. L["Nightborne"], "MUS_735_AR_RTC_Nightborne_Flythrough#98205", "MUS_735_AR_RTC_Nightborne_Silvermoon_01#98214", "MUS_735_AR_RTC_Nightborne_Silvermoon_03#98215", "MUS_735_AR_RTC_Nightborne_ThalyssraEstate_01#98195", "MUS_735_AR_RTC_Nightborne_ThalyssraEstate_02#98196", "MUS_735_AR_RTC_Nightborne_ThalyssraEstate_03#98197",
"|cffffd800", "|cffffd800" .. L["Void Elves"], "MUS_735_AR_RTC_VoidElf_Flythrough#98206", "MUS_735_AlliedRace_VoidElf_01#97311", "MUS_735_AlliedRace_VoidElf_02#97312", "MUS_735_AlliedRace_VoidElf_Scenario_01#97782", "MUS_735_AlliedRace_VoidElf_Scenario_02#97783", "MUS_735_AlliedRace_VoidElf_Scenario_03#97784", "MUS_735_AR_ThunderBluff_VoidAttack#97785",
"|cffffd800", "|cffffd800" .. L["Zandalari Trolls"], "MUS_815_AlliedRace_Zandalari_Instigators#129762", "MUS_815_AlliedRace_Zandalari_LoaBwonsamdi#129666", "MUS_815_AlliedRace_Zandalari_LoaFly#129773", "MUS_815_AlliedRace_Zandalari_LoaGonk#129663", "MUS_815_AlliedRace_Zandalari_LoaPaku#129664", "MUS_815_AlliedRace_Zandalari_Start#129774",
"|cffffd800", "|cffffd800" .. L["Embassies"], "MUS_735_AlliedRace_EmbassyAlliance_01#97594", "MUS_735_AlliedRace_EmbassyHorde_01#97593",
})
Zn(L["Various"], L["Various"], L["Arenas"] , { "|cffffd800" .. L["Various"] .. ": " .. L["Arenas"], prefol, "Intro-NagrandDimond#10623", "MUS_50_Scenario_ArenaofAnnihilation#34019", "MUS_51_PVP_BrawlersGuild_Horde#34967", --[["MUS_80_PVP_ZandalarArena#117041", "MUS_80_PVP_KulTirasArena#114680",--]] "PVP-Battle Grounds#8233", "Zone-BladesEdge#9002",})
Zn(L["Various"], L["Various"], L["Battlegrounds"] , { "|cffffd800" .. L["Various"] .. ": " .. L["Battlegrounds"], prefol, "Altervac Valley_PVP#8014", "MUS_50_Scenario_TempleofKotmogu#33978", "MUS_815_PVP_ArathiBasin_Intro#129818", "MUS_815_PVP_WarsongGultch_Intro#129817", "MUS_BattleForGilneas_BG#23612", "MUS_TwinPeaks_BG#23613", "PVP-Battle Grounds#8233", "PVP-Battle Grounds--DeepwindGorge#37659", "PVP-Battle Grounds-Pandaria#33714", "PVP-Battle Grounds-SilvershardMines#33713", "PVPVictoryAlliance#8455", "PVPVictoryHorde#8454", "Zone-WintergraspContested#14912",})
Zn(L["Various"], L["Various"], L["Cinematics"] , { "|cffffd800" .. L["Various"] .. ": " .. L["Cinematics"], prefol,
-- Cinematic Music: World of Warcraft (movie.dbc)
"|cffffd800", "|cffffd800" .. L["World of Warcraft"],
"|Cffffffff" .. L["Ten Years of Warcraft"] .. " |r#625988#27", -- interface/cinematics/logo.mp3
"|Cffffffff" .. L["World of Warcraft"] .. " |r#625564#170", -- interface/cinematics/wow_intro.mp3
-- Cinematic Music: The Burning Crusade (movie.dbc)
"|cffffd800", "|cffffd800" .. L["The Burning Crusade"],
"|Cffffffff" .. L["The Burning Crusade"] .. " |r#625565#168", -- interface/cinematics/wow_intro_bc.mp3
-- Cinematic Music: Wrath of the Lich King (movie.dbc)
"|cffffd800", "|cffffd800" .. L["Wrath of the Lich King"],
"|Cffffffff" .. L["Wrath of the Lich King"] .. " |r#457498#198", -- interface/cinematics/wow_intro_lk.mp3
"|Cffffffff" .. L["Battle of Angrathar the Wrathgate"] .. " |r#458394#265", -- interface/cinematics/wow_wrathgate.mp3
"|Cffffffff" .. L["Fall of the Lich King"] .. " |r#625989#231", -- interface/cinematics/wow_fotlk.mp3
-- Cinematic Music: Cataclysm (movie.dbc)
"|cffffd800", "|cffffd800" .. L["Cataclysm"],
"|Cffffffff" .. L["Cataclysm"] .. " |r#455939#144", -- interface/cinematics/wow3x_intro.mp3
"|Cffffffff" .. L["Last Stand"] .. " |r#455940#101", -- interface/cinematics/worgen.mp3
"|Cffffffff" .. L["Leaving Kezan"] .. " |r#452603#104", -- interface/cinematics/goblin.mp3
"|Cffffffff" .. L["The Dragon Soul"] .. " |r#576955#29", -- interface/cinematics/dsi_act1.mp3
"|Cffffffff" .. L["Spine of Deathwing"] .. " |r#576956#21", -- interface/cinematics/dsi_act2.mp3
"|Cffffffff" .. L["Madness of Deathwing"] .. " |r#576957#27", -- interface/cinematics/dsi_act3.mp3
"|Cffffffff" .. L["Fall of Deathwing"] .. " |r#577085#94", -- interface/cinematics/dsi_act4.mp3
-- Cinematic Music: Mists of Pandaria (movie.dbc)
"|cffffd800", "|cffffd800" .. L["Mists of Pandaria"],
"|Cffffffff" .. L["Mists of Pandaria"] .. " |r#644071#228", -- interface/cinematics/wow_intro_mop.mp3
"|Cffffffff" .. L["Risking It All"] .. " |r#644128#62", -- interface/cinematics/mop_gse.mp3
"|Cffffffff" .. L["Leaving the Wandering Isle"] .. " |r#644124#40", -- interface/cinematics/mop_br.mp3
"|Cffffffff" .. L["Jade Forest Crash"] .. " |r#654949#18", -- interface/cinematics/mop_jade_crash.mp3
"|Cffffffff" .. L["The King's Command"] .. " |r#644136#59", -- interface/cinematics/mop_wra.mp3
"|Cffffffff" .. L["The Art of War"] .. " |r#644138#56", -- interface/cinematics/mop_wrh.mp3
"|Cffffffff" .. L["Battle of Serpent's Heart"] .. " |r#644134#106", -- interface/cinematics/mop_jade.mp3
"|Cffffffff" .. L["The Fleet in Krasarang (Horde)"] .. " |r#668416#27", -- interface/cinematics/mop_hsl.mp3
"|Cffffffff" .. L["The Fleet in Krasarang (Alliance)"] .. " |r#668414#27", -- interface/cinematics/mop_asl.mp3
"|Cffffffff" .. L["Hellscream's Downfall (Horde)"] .. " |r#916419#161", -- interface/cinematics/oro_horde.mp3
"|Cffffffff" .. L["Hellscream's Downfall (Alliance)"] .. " |r#916417#140", -- interface/cinematics/oro_alliance.mp3
-- Cinematic Music: Warlords of Draenor (movie.dbc)
"|cffffd800", "|cffffd800" .. L["Warlords of Draenor"],
"|Cffffffff" .. L["Warlords of Draenor"] .. " |r#1068826#258", -- interface/cinematics/wod_mainintro.mp3
"|Cffffffff" .. L["Darkness Falls"] .. " |r#1068485#91", -- interface/cinematics/wod_vel.mp3
"|Cffffffff" .. L["The Battle of Thunder Pass"] .. " |r#1068482#86", -- interface/cinematics/wod_fwv.mp3
"|Cffffffff" .. L["And Justice for Thrall"] .. " |r#1068483#157", -- interface/cinematics/wod_gvt.mp3
"|Cffffffff" .. L["Into the Portal"] .. " |r#1068480#41", -- interface/cinematics/wod_dpi.mp3
"|Cffffffff" .. L["A Taste of Iron"] .. " |r#1068481#44", -- interface/cinematics/wod_dpo.mp3
"|Cffffffff" .. L["The Battle for Shattrath"] .. " |r#1068484#138", -- interface/cinematics/wod_sra.mp3
"|Cffffffff" .. L["Gul'dan Ascendant"] .. " |r#1112524#139", -- interface/cinematics/wod_gto.mp3
"|Cffffffff" .. L["Gul'dan's Plan"] .. " |r#1139556#29", -- interface/cinematics/wod_hfi.mp3
"|Cffffffff" .. L["Victory in Draenor!"] .. " |r#1139557#120", -- interface/cinematics/wod_hfo.mp3
"|Cffffffff" .. L["Establish Your Garrison (Horde)"] .. " |r#1068476#18", -- interface/cinematics/wod_gar_horde_tier0-1.mp3
"|Cffffffff" .. L["Establish Your Garrison (Alliance)"] .. " |r#1068351#21", -- interface/cinematics/wod_gar_alliance_tier0-1.mp3
"|Cffffffff" .. L["Bigger is Better (Horde)"] .. " |r#1068475#23", -- interface/cinematics/wod_gar_horde_tier1-2.mp3
"|Cffffffff" .. L["Bigger is Better (Alliance)"] .. " |r#1068478#26", -- interface/cinematics/wod_gar_alliance_tier1-2.mp3
"|Cffffffff" .. L["My Very Own Castle (Horde)"] .. " |r#1068474#26", -- interface/cinematics/wod_gar_horde_tier2-3.mp3
"|Cffffffff" .. L["My Very Own Castle (Alliance)"] .. " |r#1068477#22", -- interface/cinematics/wod_gar_alliance_tier2-3.mp3
"|Cffffffff" .. L["Shipyard Construction (Horde)"] .. " |r#1137841#19", -- interface/cinematics/wod_gar_shipyard_lj_h.mp3
"|Cffffffff" .. L["Shipyard Construction (Alliance)"] .. " |r#1137839#20", -- interface/cinematics/wod_gar_shipyard_lj_a.mp3
-- Cinematic Music: Legion (movie.dbc)
"|cffffd800", "|cffffd800" .. L["Legion"],
"|Cffffffff" .. L["Legion"] .. " |r#1487144#225", -- interface/cinematics/legion_intro.mp3
"|Cffffffff" .. L["The Invasion Begins"] .. " |r#1487142#64", -- interface/cinematics/legion_dh1.mp3
"|Cffffffff" .. L["Return to the Black Temple"] .. " |r#1487143#129", -- interface/cinematics/legion_dh2.mp3
"|Cffffffff" .. L["The Demon's Trail"] .. " |r#1487148#38", -- interface/cinematics/legion_val_yx.mp3
"|Cffffffff" .. L["The Fate of Val'sharah"] .. " |r#1487147#82", -- interface/cinematics/legion_val_yd.mp3
"|Cffffffff" .. L["Fate of the Horde"] .. " |r#1487145#145", -- interface/cinematics/legion_org_vs.mp3
"|Cffffffff" .. L["A New Life for Undeath"] .. " |r#1487146#114", -- interface/cinematics/legion_sth.mp3
"|Cffffffff" .. L["Harbingers Gul'dan"] .. " |r#1487156#364", -- interface/cinematics/legion_hrb_g.mp3
"|Cffffffff" .. L["Harbingers Khadgar"] .. " |r#1487155#311", -- interface/cinematics/legion_hrb_k.mp3
"|Cffffffff" .. L["Harbingers Illidan"] .. " |r#1487157#245", -- interface/cinematics/legion_hrb_i.mp3
"|Cffffffff" .. L["The Nightborne Pact"] .. " |r#1510277#129", -- interface/cinematics/legion_su_i.mp3
"|Cffffffff" .. L["Stormheim (Horde)"] .. " |r#1506511#19", -- interface/cinematics/legion_g_h_sth.mp3
"|Cffffffff" .. L["Stormheim (Alliance)"] .. " |r#1506512#20", -- interface/cinematics/legion_g_a_sth.mp3
"|Cffffffff" .. L["Tomb of Sargeras"] .. " |r#1505326#15", -- interface/cinematics/legion_bs_i.mp3
"|Cffffffff" .. L["The Battle for Broken Shore (Alliance)"] .. " |r#1506318#252", -- interface/cinematics/legion_bs_a.mp3
"|Cffffffff" .. L["The Battle for Broken Shore (Horde)"] .. " |r#1506319#260", -- interface/cinematics/legion_bs_h.mp3
"|Cffffffff" .. L["A Falling Star"] .. " |r#1510075#77", -- interface/cinematics/legion_iq_lv.mp3
"|Cffffffff" .. L["Destiny Unfulfilled"] .. " |r#1510074#50", -- interface/cinematics/legion_iq_id.mp3
"|Cffffffff" .. L["The Nighthold"] .. " |r#1558961#81", -- interface/cinematics/legion_su_r.mp3
"|Cffffffff" .. L["Victory at The Nighthold"] .. " |r#1617300#161", -- interface/cinematics/legion_72_tst.mp3
"|Cffffffff" .. L["A Found Memento"] .. " |r#1617299#164", -- interface/cinematics/legion_72_ars.mp3
"|Cffffffff" .. L["Assault on the Broken Shore"] .. " |r#1617301#29", -- interface/cinematics/legion_72_ots.mp3
"|Cffffffff" .. L["Kil'Jaeden's Downfall"] .. " |r#1671790#137", -- interface/cinematics/legion_72_tsf.mp3
"|Cffffffff" .. L["Arrival on Argus"] .. " |r#1720225#195", -- interface/cinematics/legion_73_agi.mp3
"|Cffffffff" .. L["Rejection of the Gift"] .. " |r#1720226#198", -- interface/cinematics/legion_73_rtg.mp3
"|Cffffffff" .. L["Reincarnation of Alleria Windrunner"] .. " |r#1720227#32", -- interface/cinematics/legion_73_avt.mp3
"|Cffffffff" .. L["Rise of Argus"] .. " |r#1720231#57", -- interface/cinematics/legion_73_pan.mp3
"|Cffffffff" .. L["Antorus Ending"] .. " |r#1780281#182", -- interface/cinematics/legion_73_afn.mp3
"|Cffffffff" .. L["Epilogue (Horde)"] .. " |r#1862317#145", -- interface/cinematics/legion_735_eph.mp3
"|Cffffffff" .. L["Epilogue (Alliance)"] .. " |r#1862316#157", -- interface/cinematics/legion_735_epa.mp3
-- Cinematic Music: Battle for Azeroth (movie.dbc)
"|cffffd800", "|cffffd800" .. L["Battle for Azeroth"],
"|Cffffffff" .. L["Battle for Azeroth"] .. " |r#2125419#263", -- interface/cinematics/bfa_800_rb.mp3
"|Cffffffff" .. L["Warbringers Sylvanas"] .. " |r#2175009#232", -- interface/cinematics/bfa_800_sv.mp3
"|Cffffffff" .. L["The Fall of Lordaeron"] .. " |r#2175023#223", -- interface/cinematics/bfa_800_ltc_h.mp3
"|Cffffffff" .. L["Jaina Joins the Battle"] .. " |r#2175028#86", -- interface/cinematics/bfa_800_ltt.mp3
"|Cffffffff" .. L["Embers of War"] .. " |r#2175018#178", -- interface/cinematics/bfa_800_ltc_a.mp3
"|Cffffffff" .. L["Arrival to Zandalar"] .. " |r#2175033#183", -- interface/cinematics/bfa_800_stz.mp3
"|Cffffffff" .. L["Vision of Sailor's Memory"] .. " |r#2175038#25", -- interface/cinematics/bfa_800_zia.mp3
"|Cffffffff" .. L["Jaina Returns to Kul Tiras"] .. " |r#2175043#118", -- interface/cinematics/bfa_800_kta.mp3
"|Cffffffff" .. L["Jaina's Nightmare"] .. " |r#2175048#96", -- interface/cinematics/bfa_800_jnm.mp3
"|Cffffffff" .. L["Warbringers Jaina"] .. " |r#2175053#274", -- interface/cinematics/bfa_800_ja.mp3
"|Cffffffff" .. L["A Deal with Death"] .. " |r#2175058#178", -- interface/cinematics/bfa_800_bar.mp3
"|Cffffffff" .. L["The Threat Within"] .. " |r#2175063#136", -- interface/cinematics/bfa_800_zcf.mp3
"|Cffffffff" .. L["The Return of Hope"] .. " |r#2175068#152", -- interface/cinematics/bfa_800_ktf.mp3
"|Cffffffff" .. L["Realm Of Torment"] .. " |r#2175073#164", -- interface/cinematics/bfa_800_rot.mp3
"|Cffffffff" .. L["Terror of Darkshore"] .. " |r#2543204#164", -- interface/cinematics/bfa_810_tod.mp3
"|Cffffffff" .. L["An Unexpected Reunion"] .. " |r#2845776#170", -- interface/cinematics/bfa_815_dpr.mp3
"|Cffffffff" .. L["Siege of Dazar'alor"] .. " |r#2565179#128", -- interface/cinematics/bfa_810_akt.mp3
"|Cffffffff" .. L["Battle of Dazar'alor"] .. " |r#2543223#121", -- interface/cinematics/bfa_810_dor.mp3
"|Cffffffff" .. L["Warbringers Azshara"] .. " |r#2991597#425", -- interface/cinematics/bfa_820_awb.mp3
"|Cffffffff" .. L["Rise of Azshara (Horde)"] .. " |r#3039647#133", -- interface/cinematics/bfa_820_enc_262_h.mp3
"|Cffffffff" .. L["Rise of Azshara (Alliance)"] .. " |r#3039642#132", -- interface/cinematics/bfa_820_enc_262_a.mp3
"|Cffffffff" .. L["The Negotiation"] .. " |r#3075714#201", -- interface/cinematics/bfa_825_lh.mp3
"|Cffffffff" .. L["Reckoning"] .. " |r#3075719#379", -- interface/cinematics/bfa_825_os.mp3
"|Cffffffff" .. L["Azshara's Eternal Palace"] .. " |r#3022943#83", -- interface/cinematics/bfa_820_enc_261.mp3
"|Cffffffff" .. L["Wrathion's Scene"] .. " |r#3231695#61", -- interface/cinematics/bfa_83_927.mp3
"|Cffffffff" .. L["Visions of N'Zoth"] .. " |r#3231690#135", -- interface/cinematics/bfa_83_928.mp3
-- Cinematic Music: Shadowlands (movie.dbc)
"|cffffd800", "|cffffd800" .. L["Shadowlands"],
"|Cffffffff" .. L["Shadowlands"] .. " |r#3727029#320", -- interface/cinematics/shadowlands_901_si.mp3
"|Cffffffff" .. L["Afterlives Ardenweald"] .. " |r#3814425#362", -- interface/cinematics/shadowlands_901_aw.mp3
"|Cffffffff" .. L["Afterlives Bastion"] .. " |r#3809924#396", -- interface/cinematics/shadowlands_901_ba.mp3
"|Cffffffff" .. L["Afterlives Maldraxxus"] .. " |r#3814420#258", -- interface/cinematics/shadowlands_901_mx.mp3
"|Cffffffff" .. L["Afterlives Revendreth"] .. " |r#3814415#224", -- interface/cinematics/shadowlands_901_rd.mp3
"|Cffffffff" .. L["Exile's Reach (Horde)"] .. " |r#3755758#22", -- interface/cinematics/shadowlands_902_931.mp3
"|Cffffffff" .. L["Exile's Reach (Alliance)"] .. " |r#3260363#22", -- interface/cinematics/shadowlands_901_895.mp3
"|Cffffffff" .. L["Dark Abduction"] .. " |r#3755759#126", -- interface/cinematics/shadowlands_902_937.mp3
"|Cffffffff" .. L["For Teldrassil"] .. " |r#3755760#148", -- interface/cinematics/shadowlands_902_942.mp3
"|Cffffffff" .. L["Beyond The Veil"] .. " |r#3851149#104", -- interface/cinematics/shadowlands_901_lc.mp3
"|Cffffffff" .. L["Remember This Lesson"] .. " |r#3756096#197", -- interface/cinematics/shadowlands_901_rme.mp3
"|Cffffffff" .. L["Breaking The Arbiter"] .. " |r#3756093#95", -- interface/cinematics/shadowlands_901_bta.mp3
"|Cffffffff" .. L["A Glimpse Into Darkness"] .. " |r#3756092#66", -- interface/cinematics/shadowlands_901_etm.mp3
"|Cffffffff" .. L["No More Lies"] .. " |r#3756094#206", -- interface/cinematics/shadowlands_901_pim.mp3
"|Cffffffff" .. L["Sylvanas' Choice"] .. " |r#3756097#153", -- interface/cinematics/shadowlands_902_948.mp3
"|Cffffffff" .. L["Kingsmourne"] .. " |r#4035004#178", -- interface/cinematics/shadowlands_910_aaa.mp3
"|Cffffffff" .. L["Ysera Reborn"] .. " |r#3756095#144", -- interface/cinematics/shadowlands_902_941.mp3
"|Cffffffff" .. L["Battle For Ardenweald"] .. " |r#4202880#186", -- interface/cinematics/shadowlands_910_951.mp3
})
Zn(L["Various"], L["Various"], L["Class Trials"] , { "|cffffd800" .. L["Various"] .. ": " .. L["Class Trials"], prefol, "MUS_70_ClassTrial_Horde_BattleWalk#71954", "MUS_70_ClassTrial_Alliance_BattleWalk#71959",})
Zn(L["Various"], L["Various"], L["Credits"] , { "|cffffd800" .. L["Various"] .. ": " .. L["Credits"], prefol, "Menu-Credits01#10763", "Menu-Credits02#10804", "Menu-Credits03#13822", "Menu-Credits04#23812", "Menu-Credits05#32015", "Menu-Credits06#34020", "Menu-Credits07#56354", "Menu-Credits08#113560"})
Zn(L["Various"], L["Various"], L["Events"] , { "|cffffd800" .. L["Various"] .. ": " .. L["Events"], prefol,
"|cffffd800", "|cffffd800" .. L["Darkmoon Faire"], "MUS_43_DarkmoonFaire_IslandWalk#26536", "MUS_43_DarkmoonFaire_PavillionWalk#26539", "MUS_51_DarkmoonFaire_MerryGoRound_01#34440",
-- Flagged as Bad ID: "|cffffd800", "|cffffd800" .. L["Plants vs Zombies"], "EVENT_PvZ_Babbling#23487", "EVENT_PvZ_Dadadoo#23488", "EVENT_PvZ_Doobeedoo#23489", "EVENT_PvZ_Lalala#23490", "EVENT_PvZ_Sunflower#23491", "EVENT_PvZ_Zombieonyourlawn#23492",
"|cffffd800", "|cffffd800" .. L["Trial of Style"], "MUS_725_Event_Transmog_TrialOfStyle_1_Preparation#85957", "MUS_725_Event_Transmog_TrialOfStyle_2_Competition#85958", "MUS_725_Event_Transmog_TrialOfStyle_4_EndOfCompetition#85960",
})
Zn(L["Various"], L["Various"], L["Island Expeditions"] , { "|cffffd800" .. L["Various"] .. ": " .. L["Island Expeditions"], prefol,
"|cffffd800", "|cffffd800" .. L["Adventure"], "MUS_80_Islands_Adventure_Walk#115050", "MUS_80_Islands_Adventure_Invasion_Walk#115414", "MUS_80_Islands_Adventure_Victory#115053",
"|cffffd800", "|cffffd800" .. L["Mystical"], "MUS_80_Islands_Mystical_Walk#115689", "MUS_80_Islands_Mystical_Invasion_Walk#117352",
"|cffffd800", "|cffffd800" .. L["Winter"], "MUS_80_Islands_Winter_Walk#117377", "MUS_80_Islands_Winter_Invasion_Walk#117378",
"|cffffd800", "|cffffd800" .. L["Havenswood"], "MUS_81_Islands_Havenswood_Walk#125908",
"|cffffd800", "|cffffd800" .. L["Jorundall"], "MUS_81_Islands_Jorundall_Walk#126149",
})
Zn(L["Various"], L["Various"], L["Main Titles"] , { "|cffffd800" .. L["Various"] .. ": " .. L["Main Titles"], prefol, "GS_Retail#10924", "GS_BurningCrusade#10925", "GS_LichKing#12765", "GS_Cataclysm#23640", "MUS_50_HeartofPandaria_MainTitle#28509", "MUS_60_MainTitle#40169", "MUS_70_MainTitle#56353", "MUS_80_MainTitle#113559", "MUS_90_MainTitle#170711",}) -- "MUS_1.0_MainTitle_Original#47598"
Zn(L["Various"], L["Various"], L["Music Rolls"] , { "|cffffd800" .. L["Various"] .. ": " .. L["Music Rolls"], prefol, "MUS_61_GarrisonMusicBox_01#49511", "MUS_61_GarrisonMusicBox_02#49512", "MUS_61_GarrisonMusicBox_03#49513", "MUS_61_GarrisonMusicBox_04#49514", "MUS_61_GarrisonMusicBox_05#49515", "MUS_61_GarrisonMusicBox_06#49516", "MUS_61_GarrisonMusicBox_07#49529", "MUS_61_GarrisonMusicBox_08#49530", "MUS_61_GarrisonMusicBox_09#49531", "MUS_61_GarrisonMusicBox_10#49533", "MUS_61_GarrisonMusicBox_11#49535", "MUS_61_GarrisonMusicBox_12#49536", "MUS_61_GarrisonMusicBox_13#49538", "MUS_61_GarrisonMusicBox_14#49539", "MUS_61_GarrisonMusicBox_15#49540", "MUS_61_GarrisonMusicBox_16#49541", "MUS_61_GarrisonMusicBox_17#49543", "MUS_61_GarrisonMusicBox_18#49544", "MUS_61_GarrisonMusicBox_19#49545", "MUS_61_GarrisonMusicBox_20#49546", "MUS_61_GarrisonMusicBox_21#49526", "MUS_61_GarrisonMusicBox_22#49528", "MUS_61_GarrisonMusicBox_23_Alliance#49517", "MUS_61_GarrisonMusicBox_24_Alliance#49518", "MUS_61_GarrisonMusicBox_25_Alliance#49519", "MUS_61_GarrisonMusicBox_26_Alliance#49520", "MUS_61_GarrisonMusicBox_27_Alliance#49521", "MUS_61_GarrisonMusicBox_28_Alliance#49522", "MUS_61_GarrisonMusicBox_29_Alliance#49523", "MUS_61_GarrisonMusicBox_30_Alliance#49524", "MUS_61_GarrisonMusicBox_31_Alliance#49525", "MUS_61_GarrisonMusicBox_23_Horde#49555", "MUS_61_GarrisonMusicBox_24_Horde#49554", "MUS_61_GarrisonMusicBox_25_Horde#49553", "MUS_61_GarrisonMusicBox_26_Horde#49552", "MUS_61_GarrisonMusicBox_27_Horde#49551", "MUS_61_GarrisonMusicBox_28_Horde#49550", "MUS_61_GarrisonMusicBox_29_Horde#49549", "MUS_61_GarrisonMusicBox_30_Horde#49548", "MUS_61_GarrisonMusicBox_31_Horde#49547",})
Zn(L["Various"], L["Various"], L["Narration"] , { "|cffffd800" .. L["Various"] .. ": " .. L["Narration"], prefol, "BloodElfFlybyNarration#9156", "DeathKnightFlybyNarration#12938", "DraeneiFlybyNarration#9155", "DwarfFlyByNarration#3740", "GnomeFlyByNarration#3841", "GoblinFlybyNarration#23106", "HumanFlyByNarration#3840", "NightElfFlyByNarration#3800", "OrcFlyByNarration#3760", "PandarenFlybyNarration#31699", "TaurenFlyByNarration#4122", "TrollFlyByNarration#4080", "WorgenFlybyNarration#23105", "UndeadFlybyNarration#3358",})
Zn(L["Various"], L["Various"], L["Pet Battles"] , { "|cffffd800" .. L["Various"] .. ": " .. L["Pet Battles"], prefol, "MUS_50_PetBattles_01#28753", "MUS_50_PetBattles_02#28754",})
Zn(L["Various"], L["Various"], L["Themes"] , { "|cffffd800" .. L["Various"] .. ": " .. L["Themes"], prefol,
"|cffffd800", "|cffffd800" .. L["Anduin's Theme"], "MUS_70_Zone_Stormwind_PostBrokenShore_Funeral_01#75552", "MUS_70_Zone_Stormwind_LionsRest_Day#73345", "MUS_70_BrokenShore_ShipIntro#73387", "MUS_72_BrokenShore_Wyrnnfall_Intro#85166",
"|cffffd800", "|cffffd800" .. L["Jaina's Theme"], "MUS_60_Proudmoore_01#49356", "MUS_60_Proudmoore_02#49357", "MUS_60_Proudmoore_03#49358",
"|cffffd800", "|cffffd800" .. L["Tea with Jaina"], "ClientScene_51_TeaWithJaina_Music_01#34891",
"|cffffd800", "|cffffd800" .. L["Power of the Horde"], "_MUS_61_GarrisonMusicBox_24_NotUsed#49534",
"|cffffd800", "|cffffd800" .. L["Diablo Anniversary"], "MUS_71_Event_DiabloAnniversary_TristramGuitar (Everything)#78803",
})
Zn(L["Various"], L["Various"], L["Warfronts"] , { "|cffffd800" .. L["Various"] .. ": " .. L["Warfronts"], prefol,
"|cffffd800", "|cffffd800" .. L["Battle for Darkshore"], "MUS_81_Warfronts_Darkshore_Alliance_General_Walk#125670", "MUS_81_Warfronts_Darkshore_Alliance_FinalAssault#125671", "MUS_81_Warfronts_Darkshore_Horde_General_Walk#125883", "MUS_81_Warfronts_Darkshore_Horde_FinalAssault#125884",
"|cffffd800", "|cffffd800" .. L["Battle for Stromgarde"], "MUS_80_Warfronts_Arathi_Alliance_General_Walk#116361", "MUS_80_Warfront_Arathi_Horde_General_Walk#85251", "MUS_80_ArathiHighlands_PostWarfronts#120246",
})
-- Movies
Zn(L["Movies"], L["Movies"], "|cffffd800" .. L["Movies"], {""})
Zn(L["Movies"], L["Movies"], L["World of Warcraft"] , { "|cffffd800" .. L["Movies"] .. ": " .. L["World of Warcraft"], prefol, L["Ten Years of Warcraft"] .. " |r(1)", L["World of Warcraft"] .. " |r(2)"})
Zn(L["Movies"], L["Movies"], L["The Burning Crusade"] , { "|cffffd800" .. L["Movies"] .. ": " .. L["The Burning Crusade"], prefol, L["The Burning Crusade"] .. " |r(27)"})
Zn(L["Movies"], L["Movies"], L["Wrath of the Lich King"] , { "|cffffd800" .. L["Movies"] .. ": " .. L["Wrath of the Lich King"], prefol, L["Wrath of the Lich King"] .. " |r(18)", L["Battle of Angrathar the Wrathgate"] .. " |r(14)", L["Fall of the Lich King"] .. " |r(16)"})
Zn(L["Movies"], L["Movies"], L["Cataclysm"] , { "|cffffd800" .. L["Movies"] .. ": " .. L["Cataclysm"], prefol, L["Cataclysm"] .. " |r(23)", L["Last Stand"] .. " |r(21)", L["Leaving Kezan"] .. " |r(22)", L["The Dragon Soul"] .. " |r(73)", L["Spine of Deathwing"] .. " |r(74)", L["Madness of Deathwing"] .. " |r(75)", L["Fall of Deathwing"] .. " |r(76)"})
Zn(L["Movies"], L["Movies"], L["Mists of Pandaria"] , { "|cffffd800" .. L["Movies"] .. ": " .. L["Mists of Pandaria"], prefol, L["Mists of Pandaria"] .. " |r(115)", L["Risking It All"] .. " |r(117)", L["Leaving the Wandering Isle"] .. " |r(116)", L["Jade Forest Crash"] .. " |r(121)", L["The King's Command"] .. " |r(119)", L["The Art of War"] .. " |r(120)", L["Battle of Serpent's Heart"] .. " |r(118)", L["The Fleet in Krasarang (Horde)"] .. " |r(128)", L["The Fleet in Krasarang (Alliance)"] .. " |r(127)", L["Hellscream's Downfall (Horde)"] .. " |r(151)", L["Hellscream's Downfall (Alliance)"] .. " |r(152)"})
Zn(L["Movies"], L["Movies"], L["Warlords of Draenor"] , { "|cffffd800" .. L["Movies"] .. ": " .. L["Warlords of Draenor"], prefol, L["Warlords of Draenor"] .. " |r(195)", L["Darkness Falls"] .. " |r(167)", L["The Battle of Thunder Pass"] .. " |r(168)", L["And Justice for Thrall"] .. " |r(177)", L["Into the Portal"] .. " |r(185)", L["A Taste of Iron"] .. " |r(187)", L["The Battle for Shattrath"] .. " |r(188)", L["Gul'dan Ascendant"] .. " |r(270)", L["Gul'dan's Plan"] .. " |r(294)", L["Victory in Draenor!"] .. " |r(295)", L["Establish Your Garrison (Horde)"] .. " |r(189)", L["Establish Your Garrison (Alliance)"] .. " |r(192)", L["Bigger is Better (Horde)"] .. " |r(190)", L["Bigger is Better (Alliance)"] .. " |r(193)", L["My Very Own Castle (Horde)"] .. " |r(191)", L["My Very Own Castle (Alliance)"] .. " |r(194)", L["Shipyard Construction (Horde)"] .. " |r(292)", L["Shipyard Construction (Alliance)"] .. " |r(293)"})
Zn(L["Movies"], L["Movies"], L["Legion"] , { "|cffffd800" .. L["Movies"] .. ": " .. L["Legion"], prefol, L["Legion"] .. " |r(470)", L["The Invasion Begins"] .. " |r(469)", L["Return to the Black Temple"] .. " |r(471)", L["The Demon's Trail"] .. " |r(473)", L["The Fate of Val'sharah"] .. " |r(472)", L["Fate of the Horde"] .. " |r(474)", L["A New Life for Undeath"] .. " |r(475)", L["Harbingers Gul'dan"] .. " |r(476)", L["Harbingers Khadgar"] .. " |r(477)", L["Harbingers Illidan"] .. " |r(478)", L["The Nightborne Pact"] .. " |r(485)", L["Stormheim (Alliance)"] .. " |r(483)", L["Stormheim (Horde)"] .. " |r(484)", L["Tomb of Sargeras"] .. " |r(486)", L["The Battle for Broken Shore"] .. " |r(487)", L["A Falling Star"] .. " |r(489)", L["Destiny Unfulfilled"] .. " |r(490)", L["The Nighthold"] .. " |r(549)", L["Victory at The Nighthold"] .. " |r(635)", L["A Found Memento"] .. " |r(636)", L["Assault on the Broken Shore"] .. " |r(637)", L["Kil'jaeden's Downfall"] .. " |r(656)", L["Arrival on Argus"] .. " |r(677)", L["Rejection of the Gift"] .. " |r(679)", L["Reincarnation of Alleria Windrunner"] .. " |r(682)", L["Rise of Argus"] .. " |r(687)", L["Antorus Ending"] .. " |r(689)", L["Epilogue (Horde)"] .. " |r(717)", L["Epilogue (Alliance)"] .. " |r(716)"})
Zn(L["Movies"], L["Movies"], L["Battle for Azeroth"] , { "|cffffd800" .. L["Movies"] .. ": " .. L["Battle for Azeroth"], prefol,
L["Battle for Azeroth"] .. " |r(852)",
L["Warbringers Sylvanas"] .. " |r(853)",
L["The Fall of Lordaeron"] .. " |r(855)",
L["Jaina Joins the Battle"] .. " |r(856)",
L["Embers of War"] .. " |r(854)",
L["Arrival to Zandalar"] .. " |r(857)",
L["Vision of Sailor's Memory"] .. " |r(858)",
L["Jaina Returns to Kul Tiras"] .. " |r(859)",
L["Jaina's Nightmare"] .. " |r(860)",
L["Warbringers Jaina"] .. " |r(861)",
L["A Deal with Death"] .. " |r(862)",
L["The Threat Within"] .. " |r(863)",
L["The Return of Hope"] .. " |r(864)",
L["Realm Of Torment"] .. " |r(865)",
L["Terror of Darkshore"] .. " |r(874)",
L["An Unexpected Reunion"] .. " |r(879)",
L["Siege of Dazar'alor"] .. " |r(876)",
L["Battle of Dazar'alor"] .. " |r(875)",
L["Warbringers Azshara"] .. " |r(884)",
L["Rise of Azshara (Horde)"] .. " |r(894)",
L["Rise of Azshara (Alliance)"] .. " |r(883)",
L["The Negotiation"] .. " |r(903)",
-- L["Reckoning"] .. " |r(904)",
L["Azshara's Eternal Palace"] .. " |r(920)",
L["Wrathion's Scene"] .. " |r(927)",
L["Visions of N'Zoth"] .. " |r(928)",
})
Zn(L["Movies"], L["Movies"], L["Shadowlands"] , { "|cffffd800" .. L["Movies"] .. ": " .. L["Shadowlands"], prefol,
L["Shadowlands"] .. " |r(936)",
L["Afterlives Ardenweald"] .. " |r(935)",
L["Afterlives Bastion"] .. " |r(932)",
L["Afterlives Maldraxxus"] .. " |r(934)",
L["Afterlives Revendreth"] .. " |r(933)",
L["Exile's Reach (Horde)"] .. " |r(931)",
L["Exile's Reach (Alliance)"] .. " |r(895)",
L["Dark Abduction"] .. " |r(937)",
L["For Teldrassil"] .. " |r(942)",
L["Beyond The Veil"] .. " |r(943)",
L["Remember This Lesson"] .. " |r(944)",
L["Breaking The Arbiter"] .. " |r(945)",
L["A Glimpse Into Darkness"] .. " |r(946)",
L["No More Lies"] .. " |r(947)",
L["Sylvanas' Choice"] .. " |r(948)",
L["Kingsmourne"] .. " |r(949)",
L["Ysera Reborn"] .. " |r(941)",
L["Battle For Ardenweald"] .. " |r(951)",
})
-- Give zone table a file level scope so slash command function can access it
LeaPlusLC["ZoneList"] = 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+", " ")))
RunScript('LeaPlusGlobalHash = {}')
local hash = LeaPlusGlobalHash
local trackCount = 0
for i, e in pairs(LeaPlusLC.ZoneList) do
if LeaPlusLC.ZoneList[e] then
for a, b in pairs(LeaPlusLC.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()
MovieFrame_PlayMovie(MovieFrame, movieID)
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)
----------------------------------------------------------------------
-- Options panel
----------------------------------------------------------------------
-- Hide Leatrix Plus if game options panel is shown
InterfaceOptionsFrame:HookScript("OnShow", LeaPlusLC.HideFrames);
VideoOptionsFrame:HookScript("OnShow", LeaPlusLC.HideFrames);
----------------------------------------------------------------------
-- 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 and guild members", 16, -92, false, "If checked, group invites will only be sent to friends and guild members.|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, "curseforge.com/wow/addons/leatrix-plus", 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)
InterfaceOptions_AddCategory(interPanel)
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
if LeaPlusLC:FriendCheck(arg2) 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
----------------------------------------------------------------------
-- Automatically accept resurrection requests
----------------------------------------------------------------------
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) then
AcceptResurrect()
StaticPopup_Hide("RESURRECT_NO_TIMER")
end
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
if (LeaPlusLC["AcceptPartyFriends"] == "On" and LeaPlusLC:FriendCheck(arg1)) 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) 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
----------------------------------------------------------------------
-- Automatically release in battlegrounds
----------------------------------------------------------------------
if event == "PLAYER_DEAD" then
-- 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
RepopMe()
return
end
-- Resurrect if playuer is in a PvP location
local areaID = C_Map.GetBestMapForUnit("player") or 0
if areaID == 123 -- Wintergrasp
or areaID == 244 -- Tol Barad (PvP)
or areaID == 588 -- Ashran
or areaID == 622 -- Stormshield
or areaID == 624 -- Warspear
then
RepopMe()
return
end
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("MuteHorned", "MuteUnicorns") -- 9.0.22 (27th March 2021)
UpdateVars("MuteCreeper", "MuteSoulseekers") -- 9.0.22 (27th March 2021)
UpdateVars("MuteATV", "MuteHovercraft") -- 9.0.22 (27th March 2021)
UpdateVars("MuteR21X", "MuteAerials") -- 9.0.22 (27th March 2021)
UpdateVars("MuteGolem", "MuteMechsuits") -- 9.0.22 (27th March 2021)
-- Automation
LeaPlusLC:LoadVarChk("AutomateQuests", "Off") -- Automate quests
LeaPlusLC:LoadVarChk("AutoQuestShift", "Off") -- Automate quests requires shift
LeaPlusLC:LoadVarChk("AutoQuestAvailable", "On") -- Accept available quests
LeaPlusLC:LoadVarChk("AutoQuestCompleted", "On") -- Turn-in completed quests
LeaPlusLC:LoadVarChk("AutoQuestNoDaily", "Off") -- Don't accept daily quests
LeaPlusLC:LoadVarChk("AutoQuestNoWeekly", "Off") -- Don't accept weekly quests
LeaPlusLC:LoadVarChk("AutomateGossip", "Off") -- Automate gossip
LeaPlusLC:LoadVarChk("AutoAcceptSummon", "Off") -- Accept summon
LeaPlusLC:LoadVarChk("AutoAcceptRes", "Off") -- Accept resurrection
LeaPlusLC:LoadVarChk("AutoReleasePvP", "Off") -- Release in PvP
LeaPlusLC:LoadVarChk("AutoSellJunk", "Off") -- Sell junk automatically
LeaPlusLC:LoadVarChk("AutoRepairGear", "Off") -- Repair automatically
LeaPlusLC:LoadVarChk("AutoRepairGuildFunds", "On") -- Repair using guild funds
-- 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("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
-- 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("NoStickyChat", "Off") -- Disable sticky chat
LeaPlusLC:LoadVarChk("NoStickyEditbox", "Off") -- Disable sticky editbox
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
-- Text
LeaPlusLC:LoadVarChk("HideErrorMessages", "Off") -- Hide error messages
LeaPlusLC:LoadVarChk("NoHitIndicators", "Off") -- Hide portrait text
LeaPlusLC:LoadVarChk("HideZoneText", "Off") -- Hide zone text
LeaPlusLC:LoadVarChk("MailFontChange", "Off") -- Resize mail text
LeaPlusLC:LoadVarNum("LeaPlusMailFontSize", 15, 10, 36) -- Mail text slider
LeaPlusLC:LoadVarChk("QuestFontChange", "Off") -- Resize quest text
LeaPlusLC:LoadVarNum("LeaPlusQuestFontSize", 12, 10, 36) -- Quest text slider
-- Interface
LeaPlusLC:LoadVarChk("MinimapMod", "Off") -- Enhance minimap
LeaPlusLC:LoadVarChk("HideZoneTextBar", "Off") -- Hide zone text bar
LeaPlusLC:LoadVarChk("HideMiniZoomBtns", "Off") -- Hide zoom buttons
LeaPlusLC:LoadVarChk("HideMiniClock", "Off") -- Hide the clock
LeaPlusLC:LoadVarNum("MinimapScale", 1, 1, 2) -- Minimap scale slider
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("TipBackSimple", "Off") -- Color backdrops
LeaPlusLC:LoadVarChk("TipHideInCombat", "Off") -- Hide tooltips during combat
LeaPlusLC:LoadVarNum("LeaPlusTipSize", 1.00, 0.50, 2.00) -- Tooltip scale slider
LeaPlusLC:LoadVarNum("TipOffsetX", -13, -5000, 5000) -- Tooltip X offset
LeaPlusLC:LoadVarNum("TipOffsetY", 94, -5000, 5000) -- Tooltip Y offset
LeaPlusLC:LoadVarNum("TooltipAnchorMenu", 1, 1, 5) -- 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("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("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", 2, 1, 3) -- Player chain dropdown value
LeaPlusLC:LoadVarChk("ShowWowheadLinks", "Off") -- Show Wowhead links
-- Frames
LeaPlusLC:LoadVarChk("FrmEnabled", "Off") -- Manage frames
LeaPlusLC:LoadVarChk("ManageBuffs", "Off") -- Manage buffs
LeaPlusLC:LoadVarAnc("BuffFrameA", "TOPRIGHT") -- Manage buffs anchor
LeaPlusLC:LoadVarAnc("BuffFrameR", "TOPRIGHT") -- Manage buffs relative
LeaPlusLC:LoadVarNum("BuffFrameX", -205, -5000, 5000) -- Manage buffs position X
LeaPlusLC:LoadVarNum("BuffFrameY", -13, -5000, 5000) -- Manage buffs position Y
LeaPlusLC:LoadVarNum("BuffFrameScale", 1, 0.5, 2) -- Manage buffs scale
LeaPlusLC:LoadVarChk("ManagePowerBar", "Off") -- Manage power bar
LeaPlusLC:LoadVarAnc("PowerBarA", "BOTTOM") -- Manage power bar anchor
LeaPlusLC:LoadVarAnc("PowerBarR", "BOTTOM") -- Manage power bar relative
LeaPlusLC:LoadVarNum("PowerBarX", 0, -5000, 5000) -- Manage power bar position X
LeaPlusLC:LoadVarNum("PowerBarY", 115, -5000, 5000) -- Manage power bar position Y
LeaPlusLC:LoadVarNum("PowerBarScale", 1, 0.5, 2) -- Manage power bar scale
LeaPlusLC:LoadVarChk("ManageWidget", "Off") -- Manage widget
LeaPlusLC:LoadVarAnc("WidgetA", "TOP") -- Manage widget anchor
LeaPlusLC:LoadVarAnc("WidgetR", "TOP") -- Manage widget relative
LeaPlusLC:LoadVarNum("WidgetX", 0, -5000, 5000) -- Manage widget position X
LeaPlusLC:LoadVarNum("WidgetY", -15, -5000, 5000) -- Manage widget position Y
LeaPlusLC:LoadVarNum("WidgetScale", 1, 0.5, 2) -- Manage widget scale
LeaPlusLC:LoadVarChk("ManageFocus", "Off") -- Manage focus
LeaPlusLC:LoadVarAnc("FocusA", "CENTER") -- Manage focus anchor
LeaPlusLC:LoadVarAnc("FocusR", "CENTER") -- Manage focus relative
LeaPlusLC:LoadVarNum("FocusX", 0, -5000, 5000) -- Manage focus position X
LeaPlusLC:LoadVarNum("FocusY", 0, -5000, 5000) -- Manage focus position Y
LeaPlusLC:LoadVarNum("FocusScale", 1, 0.5, 2) -- Manage focus 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("HideLevelUpDisplay", "Off") -- Hide level-up display
LeaPlusLC:LoadVarChk("NoGryphons", "Off") -- Hide gryphons
LeaPlusLC:LoadVarChk("NoClassBar", "Off") -- Hide stance bar
LeaPlusLC:LoadVarChk("NoCommandBar", "Off") -- Hide order hall bar
-- 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("NoBagAutomation", "Off") -- Disable bag automation
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("SaveProfFilters", "Off") -- Save profession filters
LeaPlusLC:LoadVarChk("FasterLooting", "Off") -- Faster auto loot
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
-- Settings
LeaPlusLC:LoadVarChk("ShowMinimapIcon", "On") -- Show minimap button
LeaPlusLC:LoadVarChk("EnableHotkey", "Off") -- Enable hotkey
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"])
-- 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["AutoQuestAvailable"] = LeaPlusLC["AutoQuestAvailable"]
LeaPlusDB["AutoQuestCompleted"] = LeaPlusLC["AutoQuestCompleted"]
LeaPlusDB["AutoQuestNoDaily"] = LeaPlusLC["AutoQuestNoDaily"]
LeaPlusDB["AutoQuestNoWeekly"] = LeaPlusLC["AutoQuestNoWeekly"]
LeaPlusDB["AutomateGossip"] = LeaPlusLC["AutomateGossip"]
LeaPlusDB["AutoAcceptSummon"] = LeaPlusLC["AutoAcceptSummon"]
LeaPlusDB["AutoAcceptRes"] = LeaPlusLC["AutoAcceptRes"]
LeaPlusDB["AutoReleasePvP"] = LeaPlusLC["AutoReleasePvP"]
LeaPlusDB["AutoSellJunk"] = LeaPlusLC["AutoSellJunk"]
LeaPlusDB["AutoRepairGear"] = LeaPlusLC["AutoRepairGear"]
LeaPlusDB["AutoRepairGuildFunds"] = LeaPlusLC["AutoRepairGuildFunds"]
-- Social
LeaPlusDB["NoDuelRequests"] = LeaPlusLC["NoDuelRequests"]
LeaPlusDB["NoPetDuels"] = LeaPlusLC["NoPetDuels"]
LeaPlusDB["NoPartyInvites"] = LeaPlusLC["NoPartyInvites"]
LeaPlusDB["NoFriendRequests"] = LeaPlusLC["NoFriendRequests"]
LeaPlusDB["AcceptPartyFriends"] = LeaPlusLC["AcceptPartyFriends"]
LeaPlusDB["SyncFromFriends"] = LeaPlusLC["SyncFromFriends"]
LeaPlusDB["AutoConfirmRole"] = LeaPlusLC["AutoConfirmRole"]
LeaPlusDB["InviteFromWhisper"] = LeaPlusLC["InviteFromWhisper"]
LeaPlusDB["InviteFriendsOnly"] = LeaPlusLC["InviteFriendsOnly"]
LeaPlusDB["InvKey"] = LeaPlusLC["InvKey"]
-- 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["NoStickyChat"] = LeaPlusLC["NoStickyChat"]
LeaPlusDB["NoStickyEditbox"] = LeaPlusLC["NoStickyEditbox"]
LeaPlusDB["UseArrowKeysInChat"] = LeaPlusLC["UseArrowKeysInChat"]
LeaPlusDB["NoChatFade"] = LeaPlusLC["NoChatFade"]
LeaPlusDB["UnivGroupColor"] = LeaPlusLC["UnivGroupColor"]
LeaPlusDB["RecentChatWindow"] = LeaPlusLC["RecentChatWindow"]
LeaPlusDB["RecentChatSize"] = LeaPlusLC["RecentChatSize"]
LeaPlusDB["MaxChatHstory"] = LeaPlusLC["MaxChatHstory"]
-- Text
LeaPlusDB["HideErrorMessages"] = LeaPlusLC["HideErrorMessages"]
LeaPlusDB["NoHitIndicators"] = LeaPlusLC["NoHitIndicators"]
LeaPlusDB["HideZoneText"] = LeaPlusLC["HideZoneText"]
LeaPlusDB["MailFontChange"] = LeaPlusLC["MailFontChange"]
LeaPlusDB["LeaPlusMailFontSize"] = LeaPlusLC["LeaPlusMailFontSize"]
LeaPlusDB["QuestFontChange"] = LeaPlusLC["QuestFontChange"]
LeaPlusDB["LeaPlusQuestFontSize"] = LeaPlusLC["LeaPlusQuestFontSize"]
-- Interface
LeaPlusDB["MinimapMod"] = LeaPlusLC["MinimapMod"]
LeaPlusDB["HideZoneTextBar"] = LeaPlusLC["HideZoneTextBar"]
LeaPlusDB["HideMiniZoomBtns"] = LeaPlusLC["HideMiniZoomBtns"]
LeaPlusDB["HideMiniClock"] = LeaPlusLC["HideMiniClock"]
LeaPlusDB["MinimapScale"] = LeaPlusLC["MinimapScale"]
LeaPlusDB["TipModEnable"] = LeaPlusLC["TipModEnable"]
LeaPlusDB["TipShowRank"] = LeaPlusLC["TipShowRank"]
LeaPlusDB["TipShowOtherRank"] = LeaPlusLC["TipShowOtherRank"]
LeaPlusDB["TipShowTarget"] = LeaPlusLC["TipShowTarget"]
LeaPlusDB["TipBackSimple"] = LeaPlusLC["TipBackSimple"]
LeaPlusDB["TipHideInCombat"] = LeaPlusLC["TipHideInCombat"]
LeaPlusDB["LeaPlusTipSize"] = LeaPlusLC["LeaPlusTipSize"]
LeaPlusDB["TipOffsetX"] = LeaPlusLC["TipOffsetX"]
LeaPlusDB["TipOffsetY"] = LeaPlusLC["TipOffsetY"]
LeaPlusDB["TooltipAnchorMenu"] = LeaPlusLC["TooltipAnchorMenu"]
LeaPlusDB["TipCursorX"] = LeaPlusLC["TipCursorX"]
LeaPlusDB["TipCursorY"] = LeaPlusLC["TipCursorY"]
LeaPlusDB["EnhanceDressup"] = LeaPlusLC["EnhanceDressup"]
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["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["ShowWowheadLinks"] = LeaPlusLC["ShowWowheadLinks"]
-- Frames
LeaPlusDB["FrmEnabled"] = LeaPlusLC["FrmEnabled"]
LeaPlusDB["ManageBuffs"] = LeaPlusLC["ManageBuffs"]
LeaPlusDB["BuffFrameA"] = LeaPlusLC["BuffFrameA"]
LeaPlusDB["BuffFrameR"] = LeaPlusLC["BuffFrameR"]
LeaPlusDB["BuffFrameX"] = LeaPlusLC["BuffFrameX"]
LeaPlusDB["BuffFrameY"] = LeaPlusLC["BuffFrameY"]
LeaPlusDB["BuffFrameScale"] = LeaPlusLC["BuffFrameScale"]
LeaPlusDB["ManagePowerBar"] = LeaPlusLC["ManagePowerBar"]
LeaPlusDB["PowerBarA"] = LeaPlusLC["PowerBarA"]
LeaPlusDB["PowerBarR"] = LeaPlusLC["PowerBarR"]
LeaPlusDB["PowerBarX"] = LeaPlusLC["PowerBarX"]
LeaPlusDB["PowerBarY"] = LeaPlusLC["PowerBarY"]
LeaPlusDB["PowerBarScale"] = LeaPlusLC["PowerBarScale"]
LeaPlusDB["ManageWidget"] = LeaPlusLC["ManageWidget"]
LeaPlusDB["WidgetA"] = LeaPlusLC["WidgetA"]
LeaPlusDB["WidgetR"] = LeaPlusLC["WidgetR"]
LeaPlusDB["WidgetX"] = LeaPlusLC["WidgetX"]
LeaPlusDB["WidgetY"] = LeaPlusLC["WidgetY"]
LeaPlusDB["WidgetScale"] = LeaPlusLC["WidgetScale"]
LeaPlusDB["ManageFocus"] = LeaPlusLC["ManageFocus"]
LeaPlusDB["FocusA"] = LeaPlusLC["FocusA"]
LeaPlusDB["FocusR"] = LeaPlusLC["FocusR"]
LeaPlusDB["FocusX"] = LeaPlusLC["FocusX"]
LeaPlusDB["FocusY"] = LeaPlusLC["FocusY"]
LeaPlusDB["FocusScale"] = LeaPlusLC["FocusScale"]
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["HideLevelUpDisplay"] = LeaPlusLC["HideLevelUpDisplay"]
LeaPlusDB["NoGryphons"] = LeaPlusLC["NoGryphons"]
LeaPlusDB["NoClassBar"] = LeaPlusLC["NoClassBar"]
LeaPlusDB["NoCommandBar"] = LeaPlusLC["NoCommandBar"]
-- 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["NoBagAutomation"] = LeaPlusLC["NoBagAutomation"]
LeaPlusDB["NoPetAutomation"] = LeaPlusLC["NoPetAutomation"]
LeaPlusDB["CharAddonList"] = LeaPlusLC["CharAddonList"]
LeaPlusDB["NoRaidRestrictions"] = LeaPlusLC["NoRaidRestrictions"]
LeaPlusDB["NoConfirmLoot"] = LeaPlusLC["NoConfirmLoot"]
LeaPlusDB["SaveProfFilters"] = LeaPlusLC["SaveProfFilters"]
LeaPlusDB["FasterLooting"] = LeaPlusLC["FasterLooting"]
LeaPlusDB["FasterMovieSkip"] = LeaPlusLC["FasterMovieSkip"]
LeaPlusDB["CombatPlates"] = LeaPlusLC["CombatPlates"]
LeaPlusDB["EasyItemDestroy"] = LeaPlusLC["EasyItemDestroy"]
LeaPlusDB["LockoutSharing"] = LeaPlusLC["LockoutSharing"]
-- Settings
LeaPlusDB["ShowMinimapIcon"] = LeaPlusLC["ShowMinimapIcon"]
LeaPlusDB["EnableHotkey"] = LeaPlusLC["EnableHotkey"]
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
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")
-- 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
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
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 = CreateFrame("Button", nil, Side, "UIPanelCloseButton")
Side.c:SetSize(30, 30)
Side.c:SetPoint("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)
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
mbtn:SetNormalTexture("Interface\\AddOns\\Leatrix_Plus\\Leatrix_Plus.blp")
mbtn:GetNormalTexture():SetTexCoord(0.5, 1, 0, 1)
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);
-- 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);
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);
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);
-- 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")
dd:SetScript("OnShow", function() value:SetText(LeaPlusLC[ddname.."Table"][LeaPlusLC[ddname]]) end)
-- 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.ShowTooltip);
dbtn:SetScript("OnLeave", GameTooltip_Hide)
-- 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 * 17) + 17 + 17)
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);
-- 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(20)
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.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
local CloseB = CreateFrame("Button", nil, PageF, "UIPanelCloseButton")
CloseB:SetSize(30, 30)
CloseB:SetPoint("TOPRIGHT", 0, 0)
CloseB:SetScript("OnClick", LeaPlusLC.HideFrames)
-- 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
for k = 1, 10 do
BuyMerchantItem(5)
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 == "id" 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 == "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 == "SPELL_UPDATE_COOLDOWN"
or event == "SPELL_UPDATE_USABLE"
or event == "UNIT_POWER_FREQUENT"
or event == "UPDATE_INVENTORY_DURABILITY"
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"))
-- 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
-- Create grid for first use
if not LeaPlusLC.grid then
LeaPlusLC.grid = CreateFrame('FRAME')
LeaPlusLC.grid:Hide()
LeaPlusLC.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', LeaPlusLC.grid, 'TOPLEFT', i * w / wline - 1, 0)
t:SetPoint('BOTTOMRIGHT', LeaPlusLC.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', LeaPlusLC.grid, 'TOPLEFT', 0, -i * h / hline + 1)
t:SetPoint('BOTTOMRIGHT', LeaPlusLC.grid, 'TOPRIGHT', 0, -i * h / hline - 1)
end
end
-- Show or hide 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 == "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(LeaPlusLC.ZoneList) do
if LeaPlusLC.ZoneList[e] then
for a, b in pairs(LeaPlusLC.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 == "af" then
-- Automatically follow player target using ticker
if LeaPlusLC.followTick then
-- Existing ticker is active so cancel it
LeaPlusLC.followTick:Cancel()
LeaPlusLC.followTick = nil
FollowUnit("player")
LeaPlusLC:Print("AutoFollow disabled.")
else
-- No ticker is active so create one
local targetName, targetRealm = UnitName("target")
if not targetName or not UnitIsPlayer("target") or UnitIsUnit("player", "target") then
LeaPlusLC:Print("Invalid target.")
return
end
if targetRealm then targetName = targetName .. "-" .. targetRealm end
if LeaPlusLC.followTick then
LeaPlusLC.followTick:Cancel()
end
FollowUnit(targetName, true)
LeaPlusLC.followTick = C_Timer.NewTicker(1, function()
FollowUnit(targetName, true)
end)
LeaPlusLC:Print(L["AutoFollow"] .. ": |cffffffff" .. targetName .. "|r.")
end
return
elseif str == "exit" then
-- Exit a vehicle
VehicleExit()
return
elseif str == "mapid" 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 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 .. ']] {{' .. pX .. ', ' .. pY .. ', L[' .. '"Name"' .. '], L[' .. '"' .. dnType .. '"' .. '], ' .. dnTex .. '},},')
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 == "mk" then
-- Print a map key
if not arg1 then LeaPlusLC:Print("Key missing!") return end
if not tonumber(arg1) then LeaPlusLC:Print("Must be a number!") return end
local key = arg1
ChatFrame1:Clear()
print('"' .. mod(floor(key / 2^36), 2^12) .. ":" .. mod(floor(key / 2^24), 2^12) .. ":" .. mod(floor(key / 2^12), 2^12) .. ":" .. mod(key, 2^12) .. '"')
return
elseif str == "map" then
-- Set map by ID
if not arg1 or not tonumber(arg1) or not C_Map.GetMapInfo(arg1) then
LeaPlusLC:Print("Invalid map ID.")
else
WorldMapFrame:SetMapID(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 == "fon" then
-- Activate addon message parsing for AutoFollow
if C_ChatInfo.IsAddonMessagePrefixRegistered("Leatrix_Plus") then return end
C_ChatInfo.RegisterAddonMessagePrefix("Leatrix_Plus")
local fEvent = LeaPlusLC.FollowEvent or CreateFrame("FRAME")
fEvent:RegisterEvent("CHAT_MSG_ADDON")
fEvent:SetScript("OnEvent", function(self, event, arg1, message, void, sender)
if arg1 == "Leatrix_Plus" then
if message == "followme" then
sender = strsplit("-", sender, 2)
if not CheckInteractDistance(sender, 4) then
-- Sender is out of range
C_ChatInfo.SendAddonMessage("Leatrix_Plus", "outofrange", "WHISPER", sender)
return
end
if LeaPlusLC.AddonFollowTick then
-- Sender is already following so stop following
C_ChatInfo.SendAddonMessage("Leatrix_Plus", "stopfollowing", "WHISPER", sender)
LeaPlusLC.AddonFollowTick:Cancel()
LeaPlusLC.AddonFollowTick = nil
FollowUnit("player")
return
else
-- Sender is not already following so start following
C_ChatInfo.SendAddonMessage("Leatrix_Plus", "following", "WHISPER", sender)
FollowUnit(sender, true)
LeaPlusLC.AddonFollowTick = C_Timer.NewTicker(1, function()
FollowUnit(sender, true)
end)
return
end
elseif message == "following" then
LeaPlusLC:Print(sender .. " is following you.")
elseif message == "stopfollowing" then
LeaPlusLC:Print(sender .. " is no longer following you.")
elseif message == "outofrange" then
LeaPlusLC:Print(sender .. " is out of range.")
end
end
end)
LeaPlusLC:Print("Listening mode activated.")
return
elseif str == "fme" then
-- Addon message follow command
if not C_ChatInfo.IsAddonMessagePrefixRegistered("Leatrix_Plus") then
LeaPlusLC:Print("Listening mode is not activated.")
return
end
if not arg1 then
LeaPlusLC:Print("Invalid target.")
elseif not UnitInParty(arg1) and not UnitInRaid(arg1) then
LeaPlusLC:Print("Not in your party or raid.")
else
C_ChatInfo.SendAddonMessage("Leatrix_Plus", "followme", "WHISPER", arg1)
end
return
elseif str == "fmestop" then
-- Stop following
if LeaPlusLC.AddonFollowTick then
LeaPlusLC.AddonFollowTick:Cancel()
LeaPlusLC.AddonFollowTick = nil
FollowUnit("player")
LeaPlusLC:Print("You have stopped following.")
return
else
LeaPlusLC:Print("Nobody has commanded you to follow them.")
end
return
elseif str == "fonhelp" then
-- Show fon help
LeaPlusLC:Print("Both players need to enter /ltp fon to activate listening mode.")
LeaPlusLC:Print("To command a listening player to follow you, enter /ltp fme <char name>. The character needs to be in your party or raid. Enter the same command again to command the player to stop following you.")
LeaPlusLC:Print("To stop following a player who has commanded you to follow them, enter /ltp fmestop.")
LeaPlusLC:Print("To disable listening mode, reload your UI with /reload.")
LeaPlusLC:Print("Don't follow each other at the same time or you might crash your game client.")
return
elseif str == "deletelooms" then
-- Delete heirlooms from bags
for bag = 0, 4 do
for slot = 1, GetContainerNumSlots(bag) do
local name = 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 = CreateFrame("Button", nil, frame, "UIPanelCloseButton"); frame.close:SetSize(30, 30); frame.close:SetPoint("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 the unit ID of the currently targeted NPC.", 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, " " .. string.format("%.0f", pos.x * 100) .. ":" .. string.format("%.0f", pos.y * 100)) .. " " .. myPin .. " " .. L["by Leatrix Plus"], "CHANNEL", nil, index)
-- SendChatMessage(format("%%t " .. unitTag .. "(%d%%)%s", uHealth / uHealthMax * 100, " " .. string.format("%.0f", pos.x * 100) .. ":" .. string.format("%.0f", pos.y * 100)) .. " " .. myPin .. " " .. L["by Leatrix Plus"], "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
local origCampMsg = _G.IDLE_MESSAGE
if not LeaPlusLC.NoCampFrame then
local frame = CreateFrame("FRAME", nil, UIParent)
LeaPlusLC.NoCampFrame = frame
end
if LeaPlusLC.NoCampFrame:IsEventRegistered("PLAYER_CAMPING") then
LeaPlusLC.NoCampFrame:UnregisterEvent("PLAYER_CAMPING")
_G.IDLE_MESSAGE = origCampMsg
LeaPlusLC:Print("Camping enabled. You will camp.")
else
LeaPlusLC.NoCampFrame:RegisterEvent("PLAYER_CAMPING")
_G.IDLE_MESSAGE = nil
LeaPlusLC:Print("Camping disabled. You won't camp.")
end
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 == "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["AutoQuestAvailable"] = "On" -- Accept available quests
LeaPlusDB["AutoQuestCompleted"] = "On" -- Turn-in completed quests
LeaPlusDB["AutoQuestNoDaily"] = "Off" -- Don't accept daily quests
LeaPlusDB["AutoQuestNoWeekly"] = "Off" -- Don't accept weekly quests
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["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["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
-- 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["NoStickyChat"] = "On" -- Disable sticky chat
LeaPlusDB["NoStickyEditbox"] = "On" -- Disable sticky editbox
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
-- Text
LeaPlusDB["HideErrorMessages"] = "On" -- Hide error messages
LeaPlusDB["NoHitIndicators"] = "On" -- Hide portrait 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["MinimapMod"] = "On" -- Enhance minimap
LeaPlusDB["HideZoneTextBar"] = "On" -- Hide zone text bar
LeaPlusDB["MinimapScale"] = 1.30 -- Minimap scale slider
LeaPlusDB["TipModEnable"] = "On" -- Enhance tooltip
LeaPlusDB["TipBackSimple"] = "On" -- Color backdrops
LeaPlusDB["LeaPlusTipSize"] = 1.25 -- Tooltip scale slider
LeaPlusDB["TooltipAnchorMenu"] = 2 -- Tooltip anchor
LeaPlusDB["TipCursorX"] = 0 -- X offset
LeaPlusDB["TipCursorY"] = 0 -- Y offset
LeaPlusDB["EnhanceDressup"] = "On" -- Enhance dressup
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["ShowBorders"] = "On" -- Show borders
LeaPlusDB["ShowPlayerChain"] = "On" -- Show player chain
LeaPlusDB["PlayerChainMenu"] = 3 -- Player chain style
LeaPlusDB["ShowWowheadLinks"] = "On" -- Show Wowhead links
-- Interface: Manage frames
LeaPlusDB["FrmEnabled"] = "On"
LeaPlusDB["Frames"] = {}
LeaPlusDB["Frames"]["PlayerFrame"] = {}
LeaPlusDB["Frames"]["PlayerFrame"]["Point"] = "TOPLEFT"
LeaPlusDB["Frames"]["PlayerFrame"]["Relative"] = "TOPLEFT"
LeaPlusDB["Frames"]["PlayerFrame"]["XOffset"] = -35
LeaPlusDB["Frames"]["PlayerFrame"]["YOffset"] = -14
LeaPlusDB["Frames"]["PlayerFrame"]["Scale"] = 1.20
LeaPlusDB["Frames"]["TargetFrame"] = {}
LeaPlusDB["Frames"]["TargetFrame"]["Point"] = "TOPLEFT"
LeaPlusDB["Frames"]["TargetFrame"]["Relative"] = "TOPLEFT"
LeaPlusDB["Frames"]["TargetFrame"]["XOffset"] = 190
LeaPlusDB["Frames"]["TargetFrame"]["YOffset"] = -14
LeaPlusDB["Frames"]["TargetFrame"]["Scale"] = 1.20
LeaPlusDB["Frames"]["GhostFrame"] = {}
LeaPlusDB["Frames"]["GhostFrame"]["Point"] = "CENTER"
LeaPlusDB["Frames"]["GhostFrame"]["Relative"] = "CENTER"
LeaPlusDB["Frames"]["GhostFrame"]["XOffset"] = 3
LeaPlusDB["Frames"]["GhostFrame"]["YOffset"] = -142
LeaPlusDB["Frames"]["MirrorTimer1"] = {}
LeaPlusDB["Frames"]["MirrorTimer1"]["Point"] = "TOP"
LeaPlusDB["Frames"]["MirrorTimer1"]["Relative"] = "TOP"
LeaPlusDB["Frames"]["MirrorTimer1"]["XOffset"] = 0
LeaPlusDB["Frames"]["MirrorTimer1"]["YOffset"] = -120
LeaPlusDB["ManageBuffs"] = "On" -- Manage buffs
LeaPlusDB["BuffFrameA"] = "TOPRIGHT" -- Manage buffs anchor
LeaPlusDB["BuffFrameR"] = "TOPRIGHT" -- Manage buffs relative
LeaPlusDB["BuffFrameX"] = -271 -- Manage buffs position X
LeaPlusDB["BuffFrameY"] = 0 -- Manage buffs position Y
LeaPlusDB["BuffFrameScale"] = 0.8 -- Manage buffs scale
LeaPlusDB["ManagePowerBar"] = "On" -- Manage power bar
LeaPlusDB["PowerBarA"] = "CENTER" -- Manage power bar anchor
LeaPlusDB["PowerBarR"] = "CENTER" -- Manage power bar relative
LeaPlusDB["PowerBarX"] = 0 -- Manage power bar position X
LeaPlusDB["PowerBarY"] = -160 -- Manage power bar position Y
LeaPlusDB["PowerBarScale"] = 1.25 -- Manage power bar scale
LeaPlusDB["ManageWidget"] = "On" -- Manage widget
LeaPlusDB["WidgetA"] = "TOP" -- Manage widget anchor
LeaPlusDB["WidgetR"] = "TOP" -- Manage widget relative
LeaPlusDB["WidgetX"] = 0 -- Manage widget position X
LeaPlusDB["WidgetY"] = -432 -- Manage widget position Y
LeaPlusDB["WidgetScale"] = 1.25 -- Manage widget scale
LeaPlusDB["ManageFocus"] = "On" -- Manage focus
LeaPlusDB["FocusA"] = "TOPLEFT" -- Manage focus anchor
LeaPlusDB["FocusR"] = "TOPLEFT" -- Manage focus relative
LeaPlusDB["FocusX"] = 250 -- Manage focus position X
LeaPlusDB["FocusY"] = -240 -- Manage focus position Y
LeaPlusDB["FocusScale"] = 1.00 -- Manage focus 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["HideLevelUpDisplay"] = "On" -- Hide level-up display
LeaPlusDB["NoGryphons"] = "On" -- Hide gryphons
LeaPlusDB["NoClassBar"] = "On" -- Hide stance bar
LeaPlusDB["NoCommandBar"] = "On" -- Hide order hall bar
-- 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["NoBagAutomation"] = "On" -- Disable bag automation
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["SaveProfFilters"] = "On" -- Save profession filters
LeaPlusDB["FasterLooting"] = "On" -- Faster auto loot
LeaPlusDB["FasterMovieSkip"] = "On" -- Faster movie skip
LeaPlusDB["CombatPlates"] = "On" -- Combat plates
LeaPlusDB["EasyItemDestroy"] = "On" -- Easy item destroy
LeaPlusDB["LockoutSharing"] = "On" -- Lockout sharing
-- Settings
LeaPlusDB["EnableHotkey"] = "On" -- Enable hotkey
-- 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
-- Reload
ReloadUI()
else
LeaPlusLC:Print("Invalid parameter.")
end
return
else
-- Prevent options panel from showing if a game options panel is showing
if InterfaceOptionsFrame:IsShown() or VideoOptionsFrame:IsShown() or ChatConfigFrame:IsShown() then return 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()
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)
-- Redirect tainted variables
RunScript('ACTIVE_CHAT_EDIT_BOX = ACTIVE_CHAT_EDIT_BOX')
RunScript('LAST_ACTIVE_CHAT_EDIT_BOX = LAST_ACTIVE_CHAT_EDIT_BOX')
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], "curseforge.com/wow/addons/leatrix-plus", 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 have a gold, currency or crafting reagent requirement will not be turned-in automatically.|n|nYou can hold the shift key down when you talk to a quest giver to override this setting.")
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 as long as the player resurrecting you is not in combat.|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, false, "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("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 in your friends list or guild.")
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 in your friends list or guild.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoPartyInvites" , "Block party invites" , 146, -132, false, "If checked, party invitations will be blocked unless the player inviting you is in your friends list or guild.")
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:MakeTx(LeaPlusLC[pg], "Groups" , 340, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "AcceptPartyFriends" , "Party from friends" , 340, -92, false, "If checked, party invitations from friends or guild members 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 or guild members 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 in your friends list or guild.|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")
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 while the chat frame is locked will expand the chat frame upwards.|n|n\If the chat frame is unlocked, dragging the General chat tab will move the chat frame.")
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: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], "NoStickyEditbox" , "Disable sticky editbox" , 340, -112, true, "If checked, the editbox will close when it loses focus.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "UseArrowKeysInChat" , "Use arrow keys in chat" , 340, -132, 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, -152, true, "If checked, chat text will not fade out after a time period.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "UnivGroupColor" , "Universal group color" , 340, -172, 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, -192, 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, -212, 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:CfgBtn("NoChatButtonsBtn", LeaPlusCB["NoChatButtons"])
----------------------------------------------------------------------
-- 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 control key and right-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: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], "MinimapMod" , "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 on the character sheet.|n|nThe volume slider can be placed in either of two locations on the character sheet. 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 sheet 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], "ShowBorders" , "Show borders" , 340, -192, 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, -212, true, "If checked, you will be able to show a rare, elite or rare elite chain around the player frame.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ShowWowheadLinks" , "Show Wowhead links" , 340, -232, true, "If checked, Wowhead links will be shown in the world map frame and the achievements frame.")
LeaPlusLC:CfgBtn("ModMinimapBtn", LeaPlusCB["MinimapMod"])
LeaPlusLC:CfgBtn("MoveTooltipButton", LeaPlusCB["TipModEnable"])
LeaPlusLC:CfgBtn("CooldownsButton", LeaPlusCB["ShowCooldowns"])
LeaPlusLC:CfgBtn("ModBordersBtn", LeaPlusCB["ShowBorders"])
LeaPlusLC:CfgBtn("ModPlayerChain", LeaPlusCB["ShowPlayerChain"])
----------------------------------------------------------------------
-- LC6: Frames
----------------------------------------------------------------------
pg = "Page6"
LeaPlusLC:MakeTx(LeaPlusLC[pg], "Features" , 146, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "FrmEnabled" , "Manage frames" , 146, -92, true, "If checked, you will be able to change the position and scale of the player frame, target frame, ghost frame and timer bar.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageBuffs" , "Manage buffs" , 146, -112, true, "If checked, you will be able to change the position and scale of the buffs frame.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManagePowerBar" , "Manage power bar" , 146, -132, true, "If checked, you will be able to change the position and scale of the player alternative power bar.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageWidget" , "Manage widget" , 146, -152, true, "If checked, you will be able to change the position and scale of the widget frame.|n|nThe widget frame is commonly used for showing PvP scores and tracking objectives.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ManageFocus" , "Manage focus" , 146, -172, true, "If checked, you will be able to change the position and scale of the focus frame.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "ClassColFrames" , "Class colored frames" , 146, -192, 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], "HideLevelUpDisplay" , "Hide level-up display" , 340, -192, true, "If checked, the level-up display will not be shown.|n|nThe level-up display shows encounter objectives, level-ups, pet battle rewards, etc.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoGryphons" , "Hide gryphons" , 340, -212, true, "If checked, the main bar gryphons will not be shown.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoClassBar" , "Hide stance bar" , 340, -232, true, "If checked, the stance bar will not be shown.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoCommandBar" , "Hide order hall bar" , 340, -252, true, "If checked, the order hall command bar will not be shown.")
LeaPlusLC:CfgBtn("MoveFramesButton", LeaPlusCB["FrmEnabled"])
LeaPlusLC:CfgBtn("ManageBuffsButton", LeaPlusCB["ManageBuffs"])
LeaPlusLC:CfgBtn("ManagePowerBarButton", LeaPlusCB["ManagePowerBar"])
LeaPlusLC:CfgBtn("ManageWidgetButton", LeaPlusCB["ManageWidget"])
LeaPlusLC:CfgBtn("ManageFocusButton", LeaPlusCB["ManageFocus"])
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 netherworld 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:MakeTx(LeaPlusLC[pg], "Game Options" , 340, -72)
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoBagAutomation" , "Disable bag automation" , 340, -92, true, "If checked, your bags will not be opened or closed automatically when you interact with a merchant, bank or mailbox.")
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], "CharAddonList" , "Show character addons" , 340, -132, true, "If checked, the addon list (accessible from the game menu) will show character based addons by default.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "NoRaidRestrictions" , "Remove raid restrictions" , 340, -152, 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, -172, 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], "SaveProfFilters" , "Save profession filters" , 340, -192, true, "If checked, profession filter settings will be saved for the remainder of your login session.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "FasterLooting" , "Faster auto loot" , 340, -212, 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, -232, true, "If checked, you will be able to cancel cinematics without being prompted for confirmation.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "CombatPlates" , "Combat plates" , 340, -252, true, "If checked, enemy nameplates will be shown during combat and hidden when combat ends.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "EasyItemDestroy" , "Easy item destroy" , 340, -272, 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, -292, 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:CfgBtn("SetWeatherDensityBtn", LeaPlusCB["SetWeatherDensity"])
LeaPlusLC:CfgBtn("MuteGameSoundsBtn", LeaPlusCB["MuteGameSounds"])
----------------------------------------------------------------------
-- 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/Left-click - Toggle music.|n|nSHIFT/Right-click - Toggle stopwatch.|n|nCTRL/Left-click - Toggle minimap target tracking.|n|nCTRL/Right-click - Toggle errors (if enabled).|n|nCTRL/SHIFT/Left-click - Toggle Zygor (if installed).|n|nCTRL/SHIFT/Right-click - Toggle windowed mode.")
LeaPlusLC:MakeCB(LeaPlusLC[pg], "EnableHotkey" , "Enable hotkey" , 146, -112, true, "If checked, you can open Leatrix Plus by pressing CTRL/Z.")
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")
LeaPlusLC:ShowMemoryUsage(LeaPlusLC[pg], "TOPLEFT", 146, -262)