From 27817f34d9c39a248a62b18e007d41f085f0b6fa Mon Sep 17 00:00:00 2001 From: Tercio Date: Wed, 18 Sep 2013 23:54:06 -0300 Subject: [PATCH] - fixed issue with healing and damage cache where both did not update. - fixed issue with micro displays were sometimes did lua error. - fixed a issue when reporting to a instance group didn't work. - fixes on siege of orgrimmar raid info. - major fixes and improvements on internal garbage collector. - added options for background alpha and window alpha. - now when editing a image, the instance background changes on-the-fly. - now if no instance have current segment when a combat start, the lower instance will switch to current. - added a option for disable the auto switch to current. - added the time type when reporting damage or healing done. - added a format phrase when reporting damage or healing done. - added a option for hide the micro display. - added options for memory were the core changes within the value. - little redesign on segments menu. --- boot.lua | 2 +- classes/classe_damage.lua | 12 +- classes/classe_energy.lua | 4 +- classes/classe_heal.lua | 15 +- classes/classe_instancia.lua | 182 ++++++- classes/classe_others.lua | 4 +- classes/container_combatentes.lua | 4 +- classes/container_historico.lua | 31 +- core/control.lua | 13 +- core/meta.lua | 182 +++++-- core/parser.lua | 181 ++++--- core/plugins_statusbar.lua | 81 ++- core/timemachine.lua | 37 +- framework/pictureedit.lua | 66 ++- framework/slider.lua | 28 ++ functions/savedata.lua | 4 + functions/slash.lua | 461 +++++++++++++++++- gumps/janela_options.lua | 181 +++++-- gumps/janela_principal.lua | 167 +++++-- gumps/janela_report.lua | 8 +- gumps/janela_welcome.lua | 232 ++++++++- images/icons.tga | Bin 251317 -> 473151 bytes images/icons2.tga | Bin 0 -> 90867 bytes locales/Details-enUS.lua | 4 + locales/Details-ptBR.lua | 3 + plugins/Details_EncounterDetails/frames.lua | 2 +- .../SiegeOfOrgrimmar.lua | 382 +++++++++++++-- startup.lua | 15 +- 28 files changed, 1982 insertions(+), 319 deletions(-) create mode 100644 images/icons2.tga diff --git a/boot.lua b/boot.lua index 9c53bd8a..7018018b 100644 --- a/boot.lua +++ b/boot.lua @@ -7,7 +7,7 @@ --> global name declaration _detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0") - _detalhes.userversion = "v1.4.0" + _detalhes.userversion = "v1.4.6" _detalhes.version = "Alpha 006" _detalhes.realversion = 6 diff --git a/classes/classe_damage.lua b/classes/classe_damage.lua index 72e8688c..b8cf3d7b 100644 --- a/classes/classe_damage.lua +++ b/classes/classe_damage.lua @@ -453,13 +453,17 @@ function atributo_damage:RefreshWindow (instancia, tabela_do_combate, forcar, ex --> organiza as tabelas - if (_detalhes.in_combat) then + if (_detalhes.in_combat and instancia.segmento == 0) then using_cache = true end - if (using_cache and instancia.segmento == 0) then + if (using_cache) then conteudo = _detalhes.cache_damage_group + if (#conteudo < 1) then + return _detalhes:EsconderBarrasNaoUsadas (instancia, showing) + end + _table_sort (conteudo, _detalhes.SortKeySimple) if (conteudo[1][keyName] < 1) then @@ -2114,8 +2118,8 @@ function atributo_damage:FF_funcao_de_criacao (_, _, link) return tabela end -function atributo_damage:ColetarLixo() - return _detalhes:ColetarLixo (class_type) +function atributo_damage:ColetarLixo (lastevent) + return _detalhes:ColetarLixo (class_type, lastevent) end local function ReconstroiMapa (tabela) diff --git a/classes/classe_energy.lua b/classes/classe_energy.lua index 662decdd..d6af65a0 100644 --- a/classes/classe_energy.lua +++ b/classes/classe_energy.lua @@ -658,8 +658,8 @@ function atributo_energy:Iniciar (iniciar) return false --retorna se o dps esta aberto ou fechado para este jogador end -function atributo_energy:ColetarLixo() - return _detalhes:ColetarLixo (class_type) +function atributo_energy:ColetarLixo (lastevent) + return _detalhes:ColetarLixo (class_type, lastevent) end local function ReconstroiMapa (tabela) diff --git a/classes/classe_heal.lua b/classes/classe_heal.lua index 8368e73e..56f1a022 100644 --- a/classes/classe_heal.lua +++ b/classes/classe_heal.lua @@ -119,7 +119,7 @@ function atributo_heal:RefreshWindow (instancia, tabela_do_combate, forcar, expo --> não há barras para mostrar -- not have something to show if (#showing._ActorTable < 1) then --> não há barras para mostrar --> colocado isso recentemente para fazer as barras de dano sumirem na troca de atributo - return _detalhes:EsconderBarrasNaoUsadas (instancia, showing) + return _detalhes:EsconderBarrasNaoUsadas (instancia, showing) end --> total @@ -205,12 +205,17 @@ function atributo_heal:RefreshWindow (instancia, tabela_do_combate, forcar, expo elseif (instancia.modo == modo_GROUP) then --> mostrando GROUP - if (_detalhes.in_combat) then + if (_detalhes.in_combat and instancia.segmento == 0) then using_cache = true end - if (using_cache and instancia.segmento == 0) then + if (using_cache) then + conteudo = _detalhes.cache_healing_group + + if (#conteudo < 1) then + return _detalhes:EsconderBarrasNaoUsadas (instancia, showing) + end _detalhes:ContainerSort (conteudo, nil, keyName) @@ -1353,8 +1358,8 @@ function atributo_heal:Iniciar (iniciar) end end -function atributo_heal:ColetarLixo() - return _detalhes:ColetarLixo (class_type) +function atributo_heal:ColetarLixo (lastevent) + return _detalhes:ColetarLixo (class_type, lastevent) end function _detalhes.refresh:r_atributo_heal (este_jogador, shadow) diff --git a/classes/classe_instancia.lua b/classes/classe_instancia.lua index 4fdc30d9..bfab84e8 100644 --- a/classes/classe_instancia.lua +++ b/classes/classe_instancia.lua @@ -620,6 +620,7 @@ function _detalhes:SnapTextures (remove) end --> cria uma janela para uma nova instância + --> search key: ~new ~nova function _detalhes:NovaInstancia (ID) -- Uma nova instância será uma extensão do acetimer somada com uma cópia da classe detalhes_funções @@ -662,6 +663,13 @@ end nova_instancia.bar_mod = 0 nova_instancia.bgdisplay_loc = 0 + nova_instancia.bg_alpha = _detalhes.default_bg_alpha + nova_instancia.bg_r = _detalhes.default_bg_color + nova_instancia.bg_g = _detalhes.default_bg_color + nova_instancia.bg_b = _detalhes.default_bg_color + + nova_instancia.auto_current = true + nova_instancia.barrasInfo["alturaReal"] = nova_instancia.barrasInfo.altura+nova_instancia.barrasInfo.espaco.entre nova_instancia.posicao = { @@ -764,12 +772,22 @@ end ------------------------------------------------------------------------------------------------------------------------ --> ao reiniciar o addon esta função é rodada para recriar a janela da instância +--> search key: ~restaura function _detalhes:RestauraJanela (index, temp) --if (index ~= self.meu_id) then --print ("DEBUG: Algo de errado, o index esta diferente do meu_id") --end + self.bg_alpha = self.bg_alpha or _detalhes.default_bg_alpha + self.bg_r = self.bg_r or _detalhes.default_bg_color + self.bg_g = self.bg_g or _detalhes.default_bg_color + self.bg_b = self.bg_b or _detalhes.default_bg_color + + if (self.auto_current == nil) then + self.auto_current = true + end + local _baseframe, _bgframe, _bgframe_display, _scrollframe = gump:CriaJanelaPrincipal (self.meu_id, self) self.baseframe = _baseframe @@ -848,19 +866,19 @@ function _detalhes:RestauraJanela (index, temp) self.StatusBarSaved.center = "DETAILS_STATUSBAR_PLUGIN_CLOCK" end local clock = _detalhes.StatusBar:CreateStatusBarChildForInstance (self, self.StatusBarSaved.center or "DETAILS_STATUSBAR_PLUGIN_CLOCK") - _detalhes.StatusBar:SetCenterPlugin (self, clock) + _detalhes.StatusBar:SetCenterPlugin (self, clock, true) if (self.StatusBarSaved.left and self.StatusBarSaved.left == "NONE") then self.StatusBarSaved.left = "DETAILS_STATUSBAR_PLUGIN_PSEGMENT" end local segment = _detalhes.StatusBar:CreateStatusBarChildForInstance (self, self.StatusBarSaved.left or "DETAILS_STATUSBAR_PLUGIN_PSEGMENT") - _detalhes.StatusBar:SetLeftPlugin (self, segment) + _detalhes.StatusBar:SetLeftPlugin (self, segment, true) if (self.StatusBarSaved.right and self.StatusBarSaved.right == "NONE") then self.StatusBarSaved.right = "DETAILS_STATUSBAR_PLUGIN_PDPS" end local dps = _detalhes.StatusBar:CreateStatusBarChildForInstance (self, self.StatusBarSaved.right or "DETAILS_STATUSBAR_PLUGIN_PDPS") - _detalhes.StatusBar:SetRightPlugin (self, dps) + _detalhes.StatusBar:SetRightPlugin (self, dps, true) -- if (not self.last_modo) then @@ -909,6 +927,20 @@ function _detalhes:RefreshBars (instance) end end +function _detalhes:SetBackgroundColor (...) + local r, g, b = gump:ParseColors (...) + self.bgdisplay:SetBackdropColor (r, g, b, self.bg_alpha or _detalhes.default_bg_alpha) + self.bg_r = r + self.bg_g = g + self.bg_b = b +end + +function _detalhes:SetBackgroundAlpha (alpha) + alpha = alpha or _detalhes.default_bg_alpha + self.bgdisplay:SetBackdropColor (self.bg_r or _detalhes.default_bg_color, self.bg_g or _detalhes.default_bg_color, self.bg_b or _detalhes.default_bg_color, alpha) + self.bg_alpha = alpha +end + function _detalhes:GetSize() return self.bgframe:GetWidth(), self.bgframe:GetHeight() end @@ -934,6 +966,33 @@ end ------------------------------------------------------------------------------------------------------------------------ +function _detalhes:HaveOneCurrentInstance() + + local have = false + for _, instance in _ipairs (_detalhes.tabela_instancias) do + if (instance.ativa and instance.baseframe and instance.segmento == 0) then + return + end + end + + local lower = _detalhes:GetLowerInstanceNumber() + if (lower) then + local instance = _detalhes:GetInstance (lower) + if (instance and instance.auto_current) then + instance:TrocaTabela (0) --> muda o segmento pra current + return instance:InstanceAlert (Loc ["STRING_CHANGED_TO_CURRENT"], {[[Interface\GossipFrame\TrainerGossipIcon]], 18, 18, false}, 6) + else + for _, instance in _ipairs (_detalhes.tabela_instancias) do + if (instance.ativa and instance.baseframe and instance.segmento ~= 0 and instance.auto_current) then + instance:TrocaTabela (0) --> muda o segmento pra current + return instance:InstanceAlert (Loc ["STRING_CHANGED_TO_CURRENT"], {[[Interface\GossipFrame\TrainerGossipIcon]], 18, 18, false}, 6) + end + end + end + end + +end + function _detalhes:Freeze (instancia) if (not instancia) then @@ -1048,7 +1107,7 @@ function _detalhes:TrocaTabela (instancia, segmento, atributo, sub_atributo, ini local update_coolTip = false if (segmento == -2) then --> clicou para mudar de segmento - segmento = instancia.segmento+1 + segmento = instancia.segmento + 1 if (segmento > _detalhes.segments_amount) then segmento = -1 @@ -1515,6 +1574,39 @@ function _detalhes:AlteraModo (instancia, qual) _detalhes.popup:Select (1, checked) end +local function GetDpsHps (_thisActor, key) + + local keyname + if (key == "dps") then + keyname = "last_dps" + elseif (key == "hps") then + keyname = "last_hps" + end + + if (_thisActor [keyname]) then + return _thisActor [keyname] + else + if ((_detalhes.time_type == 2 and _thisActor.grupo) or not _detalhes:CaptureGet ("damage")) then + local dps = _thisActor.total / _thisActor:GetCombatTime() + _thisActor [keyname] = dps + return dps + else + if (not _thisActor.on_hold) then + local dps = _thisActor.total/_thisActor:Tempo() --calcula o dps deste objeto + _thisActor [keyname] = dps --salva o dps dele + return dps + else + if (_thisActor [keyname] == 0) then --> não calculou o dps dele ainda mas entrou em standby + local dps = _thisActor.total/_thisActor:Tempo() + _thisActor [keyname] = dps + return dps + else + return _thisActor [keyname] + end + end + end + end +end --> Reportar o que esta na janela da instância function _detalhes:monta_relatorio (este_relatorio, custom) @@ -1546,11 +1638,23 @@ function _detalhes:monta_relatorio (este_relatorio, custom) local is_current = _G ["Details_Report_CB_1"]:GetChecked() local is_reverse = _G ["Details_Report_CB_2"]:GetChecked() + if (not _detalhes.fontstring_len) then + _detalhes.fontstring_len = _detalhes.listener:CreateFontString (nil, "background", "GameFontNormal") + end + local _, fontSize = FCF_GetChatWindowInfo (1) + local fonte, _, flags = _detalhes.fontstring_len:GetFont() + _detalhes.fontstring_len:SetFont (fonte, fontSize, flags) + _detalhes.fontstring_len:SetText ("hello details!") + local default_len = _detalhes.fontstring_len:GetStringWidth() + + --> pegar a font do chat + --_detalhes.fontstring_len: + if (not is_reverse) then if (not is_current) then --> assumindo que self é sempre uma instância aqui. - local total, keyName, first + local total, keyName, keyNameSec, first local atributo = self.atributo local container = self.showing [atributo]._ActorTable @@ -1566,9 +1670,15 @@ function _detalhes:monta_relatorio (este_relatorio, custom) keyName = "frag" else total, keyName, first = _detalhes.atributo_damage:RefreshWindow (self, self.showing, true, true) + if (self.sub_atributo == 1) then + keyNameSec = "dps" + end end elseif (atributo == 2) then --> heal total, keyName, first = _detalhes.atributo_heal:RefreshWindow (self, self.showing, true, true) + if (self.sub_atributo == 1) then + keyNameSec = "hps" + end elseif (atributo == 3) then --> energy total, keyName, first = _detalhes.atributo_energy:RefreshWindow (self, self.showing, true, true) elseif (atributo == 4) then --> misc @@ -1595,9 +1705,26 @@ function _detalhes:monta_relatorio (este_relatorio, custom) if (_thisActor) then local amount = _thisActor [keyName] if (_type (amount) == "number" and amount > 0) then --1236 - report_lines [#report_lines+1] = i..".".. _thisActor.nome.." ".. _detalhes:comma_value ( _math_floor (amount) ).." (".._cstr ("%.1f", amount/total*100).."%)" + if (keyNameSec) then + local dps = GetDpsHps (_thisActor, keyNameSec) + + local name = _thisActor.nome.." " + + _detalhes.fontstring_len:SetText (name) + local stringlen = _detalhes.fontstring_len:GetStringWidth() + + while (stringlen < default_len) do + name = name .. "." + _detalhes.fontstring_len:SetText (name) + stringlen = _detalhes.fontstring_len:GetStringWidth() + end + + report_lines [#report_lines+1] = i..". ".. name .." ".. _cstr ("%.2f", amount/total*100) .. "% (" .. _math_floor (dps) .. ", " .. _detalhes:ToK ( _math_floor (amount) ) .. ")" + else + report_lines [#report_lines+1] = i..". ".. _thisActor.nome.." ".. _detalhes:comma_value ( _math_floor (amount) ).." (".._cstr ("%.1f", amount/total*100).."%)" + end elseif (_type (amount) == "string") then - report_lines [#report_lines+1] = i..".".. _thisActor.nome.." ".. amount + report_lines [#report_lines+1] = i..". ".. _thisActor.nome.." ".. amount else break end @@ -1643,10 +1770,16 @@ function _detalhes:monta_relatorio (este_relatorio, custom) container = reportarFrags keyName = "frag" else + if (self.sub_atributo == 1) then + keyNameSec = "dps" + end total, keyName, first = _detalhes.atributo_damage:RefreshWindow (self, self.showing, true, true) end elseif (atributo == 2) then --> heal total, keyName, first = _detalhes.atributo_heal:RefreshWindow (self, self.showing, true, true) + if (self.sub_atributo == 1) then + keyNameSec = "hps" + end elseif (atributo == 3) then --> energy total, keyName, first = _detalhes.atributo_energy:RefreshWindow (self, self.showing, true, true) elseif (atributo == 4) then --> misc @@ -1674,7 +1807,24 @@ function _detalhes:monta_relatorio (este_relatorio, custom) if (_type (amount) == "number") then if (amount > 0) then - report_lines [#report_lines+1] = i..".".. _thisActor.nome.." ".. _detalhes:comma_value ( _math_floor (amount) ).." (".._cstr ("%.1f", amount/total*100).."%)" + if (keyNameSec) then + local dps = GetDpsHps (_thisActor, keyNameSec) + + local name = _thisActor.nome.." " + + _detalhes.fontstring_len:SetText (name) + local stringlen = _detalhes.fontstring_len:GetStringWidth() + + while (stringlen < default_len) do + name = name .. "." + _detalhes.fontstring_len:SetText (name) + stringlen = _detalhes.fontstring_len:GetStringWidth() + end + + report_lines [#report_lines+1] = i..". ".. name .." ".. _cstr ("%.2f", amount/total*100) .. "% (" .. _math_floor (dps) .. ", " .. _detalhes:ToK ( _math_floor (amount) ) .. ")" + else + report_lines [#report_lines+1] = i..".".. _thisActor.nome.." ".. _detalhes:comma_value ( _math_floor (amount) ).." (".._cstr ("%.1f", amount/total*100).."%)" + end quantidade = quantidade + 1 if (quantidade == amt) then break @@ -1782,6 +1932,13 @@ function _detalhes:envia_relatorio (linhas, custom) end linhas[1] = linhas[1] .. ". " .. Loc ["STRING_REPORT_FIGHT"] .. ": " .. luta + + end + + if (_detalhes.time_type == 2) then + linhas[1] = linhas[1] .. " (Co)" + else + linhas[1] = linhas[1] .. " (Cr)" end local editbox = _detalhes.janela_report.editbox @@ -1809,6 +1966,7 @@ function _detalhes:envia_relatorio (linhas, custom) for i = 1, #linhas do _SendChatMessage (linhas[i], "CHANNEL", nil, _GetChannelName (channel)) end + return elseif (to_who == "WHISPER") then --> whisper @@ -1848,6 +2006,14 @@ function _detalhes:envia_relatorio (linhas, custom) return end + if (to_who == "RAID") then + --LE_PARTY_CATEGORY_HOME - default + --LE_PARTY_CATEGORY_INSTANCE - player's automatic group, raid finder?. + if (GetNumGroupMembers (LE_PARTY_CATEGORY_INSTANCE) > 0) then + to_who = "INSTANCE_CHAT" + end + end + for i = 1, #linhas do _SendChatMessage (linhas[i], to_who) end diff --git a/classes/classe_others.lua b/classes/classe_others.lua index 7d4328cf..43b546d8 100644 --- a/classes/classe_others.lua +++ b/classes/classe_others.lua @@ -1198,8 +1198,8 @@ function atributo_misc:Iniciar (iniciar) return false --retorna se o dps esta aberto ou fechado para este jogador end -function atributo_misc:ColetarLixo() - return _detalhes:ColetarLixo (class_type) +function atributo_misc:ColetarLixo (lastevent) + return _detalhes:ColetarLixo (class_type, lastevent) end local function ReconstroiMapa (tabela) diff --git a/classes/container_combatentes.lua b/classes/container_combatentes.lua index 618fcdb8..763220c2 100644 --- a/classes/container_combatentes.lua +++ b/classes/container_combatentes.lua @@ -245,9 +245,9 @@ function container_combatentes:PegarCombatente (serial, nome, flag, criar, isOwn -- tipo do container ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - if (self.tipo == container_playernpc) then --> CONTAINER COMUM + --if (self.tipo == container_playernpc) then --> CONTAINER COMUM - elseif (self.tipo == container_damage) then --> CONTAINER DAMAGE + if (self.tipo == container_damage) then --> CONTAINER DAMAGE get_class_ (novo_objeto, nome, flag) diff --git a/classes/container_historico.lua b/classes/container_historico.lua index 3e3b6741..04b27cd4 100644 --- a/classes/container_historico.lua +++ b/classes/container_historico.lua @@ -45,9 +45,14 @@ function historico:adicionar (tabela) if (index < 3) then for _, jogador in ipairs (container._ActorTable) do - --> limpeza + --> remover a tabela de last events jogador.last_events_table = nil + --> verifica se ele ainda esta registrado na time machine + if (jogador.timeMachine) then + jogador:DesregistrarNaTimeMachine() + end + end else break @@ -61,18 +66,32 @@ function historico:adicionar (tabela) --> verifica se precisa apagar a última tabela do histórico if (#self.tabelas > _detalhes.segments_amount) then - -- BETA subtração do combate overall - _detalhes.tabela_overall = _detalhes.tabela_overall - self.tabelas [#self.tabelas] - _detalhes.tabela_overall.start_time = _detalhes.tabela_overall.start_time + (self.tabelas[#self.tabelas].end_time-self.tabelas[#self.tabelas].start_time) - --print (#self.tabelas) + local combat_removed = self.tabelas [#self.tabelas] + + --> diminuir quantidades no overall + _detalhes.tabela_overall = _detalhes.tabela_overall - combat_removed + _detalhes.tabela_overall.start_time = _detalhes.tabela_overall.start_time + (combat_removed.end_time-combat_removed.start_time) - local amt_mortes = #self.tabelas[#self.tabelas].last_events_tables --> quantas mortes teve nessa luta + local amt_mortes = #combat_removed.last_events_tables --> quantas mortes teve nessa luta if (amt_mortes > 0) then for i = #_detalhes.tabela_overall.last_events_tables, #_detalhes.tabela_overall.last_events_tables-amt_mortes, -1 do _table_remove (_detalhes.tabela_overall.last_events_tables, #_detalhes.tabela_overall.last_events_tables) end end + --> verificar novamente a time machine + for _, jogador in ipairs (combat_removed [1]._ActorTable) do --> damage + if (jogador.timeMachine) then + jogador:DesregistrarNaTimeMachine() + end + end + for _, jogador in ipairs (combat_removed [2]._ActorTable) do --> heal + if (jogador.timeMachine) then + jogador:DesregistrarNaTimeMachine() + end + end + + --> remover _table_remove (self.tabelas, #self.tabelas) _detalhes:SendEvent ("DETAILS_DATA_SEGMENTREMOVED", nil, nil) diff --git a/core/control.lua b/core/control.lua index 23c843d9..05ad4007 100644 --- a/core/control.lua +++ b/core/control.lua @@ -258,9 +258,11 @@ end _detalhes:SendEvent ("COMBAT_PLAYER_ENTER", nil, _detalhes.tabela_vigente) + + _detalhes:HaveOneCurrentInstance() end - function _detalhes:SairDoCombate() + function _detalhes:SairDoCombate (bossKilled) --> pega a zona do jogador e vê se foi uma luta contra um Boss -- identifica se a luta foi com um boss if (not _detalhes.tabela_vigente.is_boss) then @@ -285,6 +287,10 @@ _detalhes:Msg ("(debug) forcing equalize actors behavior.") _detalhes:EqualizeActorsSchedule (_detalhes.host_of) end + + --> verifica memoria + _detalhes:CheckMemoryAfterCombat() + else if (_detalhes:GetBossDetails (_detalhes.tabela_vigente.is_boss.mapid, _detalhes.tabela_vigente.is_boss.index)) then @@ -296,6 +302,11 @@ _detalhes:Msg ("(debug) found encounter on last fight, freezing parser for 30 seconds.") end + if (bossKilled) then + _detalhes.tabela_vigente.is_boss.killed = true + end + + local bossFunction, bossFunctionType = _detalhes:GetBossFunction (_detalhes.tabela_vigente.is_boss.mapid, _detalhes.tabela_vigente.is_boss.index) if (bossFunction) then if (_bit_band (bossFunctionType, 0x2) ~= 0) then --end of combat diff --git a/core/meta.lua b/core/meta.lua index 106c8bf7..0b3b7b94 100644 --- a/core/meta.lua +++ b/core/meta.lua @@ -728,55 +728,153 @@ end end + function _detalhes:CheckMemoryAfterCombat() + if (_detalhes.next_memory_check < time()) then + if (_detalhes.debug) then + _detalhes:Msg ("checking memory after combat.") + end + _detalhes.next_memory_check = time()+_detalhes.intervalo_memoria + UpdateAddOnMemoryUsage() + local memory = GetAddOnMemoryUsage ("Details") + if (memory > _detalhes.memory_ram) then + _detalhes:IniciarColetaDeLixo (true, 60) --> sending true doesn't check anythink + end + end + end + function _detalhes:CheckMemoryPeriodically() + if (_detalhes.next_memory_check <= time() and not _InCombatLockdown() and not _detalhes.in_combat) then + _detalhes.next_memory_check = time() + _detalhes.intervalo_memoria - 3 + UpdateAddOnMemoryUsage() + local memory = GetAddOnMemoryUsage ("Details") + if (_detalhes.debug) then + _detalhes:Msg ("checking memory periodically. Using: ",math.floor (memory), "of", _detalhes.memory_ram) + end + if (memory > _detalhes.memory_ram) then + if (_detalhes.debug) then + _detalhes:Msg ("Memory is too high, starting garbage collector") + end + _detalhes:IniciarColetaDeLixo (1, 60) --> sending 1 only check for combat and ignore garbage collect cooldown + end + end + end - - function _detalhes:IniciarColetaDeLixo (forcar) + function _detalhes:IniciarColetaDeLixo (forcar, lastevent) if (not forcar) then if (_detalhes.ultima_coleta + _detalhes.intervalo_coleta > _detalhes._tempo + 1) then return elseif (_detalhes.in_combat or _InCombatLockdown() or _detalhes:IsInInstance()) then + if (_detalhes.debug) then + _detalhes:Msg ("garbage collect queued due combatlockdown (forced false)") + end _detalhes:ScheduleTimer ("IniciarColetaDeLixo", 5) return end + else + if (type (forcar) ~= "boolean") then + if (forcar == 1) then + if (_detalhes.in_combat or _InCombatLockdown()) then + if (_detalhes.debug) then + _detalhes:Msg ("garbage collect queued due combatlockdown (forced 1)") + end + _detalhes:ScheduleTimer ("IniciarColetaDeLixo", 5, forcar) + return + end + end + end end if (_detalhes.debug) then if (forcar) then - _detalhes:Msg ("collecting garbage with forced state.") + _detalhes:Msg ("collecting garbage with forced state: ", forcar) else _detalhes:Msg ("collecting garbage.") end end + local memory = GetAddOnMemoryUsage ("Details") + + --> reseta o cache do parser _detalhes:ClearParserCache() - local limpados = atributo_damage:ColetarLixo() + atributo_heal:ColetarLixo() + atributo_energy:ColetarLixo() + atributo_misc:ColetarLixo() + --> limpa barras que não estão sendo usadas nas instâncias. + for index, instancia in _ipairs (_detalhes.tabela_instancias) do + if (instancia.barras and instancia.barras [1]) then + for i, barra in _ipairs (instancia.barras) do + if (not barra:IsShown()) then + barra.minha_tabela = nil + end + end + end + end + --> faz a coleta nos 4 atributos + local damage = atributo_damage:ColetarLixo (lastevent) + local heal = atributo_heal:ColetarLixo (lastevent) + local energy = atributo_energy:ColetarLixo (lastevent) + local misc = atributo_misc:ColetarLixo (lastevent) + + local limpados = damage + heal + energy + misc + + --> refresh nas janelas if (limpados > 0) then _detalhes:InstanciaCallFunction (_detalhes.reset_window) end - --print ("coletados: " .. limpados) + _detalhes:ManutencaoTimeMachine() + --> print cache states + if (_detalhes.debug) then + _detalhes:Msg ("removed: damage "..damage.." heal "..heal.." energy "..energy.." misc "..misc) + end + + --> elimina pets antigos + local _new_PetTable = {} + for PetSerial, PetTable in _pairs (_detalhes.tabela_pets.pets) do + if (PetTable[4] + _detalhes.intervalo_coleta > _detalhes._tempo + 1) then + _new_PetTable [PetSerial] = PetTable + end + end + _table_wipe (_detalhes.tabela_pets.pets) + _detalhes.tabela_pets.pets = _new_PetTable + + --> wipa container de escudos + _table_wipe (_detalhes.escudos) + _detalhes.ultima_coleta = _detalhes._tempo + + if (_detalhes.debug) then + collectgarbage() + UpdateAddOnMemoryUsage() + local memory2 = GetAddOnMemoryUsage ("Details") + _detalhes:Msg ("memory antes: "..memory.." memory depois: "..memory2) + end end - - local function FazColeta (_combate, tipo) + --> combates Normais + local function FazColeta (_combate, tipo, intervalo_overwrite) local conteudo = _combate [tipo]._ActorTable local _iter = {index = 1, data = conteudo[1], cleaned = 0} local _tempo = _time() + local links_removed = 0 + while (_iter.data) do local _actor = _iter.data local can_garbage = false - if (not _actor.grupo and not _actor.boss and not _actor.boss_fight_component and _actor.last_event + _detalhes.intervalo_coleta < _tempo) then + local t + if (intervalo_overwrite) then + t = _actor.last_event + intervalo_overwrite + else + t = _actor.last_event + _detalhes.intervalo_coleta + end + + if (not _actor.grupo and not _actor.boss and not _actor.boss_fight_component and t < _tempo) then local owner = _actor.owner if (owner) then local owner_actor = _combate (tipo, owner.nome) @@ -807,6 +905,11 @@ end _iter.cleaned = _iter.cleaned+1 + + if (_actor.tipo == 1 or _actor.tipo == 2) then + _actor:DesregistrarNaTimeMachine() + end + _table_remove (conteudo, _iter.index) _iter.data = conteudo [_iter.index] else @@ -816,6 +919,10 @@ end + if (_detalhes.debug) then + -- _detalhes:Msg ("- garbage collect:", tipo, "actors removed:",_iter.cleaned) + end + if (_iter.cleaned > 0) then ReconstroiMapa (_combate [tipo]) _combate [tipo].need_refresh = true @@ -824,21 +931,13 @@ return _iter.cleaned end - function _detalhes:ColetarLixo (tipo) - - for index, instancia in _ipairs (_detalhes.tabela_instancias) do - if (instancia:IsAtiva()) then - for i, barra in _ipairs (instancia.barras) do - if (not barra:IsShown()) then - barra.minha_tabela = nil - end - end - end - end + --> Combate overall + function _detalhes:ColetarLixo (tipo, lastevent) local _tempo = _time() local limpados = 0 + --> monta a lista de combates local tabelas_de_combate = {} for _, _tabela in _ipairs (_detalhes.tabela_historico.tabelas) do if (_tabela ~= _detalhes.tabela_vigente) then @@ -847,17 +946,16 @@ end tabelas_de_combate [#tabelas_de_combate+1] = _detalhes.tabela_vigente + --> faz a coleta em todos os combates para este atributo for _, _combate in _ipairs (tabelas_de_combate) do - limpados = limpados + FazColeta (_combate, tipo) + limpados = limpados + FazColeta (_combate, tipo, lastevent) end - --> clear shadow tables + --> limpa a tabela overall local _overall_combat = _detalhes.tabela_overall local conteudo = _overall_combat [tipo]._ActorTable - _iter = {index = 1, data = conteudo[1], cleaned = 0} --> ._ActorTable[1] para pegar o primeiro index - - --collectgarbage() - + local _iter = {index = 1, data = conteudo[1], cleaned = 0} --> ._ActorTable[1] para pegar o primeiro index + while (_iter.data) do local _actor = _iter.data @@ -875,12 +973,7 @@ end _table_wipe (meus_links) end - - --if (tipo == 1 and #new_weak_table > 0) then - -- print (can_garbage, _actor.nome) - --end - - + if (can_garbage or not meus_links) then --> não há referências a este objeto if (not _actor.owner) then --> pet @@ -889,7 +982,18 @@ --> apaga a referência deste jogador na tabela overall _iter.cleaned = _iter.cleaned+1 + + if (_detalhes.debug) then + if (#_actor.links > 0) then + _detalhes:Msg (_actor.nome, " has been garbaged but have links: ", #_actor.links) + end + end + + if (_actor.tipo == 1 or _actor.tipo == 2) then + _actor:DesregistrarNaTimeMachine() + end _table_remove (conteudo, _iter.index) + _iter.data = conteudo [_iter.index] else _actor.links = new_weak_table @@ -898,21 +1002,7 @@ end end - - --> elimina pets antigos - local _new_PetTable = {} - for PetSerial, PetTable in _pairs (_detalhes.tabela_pets.pets) do - if (PetTable[4] + _detalhes.intervalo_coleta > _detalhes._tempo + 1) then - _new_PetTable [PetSerial] = PetTable - end - end - - _table_wipe (_detalhes.tabela_pets.pets) - _detalhes.tabela_pets.pets = _new_PetTable - - --> wipa container de escudos - _table_wipe (_detalhes.escudos) - + --> termina o coletor de lixo if (_iter.cleaned > 0) then _overall_combat[tipo].need_refresh = true diff --git a/core/parser.lua b/core/parser.lua index b6fa9db3..6cf432dd 100644 --- a/core/parser.lua +++ b/core/parser.lua @@ -63,15 +63,15 @@ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> cache --> damage - local damage_cache = {} - local damage_cache_pets = {} - local damage_cache_petsOwners = {} + local damage_cache = setmetatable ({}, _detalhes.weaktable) + local damage_cache_pets = setmetatable ({}, _detalhes.weaktable) + local damage_cache_petsOwners = setmetatable ({}, _detalhes.weaktable) --> heaing - local healing_cache = {} + local healing_cache = setmetatable ({}, _detalhes.weaktable) --> energy - local energy_cache = {} + local energy_cache = setmetatable ({}, _detalhes.weaktable) --> misc - local misc_cache = {} + local misc_cache = setmetatable ({}, _detalhes.weaktable) ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> constants @@ -153,6 +153,12 @@ ------------------------------------------------------------------------------------------------ --> get actors + --> debug - no cache + --[[ + local este_jogador, meu_dono, who_name = _current_damage_container:PegarCombatente (who_serial, who_name, who_flags, true) + local jogador_alvo, alvo_dono, alvo_name = _current_damage_container:PegarCombatente (alvo_serial, alvo_name, alvo_flags, true) + --]] + --[ --> damager local este_jogador, meu_dono = damage_cache [who_name] or damage_cache_pets [who_serial], damage_cache_petsOwners [who_serial] @@ -188,6 +194,7 @@ end end + --]] --> damager shadow local shadow = este_jogador.shadow @@ -209,41 +216,7 @@ --> record death log local t = jogador_alvo.last_events_table local i = t.n - - --[[ - if (not i) then - local isOriginal = jogador_alvo.last_events_table.original - if (isOriginal) then - isOriginal = "IsOriginal = TRUE" - else - isOriginal = "IsOriginal = FALSE" - end - local indexes = #jogador_alvo.last_events_table - if (not indexes) then - indexes = "Indexes = NIL" - else - indexes = "Indexes = "..indexes - end - local resync = _detalhes.tabela_vigente.resincked - if (resync) then - resync = "resync = TRUE" - else - resync = "resync = FALSE" - end - - local saved = _detalhes.tabela_vigente.hasSaved - if (saved) then - saved = "saved = TRUE" - else - saved = "saved = FALSE" - end - - print ("Report the lines shown, click on reset button and type /reload") - print ("We are investigation this issue, this information is important to us.") - assert (false, "Please Report This Error on the Blue Button: Parser 194: " .. isOriginal .. " " .. indexes .. " " .. resync .. " " .. saved) - end - --]] - + t.n = i + 1 t = t [i] @@ -504,6 +477,12 @@ ------------------------------------------------------------------------------------------------ --> get actors + --> debug - no cache + --[[ + local este_jogador, meu_dono, who_name = _current_heal_container:PegarCombatente (who_serial, who_name, who_flags, true) + local jogador_alvo, alvo_dono, alvo_name = _current_heal_container:PegarCombatente (alvo_serial, alvo_name, alvo_flags, true) + --]] + --[ local este_jogador, meu_dono = healing_cache [who_name] if (not este_jogador) then --> pode ser um desconhecido ou um pet este_jogador, meu_dono, who_name = _current_heal_container:PegarCombatente (who_serial, who_name, who_flags, true) @@ -519,7 +498,7 @@ healing_cache [alvo_name] = jogador_alvo end end - + --]] local shadow = este_jogador.shadow local shadow_of_target = jogador_alvo.shadow @@ -1013,6 +992,12 @@ --> get actors --> main actor + --> debug - no cache + --[[ + local este_jogador, meu_dono, who_name = _current_energy_container:PegarCombatente (who_serial, who_name, who_flags, true) + local jogador_alvo, alvo_dono, alvo_name = _current_energy_container:PegarCombatente (alvo_serial, alvo_name, alvo_flags, true) + --]] + --[ local este_jogador, meu_dono = energy_cache [who_name] if (not este_jogador) then --> pode ser um desconhecido ou um pet este_jogador, meu_dono, who_name = _current_energy_container:PegarCombatente (who_serial, who_name, who_flags, true) @@ -1029,6 +1014,7 @@ energy_cache [alvo_name] = jogador_alvo end end + --]] --> actor targets local este_alvo = este_jogador.targets._NameIndexTable [alvo_name] @@ -1107,6 +1093,12 @@ --> get actors --> main actor + + --> debug - no cache + --[[ + local este_jogador, meu_dono, who_name = _current_misc_container:PegarCombatente (who_serial, who_name, who_flags, true) + --]] + --[ local este_jogador, meu_dono = misc_cache [who_name] if (not este_jogador) then --> pode ser um desconhecido ou um pet este_jogador, meu_dono, who_name = _current_misc_container:PegarCombatente (who_serial, who_name, who_flags, true) @@ -1114,7 +1106,7 @@ misc_cache [who_name] = este_jogador end end - + --]] local shadow = este_jogador.shadow ------------------------------------------------------------------------------------------------ @@ -1193,6 +1185,11 @@ --> get actors --> main actor + --> debug - no cache + --[[ + local este_jogador, meu_dono, who_name = _current_misc_container:PegarCombatente (who_serial, who_name, who_flags, true) + --]] + --[ local este_jogador, meu_dono = misc_cache [who_name] if (not este_jogador) then --> pode ser um desconhecido ou um pet este_jogador, meu_dono, who_name = _current_misc_container:PegarCombatente (who_serial, who_name, who_flags, true) @@ -1200,7 +1197,7 @@ misc_cache [who_name] = este_jogador end end - + --]] local shadow = este_jogador.shadow ------------------------------------------------------------------------------------------------ @@ -1301,6 +1298,11 @@ --> get actors --> main actor + --> debug - no cache + --[[ + local este_jogador, meu_dono, who_name = _current_misc_container:PegarCombatente (who_serial, who_name, who_flags, true) + --]] + --[ local este_jogador, meu_dono = misc_cache [who_name] if (not este_jogador) then --> pode ser um desconhecido ou um pet este_jogador, meu_dono, who_name = _current_misc_container:PegarCombatente (who_serial, who_name, who_flags, true) @@ -1308,7 +1310,7 @@ misc_cache [who_name] = este_jogador end end - + --]] local shadow = este_jogador.shadow ------------------------------------------------------------------------------------------------ @@ -1516,6 +1518,11 @@ --> get actors --> main actor + --> debug - no cache + --[[ + local este_jogador, meu_dono, who_name = _current_misc_container:PegarCombatente (who_serial, who_name, who_flags, true) + --]] + --[ local este_jogador, meu_dono = misc_cache [who_name] if (not este_jogador) then --> pode ser um desconhecido ou um pet este_jogador, meu_dono, who_name = _current_misc_container:PegarCombatente (who_serial, who_name, who_flags, true) @@ -1523,7 +1530,7 @@ misc_cache [who_name] = este_jogador end end - + --]] local shadow = este_jogador.shadow ------------------------------------------------------------------------------------------------ @@ -1658,7 +1665,7 @@ if (_detalhes.debug) then _detalhes:Msg ("(debug) combat finished: encounter objective is completed") end - _detalhes:SairDoCombate() + _detalhes:SairDoCombate (true) end end @@ -2133,11 +2140,69 @@ _tempo = _detalhes._tempo end + function _detalhes:PrintParserCacheIndexes() + + local amount = 0 + for n, nn in pairs (damage_cache) do + amount = amount + 1 + end + print ("parser damage_cache", amount) + + amount = 0 + for n, nn in pairs (damage_cache_pets) do + amount = amount + 1 + end + print ("parser damage_cache_pets", amount) + + amount = 0 + for n, nn in pairs (damage_cache_petsOwners) do + amount = amount + 1 + end + print ("parser damage_cache_petsOwners", amount) + + amount = 0 + for n, nn in pairs (healing_cache) do + amount = amount + 1 + end + print ("parser healing_cache", amount) + + amount = 0 + for n, nn in pairs (energy_cache) do + amount = amount + 1 + end + print ("parser energy_cache", amount) + + amount = 0 + for n, nn in pairs (misc_cache) do + amount = amount + 1 + end + print ("parser misc_cache", amount) + + print ("group damage", #_detalhes.cache_damage_group) + print ("group damage", #_detalhes.cache_healing_group) + end + function _detalhes:ClearParserCache() - damage_cache = {} - healing_cache = {} - energy_cache = {} - misc_cache = {} + + --> clear cache | not sure if replacing the old table is the best approach + + table.wipe (damage_cache) + table.wipe (damage_cache_pets) + table.wipe (damage_cache_petsOwners) + table.wipe (healing_cache) + table.wipe (energy_cache) + table.wipe (misc_cache) + + damage_cache = setmetatable ({}, _detalhes.weaktable) + damage_cache_pets = setmetatable ({}, _detalhes.weaktable) + damage_cache_petsOwners = setmetatable ({}, _detalhes.weaktable) + + healing_cache = setmetatable ({}, _detalhes.weaktable) + + energy_cache = setmetatable ({}, _detalhes.weaktable) + + misc_cache = setmetatable ({}, _detalhes.weaktable) + end --serach key: ~cache @@ -2168,18 +2233,8 @@ _recording_took_damage = _detalhes.RecordRealTimeTookDamage _recording_ability_with_buffs = _detalhes.RecordPlayerAbilityWithBuffs _in_combat = _detalhes.in_combat - - --> clear cache - damage_cache = {} - damage_cache_pets = {} - damage_cache_petsOwners = {} - - healing_cache = {} - - energy_cache = {} - - misc_cache = {} - + + return _detalhes:ClearParserCache() end diff --git a/core/plugins_statusbar.lua b/core/plugins_statusbar.lua index f09f7089..e91beaa3 100644 --- a/core/plugins_statusbar.lua +++ b/core/plugins_statusbar.lua @@ -58,7 +58,7 @@ end --> functions to set the three statusbar places: left, center and right - function _detalhes.StatusBar:SetCenterPlugin (instance, childObject) + function _detalhes.StatusBar:SetCenterPlugin (instance, childObject, fromStartup) childObject.frame:Show() childObject.frame:SetPoint ("center", instance.baseframe.rodape.StatusBarCenterAnchor, "center") _detalhes.StatusBar:AlignPluginText (childObject, 2) @@ -69,10 +69,19 @@ if (childObject.OnEnable) then childObject:OnEnable() end + + if (fromStartup and childObject.options.isHidden) then + childObject.frame.text:Hide() + end + return true end - function _detalhes.StatusBar:SetLeftPlugin (instance, childObject) + function _detalhes.StatusBar:SetLeftPlugin (instance, childObject, fromStartup) + + if (not childObject) then + return + end childObject.frame:Show() childObject.frame:SetPoint ("left", instance.baseframe.rodape.StatusBarLeftAnchor, "left") @@ -84,10 +93,15 @@ if (childObject.OnEnable) then childObject:OnEnable() end + + if (fromStartup and childObject.options.isHidden) then + childObject.frame.text:Hide() + end + return true end - function _detalhes.StatusBar:SetRightPlugin (instance, childObject) + function _detalhes.StatusBar:SetRightPlugin (instance, childObject, fromStartup) childObject.frame:Show() childObject.frame:SetPoint ("right", instance.baseframe.rodape.direita, "right", -20, 10) _detalhes.StatusBar:AlignPluginText (childObject, 3) @@ -98,6 +112,11 @@ if (childObject.OnEnable) then childObject:OnEnable() end + + if (fromStartup and childObject.options.isHidden) then + childObject.frame.text:Hide() + end + return true end @@ -126,6 +145,16 @@ --> select a new plugin in for an instance anchor local ChoosePlugin = function (_, _, index, current_child, anchor) + + if (index == -1) then --> hide + current_child.frame.text:Hide() + _detalhes.StatusBar:ApplyOptions (current_child, "hidden", true) + return + else + _detalhes.StatusBar:ApplyOptions (current_child, "hidden", false) + current_child.frame.text:Show() + end + local pluginMestre = _detalhes.StatusBar.Plugins [index] local instance = current_child.instance -- instance que estamos usando agora @@ -210,6 +239,7 @@ frame.child:Setup() else GameCooltip:Reset() + GameCooltip:AddMenu (1, ChoosePlugin, -1, frame.child, frame.child.anchor, Loc ["STRING_PLUGIN_CLEAN"], [[Interface\Buttons\UI-GroupLoot-Pass-Down]], true) for index, _name_and_icon in _ipairs (_detalhes.StatusBar.Menu) do GameCooltip:AddMenu (1, ChoosePlugin, index, frame.child, frame.child.anchor, _name_and_icon [1], _name_and_icon [2], true) end @@ -308,6 +338,8 @@ child.options.textFace = value end child:SetFontFace (child.text, SharedMedia:Fetch ("font", child.options.textFace)) + elseif (option == "hidden") then + child.options.isHidden = value else if (child [option] and type (child [option]) == "function") then child [option] (_, child, value) @@ -773,6 +805,49 @@ do end +---------> BUILT-IN CLEAR PLUGIN ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--[[ +do + --> Create the plugin Object + local PClear1 = _detalhes:NewPluginObject ("Details_Attribute", DETAILSPLUGIN_ALWAYSENABLED, "STATUSBAR") + local PClear2 = _detalhes:NewPluginObject ("Details_Attribute", DETAILSPLUGIN_ALWAYSENABLED, "STATUSBAR") + local PClear3 = _detalhes:NewPluginObject ("Details_Attribute", DETAILSPLUGIN_ALWAYSENABLED, "STATUSBAR") + --> Handle events (must have) + function PClear1:OnDetailsEvent (event) + return + end + function PClear2:OnDetailsEvent (event) + return + end + function PClear3:OnDetailsEvent (event) + return + end + + --> Create Plugin Frames (must have) + function PClear1:CreateChildObject (instance) + local myframe = _detalhes.StatusBar:CreateChildFrame (instance, "DetailsPClear1Instance" .. instance:GetInstanceId(), DEFAULT_CHILD_WIDTH, DEFAULT_CHILD_HEIGHT) + local new_child = _detalhes.StatusBar:CreateChildTable (instance, PClear1, myframe) + return new_child + end + function PClear2:CreateChildObject (instance) + local myframe = _detalhes.StatusBar:CreateChildFrame (instance, "DetailsPClear2Instance" .. instance:GetInstanceId(), DEFAULT_CHILD_WIDTH, DEFAULT_CHILD_HEIGHT) + local new_child = _detalhes.StatusBar:CreateChildTable (instance, PClear2, myframe) + return new_child + end + function PClear3:CreateChildObject (instance) + local myframe = _detalhes.StatusBar:CreateChildFrame (instance, "DetailsPClear3Instance" .. instance:GetInstanceId(), DEFAULT_CHILD_WIDTH, DEFAULT_CHILD_HEIGHT) + local new_child = _detalhes.StatusBar:CreateChildTable (instance, PClear3, myframe) + return new_child + end + +--]] --> Install +-- _detalhes:InstallPlugin ("STATUSBAR", Loc ["STRING_PLUGIN_CLEAN"].." 1", [[Interface\Buttons\UI-GroupLoot-Pass-Down]], PClear1, "DETAILS_STATUSBAR_PLUGIN_PCLEAR1") +-- _detalhes:InstallPlugin ("STATUSBAR", Loc ["STRING_PLUGIN_CLEAN"].." 2", [[Interface\Buttons\UI-GroupLoot-Pass-Down]], PClear2, "DETAILS_STATUSBAR_PLUGIN_PCLEAR2") +-- _detalhes:InstallPlugin ("STATUSBAR", Loc ["STRING_PLUGIN_CLEAN"].." 3", [[Interface\Buttons\UI-GroupLoot-Pass-Down]], PClear3, "DETAILS_STATUSBAR_PLUGIN_PCLEAR3") + +--end + + ---------> default options panel ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- local window = _detalhes.gump:NewPanel (UIParent, nil, "DetailsStatusBarOptions", nil, 300, 180) diff --git a/core/timemachine.lua b/core/timemachine.lua index 3af00aa9..a2f670e6 100644 --- a/core/timemachine.lua +++ b/core/timemachine.lua @@ -1,13 +1,13 @@ ---File Revision: 1 ---Last Modification: 27/07/2013 +--File Revision: 2 +--Last Modification: 12/09/2013 -- Change Log: -- 27/07/2013: Finished alpha version. + -- 12/09/2013: Fixed some problems with garbage collector. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- local _detalhes = _G._detalhes - local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" ) local _tempo = time() ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -66,7 +66,6 @@ jogador:RegistrarNaTimeMachine() end end - end function timeMachine:Desligar() @@ -86,9 +85,15 @@ if (not timeMachine.ligada) then return end - local esta_tabela = timeMachine.tabelas [self.tipo] - esta_tabela [self.timeMachine] = nil - self.timeMachine = nil + + local timeMachineContainer = timeMachine.tabelas [self.tipo] + local actorTimeMachineID = self.timeMachine + + if (timeMachineContainer [actorTimeMachineID] == self) then + self:TerminarTempo() + self.timeMachine = nil + timeMachineContainer [actorTimeMachineID] = false + end end function _detalhes:RegistrarNaTimeMachine() @@ -96,11 +101,6 @@ return end - --if (self.tipo == 3) then - -- print (debugstack()) - -- return - --end - local esta_tabela = timeMachine.tabelas [self.tipo] _table_insert (esta_tabela, self) self.timeMachine = #esta_tabela @@ -109,13 +109,21 @@ function _detalhes:ManutencaoTimeMachine() for tipo, tabela in _ipairs (timeMachine.tabelas) do local t = {} + local removed = 0 for index, jogador in _ipairs (tabela) do if (jogador) then t [#t+1] = jogador jogador.timeMachine = #t + else + removed = removed + 1 end end + timeMachine.tabelas [tipo] = t + + if (_detalhes.debug) then + _detalhes:Msg ("timemachine r"..removed.."| e"..#t.."| t"..tipo) + end end end @@ -203,3 +211,8 @@ self.last_event = tempo end end + + function _detalhes:PrintTimeMachineIndexes() + print ("timemachine damage", #timeMachine.tabelas [1]) + print ("timemachine heal", #timeMachine.tabelas [2]) + end \ No newline at end of file diff --git a/framework/pictureedit.lua b/framework/pictureedit.lua index 6bd2b969..602ea377 100644 --- a/framework/pictureedit.lua +++ b/framework/pictureedit.lua @@ -8,6 +8,8 @@ local g = _detalhes.gump window:SetMovable (true) tinsert (UISpecialFrames, "DetailsImageEdit") + window.hooks = {} + local background = g:NewImage (window, _, "$parentBackground", _, _, _, nil, "background") background:SetAllPoints() background:SetTexture (0, 0, 0, .8) @@ -43,6 +45,9 @@ local g = _detalhes.gump topSlider:SetHook ("OnValueChange", function (_, _, value) topCoordTexture.image:SetHeight (window.frame:GetHeight()/100*value) + if (window.callback_func) then + window.accept (true) + end end) topSlider:Hide() @@ -73,6 +78,9 @@ local g = _detalhes.gump bottomSlider:SetHook ("OnValueChange", function (_, _, value) value = math.abs (value-100) bottomCoordTexture.image:SetHeight (math.max (window.frame:GetHeight()/100*value, 1)) + if (window.callback_func) then + window.accept (true) + end end) bottomSlider:Hide() @@ -101,6 +109,9 @@ local g = _detalhes.gump leftSlider:SetHook ("OnValueChange", function (_, _, value) leftCoordTexture.image:SetWidth (window.frame:GetWidth()/100*value) + if (window.callback_func) then + window.accept (true) + end end) leftSlider:Hide() @@ -130,6 +141,9 @@ local g = _detalhes.gump rightSlider:SetHook ("OnValueChange", function (_, _, value) value = math.abs (value-100) rightCoordTexture.image:SetWidth (math.max (window.frame:GetWidth()/100*value, 1)) + if (window.callback_func) then + window.accept (true) + end end) rightSlider:Hide() @@ -202,8 +216,14 @@ local g = _detalhes.gump local selectedColor = function (default) if (default) then edit_texture:SetVertexColor (unpack (default)) + if (window.callback_func) then + window.accept (true) + end else edit_texture:SetVertexColor (ColorPickerFrame:GetColorRGB()) + if (window.callback_func) then + window.accept (true) + end end end @@ -282,6 +302,9 @@ local g = _detalhes.gump alphaSlider:SetHook ("OnValueChange", function (_, _, value) edit_texture:SetAlpha (value/100) + if (window.callback_func) then + window.accept (true) + end end) local resizer = CreateFrame ("Button", nil, window.widget) @@ -320,6 +343,10 @@ local g = _detalhes.gump leftCoordTexture.image:SetWidth (window.frame:GetWidth()/100*leftSlider:GetValue()) bottomCoordTexture:SetHeight (math.max ( (window.frame:GetHeight() / 100 * math.abs (bottomSlider:GetValue()-100)), 1)) topCoordTexture:SetHeight (window.frame:GetHeight()/100*topSlider:GetValue()) + + if (window.callback_func) then + window.accept (true) + end end) --> change size @@ -353,6 +380,10 @@ local g = _detalhes.gump rightTexCoordButton:Enable() end haveHFlip = not haveHFlip + if (window.callback_func) then + window.accept (true) + end + elseif (side == 2) then if (not haveVFlip) then @@ -379,6 +410,9 @@ local g = _detalhes.gump bottomTexCoordButton:Enable() end haveVFlip = not haveVFlip + if (window.callback_func) then + window.accept (true) + end end end @@ -391,11 +425,14 @@ local g = _detalhes.gump flipButtonV:InstallCustomTexture() --> accept - local accept = function() - buttonsBackground:Hide() - window:Hide() - alphaFrame:Hide() - ColorPickerFrame:Hide() + window.accept = function (keep_editing) + + if (not keep_editing) then + buttonsBackground:Hide() + window:Hide() + alphaFrame:Hide() + ColorPickerFrame:Hide() + end local coords = {} if (haveHFlip) then @@ -417,7 +454,7 @@ local g = _detalhes.gump return window.callback_func (edit_texture.width, edit_texture.height, {edit_texture:GetVertexColor()}, edit_texture:GetAlpha(), coords, window.extra_param) end - local acceptButton = g:NewButton (buttonsBackground, _, "$parentAcceptButton", _, 100, 20, accept, _, _, _, "DONE") + local acceptButton = g:NewButton (buttonsBackground, _, "$parentAcceptButton", _, 100, 20, window.accept, _, _, _, "DONE") acceptButton:SetPoint ("topleft", window, "topright", 10, -200) acceptButton:InstallCustomTexture() @@ -432,24 +469,27 @@ window:Hide() local ttexcoord function g:ImageEditor (callback, texture, texcoord, colors, width, height, extraParam) + texcoord = texcoord or {0, 1, 0, 1} + ttexcoord = texcoord + + colors = colors or {1, 1, 1, 1} + edit_texture:SetTexture (texture) edit_texture.width = width edit_texture.height = height - colors = colors or {1, 1, 1, 1} edit_texture:SetVertexColor (colors [1], colors [2], colors [3]) edit_texture:SetAlpha (colors [4] or 1) - - texcoord = texcoord or {0, 1, 0, 1} - ttexcoord = texcoord - + _detalhes:ScheduleTimer ("RefreshImageEditor", 0.2) window:Show() window.callback_func = callback window.extra_param = extraParam buttonsBackground:Show() + + table.wipe (window.hooks) end function _detalhes:RefreshImageEditor() @@ -476,6 +516,10 @@ window:Hide() topSlider:SetValue (ttexcoord[3]*100) bottomSlider:SetValue (ttexcoord[4]*100) end + + if (window.callback_func) then + window.accept (true) + end end \ No newline at end of file diff --git a/framework/slider.lua b/framework/slider.lua index c613f9cb..45fb2a90 100644 --- a/framework/slider.lua +++ b/framework/slider.lua @@ -19,8 +19,28 @@ local SliderMetaFunctions = {} SliderMetaFunctions.__call = function (_table, value) if (not value) then + if (_table.isSwitch) then + if (_table.slider:GetValue() == 1) then + return false + else + return true + end + end return _table.slider:GetValue() else + if (_table.isSwitch) then + if (type (value) == "boolean") then + if (value) then + _table.slider:SetValue (2) + else + _table.slider:SetValue (1) + end + else + _table.slider:SetValue (value) + end + return + end + return _table.slider:SetValue (value) end end @@ -163,6 +183,11 @@ local SliderMetaFunctions = {} _rawset (self, "FixedValue", value) end +--> set value + function SliderMetaFunctions:SetValue (value) + return self (value) + end + -- thumb size function SliderMetaFunctions:SetThumbSize (w, h) if (not w) then @@ -382,6 +407,7 @@ function gump:NewSwitch (parent, container, name, member, w, h, ltext, rtext, de --> build frames local slider = gump:NewSlider (parent, container, name, member, w, h, 1, 2, 1, defaultv) + slider:SetBackdrop ({edgeFile = "Interface\\Buttons\\UI-SliderBar-Border", edgeSize = 8, bgFile = [[Interface\AddOns\Details\images\background]], insets = {left = 3, right = 3, top = 5, bottom = 5}}) @@ -406,6 +432,8 @@ function gump:NewSwitch (parent, container, name, member, w, h, ltext, rtext, de slider:SetValue (2) slider:SetValue (defaultv) + slider.isSwitch = true + return slider end diff --git a/functions/savedata.lua b/functions/savedata.lua index b9f2d981..1a7f5fa4 100644 --- a/functions/savedata.lua +++ b/functions/savedata.lua @@ -117,6 +117,8 @@ function _detalhes:SaveDataOnLogout() _detalhes_global.clear_ungrouped = _detalhes.clear_ungrouped _detalhes_global.update_speed = _detalhes.update_speed _detalhes_global.time_type = _detalhes.time_type + _detalhes_global.memory_threshold = _detalhes.memory_threshold + _detalhes_global.memory_ram = _detalhes.memory_ram _detalhes_global.SpellOverwriteUser = _detalhes.SpellOverwriteUser @@ -309,6 +311,8 @@ end --]] _detalhes.clear_ungrouped = _detalhes_global.clear_ungrouped or _detalhes.clear_ungrouped _detalhes.update_speed = _detalhes_global.update_speed or _detalhes.update_speed _detalhes.time_type = _detalhes_global.time_type or _detalhes.time_type + _detalhes.memory_threshold = _detalhes_global.memory_threshold + _detalhes.memory_ram = _detalhes_global.memory_ram _detalhes.SpellOverwriteUser = _detalhes_global.SpellOverwriteUser or _detalhes.SpellOverwriteUser else diff --git a/functions/slash.lua b/functions/slash.lua index b321604d..ae6bbd2d 100644 --- a/functions/slash.lua +++ b/functions/slash.lua @@ -85,6 +85,11 @@ function SlashCmdList.DETAILS (msg, editbox) local name, realm = UnitName ("party"..i) print (name, " -- ", realm) end + + elseif (msg == "cacheparser") then + _detalhes:PrintParserCacheIndexes() + elseif (msg == "parsercache") then + _detalhes:PrintParserCacheIndexes() elseif (msg == "captures") then for k, v in pairs (_detalhes.capture_real) do @@ -175,6 +180,14 @@ function SlashCmdList.DETAILS (msg, editbox) _detalhes.gump:ImageEditor (callback, "Interface\\TALENTFRAME\\bg-paladin-holy", nil, {1, 1, 1, 1}) -- {0.25, 0.25, 0.25, 0.25} + elseif (msg == "chat") then + + local name, fontSize, r, g, b, a, shown, locked = FCF_GetChatWindowInfo (1); + print (name,"|",fontSize,"|", r,"|", g,"|", b,"|", a,"|", shown,"|", locked) + + --local fontFile, unused, fontFlags = self:GetFont(); + --self:SetFont(fontFile, fontSize, fontFlags); + elseif (msg == "error") then a = nil + 1 @@ -284,10 +297,10 @@ function SlashCmdList.DETAILS (msg, editbox) elseif (msg == "debug") then if (_detalhes.debug) then _detalhes.debug = false - print ("Details Diagnostic mode OFF") + _detalhes:Msg ("diagnostic mode has been turned off.") else _detalhes.debug = true - print ("Details Diagnostic mode ON") + _detalhes:Msg ("diagnostic mode has been turned on.") end --> debug combat log @@ -303,6 +316,9 @@ function SlashCmdList.DETAILS (msg, editbox) end --> debug + elseif (msg == "tables") then + _detalhes:tables() + elseif (msg == "gs") then _detalhes:teste_grayscale() @@ -323,3 +339,444 @@ function SlashCmdList.DETAILS (msg, editbox) end end + +function _detalhes:tables () + -- generate a graphviz graph from a lua table structure + + local string_result = "" + + local function append( tab, ... ) + for i = 1, select( '#', ... ) do + tab[ #tab + 1 ] = (select( i, ... )) + end + return tab + end + + local function abbrev( str, data ) + local escape = "\\\\" + if data.use_html then + escape = "\\" + end + local s = string.gsub( str, "[^%w?!=/+*-_.:,; ]", function( c ) + -- local s = string.gsub( str, "[^%w_]", function( c ) + return escape .. string.byte( c ) + end ) + if string.len( s ) > 20 then + s = string.sub( s, 1, 17 ) .. "..." + end + return "'" .. s .. "'" + end + + local function update_node_depth( val, data, depth ) + data.node2depth[ val ] = math.min( data.node2depth[ val ] or depth, depth ) + end + + local function define_node( data, node ) + assert( not data.node2id[ node.value ] ) + local id = data.n_nodes + data.n_nodes = data.n_nodes + 1 + data.node2id[ node.value ] = id + append( data.nodes, node ) + return id + end + + local function define_edge( data, edge ) + append( data.edges, edge ) + end + + local function get_metatable( val, enabled ) + if enabled then + if type( debug ) == "table" and + type( debug.getmetatable ) == "function" then + return debug.getmetatable( val ) + elseif type( getmetatable ) == "function" then + return getmetatable( val ) + end + end + end + + local function get_environment( val, enabled ) + if enabled then + if type( debug ) == "table" and + type( debug.getfenv ) == "function" then + return debug.getfenv( val ) + elseif type( getfenv ) == "function" and + type( val ) == "function" then + return getfenv( val ) + end + end + end + + + + -- generate dot code for references + local function dottify_metatable_ref( val, id1, mt, id2, data ) + append( data.edges, { + A = val, A_id = id1, + B = mt, B_id = id2, + style = "dashed", + arrowtail = "odiamond", + label = "metatable", + color = "blue" + } ) + data.nodes[ data.node2id[ val ] ].important = true + data.nodes[ data.node2id[ mt ] ].important = true + end + local function dottify_environment_ref( val, id1, env, id2, data ) + append( data.edges, { + A = val, A_id = id1, + B = env, B_id = id2, + style = "dotted", + arrowtail = "dot", + label = "environment", + color = "red" + } ) + data.nodes[ data.node2id[ val ] ].important = true + data.nodes[ data.node2id[ env ] ].important = true + end + local function dottify_upvalue_ref( val, id1, upv, id2, data, name ) + append( data.edges, { + A = val, A_id = id1, + B = upv, B_id = id2, + style = "dashed", + label = name or "#upvalue", + color = "green" + } ) + data.nodes[ data.node2id[ val ] ].important = true + data.nodes[ data.node2id[ upv ] ].important = true + end + local function dottify_ref( val1, id1, val2, id2, data ) + append( data.edges, { + A = val1, A_id = id1, + B = val2, B_id = id2, + style = "solid", + arrowhead = "normal", + } ) + end + + + -- forward declarations + local dottify_table, dottify_userdata, dottify_thread, dottify_function + + + local function make_label( tab, v, data, id, subid, depth ) + if type( v ) == "table" then + local id2 = dottify_table( v, data, depth+1 ) + dottify_ref( tab, id..":"..subid, v, id2..":0", data ) + return tostring( v ) + elseif type( v ) == "userdata" then + local id2 = dottify_userdata( v, data, depth+1 ) + dottify_ref( tab, id..":"..subid, v, id2, data ) + return tostring( v ) + elseif type( v ) == "function" then + local id2 = dottify_function( v, data, depth+1 ) + dottify_ref( tab, id..":"..subid, v, id2, data ) + return tostring( v ) + elseif type( v ) == "thread" then + local id2 = dottify_thread( v, data, depth+1 ) + dottify_ref( tab, id..":"..subid, v, id2, data ) + return tostring( v ) + elseif type( v ) == "string" then + return abbrev( v, data ) + elseif type( v ) == "number" or type( v ) == "boolean" then + return tostring( v ) + else + error( "unsupported primitive lua type" ) + end + end + + + function dottify_table( tab, data, depth ) + assert( type( tab ) == "table" ) + update_node_depth( tab, data, depth ) + if not data.node2id[ tab ] then + local node = { + value = tab + } + local id = define_node( data, node ) + local label + -- build label for this table + if data.use_html then + node.shape = "plaintext" + label = [[]] + else + node.shape = "record" + label = "{ <0> " .. tostring( tab ) + end + local handled = {} + local n = 1 + -- first the array part + for i,v in ipairs( tab ) do + local el_label = make_label( tab, v, data, id, n, depth ) + if data.use_html then + label = label .. [[]] + else + label = label .. " | <" .. n .. "> " .. el_label + end + n = n + 1 + handled[ i ] = true + end + -- and then the hash part + local keys, values = {}, {} + for k,v in pairs( tab ) do + node.important = true + if not handled[ k ] then -- skip array part elements + local k_label = make_label( tab, k, data, id, "k"..n, depth ) + local v_label = make_label( tab, v, data, id, "v"..n, depth ) + if data.use_html then + label = label .. [[ ]] + else + append( keys, " " .. k_label ) + append( values, " " .. v_label ) + end + n = n + 1 + end + end + if data.use_html then + node.label = label .. [[
]] .. tostring( tab ) .. [[
]] .. el_label .. [[
]] .. k_label .. [[]] .. v_label .. [[
]] + else + if next( keys ) ~= nil then + label = label .. " | { { " .. table.concat( keys, " | " ) .. + " } | { " .. table.concat( values, " | " ) .. " } }" + end + node.label = label .. " }" + end + -- and now the metatable + local mt = get_metatable( tab, data.show_metatables ) + if type( mt ) == "table" then + local id2 = dottify_table( mt, data, depth+1 ) + dottify_metatable_ref( tab, id .. ":0", mt, id2 .. ":0", data ) + end + end + return data.node2id[ tab ] + end + + + function dottify_userdata( udata, data, depth ) + assert( type( udata ) == "userdata" ) + update_node_depth( udata, data, depth ) + if not data.node2id[ udata ] then + local id = define_node( data, { + value = udata, + label = tostring( udata ), + shape = "box" + } ) + -- the metatable + local mt = get_metatable( udata, data.show_metatables ) + if type( mt ) == "table" then + local id2 = dottify_table( mt, data, depth+1 ) + dottify_metatable_ref( udata, id, mt, id2..":0", data ) + end + -- the environment + local env = get_environment( udata, data.show_environments ) + if type( env ) == "table" then + local id2 = dottify_table( env, data, depth+1 ) + dottify_environment_ref( udata, id, env, id2..":0", data ) + end + end + return data.node2id[ udata ] + end + + + function dottify_thread( thread, data, depth ) + assert( type( thread ) == "thread" ) + update_node_depth( thread, data, depth ) + if not data.node2id[ thread ] then + local id = define_node( data, { + value = thread, + label = tostring( thread ), + shape = "triangle" + } ) + -- the environment + local env = get_environment( val, data.show_environments ) + if type( env ) == "table" then + local id2 = dottify_table( env, data, depth+1 ) + dottify_environment_ref( thread, id, env, id2..":0", data ) + end + end + return data.node2id[ thread ] + end + + + + function dottify_function( func, data, depth ) + assert( type( func ) == "function" ) + update_node_depth( func, data, depth ) + if not data.node2id[ func ] then + local id = define_node( data, { + value = func, + label = tostring( func ), + shape = "ellipse" + } ) + -- the environment + local env = get_environment( func, data.show_environments ) + if type( env ) == "table" then + local id2 = dottify_table( env, data, depth+1 ) + dottify_environment_ref( func, id, env, id2..":0", data ) + end + -- the upvalues + if data.show_upvalues and + type( debug ) == "table" and + type( debug.getupvalue ) == "function" then + local n = 1 + repeat + local name, upvalue = debug.getupvalue( func, n ) + if type( upvalue ) == "table" then + local id2 = dottify_table( upvalue, data, depth+1 ) + dottify_upvalue_ref( func, id, upvalue, id2..":0", data, name ) + elseif type( upvalue ) == "userdata" then + local id2 = dottify_userdata( upvalue, data, depth+1 ) + dottify_upvalue_ref( func, id, upvalue, id2, data, name ) + elseif type( upvalue ) == "function" then + local id2 = dottify_function( upvalue, data, depth+1 ) + dottify_upvalue_ref( func, id, upvalue, id2, data, name ) + elseif type( upvalue ) == "thread" then + local id2 = dottify_thread( upvalue, data, depth+1 ) + dottify_upvalue_ref( func, id, upvalue, id2, data, name ) + end + n = n + 1 + until name == nil + end + end + return data.node2id[ func ] + end + + local option_names = { + "label", "shape", "style", "dir", "arrowhead", "arrowtail", "color", + "fillcolor" + } + + local function process_options( obj ) + local options = {} + for _,opt in ipairs( option_names ) do + if obj[ opt ] then + local quote_on = "\"" + local quote_off = "\"" + if opt == "label" and type( obj[ opt ] ) == "string" and + obj[ opt ]:match( "^<.*>$" ) then + quote_on, quote_off = "<", ">" + end + append( options, tostring( opt ) .. "=" .. quote_on .. + tostring( obj[ opt ] ) .. quote_off ) + end + end + return options + end + + + local function write_nodes( file, data ) + for _,n in ipairs( data.nodes ) do + if (data.max_depth <= 0 or + data.node2depth[ n.value ] <= data.max_depth) and + (data.show_unimportant or n.important) then + local options = process_options( n ) + + string_result = string_result .. " " .. tostring( data.node2id[ n.value ] ) .. " [" .. table.concat( options, "," ) .. "];--PULALINHA--" + + end + end + end + + + local function write_edges( file, data ) + for _,e in ipairs( data.edges ) do + if (data.max_depth <= 0 or + (data.node2depth[ e.A ] <= data.max_depth and + data.node2depth[ e.B ] <= data.max_depth)) and + (data.show_unimportant or + (data.nodes[ data.node2id[ e.A ] ].important and + data.nodes[ data.node2id[ e.B ] ].important)) then + local id1 = e.A_id or data.node2id[ e.A ] + local id2 = e.B_id or data.node2id[ e.B ] + local options = process_options( e ) + + string_result = string_result .. " " .. tostring( id1 ) .. " -> " .. tostring( id2 ) .. " [" .. table.concat( options, "," ) .. "];--PULALINHA--" + + end + end + end + + + -- main function + local function dottify( filename, val, ... ) + + local data = { + n_nodes = 1, + node2id = {}, + node2depth = {}, + nodes = {}, + edges = {}, + show_metatables = true, + show_upvalues = true, + show_environments = false, + use_html = true, + show_unimportant = false, + max_depth = 0, + } + for i = 1, select( '#', ... ) do + local opt = select( i, ... ) + if opt == "noenvironments" then + data.show_environments = false + elseif opt == "nometatables" then + data.show_metatables = false + elseif opt == "noupvalues" then + data.show_upvalues = false + elseif opt == "nohtml" then + data.use_html = false + elseif opt == "environments" then + data.show_environments = true + elseif opt == "metatables" then + data.show_metatables = true + elseif opt == "upvalues" then + data.show_upvalues = true + elseif opt == "html" then + data.use_html = true + elseif opt == "unimportant" then + data.show_unimportant = true + elseif type( opt ) == "number" then + data.max_depth = opt + end + end + local t = type( val ) + if t == "table" then + local id = dottify_table( val, data, 1 ) + data.nodes[ id ].important = true + elseif t == "function" then + local id = dottify_function( val, data, 1 ) + data.nodes[ id ].important = true + elseif t == "thread" then + local id = dottify_thread( val, data, 1 ) + data.nodes[ id ].important = true + elseif t == "userdata" then + local id = dottify_userdata( val, data, 1 ) + data.nodes[ id ].important = true + else + io.stderr:write( "warning: unsuitable value for dotlua!
" ) + end + + --local file = assert( io.open( filename, "w" ) ) + + string_result = string_result .. "digraph {--PULALINHA--" + + --file:write( "digraph {\n" ) + write_nodes ( o, data ) + write_edges ( o, data ) + + string_result = string_result .. "}--PULALINHA--" + + --file:write( "}\n" ) + --file:close() + return o + end + + dottify ( nil, _detalhes, "nohtml") + + print ("running...", string.len (string_result)) + + --_G ["_detalhes_database"].aaaaaaaa = string_result + + _detalhes:CopyPaste (string_result) + + + return dottify +end \ No newline at end of file diff --git a/gumps/janela_options.lua b/gumps/janela_options.lua index d1921a38..3f1a0e4c 100644 --- a/gumps/janela_options.lua +++ b/gumps/janela_options.lua @@ -15,7 +15,7 @@ function _detalhes:OpenOptionsWindow (instance) -- Most of details widgets have the same 6 first parameters: parent, container, global name, parent key, width, height - window = g:NewPanel (UIParent, _, "DetailsOptionsWindow", _, 700, 340) + window = g:NewPanel (UIParent, _, "DetailsOptionsWindow", _, 700, 360) window.instance = instance tinsert (UISpecialFrames, "DetailsOptionsWindow") window:SetPoint ("center", UIParent, "Center") @@ -28,11 +28,85 @@ function _detalhes:OpenOptionsWindow (instance) local c = window:CreateRightClickLabel ("medium") c:SetPoint ("bottomleft", window, "bottomleft", 5, 5) + --------------- Memory + + g:NewSlider (window, _, "$parentSlider", "segmentsSlider", 120, 20, 1, 25, 1, _detalhes.segments_amount) -- min, max, step, defaultv + g:NewSlider (window, _, "$parentSliderSegmentsSave", "segmentsSliderToSave", 80, 20, 1, 5, 1, _detalhes.segments_amount_to_save) -- min, max, step, defaultv + g:NewSlider (window, _, "$parentSliderUpdateSpeed", "updatespeedSlider", 160, 20, 0.3, 3, 0.1, _detalhes.update_speed, true) --parent, container, name, member, w, h, min, max, step, defaultv + + g:NewLabel (window, _, "$parentLabelMemory", "memoryLabel", "memory threshold") + window.memoryLabel:SetPoint (10, -35) + -- + g:NewSlider (window, _, "$parentSliderMemory", "memorySlider", 130, 20, 1, 4, 1, _detalhes.memory_threshold) -- min, max, step, defaultv + window.memorySlider:SetPoint ("left", window.memoryLabel, "right", 2, 0) + window.memorySlider:SetHook ("OnValueChange", function (slider, _, amount) --> slider, fixedValue, sliderValue + + amount = math.floor (amount) + + if (amount == 1) then + slider.amt:SetText ("<= 1gb") + _detalhes.memory_ram = 16 + _detalhes.segments_amount = 5 + _detalhes.segments_amount_to_save = 2 + _detalhes.update_speed = 1.5 + + _G.DetailsOptionsWindowSlider.MyObject:SetValue (_detalhes.segments_amount) + _G.DetailsOptionsWindowSliderSegmentsSave.MyObject:SetValue (_detalhes.segments_amount_to_save) + _G.DetailsOptionsWindowSliderUpdateSpeed.MyObject:SetValue (_detalhes.update_speed) + + elseif (amount == 2) then + slider.amt:SetText ("2gb") + _detalhes.memory_ram = 32 + _detalhes.segments_amount = 10 + _detalhes.segments_amount_to_save = 3 + _detalhes.update_speed = 1.2 + + _G.DetailsOptionsWindowSlider.MyObject:SetValue (_detalhes.segments_amount) + _G.DetailsOptionsWindowSliderSegmentsSave.MyObject:SetValue (_detalhes.segments_amount_to_save) + _G.DetailsOptionsWindowSliderUpdateSpeed.MyObject:SetValue (_detalhes.update_speed) + + elseif (amount == 3) then + slider.amt:SetText ("4gb") + _detalhes.memory_ram = 64 + _detalhes.segments_amount = 20 + _detalhes.segments_amount_to_save = 5 + _detalhes.update_speed = 1.0 + + _G.DetailsOptionsWindowSlider.MyObject:SetValue (_detalhes.segments_amount) + _G.DetailsOptionsWindowSliderSegmentsSave.MyObject:SetValue (_detalhes.segments_amount_to_save) + _G.DetailsOptionsWindowSliderUpdateSpeed.MyObject:SetValue (_detalhes.update_speed) + + elseif (amount == 4) then + slider.amt:SetText (">= 6gb") + _detalhes.memory_ram = 128 + _detalhes.segments_amount = 25 + _detalhes.segments_amount_to_save = 5 + _detalhes.update_speed = 0.5 + + _G.DetailsOptionsWindowSlider.MyObject:SetValue (_detalhes.segments_amount) + _G.DetailsOptionsWindowSliderSegmentsSave.MyObject:SetValue (_detalhes.segments_amount_to_save) + _G.DetailsOptionsWindowSliderUpdateSpeed.MyObject:SetValue (_detalhes.update_speed) + + end + + _detalhes.memory_threshold = amount + + return true + end) + window.memorySlider.tooltip = "Details! try adjust it self with the amount of memory\navaliable on your system.\n\nAlso is recommeded keep the amount of\nsegments low if your system have 2gb ram or less." + window.memorySlider.thumb:SetSize (40, 12) + window.memorySlider.thumb:SetTexture ([[Interface\Buttons\UI-Listbox-Highlight2]]) + window.memorySlider.thumb:SetVertexColor (.2, .2, .2, .9) + local t = _detalhes.memory_threshold + window.memorySlider:SetValue (1) + window.memorySlider:SetValue (2) + window.memorySlider:SetValue (t) + --------------- Max Segments g:NewLabel (window, _, "$parentSliderLabel", "segmentsLabel", "max segments") - window.segmentsLabel:SetPoint (10, -35) + window.segmentsLabel:SetPoint (10, -50) -- - g:NewSlider (window, _, "$parentSlider", "segmentsSlider", 120, 20, 1, 25, 1, _detalhes.segments_amount) -- min, max, step, defaultv + window.segmentsSlider:SetPoint ("left", window.segmentsLabel, "right") window.segmentsSlider:SetHook ("OnValueChange", function (self, _, amount) --> slider, fixedValue, sliderValue _detalhes.segments_amount = math.floor (amount) @@ -41,18 +115,18 @@ function _detalhes:OpenOptionsWindow (instance) --------------- Max Segments Saved g:NewLabel (window, _, "$parentLabelSegmentsSave", "segmentsSaveLabel", "segments saved on logout") - window.segmentsSaveLabel:SetPoint (10, -50) + window.segmentsSaveLabel:SetPoint (10, -65) -- - g:NewSlider (window, _, "$parentSliderSegmentsSave", "segmentsSliderToSave", 80, 20, 1, 5, 1, _detalhes.segments_amount_to_save) -- min, max, step, defaultv + window.segmentsSliderToSave:SetPoint ("left", window.segmentsSaveLabel, "right") window.segmentsSliderToSave:SetHook ("OnValueChange", function (self, _, amount) --> slider, fixedValue, sliderValue - _detalhes.segments_amount_to_save = amount + _detalhes.segments_amount_to_save = math.floor (amount) end) window.segmentsSliderToSave.tooltip = "How many segments will be saved on logout.\nHigher values may increase the time between a\nlogout button click and your character selection screen.\nIf you rarely check last day data, it`s high recommeded save only 1." --------------- Panic Mode g:NewLabel (window, _, "$parentPanicModeLabel", "panicModeLabel", "panic mode") - window.panicModeLabel:SetPoint (10, -65) + window.panicModeLabel:SetPoint (10, -80) -- g:NewSwitch (window, _, "$parentPanicModeSlider", "panicModeSlider", 60, 20, _, _, _detalhes.segments_panic_mode) window.panicModeSlider:SetPoint ("left", window.panicModeLabel, "right") @@ -63,7 +137,7 @@ function _detalhes:OpenOptionsWindow (instance) --------------- Animate Rows g:NewLabel (window, _, "$parentAnimateLabel", "animateLabel", "dance bars") - window.animateLabel:SetPoint (10, -80) + window.animateLabel:SetPoint (10, -95) -- g:NewSwitch (window, _, "$parentAnimateSlider", "animateSlider", 60, 20, _, _, _detalhes.use_row_animations) -- ltext, rtext, defaultv window.animateSlider:SetPoint ("left",window.animateLabel, "right") @@ -71,22 +145,9 @@ function _detalhes:OpenOptionsWindow (instance) _detalhes.use_row_animations = value end - --------------- Clear Ungrouped - --[[ - g:NewLabel (window, _, "$parentClearUngroupedLabel", "clearungroupedLabel", "delete ungrouped on logout") - window.clearungroupedLabel:SetPoint (10, -65) - -- - g:NewSwitch (window, _, "$parentClearUngroupedSlider", "clearungroupedSlider", 60, 20, _, _, _detalhes.clear_ungrouped) -- ltext, rtext, defaultv - window.clearungroupedSlider:SetPoint ("left", window.clearungroupedLabel, "right") - window.clearungroupedSlider.OnSwitch = function (self, _, value) --> slider, fixedValue, sliderValue - _detalhes.clear_ungrouped = value - end - window.clearungroupedSlider.tooltip = "erase actors without a group when you logout." - --]] - --------------- Use Scroll Bar g:NewLabel (window, _, "$parentUseScrollLabel", "scrollLabel", "show scroll bar") - window.scrollLabel:SetPoint (10, -95) + window.scrollLabel:SetPoint (10, -110) -- g:NewSwitch (window, _, "$parentUseScrollSlider", "scrollSlider", 60, 20, _, _, _detalhes.use_scroll) -- ltext, rtext, defaultv window.scrollSlider:SetPoint ("left", window.scrollLabel, "right") @@ -110,7 +171,7 @@ function _detalhes:OpenOptionsWindow (instance) --------------- Animate scroll bar g:NewLabel (window, _, "$parentAnimateScrollLabel", "animatescrollLabel", "animate scroll") - window.animatescrollLabel:SetPoint (10, -110) + window.animatescrollLabel:SetPoint (10, -125) -- g:NewSwitch (window, _, "$parentClearAnimateScrollSlider", "animatescrollSlider", 60, 20, _, _, _detalhes.animate_scroll) -- ltext, rtext, defaultv window.animatescrollSlider:SetPoint ("left", window.animatescrollLabel, "right") @@ -120,9 +181,9 @@ function _detalhes:OpenOptionsWindow (instance) --------------- Update Speed g:NewLabel (window, _, "$parentUpdateSpeedLabel", "updatespeedLabel", "update speed") - window.updatespeedLabel:SetPoint (10, -125) + window.updatespeedLabel:SetPoint (10, -143) -- - g:NewSlider (window, _, "$parentSliderUpdateSpeed", "updatespeedSlider", 160, 20, 0.3, 3, 0.1, _detalhes.update_speed, true) --parent, container, name, member, w, h, min, max, step, defaultv + --g:NewSlider (window, _, "$parentSliderUpdateSpeed", "updatespeedSlider", 160, 20, 0.3, 3, 0.1, _detalhes.update_speed, true) --parent, container, name, member, w, h, min, max, step, defaultv window.updatespeedSlider:SetPoint ("left", window.updatespeedLabel, "right") window.updatespeedSlider:SetThumbSize (50) window.updatespeedSlider.useDecimals = true @@ -147,7 +208,7 @@ function _detalhes:OpenOptionsWindow (instance) --------------- Time Type g:NewLabel (window, _, "$parentTimeTypeLabel", "timetypeLabel", "time measure") - window.timetypeLabel:SetPoint (10, -143) + window.timetypeLabel:SetPoint (10, -163) -- local onSelectTimeType = function (_, _, timetype) _detalhes.time_type = timetype @@ -165,23 +226,23 @@ function _detalhes:OpenOptionsWindow (instance) --------------- Captures g:NewImage (window, _, "$parentCaptureDamage", "damageCaptureImage", 20, 20, [[Interface\AddOns\Details\images\atributos_captures]]) - window.damageCaptureImage:SetPoint (10, -163) + window.damageCaptureImage:SetPoint (10, -183) window.damageCaptureImage:SetTexCoord (0, 0.125, 0, 1) g:NewImage (window, _, "$parentCaptureHeal", "healCaptureImage", 20, 20, [[Interface\AddOns\Details\images\atributos_captures]]) - window.healCaptureImage:SetPoint (10, -183) + window.healCaptureImage:SetPoint (10, -203) window.healCaptureImage:SetTexCoord (0.125, 0.25, 0, 1) g:NewImage (window, _, "$parentCaptureEnergy", "energyCaptureImage", 20, 20, [[Interface\AddOns\Details\images\atributos_captures]]) - window.energyCaptureImage:SetPoint (10, -203) + window.energyCaptureImage:SetPoint (10, -223) window.energyCaptureImage:SetTexCoord (0.25, 0.375, 0, 1) g:NewImage (window, _, "$parentCaptureMisc", "miscCaptureImage", 20, 20, [[Interface\AddOns\Details\images\atributos_captures]]) - window.miscCaptureImage:SetPoint (10, -223) + window.miscCaptureImage:SetPoint (10, -243) window.miscCaptureImage:SetTexCoord (0.375, 0.5, 0, 1) g:NewImage (window, _, "$parentCaptureAura", "auraCaptureImage", 20, 20, [[Interface\AddOns\Details\images\atributos_captures]]) - window.auraCaptureImage:SetPoint (10, -243) + window.auraCaptureImage:SetPoint (10, -263) window.auraCaptureImage:SetTexCoord (0.5, 0.625, 0, 1) g:NewLabel (window, _, "$parentCaptureDamageLabel", "damageCaptureLabel", "Damage") @@ -247,7 +308,7 @@ function _detalhes:OpenOptionsWindow (instance) --------------- Cloud Capture g:NewLabel (window, _, "$parentCloudCaptureLabel", "cloudCaptureLabel", "Cloud Capture") - window.cloudCaptureLabel:SetPoint (10, -268) + window.cloudCaptureLabel:SetPoint (10, -288) g:NewSwitch (window, _, "$parentCloudAuraSlider", "cloudCaptureSlider", 60, 20, _, _, _detalhes.cloud_capture) window.cloudCaptureSlider:SetPoint ("left", window.cloudCaptureLabel, "right", 2) @@ -258,7 +319,7 @@ function _detalhes:OpenOptionsWindow (instance) --------------- Max Instances g:NewLabel (window, _, "$parentLabelMaxInstances", "maxInstancesLabel", "max instances") - window.maxInstancesLabel:SetPoint (10, -288) + window.maxInstancesLabel:SetPoint (10, -314) -- g:NewSlider (window, _, "$parentSliderMaxInstances", "maxInstancesSlider", 150, 20, 12, 30, 1, _detalhes.instances_amount) -- min, max, step, defaultv window.maxInstancesSlider:SetPoint ("left", window.maxInstancesLabel, "right") @@ -267,8 +328,11 @@ function _detalhes:OpenOptionsWindow (instance) end) window.maxInstancesSlider.tooltip = "Amount of windows which can be created." --- Current Instalnce -------------------------------------------------------------------------------------------------------------------------------------------- + +-- Current Instalnce -------------------------------------------------------------------------------------------------------------------------------------------- + + --------------- Row textures g:NewLabel (window, _, "$parentTextureLabel", "textureLabel", "row style") window.textureLabel:SetPoint (250, -30) @@ -351,6 +415,8 @@ function _detalhes:OpenOptionsWindow (instance) local selectedAlpha = function() local r, g, b = ColorPickerFrame:GetColorRGB() local a = OpacitySliderFrame:GetValue() + + a = _detalhes:Scale (0, 1, 0.5, 1, a) - 0.5 window.instancecolortexture:SetTexture (r, g, b) window.instancecolortexture:SetAlpha (a) @@ -362,8 +428,9 @@ function _detalhes:OpenOptionsWindow (instance) local colorpick = function() ColorPickerFrame.func = selectedColor + ColorPickerFrame.opacityFunc = selectedAlpha ColorPickerFrame.cancelFunc = canceledColor - ColorPickerFrame.hasOpacity = false + ColorPickerFrame.hasOpacity = true --false ColorPickerFrame.opacity = window.instance.color[4] or 1 ColorPickerFrame.previousValues = window.instance.color ColorPickerFrame:SetParent (window.widget) @@ -371,7 +438,7 @@ function _detalhes:OpenOptionsWindow (instance) ColorPickerFrame:Show() end - g:NewImage (window, _, "$parentInstanceColorTexture", "instancecolortexture", 100, 12) + g:NewImage (window, _, "$parentInstanceColorTexture", "instancecolortexture", 150, 12) window.instancecolortexture:SetPoint ("left", window.instancecolor, "right", 2) window.instancecolortexture:SetTexture (1, 1, 1) @@ -634,6 +701,7 @@ function _detalhes:OpenOptionsWindow (instance) if (tinstance.wallpaper.texture:find ("TALENTFRAME")) then g:ImageEditor (callmeback, tinstance.wallpaper.texture, tinstance.wallpaper.texcoord, tinstance.wallpaper.overlay, window.instance.baseframe.wallpaper:GetWidth(), window.instance.baseframe.wallpaper:GetHeight()) else + tinstance.wallpaper.overlay [4] = 0.5 g:ImageEditor (callmeback, tinstance.wallpaper.texture, tinstance.wallpaper.texcoord, tinstance.wallpaper.overlay, window.instance.baseframe.wallpaper:GetWidth(), window.instance.baseframe.wallpaper:GetHeight()) end end @@ -648,6 +716,35 @@ function _detalhes:OpenOptionsWindow (instance) window.editImage:InstallCustomTexture() window.editImage:SetPoint ("left", window.anchorDropdown, "right", 2) + -- + + --------------- Alpha + g:NewLabel (window, _, "$parentAlphaLabel", "alphaLabel", "transparency") + window.alphaLabel:SetPoint (250, -230) + -- + g:NewSlider (window, _, "$parentAlphaSlider", "alphaSlider", 160, 20, 0.02, 1, 0.02, instance.bg_alpha, true) -- min, max, step, defaultv + window.alphaSlider:SetPoint ("left", window.alphaLabel, "right", 2, 0) + window.alphaSlider.useDecimals = true + window.alphaSlider:SetHook ("OnValueChange", function (self, instance, amount) --> slider, fixedValue, sliderValue + self.amt:SetText (string.format ("%.2f", amount)) + instance:SetBackgroundAlpha (amount) + return true + end) + window.alphaSlider.thumb:SetSize (30+(120*0.2)+2, 20*1.2) + window.alphaSlider.tooltip = "Change the background alpha for this instance" + + --------------- Auto Current Segment + + g:NewLabel (window, _, "$parentAutoCurrentLabel", "autoCurrentLabel", "auto switch to current") + window.autoCurrentLabel:SetPoint (250, -253) + + g:NewSwitch (window, _, "$parentAutoCurrentSlider", "autoCurrentSlider", 60, 20, _, _, instance.auto_current) + window.autoCurrentSlider:SetPoint ("left", window.autoCurrentLabel, "right", 2) + window.autoCurrentSlider.tooltip = "Whenever a combat start and there is no other instance on\ncurrent segment, this instance auto switch to current segment." + window.autoCurrentSlider.OnSwitch = function (self, instance, value) + instance.auto_current = value + end + ----------------------- Save Style Text Entry and Button ----------------------------------------- ----- style name @@ -666,7 +763,8 @@ function _detalhes:OpenOptionsWindow (instance) fontSize = tonumber (window.fonsizeSlider.value), fontFace = window.fontDropdown.value, color = window.instance.color, - wallpaper = instance.wallpaper + wallpaper = instance.wallpaper, + alpha = tonumber (window.alphaSlider.value) } _detalhes.savedStyles [#_detalhes.savedStyles+1] = savedObject window.saveStyleName.text = "" @@ -695,6 +793,8 @@ function _detalhes:OpenOptionsWindow (instance) instance:InstanceColor (style.color) --wallpaper instance:InstanceWallpaper (style.wallpaper) + --alpha + instance:SetBackgroundAlpha (style.alpha or _detalhes.default_bg_alpha) --refresh instance:RefreshBars() --update options @@ -703,6 +803,7 @@ function _detalhes:OpenOptionsWindow (instance) _G.DetailsOptionsWindowTextureDropdown.MyObject:Select (style.texture) _G.DetailsOptionsWindowFontDropdown.MyObject:Select (style.fontFace) _G.DetailsOptionsWindowSliderFontSize.MyObject:SetValue (style.fontSize) + _G.DetailsOptionsWindowAlphaSlider.MyObject:SetValue (style.alpha or _detalhes.default_bg_alpha) end local createLoadMenu = function() @@ -809,6 +910,12 @@ function _detalhes:OpenOptionsWindow (instance) _G.DetailsOptionsWindowSliderFontSize.MyObject:SetFixedParameter (instance) _G.DetailsOptionsWindowSliderFontSize.MyObject:SetValue (instance.barrasInfo.fontSize) -- + _G.DetailsOptionsWindowAutoCurrentSlider.MyObject:SetFixedParameter (instance) + _G.DetailsOptionsWindowAutoCurrentSlider.MyObject:SetValue (instance.auto_current) + -- + _G.DetailsOptionsWindowAlphaSlider.MyObject:SetFixedParameter (instance) + _G.DetailsOptionsWindowAlphaSlider.MyObject:SetValue (instance.bg_alpha) + -- _G.DetailsOptionsWindowUseBackgroundSlider.MyObject:SetFixedParameter (instance) _G.DetailsOptionsWindowBackgroundDropdown.MyObject:SetFixedParameter (instance) _G.DetailsOptionsWindowBackgroundDropdown2.MyObject:SetFixedParameter (instance) diff --git a/gumps/janela_principal.lua b/gumps/janela_principal.lua index a6f93d39..0b4bc80a 100644 --- a/gumps/janela_principal.lua +++ b/gumps/janela_principal.lua @@ -1,3 +1,6 @@ + +--note: this file need a major clean up especially on function creation. + local _detalhes = _G._detalhes local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" ) @@ -1333,7 +1336,7 @@ local function button_stretch_scripts (BaseFrame, BackGroundDisplay, instancia) _detalhes:SendEvent ("DETAILS_INSTANCE_SIZECHANGED", nil, esta_instancia) local _r, _g, _b, _a = esta_instancia.baseframe:GetBackdropColor() - gump:GradientEffect ( esta_instancia.baseframe, "frame", _r, _g, _b, _a, _detalhes.default_bg_color, _detalhes.default_bg_color, _detalhes.default_bg_color, _detalhes.default_bg_alpha, 0.5) + gump:GradientEffect ( esta_instancia.baseframe, "frame", _r, _g, _b, _a, instancia.bg_r, instancia.bg_g, instancia.bg_b, instancia.bg_alpha, 0.5) if (esta_instancia.wallpaper.enabled) then _r, _g, _b = esta_instancia.baseframe.wallpaper:GetVertexColor() @@ -1351,7 +1354,7 @@ local function button_stretch_scripts (BaseFrame, BackGroundDisplay, instancia) end local _r, _g, _b, _a = BaseFrame:GetBackdropColor() - gump:GradientEffect ( BaseFrame, "frame", _r, _g, _b, _a, _detalhes.default_bg_color, _detalhes.default_bg_color, _detalhes.default_bg_color, _detalhes.default_bg_alpha, 0.5) + gump:GradientEffect ( BaseFrame, "frame", _r, _g, _b, _a, instancia.bg_r, instancia.bg_g, instancia.bg_b, instancia.bg_alpha, 0.5) if (instancia.wallpaper.enabled) then _r, _g, _b = BaseFrame.wallpaper:GetVertexColor() _a = BaseFrame.wallpaper:GetAlpha() @@ -1630,7 +1633,7 @@ function CreateAlertFrame (BaseFrame, instancia) local rotate_frame = CreateFrame ("frame", nil, alert_bg) rotate_frame:SetWidth (12) - rotate_frame:SetPoint ("right", alert_bg, "right") + rotate_frame:SetPoint ("right", alert_bg, "right", -2, 0) rotate_frame:SetHeight (alert_bg:GetWidth()) local icon = rotate_frame:CreateTexture (nil, "overlay") @@ -1790,7 +1793,7 @@ function gump:CriaJanelaPrincipal (ID, instancia, criando) BaseFrame:SetMaxResize (_detalhes.max_window_size.width, _detalhes.max_window_size.height) BaseFrame:SetBackdrop (gump_fundo_backdrop) - BaseFrame:SetBackdropColor (_detalhes.default_bg_color, _detalhes.default_bg_color, _detalhes.default_bg_color, _detalhes.default_bg_alpha) + BaseFrame:SetBackdropColor (instancia.bg_r, instancia.bg_g, instancia.bg_b, instancia.bg_alpha) --BaseFrame:SetBackdropColor (0, 0, 0, 1) -- fundo @@ -1803,7 +1806,7 @@ function gump:CriaJanelaPrincipal (ID, instancia, criando) BackGroundDisplay:SetPoint ("TOPLEFT", BaseFrame, "TOPLEFT") BackGroundDisplay:SetPoint ("BOTTOMRIGHT", BaseFrame, "BOTTOMRIGHT") BackGroundDisplay:SetBackdrop (gump_fundo_backdrop) - BackGroundDisplay:SetBackdropColor (_detalhes.default_bg_color, _detalhes.default_bg_color, _detalhes.default_bg_color, _detalhes.default_bg_alpha) + BackGroundDisplay:SetBackdropColor (instancia.bg_r, instancia.bg_g, instancia.bg_b, instancia.bg_alpha) --BackGroundDisplay:SetBackdropColor (0, 0, 0, 1) @@ -1832,9 +1835,14 @@ function gump:CriaJanelaPrincipal (ID, instancia, criando) if (not _detalhes.initializing) then instancia._version:Hide() end - + --[[ BaseFrame.wallpaper = BaseFrame:CreateTexture (nil, "border") BaseFrame.wallpaper:Hide() + BaseFrame.wallpaperUP = BackGroundDisplay:CreateTexture (nil, "overlay") + BaseFrame.wallpaperUP:Hide() + --]] + BaseFrame.wallpaper = BackGroundDisplay:CreateTexture (nil, "overlay") + BaseFrame.wallpaper:Hide() BaseFrame.alert = CreateAlertFrame (BaseFrame, instancia) @@ -2241,7 +2249,7 @@ function _detalhes:InstanceWallpaper (texture, anchor, alpha, texcoord, width, h t:SetPoint ("topleft", self.baseframe, "topleft") t:SetPoint ("bottomright", self.baseframe, "bottomright") elseif (anchor == "center") then - t:SetPoint ("center", self.baseframe, "center") + t:SetPoint ("center", self.baseframe, "center", 0, 4) elseif (anchor == "stretchLR") then t:SetPoint ("center", self.baseframe, "center") t:SetPoint ("left", self.baseframe, "left") @@ -2380,7 +2388,9 @@ end function _detalhes:UnConsolidateIcons() self.consolidate = false - print (self.consolidateButton:GetObjectType()) + if (not self.consolidateButton) then + return self:DefaultIcons() + end self.consolidateButton:Hide() return self:DefaultIcons() end @@ -2446,10 +2456,10 @@ function _detalhes:DefaultIcons (_mode, _segment, _attributes, _report) if (_thisIcon2:IsShown()) then _thisIcon:ClearAllPoints() if (self.consolidate) then - _thisIcon:SetPoint ("topleft", _thisIcon2, "bottomleft", anchors[index][1], anchors[index][2]-2) + _thisIcon:SetPoint ("topleft", _thisIcon2.widget or _thisIcon2, "bottomleft", anchors[index][1], anchors[index][2]-2) _thisIcon:SetParent (self.consolidateFrame) else - _thisIcon:SetPoint ("left", _thisIcon2, "right", 0 + anchors[index][1], 0 + anchors[index][2]) + _thisIcon:SetPoint ("left", _thisIcon2.widget or _thisIcon2, "right", 0 + anchors[index][1], 0 + anchors[index][2]) _thisIcon:SetParent (self.baseframe) _thisIcon:SetFrameLevel (self.baseframe.UPFrame:GetFrameLevel()+1) end @@ -2476,6 +2486,7 @@ function _detalhes:DefaultIcons (_mode, _segment, _attributes, _report) return true end +local empty_segment_color = {1, 1, 1, .4} function gump:CriaCabecalho (BaseFrame, instancia) @@ -2697,6 +2708,23 @@ function gump:CriaCabecalho (BaseFrame, instancia) end) --> SELECIONAR O SEGMENTO ---------------------------------------------------------------------------------------------------------------------------------------------------- + + --[[ + BaseFrame.cabecalho.segmento = gump:NewButton (BaseFrame, nil, "DetailsSegmentButton"..instancia.meu_id, nil, 16, 16, function() end, nil, nil, "Interface\GossipFrame\TrainerGossipIcon") + BaseFrame.cabecalho.segmento:SetFrameLevel (BaseFrame.UPFrame:GetFrameLevel()+1) + + BaseFrame.cabecalho.segmento:SetHook ("OnMouseUp", function (button, buttontype) + if (buttontype == "LeftButton") then + local segmento_goal = instancia.segmento + 1 + if (segmento_goal > _detalhes.segments_amount) then + + end + elseif (buttontype == "RightButton") then + --instancia:TrocaTabela (-2) + end + end) + --]] + BaseFrame.cabecalho.segmento = gump:NewDetailsButton (BaseFrame, _, instancia, instancia.TrocaTabela, instancia, -2, 16, 16, "Interface\\GossipFrame\\TrainerGossipIcon") BaseFrame.cabecalho.segmento:SetFrameLevel (BaseFrame.UPFrame:GetFrameLevel()+1) @@ -2727,51 +2755,79 @@ function gump:CriaCabecalho (BaseFrame, instancia) ----------- segments local menuIndex = 0 _detalhes.segments_amount = math.floor (_detalhes.segments_amount) + + local fight_amount = 0 + + local filled_segments = 0 + for i = 1, _detalhes.segments_amount do + if (_detalhes.tabela_historico.tabelas [i]) then + filled_segments = filled_segments + 1 + else + break + end + end + + filled_segments = _detalhes.segments_amount - filled_segments - 2 + local fill = math.abs (filled_segments - _detalhes.segments_amount) + for i = _detalhes.segments_amount, 1, -1 do - local thisCombat = _detalhes.tabela_historico.tabelas [i] - if (thisCombat) then - local enemy = thisCombat.is_boss and thisCombat.is_boss.name + if (i <= fill) then - if (thisCombat.is_boss and thisCombat.is_boss.name) then - CoolTip:AddLine (thisCombat.is_boss.name .." (#"..i..")", _, 1, "red") - local portrait = _detalhes:GetBossPortrait (thisCombat.is_boss.mapid, thisCombat.is_boss.index) - if (portrait) then - CoolTip:AddIcon (portrait, 2, "top", 128, 64) - end - else - enemy = thisCombat.enemy - if (enemy) then - CoolTip:AddLine (thisCombat.enemy .." (#"..i..")", _, 1, "yellow") + local thisCombat = _detalhes.tabela_historico.tabelas [i] + if (thisCombat) then + local enemy = thisCombat.is_boss and thisCombat.is_boss.name + + if (thisCombat.is_boss and thisCombat.is_boss.name) then + + if (thisCombat.is_boss.killed) then + CoolTip:AddLine (thisCombat.is_boss.name .." (#"..i..")", _, 1, "lime") + else + CoolTip:AddLine (thisCombat.is_boss.name .." (#"..i..")", _, 1, "red") + end + + local portrait = _detalhes:GetBossPortrait (thisCombat.is_boss.mapid, thisCombat.is_boss.index) + if (portrait) then + CoolTip:AddIcon (portrait, 2, "top", 128, 64) + end + CoolTip:AddIcon ([[Interface\AddOns\Details\images\icons]], "main", "left", 16, 16, 0.96875, 1, 0, 0.03125) else - CoolTip:AddLine (segmentos.past..i, _, 1, "silver") + enemy = thisCombat.enemy + if (enemy) then + CoolTip:AddLine (thisCombat.enemy .." (#"..i..")", _, 1, "yellow") + else + CoolTip:AddLine (segmentos.past..i, _, 1, "silver") + end + CoolTip:AddIcon ("Interface\\QUESTFRAME\\UI-Quest-BulletPoint", "main", "left", 16, 16) + end + + CoolTip:AddMenu (1, instancia.TrocaTabela, i) + + CoolTip:AddLine (Loc ["STRING_SEGMENT_ENEMY"] .. ":", enemy, 2, "white", "white") + + local decorrido = (thisCombat.end_time or _detalhes._tempo) - thisCombat.start_time + local minutos, segundos = _math_floor (decorrido/60), _math_floor (decorrido%60) + CoolTip:AddLine (Loc ["STRING_SEGMENT_TIME"] .. ":", minutos.."m "..segundos.."s", 2, "white", "white") + + CoolTip:AddLine (Loc ["STRING_SEGMENT_START"] .. ":", thisCombat.data_inicio, 2, "white", "white") + CoolTip:AddLine (Loc ["STRING_SEGMENT_END"] .. ":", thisCombat.data_fim or "in progress", 2, "white", "white") + + fight_amount = fight_amount + 1 + else + CoolTip:AddLine (Loc ["STRING_SEGMENT_LOWER"] .. " #" .. i, _, 1, "gray") + CoolTip:AddMenu (1, instancia.TrocaTabela, i) + CoolTip:AddIcon ("Interface\\QUESTFRAME\\UI-Quest-BulletPoint", "main", "left", 16, 16, nil, nil, nil, nil, empty_segment_color) + CoolTip:AddLine (Loc ["STRING_SEGMENT_EMPTY"], _, 2) + end + + if (menuIndex) then + menuIndex = menuIndex + 1 + if (instancia.segmento == i) then + CoolTip:SetLastSelected ("main", menuIndex) + menuIndex = nil end end - - CoolTip:AddMenu (1, instancia.TrocaTabela, i) - CoolTip:AddIcon ("Interface\\QUESTFRAME\\UI-Quest-BulletPoint", "main", "left", 16, 16) - - CoolTip:AddLine (Loc ["STRING_SEGMENT_ENEMY"] .. ":", enemy, 2, "white", "white") - - local decorrido = (thisCombat.end_time or _detalhes._tempo) - thisCombat.start_time - local minutos, segundos = _math_floor (decorrido/60), _math_floor (decorrido%60) - CoolTip:AddLine (Loc ["STRING_SEGMENT_TIME"] .. ":", minutos.."m "..segundos.."s", 2, "white", "white") - - CoolTip:AddLine (Loc ["STRING_SEGMENT_START"] .. ":", thisCombat.data_inicio, 2, "white", "white") - CoolTip:AddLine (Loc ["STRING_SEGMENT_END"] .. ":", thisCombat.data_fim or "in progress", 2, "white", "white") - else - CoolTip:AddLine (Loc ["STRING_SEGMENT_LOWER"] .. " #" .. i, _, 1, "gray") - CoolTip:AddMenu (1, instancia.TrocaTabela, i) - CoolTip:AddIcon ("Interface\\QUESTFRAME\\UI-Quest-BulletPoint", "main", "left", 16, 16) - CoolTip:AddLine (Loc ["STRING_SEGMENT_EMPTY"], _, 2) - end - if (menuIndex) then - menuIndex = menuIndex + 1 - if (instancia.segmento == i) then - CoolTip:SetLastSelected ("main", menuIndex) - menuIndex = nil - end end end @@ -2779,7 +2835,7 @@ function gump:CriaCabecalho (BaseFrame, instancia) ----------- current CoolTip:AddLine (segmentos.current_standard, _, 1, "white") CoolTip:AddMenu (1, instancia.TrocaTabela, 0) - CoolTip:AddIcon ("Interface\\QUESTFRAME\\UI-Quest-BulletPoint", "main", "left", 16, 16) + CoolTip:AddIcon ("Interface\\QUESTFRAME\\UI-Quest-BulletPoint", "main", "left", 16, 16, nil, nil, nil, nil, "orange") local enemy = _detalhes.tabela_vigente.is_boss and _detalhes.tabela_vigente.is_boss.name or _detalhes.tabela_vigente.enemy or "--x--x--" @@ -2810,15 +2866,17 @@ function gump:CriaCabecalho (BaseFrame, instancia) CoolTip:AddLine (Loc ["STRING_SEGMENT_START"] .. ":", _detalhes.tabela_vigente.data_inicio, 2, "white", "white") CoolTip:AddLine (Loc ["STRING_SEGMENT_END"] .. ":", _detalhes.tabela_vigente.data_fim or "in progress", 2, "white", "white") + --> fill é a quantidade de menu que esta sendo mostrada if (instancia.segmento == 0) then - CoolTip:SetLastSelected ("main", _detalhes.segments_amount + 1) + CoolTip:SetLastSelected ("main", fill + 1) menuIndex = nil end ----------- overall - CoolTip:AddLine (segmentos.overall_standard, _, 1, "white") + --CoolTip:AddLine (segmentos.overall_standard, _, 1, "white") Loc ["STRING_REPORT_LAST"] .. " " .. fight_amount .. " " .. Loc ["STRING_REPORT_FIGHTS"] + CoolTip:AddLine (Loc ["STRING_SEGMENT_OVERALL"], _, 1, "white") CoolTip:AddMenu (1, instancia.TrocaTabela, -1) - CoolTip:AddIcon ("Interface\\QUESTFRAME\\UI-Quest-BulletPoint", "main", "left", 16, 16) + CoolTip:AddIcon ("Interface\\QUESTFRAME\\UI-Quest-BulletPoint", "main", "left", 16, 16, nil, nil, nil, nil, "orange") CoolTip:AddLine (Loc ["STRING_SEGMENT_ENEMY"] .. ":", "--x--x--", 2, "white", "white")--localize-me @@ -2854,8 +2912,9 @@ function gump:CriaCabecalho (BaseFrame, instancia) end CoolTip:AddLine (Loc ["STRING_SEGMENT_END"] .. ":", lastFight, 2, "white", "white") + --> fill é a quantidade de menu que esta sendo mostrada if (instancia.segmento == -1) then - CoolTip:SetLastSelected ("main", _detalhes.segments_amount + 2) + CoolTip:SetLastSelected ("main", fill + 2) menuIndex = nil end @@ -2911,7 +2970,7 @@ function gump:CriaCabecalho (BaseFrame, instancia) --> SELECIONAR O ATRIBUTO ---------------------------------------------------------------------------------------------------------------------------------------------------- BaseFrame.cabecalho.atributo = gump:NewDetailsButton (BaseFrame, _, instancia, instancia.TrocaTabela, instancia, -3, 16, 16, "Interface\\AddOns\\Details\\images\\sword") BaseFrame.cabecalho.atributo:SetFrameLevel (BaseFrame.UPFrame:GetFrameLevel()+1) - BaseFrame.cabecalho.atributo:SetPoint ("left", BaseFrame.cabecalho.segmento, "right", 0, 0) + BaseFrame.cabecalho.atributo:SetPoint ("left", BaseFrame.cabecalho.segmento.widget, "right", 0, 0) --> Cooltip automatic method through Injection diff --git a/gumps/janela_report.lua b/gumps/janela_report.lua index 66dace77..01efbe48 100644 --- a/gumps/janela_report.lua +++ b/gumps/janela_report.lua @@ -239,13 +239,13 @@ local _UISpecialFrames = UISpecialFrames --> wow api locals slider:SetThumbTexture (slider.thumb) --depois slider:SetOrientation ("HORIZONTAL") - slider:SetMinMaxValues (1, 25) - slider:SetValueStep (1) + slider:SetMinMaxValues (1.0, 25.0) + slider:SetValueStep (1.0) slider:SetWidth (232) slider:SetHeight (20) local last_value = _detalhes.report_lines or 5 - slider:SetValue (last_value) + slider:SetValue (math.floor (last_value)) slider.amt = slider:CreateFontString (nil, "OVERLAY", "GameFontHighlightSmall") local amt = slider:GetValue() @@ -258,7 +258,7 @@ local _UISpecialFrames = UISpecialFrames --> wow api locals slider.amt:SetPoint ("center", slider.thumb, "center") slider:SetScript ("OnValueChanged", function (self) - local amt = self:GetValue() + local amt = math.floor (self:GetValue()) _detalhes.report_lines = amt if (amt < 10) then amt = "0"..amt diff --git a/gumps/janela_welcome.lua b/gumps/janela_welcome.lua index 4f63f8b5..a783b0de 100644 --- a/gumps/janela_welcome.lua +++ b/gumps/janela_welcome.lua @@ -366,7 +366,7 @@ function _detalhes:OpenWelcomeWindow () interval_text:SetPoint ("topleft", window, "topleft", 30, -110) local dance_text = window:CreateFontString (nil, "overlay", "GameFontNormal") - dance_text:SetText ("Keeping 'Dance Bars' disabled may help save performance.") + dance_text:SetText ("Keeping 'Dance Bars' disabled also may help with performance.") dance_text:SetWidth (460) dance_text:SetHeight (40) dance_text:SetJustifyH ("left") @@ -421,6 +421,109 @@ function _detalhes:OpenWelcomeWindow () -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> page 5 + local bg44 = window:CreateTexture (nil, "overlay") + bg44:SetTexture ([[Interface\MainMenuBar\UI-MainMenuBar-EndCap-Human]]) + bg44:SetPoint ("bottomright", window, "bottomright", -10, 10) + bg44:SetHeight (125*3)--125 + bg44:SetWidth (89*3)--82 + bg44:SetAlpha (.1) + bg44:SetTexCoord (1, 0, 0, 1) + + g:NewLabel (window, _, "$parentChangeMind44Label", "changemind44Label", "if you change your mind, you can always modify again through options panel", "GameFontNormal", 9, "orange") + window.changemind44Label:SetPoint ("center", window, "center") + window.changemind44Label:SetPoint ("bottom", window, "bottom", 0, 19) + window.changemind44Label.align = "|" + + local texto44 = window:CreateFontString (nil, "overlay", "GameFontNormal") + texto44:SetPoint ("topleft", window, "topleft", 20, -80) + texto44:SetText ("Memory Adjustments:") + + local interval_text4 = window:CreateFontString (nil, "overlay", "GameFontNormal") + interval_text4:SetText ("The amount of memory used by addons doesn't affect framerate, but, saving memory in computers which doesn't have much of it, may help the whole system. Details! try to be as flexible as possible to keep the game smooth even in not high-end hardware.") + interval_text4:SetWidth (460) + interval_text4:SetHeight (60) + interval_text4:SetJustifyH ("left") + interval_text4:SetJustifyV ("top") + interval_text4:SetTextColor (1, 1, 1, 1) + interval_text4:SetPoint ("topleft", window, "topleft", 30, -110) + + --[[ + local dance_text = window:CreateFontString (nil, "overlay", "GameFontNormal") + dance_text:SetText ("Low amount of segments can keep memory .") + dance_text:SetWidth (460) + dance_text:SetHeight (40) + dance_text:SetJustifyH ("left") + dance_text:SetJustifyV ("top") + dance_text:SetTextColor (1, 1, 1, 1) + dance_text:SetPoint ("topleft", window, "topleft", 30, -170) + --]] + --------------- Max Segments + g:NewLabel (window, _, "$parentSliderLabel", "segmentsLabel", "max segments") + window.segmentsLabel:SetPoint (31, -170) + -- + g:NewSlider (window, _, "$parentSlider", "segmentsSlider", 120, 20, 1, 25, 1, _detalhes.segments_amount) -- min, max, step, defaultv + window.segmentsSlider:SetPoint ("left", window.segmentsLabel, "right", 2, 0) + window.segmentsSlider:SetHook ("OnValueChange", function (self, _, amount) --> slider, fixedValue, sliderValue + _detalhes.segments_amount = math.floor (amount) + end) + window.segmentsSlider.tooltip = "How many segments you want to maintain.\nFeel free to adjust this number to be comfortable for you." + + --------------- memory + g:NewLabel (window, _, "$parentLabelMemory", "memoryLabel", "memory threshold") + window.memoryLabel:SetPoint (31, -185) + -- + g:NewSlider (window, _, "$parentSliderMemory", "memorySlider", 130, 20, 1, 4, 1, _detalhes.memory_threshold) -- min, max, step, defaultv + window.memorySlider:SetPoint ("left", window.memoryLabel, "right", 2, 0) + window.memorySlider:SetHook ("OnValueChange", function (slider, _, amount) --> slider, fixedValue, sliderValue + + amount = math.floor (amount) + + if (amount == 1) then + slider.amt:SetText ("<= 1gb") + _detalhes.memory_ram = 16 + elseif (amount == 2) then + slider.amt:SetText ("2gb") + _detalhes.memory_ram = 32 + elseif (amount == 3) then + slider.amt:SetText ("4gb") + _detalhes.memory_ram = 64 + elseif (amount == 4) then + slider.amt:SetText (">= 6gb") + _detalhes.memory_ram = 128 + end + + _detalhes.memory_threshold = amount + return true + end) + window.memorySlider.tooltip = "Details! try adjust it self with the amount of memory\navaliable on your system.\n\nAlso is recommeded keep the amount of\nsegments low if your system have 2gb ram or less." + window.memorySlider.thumb:SetSize (40, 10) + window.memorySlider.thumb:SetTexture ([[Interface\Buttons\UI-Listbox-Highlight2]]) + window.memorySlider.thumb:SetVertexColor (.2, .2, .2, .9) + local t = _detalhes.memory_threshold + window.memorySlider:SetValue (1) + window.memorySlider:SetValue (2) + window.memorySlider:SetValue (t) + + --------------- Max Segments Saved + g:NewLabel (window, _, "$parentLabelSegmentsSave", "segmentsSaveLabel", "segments saved on logout") + window.segmentsSaveLabel:SetPoint (31, -200) + -- + g:NewSlider (window, _, "$parentSliderSegmentsSave", "segmentsSliderToSave", 120, 20, 1, 5, 1, _detalhes.segments_amount_to_save) -- min, max, step, defaultv + window.segmentsSliderToSave:SetPoint ("left", window.segmentsSaveLabel, "right") + window.segmentsSliderToSave:SetHook ("OnValueChange", function (self, _, amount) --> slider, fixedValue, sliderValue + _detalhes.segments_amount_to_save = math.floor (amount) + end) + window.segmentsSliderToSave.tooltip = "High values may increase the time between a\nlogout button click and your character selection screen.\n\nIf you rarely check 'last day data', it`s high recommeded save only 1." + + pages [#pages+1] = {bg44, window.changemind44Label, texto44, interval_text4, window.memorySlider, window.memoryLabel, window.segmentsLabel, window.segmentsSlider, window.segmentsSaveLabel, window.segmentsSliderToSave} + + for _, widget in ipairs (pages[#pages]) do + widget:Hide() + end + +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> page 6 + local bg6 = window:CreateTexture (nil, "overlay") bg6:SetTexture ([[Interface\MainMenuBar\UI-MainMenuBar-EndCap-Human]]) bg6:SetPoint ("bottomright", window, "bottomright", -10, 10) @@ -456,7 +559,7 @@ function _detalhes:OpenWelcomeWindow () end -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---> page 6 +--> page 7 local bg6 = window:CreateTexture (nil, "overlay") bg6:SetTexture ([[Interface\MainMenuBar\UI-MainMenuBar-EndCap-Human]]) @@ -493,7 +596,7 @@ function _detalhes:OpenWelcomeWindow () end -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---> page 7 +--> page 8 local bg7 = window:CreateTexture (nil, "overlay") bg7:SetTexture ([[Interface\MainMenuBar\UI-MainMenuBar-EndCap-Human]]) @@ -537,7 +640,125 @@ function _detalhes:OpenWelcomeWindow () end -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---> page 8 +--> page 9 + + local bg77 = window:CreateTexture (nil, "overlay") + bg77:SetTexture ([[Interface\MainMenuBar\UI-MainMenuBar-EndCap-Human]]) + bg77:SetPoint ("bottomright", window, "bottomright", -10, 10) + bg77:SetHeight (125*3)--125 + bg77:SetWidth (89*3)--82 + bg77:SetAlpha (.1) + bg77:SetTexCoord (1, 0, 0, 1) + + local texto77 = window:CreateFontString (nil, "overlay", "GameFontNormal") + texto77:SetPoint ("topleft", window, "topleft", 20, -80) + texto77:SetText ("Using the Interface: Snap Instances") + + local texto_snap = window:CreateFontString (nil, "overlay", "GameFontNormal") + texto_snap:SetPoint ("topleft", window, "topleft", 25, -101) + texto_snap:SetText ("You can |cFFFFFF00snap windows|r in vertical or horizontal. A window always snap with |cFFFFFF00previous instance number|r: like the image in the right, instance |cFFFFFF00#5|r snapped with |cFFFFFF00#4|r. When a snapped window is stretched, all other instances in the |cFFFFFF00cluster are also|r stretched.") + texto_snap:SetWidth (160) + texto_snap:SetHeight (110) + texto_snap:SetJustifyH ("left") + texto_snap:SetJustifyV ("top") + texto_snap:SetTextColor (1, 1, 1, 1) + local fonte, _, flags = texto_snap:GetFont() + texto_snap:SetFont (fonte, 11, flags) + + local snap_image1 = window:CreateTexture (nil, "overlay") + snap_image1:SetTexture ([[Interface\Addons\Details\images\icons]]) + snap_image1:SetPoint ("topright", window, "topright", -12, -95) + snap_image1:SetWidth (308) + snap_image1:SetHeight (121) + snap_image1:SetTexCoord (0, 0.6015625, 0.353515625, 0.58984375) + + + pages [#pages+1] = {bg77, texto77, snap_image1, texto_snap} + + for _, widget in ipairs (pages[#pages]) do + widget:Hide() + end + +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> page 10 + + local bg88 = window:CreateTexture (nil, "overlay") + bg88:SetTexture ([[Interface\MainMenuBar\UI-MainMenuBar-EndCap-Human]]) + bg88:SetPoint ("bottomright", window, "bottomright", -10, 10) + bg88:SetHeight (125*3)--125 + bg88:SetWidth (89*3)--82 + bg88:SetAlpha (.1) + bg88:SetTexCoord (1, 0, 0, 1) + + local texto88 = window:CreateFontString (nil, "overlay", "GameFontNormal") + texto88:SetPoint ("topleft", window, "topleft", 20, -80) + texto88:SetText ("Using the Interface: Micro Display") + --|cFFFFFF00 + local texto_micro_display = window:CreateFontString (nil, "overlay", "GameFontNormal") + texto_micro_display:SetPoint ("topleft", window, "topleft", 25, -101) + texto_micro_display:SetText ("All instances have three |cFFFFFF00mini widgets|r located at the bottom of window. |cFFFFFF00Right clicking|r pops up a menu and with |cFFFFFF00left click|r displays a options panel for that widget.") + texto_micro_display:SetWidth (160) + texto_micro_display:SetHeight (110) + texto_micro_display:SetJustifyH ("left") + texto_micro_display:SetJustifyV ("top") + texto_micro_display:SetTextColor (1, 1, 1, 1) + --local fonte, _, flags = texto_micro_display:GetFont() + --texto_micro_display:SetFont (fonte, 11, flags) + + local micro_image1 = window:CreateTexture (nil, "overlay") + micro_image1:SetTexture ([[Interface\Addons\Details\images\icons]]) + micro_image1:SetPoint ("topright", window, "topright", -12, -95) + micro_image1:SetWidth (303) + micro_image1:SetHeight (128) + micro_image1:SetTexCoord (0.408203125, 1, 0.09375, 0.341796875) + + pages [#pages+1] = {bg88, texto88, micro_image1, texto_micro_display} + + for _, widget in ipairs (pages[#pages]) do + widget:Hide() + end + +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> page 11 + + local bg11 = window:CreateTexture (nil, "overlay") + bg11:SetTexture ([[Interface\MainMenuBar\UI-MainMenuBar-EndCap-Human]]) + bg11:SetPoint ("bottomright", window, "bottomright", -10, 10) + bg11:SetHeight (125*3)--125 + bg11:SetWidth (89*3)--82 + bg11:SetAlpha (.1) + bg11:SetTexCoord (1, 0, 0, 1) + + local texto11 = window:CreateFontString (nil, "overlay", "GameFontNormal") + texto11:SetPoint ("topleft", window, "topleft", 20, -80) + texto11:SetText ("Using the Interface: Plugins") + --|cFFFFFF00 + local texto_plugins = window:CreateFontString (nil, "overlay", "GameFontNormal") + texto_plugins:SetPoint ("topleft", window, "topleft", 25, -101) + texto_plugins:SetText ("|cFFFFFF00Threat, tank avoidance, and others|r are handled by |cFFFFFF00plugins|r. You can open a new instance, select '|cFFFFFF00Widgets|r' and choose what you want at |cFFFFFF00sword|r menu.\n\nTip: click over a bar on |cFFFFFF00Vanguard|r to show avoidance numbers.") + texto_plugins:SetWidth (220) + texto_plugins:SetHeight (110) + texto_plugins:SetJustifyH ("left") + texto_plugins:SetJustifyV ("top") + texto_plugins:SetTextColor (1, 1, 1, 1) + --local fonte, _, flags = texto_plugins:GetFont() + --texto_plugins:SetFont (fonte, 11, flags) + + local plugins_image1 = window:CreateTexture (nil, "overlay") + plugins_image1:SetTexture ([[Interface\Addons\Details\images\icons2]]) + plugins_image1:SetPoint ("topright", window, "topright", -12, -35) + plugins_image1:SetWidth (226) + plugins_image1:SetHeight (181) + plugins_image1:SetTexCoord (0.55859375, 1, 0.646484375, 1) + + pages [#pages+1] = {bg11, texto11, plugins_image1, texto_plugins} + + for _, widget in ipairs (pages[#pages]) do + widget:Hide() + end + +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +--> page 12 local bg8 = window:CreateTexture (nil, "overlay") bg8:SetTexture ([[Interface\MainMenuBar\UI-MainMenuBar-EndCap-Human]]) @@ -583,6 +804,9 @@ function _detalhes:OpenWelcomeWindow () forward:Click() forward:Click() forward:Click() + forward:Click() + forward:Click() + forward:Click() --]] end diff --git a/images/icons.tga b/images/icons.tga index 1fab5292723da3a1b93d60e7cdda4d8b42879a67..e1493878a20c6c6e810c5a1323dac221ec3771dd 100644 GIT binary patch delta 229146 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 delta 2128 zcmdo0L1yb}{)QID7N#xCkD8{RYho4|B}T(wG#!j)1M-T3hh1#O{QrS~0Zcpqv8F%o zV{=9lyayI!o6P2oBzPArC^enU4@vM2SWsy;TL^}r+JdK1i=2X?~gZEW|@WoCnALUyygLYJ8V zmf3xP?Gw7pbg+!}F}5%0GE>1aYfiJhLzkHXmQlFK_G$V9MRt+t3Ks0F(@xYU*tTPr+53)dD|Q)<&uqJ}%kX?-+lMYQ5$x)m zpKOPw7s!IV#|8A>zCUaSrzeO5x!H{DCm<{-y}iAQtQNHUsto2usb7y#&HKWyoFwVU-!NmqS>x#xT|q zW0>Ab6ZU3^td1#6>>-@hXU5(Lku^7m$sRLj4+V=!F+f2`P^fE|XRxQgpKgSkr;n>1 F0|52h76kwR diff --git a/images/icons2.tga b/images/icons2.tga new file mode 100644 index 0000000000000000000000000000000000000000..a96090b2f9dddd77f0bd7cff89baf004802aac31 GIT binary patch literal 90867 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 report frame Loc ["STRING_REPORTFRAME_PARTY"] = "Party" + --Loc ["STRING_REPORTFRAME_INSTANCE"] = "Instance" Loc ["STRING_REPORTFRAME_RAID"] = "Raid" Loc ["STRING_REPORTFRAME_GUILD"] = "Guild" Loc ["STRING_REPORTFRAME_OFFICERS"] = "Officer Channel" diff --git a/locales/Details-ptBR.lua b/locales/Details-ptBR.lua index 1b41c4e0..4ea038b0 100644 --- a/locales/Details-ptBR.lua +++ b/locales/Details-ptBR.lua @@ -14,6 +14,7 @@ if not Loc then return end Loc ["STRING_RIGHT"] = "direita" Loc ["STRING_TOOOLD"] = "nao pode ser instalado pois sua versao do Details! e muito antiga." Loc ["STRING_TOOOLD2"] = "a sua versao do Details! nao e a mesma." + Loc ["STRING_CHANGED_TO_CURRENT"] = "Segmento trocado para atual" Loc ["STRING_INSTANCE_LIMIT"] = "o limite de instancias foi atingido, voce pode modificar este limite no painel de opcoes." @@ -55,6 +56,7 @@ if not Loc then return end Loc ["STRING_SEGMENT_END"] = "Fim" Loc ["STRING_SEGMENT_ENEMY"] = "Contra" Loc ["STRING_SEGMENT_TIME"] = "Tempo" + Loc ["STRING_SEGMENT_OVERALL"] = "Total dos Segmentos Atuais" Loc ["STRING_TOTAL"] = "Total" Loc ["STRING_OVERALL"] = "Dados Gerais" Loc ["STRING_CURRENT"] = "Atual" @@ -203,6 +205,7 @@ if not Loc then return end Loc ["STRING_PLUGIN_PDPSNAME"] = "Dps da Raide" Loc ["STRING_PLUGIN_THREATNAME"] = "Minha Ameaça" Loc ["STRING_PLUGIN_PATTRIBUTENAME"] = "Atributo" + Loc ["STRING_PLUGIN_CLEAN"] = "Nenhum" Loc ["STRING_PLUGINOPTIONS_COMMA"] = "Virgula" Loc ["STRING_PLUGINOPTIONS_ABBREVIATE"] = "Abreviar" diff --git a/plugins/Details_EncounterDetails/frames.lua b/plugins/Details_EncounterDetails/frames.lua index 992e62c9..70ab96e3 100644 --- a/plugins/Details_EncounterDetails/frames.lua +++ b/plugins/Details_EncounterDetails/frames.lua @@ -272,7 +272,7 @@ Message: ..\AddOns\Details_EncounterDetails\frames.lua line 156: end end - print ("DPSMAX: " .. dps_max .. " > " .. g.max_damage) + --print ("DPSMAX: " .. dps_max .. " > " .. g.max_damage) if (dps_max > g.max_damage) then diff --git a/plugins/Details_RaidInfo-SiegeOfOrgrimmar/SiegeOfOrgrimmar.lua b/plugins/Details_RaidInfo-SiegeOfOrgrimmar/SiegeOfOrgrimmar.lua index a4f1d3f1..e42f5cc9 100644 --- a/plugins/Details_RaidInfo-SiegeOfOrgrimmar/SiegeOfOrgrimmar.lua +++ b/plugins/Details_RaidInfo-SiegeOfOrgrimmar/SiegeOfOrgrimmar.lua @@ -88,12 +88,17 @@ local siege_of_orgrimmar = { spell_mechanics = { [143295] = {0x1, 0x2000}, --> Sha Bolt [143309] = {0x8, 0x40}, --> Swirl + [143413] = {0x8, 0x40}, --> Swirl [143436] = {0x100}, --> Corrosive Blast [143281] = {0x8}, --> Seeping Sha [143574] = {0x200}, --> Swelling Corruption [143498] = {0x1, 0x200, 0x2}, --> Erupting Sha - [143460] = {0x200}, --> Sha Pool + [143460] = {0x200}, --> Sha Pool [143286] = {0x40}, --> Seeping Sha + [143297] = {0x200}, --> Sha Splash + [145377] = {0x1}, --> Erupting Water + [143574] = {0x200}, --> Swelling Corruption (H) + [143460] = {0x200} --> }, phases = { @@ -102,9 +107,13 @@ local siege_of_orgrimmar = { spells = { 143295, --> Sha Bolt 143309, --> Swirl + 143413, --> Swirl 143436, --> Corrosive Blast 143281, --> Seeping Sha 143574, --> Swelling Corruption + 143297, --> Sha Splash + 145377, --> Erupting Water + 143574 --> Swelling Corruption (H) }, adds = { @@ -120,6 +129,9 @@ local siege_of_orgrimmar = { 143498, --> Erupting Sha 143460, --> Sha Pool 143286, --> Seeping Sha + 143297, --> Sha Splash + 145377, --> Erupting Wate + 143460 --> Sha Pool (H) }, adds = { @@ -141,9 +153,11 @@ local siege_of_orgrimmar = { [144397] = {0x8000, 0x1}, --> Vengeful Strikes (Rook Stonetoe) [143023] = {0x8}, --> Corrupted Brew (Rook Stonetoe) [143028] = {0x1}, --> Clash (Rook Stonetoe) + [143010] = {0x80}, --> Corruption Kick (Rook Stonetoe) [143009] = {0x80}, --> Corruption Kick (Rook Stonetoe) [144357] = {0x8, 0x1}, --> Defiled Ground (Embodied Misery) - [101000] = {0x10000}, --> Inferno Strike (Embodied Sorrow) + [143961] = {0x8, 0x1}, --> Defiled Ground (Embodied Misery) + [143962] = {0x10000}, --> Inferno Strike (Embodied Sorrow) [144018] = {0x20, 0x1}, --> Corruption Shock (Embodied Gloom) [143198] = {0x1}, --> Garrote (He Softfoot) @@ -151,21 +165,28 @@ local siege_of_orgrimmar = { [144367] = {0x8}, --> Noxious Poison (He Softfoot) [143224] = {0x1, 0x800}, --> Instant Poison (He Softfoot) [143808] = {0x1, 0x2}, --> Mark of Anguish (Embodied Anguish) + [144365] = {0x1, 0x2}, --> Mark of Anguish (Embodied Anguish) [143424] = {0x2000}, --> Sha Sear (Sun Tenderheart) [143434] = {0x1, 0x10}, --> Shadow Word: Bane (Sun Tenderheart) - [143544] = {0x1}, --> Calamity (Sun Tenderheart) + [143544] = {0x1}, --> Calamity (Sun Tenderheart) --ptr + [143493] = {0x1}, --> Calamity (Sun Tenderheart) --live [143559] = {0x1, 0x40}, --> Dark Meditation + [144007] = {}, --Residual Burn + [145631] = {}, --Corruption Chain + [143602] = {}, --Meditation Spike }, + + continuo = { 144397, --> Vengeful Strikes (Rook Stonetoe) 143023, --> Corrupted Brew (Rook Stonetoe) 143028, --> Clash (Rook Stonetoe) 143009, --> Corruption Kick (Rook Stonetoe) 144357, --> Defiled Ground (Embodied Misery) - 101000, --> Inferno Strike (Embodied Sorrow) + 143962, --> Inferno Strike (Embodied Sorrow) 144018, --> Corruption Shock (Embodied Gloom) 143198, --> Garrote (He Softfoot) @@ -178,6 +199,15 @@ local siege_of_orgrimmar = { 143434, --> Shadow Word: Bane (Sun Tenderheart) 143544, --> Calamity (Sun Tenderheart) 143559, --> Dark Meditation + + 143010, --> Corruption Kick (Rook Stonetoe) + 143493, --> Calamity (Sun Tenderheart) --live + 144365, --> Mark of Anguish (Embodied Anguish) + 143961, --> Defiled Ground (Embodied Misery) + + 144007, --Residual Burn + 145631, --Corruption Chain + 143602, --Meditation Spike }, phases = { @@ -199,7 +229,8 @@ local siege_of_orgrimmar = { 71474, --> Embodied Despair (Sun Tenderheart) 71482, --> Embodied Desperation (Sun Tenderheart) - 71993, --> Despair Spawns (Sun Tenderheart) + 71712, --> Despair Spawns (Sun Tenderheart) + 71993, --> Desperation Spawn } } } @@ -212,6 +243,8 @@ local siege_of_orgrimmar = { boss = "Norushen", portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Norushen]], + combat_end = {1, 72276}, + spell_mechanics = { [146707] = {0x1}, --> Disheartening Laugh [144514] = {0x10}, --> Lingering Corruption @@ -223,12 +256,14 @@ local siege_of_orgrimmar = { [145212] = {0x1}, --> Unleashed Anger [146124] = {0x100}, --> Self Doubt (not a damage) - [145733] = {0x1}, --> Icy Fear + [145733] = {0x1}, --> Icy Fear -ptr + [145735] = {0x1}, --> Icy Fear -live [145227] = {0x8, 0x40}, --> Blind Hatred [147082] = {0x1, 0x2}, --> Burst of Anger [145073] = {0x200, 0x8}, --> Residual Corruption [144548] = {0x200}, --> Expel Corruption + [145134] = {0x200}, --> Expel Corruption -live }, continuo = { @@ -243,11 +278,13 @@ local siege_of_orgrimmar = { 145212, --> Unleashed Anger 146124, --> Self Doubt 145733, --> Icy Fear + 145735, --> Icy Fear -live 145227, --> Blind Hatred 147082, --> Burst of Anger 145073, --> Residual Corruption 144548, --> Expel Corruption + 145134, --> Expel Corruption }, phases = { @@ -274,16 +311,28 @@ local siege_of_orgrimmar = { boss = "Sha of Pride", portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Sha of Pride]], + combat_end = {1, 71734}, + spell_mechanics = { [144400] = {0x1}, --> Swelling Pride [144774] = {0x40}, --> Reaching Attack [144358] = {0x100}, --> Wounded Pride (not a damage) - [144351] = {0x10}, --> Mark of Arrogance + [144351] = {0x10, 0x200}, --> Mark of Arrogance [144911] = {0x8}, --> Bursting Pride [145320] = {0x200}, --> Projection [146818] = {0x2000}, --> Aura of Pride [144379] = {0x20}, --> Mocking Blast [144832] = {0x1, 0x2}, --> Unleashed + [144836] = {0x1, 0x2}, --> Unleashed + [144788] = {0x200}, --> Self-Reflection + [144636] = {0x1, 0x200}, --> Corrupted Prison + [144684] = {0x1, 0x200}, --> Corrupted Prison + [144574] = {0x1, 0x200}, --> Corrupted Prison + [144683] = {0x1, 0x200}, --> Corrupted Prison + [144774] = {0x40}, --> Reaching Attack + + [145215] = {}, --Banishment + [147198] = {}, --Unstable Corruption }, continuo = { @@ -296,6 +345,16 @@ local siege_of_orgrimmar = { 146818, --> Aura of Pride 144379, --> Mocking Blast 144832, --> Unleashed + 144836, --> Unleashed + 144788, --> Self-Reflection + 144636, --> Corrupted Prison + 144684, --> Corrupted Prison + 144574, --> Corrupted Prison + 144683, --> Corrupted Prison + 144774, --> Reaching Attack + + 145215, --Banishment + 147198, --Unstable Corruption }, phases = { @@ -314,6 +373,8 @@ local siege_of_orgrimmar = { boss = "Galakras", portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Galakras]], + combat_end = {1, 72249}, + spell_mechanics = { [146902] = {0x1, 0x100}, -- Poison-Tipped Blades (Korgra the Snake) [147705] = {0x8}, -- Poison Cloud (Korgra the Snake) @@ -328,7 +389,8 @@ local siege_of_orgrimmar = { [147824] = {0x40}, -- Muzzle Spray (Master Cannoneer Dagryn) [146899] = {0x200}, -- Fracture (Dragonmaw Bonecrushers) - [146897] = {0x1}, -- Shattering Roare (Dragonmaw Bonecrushers) + [146897] = {0x1}, -- Shattering Roar (Dragonmaw Bonecrushers) + [147204] = {0x1}, -- Shattering Roar (Dragonmaw Bonecrushers) [146728] = {0x20}, -- Chain Heal (Dragonmaw Tidal Shamans) [149188] = {0x40}, -- Tidal Wwave (Dragonmaw Tidal Shamans) [149187] = {0x40}, -- Tidal Wave (Dragonmaw Tidal Shamans) @@ -340,11 +402,13 @@ local siege_of_orgrimmar = { [146747] = {0x1}, -- Dragonmaw Strike (Dragonmaw Grunts) [147669] = {0x1}, -- Throw Axe (Dragonmaw Grunts) [148352] = {0x200}, -- DrakeFire (Dragonmaw Proto-Drakes) + [148560] = {0x200}, -- DrakeFire (Dragonmaw Proto-Drakes) -- missing spells from Dragonmaw Wind Reavers [146776] = {0x40}, -- Flame Breath (Dragonmaw Proto-Drakes) [148311] = {0x40}, -- Bombard (Kor'kron Demolishers) [148310] = {0x40}, -- Bombard (Kor'kron Demolishers) [147029] = {0x200}, -- Flames of Galakrond + [146992] = {0x200}, -- Flames of Galakrond [147043] = {0x2}, -- Pulsing Flames }, @@ -384,9 +448,10 @@ local siege_of_orgrimmar = { 146848, --Skull Cracker (High Enforcer Thranok) 146773, --Shoot (Master Cannoneer Dagryn) 147824, --Muzzle Spray (Master Cannoneer Dagryn) - + 148560, -- DrakeFire (Dragonmaw Proto-Drakes) 146899, --Fracture (Dragonmaw Bonecrushers) - 146897, --Shattering Roare (Dragonmaw Bonecrushers) + 146897, --Shattering Roar (Dragonmaw Bonecrushers) + 147204, -- Shattering Roar (Dragonmaw Bonecrushers) 146728, --Chain Heal (Dragonmaw Tidal Shamans) 149188, --Tidal Wwave (Dragonmaw Tidal Shamans) 149187, --Tidal Wave (Dragonmaw Tidal Shamans) @@ -411,6 +476,7 @@ local siege_of_orgrimmar = { }, spells = { 147029, --Flames of Galakrond + 146992, --Flames of Galakrond 147043, --Pulsing Flames } } @@ -424,14 +490,19 @@ local siege_of_orgrimmar = { spell_mechanics = { [144464] = {0x100}, --> Flame Vents + [144467] = {0x100, 0x1}, --> Ignite Armor + [144791] = {0x1, 0x200, 0x40}, --> Engulfed Explosion [144218] = {0x40}, --> Borer Drill [144459] = {0x1}, --> Laser Burn --[144439] = {}, -->Ricochet [144483] = {0x1}, --> Seismic Activity + [144484] = {0x1}, --> Seismic Activity [144485] = {0x1, 0x40}, --> Shock Pulse [144154] = {0x2000}, --> Demolisher Cannons + [144316] = {0x2000}, --> Mortar Blast [144918] = {0x40, 0x80}, --> Cutter Laser - [144498] = {0x8, 0x200} --> Explosive Tar + [144498] = {0x8, 0x200}, --> Explosive Tar + [144327] = {}, --> Ricochet }, continuo = { @@ -449,6 +520,10 @@ local siege_of_orgrimmar = { 144459, --> Laser Burn --> Mortar Cannon --144439 --> Ricochet + 144467, --> Ignite Armor + 144316, --> Mortar Blast + 144791, --> Engulfed Explosion + 144327, --> Ricochet } }, { --> phase 2: Breaking the Defense: Siege Mode: @@ -457,6 +532,7 @@ local siege_of_orgrimmar = { }, spells = { 144483, --> Seismic Activity + 144484, --> Seismic Activity 144485, --> Shock Pulse 144154, --> Demolisher Cannons 144918, --> Cutter Laser @@ -483,10 +559,20 @@ local siege_of_orgrimmar = { [144214] = {0x1}, --Froststorm Bolt [144005] = {0x8}, --Toxic Storm 90% + [144017] = {0x8}, --Toxic Storm 90% + [144030] = {0x40}, -- Toxic Tornado [143990] = {0x80, 0x40}, --Foul Geyser 80% + [143993] = {0x80, 0x40}, --Foul Geyser 80% [143973] = {0x8}, --Falling Ash 70% + [143987] = {0x8}, --Falling Ash 70% - [144064] = {0x40} --Foulness + [144064] = {0x40}, --Foulness + [144066] = {0x40}, --Foulness + + [144328] = {}, --> Iron Tomb + [144334] = {}, --> Iron Tomb + [144330] = {}, --> Iron Prison + [144331] = {}, --> Iron Prison }, continuo = { @@ -500,9 +586,18 @@ local siege_of_orgrimmar = { 144214, --Froststorm Bolt 144005, --Toxic Storm + 144017, --Toxic Storm + 144030, --Toxic Tornado 143990, --Foul Geyser + 143993, --Foul Geyser 143973, --Falling Ash - 144064 --Foulness + 143987, --Falling Ash + 144064, --Foulness + 144066, --Foulness + 144328, --> Iron Tomb + 144334, --> Iron Tomb + 144330, --> Iron Prison + 144331, --> Iron Prison }, phases = { @@ -538,6 +633,7 @@ local siege_of_orgrimmar = { [143872] = {0x80, 0x40}, --Ravager [143420] = {0x80, 0x40}, --Ironstorm (Kor'kron Ironblades) + [143421] = {0x80, 0x40}, --Ironstorm (Kor'kron Ironblades) [143481] = {0x200, 0x1000}, --Backstab (Kor'kron Assassins) [143432] = {0x20, 0x1}, --Arcane Shock (Kor'kron Arcweavers) [143431] = {0x20, 0x1}, --Magistrike (Kor'kron Arcweavers) @@ -552,10 +648,11 @@ local siege_of_orgrimmar = { 143872, --Ravager 143420, --Ironstorm (Kor'kron Ironblades) + 143421, --Ironstorm (Kor'kron Ironblades) 143481, --Backstab (Kor'kron Assassins) 143432, --Arcane Shock (Kor'kron Arcweavers) 143431, --Magistrike (Kor'kron Arcweavers) - + }, phases = { @@ -585,13 +682,17 @@ local siege_of_orgrimmar = { spell_mechanics = { [142861] = {0x200}, --Ancient Miasma + [142906] = {0x200}, --Ancient Miasma [142990] = {0x100}, --Fatal Strike [142851] = {0x2000}, --Seismic Slam + [142849] = {0x2000}, --Seismic Slam [142826] = {0x40}, --Arcing Smash + [142815] = {0x40}, --Arcing Smash [142816] = {0x40}, --Breath of Y'Shaarj [142987] = {0x200, 0x1}, --Imploding Energy - + [142986] = {0x200, 0x1}, --Imploding Energy [142879] = {0x10000}, --Blood Rage + [142890] = {0x10000}, --Blood Rage [142913] = {0x80}, --Displaced Energy }, @@ -606,11 +707,15 @@ local siege_of_orgrimmar = { }, spells = { 142861, --Ancient Miasma + 142906, --Ancient Miasma 142990, --Fatal Strike 142851, --Seismic Slam + 142849, --Seismic Slam 142826, --Arcing Smash + 142815, --Arcing Smash 142816, --Breath of Y'Shaarj - 142987 --Imploding Energy + 142987, --Imploding Energy + 142986 --Imploding Energy } }, { --> phase 2: Blood Rage @@ -619,6 +724,7 @@ local siege_of_orgrimmar = { }, spells = { 142879, --Blood Rage + 142890, --Blood Rage 142913 --Displaced Energy } }, @@ -637,22 +743,30 @@ local siege_of_orgrimmar = { [144923] = {0x20}, --Earthen Shard (Animated Stone Mogu) [142775] = {0x40}, --Nova (Sparks of Life) [142765] = {0x40}, --Pulse (Sparks of Life) + [142759] = {0x40}, --Pulse (Sparks of Life) [144853] = {0x1}, --Carnivorous Bite (Quilen Guardians) --Stout Crates -> Mogu Crates [145393] = {0x200}, --Matter Scramble (Modified Anima Golems) --[145271] = {}, --Crimson Reconstitution (Modified Anima Golems) [142942] = {0x200, 0x10}, --Torment (Mogu Shadow Ritualists) + [142983] = {0x200, 0x10}, --Torment (Mogu Shadow Ritualists) [145240] = {0x20}, --Forbidden Magic (Mogu Shadow Ritualists) --[145460] = {}, --Mogu Rune of Power (Mogu Shadow Ritualists) --Massive Crates -> Mogu Crates [145489] = {0x1}, --Return to Stone + [145514] = {0x1}, --Return to Stone [148515] = {0x40}, --Shadow Volley (Jun-Wei) + [148516] = {0x40}, --Shadow Volley (Jun-Wei) + [148517] = {0x40}, --Molten Fist (Zu-Yin) [148518] = {0x40}, --Molten Fist (Zu-Yin) [148582] = {0x40}, --Jade Tempest (Xiang-Lin) + [148583] = {0x40}, --Jade Tempest (Xiang-Lin) [148513] = {0x40}, --Fracture (Kun-Da) + [148514] = {0x40}, --Fracture (Kun-Da) --Lightweight Crates -> Mantid Crates [145718] = {0x8}, -- Gusting Bomb (Sri'thik Bombardiers) + [145716] = {0x8}, -- Gusting Bomb (Sri'thik Bombardiers) [145706] = {0x1, 0x2000}, --Throw Explosives (Sri'thik Bombardiers) [145748] = {0x8}, -- Encapsulated Pheromones (Sri'thik Bombardiers) --[145692] = {}, -- Enrage (Kor'thik Warcallerss) @@ -663,7 +777,7 @@ local siege_of_orgrimmar = { --[145812] = {}, --Rage of the Empress (Set'thik Wind Wielders) --Massive Crates -> Mantid Crates [148760] = {0x1}, --Pheromone Cloud (Pheromone Cloud) - [145993] = {}, --Set to Blow (Ka'thik Demolisher) + [145993] = {0x200}, --Set to Blow (Ka'thik Demolisher) [142997] = {0x200}, --Set to Blow (Ka'thik Demolisher) [145987] = {0x200}, --Set to Blow (Ka'thik Demolisher) [145996] = {0x200}, --Set to Blow (Ka'thik Demolisher) @@ -674,10 +788,13 @@ local siege_of_orgrimmar = { [148056] = {0x200}, --Set to Blow (Ka'thik Demolisher) --Pandaren Crates - [146217] = {0x2000}, --(Ancient Brewmaster Spirits) - [146222] = {0x40}, --(Ancient Brewmaster Spirits) + [146217] = {0x2000}, -- Keg Toss (Ancient Brewmaster Spirits) + [146222] = {0x40}, --Breath of Fire (Ancient Brewmaster Spirits) + [146226] = {0x40}, --Breath of Fire (Ancient Brewmaster Spirits) + [146230] = {0x40}, --Breath of Fire (Ancient Brewmaster Spirits) --[146081] = {}, --(Ancient Brewmaster Spirits) [146180] = {0x40, 0x1}, --Gusting Crane Kick (Wise Mistweaver Spirits) + [146182] = {0x40, 0x1}, --Gusting Crane Kick (Wise Mistweaver Spirits) --[146189] = {}, Eminence --(Wise Mistweaver Spirits) --[146679] = {}, --(Wise Mistweaver Spirits) [146257] = {0x8, 0x2000}, --(Nameless Windwalker Spirits) @@ -727,22 +844,31 @@ local siege_of_orgrimmar = { 144923, --Earthen Shard (Animated Stone Mogu) 142775, --Nova (Sparks of Life) 142765, --Pulse (Sparks of Life) + 142759, --Pulse (Sparks of Life) 144853, --Carnivorous Bite (Quilen Guardians) --Stout Crates -> Mogu Crates 145393, --Matter Scramble (Modified Anima Golems) 145271, --Crimson Reconstitution (Modified Anima Golems) 142942, --Torment (Mogu Shadow Ritualists) + 142983, --Torment (Mogu Shadow Ritualists) + 146885, --Torment (Mogu Shadow Ritualists) 145240, --Forbidden Magic (Mogu Shadow Ritualists) 145460, --Mogu Rune of Power (Mogu Shadow Ritualists) --Massive Crates -> Mogu Crates + 145514, --Return to Stone 145489, --Return to Stone 148515, --Shadow Volley (Jun-Wei) + 148516, --Shadow Volley (Jun-Wei) + 148517, --Molten Fist (Zu-Yin) 148518, --Molten Fist (Zu-Yin) 148582, --Jade Tempest (Xiang-Lin) + 148583, --Jade Tempest (Xiang-Lin) 148513, --Fracture (Kun-Da) + 148514, --Fracture (Kun-Da) --Lightweight Crates -> 145718, -- Gusting Bomb (Sri'thik Bombardiers) + 145716, -- Gusting Bomb (Sri'thik Bombardiers) 145706, --Throw Explosives (Sri'thik Bombardiers) 145748, -- Encapsulated Pheromones (Sri'thik Bombardiers) 145692, -- Enrage (Kor'thik Warcallerss) @@ -765,37 +891,22 @@ local siege_of_orgrimmar = { --Pandaren Crates 146217, --(Ancient Brewmaster Spirits) - 146222, --(Ancient Brewmaster Spirits) + 146222, --Breath of Fire(Ancient Brewmaster Spirits) + 146226, --Breath of Fire(Ancient Brewmaster Spirits) + 146230, --Breath of Fire(Ancient Brewmaster Spirits) 146081, --(Ancient Brewmaster Spirits) 146180, --(Wise Mistweaver Spirits) 146189, --(Wise Mistweaver Spirits) 146679, --(Wise Mistweaver Spirits) - 146257, --(Nameless Windwalker Spirits) - 146142 --(Nameless Windwalker Spirits) + 146257, --Path of Blossoms (Nameless Windwalker Spirits) + 146142, --(Nameless Windwalker Spirits) + 146182, --Gusting Crane Kick (Wise Mistweaver Spirits) } } }, }, --> end of Spoils of Pandaria ---[[ - [0x1] = "|cFF00FF00"..Loc ["STRING_HEAL"].."|r", - [0x2] = "|cFF710000"..Loc ["STRING_LOWDPS"].."|r", - [0x4] = "|cFF057100"..Loc ["STRING_LOWHEAL"].."|r", - [0x8] = "|cFFd3acff"..Loc ["STRING_VOIDZONE"].."|r", - [0x10] = "|cFFbce3ff"..Loc ["STRING_DISPELL"].."|r", - [0x20] = "|cFFffdc72"..Loc ["STRING_INTERRUPT"].."|r", - [0x40] = "|cFFd9b77c"..Loc ["STRING_POSITIONING"].."|r", - [0x80] = "|cFFd7ff36"..Loc ["STRING_RUNAWAY"].."|r", - [0x100] = "|cFF9a7540"..Loc ["STRING_TANKSWITCH"] .."|r", - [0x200] = "|cFFff7800"..Loc ["STRING_MECHANIC"].."|r", - [0x400] = "|cFFbebebe"..Loc ["STRING_CROWDCONTROL"].."|r", - [0x800] = "|cFF6e4d13"..Loc ["STRING_TANKCOOLDOWN"].."|r", - [0x1000] = "|cFFffff00"..Loc ["STRING_KILLADD"].."|r", - [0x2000] = "|cFFff9999"..Loc ["STRING_SPREADOUT"].."|r", - [0x4000] = "|cFFffff99"..Loc ["STRING_STOPCAST"].."|r", - [0x8000] = "|cFFffff99"..Loc ["STRING_FACING"].."|r", - [0x10000] = "|cFFffff99"..Loc ["STRING_STACK"].."|r", ---]] + ------------> Thok the Bloodthirsty ------------------------------------------------------------------------------ [11] = { boss = "Thok the Bloodthirsty", @@ -868,10 +979,18 @@ local siege_of_orgrimmar = { --[144213] = {}, --Automatic Repair Beam [144210] = {0x40, 0x8}, --Death From Above [145444] = {0x1}, --Overload + [144664] = {0x8, 0x40}, --Shockwave Missile (Missile Turrets) + [144663] = {0x8, 0x40}, --Shockwave Missile (Missile Turrets) + [144662] = {0x8, 0x40}, --Shockwave Missile (Missile Turrets) + [144661] = {0x8, 0x40}, --Shockwave Missile (Missile Turrets) + [144660] = {0x8, 0x40}, --Shockwave Missile (Missile Turrets) + [143641] = {0x8, 0x40}, --Shockwave Missile (Missile Turrets) + [143856] = {0x40, 0x8}, --Superheated (Laser Turrets) [144466] = {0x1, 0x200}, --Magnetic Crush (Electromagnets) [149146] = {0x80}, --Detonate! (Crawler Mines) + [143327] = {0x40}, --Serrated Slash }, continuo = { @@ -901,10 +1020,16 @@ local siege_of_orgrimmar = { 144213, --Automatic Repair Beam 144210, --Death From Above 145444, --Overload - 144664, --Shockwave Missile (Missile Turrets) 143856, --Superheated (Laser Turrets) 144466, --Magnetic Crush (Electromagnets) - 149146 --Detonate! (Crawler Mines) + 149146, --Detonate! (Crawler Mines) + 143327, --Serrated Slash + 144664, --Shockwave Missile (Missile Turrets) + 144663, --Shockwave Missile (Missile Turrets) + 144662, --Shockwave Missile (Missile Turrets) + 144661, --Shockwave Missile (Missile Turrets) + 144660, --Shockwave Missile (Missile Turrets) + 143641, --Shockwave Missile (Missile Turrets) } } @@ -918,18 +1043,183 @@ local siege_of_orgrimmar = { portrait = [[Interface\EncounterJournal\UI-EJ-BOSS-Klaxxi Paragons]], spell_mechanics = { + --Kil'ruk the Wind-Reaver + [142931] = {}, --Exposed Veins + [143939] = {}, --Gouge + [143941] = {}, --Mutilate + [142232] = {}, --Death from Above + [142270] = {}, --Reave + [142922] = {}, --Razor Sharp Blades + [142930] = {}, --Razor Sharp Blades + + --Xaril the Poisoned Mind + [142929] = {}, --Tenderizing Strikes + [142315] = {}, --Caustic Blood + [142317] = {}, --Bloody Explosion + [142528] = {}, --Toxic Injection + [148656] = {}, --Vast Apothecarial Knowledge + [142877] = {}, --Volatile Poultice + [143735] = {}, --Caustic Amber + [142797] = {}, --Noxious Vapors + + --Kaz'tik the Manipulator + [142667] = {}, --Thick Shell + [115268] = {}, --Mesmerize + [142649] = {}, --Devour + [142270] = {}, --Reave + [142651] = {}, --Molt + [144275] = {}, --Swipe + [142655] = {}, --Swipe + [143768] = {}, --Sonic Projection + + --Korven the Prime + [142564] = {}, --Encase in Amber + [143974] = {}, --Shield Bash + + [143979] = {}, --Vicious Assault + [143980] = {}, --Vicious Assault + [143981] = {}, --Vicious Assault + [143982] = {}, --Vicious Assault + [143984] = {}, --Vicious Assault + [143985] = {}, --Vicious Assault + + [148649] = {}, --Master of Amber + + --Iyyokuk the Lucid + [143666] = {}, --Diminish + [142514] = {}, --Calculate + [142416] = {}, --Insane Calculation: Fiery Edge + [142809] = {}, --Fiery Edgeficious Assault + [142735] = {}, --Reaction: Blue + [142736] = {}, --Reaction: Red + [141858] = {}, --Ingenious + + --Ka'roz the Locust + [143701] = {}, --Whirling + [143702] = {}, --Whirling + [143733] = {}, --Hurl Amber + [148650] = {}, --Strong Legs + [142564] = {}, --Encase in Amber + + --Skeer the Bloodseeker + [143274] = {}, --Hewn + [143275] = {}, --Hewn + [143280] = {}, --Bloodletting + [148655] = {}, --Bloodthirsty + + --Rik'kal the Dissector + [143278] = {}, --Genetic Alteration + [143279] = {}, --Genetic Alteration + [143339] = {}, --Injection + [144274] = {}, --Claw + [142655] = {}, --Swipe + [144276] = {}, --Sting + [143373] = {}, --Gene Splice + [143337] = {}, --Mutate + + --Hisek the Swarmkeeper + [144839] = {}, --Multi-Shot + [142948] = {}, --Aim }, continuo = { - + --Kil'ruk the Wind-Reaver + 142931, --Exposed Veins + 143939, --Gouge + 143941, --Mutilate + 142232, --Death from Above + 142270, --Reave + 142922, --Razor Sharp Blades + 142930, --Razor Sharp Blades + + --Xaril the Poisoned Mind + 142929, --Tenderizing Strikes + 142315, --Caustic Blood + 142317, --Bloody Explosion + 142528, --Toxic Injection + 148656, --Vast Apothecarial Knowledge + 142877, --Volatile Poultice + 143735, --Caustic Amber + 142797, --Noxious Vapors + + --Kaz'tik the Manipulator + 142667, --Thick Shell + 115268, --Mesmerize + 142649, --Devour + 142270, --Reave + 142651, --Molt + 144275, --Swipe + 142655, --Swipe + 143768, --Sonic Projection + + --Korven the Prime + 142564, --Encase in Amber + 143974, --Shield Bash + + 143979, --Vicious Assault + 143980, --Vicious Assault + 143981, --Vicious Assault + 143982, --Vicious Assault + 143984, --Vicious Assault + 143985, --Vicious Assault + + 148649, --Master of Amber + + --Iyyokuk the Lucid + 143666, --Diminish + 142514, --Calculate + 142416, --Insane Calculation: Fiery Edge + 142809, --Fiery Edgeficious Assault + 142735, --Reaction: Blue + 142736, --Reaction: Red + 141858, --Ingenious + + --Ka'roz the Locust + 143701, --Whirling + 143702, --Whirling + 143733, --Hurl Amber + 148650, --Strong Legs + 142564, --Encase in Amber + + --Skeer the Bloodseeker + 143274, --Hewn + 143275, --Hewn + 143280, --Bloodletting + 148655, --Bloodthirsty + + --Rik'kal the Dissector + 143278, --Genetic Alteration + 143279, --Genetic Alteration + 143339, --Injection + 144274, --Claw + 142655, --Swipe + 144276, --Sting + 143373, --Gene Splice + 143337, --Mutate + + --Hisek the Swarmkeeper + 144839, --Multi-Shot + 142948, --Aim }, phases = { { --> phase 1: adds = { - - + 71161, --Kil'ruk the Wind-Reaver + 71157, --Xaril the Poisoned Mind + 71158, --Rik'kal the Dissector + 71152, --Skeer the Bloodseeker + 71160, --Iyyokuk the Lucid + 71155, --Korven the Prime + 71156, -- Kaz'tik the Manipulator + 71154, -- Ka'roz the Locust + 71153, -- Hisek the Swarmkeeper + + 71578, --Amber Parasites + 71542, --Bloods + 71420, --Hungry Kunchongs + 71425, --Mature Kunchongs }, spells = { diff --git a/startup.lua b/startup.lua index 391b7174..0cf6b669 100644 --- a/startup.lua +++ b/startup.lua @@ -30,8 +30,10 @@ function _G._detalhes:Start() self.in_combat = false self.combat_id = self.combat_id or 0 self.instances_amount = self.instances_amount or 12 - self.segments_amount = self.segments_amount or 10 - self.segments_amount_to_save = self.segments_amount_to_save or 2 + self.segments_amount = self.segments_amount or 25 + self.segments_amount_to_save = self.segments_amount_to_save or 5 + self.memory_threshold = self.memory_threshold or 3 + self.memory_ram = self.memory_ram or 64 self.deadlog_limit = self.deadlog_limit or 12 self.minimum_combat_time = self.minimum_combat_time or 5 @@ -219,8 +221,11 @@ function _G._detalhes:Start() --> start garbage collector self.ultima_coleta = 0 self.intervalo_coleta = 720 + self.intervalo_memoria = 180 self.garbagecollect = self:ScheduleRepeatingTimer ("IniciarColetaDeLixo", self.intervalo_coleta) - + self.memorycleanup = self:ScheduleRepeatingTimer ("CheckMemoryPeriodically", self.intervalo_memoria) + self.next_memory_check = time()+self.intervalo_memoria + --> start parser --> load parser capture options @@ -271,7 +276,7 @@ function _G._detalhes:Start() self:SendEvent ("DETAILS_INSTANCE_OPEN", nil, instancia) end end - + --> all done, send started signal and we are ready function self:AnnounceStartup() self:SendEvent ("DETAILS_STARTED", "SEND_TO_ALL") @@ -304,5 +309,5 @@ function _G._detalhes:Start() if (self.is_first_run) then _detalhes:OpenWelcomeWindow() end - + end