Something went wrong. Try again.
World of Warcraft: Forever addon that adds profession tracking.
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317local ADDON_NAME = ...
Professor = Professor or {}
Professor.SLOTS = { { key = "primary1", professionIndex = 1, title = "Primary Profession 1" }, { key = "primary2", professionIndex = 2, title = "Primary Profession 2" }, { key = "fishing", professionIndex = 4, title = "Fishing" }, { key = "cooking", professionIndex = 5, title = "Cooking" }, { key = "firstAid", professionIndex = 6, title = "First Aid" },}
local TIER_NAMES = { { cap = 75, name = "Apprentice" }, { cap = 150, name = "Journeyman" }, { cap = 225, name = "Expert" }, { cap = 300, name = "Artisan" }, { cap = 375, name = "Master" }, { cap = 450, name = "Grand Master" },}
BINDING_HEADER_PROFESSOR = "Professor"BINDING_NAME_PROFESSOR_TOGGLE = "Toggle profession bar"BINDING_NAME_PROFESSOR_CYCLE = "Cycle profession"BINDING_NAME_PROFESSOR_PRIMARY1 = "Select primary profession 1"BINDING_NAME_PROFESSOR_PRIMARY2 = "Select primary profession 2"BINDING_NAME_PROFESSOR_FISHING = "Select Fishing"BINDING_NAME_PROFESSOR_COOKING = "Select Cooking"BINDING_NAME_PROFESSOR_FIRSTAID = "Select First Aid"BINDING_NAME_PROFESSOR_SETTINGS = "Open Professor settings"
local DEFAULT_BAR_COLOR = { r = 1, g = 0.2, b = 0.5647058823529412 }local PREVIOUS_DEFAULT_BAR_COLOR = { r = 0.58, g = 0, b = 0.55 }
function Professor:InitDB() ProfessorDB = ProfessorDB or {} if ProfessorDB.alwaysShowText == nil then ProfessorDB.alwaysShowText = false end local color = ProfessorDB.barColor local previous = PREVIOUS_DEFAULT_BAR_COLOR local isPreviousDefault = color and math.abs(color.r - previous.r) < 0.001 and math.abs(color.g - previous.g) < 0.001 and math.abs(color.b - previous.b) < 0.001 if not color or isPreviousDefault then ProfessorDB.barColor = { r = DEFAULT_BAR_COLOR.r, g = DEFAULT_BAR_COLOR.g, b = DEFAULT_BAR_COLOR.b, } end
ProfessorCharDB = ProfessorCharDB or {}end
function Professor:GetBarColor() local color = ProfessorDB.barColor or DEFAULT_BAR_COLOR return color.r, color.g, color.bend
function Professor:SetBarColor(r, g, b) ProfessorDB.barColor = { r = r, g = g, b = b } self:Refresh()end
function Professor:GetSlot(key) for _, slot in ipairs(self.SLOTS) do if slot.key == key then return slot end endend
function Professor:GetSelectedKey() return ProfessorCharDB and ProfessorCharDB.selected or nilend
function Professor:GetSelectedLabel() local prof = self:GetSelectedProfession() if prof then return prof.name end return "None"end
function Professor:SetSelected(key) if key then local slot = self:GetSlot(key) if not slot or not self:GetSlotProfession(slot) then key = nil end end ProfessorCharDB.selected = key if key then ProfessorCharDB.lastSelected = key end self:Refresh()end
function Professor:ToggleSlot(key) if self:GetSelectedKey() == key then self:SetSelected(nil) else self:SetSelected(key) endend
function Professor:ToggleAll() if self:GetSelectedKey() then self:SetSelected(nil) else self:SetSelected(ProfessorCharDB.lastSelected) endend
function Professor:GetTierName(maxRank) maxRank = maxRank or 0 for _, tier in ipairs(TIER_NAMES) do if maxRank <= tier.cap then return tier.name end end return TIER_NAMES[#TIER_NAMES].nameend
function Professor:GetTierProgress(rank, maxRank) rank = rank or 0 maxRank = maxRank or 0 local span = 75 local tierEnd = maxRank local tierStart = math.max(0, tierEnd - span) local maximum = math.max(1, tierEnd - tierStart) local progress = math.max(0, math.min(maximum, rank - tierStart)) return { progress = progress, maximum = maximum, tierName = self:GetTierName(maxRank), tierStart = tierStart, tierEnd = tierEnd, }end
function Professor:GetSlotProfession(slot) if not slot or not GetProfessions or not GetProfessionInfo then return end local ids = { GetProfessions() } local id = ids[slot.professionIndex] if not id then return end local name, icon, rank, maxRank, _, _, skillLine = GetProfessionInfo(id) if not name then return end local tier = self:GetTierProgress(rank, maxRank) return { slot = slot.key, name = name, icon = icon, rank = rank or 0, maxRank = maxRank or 0, skillLine = skillLine, progress = tier.progress, maximum = tier.maximum, tierName = tier.tierName, tierStart = tier.tierStart, tierEnd = tier.tierEnd, }end
function Professor:GetKnownProfessions() local list = {} for _, slot in ipairs(self.SLOTS) do local prof = self:GetSlotProfession(slot) if prof then list[#list + 1] = prof end end return listend
function Professor:GetSelectedProfession() local slot = self:GetSlot(self:GetSelectedKey()) if not slot then return end return self:GetSlotProfession(slot)end
function Professor:GetVisibleProfessions() local prof = self:GetSelectedProfession() if not prof then return {} end return { prof }end
function Professor:CycleFocus() local keys = {} for _, prof in ipairs(self:GetKnownProfessions()) do keys[#keys + 1] = prof.slot end local selected = self:GetSelectedKey() if not selected then self:SetSelected(keys[1]) return end for i, key in ipairs(keys) do if key == selected then self:SetSelected(keys[i + 1]) return end end self:SetSelected(nil)end
function Professor:ShouldShowText() if ProfessorDB.alwaysShowText then return true end if GetCVarBool then return GetCVarBool("xpBarText") end return falseend
function Professor:OpenSettings() if self.CreateSettings then self:CreateSettings() end if Settings and Settings.OpenToCategory and self.CategoryID then Settings.OpenToCategory(self.CategoryID) endend
function Professor:Refresh() if self.UpdateSettingsControls then self:UpdateSettingsControls() end if self.UpdateBars then self:UpdateBars() endend
function Professor_ToggleAll() Professor:ToggleAll()end
function Professor_Cycle() Professor:CycleFocus()end
function Professor_TogglePrimary1() Professor:ToggleSlot("primary1")end
function Professor_TogglePrimary2() Professor:ToggleSlot("primary2")end
function Professor_ToggleFishing() Professor:ToggleSlot("fishing")end
function Professor_ToggleCooking() Professor:ToggleSlot("cooking")end
function Professor_ToggleFirstAid() Professor:ToggleSlot("firstAid")end
function Professor_OpenSettings() Professor:OpenSettings()end
SLASH_PROFESSOR1 = "/professor"SLASH_PROFESSOR2 = "/prof"SlashCmdList.PROFESSOR = function() Professor:OpenSettings()end
local events = CreateFrame("Frame")events:RegisterEvent("ADDON_LOADED")events:SetScript("OnEvent", function(self, event, ...) if event == "ADDON_LOADED" then local name = ... if name ~= ADDON_NAME then return end Professor:InitDB() self:RegisterEvent("PLAYER_LOGIN") self:RegisterEvent("PLAYER_ENTERING_WORLD") self:RegisterEvent("SKILL_LINES_CHANGED") self:RegisterEvent("CHAT_MSG_SKILL") self:RegisterEvent("CVAR_UPDATE") return end if event == "PLAYER_LOGIN" then if Professor.CreateSettings then Professor:CreateSettings() end Professor:Refresh() return end if event == "CVAR_UPDATE" then local cvar = ... if cvar == "xpBarText" then Professor:Refresh() end return end Professor:Refresh()end)