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.

612 lines
20 KiB

local UnitGroupRolesAssigned = _G.DetailsFramework.UnitGroupRolesAssigned
local wipe = _G.wipe
local C_Timer = _G.C_Timer
local CreateFrame = _G.CreateFrame
local Loc = _G.LibStub("AceLocale-3.0"):GetLocale("Details")
--start funtion
function Details:StartMeUp() --I'll never stop!
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> row single click, this determines what happen when the user click on a bar
--> single click row function replace
--damage, dps, damage taken, friendly fire
self.row_singleclick_overwrite [1] = {true, true, true, true, self.atributo_damage.ReportSingleFragsLine, self.atributo_damage.ReportEnemyDamageTaken, self.atributo_damage.ReportSingleVoidZoneLine, self.atributo_damage.ReportSingleDTBSLine}
--healing, hps, overheal, healing taken
self.row_singleclick_overwrite [2] = {true, true, true, true, false, self.atributo_heal.ReportSingleDamagePreventedLine}
--mana, rage, energy, runepower
self.row_singleclick_overwrite [3] = {true, true, true, true}
--cc breaks, ress, interrupts, dispells, deaths
self.row_singleclick_overwrite [4] = {true, true, true, true, self.atributo_misc.ReportSingleDeadLine, self.atributo_misc.ReportSingleCooldownLine, self.atributo_misc.ReportSingleBuffUptimeLine, self.atributo_misc.ReportSingleDebuffUptimeLine}
function self:ReplaceRowSingleClickFunction(attribute, sub_attribute, func)
assert(type(attribute) == "number" and attribute >= 1 and attribute <= 4, "ReplaceRowSingleClickFunction expects a attribute index on #1 argument.")
assert(type(sub_attribute) == "number" and sub_attribute >= 1 and sub_attribute <= 10, "ReplaceRowSingleClickFunction expects a sub attribute index on #2 argument.")
assert(type(func) == "function", "ReplaceRowSingleClickFunction expects a function on #3 argument.")
self.row_singleclick_overwrite [attribute] [sub_attribute] = func
return true
end
self.click_to_report_color = {1, 0.8, 0, 1}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> initialize
--build frames
--plugin container
self:CreatePluginWindowContainer()
self:InitializeForge() --to install into the container plugin
self:InitializeRaidHistoryWindow()
--self:InitializeOptionsWindow()
C_Timer.After(2, function()
self:InitializeAuraCreationWindow()
end)
self:InitializeCustomDisplayWindow()
self:InitializeAPIWindow()
self:InitializeRunCodeWindow()
self:InitializePlaterIntegrationWindow()
self:InitializeMacrosWindow()
if (self.ocd_tracker.show_options) then
self:InitializeCDTrackerWindow()
end
--custom window
self.custom = self.custom or {}
--micro button alert
--"MainMenuBarMicroButton" has been removed on 9.0
self.MicroButtonAlert = CreateFrame("frame", "DetailsMicroButtonAlert", UIParent)
self.MicroButtonAlert.Text = self.MicroButtonAlert:CreateFontString(nil, "overlay", "GameFontNormal")
self.MicroButtonAlert.Text:SetPoint("center")
self.MicroButtonAlert:Hide()
--actor details window
self.playerDetailWindow = self.gump:CriaJanelaInfo()
Details.FadeHandler.Fader(self.playerDetailWindow, 1)
--copy and paste window
self:CreateCopyPasteWindow()
self.CreateCopyPasteWindow = nil
--> start instances
if (self:GetNumInstancesAmount() == 0) then
self:CriarInstancia()
end
self:GetLowerInstanceNumber()
--> start time machine
self.timeMachine:Ligar()
--> update abbreviation shortcut
self.atributo_damage:UpdateSelectedToKFunction()
self.atributo_heal:UpdateSelectedToKFunction()
self.atributo_energy:UpdateSelectedToKFunction()
self.atributo_misc:UpdateSelectedToKFunction()
self.atributo_custom:UpdateSelectedToKFunction()
--> start instances updater
self:CheckSwitchOnLogon()
function _detalhes:ScheduledWindowUpdate(forced)
if (not forced and _detalhes.in_combat) then
return
end
_detalhes.scheduled_window_update = nil
_detalhes:RefreshMainWindow(-1, true)
end
function _detalhes:ScheduleWindowUpdate(time, forced)
if (_detalhes.scheduled_window_update) then
Details.Schedules.Cancel(_detalhes.scheduled_window_update)
_detalhes.scheduled_window_update = nil
end
--_detalhes.scheduled_window_update = _detalhes:ScheduleTimer("ScheduledWindowUpdate", time or 1, forced)
_detalhes.scheduled_window_update = Details.Schedules.NewTimer(time or 1, Details.ScheduledWindowUpdate, Details, forced)
end
self:RefreshMainWindow(-1, true)
Details:RefreshUpdater()
for index = 1, #self.tabela_instancias do
local instance = self.tabela_instancias[index]
if (instance:IsAtiva()) then
Details.Schedules.NewTimer(1, Details.RefreshBars, Details, instance)
Details.Schedules.NewTimer(1, Details.InstanceReset, Details, instance)
Details.Schedules.NewTimer(1, Details.InstanceRefreshRows, Details, instance)
--self:ScheduleTimer("RefreshBars", 1, instance)
--self:ScheduleTimer("InstanceReset", 1, instance)
--self: ("InstanceRefreshRows", 1, instance)
end
end
function self:RefreshAfterStartup()
self:RefreshMainWindow(-1, true)
local lower_instance = _detalhes:GetLowerInstanceNumber()
for index = 1, #self.tabela_instancias do
local instance = self.tabela_instancias [index]
if(instance:IsAtiva()) then
--> refresh wallpaper
if(instance.wallpaper.enabled) then
instance:InstanceWallpaper(true)
else
instance:InstanceWallpaper(false)
end
--> refresh desaturated icons if is lower instance
if(index == lower_instance) then
instance:DesaturateMenu()
instance:SetAutoHideMenu(nil, nil, true)
end
end
end
--> refresh lower instance plugin icons and skin
_detalhes.ToolBar:ReorganizeIcons()
--> refresh skin for other windows
if(lower_instance) then
for i = lower_instance+1, #self.tabela_instancias do
local instance = self:GetInstance(i)
if (instance and instance.baseframe and instance.ativa) then
instance:ChangeSkin()
end
end
end
self.RefreshAfterStartup = nil
function _detalhes:CheckWallpaperAfterStartup()
if (not _detalhes.profile_loaded) then
Details.Schedules.NewTimer(5, Details.CheckWallpaperAfterStartup, Details)
--return _detalhes:ScheduleTimer ("CheckWallpaperAfterStartup", 2)
end
for i = 1, self.instances_amount do
local instance = self:GetInstance (i)
if (instance and instance:IsEnabled()) then
if (not instance.wallpaper.enabled) then
instance:InstanceWallpaper (false)
end
instance.do_not_snap = true
self.move_janela_func (instance.baseframe, true, instance, true)
self.move_janela_func (instance.baseframe, false, instance, true)
instance.do_not_snap = false
end
end
self.CheckWallpaperAfterStartup = nil
_detalhes.profile_loaded = nil
end
--_detalhes:ScheduleTimer ("CheckWallpaperAfterStartup", 5)
Details.Schedules.NewTimer(5, Details.CheckWallpaperAfterStartup, Details)
end
--self:ScheduleTimer ("RefreshAfterStartup", 5)
Details.Schedules.NewTimer(5, Details.RefreshAfterStartup, Details)
--start garbage collector
self.ultima_coleta = 0
self.intervalo_coleta = 720
self.intervalo_memoria = 180
--self.garbagecollect = self:ScheduleRepeatingTimer ("IniciarColetaDeLixo", self.intervalo_coleta) --deprecated
self.garbagecollect = Details.Schedules.NewTicker(self.intervalo_coleta, Details.IniciarColetaDeLixo, Details)
self.next_memory_check = _G.time()+self.intervalo_memoria
--player role
self.last_assigned_role = UnitGroupRolesAssigned ("player")
--> start parser
--> load parser capture options
self:CaptureRefresh()
--> register parser events
self.listener:RegisterEvent ("PLAYER_REGEN_DISABLED")
self.listener:RegisterEvent ("PLAYER_REGEN_ENABLED")
self.listener:RegisterEvent ("UNIT_PET")
self.listener:RegisterEvent ("GROUP_ROSTER_UPDATE")
self.listener:RegisterEvent ("INSTANCE_ENCOUNTER_ENGAGE_UNIT")
self.listener:RegisterEvent ("ZONE_CHANGED_NEW_AREA")
self.listener:RegisterEvent ("PLAYER_ENTERING_WORLD")
self.listener:RegisterEvent ("ENCOUNTER_START")
self.listener:RegisterEvent ("ENCOUNTER_END")
self.listener:RegisterEvent ("START_TIMER")
self.listener:RegisterEvent ("UNIT_NAME_UPDATE")
self.listener:RegisterEvent ("PLAYER_ROLES_ASSIGNED")
self.listener:RegisterEvent ("ROLE_CHANGED_INFORM")
self.listener:RegisterEvent ("UNIT_FACTION")
if (not _G.DetailsFramework.IsTimewalkWoW()) then
self.listener:RegisterEvent ("PET_BATTLE_OPENING_START")
self.listener:RegisterEvent ("PET_BATTLE_CLOSE")
self.listener:RegisterEvent ("PLAYER_SPECIALIZATION_CHANGED")
self.listener:RegisterEvent ("PLAYER_TALENT_UPDATE")
self.listener:RegisterEvent ("CHALLENGE_MODE_START")
self.listener:RegisterEvent ("CHALLENGE_MODE_COMPLETED")
end
self.parser_frame:RegisterEvent ("COMBAT_LOG_EVENT_UNFILTERED")
--update is in group
self.details_users = {}
self.in_group = IsInGroup() or IsInRaid()
--done
self.initializing = nil
--scan pets
_detalhes:SchedulePetUpdate(1)
--send messages gathered on initialization
--self:ScheduleTimer ("ShowDelayMsg", 10)
Details.Schedules.NewTimer(10, Details.ShowDelayMsg, Details)
--send instance open signal
for index, instancia in _detalhes:ListInstances() do
if (instancia.ativa) then
self:SendEvent ("DETAILS_INSTANCE_OPEN", nil, instancia)
end
end
--send details startup done signal
function self:AnnounceStartup()
self:SendEvent ("DETAILS_STARTED", "SEND_TO_ALL")
if (_detalhes.in_group) then
_detalhes:SendEvent ("GROUP_ONENTER")
else
_detalhes:SendEvent ("GROUP_ONLEAVE")
end
_detalhes.last_zone_type = "INIT"
_detalhes.parser_functions:ZONE_CHANGED_NEW_AREA()
_detalhes.AnnounceStartup = nil
end
--self:ScheduleTimer ("AnnounceStartup", 5)
Details.Schedules.NewTimer(5, Details.AnnounceStartup, Details)
if (_detalhes.failed_to_load) then
_detalhes:CancelTimer (_detalhes.failed_to_load)
_detalhes.failed_to_load = nil
end
--announce alpha version
function self:AnnounceVersion()
for index, instancia in _detalhes:ListInstances() do
if (instancia.ativa) then
Details.FadeHandler.Fader(instancia._version, "in", 0.1)
end
end
end
--check version
_detalhes:CheckVersion(true)
--restore cooltip anchor position, this is for the custom anchor in the screen
_G.DetailsTooltipAnchor:Restore()
--check is this is the first run
if (self.is_first_run) then
if (#self.custom == 0) then
_detalhes:AddDefaultCustomDisplays()
end
_detalhes:FillUserCustomSpells()
end
--check is this is the first run of this version
if (self.is_version_first_run) then
local lower_instance = _detalhes:GetLowerInstanceNumber()
if (lower_instance) then
lower_instance = _detalhes:GetInstance (lower_instance)
if (lower_instance) then
--check if there's changes in the size of the news string
if (Details.last_changelog_size < #Loc["STRING_VERSION_LOG"]) then
Details.last_changelog_size = #Loc["STRING_VERSION_LOG"]
if (Details.auto_open_news_window) then
C_Timer.After(5, function()
Details.OpenNewsWindow()
end)
end
if (lower_instance) then
_G.C_Timer.After(10, function()
if (lower_instance:IsEnabled()) then
lower_instance:InstanceAlert(Loc ["STRING_VERSION_UPDATE"], {[[Interface\GossipFrame\AvailableQuestIcon]], 16, 16, false}, 60, {_detalhes.OpenNewsWindow}, true)
Details:Msg("A new version has been installed: /details news") --localize-me
end
end)
end
end
end
end
_detalhes:FillUserCustomSpells()
_detalhes:AddDefaultCustomDisplays()
end
local lower = _detalhes:GetLowerInstanceNumber()
if (lower) then
local instance = _detalhes:GetInstance (lower)
if (instance) then
--in development
local dev_icon = instance.bgdisplay:CreateTexture (nil, "overlay")
dev_icon:SetWidth (40)
dev_icon:SetHeight (40)
dev_icon:SetPoint ("bottomleft", instance.baseframe, "bottomleft", 4, 8)
dev_icon:SetAlpha (.3)
local dev_text = instance.bgdisplay:CreateFontString (nil, "overlay", "GameFontHighlightSmall")
dev_text:SetHeight (64)
dev_text:SetPoint ("left", dev_icon, "right", 5, 0)
dev_text:SetTextColor (1, 1, 1)
dev_text:SetAlpha (.3)
--version
Details.FadeHandler.Fader (instance._version, 0)
instance._version:SetText ("Details! " .. _detalhes.userversion .. " (core " .. self.realversion .. ")")
instance._version:SetTextColor (1, 1, 1, .35)
instance._version:SetPoint ("bottomleft", instance.baseframe, "bottomleft", 5, 1)
if (instance.auto_switch_to_old) then
instance:SwitchBack()
end
function _detalhes:FadeStartVersion()
Details.FadeHandler.Fader (dev_icon, "in", 2)
Details.FadeHandler.Fader (dev_text, "in", 2)
Details.FadeHandler.Fader (instance._version, "in", 2)
end
Details.Schedules.NewTimer(12, Details.FadeStartVersion, Details)
end
end
function _detalhes:OpenOptionsWindowAtStart()
--_detalhes:OpenOptionsWindow (_detalhes.tabela_instancias[1])
--print (_G ["DetailsClearSegmentsButton1"]:GetSize())
--_detalhes:OpenCustomDisplayWindow()
--_detalhes:OpenWelcomeWindow()
end
--_detalhes:ScheduleTimer ("OpenOptionsWindowAtStart", 2)
Details.Schedules.NewTimer(2, Details.OpenOptionsWindowAtStart, Details)
--_detalhes:OpenCustomDisplayWindow()
--> minimap
pcall (_detalhes.RegisterMinimap, Details)
--hot corner addon
function _detalhes:RegisterHotCorner()
_detalhes:DoRegisterHotCorner()
end
--_detalhes:ScheduleTimer ("RegisterHotCorner", 5)
Details.Schedules.NewTimer(5, Details.RegisterHotCorner, Details)
--restore mythic dungeon state
_detalhes:RestoreState_CurrentMythicDungeonRun()
--open profiler
_detalhes:OpenProfiler()
--start announcers
_detalhes:StartAnnouncers()
--open welcome
if (self.is_first_run) then
_G.C_Timer.After (1, function() --wait details full load the rest of the systems before executing the welcome window
_detalhes:OpenWelcomeWindow()
end)
end
--load broadcaster tools
_detalhes:LoadFramesForBroadcastTools()
_detalhes:BrokerTick()
--boss mobs callbacks (DBM and BigWigs)
Details.Schedules.NewTimer(5, Details.BossModsLink, Details)
--limit item level life for 24Hs
local now = _G.time()
for guid, t in pairs (_detalhes.item_level_pool) do
if (t.time + 86400 < now) then
_detalhes.item_level_pool [guid] = nil
end
end
--dailly reset of the cache for talents and specs
local today = _G.date("%d")
if (_detalhes.last_day ~= today) then
wipe(_detalhes.cached_specs)
wipe(_detalhes.cached_talents)
end
--> get the player spec
C_Timer.After(2, _detalhes.parser_functions.PLAYER_SPECIALIZATION_CHANGED)
--embed windows on the chat window
_detalhes.chat_embed:CheckChatEmbed(true)
--save the time when the addon finished loading
_detalhes.AddOnStartTime = _G.GetTime()
if (_detalhes.player_details_window.skin ~= "ElvUI") then
local reset_player_detail_window = function()
_detalhes:ApplyPDWSkin("ElvUI")
end
C_Timer.After(2, reset_player_detail_window)
end
--coach feature startup
Details.Coach.StartUp()
--force the group edit be always enabled when Details! starts
_detalhes.options_group_edit = true
--shutdown pre-pot announcer
Details.announce_prepots.enabled = false
--disable the min healing to show
Details.deathlog_healingdone_min = 1
--remove standard skin on 9.0.1
_detalhes.standard_skin = false
--enforce to show 6 abilities on the tooltip
--_detalhes.tooltip.tooltip_max_abilities = 6 freeeeeedooommmmm
--Plater integration
C_Timer.After(2, function()
_detalhes:RefreshPlaterIntegration()
end)
--show warning message about classic beta
if (not DetailsFramework.IsClassicWow()) then
else
print ("|CFFFFFF00[Details!]: you're using Details! for RETAIL on Classic WOW, please get the classic version (Details! Damage Meter Classic WoW), if you need help see our Discord (/details discord).")
end
Details:InstallHook("HOOK_DEATH", Details.Coach.Client.SendMyDeath)
if (math.random(10) == 1) then
Details:Msg("use '/details me' macro to open the player breakdown for you!")
end
if (not DetailsFramework.IsTimewalkWoW()) then
Details.cached_specs[UnitGUID("player")] = GetSpecializationInfo(GetSpecialization() or 0)
end
if (not Details.data_wipes_exp["9"]) then
wipe(Details.encounter_spell_pool or {})
wipe(Details.boss_mods_timers or {})
wipe(Details.spell_school_cache or {})
wipe(Details.spell_pool or {})
wipe(Details.npcid_pool or {})
wipe(Details.current_exp_raid_encounters or {})
Details.data_wipes_exp["9"] = true
end
Details.boss_mods_timers.encounter_timers_dbm = Details.boss_mods_timers.encounter_timers_dbm or {}
Details.boss_mods_timers.encounter_timers_bw = Details.boss_mods_timers.encounter_timers_bw or {}
--clear overall data on new session
if (_detalhes.overall_clear_logout) then
_detalhes.tabela_overall = _detalhes.combate:NovaTabela()
end
if (not DetailsFramework.IsTimewalkWoW()) then
--wipe overall on torghast - REMOVE ON 10.0
local torghastTracker = CreateFrame("frame")
torghastTracker:RegisterEvent("JAILERS_TOWER_LEVEL_UPDATE")
torghastTracker:SetScript("OnEvent", function(self, event, level, towerType)
if (level == 1) then
if (Details.overall_clear_newtorghast) then
Details.historico:resetar_overall()
Details:Msg ("overall data are now reset.") --localize-me
end
end
end)
end
if (DetailsFramework.IsTBCWow()) then
--remover isso em versões mais atualizadas
if (_detalhes.bcc_counter == 18 or _detalhes.bcc_counter == 19) then
_detalhes.trash_auto_remove = false
end
local originalPosition
local isOnOriginalPosition = true
local taintWarning = CreateFrame ("frame", nil, UIParent, "BackdropTemplate")
taintWarning:SetSize (500, 35)
taintWarning:SetFrameStrata ("low")
DetailsFramework:ApplyStandardBackdrop(taintWarning)
local warningMessage = taintWarning:CreateFontString (nil, "overlay", "GameFontNormal")
warningMessage:SetText ("< right click and choose 'Enter Battle' if 'Enter Battle' button does not work")
C_Timer.NewTicker(3, function() -- default = 1
if (StaticPopup1:IsShown() or StaticPopup2:IsShown()) then
if (StaticPopup1.which == "ADDON_ACTION_FORBIDDEN" or (StaticPopup2 and StaticPopup2:IsShown() and StaticPopup2.which == "ADDON_ACTION_FORBIDDEN")) then
if (StaticPopup2:IsShown()) then
if (StaticPopup2.which == "ADDON_ACTION_FORBIDDEN") then
StaticPopup_Hide("ADDON_ACTION_FORBIDDEN")
end
end
taintWarning:Show()
taintWarning:SetPoint ("topleft", StaticPopup1, "bottomleft", 0, -10)
if (MiniMapBattlefieldFrame:IsShown() and not Details.DontMoveMinimapIconOnBattlegroundError)then
if (not originalPosition) then
local a = {}
for i = 1, MiniMapBattlefieldFrame:GetNumPoints() do
a[#a + 1] = {MiniMapBattlefieldFrame:GetPoint(i)}
end
originalPosition = a
end
MiniMapBattlefieldFrame:ClearAllPoints()
MiniMapBattlefieldFrame:SetPoint("left", taintWarning, "left", 10, -2)
warningMessage:SetPoint ("left", MiniMapBattlefieldFrame, "right", 9, 0)
MiniMapBattlefieldFrame:SetFrameStrata("HIGH")
isOnOriginalPosition = false
end
end
else
if (originalPosition and not isOnOriginalPosition) then
MiniMapBattlefieldFrame:ClearAllPoints()
for i = 1, #originalPosition do
MiniMapBattlefieldFrame:SetPoint(unpack (originalPosition[i]))
end
taintWarning:Hide()
isOnOriginalPosition = true
end
end
end)
end
function Details:InstallOkey()
return true
end
end
_detalhes.AddOnLoadFilesTime = _G.GetTime()