diff --git a/Libs/DF/addon.lua b/Libs/DF/addon.lua
index c7f92efb..2594e55b 100644
--- a/Libs/DF/addon.lua
+++ b/Libs/DF/addon.lua
@@ -3,32 +3,101 @@ local DF = _G ["DetailsFramework"]
local _
if (not DF or not DetailsFrameworkCanLoad) then
- return
+ return
end
-function DF:CreateAddOn (name, global_saved, global_table, options_table, broker)
+--runs when the addon received addon_loaded
+local addonPreLoad = function(addonFrame, event, ...)
+ --check if the saved variables table is created, if not create one
+ _G[addonFrame.__savedVarsName] = _G[addonFrame.__savedVarsName] or {}
+
+ if (addonFrame.__savedVarsDefaultTemplate) then
+ --load saved vars for this character
+ DF.SavedVars.LoadSavedVarsForPlayer(addonFrame)
+ end
+
+ if (addonFrame.OnLoad) then
+ DF:Dispatch(addonFrame.OnLoad, addonFrame, ...)
+ end
+end
+
+--runs when the addon received player_login
+local addonInit = function(addonFrame, event, ...)
+ if (addonFrame.OnInit) then
+ DF:Dispatch(addonFrame.OnInit, addonFrame, ...)
+ end
+end
+
+--when the player logout or reloadUI
+local addonUnload = function(addonFrame, event, ...)
+ --close saved tables
+end
+
+local addonEvents = {
+ ["ADDON_LOADED"] = addonPreLoad,
+ ["PLAYER_LOGIN"] = addonInit,
+ ["PLAYER_LOGOUT"] = addonUnload,
+}
+
+local addonOnEvent = function(addonFrame, event, ...)
+ local func = addonEvents[event]
+ if (func) then
+ func(addonFrame, event, ...)
+ else
+ --might be a registered event from the user
+ if (addonFrame.event) then
+ DF:CoreDispatch(addonFrame.__name, addonFrame.event, addonFrame, event, ...)
+ end
+ end
+end
+
+local getAddonName = function(addonFrame)
+ return addonFrame:GetName()
+end
+
+function DF:CreateNewAddOn(addonName, globalSavedVariablesName, savedVarsTemplate)
+ local newAddon = CreateFrame("frame", addonName, UIParent)
+ newAddon.__name = addonName
+ newAddon.__savedVarsName = globalSavedVariablesName
+ newAddon.__savedVarsDefaultTemplate = savedVarsTemplate
+
+ newAddon.GetAddonName = getAddonName
+
+ newAddon:RegisterEvent("ADDON_LOADED")
+ newAddon:RegisterEvent("PLAYER_LOGIN")
+ newAddon:SetScript("OnEvent", addonOnEvent)
+
+ return newAddon
+end
+
+
+
+
+--old create addon
+function DF:CreateAddOn (name, global_saved, global_table, options_table, broker)
+
local addon = LibStub ("AceAddon-3.0"):NewAddon (name, "AceConsole-3.0", "AceEvent-3.0", "AceTimer-3.0", "DetailsFramework-1.0", "AceComm-3.0")
_G [name] = addon
addon.__name = name
-
+
function addon:OnInitialize()
-
+
if (global_saved) then
if (broker and broker.Minimap and not global_table.Minimap) then
DF:Msg (name, "broker.Minimap is true but no global.Minimap declared.")
end
self.db = LibStub ("AceDB-3.0"):New (global_saved, global_table or {}, true)
end
-
+
if (options_table) then
LibStub ("AceConfig-3.0"):RegisterOptionsTable (name, options_table)
addon.OptionsFrame1 = LibStub ("AceConfigDialog-3.0"):AddToBlizOptions (name, name)
-
+
LibStub ("AceConfig-3.0"):RegisterOptionsTable (name .. "-Profiles", LibStub ("AceDBOptions-3.0"):GetOptionsTable (self.db))
addon.OptionsFrame2 = LibStub ("AceConfigDialog-3.0"):AddToBlizOptions (name .. "-Profiles", "Profiles", name)
end
-
+
if (broker) then
local broker_click_function = broker.OnClick
if (not broker_click_function and options_table) then
@@ -37,7 +106,7 @@ function DF:CreateAddOn (name, global_saved, global_table, options_table, broker
InterfaceOptionsFrame_OpenToCategory (name)
end
end
-
+
local databroker = LibStub ("LibDataBroker-1.1"):NewDataObject (name, {
type = broker.type or "launcher",
icon = broker.icon or [[Interface\PvPRankBadges\PvPRank15]],
@@ -45,12 +114,12 @@ function DF:CreateAddOn (name, global_saved, global_table, options_table, broker
OnTooltipShow = broker.OnTooltipShow,
OnClick = broker_click_function
})
-
+
if (databroker and broker.Minimap and global_table.Minimap) then
LibStub ("LibDBIcon-1.0"):Register (name, databroker, addon.db.profile.Minimap)
end
end
-
+
if (addon.OnInit) then
xpcall (addon.OnInit, geterrorhandler(), addon)
end
diff --git a/Libs/DF/languages.lua b/Libs/DF/languages.lua
new file mode 100644
index 00000000..6d6a0dd9
--- /dev/null
+++ b/Libs/DF/languages.lua
@@ -0,0 +1,23 @@
+
+
+
+local DF = _G ["DetailsFramework"]
+if (not DF or not DetailsFrameworkCanLoad) then
+ return
+end
+
+--create namespace
+DF.Language = {
+ registeredLanguages = {},
+}
+
+function DF.Language.GetWordsFromLanguage(self, language, addonGlobalName)
+
+end
+
+function DF.Language.RegisterLanguage(self, addonGlobalName, language)
+ local addonObject = _G[addonGlobalName]
+ addonObject.__language = addonObject.__language or {}
+ addonObject.__language[language] = {}
+ return addonObject.__language[language]
+end
\ No newline at end of file
diff --git a/Libs/DF/load.xml b/Libs/DF/load.xml
index 7e8e3b22..f3cb53be 100644
--- a/Libs/DF/load.xml
+++ b/Libs/DF/load.xml
@@ -10,6 +10,8 @@
+
+
diff --git a/Libs/DF/savedvars.lua b/Libs/DF/savedvars.lua
new file mode 100644
index 00000000..87e85f45
--- /dev/null
+++ b/Libs/DF/savedvars.lua
@@ -0,0 +1,183 @@
+
+--stopped doing the duplicate savedTable
+
+local DF = _G ["DetailsFramework"]
+if (not DF or not DetailsFrameworkCanLoad) then
+ return
+end
+
+--create namespace
+DF.SavedVars = {}
+
+function DF.SavedVars.CreateNewSavedTable(dbTable, savedTableName)
+ local defaultVars = dbTable.defaultSavedVars
+ local newSavedTable = DF.table.deploy({}, defaultVars)
+
+ dbTable.profiles[savedTableName] = newSavedTable
+ return newSavedTable
+end
+
+function DF.SavedVars.GetOrCreateAddonSavedTablesPlayerList(addonFrame)
+ local addonGlobalSavedTable = _G[addonFrame.savedVarsName]
+ local playerList = addonGlobalSavedTable.__savedVarsByGUID
+ if (not playerList) then
+ addonGlobalSavedTable.__savedVarsByGUID = {}
+ end
+
+ return addonGlobalSavedTable.__savedVarsByGUID
+end
+
+function DF.SavedVars.LoadSavedVarsForPlayer(addonFrame)
+ local playerSerial = UnitGUID("player")
+
+ --savedTableObject is equivalent of "addon.db"
+ local dbTable = DF.SavedVars.CreateSavedVarsTable(addonFrame, addonFrame.__savedVarsDefaultTemplate)
+ addonFrame.__savedVarsDefaultTemplate = nil
+ addonFrame.db = dbTable
+
+ --load players list
+ local savedVarsName = DF.SavedVars.GetOrCreateAddonSavedTablesPlayerList(addonFrame)
+
+ local playerSavedTableName = savedVarsName[playerSerial]
+ if (not playerSavedTableName) then
+ savedVarsName[playerSerial] = "Default"
+ playerSavedTableName = savedVarsName[playerSerial]
+ end
+
+ local savedTable = addonFrame.db:GetSavedTable(playerSavedTableName)
+ if (not savedTable) then
+ --create a new saved table for this character
+ savedTable = addonFrame.db:CreateNewSavedTable(playerSavedTableName)
+ end
+
+ addonFrame.db.profile = savedTable
+ addonFrame.db.currentSavedTableName = playerSavedTableName
+
+ return savedTable
+end
+
+
+--base functions
+function DF.SavedVars.SetSavedTable(dbTable, savedTableName, createIfNonExistant)
+ local savedTableToBeApplied = dbTable:GetSavedTable(savedTableName)
+
+ if (savedTableToBeApplied) then
+ --callback unload profile table
+ local currentSavedTable = dbTable:GetSavedTable(dbTable:GetCurrentSavedTableName())
+ dbTable:TriggerCallback("OnProfileUnload", currentSavedTable)
+
+ dbTable.profile = savedTableToBeApplied
+ dbTable:TriggerCallback("OnProfileLoad", savedTableToBeApplied)
+
+ else
+ if (createIfNonExistant) then
+ local newSavedTable = dbTable:CreateNewSavedTable(savedTableName)
+
+ --callback unload profile table
+ local currentSavedTable = dbTable:GetSavedTable(dbTable:GetCurrentSavedTableName())
+ dbTable:TriggerCallback("OnProfileUnload", currentSavedTable)
+
+ dbTable.profile = newSavedTable
+ dbTable:TriggerCallback("OnProfileLoad", newSavedTable)
+
+ else
+ DF:Msg("profile does not exists", savedTableName)
+ return
+ end
+ end
+end
+
+function DF.SavedVars.GetSavedTables(dbTable)
+ return dbTable.profiles
+end
+
+function DF.SavedVars.GetSavedTable(dbTable, savedTableName)
+ local profiles = dbTable:GetSavedTables()
+ return profiles[savedTableName]
+end
+
+function DF.SavedVars.GetCurrentSavedTableName(dbTable)
+ return dbTable.currentSavedTableName
+end
+
+--duplicate savedTable
+function DF.SavedVars.DuplicateSavedTable(dbTable, savedTableName)
+ local originalSavedTable = dbTable:GetSavedTable(savedTableName)
+ if (originalSavedTable) then
+ local newSavedTable = DF.table.copy({}, originalSavedTable)
+
+ end
+end
+
+--callbacks
+function DF.SavedVars.TriggerCallback(dbTable, callbackName, savedTable)
+ local registeredCallbacksTable = dbTable.registeredCallbacks[callbackName]
+ for i = 1, #registeredCallbacksTable do
+ local callback = registeredCallbacksTable[i]
+ DF:CoreDispatch(dbTable.addonFrame.__name, callback.func, savedTable, unpack(callback.payload))
+ end
+end
+
+function DF.SavedVars.RegisterCallback(dbTable, callbackName, func, ...)
+ local registeredCallbacksTable = dbTable.registeredCallbacks[callbackName]
+ if (registeredCallbacksTable) then
+ --check for duplicates
+ for i = 1, #registeredCallbacksTable do
+ if (registeredCallbacksTable[i].func == func) then
+ return
+ end
+ end
+
+ --register
+ registeredCallbacksTable[#registeredCallbacksTable+1] = {func = func, payload = {...}}
+
+ return true
+ end
+end
+
+function DF.SavedVars.UnregisterCallback(dbTable, callbackName, func)
+ local registeredCallbacksTable = dbTable.registeredCallbacks[callbackName]
+ if (registeredCallbacksTable) then
+ for i = 1, #registeredCallbacksTable do
+ if (registeredCallbacksTable[i].func == func) then
+ tremove(registeredCallbacksTable, i)
+ return true
+ end
+ end
+ end
+end
+
+function DF.SavedVars.CreateSavedVarsTable(addonFrame, templateTable)
+ local dbTable = {
+ profiles = {},
+ defaultSavedVars = templateTable,
+ currentSavedTableName = "",
+ addonFrame = addonFrame,
+
+ --methods
+ GetSavedTable = DF.SavedVars.GetSavedTable,
+ SetSavedTable = DF.SavedVars.SetSavedTable,
+ GetSavedTables = DF.SavedVars.GetSavedTables,
+ GetCurrentSavedTableName = DF.SavedVars.GetCurrentSavedTableName,
+ CreateNewSavedTable = DF.SavedVars.CreateNewSavedTable,
+ TriggerCallback = DF.SavedVars.TriggerCallback,
+
+ --back compatibility with ace3DB
+ GetCurrentProfile = DF.SavedVars.GetCurrentSavedTableName,
+ GetProfile = DF.SavedVars.GetSavedTable,
+ GetProfiles = DF.SavedVars.GetSavedTables,
+ SetProfile = DF.SavedVars.SetSavedTable,
+ RegisterCallback = DF.SavedVars.RegisterCallback,
+
+ registeredCallbacks = {
+ ["OnProfileLoad"] = {},
+ ["OnProfileUnload"] = {},
+ ["OnProfileCopied"] = {},
+ ["OnProfileReset"] = {},
+ ["OnDatabaseLoad"] = {},
+ ["OnDatabaseShutdown"] = {},
+ },
+ }
+
+ return dbTable
+end
diff --git a/boot.lua b/boot.lua
index 8745f1e9..3288472f 100644
--- a/boot.lua
+++ b/boot.lua
@@ -4,8 +4,8 @@
_ = nil
_detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0")
- _detalhes.build_counter = 8000
- _detalhes.alpha_build_counter = 8000 --if this is higher than the regular counter, use it instead
+ _detalhes.build_counter = 8001
+ _detalhes.alpha_build_counter = 8001 --if this is higher than the regular counter, use it instead
_detalhes.game_version = "v9.0.1"
_detalhes.userversion = "v9.0.1." .. _detalhes.build_counter
_detalhes.realversion = 144 --core version, this is used to check API version for scripts and plugins (see alias below)
@@ -28,6 +28,10 @@ do
local Loc = _G.LibStub("AceLocale-3.0"):GetLocale( "Details" )
local news = {
+ {"v9.0.1.8001.144", "November 30rd, 2020"},
+ "Added back the report to bnet friend.",
+ "@Flamanis: fixed issues on custom displays.",
+
{"v9.0.1.7950.144", "November 3rd, 2020"},
"Added the baseline for the Coach feature, for testing use '/details coach', all users in the raid must have details! up to date.",
"Added container_spells:GetOrCreateSpell(id, shouldCreate, token).",
diff --git a/classes/class_instance.lua b/classes/class_instance.lua
index 08f3cca2..e6996e50 100644
--- a/classes/class_instance.lua
+++ b/classes/class_instance.lua
@@ -3433,8 +3433,8 @@ function _detalhes:envia_relatorio (linhas, custom)
_SendChatMessage (timerObject.Arg1, timerObject.Arg2, timerObject.Arg3, timerObject.Arg4)
end
- local send_report_bnet = function (timerObject)
- BNSendWhisper (timerObject.Arg1, timerObject.Arg2)
+ local sendReportBnet = function (timerObject)
+ BNSendWhisper(timerObject.Arg1, timerObject.Arg2)
end
local delay = 200
@@ -3459,13 +3459,12 @@ function _detalhes:envia_relatorio (linhas, custom)
return
elseif (is_btag) then
-
- local id = to_who:gsub ((".*|"), "")
- local presenceID = tonumber (id)
+ local bnetAccountID = to_who:gsub ((".*|"), "")
+ bnetAccountID = tonumber(bnetAccountID)
for i = 1, #linhas do
- local timer = C_Timer.NewTimer (i * delay / 1000, send_report_bnet)
- timer.Arg1 = presenceID
+ local timer = C_Timer.NewTimer (i * delay / 1000, sendReportBnet)
+ timer.Arg1 = bnetAccountID
timer.Arg2 = linhas[i]
end
diff --git a/frames/window_playerbreakdown.lua b/frames/window_playerbreakdown.lua
index fd3052e1..ac548462 100644
--- a/frames/window_playerbreakdown.lua
+++ b/frames/window_playerbreakdown.lua
@@ -4792,6 +4792,10 @@ function gump:CriaJanelaInfo()
tabOBject.player = playerObject
tabOBject.spells_amt = my_spells_total
+ if (not info.instancia.showing) then
+ return false
+ end
+
for index, actor in _ipairs (info.instancia.showing [info.atributo]._ActorTable) do
if (actor.classe == class and actor ~= playerObject) then
diff --git a/frames/window_report.lua b/frames/window_report.lua
index 9a15b800..47d470c6 100644
--- a/frames/window_report.lua
+++ b/frames/window_report.lua
@@ -324,7 +324,7 @@ local function cria_drop_down (este_gump)
local iconsize = {16, 16}
- local lista = {
+ local baseChannels = {
{Loc ["STRING_REPORTFRAME_PARTY"], "PARTY", function() return GetNumSubgroupMembers() > 0 end, {iconsize = iconsize, icon = [[Interface\FriendsFrame\UI-Toast-ToastIcons]], coords = {0.53125, 0.7265625, 0.078125, 0.40625}, color = {0.66, 0.65, 1}}},
{Loc ["STRING_REPORTFRAME_RAID"], "RAID", _IsInRaid, {iconsize = iconsize, icon = [[Interface\FriendsFrame\UI-Toast-ToastIcons]], coords = {0.53125, 0.7265625, 0.078125, 0.40625}, color = {1, 0.49, 0}}},
{Loc ["STRING_REPORTFRAME_GUILD"], "GUILD", _IsInGuild, {iconsize = iconsize, icon = [[Interface\FriendsFrame\UI-Toast-ToastIcons]], coords = {0.8046875, 0.96875, 0.125, 0.390625}, color = {0.25, 0.98, 0.25}}},
@@ -340,31 +340,36 @@ local function cria_drop_down (este_gump)
end
local build_list = function()
- local output_array = {}
+ local reportChannelsTable = {}
- for index, case in ipairs (lista) do
- if (not case [3] or case [3]()) then
- output_array [#output_array + 1] = {iconsize = case [4].iconsize, value = case [2], label = case [1], onclick = on_click, icon = case [4].icon, texcoord = case [4].coords, iconcolor = case [4].color}
+ for index, channelInfo in ipairs (baseChannels) do
+ if (not channelInfo [3] or channelInfo[3]()) then
+ reportChannelsTable[#reportChannelsTable + 1] = {iconsize = channelInfo [4].iconsize, value = channelInfo [2], label = channelInfo [1], onclick = on_click, icon = channelInfo [4].icon, texcoord = channelInfo [4].coords, iconcolor = channelInfo [4].color}
end
end
local channels = {_GetChannelList()} --> coloca o resultado em uma tabela .. {id1, canal1, id2, canal2}
--09/august/2018: GetChannelList passed to return 3 values for each channel instead of 2
for i = 1, #channels, 3 do --> total de canais
- output_array [#output_array + 1] = {iconsize = iconsize, value = "CHANNEL|"..channels [i+1], label = channels [i]..". "..channels [i+1], onclick = on_click, icon = [[Interface\FriendsFrame\UI-Toast-ToastIcons]], texcoord = {0.3046875, 0.4453125, 0.109375, 0.390625}, iconcolor = {149/255, 112/255, 112/255}}
+ reportChannelsTable [#reportChannelsTable + 1] = {iconsize = iconsize, value = "CHANNEL|"..channels [i+1], label = channels [i]..". "..channels [i+1], onclick = on_click, icon = [[Interface\FriendsFrame\UI-Toast-ToastIcons]], texcoord = {0.3046875, 0.4453125, 0.109375, 0.390625}, iconcolor = {149/255, 112/255, 112/255}}
end
- local bnet_friends = {}
-
- local BnetFriends = BNGetNumFriends()
- for i = 1, BnetFriends do
- --local presenceID, presenceName, battleTag, isBattleTagPresence, toonName, toonID, client, isOnline, lastOnline, isAFK, isDND, messageText, noteText, isRIDFriend, broadcastTime, canSoR = BNGetFriendInfo (i)
- --if (isOnline) then
- -- output_array [#output_array + 1] = {iconsize = iconsize, value = "REALID|" .. presenceID, label = presenceName, onclick = on_click, icon = [[Interface\FriendsFrame\Battlenet-Battleneticon]], texcoord = {0.125, 0.875, 0.125, 0.875}, iconcolor = {1, 1, 1}}
- --end
+ local _, numBNetOnline = BNGetNumFriends()
+ for i = 1, numBNetOnline do
+ local accountInfo = C_BattleNet.GetFriendAccountInfo(i)
+ local gameAccountInfo = accountInfo and accountInfo.gameAccountInfo
+
+ if (gameAccountInfo) then
+ local isOnline = gameAccountInfo.isOnline
+ if (isOnline) then
+ local bTag = accountInfo.battleTag
+ local bTagNoNumber = bTag:gsub("#.*", "")
+ reportChannelsTable[#reportChannelsTable + 1] = {iconsize = iconsize, value = "REALID|" .. accountInfo.bnetAccountID, label = bTagNoNumber, onclick = on_click, icon = [[Interface\FriendsFrame\Battlenet-Battleneticon]], texcoord = {0.125, 0.875, 0.125, 0.875}, iconcolor = {1, 1, 1}}
+ end
+ end
end
- return output_array
+ return reportChannelsTable
end
este_gump.dropdown_func = build_list
@@ -377,7 +382,7 @@ local function cria_drop_down (este_gump)
local last_selected = _detalhes.report_where
local check_func
- for i, t in ipairs (lista) do
+ for i, t in ipairs (baseChannels) do
if (t[2] == last_selected) then
check_func = t[3]
break