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.

377 lines
12 KiB

-- Talent Version
local STARTER_BUILD = "Starter Build"
local addon = CreateFrame("Frame", "TalentLoadoutReminderAddon")
addon:SetScript("OnEvent", function(self, event, ...) self[event](self, ...) end)
addon:RegisterEvent("ADDON_LOADED")
addon:RegisterEvent("PLAYER_LOGIN")
addon:RegisterEvent("PLAYER_LOGOUT")
addon:RegisterEvent("PLAYER_ENTERING_WORLD")
addon:RegisterEvent("TRAIT_CONFIG_UPDATED")
addon:RegisterEvent("CONFIG_COMMIT_FAILED")
addon:RegisterEvent("TRAIT_TREE_CHANGED")
local ConfigNameToIDMAP = {}
addon.defaultDB = {
DUNGEON = nil,
OPENWORLD = nil,
RAID = nil,
BG = nil,
ARENA = nil,
CURRENT_SET = nil
}
local last_current_set = nil
local isUpdatingLoadout = false
local loadingSet = nil
local changingFromStarterSet = false
function addon:TRAIT_CONFIG_UPDATED(_)
if isUpdatingLoadout and loadingSet ~= nil then
isUpdatingLoadout = false
--print("talent was changed WITH loadoutreminder, set is now: " .. loadingSet)
TalentLoadoutReminderFrame:Hide()
TalentLoadoutReminderDB["CURRENT_SET"] = loadingSet
--print("you know what.. always update the dropdown! thx blizz")
--print("selectionID: " .. ConfigNameToIDMAP[loadingSet])
ClassTalentFrame.TalentsTab.LoadoutDropDown:SetSelectionID(ConfigNameToIDMAP[loadingSet])
else
--print("loadout was changed without loadoutreminder")
if changingFromStarterSet then
--print("coming from starter set..")
changingFromStarterSet = false
end
addon:saveCurrentSetFromDropDownSelection()
addon:checkAndShow()
end
end
function addon:TRAIT_TREE_CHANGED(_)
-- I dont care, just update current set
last_current_set = TalentLoadoutReminderDB["CURRENT_SET"]
if last_current_set == STARTER_BUILD then
--print("changing from starter set..")
changingFromStarterSet = true
end
--print("update last current set")
--addon:saveCurrentSetFromDropDownSelection()
end
function addon:CONFIG_COMMIT_FAILED()
if last_current_set then
-- reset current set to last set if there was a current set
TalentLoadoutReminderDB["CURRENT_SET"] = last_current_set
last_current_set = nil
isUpdatingLoadout = false
loadingSet = nil
--print("commit failed")
addon:checkAndShow()
end
end
function addon:saveCurrentSetFromDropDownSelection()
local configID = addon:getTalentUICurrentSelectedLoadout()
if configID ~= -2 and configID ~= nil then
local name = C_Traits.GetConfigInfo(addon:getTalentUICurrentSelectedLoadout()).name
TalentLoadoutReminderDB["CURRENT_SET"] = name
elseif configID == -2 then
--print("we got ourselves a starter build here!")
TalentLoadoutReminderDB["CURRENT_SET"] = STARTER_BUILD
end
end
function addon:getTalentUICurrentSelectedLoadout()
return ClassTalentFrame.TalentsTab.LoadoutDropDown.lastValidSelectionID
end
function addon:getTalentSets()
local talentSets = {STARTER_BUILD}
local configIDs = C_ClassTalents.GetConfigIDsBySpecID(PlayerUtil.GetCurrentSpecID())
ConfigNameToIDMAP = {}
ConfigNameToIDMAP[STARTER_BUILD] = -2
for i, configID in ipairs(configIDs) do
local configInfo = C_Traits.GetConfigInfo(configID)
if configInfo ~= nil then
table.insert(talentSets, configInfo.name)
ConfigNameToIDMAP[configInfo.name] = configID
end
end
return talentSets
end
function addon:ADDON_LOADED(addon_name)
if addon_name == 'TalentLoadoutReminder' then
LoadAddOn("Blizzard_ClassTalentUI")
addon:loadDefaultDB()
addon:initOptions()
addon:initLoadoutReminderFrame()
end
end
function addon:getCurrentSet()
return TalentLoadoutReminderDB["CURRENT_SET"]
end
function addon:isSetLoaded(setName)
local currentSet = addon:getCurrentSet()
return currentSet == setName
end
function addon:printAlreadyLoadedMessage(set)
if set == nil then
print("TLOR: Talentset not assigned yet. Type /tlor config to configure")
else
print("TLOR: Talentset already loaded: " .. set)
end
end
function addon:checkAndShow()
local current_set = addon.getCurrentSet()
if current_set == nil then
print("TLOR: Talent configuration does not differ from the default set")
return
end
inInstance, instanceType = IsInInstance()
local DUNGEON_SET = TalentLoadoutReminderDB["DUNGEON"]
local RAID_SET = TalentLoadoutReminderDB["RAID"]
local BG_SET = TalentLoadoutReminderDB["BG"]
local ARENA_SET = TalentLoadoutReminderDB["ARENA"]
local OPENWORLD_SET = TalentLoadoutReminderDB["OPENWORLD"]
local SET_TO_LOAD = nil
-- check if player went into a dungeon
if inInstance and instanceType == 'party' then
if instanceType == 'party' then
if addon:isSetLoaded(DUNGEON_SET) or DUNGEON_SET == nil then
addon:printAlreadyLoadedMessage(DUNGEON_SET)
TalentLoadoutReminderFrame:Hide()
return
end
SET_TO_LOAD = DUNGEON_SET
elseif instanceType == 'raid' then
if addon:isSetLoaded(RAID_SET) or RAID_SET == nil then
addon:printAlreadyLoadedMessage(RAID_SET)
TalentLoadoutReminderFrame:Hide()
return
end
SET_TO_LOAD = RAID_SET
elseif instanceType == 'pvp' then
if addon:isSetLoaded(BG_SET) or BG_SET == nil then
addon:printAlreadyLoadedMessage(BG_SET)
TalentLoadoutReminderFrame:Hide()
return
end
SET_TO_LOAD = BG_SET
elseif instanceType == 'arena' then
if addon:isSetLoaded(ARENA_SET) or ARENA_SET == nil then
addon:printAlreadyLoadedMessage(ARENA_SET)
TalentLoadoutReminderFrame:Hide()
return
end
SET_TO_LOAD = ARENA_SET
end
elseif not inInstance then
if addon:isSetLoaded(OPENWORLD_SET) or OPENWORLD_SET == nil then
addon:printAlreadyLoadedMessage(OPENWORLD_SET)
TalentLoadoutReminderFrame:Hide()
return
end
SET_TO_LOAD = OPENWORLD_SET
end
local _ = addon:getTalentSets() -- refresh map
local currentSet = addon:getCurrentSet()
if ConfigNameToIDMAP[currentSet] == nil then
-- only the case when handling a deleted set.. which shows as default set
currentSet = currentSet .. " (deleted)"
end
TalentLoadoutReminderFrame.ContentFrame.text:SetText("Current Talent Set: \"" .. currentSet .. "\"")
TalentLoadSetButton:SetScript("OnClick", function(self)
local canChange, canAdd, changeError = C_ClassTalents.CanChangeTalents()
if canChange then
--ClassTalentHelper.SwitchToLoadoutByName(SET_TO_LOAD)
--ClassTalentTalentsTabMixin:LoadConfigByName(SET_TO_LOAD) -- yeah well this does not work, thx blizz
local newConfigID = ConfigNameToIDMAP[SET_TO_LOAD]
local result = ClassTalentFrame.TalentsTab:LoadConfigInternal(newConfigID, true, false)
isUpdatingLoadout = true
loadingSet = SET_TO_LOAD
else
print("TLOR: Cannot change talents now")
end
end)
TalentLoadSetButton:SetText("Load '"..SET_TO_LOAD.."'")
TalentLoadoutReminderFrame:Show()
end
function addon:PLAYER_ENTERING_WORLD(isLogIn, isReload)
if isLogIn then
return
elseif isReload then
return
end
self:checkAndShow()
end
function addon:loadDefaultDB()
TalentLoadoutReminderDB = TalentLoadoutReminderDB or CopyTable(self.defaultDB)
end
function addon:PLAYER_LOGIN()
SLASH_TALENTLOADOUTREMINDER1 = "/talentloadoutreminder"
SLASH_TALENTLOADOUTREMINDER2 = "/tlor"
SlashCmdList["TALENTLOADOUTREMINDER"] = function(input)
input = SecureCmdOptionParse(input)
if not input then return end
local command, rest = input:match("^(%S*)%s*(.-)$")
command = command and command:lower()
rest = (rest and rest ~= "") and rest:trim() or nil
if command == "config" then
InterfaceOptionsFrame_OpenToCategory(addon.optionsPanel)
end
if command == "check" then
self:checkAndShow()
end
if command == "" then
print("Talent LoadoutReminder Help")
print("/tlor or /talentloadoutreminder can be used for following commands")
print("/tlor -> show help text")
print("/tlor config -> show options panel")
print("/tlor check -> if configured check current player situation")
end
end
end
function addon:initLoadoutReminderFrame()
TalentLoadoutReminderFrame.title = TalentLoadoutReminderFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
TalentLoadoutReminderFrame.title:SetPoint("CENTER", TalentLoadoutReminderFrameTitleBG, "CENTER", 5, 0)
TalentLoadoutReminderFrame.title:SetText("Talent Loadout Reminder")
TalentLoadoutReminderFrame.ContentFrame = CreateFrame("Frame", nil, TalentLoadoutReminderFrame)
TalentLoadoutReminderFrame.ContentFrame:SetSize(300, 150)
TalentLoadoutReminderFrame.ContentFrame:SetPoint("TOPLEFT", TalentLoadoutReminderFrameDialogBG, "TOPLEFT", -3, 4)
TalentLoadoutReminderFrame.ContentFrame.text = TalentLoadoutReminderFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
TalentLoadoutReminderFrame.ContentFrame.text:SetPoint("TOP", TalentLoadoutReminderFrameDialogBG, "TOP", 5, -10)
makeFrameMoveable()
local bLoad = CreateFrame("Button", "TalentLoadSetButton", TalentLoadoutReminderFrame, "SecureActionButtonTemplate,UIPanelButtonTemplate")
--bLoad:RegisterForClicks("AnyUp", "AnyDown")
bLoad:SetSize(200 ,30)
bLoad:SetPoint("CENTER", TalentLoadoutReminderFrame, "CENTER", 0, -15)
bLoad:SetText("Load Talentset")
end
function addon:updateOptionDropdowns()
addon:initializeDropdownValues(DropdownDUNGEON, "DUNGEON")
addon:initializeDropdownValues(DropdownRAID, "RAID")
addon:initializeDropdownValues(DropdownARENA, "ARENA")
addon:initializeDropdownValues(DropdownBG, "BG")
addon:initializeDropdownValues(DropdownOPENWORLD, "OPENWORLD")
end
function addon:initOptions()
self.optionsPanel = CreateFrame("Frame")
self.optionsPanel:HookScript("OnShow", function(self)
addon:updateOptionDropdowns()
end)
self.optionsPanel.name = "TalentLoadoutReminder"
local title = self.optionsPanel:CreateFontString('optionsTitle', 'OVERLAY', 'GameFontNormal')
title:SetPoint("TOP", 0, 0)
title:SetText("Talent LoadoutReminder")
self:initDropdownMenu("DUNGEON", "Dungeon", -115, -50)
self:initDropdownMenu("RAID", "Raid", 115, -50)
self:initDropdownMenu("ARENA", "Arena", -115, -100)
self:initDropdownMenu("BG", "Battlegrounds", 115, -100)
self:initDropdownMenu("OPENWORLD", "Open World", -115, -150)
InterfaceOptions_AddCategory(self.optionsPanel)
end
function addon:initializeDropdownValues(dropDown, linkedSetID)
UIDropDownMenu_Initialize(dropDown, function(self)
-- loop through possible sets and put them as option
local setList = addon:getTalentSets()
for k, v in pairs(setList) do
setName = v -- TODO: check if k or v is needed
local info = UIDropDownMenu_CreateInfo()
info.func = function(self, arg1, arg2, checked)
--print("clicked: " .. linkedSetID .. " -> " .. tostring(arg1))
TalentLoadoutReminderDB[linkedSetID] = arg1
UIDropDownMenu_SetText(dropDown, arg1)
-- a new set was chosen for a new environment
-- check if it is not already loaded anyway, then close frame if open
if not addon:isSetLoaded(arg1) then
addon:checkAndShow()
else
TalentLoadoutReminderFrame:Hide()
end
end
info.text = setName
info.arg1 = info.text
UIDropDownMenu_AddButton(info)
end
end)
local linkedSetName = TalentLoadoutReminderDB[linkedSetID]
local linkedSetConfigID = ConfigNameToIDMAP[linkedSetName]
if linkedSetName ~= nil and linkedSetConfigID ~= nil then
UIDropDownMenu_SetText(dropDown, linkedSetName)
else
if TalentLoadoutReminderDB["CURRENT_SET"] == linkedSetName then
TalentLoadoutReminderDB["CURRENT_SET"] = nil -- fallback set?
end
TalentLoadoutReminderDB[linkedSetID] = nil
UIDropDownMenu_SetText(dropDown, "Choose a talent set")
end
end
function addon:initDropdownMenu(linkedSetID, label, offsetX, offsetY)
local dropDown = CreateFrame("Frame", "Dropdown" .. linkedSetID, self.optionsPanel, "UIDropDownMenuTemplate")
dropDown:SetPoint("TOP", self.optionsPanel, offsetX, offsetY)
UIDropDownMenu_SetWidth(dropDown, 200) -- Use in place of dropDown:SetWidth
addon:initializeDropdownValues(dropDown, linkedSetID)
-- local linkedSetName = TalentLoadoutReminderDB[linkedSetID]
-- local linkedSetConfigID = ConfigNameToIDMAP[linkedSetName]
-- if linkedSetName ~= nil and linkedSetConfigID ~= nil then
-- UIDropDownMenu_SetText(dropDown, linkedSetName)
-- else
-- UIDropDownMenu_SetText(dropDown, "Choose a talent set")
-- end
local dd_title = dropDown:CreateFontString('dd_title', 'OVERLAY', 'GameFontNormal')
dd_title:SetPoint("TOP", 0, 10)
dd_title:SetText(label)
end
function makeFrameMoveable()
TalentLoadoutReminderFrame:SetMovable(true)
TalentLoadoutReminderFrame:SetScript("OnMouseDown", function(self, button)
self:StartMoving()
end)
TalentLoadoutReminderFrame:SetScript("OnMouseUp", function(self, button)
self:StopMovingOrSizing()
end)
end