local 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.b end 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 end end function Professor:GetSelectedKey() return ProfessorCharDB and ProfessorCharDB.selected or nil end 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) end end function Professor:ToggleAll() if self:GetSelectedKey() then self:SetSelected(nil) else self:SetSelected(ProfessorCharDB.lastSelected) end end 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].name end 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 list end 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 false end function Professor:OpenSettings() if self.CreateSettings then self:CreateSettings() end if Settings and Settings.OpenToCategory and self.CategoryID then Settings.OpenToCategory(self.CategoryID) end end function Professor:Refresh() if self.UpdateSettingsControls then self:UpdateSettingsControls() end if self.UpdateBars then self:UpdateBars() end end 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)