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.
243 lines
8.3 KiB
243 lines
8.3 KiB
|
5 years ago
|
|
||
|
|
local BigWigs = {}
|
||
|
|
do
|
||
|
|
local _, tbl =...
|
||
|
|
tbl.core = BigWigs
|
||
|
|
end
|
||
|
|
|
||
|
|
local C = {}
|
||
|
|
local L = BigWigsAPI:GetLocale("BigWigs")
|
||
|
|
local CL = BigWigsAPI:GetLocale("BigWigs: Common")
|
||
|
|
local names = {}
|
||
|
|
local descriptions = {}
|
||
|
|
|
||
|
|
local GetSpellInfo, GetSpellTexture, GetSpellDescription, C_EncounterJournal_GetSectionInfo = GetSpellInfo, GetSpellTexture, GetSpellDescription, C_EncounterJournal.GetSectionInfo
|
||
|
|
local type, next, tonumber, gsub, lshift, band = type, next, tonumber, gsub, bit.lshift, bit.band
|
||
|
|
|
||
|
|
-- Option bitflags
|
||
|
|
local coreToggles = { "BAR", "MESSAGE", "ICON", "PULSE", "SOUND", "SAY", "PROXIMITY", "FLASH", "ME_ONLY", "EMPHASIZE", "TANK", "HEALER", "TANK_HEALER", "DISPEL", "ALTPOWER", "VOICE", "COUNTDOWN", "INFOBOX", "CASTBAR", "SAY_COUNTDOWN", "ME_ONLY_EMPHASIZE", "NAMEPLATEBAR" }
|
||
|
|
for i, toggle in next, coreToggles do
|
||
|
|
C[toggle] = lshift(1, i - 1)
|
||
|
|
if L[toggle] then
|
||
|
|
names[toggle] = L[toggle]
|
||
|
|
descriptions[toggle] = L[toggle .. "_desc"]
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Toggles that should actually be shown in the interface options
|
||
|
|
local listToggles = { "BAR", "FLASH", "MESSAGE", "ICON", "SAY", "SAY_COUNTDOWN", "PROXIMITY", "ALTPOWER", "VOICE", "INFOBOX" }
|
||
|
|
local roleToggles = { "TANK", "HEALER", "TANK_HEALER", "DISPEL" }
|
||
|
|
-- NOTE: The toggle "OFF" is also valid for entirely disabling an option by default
|
||
|
|
|
||
|
|
local used = nil
|
||
|
|
function BigWigs:RegisterOption(key, name, desc)
|
||
|
|
if C[key] then error("Don't do that again!") end
|
||
|
|
|
||
|
|
-- Build a list of used shift indexes
|
||
|
|
if not used then
|
||
|
|
used = {}
|
||
|
|
for k, i in next, self.db.global.optionShiftIndexes do
|
||
|
|
used[i] = k
|
||
|
|
end
|
||
|
|
for i, k in next, coreToggles do
|
||
|
|
used[i - 1] = k
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if self.db.global.optionShiftIndexes[key] then
|
||
|
|
local index = self.db.global.optionShiftIndexes[key]
|
||
|
|
if used[index] and used[index] ~= key then
|
||
|
|
error("Bit field shift indexes are not consistent with the stored data. BigWigs should automatically handle this, but at the moment it does not. Boss options might be completely fubar at the moment. Have fun.")
|
||
|
|
end
|
||
|
|
-- Use the stored shift index
|
||
|
|
C[key] = lshift(1, self.db.global.optionShiftIndexes[key])
|
||
|
|
else
|
||
|
|
-- Find the next free shift index
|
||
|
|
local nextShiftIndex = nil
|
||
|
|
for i = 10, 63 do
|
||
|
|
if not used[i] then
|
||
|
|
nextShiftIndex = i
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
for i, k in next, used do
|
||
|
|
if k == key then
|
||
|
|
error("That's weird, we seem to have a stored shift index for this key already.")
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if not nextShiftIndex then error("BigWigs will now blow up. Please consult your local IT technician.") end
|
||
|
|
used[nextShiftIndex] = key
|
||
|
|
self.db.global.optionShiftIndexes[key] = nextShiftIndex
|
||
|
|
C[key] = lshift(1, nextShiftIndex)
|
||
|
|
end
|
||
|
|
|
||
|
|
if name and desc then
|
||
|
|
names[key] = name
|
||
|
|
descriptions[key] = desc
|
||
|
|
listToggles[#listToggles + 1] = key
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function BigWigs:GetOptionDetails(key)
|
||
|
|
return names[key], descriptions[key]
|
||
|
|
end
|
||
|
|
|
||
|
|
function BigWigs:GetOptions()
|
||
|
|
return listToggles
|
||
|
|
end
|
||
|
|
|
||
|
|
function BigWigs:GetRoleOptions()
|
||
|
|
return roleToggles
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Display role message in the option
|
||
|
|
local function getRoleStrings(module, key)
|
||
|
|
local option = module.toggleDefaults[key]
|
||
|
|
if band(option, C.TANK_HEALER) == C.TANK_HEALER then
|
||
|
|
return L.tankhealer
|
||
|
|
elseif band(option, C.TANK) == C.TANK then
|
||
|
|
return L.tank
|
||
|
|
elseif band(option, C.HEALER) == C.HEALER then
|
||
|
|
return L.healer
|
||
|
|
elseif band(option, C.DISPEL) == C.DISPEL then
|
||
|
|
return L.dispeller
|
||
|
|
end
|
||
|
|
return ""
|
||
|
|
end
|
||
|
|
|
||
|
|
local function replaceIdWithName(msg)
|
||
|
|
local id = tonumber(msg)
|
||
|
|
if id > 0 then
|
||
|
|
return GetSpellInfo(id) or BigWigs:Print(("No spell name found for boss option using id %d."):format(id))
|
||
|
|
else
|
||
|
|
local tbl = C_EncounterJournal_GetSectionInfo(-id)
|
||
|
|
if not tbl then
|
||
|
|
BigWigs:Print(("No journal name found for boss option using id %d."):format(id))
|
||
|
|
else
|
||
|
|
return tbl.title
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
local function replaceIdWithDescription(msg)
|
||
|
|
local id = tonumber(msg)
|
||
|
|
if id > 0 then
|
||
|
|
local desc = GetSpellDescription(id)
|
||
|
|
if desc then
|
||
|
|
return desc:gsub("[\r\n]+$", "") -- Remove stray CR+LF for e.g. 299250 spells that show another spell in their tooltip which isn't part of GetSpellDescription
|
||
|
|
else
|
||
|
|
BigWigs:Print(("No spell description found for boss option using id %d."):format(id))
|
||
|
|
end
|
||
|
|
else
|
||
|
|
local tbl = C_EncounterJournal_GetSectionInfo(-id)
|
||
|
|
if not tbl then
|
||
|
|
BigWigs:Print(("No journal description found for boss option using id %d."):format(id))
|
||
|
|
else
|
||
|
|
return tbl.description
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local customBossOptions = { -- Adding core generic toggles
|
||
|
|
berserk = {L.berserk, L.berserk_desc, 136224}, -- 136224 = "Interface\\Icons\\spell_shadow_unholyfrenzy"
|
||
|
|
altpower = {L.altpower, L.altpower_desc, "Interface\\AddOns\\BigWigs\\Media\\Icons\\Menus\\AltPower"},
|
||
|
|
infobox = {L.infobox, L.infobox_desc, "Interface\\AddOns\\BigWigs\\Media\\Icons\\Menus\\Info"},
|
||
|
|
proximity = {L.proximity, L.proximity_desc, "Interface\\AddOns\\BigWigs\\Media\\Icons\\Menus\\Proximity"},
|
||
|
|
stages = {L.stages, L.stages_desc, "Interface\\AddOns\\BigWigs\\Media\\Icons\\Menus\\Stages"},
|
||
|
|
warmup = {L.warmup, L.warmup_desc, "Interface\\AddOns\\BigWigs\\Media\\Icons\\Menus\\Warmup"},
|
||
|
|
}
|
||
|
|
|
||
|
|
function BigWigs:GetBossOptionDetails(module, option)
|
||
|
|
local optionType = type(option)
|
||
|
|
if optionType == "table" then
|
||
|
|
option = option[1]
|
||
|
|
optionType = type(option)
|
||
|
|
end
|
||
|
|
|
||
|
|
local alternativeName = module.altNames and module.altNames[option]
|
||
|
|
|
||
|
|
if optionType == "string" then
|
||
|
|
if customBossOptions[option] then
|
||
|
|
return option, customBossOptions[option][1], customBossOptions[option][2], customBossOptions[option][3]
|
||
|
|
else
|
||
|
|
local roleDesc = ""
|
||
|
|
if not option:find("^custom_") then
|
||
|
|
roleDesc = getRoleStrings(module, option)
|
||
|
|
end
|
||
|
|
|
||
|
|
local L = module:GetLocale(true)
|
||
|
|
local title, description = L[option], L[option .. "_desc"]
|
||
|
|
if title then
|
||
|
|
if type(title) == "number" then
|
||
|
|
if not description then description = title end -- Allow a nil description to mean the same id as the title, if title is a number.
|
||
|
|
title = replaceIdWithName(title)
|
||
|
|
else
|
||
|
|
title = gsub(title, "{(%-?%d-)}", replaceIdWithName) -- Allow embedding an id in a string.
|
||
|
|
end
|
||
|
|
title = title
|
||
|
|
end
|
||
|
|
if description then
|
||
|
|
if type(description) == "number" then
|
||
|
|
description = replaceIdWithDescription(description)
|
||
|
|
else
|
||
|
|
description = gsub(description, "{(%-?%d-)}", replaceIdWithDescription) -- Allow embedding an id in a string.
|
||
|
|
description = gsub(description, "{focus}", CL.focus_only) -- Allow embedding the focus prefix.
|
||
|
|
end
|
||
|
|
description = roleDesc.. gsub(description, "{rt(%d)}", "|T13700%1:15|t")
|
||
|
|
end
|
||
|
|
local icon = L[option .. "_icon"]
|
||
|
|
if icon == option .. "_icon" then icon = nil end
|
||
|
|
if type(icon) == "number" then
|
||
|
|
if icon > 8 then
|
||
|
|
icon = GetSpellTexture(icon)
|
||
|
|
elseif icon > 0 then
|
||
|
|
icon = icon + 137000 -- Texture id list for raid icons 1-8 is 137001-137008. Base texture path is Interface\\TARGETINGFRAME\\UI-RaidTargetingIcon_%d
|
||
|
|
else
|
||
|
|
local tbl = C_EncounterJournal_GetSectionInfo(-icon)
|
||
|
|
icon = tbl.abilityIcon
|
||
|
|
end
|
||
|
|
if not icon then
|
||
|
|
BigWigs:Print(("No icon found for %s using id %d."):format(module.name, L[option .. "_icon"]))
|
||
|
|
end
|
||
|
|
elseif type(icon) == "string" and not icon:find("\\", nil, true) then
|
||
|
|
icon = "Interface\\Icons\\" .. icon
|
||
|
|
end
|
||
|
|
return option, title, description, icon, alternativeName
|
||
|
|
end
|
||
|
|
elseif optionType == "number" then
|
||
|
|
if option > 0 then
|
||
|
|
local spellName, _, icon = GetSpellInfo(option)
|
||
|
|
if not spellName then
|
||
|
|
BigWigs:Error(("Invalid option %d in module %s."):format(option, module.name))
|
||
|
|
spellName = option
|
||
|
|
end
|
||
|
|
local desc = GetSpellDescription(option)
|
||
|
|
if not desc then
|
||
|
|
BigWigs:Error(("No spell description was returned for id %d!"):format(option))
|
||
|
|
desc = option
|
||
|
|
else
|
||
|
|
desc = desc:gsub("[\r\n]+$", "") -- Remove stray CR+LF for e.g. 299250 spells that show another spell in their tooltip which isn't part of GetSpellDescription
|
||
|
|
end
|
||
|
|
local roleDesc = getRoleStrings(module, option)
|
||
|
|
return option, spellName, roleDesc..desc, icon, alternativeName
|
||
|
|
else
|
||
|
|
-- This is an EncounterJournal ID
|
||
|
|
local tbl = C_EncounterJournal_GetSectionInfo(-option)
|
||
|
|
local title, description, abilityIcon
|
||
|
|
if not tbl then
|
||
|
|
BigWigs:Error(("Invalid option %d in module %s."):format(option, module.name))
|
||
|
|
title = option
|
||
|
|
description = option
|
||
|
|
else
|
||
|
|
title, description, abilityIcon = tbl.title, tbl.description, tbl.abilityIcon
|
||
|
|
end
|
||
|
|
|
||
|
|
local roleDesc = getRoleStrings(module, option)
|
||
|
|
return option, title, roleDesc..description, abilityIcon or false, alternativeName
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
BigWigs.C = C
|