From fcf9d7a2eda899f141eb76a8da529428e0064b9d Mon Sep 17 00:00:00 2001 From: tercio Date: Wed, 26 Mar 2014 18:24:12 -0300 Subject: [PATCH] updates --- boot.lua | 6 +- classes/classe_damage.lua | 14 + classes/classe_instancia.lua | 10 +- classes/container_combatentes.lua | 15 +- core/control.lua | 54 ++ core/meta.lua | 8 + core/parser.lua | 113 ++- core/windows.lua | 8 +- framework/label.lua | 11 +- framework/normal_bar.lua | 74 +- functions/savedata.lua | 2 +- functions/skins.lua | 60 +- gumps/janela_info.lua | 694 +++++++++++++++++- gumps/janela_options.lua | 99 ++- gumps/janela_principal.lua | 80 +- gumps/janela_report.lua | 51 +- images/icons2.tga | Bin 90867 -> 119719 bytes images/skins/classic_skin.tga | Bin 0 -> 134812 bytes images/skins/flat_skin.tga | Bin 159546 -> 130425 bytes locales/Details-enUS.lua | 8 +- locales/Details-ptBR.lua | 5 +- .../Details_TinyThreat/Details_TinyThreat.lua | 294 ++++++-- plugins/Details_Vanguard/Details_Vanguard.lua | 34 +- .../Details_YouAreNotPrepared.lua | 4 +- startup.lua | 107 ++- 25 files changed, 1557 insertions(+), 194 deletions(-) create mode 100644 images/skins/classic_skin.tga diff --git a/boot.lua b/boot.lua index 3854cf86..372efc9f 100644 --- a/boot.lua +++ b/boot.lua @@ -8,9 +8,9 @@ _ = nil _detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0") - _detalhes.userversion = "v1.11.03" - _detalhes.version = "Alpha 015" - _detalhes.realversion = 15 + _detalhes.userversion = "v1.11.06" + _detalhes.version = "Alpha 016" + _detalhes.realversion = 16 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> initialization stuff diff --git a/classes/classe_damage.lua b/classes/classe_damage.lua index 676e8a1d..a86eb8c4 100644 --- a/classes/classe_damage.lua +++ b/classes/classe_damage.lua @@ -118,6 +118,20 @@ end t.n = 1 return t end + +--[[exported]] function _detalhes:CreateActorAvoidanceTable (no_overall) + if (no_overall) then + local t = {["ALL"] = 0, ["DODGE"] = 0, ["PARRY"] = 0, ["HITS"] = 0, ["ABSORB"] = 0, --quantas vezes foi dodge, parry, quandos hits tomou, quantos absorbs teve + ["FULL_HIT"] = 0, ["FULL_ABSORBED"] = 0, ["PARTIAL_ABSORBED"] = 0, --full hit full absorbed and partial absortion + ["FULL_HIT_AMT"] = 0, ["PARTIAL_ABSORB_AMT"] = 0, ["ABSORB_AMT"] = 0, ["FULL_ABSORB_AMT"] = 0} --amounts + return t + else + local t = {overall = {["ALL"] = 0, ["DODGE"] = 0, ["PARRY"] = 0, ["HITS"] = 0, ["ABSORB"] = 0, --quantas vezes foi dodge, parry, quandos hits tomou, quantos absorbs teve + ["FULL_HIT"] = 0, ["FULL_ABSORBED"] = 0, ["PARTIAL_ABSORBED"] = 0, --full hit full absorbed and partial absortion + ["FULL_HIT_AMT"] = 0, ["PARTIAL_ABSORB_AMT"] = 0, ["ABSORB_AMT"] = 0, ["FULL_ABSORB_AMT"] = 0}} --amounts + return t + end + end --[[exported]] function _detalhes.SortGroup (container, keyName2) keyName = keyName2 diff --git a/classes/classe_instancia.lua b/classes/classe_instancia.lua index d0e92d96..8eebd799 100644 --- a/classes/classe_instancia.lua +++ b/classes/classe_instancia.lua @@ -946,8 +946,9 @@ end function _detalhes:SetBackgroundAlpha (alpha) if (not alpha) then alpha = self.bg_alpha - else - alpha = _detalhes:Scale (0, 1, 0.2, 1, alpha) - 0.8 +-- else +-- print (alpha) +-- alpha = _detalhes:Scale (0, 1, 0.2, 1, alpha) - 0.8 end 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) @@ -1096,6 +1097,7 @@ end function _detalhes:TrocaTabela (instancia, segmento, atributo, sub_atributo, iniciando_instancia, InstanceMode) if (self and self.meu_id and not instancia) then --> self é uma instância + InstanceMode = iniciando_instancia iniciando_instancia = sub_atributo sub_atributo = atributo atributo = segmento @@ -2026,6 +2028,10 @@ function _detalhes:envia_relatorio (linhas, custom) editbox:ClearFocus() end + if (_detalhes.report_where == "COPY") then + return _detalhes:SendReportTextWindow (linhas) + end + local to_who = _detalhes.report_where local channel = to_who:find ("|") diff --git a/classes/container_combatentes.lua b/classes/container_combatentes.lua index 1c90692a..de88d416 100644 --- a/classes/container_combatentes.lua +++ b/classes/container_combatentes.lua @@ -143,12 +143,17 @@ local read_flag_ = function (novo_objeto, shadow_objeto, dono_do_pet, serial, fl if (_bit_band (flag, EM_GRUPO) ~= 0 and novo_objeto.classe ~= "UNGROUPPLAYER") then --> faz parte do grupo details_flag = details_flag+0x00000100 novo_objeto.grupo = true - --if (nome:find ("[*]")) then - -- print ("Objeto em grupo:", nome, "flag:", flag, "classe:", novo_objeto.classe) - --end + if (shadow_objeto) then shadow_objeto.grupo = true end + + if (_detalhes:IsATank (serial)) then + novo_objeto.isTank = true + if (shadow_objeto) then + shadow_objeto.isTank = true + end + end end elseif (dono_do_pet) then --> é um pet @@ -283,8 +288,8 @@ function container_combatentes:PegarCombatente (serial, nome, flag, criar, isOwn end end - if (novo_objeto.grupo) then - novo_objeto.avoidance = {["DODGE"] = 0, ["PARRY"] = 0, ["HITS"] = 0} --> avoidance + if (novo_objeto.isTank) then + novo_objeto.avoidance = _detalhes:CreateActorAvoidanceTable() end elseif (self.tipo == container_heal) then --> CONTAINER HEALING diff --git a/core/control.lua b/core/control.lua index bf21ee08..201092f9 100644 --- a/core/control.lua +++ b/core/control.lua @@ -239,7 +239,9 @@ local n_combate = _detalhes:NumeroCombate (1) --aumenta o contador de combates -- combat number up --> cria a nova tabela de combates -- create new table + local ultimo_combate = _detalhes.tabela_vigente _detalhes.tabela_vigente = _detalhes.combate:NovaTabela (true, _detalhes.tabela_overall, n_combate, ...) --cria uma nova tabela de combate + _detalhes.tabela_vigente.previous_combat = ultimo_combate --> verifica se há alguma instância mostrando o segmento atual -- change segment _detalhes:InstanciaCallFunction (_detalhes.TrocaSegmentoAtual) @@ -295,6 +297,30 @@ if (instancia.hide_in_combat) then instancia:SetWindowAlpha (instancia.hide_in_combat_alpha / 100) end + + if (instancia.auto_switch_to) then + --salva o estado atual + instancia.auto_switch_to_old = {instancia.modo, instancia.atributo, instancia.sub_atributo, instancia.segmento, _detalhes.RaidTables.Mode, _detalhes.SoloTables.Mode} + + --muda para um plugin de raid + if (instancia.auto_switch_to [1] == "raid") then + for index, ptable in _ipairs (_detalhes.RaidTables.Menu) do + if (ptable[1] == instancia.auto_switch_to [2]) then + if (instancia.modo ~= _detalhes._detalhes_props ["MODO_RAID"]) then + _detalhes:AlteraModo (instancia, _detalhes._detalhes_props ["MODO_RAID"]) + end + _detalhes.RaidTables:switch (nil, index) + break + end + end + else + --muda para um atributo normal + if (instancia.modo ~= _detalhes._detalhes_props["MODO_GROUP"]) then + _detalhes:AlteraModo (instancia, _detalhes._detalhes_props["MODO_GROUP"]) + end + _detalhes:TrocaTabela (instancia, nil, instancia.auto_switch_to [1], instancia.auto_switch_to [2]) + end + end end end @@ -510,11 +536,39 @@ if (instancia.hide_in_combat) then instancia:SetWindowAlpha (1, true) end + if (instancia.auto_switch_to_old) then + instancia:SwitchBack() + end end end _detalhes:SendEvent ("COMBAT_PLAYER_LEAVE", nil, _detalhes.tabela_vigente) end + + --backtable indexes: [1]: mode [2]: attribute [3]: sub attribute [4]: segment [5]: raidmode index [6]: solomode index + + function _detalhes:SwitchBack() + local backtable = self.auto_switch_to_old + if (not backtable) then + return + end + + if (self.modo ~= self.auto_switch_to_old [1]) then + _detalhes:AlteraModo (self, self.auto_switch_to_old [1]) + end + + if (self.modo == _detalhes._detalhes_props["MODO_RAID"]) then + _detalhes.RaidTables:switch (nil, self.auto_switch_to_old [5]) + + elseif (self.modo == _detalhes._detalhes_props["MODO_ALONE"]) then + _detalhes.SoloTables:switch (nil, self.auto_switch_to_old [6]) + + else + _detalhes:TrocaTabela (self, self.auto_switch_to_old [4], self.auto_switch_to_old [2], self.auto_switch_to_old [3]) + end + + self.auto_switch_to_old = nil + end function _detalhes:MakeEqualizeOnActor (player, realm, receivedActor) diff --git a/core/meta.lua b/core/meta.lua index 78befb69..a535d31b 100644 --- a/core/meta.lua +++ b/core/meta.lua @@ -75,6 +75,11 @@ for _, combat_table in _ipairs (tabelas_do_historico) do combat_table.__call = _detalhes.call_combate end + + for i = #tabelas_do_historico-1, 1, -1 do + local combat = tabelas_do_historico [i] + combat.previous_combat = tabelas_do_historico [i+1] + end --> tempo padrao do overall combate_overall.start_time = _tempo @@ -198,6 +203,9 @@ if (_detalhes.clear_graphic) then _combate.TimeData = {} end + + --> limpa a referencia do ultimo combate + _combate.previous_combat = nil local container_dano = _combate [class_type_dano] or {} local container_cura = _combate [class_type_cura] or {} diff --git a/core/parser.lua b/core/parser.lua index fa4aaa53..7be621a1 100644 --- a/core/parser.lua +++ b/core/parser.lua @@ -21,6 +21,7 @@ local _IsInRaid = IsInRaid --wow api local local _IsInGroup = IsInGroup --wow api local local _GetNumGroupMembers = GetNumGroupMembers --wow api local + local _UnitGroupRolesAssigned = UnitGroupRolesAssigned local _cstr = string.format --lua local local _table_insert = table.insert --lua local @@ -80,6 +81,8 @@ local misc_cache = setmetatable ({}, _detalhes.weaktable) --> party & raid members local raid_members_cache = setmetatable ({}, _detalhes.weaktable) + --> tanks + local tanks_members_cache = setmetatable ({}, _detalhes.weaktable) ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> constants @@ -254,8 +257,45 @@ end --> record avoidance only for player actors - if (spellid < 3) then --> autoshot melee - jogador_alvo.avoidance ["HITS"] = jogador_alvo.avoidance ["HITS"] + 1 + + if (tanks_members_cache [alvo_serial]) then --> autoshot or melee hit + --> avoidance + local avoidance = jogador_alvo.avoidance + local overall = avoidance.overall + + local mob = avoidance [who_name] + if (not mob) then --> if isn't in the table, build on the fly + mob = _detalhes:CreateActorAvoidanceTable (true) + avoidance [who_name] = mob + end + + overall ["ALL"] = overall ["ALL"] + 1 --> qualtipo de hit ou absorb + mob ["ALL"] = mob ["ALL"] + 1 --> qualtipo de hit ou absorb + + if (spellid < 3) then + --> overall + overall ["HITS"] = overall ["HITS"] + 1 + mob ["HITS"] = mob ["HITS"] + 1 + end + + --> absorbs status + if (absorbed) then + --> aqui pode ser apenas absorb parcial + overall ["ABSORB"] = overall ["ABSORB"] + 1 + overall ["PARTIAL_ABSORBED"] = overall ["PARTIAL_ABSORBED"] + 1 + overall ["PARTIAL_ABSORB_AMT"] = overall ["PARTIAL_ABSORB_AMT"] + absorbed + overall ["ABSORB_AMT"] = overall ["ABSORB_AMT"] + absorbed + mob ["ABSORB"] = mob ["ABSORB"] + 1 + mob ["PARTIAL_ABSORBED"] = mob ["PARTIAL_ABSORBED"] + 1 + mob ["PARTIAL_ABSORB_AMT"] = mob ["PARTIAL_ABSORB_AMT"] + absorbed + mob ["ABSORB_AMT"] = mob ["ABSORB_AMT"] + absorbed + else + --> adicionar aos hits sem absorbs + overall ["FULL_HIT"] = overall ["FULL_HIT"] + 1 + overall ["FULL_HIT_AMT"] = overall ["FULL_HIT_AMT"] + amount + mob ["FULL_HIT"] = mob ["FULL_HIT"] + 1 + mob ["FULL_HIT_AMT"] = mob ["FULL_HIT_AMT"] + amount + end end end @@ -417,13 +457,41 @@ end end - --> 'avoider' - --> using this method means avoidance of pets will not be tracked - local TargetActor = damage_cache [alvo_name] - if (TargetActor and TargetActor.grupo) then - local missTable = TargetActor.avoidance [missType] - if (missTable) then - TargetActor.avoidance [missType] = missTable +1 + if (tanks_members_cache [alvo_serial]) then --> only track tanks + local TargetActor = damage_cache [alvo_name] + if (TargetActor) then + + local avoidance = TargetActor.avoidance + local missTable = avoidance.overall [missType] + + if (missTable) then + --> overall + local overall = avoidance.overall + overall [missType] = missTable + 1 --> adicionado a quantidade do miss + + --> from this mob + local mob = avoidance [who_name] + if (not mob) then --> if isn't in the table, build on the fly + mob = _detalhes:CreateActorAvoidanceTable (true) + avoidance [who_name] = mob + end + + mob [missType] = mob [missType] + 1 + + if (missType == "ABSORB") then --full absorb + overall ["ALL"] = overall ["ALL"] + 1 --> qualtipo de hit ou absorb + overall ["FULL_ABSORBED"] = overall ["FULL_ABSORBED"] + 1 --amount + overall ["ABSORB_AMT"] = overall ["ABSORB_AMT"] + amountMissed + overall ["FULL_ABSORB_AMT"] = overall ["FULL_ABSORB_AMT"] + amountMissed + + mob ["ALL"] = mob ["ALL"] + 1 --> qualtipo de hit ou absorb + mob ["FULL_ABSORBED"] = mob ["FULL_ABSORBED"] + 1 --amount + mob ["ABSORB_AMT"] = mob ["ABSORB_AMT"] + amountMissed + mob ["FULL_ABSORB_AMT"] = mob ["FULL_ABSORB_AMT"] + amountMissed + end + + end + end end @@ -2726,20 +2794,47 @@ end function _detalhes:UptadeRaidMembersCache() + _table_wipe (raid_members_cache) + _table_wipe (tanks_members_cache) + if (_IsInRaid()) then for i = 1, _GetNumGroupMembers() do raid_members_cache [_UnitGUID ("raid"..i)] = true + local role = _UnitGroupRolesAssigned (GetUnitName ("raid"..i, true)) + if (role == "TANK") then + tanks_members_cache [_UnitGUID ("raid"..i)] = true + + --print ("tank detected:", GetUnitName ("raid"..i, true)) + end end + elseif (_IsInGroup()) then for i = 1, _GetNumGroupMembers()-1 do raid_members_cache [_UnitGUID ("party"..i)] = true + local role = _UnitGroupRolesAssigned (GetUnitName ("party"..i, true)) + if (role == "TANK") then + tanks_members_cache [_UnitGUID ("party"..i)] = true + end end + raid_members_cache [_UnitGUID ("player")] = true + local role = _UnitGroupRolesAssigned (GetUnitName ("player", true)) + if (role == "TANK") then + tanks_members_cache [_UnitGUID ("player")] = true + end else raid_members_cache [_UnitGUID ("player")] = true + local role = _UnitGroupRolesAssigned (GetUnitName ("player", true)) + if (role == "TANK") then + tanks_members_cache [_UnitGUID ("player")] = true + end end end + + function _detalhes:IsATank (playerguid) + return tanks_members_cache [playerguid] + end function _detalhes:IsInCache (playerguid) return raid_members_cache [playerguid] diff --git a/core/windows.lua b/core/windows.lua index 8a2e0aa4..acc139e0 100644 --- a/core/windows.lua +++ b/core/windows.lua @@ -573,10 +573,15 @@ if (lower_instance) then local instance = _detalhes:GetInstance (lower_instance) + _detalhes.times_of_tutorial = _detalhes.times_of_tutorial + 1 + if (_detalhes.times_of_tutorial > 20) then + return + end + if (_detalhes.MicroButtonAlert:IsShown()) then return _detalhes:ScheduleTimer ("delay_tutorial", 2) end - + if (not _detalhes.tutorial.alert_frames [1]) then _detalhes.MicroButtonAlert.Text:SetText (Loc ["STRING_MINITUTORIAL_1"]) @@ -653,6 +658,7 @@ return _detalhes:ScheduleTimer ("StartTutorial", 10) end -- + _detalhes.times_of_tutorial = 0 _detalhes:ScheduleTimer ("delay_tutorial", 20) end diff --git a/framework/label.lua b/framework/label.lua index 559edc51..d8d68964 100644 --- a/framework/label.lua +++ b/framework/label.lua @@ -163,13 +163,14 @@ local LabelMetaFunctions = {} ["width"] = smember_width, ["height"] = smember_height, ["fontcolor"] = smember_textcolor, - ["color"] = smember_textcolor, + ["color"] = smember_textcolor,--alias ["fontface"] = smember_textfont, ["fontsize"] = smember_textsize, - ["textcolor"] = smember_textcolor, - ["textfont"] = smember_textfont, - ["textsize"] = smember_textsize, - ["shadow"] = smember_outline + ["textcolor"] = smember_textcolor,--alias + ["textfont"] = smember_textfont,--alias + ["textsize"] = smember_textsize,--alias + ["shadow"] = smember_outline, + ["outline"] = smember_outline,--alias } LabelMetaFunctions.__newindex = function (_table, _key, _value) diff --git a/framework/normal_bar.lua b/framework/normal_bar.lua index 29976c24..24a06c25 100644 --- a/framework/normal_bar.lua +++ b/framework/normal_bar.lua @@ -9,6 +9,8 @@ local _unpack = unpack --> lua locals local _type = type --> lua locals local _math_floor = math.floor --> lua locals +local SharedMedia = LibStub:GetLibrary ("LibSharedMedia-3.0") + local cleanfunction = function() end local BarMetaFunctions = {} local APIBarFunctions @@ -81,15 +83,15 @@ local APIBarFunctions end --> left color local gmember_color = function (_object) - return _object.texture.original_colors + return _object._texture.original_colors end --> icon local gmember_icon = function (_object) - return _object.icon:GetTexture() + return _object._icon:GetTexture() end --> texture local gmember_texture = function (_object) - return _object.texture:GetTexture() + return _object._texture:GetTexture() end --> font size local gmember_textsize = function (_object) @@ -190,19 +192,19 @@ local APIBarFunctions local _value1, _value2, _value3, _value4 = gump:ParseColors (_value) _object.statusbar:SetStatusBarColor (_value1, _value2, _value3, _value4) - _object.texture.original_colors = {_value1, _value2, _value3, _value4} - return _object.texture:SetVertexColor (_value1, _value2, _value3, _value4) + _object._texture.original_colors = {_value1, _value2, _value3, _value4} + return _object._texture:SetVertexColor (_value1, _value2, _value3, _value4) end --> icon local smember_icon = function (_object, _value) if (type (_value) == "table") then local _value1, _value2 = _unpack (_value) - _object.icon:SetTexture (_value1) + _object._icon:SetTexture (_value1) if (_value2) then - _object.icon:SetTexCoord (_unpack (_value2)) + _object._icon:SetTexCoord (_unpack (_value2)) end else - _object.icon:SetTexture (_value) + _object._icon:SetTexture (_value) end return end @@ -210,12 +212,21 @@ local APIBarFunctions local smember_texture = function (_object, _value) if (type (_value) == "table") then local _value1, _value2 = _unpack (_value) - _object.texture:SetTexture (_value1) + _object._texture:SetTexture (_value1) if (_value2) then - _object.texture:SetTexCoord (_unpack (_value2)) + _object._texture:SetTexCoord (_unpack (_value2)) end else - _object.texture:SetTexture (_value) + if (_value:find ("\\")) then + _object._texture:SetTexture (_value) + else + local file = SharedMedia:Fetch ("statusbar", _value) + if (file) then + _object._texture:SetTexture (file) + else + _object._texture:SetTexture (_value) + end + end end return end @@ -235,6 +246,11 @@ local APIBarFunctions _object.textleft:SetTextColor (_value1, _value2, _value3, _value4) return _object.textright:SetTextColor (_value1, _value2, _value3, _value4) end + --> outline (shadow) + local smember_outline = function (_object, _value) + _detalhes:SetFontOutline (_object.textleft, _value) + return _detalhes:SetFontOutline (_object.textright, _value) + end local set_members_function_index = { ["tooltip"] = smember_tooltip, @@ -252,10 +268,13 @@ local APIBarFunctions ["fontcolor"] = smember_textcolor, ["textsize"] = smember_textsize, --alias ["textfont"] = smember_textfont, --alias - ["textcolor"] = smember_textcolor --alias + ["textcolor"] = smember_textcolor, --alias + ["shadow"] = smember_outline, + ["outline"] = smember_outline, --alias } BarMetaFunctions.__newindex = function (_table, _key, _value) + local func = set_members_function_index [_key] if (func) then return func (_table, _value) @@ -306,7 +325,7 @@ local APIBarFunctions --> set texture function BarMetaFunctions:SetTexture (texture) - self.texture:SetTexture (texture) + self._texture:SetTexture (texture) end --> set texts @@ -321,17 +340,17 @@ local APIBarFunctions function BarMetaFunctions:SetColor (r, g, b, a) r, g, b, a = gump:ParseColors (r, g, b, a) - self.texture:SetVertexColor (r, g, b, a) + self._texture:SetVertexColor (r, g, b, a) self.statusbar:SetStatusBarColor (r, g, b, a) - self.texture.original_colors = {r, g, b, a} + self._texture.original_colors = {r, g, b, a} end --> set icons function BarMetaFunctions:SetIcon (texture, ...) - self.icon:SetTexture (texture) + self._icon:SetTexture (texture) if (...) then local L, R, U, D = _unpack (...) - self.icon:SetTexCoord (L, R, U, D) + self._icon:SetTexCoord (L, R, U, D) end end @@ -444,13 +463,13 @@ local APIBarFunctions end if (not frame.MyObject.timer) then - local oc = frame.MyObject.texture.original_colors --original colors - gump:GradientEffect ( frame.MyObject.texture, "texture", oc[1], oc[2], oc[3], oc[4], oc[1]+0.2, oc[2]+0.2, oc[3]+0.2, oc[4], .2) + local oc = frame.MyObject._texture.original_colors --original colors + gump:GradientEffect ( frame.MyObject._texture, "texture", oc[1], oc[2], oc[3], oc[4], oc[1]+0.2, oc[2]+0.2, oc[3]+0.2, oc[4], .2) frame.MyObject.div:Show() frame.MyObject.div:SetPoint ("left", frame, "left", frame:GetValue() * (frame:GetWidth()/100) - 16, 0) else - local oc = frame.MyObject.texture.original_colors --original colors - gump:GradientEffect ( frame.MyObject.texture, "texture", oc[1], oc[2], oc[3], oc[4], oc[1]-0.2, oc[2]-0.2, oc[3]-0.2, oc[4]+.2, .2) + local oc = frame.MyObject._texture.original_colors --original colors + gump:GradientEffect ( frame.MyObject._texture, "texture", oc[1], oc[2], oc[3], oc[4], oc[1]-0.2, oc[2]-0.2, oc[3]-0.2, oc[4]+.2, .2) end frame.MyObject.background:Show() @@ -479,11 +498,12 @@ local APIBarFunctions end if (not frame.MyObject.timer) then - local oc = frame.MyObject.texture.original_colors --original colors - local r, g, b, a = frame.MyObject.texture:GetVertexColor() - gump:GradientEffect ( frame.MyObject.texture, "texture", r, g, b, a, oc[1], oc[2], oc[3], oc[4], .2) + local oc = frame.MyObject._texture.original_colors --original colors + local r, g, b, a = frame.MyObject._texture:GetVertexColor() + gump:GradientEffect ( frame.MyObject._texture, "texture", r, g, b, a, oc[1], oc[2], oc[3], oc[4], .2) frame.MyObject.div:Hide() - frame.MyObject.background:Hide() + + --frame.MyObject.background:Hide() else local oc = frame.MyObject.background.original_colors --original colors local r, g, b, a = frame.MyObject.background:GetVertexColor() @@ -679,9 +699,9 @@ function gump:NewBar (parent, container, name, member, w, h, value) BarObject.timer_texture:SetWidth (w) BarObject.timer_texture:SetHeight (h) - BarObject.texture = _G [name .. "_statusbarTexture"] + BarObject._texture = _G [name .. "_statusbarTexture"] BarObject.background = _G [name .. "_background"] - BarObject.icon = _G [name .. "_icon"] + BarObject._icon = _G [name .. "_icon"] BarObject.textleft = _G [name .. "_TextLeft"] BarObject.textright = _G [name .. "_TextRight"] BarObject.div = _G [name .. "_sparkMouseover"] diff --git a/functions/savedata.lua b/functions/savedata.lua index bcbd0265..00eaf620 100644 --- a/functions/savedata.lua +++ b/functions/savedata.lua @@ -416,7 +416,7 @@ function _detalhes:ApplyConfigDataOnLoad() self.font_sizes = self.font_sizes or {menus = 10} self.minimap = self.minimap or {hide = false, radius = 160, minimapPos = 220} - self.ps_abbreviation = self.ps_abbreviation or 1 + self.ps_abbreviation = self.ps_abbreviation or 3 self.plugin_database = self.plugin_database or {} diff --git a/functions/skins.lua b/functions/skins.lua index 5e33b10c..c75f70cd 100644 --- a/functions/skins.lua +++ b/functions/skins.lua @@ -57,6 +57,59 @@ local _ }) + _detalhes:InstallSkin ("Minimalistic", { + file = [[Interface\AddOns\Details\images\skins\classic_skin]], + author = "Details!", + version = "1.0", + site = "unknown", + desc = "classic skin", + + micro_frames = {color = {1, 1, 1, 1}, font = "Friz Quadrata TT", size = 10}, + + can_change_alpha_head = true, + icon_anchor_main = {-1, -5}, + icon_anchor_plugins = {-7, -13}, + icon_plugins_size = {19, 18}, + + -- the four anchors: + icon_point_anchor = {-37, 0}, + left_corner_anchor = {-107, 0}, + close_button_anchor = {4, -3}, + right_corner_anchor = {96, 0}, + + icon_point_anchor_bottom = {-37, 12}, + left_corner_anchor_bottom = {-107, 0}, + close_button_anchor_bottom = {5, 3}, + right_corner_anchor_bottom = {96, 0}, + + close_button_size = {24, 24}, + + --reset button + reset_button_coords = {0.01904296875, 0.0673828125, 0.50244140625, 0.51708984375}, + reset_button_small_coords = {0.11669921875, 0.13720703125, 0.50244140625, 0.51708984375}, + + --instance button + instance_button_coords = {0.01904296875, 0.04736328125, 0.48388671875, 0.49853515625}, + + --overwrites + instance_cprops = { + hide_icon = true, + menu_anchor = {-18, 1}, + instance_button_anchor = {-12, 3}, + instancebutton_info = {text_color = {.8, .6, .0, 0.8}, text_face = "Friz Quadrata TT", text_size = 10, color_overlay = {1, 1, 1, 1}}, + resetbutton_info = {text_color = {.8, .8, .8, 0.8}, text_face = "Friz Quadrata TT", text_size = 12, color_overlay = {1, 1, 1, 1}, always_small = true}, + show_sidebars = false, + show_statusbar = false, + color = {.3, .3, .3, 1}, + bg_alpha = 0.2, + }, + + callback = function (skin) + DetailsResetButton2Text2:SetText ("") + end, + + }) + _detalhes:InstallSkin ("Flat Color", { file = [[Interface\AddOns\Details\images\skins\flat_skin]], author = "Details!", @@ -81,6 +134,9 @@ local _ left_corner_anchor_bottom = {-107, 0}, close_button_anchor_bottom = {5, 6}, right_corner_anchor_bottom = {96, 0}, + + close_button_size = {32, 32}, + }) -- 0.00048828125 @@ -139,8 +195,8 @@ local _ --[[ when a skin is selected, all customized properties of the window is reseted and then the overwrites are applied]] --[[ for the complete cprop list see the file classe_instancia_include.lua]] instance_cprops = { - resetbutton_info = {text_color = {0.7, 0.7, 0.7, 1}, text_face = "Friz Quadrata TT", text_size = 12, color_overlay = {.5, .5, .5, 1}}, - instancebutton_info = {text_color = {.7, .7, .7, 1}, text_face = "Friz Quadrata TT", text_size = 12, color_overlay = {.5, .5, .5, 1}}, + resetbutton_info = {text_color = {0.7, 0.7, 0.7, 1}, text_face = "Friz Quadrata TT", text_size = 12, color_overlay = {1, 1, 1, 1}}, + instancebutton_info = {text_color = {.7, .7, .7, 1}, text_face = "Friz Quadrata TT", text_size = 12, color_overlay = {1, 1, 1, 1}}, menu_anchor = {-18, 1}, instance_button_anchor = {-27, 3}, hide_icon = true, diff --git a/gumps/janela_info.lua b/gumps/janela_info.lua index 77b2ace6..23109ebc 100644 --- a/gumps/janela_info.lua +++ b/gumps/janela_info.lua @@ -42,6 +42,8 @@ function _detalhes:AbreJanelaInfo (jogador) if (info.jogador and info.jogador == jogador) then _detalhes:FechaJanelaInfo() --> se clicou na mesma barra então fecha a janela de detalhes return + elseif (not jogador) then + return end --> vamos passar os parâmetros para dentro da tabela da janela... @@ -54,9 +56,13 @@ function _detalhes:AbreJanelaInfo (jogador) info.instancia = self --> salva a referência da instância que pediu o info info.mostrando = nil - local nome = jogador.nome --> nome do jogador + local nome = info.jogador.nome --> nome do jogador local atributo_nome = sub_atributos[info.atributo].lista [info.sub_atributo] .. " " .. Loc ["STRING_ACTORFRAME_REPORTOF"] --> // nome do atributo // precisa ser o sub atributo correto??? + --> removendo o nome da realm do jogador + if (nome:find ("-")) then + nome = nome:gsub (("-.*"), "") + end info.nome:SetText (nome) if (info.instancia.atributo == 1 and info.instancia.sub_atributo == 6) then --> enemy @@ -122,6 +128,7 @@ function _detalhes:AbreJanelaInfo (jogador) info.classe_iconePlus:SetTexture() end + info:ShowTabs() gump:Fade (info, 0) return jogador:MontaInfo() @@ -679,15 +686,7 @@ function gump:CriaJanelaInfo() --> fehcar com o esc tinsert (UISpecialFrames, este_gump:GetName()) - --> fix para dar fadein ao apertar esc - este_gump:SetScript ("OnHide", function (self) - --[[ avoid taint problems - if (not este_gump.hidden) then --> significa que foi fechado com ESC - este_gump:Show() - end - --]] - _detalhes:FechaJanelaInfo() - end) + --> propriedades da janela este_gump:SetPoint ("CENTER", UIParent) @@ -817,7 +816,8 @@ function gump:CriaJanelaInfo() --> botão de reportar da caixa da esquerda, onde fica as barras principais este_gump.report_esquerda = gump:NewDetailsButton (este_gump, este_gump, nil, _detalhes.Reportar, este_gump, 1, 16, 16, "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON") - este_gump.report_esquerda:SetPoint ("BOTTOMLEFT", este_gump.container_barras, "TOPLEFT", 281, 3) + --este_gump.report_esquerda:SetPoint ("BOTTOMLEFT", este_gump.container_barras, "TOPLEFT", 281, 3) + este_gump.report_esquerda:SetPoint ("BOTTOMLEFT", este_gump.container_barras, "TOPLEFT", 33, 3) este_gump.report_esquerda:SetFrameLevel (este_gump:GetFrameLevel()+2) --> botão de reportar da caixa dos alvos @@ -870,13 +870,685 @@ function gump:CriaJanelaInfo() "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON") este_gump.report_direita:SetPoint ("TOPRIGHT", este_gump, "TOPRIGHT", -8, -57) este_gump.report_direita:Hide() + + --> tabs: + --> tab default + _detalhes:CreatePlayerDetailsTab ("Summary", --[1] tab name + function (tabOBject, playerObject) --[2] condition + if (playerObject) then + return true + else + return false + end + end, + nil, --[3] fill function + function() --[4] onclick + for _, tab in _ipairs (_detalhes.player_details_tabs) do + tab.frame:Hide() + end + end, + nil --[5] oncreate + ) + + local avoidance_create = function (tab, frame) + + --> MAIN ICON + local mainicon = frame:CreateTexture (nil, "artwork") + mainicon:SetPoint ("topright", frame, "topright", -12, -12) + mainicon:SetTexture ([[Interface\ACHIEVEMENTFRAME\UI-ACHIEVEMENT-SHIELDS]]) + mainicon:SetTexCoord (0, .5, .5, 1) + mainicon:SetSize (64, 64) + + local tankname = frame:CreateFontString (nil, "artwork", "GameFontNormal") + tankname:SetPoint ("right", mainicon, "left", -2, 2) + tab.tankname = tankname + + --> SUMMARY + local summary_texture = frame:CreateTexture (nil, "artwork") + summary_texture:SetPoint ("topleft", frame, "topleft", 10, -15) + summary_texture:SetTexture ([[Interface\ACHIEVEMENTFRAME\UI-Achievement-HorizontalShadow]]) + summary_texture:SetSize (128, 16) + local summary_text = frame:CreateFontString (nil, "artwork", "GameFontNormal") + summary_text:SetText ("Summary") + summary_text :SetPoint ("left", summary_texture, "left", 2, 0) + + --total damage received + local damagereceived = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + damagereceived:SetPoint ("topleft", frame, "topleft", 15, -35) + damagereceived:SetText ("Total Damage Taken:") --> localize-me + damagereceived:SetTextColor (.8, .8, .8, 1) + local damagereceived_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + damagereceived_amt:SetPoint ("left", damagereceived, "right", 2, 0) + damagereceived_amt:SetText ("0") + tab.damagereceived = damagereceived_amt + + --per second + local damagepersecond = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + damagepersecond:SetPoint ("topleft", frame, "topleft", 20, -50) + damagepersecond:SetText ("Per Second:") --> localize-me + local damagepersecond_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + damagepersecond_amt:SetPoint ("left", damagepersecond, "right", 2, 0) + damagepersecond_amt:SetText ("0") + tab.damagepersecond = damagepersecond_amt + + --total absorbs + local absorbstotal = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + absorbstotal:SetPoint ("topleft", frame, "topleft", 15, -65) + absorbstotal:SetText ("Total Absorbs:") --> localize-me + absorbstotal:SetTextColor (.8, .8, .8, 1) + local absorbstotal_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + absorbstotal_amt:SetPoint ("left", absorbstotal, "right", 2, 0) + absorbstotal_amt:SetText ("0") + tab.absorbstotal = absorbstotal_amt + + --per second + local absorbstotalpersecond = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + absorbstotalpersecond:SetPoint ("topleft", frame, "topleft", 20, -80) + absorbstotalpersecond:SetText ("Per Second:") --> localize-me + local absorbstotalpersecond_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + absorbstotalpersecond_amt:SetPoint ("left", absorbstotalpersecond, "right", 2, 0) + absorbstotalpersecond_amt:SetText ("0") + tab.absorbstotalpersecond = absorbstotalpersecond_amt + + --> MELEE + + local melee_texture = frame:CreateTexture (nil, "artwork") + melee_texture:SetPoint ("topleft", frame, "topleft", 10, -100) + melee_texture:SetTexture ([[Interface\ACHIEVEMENTFRAME\UI-Achievement-HorizontalShadow]]) + melee_texture:SetSize (128, 16) + local melee_text = frame:CreateFontString (nil, "artwork", "GameFontNormal") + melee_text:SetText ("Melee") + melee_text :SetPoint ("left", melee_texture, "left", 2, 0) + + --dodge + local dodge = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + dodge:SetPoint ("topleft", frame, "topleft", 15, -120) + dodge:SetText ("Dodge:") --> localize-me + dodge:SetTextColor (.8, .8, .8, 1) + local dodge_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + dodge_amt:SetPoint ("left", dodge, "right", 2, 0) + dodge_amt:SetText ("0") + tab.dodge = dodge_amt + + local dodgepersecond = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + dodgepersecond:SetPoint ("topleft", frame, "topleft", 20, -135) + dodgepersecond:SetText ("Per Second:") --> localize-me + local dodgepersecond_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + dodgepersecond_amt:SetPoint ("left", dodgepersecond, "right", 2, 0) + dodgepersecond_amt:SetText ("0") + tab.dodgepersecond = dodgepersecond_amt + + -- parry + local parry = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + parry:SetPoint ("topleft", frame, "topleft", 15, -150) + parry:SetText ("Parry:") --> localize-me + parry:SetTextColor (.8, .8, .8, 1) + local parry_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + parry_amt:SetPoint ("left", parry, "right", 2, 0) + parry_amt:SetText ("0") + tab.parry = parry_amt + + local parrypersecond = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + parrypersecond:SetPoint ("topleft", frame, "topleft", 20, -165) + parrypersecond:SetText ("Per Second:") --> localize-me + local parrypersecond_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + parrypersecond_amt:SetPoint ("left", parrypersecond, "right", 2, 0) + parrypersecond_amt:SetText ("0") + tab.parrypersecond = parrypersecond_amt + + --> ABSORBS + + local absorb_texture = frame:CreateTexture (nil, "artwork") + absorb_texture:SetPoint ("topleft", frame, "topleft", 200, -15) + absorb_texture:SetTexture ([[Interface\ACHIEVEMENTFRAME\UI-Achievement-HorizontalShadow]]) + absorb_texture:SetSize (128, 16) + local absorb_text = frame:CreateFontString (nil, "artwork", "GameFontNormal") + absorb_text:SetText ("Absorb") + absorb_text :SetPoint ("left", absorb_texture, "left", 2, 0) + + --full absorbs + local fullsbsorbed = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + fullsbsorbed:SetPoint ("topleft", frame, "topleft", 205, -35) + fullsbsorbed:SetText ("Full Absorbs:") --> localize-me + fullsbsorbed:SetTextColor (.8, .8, .8, 1) + local fullsbsorbed_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + fullsbsorbed_amt:SetPoint ("left", fullsbsorbed, "right", 2, 0) + fullsbsorbed_amt:SetText ("0") + tab.fullsbsorbed = fullsbsorbed_amt + + --partially absorbs + local partiallyabsorbed = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + partiallyabsorbed:SetPoint ("topleft", frame, "topleft", 205, -50) + partiallyabsorbed:SetText ("Partially Absorbed:") --> localize-me + partiallyabsorbed:SetTextColor (.8, .8, .8, 1) + local partiallyabsorbed_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + partiallyabsorbed_amt:SetPoint ("left", partiallyabsorbed, "right", 2, 0) + partiallyabsorbed_amt:SetText ("0") + tab.partiallyabsorbed = partiallyabsorbed_amt + + --partially absorbs per second + local partiallyabsorbedpersecond = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + partiallyabsorbedpersecond:SetPoint ("topleft", frame, "topleft", 210, -65) + partiallyabsorbedpersecond:SetText ("Average:") --> localize-me + local partiallyabsorbedpersecond_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + partiallyabsorbedpersecond_amt:SetPoint ("left", partiallyabsorbedpersecond, "right", 2, 0) + partiallyabsorbedpersecond_amt:SetText ("0") + tab.partiallyabsorbedpersecond = partiallyabsorbedpersecond_amt + + --no absorbs + local noabsorbs = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + noabsorbs:SetPoint ("topleft", frame, "topleft", 205, -80) + noabsorbs:SetText ("No Absorption:") --> localize-me + noabsorbs:SetTextColor (.8, .8, .8, 1) + local noabsorbs_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + noabsorbs_amt:SetPoint ("left", noabsorbs, "right", 2, 0) + noabsorbs_amt:SetText ("0") + tab.noabsorbs = noabsorbs_amt + + --> HEALING + + local healing_texture = frame:CreateTexture (nil, "artwork") + healing_texture:SetPoint ("topleft", frame, "topleft", 200, -100) + healing_texture:SetTexture ([[Interface\ACHIEVEMENTFRAME\UI-Achievement-HorizontalShadow]]) + healing_texture:SetSize (128, 16) + local healing_text = frame:CreateFontString (nil, "artwork", "GameFontNormal") + healing_text:SetText ("Healing") + healing_text :SetPoint ("left", healing_texture, "left", 2, 0) + + --self healing + local selfhealing = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + selfhealing:SetPoint ("topleft", frame, "topleft", 205, -120) + selfhealing:SetText ("Self Healing:") --> localize-me + selfhealing:SetTextColor (.8, .8, .8, 1) + local selfhealing_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + selfhealing_amt:SetPoint ("left", selfhealing, "right", 2, 0) + selfhealing_amt:SetText ("0") + tab.selfhealing = selfhealing_amt + + --self healing per second + local selfhealingpersecond = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + selfhealingpersecond:SetPoint ("topleft", frame, "topleft", 210, -135) + selfhealingpersecond:SetText ("Per Second:") --> localize-me + local selfhealingpersecond_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + selfhealingpersecond_amt:SetPoint ("left", selfhealingpersecond, "right", 2, 0) + selfhealingpersecond_amt:SetText ("0") + tab.selfhealingpersecond = selfhealingpersecond_amt + + for i = 1, 5 do + local healer = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + healer:SetPoint ("topleft", frame, "topleft", 205, -160 + ((i-1)*15)*-1) + healer:SetText ("healer name:") --> localize-me + healer:SetTextColor (.8, .8, .8, 1) + local healer_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + healer_amt:SetPoint ("left", healer, "right", 2, 0) + healer_amt:SetText ("0") + tab ["healer" .. i] = {healer, healer_amt} + end + + --SPELLS + local spells_texture = frame:CreateTexture (nil, "artwork") + spells_texture:SetPoint ("topleft", frame, "topleft", 400, -100) + spells_texture:SetTexture ([[Interface\ACHIEVEMENTFRAME\UI-Achievement-HorizontalShadow]]) + spells_texture:SetSize (128, 16) + local spells_text = frame:CreateFontString (nil, "artwork", "GameFontNormal") + spells_text:SetText ("Spells") + spells_text :SetPoint ("left", spells_texture, "left", 2, 0) + + for i = 1, 9 do + local icon = frame:CreateTexture (nil, "artwork") + icon:SetSize (14, 14) + icon:SetPoint ("topleft", frame, "topleft", 405, -120 + ((i-1)*15)*-1) + local spell = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + spell:SetPoint ("left", icon, "right", 2, 0) + spell:SetText ("spell name:") --> localize-me + spell:SetTextColor (.8, .8, .8, 1) + local spell_amt = frame:CreateFontString (nil, "artwork", "GameFontHighlightSmall") + spell_amt:SetPoint ("left", spell, "right", 2, 0) + spell_amt:SetText ("0") + tab ["spell" .. i] = {spell, spell_amt, icon} + end + + end + + local getpercent = function (value, lastvalue, elapsed_time, inverse) + local ps = value / elapsed_time + local diff + + if (lastvalue == 0) then + diff = "+0%" + else + if (ps >= lastvalue) then + local d = ps - lastvalue + d = d / ps * 100 + if (inverse) then + diff = "|cFF00FF00+" .. _math_floor (math.abs (d)) .. "%|r" + else + diff = "|cFFFF0000+" .. _math_floor (math.abs (d)) .. "%|r" + end + else + local d = lastvalue - ps + d = d / lastvalue * 100 + if (inverse) then + diff = "|cFFFF0000-" .. _math_floor (math.abs (d)) .. "%|r" + else + diff = "|cFF00FF00-" .. _math_floor (math.abs (d)) .. "%|r" + end + end + end + + return ps, diff + end + + local spells_by_class = { + ["DRUID"] = { + [132402] = true, --savage defense + [135286] = true, -- tooth and claw + }, + ["DEATHKNIGHT"] = { + [145676] = true, --riposte + [77535] = true, --blood shield + }, + ["MONK"] = { + [118604] = true, --guard + [115307] = true, --shuffle + [115308] = true, --elusive brew + }, + ["PALADIN"] = { + [132403] = true, --shield of the righteous + [114163] = true, --eternal-flame + [20925] = true, --sacred shield + }, + ["WARRIOR"] = { + [145672] = true, --riposte + }, + } + + local avoidance_fill = function (tab, player, combat) + + local elapsed_time = combat:GetCombatTime() + + local last_combat = combat.previous_combat + if (not last_combat or not last_combat [1]) then + last_combat = combat + end + local last_actor = last_combat (1, player.nome) + local n = player.nome + if (n:find ("-")) then + n = n:gsub (("-.*"), "") + end + tab.tankname:SetText ("Avoidance of\n" .. n) --> localize-me + + --> damage taken + local damagetaken = player.damage_taken + local last_damage_received = 0 + if (last_actor) then + last_damage_received = last_actor.damage_taken / last_combat:GetCombatTime() + end + + tab.damagereceived:SetText (_detalhes:ToK2 (damagetaken)) + + local ps, diff = getpercent (damagetaken, last_damage_received, elapsed_time) + tab.damagepersecond:SetText (_detalhes:comma_value (_math_floor (ps)) .. " (" .. diff .. ")") + + --> absorbs + local totalabsorbs = player.avoidance.overall.ABSORB_AMT + local incomingtotal = damagetaken + totalabsorbs + + local last_total_absorbs = 0 + if (last_actor) then + last_total_absorbs = last_actor.avoidance.overall.ABSORB_AMT / last_combat:GetCombatTime() + end + + tab.absorbstotal:SetText (_detalhes:ToK2 (totalabsorbs) .. " (" .. _math_floor (totalabsorbs / incomingtotal * 100) .. "%)") + + local ps, diff = getpercent (totalabsorbs, last_total_absorbs, elapsed_time, true) + tab.absorbstotalpersecond:SetText (_detalhes:comma_value (_math_floor (ps)) .. " (" .. diff .. ")") + + --> dodge + local totaldodge = player.avoidance.overall.DODGE + tab.dodge:SetText (totaldodge) + + local last_total_dodge = 0 + if (last_actor) then + last_total_dodge = last_actor.avoidance.overall.DODGE / last_combat:GetCombatTime() + end + local ps, diff = getpercent (totaldodge, last_total_dodge, elapsed_time, true) + tab.dodgepersecond:SetText ( string.format ("%.2f", ps) .. " (" .. diff .. ")") + + --> parry + local totalparry = player.avoidance.overall.PARRY + tab.parry:SetText (totalparry) + + local last_total_parry = 0 + if (last_actor) then + last_total_parry = last_actor.avoidance.overall.PARRY / last_combat:GetCombatTime() + end + local ps, diff = getpercent (totalparry, last_total_parry, elapsed_time, true) + tab.parrypersecond:SetText (string.format ("%.2f", ps) .. " (" .. diff .. ")") + + --> absorb + local fullabsorb = player.avoidance.overall.FULL_ABSORBED + local halfabsorb = player.avoidance.overall.PARTIAL_ABSORBED + local halfabsorb_amt = player.avoidance.overall.PARTIAL_ABSORB_AMT + local noabsorb = player.avoidance.overall.FULL_HIT + + tab.fullsbsorbed:SetText (fullabsorb) + tab.partiallyabsorbed:SetText (halfabsorb) + tab.noabsorbs:SetText (noabsorb) + + if (halfabsorb_amt > 0) then + local average = halfabsorb_amt / halfabsorb --tenho o average + local last_average = 0 + if (last_actor) then + last_average = last_actor.avoidance.overall.PARTIAL_ABSORB_AMT / last_actor.avoidance.overall.PARTIAL_ABSORBED + end + + local ps, diff = getpercent (halfabsorb_amt, last_average, halfabsorb, true) + tab.partiallyabsorbedpersecond:SetText (_detalhes:comma_value (_math_floor (ps)) .. " (" .. diff .. ")") + else + tab.partiallyabsorbedpersecond:SetText ("0.00 (0%)") + end + + + + --> healing + + local actor_heal = combat (2, player.nome) + if (not actor_heal) then + tab.selfhealing:SetText ("0") + tab.selfhealingpersecond:SetText ("0 (0%)") + else + local last_actor_heal = last_combat (2, player.nome) + local este_alvo = actor_heal.targets._NameIndexTable [player.nome] + if (este_alvo) then + este_alvo = actor_heal.targets._ActorTable [este_alvo] + local heal_total = este_alvo.total + tab.selfhealing:SetText (_detalhes:ToK2 (heal_total)) + + if (last_actor_heal) then + local este_alvo = last_actor_heal.targets._NameIndexTable [player.nome] + if (este_alvo) then + + este_alvo = actor_heal.targets._ActorTable [este_alvo] + + local last_heal = este_alvo.total / last_combat:GetCombatTime() + + local ps, diff = getpercent (heal_total, last_heal, elapsed_time, true) + tab.selfhealingpersecond:SetText (_detalhes:comma_value (_math_floor (ps)) .. " (" .. diff .. ")") + + else + tab.selfhealingpersecond:SetText ("0 (0%)") + end + else + tab.selfhealingpersecond:SetText ("0 (0%)") + end + + else + tab.selfhealing:SetText ("0") + tab.selfhealingpersecond:SetText ("0 (0%)") + end + + + -- taken from healer + local heal_from = actor_heal.healing_from + local myReceivedHeal = {} + + for actorName, _ in pairs (heal_from) do + local thisActor = combat (2, actorName) + local targets = thisActor.targets --> targets is a container with target classes + local amount = targets:GetAmount (player.nome, "total") + myReceivedHeal [#myReceivedHeal+1] = {actorName, amount, thisActor.classe} + end + + table.sort (myReceivedHeal, _detalhes.Sort2) --> Sort2 sort by second index + + for i = 1, 5 do + local label1, label2 = unpack (tab ["healer" .. i]) + if (myReceivedHeal [i]) then + local name = myReceivedHeal [i][1] + if (name:find ("-")) then + name = name:gsub (("-.*"), "") + end + label1:SetText (name .. ":") + local class = myReceivedHeal [i][3] + if (class) then + local c = RAID_CLASS_COLORS [class] + if (c) then + label1:SetTextColor (c.r, c.g, c.b) + end + else + label1:SetTextColor (.8, .8, .8, 1) + end + + local last_actor = last_combat (2, myReceivedHeal [i][1]) + if (last_actor) then + local targets = last_actor.targets + local amount = targets:GetAmount (player.nome, "total") + if (amount) then + + local last_heal = amount + + local ps, diff = getpercent (myReceivedHeal[i][2], last_heal, 1, true) + label2:SetText ( _detalhes:ToK2 (myReceivedHeal[i][2] or 0) .. " (" .. diff .. ")") + + else + label2:SetText ( _detalhes:ToK2 (myReceivedHeal[i][2] or 0)) + end + else + label2:SetText ( _detalhes:ToK2 (myReceivedHeal[i][2] or 0)) + end + + + else + label1:SetText ("-- -- -- --") + label1:SetTextColor (.8, .8, .8, 1) + label2:SetText ("") + end + end + end + + --> Spells + --> cooldowns + + local index_used = 1 + + local misc_player = combat (4, player.nome) + + if (misc_player) then + if (misc_player.cooldowns_defensive_spell_tables) then + local minha_tabela = misc_player.cooldowns_defensive_spell_tables._ActorTable + local cooldowns_usados = {} + + for _spellid, _tabela in pairs (minha_tabela) do + cooldowns_usados [#cooldowns_usados+1] = {_spellid, _tabela.counter} + end + table.sort (cooldowns_usados, function (t1, t2) return t1[2] > t2[2] end) + + if (#cooldowns_usados > 1) then + for i = 1, #cooldowns_usados do + local esta_habilidade = cooldowns_usados[i] + local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1]) + + local label1, label2, icon1 = unpack (tab ["spell" .. i]) + + label1:SetText (nome_magia .. ":") + label2:SetText (esta_habilidade[2]) + icon1:SetTexture (icone_magia) + icon1:SetTexCoord (0.0625, 0.953125, 0.0625, 0.953125) + + index_used = index_used + 1 + end + end + end + end + + + + --> buffs de druida + if (index_used < 9) then + if (misc_player.buff_uptime_spell_tables) then + local minha_tabela = misc_player.buff_uptime_spell_tables._ActorTable + for _spellid, _tabela in pairs (minha_tabela) do + if (spells_by_class [player.classe] [_spellid] and index_used < 9) then + local nome_magia, _, icone_magia = GetSpellInfo (_spellid) + local label1, label2, icon1 = unpack (tab ["spell" .. index_used]) + + label1:SetText (nome_magia .. ":") + local minutos, segundos = _math_floor (_tabela.uptime / 60), _math_floor (_tabela.uptime % 60) + label2:SetText (minutos .. "m " .. segundos .. "s") + icon1:SetTexture (icone_magia) + icon1:SetTexCoord (0.0625, 0.953125, 0.0625, 0.953125) + + index_used = index_used + 1 + end + end + end + end + + for i = index_used, 9 do + local label1, label2, icon1 = unpack (tab ["spell" .. i]) + label1:SetText ("-- -- -- --") + label2:SetText ("") + icon1:SetTexture (nil) + end + + --> habilidade usada para interromper + + + + +--[[ + +--]] + end + + _detalhes:CreatePlayerDetailsTab ("Avoidance", --[1] tab name + function (tabOBject, playerObject) --[2] condition + if (playerObject.isTank) then + return true + else + return false + end + end, + + avoidance_fill, --[3] fill function + + nil, --[4] onclick + + avoidance_create --[5] oncreate + ) + function este_gump:ShowTabs() + local amt_positive = 0 + + for index = #_detalhes.player_details_tabs, 1, -1 do + + local tab = _detalhes.player_details_tabs [index] + + if (tab:condition (info.jogador, info.atributo, info.sub_atributo)) then + tab:Show() + amt_positive = amt_positive + 1 + tab:SetPoint ("BOTTOMLEFT", info.container_barras, "TOPLEFT", 390 - (67 * (amt_positive-1)), 1) + else + tab.frame:Hide() + tab:Hide() + end + end + + if (amt_positive < 2) then + _detalhes.player_details_tabs[1]:Hide() + end + end + + este_gump:SetScript ("OnHide", function (self) + _detalhes:FechaJanelaInfo() + for _, tab in _ipairs (_detalhes.player_details_tabs) do + tab:Hide() + tab.frame:Hide() + end + end) + + --DetailsInfoWindowTab1Text:SetText ("Avoidance") este_gump.tipo = 1 --> tipo da janela // 1 = janela normal return este_gump end +_detalhes.player_details_tabs = {} + +function _detalhes:CreatePlayerDetailsTab (tabname, condition, fillfunction, onclick, oncreate) + if (not tabname) then + tabname = "unnamed" + end + + local index = #_detalhes.player_details_tabs + + local newtab = CreateFrame ("button", "DetailsInfoWindowTab" .. index, info, "ChatTabTemplate") + newtab:SetText (tabname) + newtab:SetFrameStrata ("HIGH") + newtab:Hide() + + newtab.condition = condition + newtab.tabname = tabname + newtab.onclick = onclick + newtab.fillfunction = fillfunction + newtab.last_actor = {} + + --> frame + newtab.frame = CreateFrame ("frame", nil, UIParent) + newtab.frame:SetFrameStrata ("HIGH") + newtab.frame:EnableMouse (true) + + if (newtab.fillfunction) then + newtab.frame:SetScript ("OnShow", function() + if (newtab.last_actor == info.jogador) then + return + end + newtab.last_actor = info.jogador + newtab:fillfunction (info.jogador, info.instancia.showing) + end) + end + + if (oncreate) then + oncreate (newtab, newtab.frame) + end + + newtab.frame:SetBackdrop({ + bgFile = [[Interface\ACHIEVEMENTFRAME\UI-GuildAchievement-Parchment-Horizontal-Desaturated]], tile = true, tileSize = 512, + edgeFile = [[Interface\ACHIEVEMENTFRAME\UI-Achievement-WoodBorder]], edgeSize = 32, + insets = {left = 0, right = 0, top = 0, bottom = 0}}) + newtab.frame:SetBackdropColor (.5, .50, .50, 1) + + newtab.frame:SetPoint ("TOPLEFT", info, "TOPLEFT", 19, -76) + newtab.frame:SetSize (569, 274) + + newtab.frame:Hide() + + --> adicionar ao container + _detalhes.player_details_tabs [#_detalhes.player_details_tabs+1] = newtab + + if (not onclick) then + --> hide all tabs + newtab:SetScript ("OnClick", function() + for _, tab in _ipairs (_detalhes.player_details_tabs) do + tab.frame:Hide() + end + newtab.frame:Show() + end) + else + --> custom + newtab:SetScript ("OnClick", onclick) + end + + --> remove os scripts padroes + newtab:SetScript ("OnDoubleClick", nil) + newtab:SetScript ("OnEnter", nil) + newtab:SetScript ("OnLeave", nil) + newtab:SetScript ("OnDragStart", nil) + +end + function _detalhes.janela_info:monta_relatorio (botao) local atributo = info.atributo diff --git a/gumps/janela_options.lua b/gumps/janela_options.lua index e97a75dc..13544339 100644 --- a/gumps/janela_options.lua +++ b/gumps/janela_options.lua @@ -186,7 +186,7 @@ function _detalhes:OpenOptionsWindow (instance) -- ~altura if (options_type == 1) then - window.options [1][1].slider:SetMinMaxValues (0, 200) + window.options [1][1].slider:SetMinMaxValues (0, 320) elseif (options_type == 2) then window.options [2][1].slider:SetMinMaxValues (0, 1300) window.options [2][1].slider.scrollMax = 1300 @@ -616,6 +616,69 @@ function _detalhes:OpenOptionsWindow (instance) local buildAbbreviationMenu = function() return abbreviationOptions end + + --------------- auto switch + g:NewLabel (frame1, _, "$parentAutoSwitchLabel", "autoSwitchLabel", Loc ["STRING_OPTIONS_AUTO_SWITCH"]) + frame1.autoSwitchLabel:SetPoint (10, -450) + -- + + local onSelectAutoSwitch = function (_, _, switch_to) + if (switch_to == 0) then + window.instance.auto_switch_to = nil + return + end + + local selected = window.lastSwitchList [switch_to] + + if (selected [1] == "raid") then + local name = _detalhes.RaidTables.Menu [selected [2]] [1] + selected [2] = name + window.instance.auto_switch_to = selected + else + window.instance.auto_switch_to = selected + end + + end + + local buildSwitchMenu = function() + + window.lastSwitchList = {} + local t = {{value = 0, label = "NONE", onclick = onSelectAutoSwitch, icon = [[Interface\COMMON\VOICECHAT-MUTED]]}} + + local attributes = _detalhes.sub_atributos + local i = 1 + + for atributo, sub_atributo in ipairs (attributes) do + local icones = sub_atributo.icones + for index, att_name in ipairs (sub_atributo.lista) do + local texture, texcoord = unpack (icones [index]) + tinsert (t, {value = i, label = att_name, onclick = onSelectAutoSwitch, icon = texture, texcoord = texcoord}) + window.lastSwitchList [i] = {atributo, index, i} + i = i + 1 + end + end + + for index, ptable in ipairs (_detalhes.RaidTables.Menu) do + tinsert (t, {value = i, label = ptable [1], onclick = onSelectAutoSwitch, icon = ptable [2]}) + window.lastSwitchList [i] = {"raid", index, i} + i = i + 1 + end + + return t + end + + g:NewDropDown (frame1, _, "$parentAutoSwitchDropdown", "autoSwitchDropdown", 160, 20, buildSwitchMenu, 1) -- func, default + frame1.autoSwitchDropdown:SetPoint ("left", frame1.autoSwitchLabel, "right", 2, 0) + frame1.autoSwitchDropdown:SetFrameStrata ("DIALOG") + + frame1.autoSwitchDropdown.info = Loc ["STRING_OPTIONS_AUTO_SWITCH_DESC"] + + window:create_line_background (frame1, frame1.autoSwitchLabel, frame1.autoSwitchDropdown) + frame1.autoSwitchDropdown:SetHook ("OnEnter", background_on_enter) + frame1.autoSwitchDropdown:SetHook ("OnLeave", background_on_leave) + + + --abbreviation g:NewDropDown (frame1, _, "$parentAbbreviateDropdown", "dpsAbbreviateDropdown", 160, 20, buildAbbreviationMenu, _detalhes.ps_abbreviation) -- func, default frame1.dpsAbbreviateDropdown:SetPoint ("left", frame1.dpsAbbreviateLabel, "right", 2, 0) frame1.dpsAbbreviateDropdown:SetFrameStrata ("DIALOG") @@ -626,7 +689,6 @@ function _detalhes:OpenOptionsWindow (instance) frame1.dpsAbbreviateDropdown:SetHook ("OnEnter", background_on_enter) frame1.dpsAbbreviateDropdown:SetHook ("OnLeave", background_on_leave) - ---------------- appearance local frame2 = window.options [2][1].gump @@ -791,7 +853,8 @@ function _detalhes:OpenOptionsWindow (instance) local r, g, b = ColorPickerFrame:GetColorRGB() local a = OpacitySliderFrame:GetValue() - a = _detalhes:Scale (0, 1, 0.5, 1, a) - 0.5 + --a = _detalhes:Scale (0, 1, 0.5, 1, a) - 0.5 + --print (a) frame2.instancecolortexture:SetTexture (r, g, b) frame2.instancecolortexture:SetAlpha (a) @@ -1580,7 +1643,7 @@ function _detalhes:OpenOptionsWindow (instance) -- Color and Alpha g:NewLabel (frame2, _, "$parentAlphaLabel", "alphaLabel", Loc ["STRING_OPTIONS_INSTANCE_ALPHA"]) g:NewLabel (frame2, _, "$parentBackgroundColorLabel", "backgroundColorLabel", Loc ["STRING_OPTIONS_INSTANCE_ALPHA2"]) - -- + -- alpha background frame2.alphaSlider:SetPoint ("left", frame2.alphaLabel, "right", 2, 0) frame2.alphaSlider.useDecimals = true frame2.alphaSlider:SetHook ("OnValueChange", function (self, instance, amount) --> slider, fixedValue, sliderValue @@ -1589,15 +1652,11 @@ function _detalhes:OpenOptionsWindow (instance) return true end) frame2.alphaSlider.thumb:SetSize (30+(120*0.2)+2, 20*1.2) - frame2.backgroundColorTexture:SetPoint ("left", frame2.backgroundColorLabel, "right", 2) frame2.backgroundColorTexture:SetTexture (1, 1, 1) - frame2.backgroundColorButton:SetPoint ("left", frame2.backgroundColorLabel, "right", 2) frame2.backgroundColorButton:InstallCustomTexture() - - -- alpha background COLOR???? - + frame2.alphaSlider.info = Loc ["STRING_OPTIONS_INSTANCE_ALPHA_DESC"] window:create_line_background (frame2, frame2.alphaLabel, frame2.alphaSlider) frame2.alphaSlider:SetHook ("OnEnter", background_on_enter) @@ -2737,6 +2796,28 @@ end _G.DetailsOptionsWindow2InstanceButtonAnchorYSlider.MyObject:SetValue (instance.instance_button_anchor[2]) ---------------------------------------------------------------- + + --auto switch + local autoswitch = instance.auto_switch_to + if (autoswitch) then + if (autoswitch [1] == "raid") then + _G.DetailsOptionsWindow1AutoSwitchDropdown.MyObject:Select (autoswitch[2]) + --print (autoswitch[2]) + --[[ + for index, ptable in _ipairs (_detalhes.RaidTables.Menu) do + GameCooltip:AddMenu (1, _detalhes.RaidTables.switch, index, nil, nil, ptable [1], ptable [2], true) + if (ptable[1] == autoswitch [2]) then + + break + end + end + --]] + else + _G.DetailsOptionsWindow1AutoSwitchDropdown.MyObject:Select (autoswitch[3]+1, true) + end + else + _G.DetailsOptionsWindow1AutoSwitchDropdown.MyObject:Select (1, true) + end --resetTextColor _G.DetailsOptionsWindow2ResetTextFontDropdown.MyObject:SetFixedParameter (instance) diff --git a/gumps/janela_principal.lua b/gumps/janela_principal.lua index d31996ee..55b8515a 100644 --- a/gumps/janela_principal.lua +++ b/gumps/janela_principal.lua @@ -64,10 +64,19 @@ end local COORDS_LEFT_CONNECTOR_NO_ICON = {0.58837890625, 0.59423828125, 0.08251953125, 0.20556640625} -- 602 84 609 211 (updated) local COORDS_TOP_BACKGROUND = {0.15673828125, 0.65478515625, 0.22314453125, 0.34619140625} -- 160 228 671 355 (updated) local COORDS_RIGHT_BALL = {0.31591796875, 0.43994140625, 0.08251953125, 0.20556640625} --324 84 451 211 (updated) - local COORDS_LEFT_BALL_NO_ICON = {0.44970703125, 0.57275390625, 0.08251953125, 0.20556640625} --460 84 587 211 (updated) + + --local COORDS_LEFT_BALL_NO_ICON = {0.44970703125, 0.57275390625, 0.08251953125, 0.20556640625} --460 84 587 211 (updated) + local COORDS_LEFT_BALL_NO_ICON = {0.44970703125, 0.57275390625, 0.08251953125, 0.20556640625} --460 84 587 211 (updated) 588 212 local COORDS_LEFT_SIDE_BAR = {0.76611328125, 0.82763671875, 0.00244140625, 0.50146484375} -- 784 2 848 514 (updated) - local COORDS_RIGHT_SIDE_BAR = {0.70068359375, 0.76220703125, 0.00244140625, 0.50146484375} -- 717 2 781 514 (updated) + --local COORDS_LEFT_SIDE_BAR = {0.76611328125, 0.82666015625, 0.00244140625, 0.50048828125} -- 784 2 848 514 (updated) + --local COORDS_LEFT_SIDE_BAR = {0.765625, 0.8291015625, 0.00244140625, 0.5029296875} -- 784 2 848 514 (updated) + --784 2 847 513 + + --local COORDS_RIGHT_SIDE_BAR = {0.70068359375, 0.76220703125, 0.00244140625, 0.50146484375} -- 717 2 781 514 (updated) + local COORDS_RIGHT_SIDE_BAR = {0.7001953125, 0.763671875, 0.00244140625, 0.50146484375} -- 717 2 781 514 (updated) + --717 2 782 515 + local COORDS_BOTTOM_SIDE_BAR = {0.32861328125, 0.82666015625, 0.50537109375, 0.56494140625} -- 336 517 847 579 (updated) local COORDS_SLIDER_TOP = {0.00146484375, 0.03076171875, 0.00244140625, 0.03173828125} -- 1 2 32 33 -ok @@ -2071,7 +2080,7 @@ function gump:CriaJanelaPrincipal (ID, instancia, criando) gump:CriaRodape (baseframe, instancia) -- left and right side bars ------------------------------------------------------------------------------------------------------------------------------------------------------------ - + -- ~barra --> left baseframe.barra_esquerda = baseframe.cabecalho.fechar:CreateTexture (nil, "artwork") baseframe.barra_esquerda:SetTexture (DEFAULT_SKIN) @@ -2221,6 +2230,7 @@ function _detalhes:SetBarGrowDirection (direction) y = y * -1 row:ClearAllPoints() row:SetPoint ("topleft", self.baseframe, "topleft", x, y) + end elseif (direction == 2) then --> bottom to top @@ -2231,6 +2241,17 @@ function _detalhes:SetBarGrowDirection (direction) end end + + --> update all row width + if (self.bar_mod and self.bar_mod ~= 0) then + for index = 1, #self.barras do + self.barras [index]:SetWidth (self.baseframe:GetWidth() + self.bar_mod) + end + else + for index = 1, #self.barras do + self.barras [index]:SetWidth (self.baseframe:GetWidth()+self.row_info.space.right) + end + end end --> Alias @@ -3529,7 +3550,8 @@ function _detalhes:ChangeSkin (skin_name) local this_skin = _detalhes.skins [skin_name] if (not this_skin) then - return false --> throw a msg + skin_name = "Default Skin" + this_skin = _detalhes.skins [skin_name] end local just_updating = false @@ -3548,17 +3570,6 @@ function _detalhes:ChangeSkin (skin_name) --> reset all config self:ResetInstanceConfig() - --> overwrites - local overwrite_cprops = this_skin.instance_cprops - if (overwrite_cprops) then - for cprop, value in _pairs (overwrite_cprops) do - self [cprop] = value - end - end - - --> reset micro frames - _detalhes.StatusBar:Reset (self) - --> reset instance button self:SetInstanceButtonSettings ("reset") @@ -3569,7 +3580,28 @@ function _detalhes:ChangeSkin (skin_name) --> reset close button self:SetCloseButtonSettings ("reset") - + DetailsResetButton2Text2:SetText ("-") + + --> overwrites + local overwrite_cprops = this_skin.instance_cprops + if (overwrite_cprops) then + for cprop, value in _pairs (overwrite_cprops) do + self [cprop] = value + end + end + + --> reset instance button + self:SetInstanceButtonSettings() + --> reset delete button + if (_detalhes.ResetButtonInstance == self.meu_id) then + self:SetDeleteButtonSettings() + end + --> reset close button + self:SetCloseButtonSettings () + + --> reset micro frames + _detalhes.StatusBar:Reset (self) + end self.skin = skin_name @@ -3689,7 +3721,11 @@ function _detalhes:ChangeSkin (skin_name) self.baseframe.cabecalho.fechar:SetScript ("OnMouseDown", nil) self.baseframe.cabecalho.fechar:SetScript ("OnMouseUp", nil) - self.baseframe.cabecalho.fechar:SetSize (32, 32) + if (this_skin.close_button_size) then + self.baseframe.cabecalho.fechar:SetSize (unpack (this_skin.close_button_size)) + else + self.baseframe.cabecalho.fechar:SetSize (32, 32) + end end ----------> customize micro frames @@ -4102,6 +4138,10 @@ function _detalhes:ShowSideBars (instancia) self.baseframe.barra_esquerda:Show() self.baseframe.barra_direita:Show() + --> set default spacings + self.row_info.space.left = 3 + self.row_info.space.right = -5 + if (self.show_statusbar) then self.baseframe.barra_esquerda:SetPoint ("bottomleft", self.baseframe, "bottomleft", -56, -14) self.baseframe.barra_direita:SetPoint ("bottomright", self.baseframe, "bottomright", 56, -14) @@ -4136,6 +4176,8 @@ function _detalhes:ShowSideBars (instancia) end end + self:SetBarGrowDirection() + end function _detalhes:HideSideBars (instancia) @@ -4145,10 +4187,14 @@ function _detalhes:HideSideBars (instancia) self.show_sidebars = false + self.row_info.space.left = 0 + self.row_info.space.right = 0 + self.baseframe.barra_esquerda:Hide() self.baseframe.barra_direita:Hide() self.baseframe.barra_fundo:Hide() + self:SetBarGrowDirection() end function _detalhes:HideStatusBar (instancia) diff --git a/gumps/janela_report.lua b/gumps/janela_report.lua index 9a19bef1..f769aa53 100644 --- a/gumps/janela_report.lua +++ b/gumps/janela_report.lua @@ -87,6 +87,52 @@ local _UISpecialFrames = UISpecialFrames --> wow api locals return true end + + function _detalhes:SendReportTextWindow (lines) + + if (not _detalhes.copypasteframe) then + _detalhes.copypasteframe = CreateFrame ("editbox", "DetailsCopyPasteFrame2", UIParent) + _detalhes.copypasteframe:SetFrameStrata ("TOOLTIP") + _detalhes.copypasteframe:SetPoint ("CENTER", UIParent, "CENTER", 0, 50) + tinsert (UISpecialFrames, "DetailsCopyPasteFrame2") + _detalhes.copypasteframe:SetSize (400, 400) + _detalhes.copypasteframe:SetBackdrop ({bgFile = "Interface\\ACHIEVEMENTFRAME\\UI-Achievement-Parchment-Horizontal-Desaturated", + edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", + tile = true, tileSize = 16, edgeSize = 8, + insets = {left = 0, right = 0, top = 0, bottom = 0},}) + _detalhes.copypasteframe:SetBackdropColor (0, 0, 0, 0.9) + _detalhes.copypasteframe:SetAutoFocus (false) + _detalhes.copypasteframe:SetMultiLine (true) + _detalhes.copypasteframe:SetFontObject ("GameFontHighlightSmall") + _detalhes.copypasteframe:Hide() + + local title = _detalhes.copypasteframe:CreateFontString (nil, "overlay", "GameFontNormal") + title:SetPoint ("bottomleft", _detalhes.copypasteframe, "topleft", 2, 2) + title:SetText ("Press Ctrl + C and paste wherever you want, press any key to close.") + title:SetJustifyH ("left") + + local texture = _detalhes.copypasteframe:CreateTexture (nil, "overlay") + texture:SetTexture (0, 0, 0, 1) + texture:SetSize (400, 25) + texture:SetPoint ("bottomleft", _detalhes.copypasteframe, "topleft") + + _detalhes.copypasteframe:SetScript ("OnEditFocusGained", function() _detalhes.copypasteframe:HighlightText() end) + _detalhes.copypasteframe:SetScript ("OnEditFocusLost", function() _detalhes.copypasteframe:Hide() end) + _detalhes.copypasteframe:SetScript ("OnEscapePressed", function() _detalhes.copypasteframe:SetFocus (false); _detalhes.copypasteframe:Hide() end) + _detalhes.copypasteframe:SetScript ("OnChar", function() _detalhes.copypasteframe:SetFocus (false); _detalhes.copypasteframe:Hide() end) + end + + local s = "" + for _, line in ipairs (lines) do + s = s .. line .. "\n" + end + + _detalhes.copypasteframe:Show() + _detalhes.copypasteframe:SetText (s) + _detalhes.copypasteframe:HighlightText() + _detalhes.copypasteframe:SetFocus (true) + + end --> internal details report functions ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -175,13 +221,14 @@ local _UISpecialFrames = UISpecialFrames --> wow api locals {Loc ["STRING_REPORTFRAME_OFFICERS"], "OFFICER", _IsInGuild}, {Loc ["STRING_REPORTFRAME_WHISPER"], "WHISPER"}, {Loc ["STRING_REPORTFRAME_WHISPERTARGET"], "WHISPER2"}, - {Loc ["STRING_REPORTFRAME_SAY"], "SAY"} + {Loc ["STRING_REPORTFRAME_SAY"], "SAY"}, + {Loc ["STRING_REPORTFRAME_COPY"], "COPY"}, } local function initialize (self, level) local info = _UIDropDownMenu_CreateInfo() - for i = 8, #lista do + for i = 9, #lista do lista [i] = nil end diff --git a/images/icons2.tga b/images/icons2.tga index a96090b2f9dddd77f0bd7cff89baf004802aac31..80b1780fde54f2e757e5a528141d8b10d53086b6 100644 GIT binary patch delta 31476 zcma%j2UJs8*EYTPCJG|G_ufMwp(b<^AoSjQZ=v^I1W^%tR}>u`>*!c!)Ug)?1e8va zlhBR6Yx$oWnD_IY_gm}xv(~w}B;h9a+0S|QK6~$bS08epJjqLDV-sNe_k)9tLy@lz z`I8e4_U&gb_{?1iH^>efC$h(`12^1oh;njr$qVuc8EKn(W~2Pd@1p{$rtJbMmTcfa zhcr{Lk?o5PAq`7b{^UhV@0W+duPE$kAXnEtG|gvGq1q}76qjNPo35ph8ezNc+YTGBBOrs$Xj zQRG!zmqesc(^As5BT~}Z*8~J4Vt9G@6gW6Ic#vOQ4>xS$?Cc!uTwL7zyu5sB{QN@1 zU~%!C6?@dJ4jS2o4q3XT|7wlTx?$y!b;H~>?W(R-=y54|LozpykPAFdMRs;}ad;4Z zI5-=S!&Sk-zW>LMA8Z_O!;b81KmTAmbZPf(4l)Z&WW!#8{DUsC2L}SL04E2hH1a!? zG;O0SJ@RgtyXQ@tdF0QU;)~}jJ&WgzT(ag39AoG8ZG&djjJ>ASjl51G^YtU>8qUH6+o*Ww0}nGMLXQ>MkQ2esi@jztb~C-N2o76KGM z2Rny24>zyeE(IMgGsmP0rcP;}bZz6OwX7p&b!|eY)y;iBtC--Y<#e!9VrrO4Np$jQaS5{-2`Q7=-4-F#9qOJGIW;GW#4hVa zNomJt8{!z-BK>>~x=#+~G2-q~$riYme0< zVbNX1{Ja7>kRW^zEcP1Yr%S zY+Uo7+u;jdqP&Wqqr6L>p?t|t?0icfT6-JjT-dE{8_UJbw+EiPAUq&KVGiWb?6q+7 zU#N9`4bqnX14SUbz4Kr-QhQ4*gnyQ{Z*s z2_x(HKg{ftUt2k4ytZ@BeS>l>d}HrX^w!?9yYz*FPuX8+|FS0ze&x3; zvB@1G5(-Z6&~VnX^T7kNM2w|h9ITm(C>a|vW7(<^0`?$#KU2|wr;3BjVkt6tw`QXRb&_QE{w!Y)?s;Eyplx!xXcUw*hi|I^=2x*QA z2&#_>3aL+sOB;@>7~sAr=;LQK>|^Gnl`#}vVckUmanl)53A5Q93g}rwmy|hqJzw&Y zv2`#|*7atn83nF5`WCMS<@BznG+){%?E7t_?BGLYVc(sviB%`RVuMRIJ3{+r+&wcS!wU=|s-{VDDD=5#?6+ZVT?x*C;RYD|_#w(KJaq6a zxuj+8ox#g5q6&oqnd7{0@F2i(BO5Mc!-;IRux~^VuRsv5LiXyBJ(d;V4iryh!_nQ} z`(yYKpEBo`5!m5BBZGtGf!vTiI1nSi*}={W)k;8ERL0WQEp*Tb74$(?*?wfFqRr?I z1*^$j%Jx$-a+Y62MRX@bM2$a*iknUfiyBPI$XibBP(sbfsJqRnJ7z5GFbG@}-eL7c zOvZ9Xe5dWaj53OF7()KCcT&r0Oy#lFjMgh_IbFBc3i=dj=SXb3p9;pH>-B?t|S=*E^2;Lf%Y5csx? z&;(&-NATxBW&tN_53vN|$$qd6A{(uJgM&YY|0U?MZ3I00XT%5y?1(tC46?nCyas~; zc5Xxq#Uyu{p*+I(E9<+zmXf!6vtyUVxT2=>X9W$HX(cV!8OdGNGa}-alaf*nQxa0B z&!SS6U*wdXrj@jD3w!i^7BtKP<|TGpEUB4#FIjn|E_sl{OMs(iDh(S@NcV`WSqaSQ zS&gkcz8+tFelx24{AOaqwQpHn_r4YGf5@yn{?|tB$(LXAx^8UP`xUP0Sw~XT_5J5W zCCw*H(IK;XsE83cWykBHVyZ1dBD)fWgr$N-M0SKrN-E^<+GEnEq3`{xh5_lhmPy2W zeT(=}V|2%*wNP!p^T^4CPH8wZj)9rg+0Lg>S_Rv|r_4Xy1yb&=ijyiB&KZ zBA-z+@rdN+5s-y4zBLUH;rU5|SknLjp92vdPGmxGA%Aisf3o(rtO6|}&N2%J@{w)( z410=(ZJPxibxWWS8?dpnOzaHzpox%4&c!V*u~WkeO{kMmuzbiTr1fU!Zre}FI=C;& zdR{Z?#(r~ZhCXu=J5e(dGLE0cB%vRbaQZAI>o}uh97xeH@T4lJqp2wGWJ*|0*J6C- zvBjv;0V*b}WZ8jCDqHhR+`AE0aCS4Pc6c+l=N_~E?1%3i*Ji%AU7z`0bK&E+-2IQf z)t!C6QQZGvBewL!nms<7qM+vSSxD4m!pt#j-pnoOi=I{7_#U0WXYv}j8@tr7m*q5F ze%YhzeOpb>|CyR@&}$8Yun}$Zs8M~}2kl0RbP7W@vY6#DkORYdKtAn_1 zsXv17Pv$`W zY@)v?83v8XYkI!lt&M-LsN?fqNyqP_iUDz4!z^@6+bU+<&>`)U6~1@^LOz8JYy0Av zxNpWatnHJNf6WNmC#3uxg#Q(U{3X_}>Ny-wTmq{9bRks#?ntP-ZSPaqE2nIZ;pF1w zLEH|@`?8`+mhQ7W01I`*2&_rK!k-=f^@Humu#yaM8(~E75!Hbz!^VynkPQo?Xf}R6 zA#pJ=g-~HponM4RjNi#CVJ37;gQj(D!e>-X1LsT~lNT(}F>^8sPC&zmu;LVuw}y|e zTXT!4U3Ly7Gcd%06+8ceHGE3XW^&t|ujHfenH48LGK&wr`dWJU&1TK1kL1mki=UWX zzkFftM-aZd^!>!2Yu}GQUH#to8|7Q|h0$**?f00`WfxYg@o7|PdAr#idoUCgYZBGe zBYn{|v>sUE3n-davGamKdG4nPiR_1jO(Eirp(-OChhzxKV!pM zr}0VqW`hb&%;REvrm#Ui4IiESsz;oBD&IQ!RJ?TZt9(Sw=ouQm$7Kki+u=Wsuk?|A2NZilI zBOoO#v@2RnLhp`{nAyl4Rou9tb@Z%(UBUtcmtyUfzMy3u!0?Q$T#KtXwwl~39hziz zA^_i6{C@ZW{rmZs-@l*yYyJDd2lQ|K50<|*UHZ%nDLl1i?Ug~@rH+}m_Do!`@he?0 za?7UR<6D4hcmo{*NYS=SSX42Om{v6n`>bgeHl=A1HKAjZFlC6z_-y4>I)x@R&UhsB z&J**G&-+AGUtaLfI5dMHHGXmqYWRrpuleBUQ}G5HQ2oj+sP2VJQ2jIKz`93p+(r|s zPr}HS1fvY$e*@f%0L*fvELe{ZQ{=rk$q1sX$CeZ$yIXuk!2Me%wq6lqEv$G2WyHnz zq)17dK9rQUAC*_Zj~Un{&!W96C}`iJIUR>6dRW21jnab;HVgLMUrwyKv>ac4c0ID> z*k(%8wXYRSTdz(r)0(cV*@rYzsJV?H)E$Qa2MGvE3jPz|ohpIb0RKCp zL);=a0y6?Ji?=LRv-aRC2*eyL(SWO67Q~X`(rPiPIv$TCcDhW+?DGD!OCexNRWEoN zA62tbck=mq%h2dX>7l0^x%(b5n};Wv?N=w5?N`RXHC-5G)|~l3X4af~$E-W^p4kkw zwgMrqeh2hxomajvyRJ^N!0osUMFO&T@3rY~{Ws^o_upFhzVGJzx9+Q7zO@WbFtdB_ zY@$PJXa?x$c}wR6ina-1!N@s!(LbYiIkxh`N=V+374P^SIyR(CZMj*J) zZE&TJ?YzqVfPwe}w13q-Y+(HfD_o)%1eo`q0GFu!i-U|n%32s9AR_=GY(`>qG=3Q;1%CTA$vsk%(;YjOk%=1-{a!?Kl-E|nGVc9yO`K?d(l0rX++&D z_^pwB>?=F(vNt}lJ@0T~9WQNgWzWrA@}JmvmOi!fEr0A7-0;vNw(YnXHp-QcUl`^M zwq4zpR3LK9RbAioLq$dP2NxID4=z5wA20;|@e3DM*CEZcEgSqza;{3m0RKU97NrqG zZIc^8otIZoKvG88O-|kMlD2Wsq=c;NwA3#DaZ7AACA;&+TGNG*&GMsvZPX2aVjg_7 z`fc#h>c0l=)Bbhvx5e*$H|Ch_h!zh)4Zie=%M(BPdxa=E9LO4A2ILjQhd#?i!tRxQifUWy<-0B*q@Al_1|7#c0x1}j*{DU$2^syT%(0Q45L_4`{}-W!TDrP_>{d|d@~PAsCTeGFE6M)__22Jr zdqNm_vvG6ta>Dq=>Sbl%Hlco*jqqe%!1-HM-ewYGkwSBm(toCIWf&skhAViVJJlpz+PeI#d zuehAUdlen8kG3wE6Yk;F^M&2lXoY)kFP9EJ-|T?fbz;%kY`b9DGP&_T8Le z!P|0aoD5}p>}&0*5y;%JZ%yZ>AZtf9E8tS3{Lt%-#?zylE$2RcEkE>fvk*qqMg33L ziw`{CARm6cS$*Oyv*p}JR)7*ycV$(}E}CY6Nda~q*%T!ce~Mq`zV)I5f3B1aJY6IY zKAS2Vd^%Qq=;>JD!6)zX_WkiNukVk(^va%^Z|%Iu z6K-Lx9|z7Sq4F*guqyZ#H_gZihp z;YAXJEO_Db|LO<-2{7_;m}+Gg5R_0>)%R%FrR6y$EMf9VZjalTk!|EeNLI%}1o;FV z%I4bs-&ejKe!R*&@PNVW|Bb@jcV~gw{mW+&gPN zV(`soQp4@_*sAMmS?#~ClLuaI7WDnOnbvxDJ+=AvdTRUqjhx;;H;NCv*lfBmwpxGk z?Q(eGNrn+Nec8dcc-ah-3bZi^v`lE>@}n;nD-Qqls^ZvRzmktWxkx_x^km84lfL}E zhdHTrL-r(FT#TrMv>XTYE1XK&HYzqA+2uC)(x=$q#&MU>mT|b!7_s#&|L7cAH|7!B zGUl1oIqsjb?*k$Iz#C%Lp%;Fc0~axY`9Tn1fq(MX$8gWKJp3K0vD{k)g7SYmI>Z3T zU}ZwsFr1v+Z2bHpyH#{tE3I%jA7vEmXGFyktDXrxyqy5^W^Xp-y zL+gq4H`jAIAFOA#-rY>Dzp%e?Fe9;ppV)dxKU-?HHuaa>mQvJAFWXmV-#I8?%X?^2_jDe3qS%Ysv z@{YbF<{Uli9GLGXC?d`O?}gs>N~GA>;io{E#ozxgXysTzGQXhwZdJz;JD<|`X0GuI z(z|UJq~z==dkno6Yy-N zVTM~w7v0RWgzgm9yzHIazwDQ?pMj6>rlTX9Xhv?i6iw@dY5(NjmwDYcF6ZyP)*PDC z7+~Y#udSe>DO3~0Vpv(cE_tXxbJ8q57hrF%&L&_G+F{Eh? z=Y-Ez;q`OrZNJi*hbA_fE{$(CUmV+PK95K&vgkmbN65^w!IztvU5__2Iv+!AeYTO= z{%|9z{3-->Xg$2>+-g|<$<^STBddYghgU)hV0e{&kZ$c;PB-x=WT1%E%h>SdW!I?o zW!K2IWv9@lWm82PF6c`T*of)iJmR#0>9|4d@e3tJsvJTL0)b?ZU`;J zHi&~0$&bOzA)AD>{7!RBY?{4i;VnDw;*So*%1P(2rYX;a?kT^FfzObmUxM!#mui1tdS#SIeD&o`-7?Ed|T>Kkky&*`_!T8MP<;LERBJ%4VdwmQVFQFwDK82QE7>Oz$dK!{{tU|*G zqr}NN)PDkvw@hK*%K!YGszAQ#zd^>qSCOJ8EUa^g!$k(7G)OfO`EgvxGvu@w{MF{d zLQ<7`)EytfpnN(YaUT^M-pbH%N~Nfoh0oc!WGv}egf3aTr!6H`U7*9*VjT(v`D@EL z7~P)xz^s7rK;gj4ui1N_Y^HTQ{+iT$e&VJglz>6HP(Sp#jtSCr|H_K z(&1oO;ffhBtIog#)vtI&bgcL$^{>J_*=j)c;Wc9Jku_q@5ehMTV8l16>mEL;=@+Qa z_c1|r?>wSgpUG*E?b~2A4h=OJHW0w|6B`r__&~IjmsfyIMa@LWC7=TD9Ncjj8`ANY zXF~s{;Ji~a;pCx3n9P`uss80lSlOkIp=CpFBg-#e56n6cvrE}foCD4aRz3EAmU=u* zon1eaR8)R&b94W2#Jc}5HnaXAGCW~rvTcOF#e|~*{s7LudB0W6wS_Rl-^76wtVCcb zPMx1m&{P0+KEQ;s9sHr@JUo2HygdAte0&04f`Ss&JLL`UD(QKR>DngE;9zG9DfcKH z6t0vlG{ zBRf}o68l$)Sx44_3Qnzs6rWy;C_N2l%n_PHQ02Iy8R>$Srh+ch+%n~PyZ|2zKGGcK<0!R$0NoI zYn}Z3f+m6j!dMYuiFnw4Q!gdCdq7H3eo#_;N58n3bdQLz^nO9%9T#`W8ULxOgBwxO z^_$eSPMAd#YL>$Ck26AxjxAgHTz7d>%cGW-m;Hq1A>$0^^8Nr@F2A zhoZ6)Omjf)56jry+BO1G`TLvch(m!g$H@h`EH20|q$eUM;v*(1lO-Xg&@3ybIiR3u zdQnN;={I#<_rKJ2Jzgnmy1i1;aCyB))#;t08g@iY%V!)myNs*o6DRd-5@%r!W`US_ zh?ZDCyiCd;She%Xr|Vb*Q&4WHOZH@3J}|M3rZ^JHsTF6&*J{p9(JD`j0P=}~ zlG1c{Ev#f{)hBgu)iu0h+19sm+1$O5q2rK_m|(>cU$TNC)U7%OHm|xx>|OIp7+Ces zJPA!Ov=$ECa8&K}wdD4@YbmWaS7NFzFMA~&TnWfLwL&Pky6T&MeT5uS_1kJj@2ic# z!r|qB^g)VWe8*pVG;Hf2|4q2Lc?2O6>=lR(3G?y^vcVn{0X@rDL-+8`D950#YL~Fy z!#;^ehoeibUQMpMbv&W=N|8rMnX!nNEEj|j>6!Sa5%`)qJ6Qs>Wdypt2FI5A6Mi-V ztWv>73w{w{L2+vt8Pyy`HJctCWBh47OTraBOVVuv%ZLX?)=^IkEF)j*nudMQG9-Oa z(+wO^*CURp>k>YxX!(3n)byNCGa^lCTPMyyoEBm9MuXWNMry;AReWsQim6Ky-NY_@ z$%*V;Oo7b)59*TjGjW(8RhGY-ro6Ya}#4;^Fmx%+qVZFu07UytW=+e|s&pvuRF!ln6x<+!GYD=|%ftft4dJy|U{G_oE_{&mGK@8U{W+2ti%Ow(P-U0NBu zyh6&*5Ul(tG9M6FMMR`H6?GiNZSXlNUNPNTxVQt3zG=ro<0^*}ldG>s1f})bs_57W zb8+(`dd&j%XZcY=@7o65TkHA9=| zyM{JVj}5J3o*P)jywx?2{Ge?bKBj3L3I}Oi!zgG%&44(eY7p>Q%{26jj&0H`B>MM%>$laYstX&~=*D$zYZAkR>=3==>R+~G=aMzMOWAEkT-ttKOw#6ynqJ_$ z5b$*f_(pgI z1ibOiS_T9>Xa9@k!o%ERf=eGsLmMBc(_&CMxLLBrDscag+vTfo>-wRluK5Fotv?*ypxYfDb28mt z7$KgP-5+ic+2I!86BL(IG{9K8r4`wE7IxdZ=N>i3q@6cKCto*nNcznbmH5QOF8+nF zeZqS~`-G2%cJZI|Y+@#KEuyA$%p)hYO(Ui>O~XHHn8(cM+o#Q0;Yt^AvE3l7_{=iQ z|Ew15f3%U>eRIPtzI}tNW)r!gX&ywE+k=^wmUEciV;nH8Y#jL4Ze{nII%XmL-lWn9 zpU66rTX=huyRt7YA6WNKJ-Qy4e{KV6&PFWE3M6+v zSk3JFb0v51C8OxXJ3u})0&32G0<{+>LFw`L^qhTvF;Y4nl9!V@9xkWveX7ZaCe z7Zes_=i?V*gsvLiHtckD@sPI1?O* z4QnvYS@nwRU-e5lx=zeKy%AnEya{DzBdzn%dUo%htNHu?V&o3IpywQV0rKG}Jp2+A z9eV?ckG=-EeSgxE6PxeQW9x4)l3RaUj%&QRTr~I&G@P59sXYAhuiWn6j$67!#XxTF zhIqrskG0~0AZ@v41ZPB&piPjq4(l0`nDrVWJ;>);A+$)7&JVUb!)315wgLaUGY~l* z4-XfQps0kxF4#uwi}I}~bMz|gvd85gxADlmWb2mmtF?31eJDkLTDs=Ew8R&U+4z-D z+WL{F;fiI})~9UV)~jUB8ecRIdyW>2vDxz$9>q{WyJ>{%ql}o!;pME3duv4pA=rnX ztyhwdzgla&I1ccsy`T9ctzXJ3Vjt*Phuv}T$vKMg%Fa;Mw6owB5LV^l5ztXoHwkhL zF1-ke&ypYvsdWVx-LvA8G_V?wd2)?ZG_)RFeSHI_S=TeVAFsib*GgLZeR_1&FbF4K z1f-&~AgJIph_1K{vODg9_`2)B4=#)7A;o9uunmh5QF0oHOUZDD zy??2vQ$Tr%qfbdU%B$$8ExusL&ZFR_t!w^0SdoFCX1{a{tR8cYYMaJJw$8z^;2P1k z=oZ$tCFrH5Z^RGoTDtv>T%tde}; zul71cw$+F!dsRv9aVs&i2@l<)VrI_ICn~c;MSG{5j)k?jf_{O4UFh%nPMHf9 z`0{0^pq6FN=-y@j)WH=(&M6o$URjHS2``vKTu+Be5?6m?**onp@JQGXyweAPU-oej zlz$3@LSTK8_5;t@ZkkuzUMkinX)i4#XMj#f?xDE{moIt*Wqfw`Pkw1)6)>cs>rf2W zuGVmUA_>`wlnu6$AqZS-T|Ys&j%TpLMt}Hn6|!|hz=Xj#hnlW~6pC2sjtQukm{Mx zN5jYMqk1JApao`~0wE=r7>SLyR|^mPMK3@3cBbas$o-lNBQ0d|iRZ9$^^R3m?+u-p zniHDJI?ftG!aH{h@QH}>@(A$BYw9T)M}m%5Zyhl5BR1G01T-fp#6#fhFAt{ak)UtG6I-k z(y2~9B@R>%QVsA=>;yrX{lGP>fNB(CKCesA{bcFx`B2x$u}@S?HW2<0b%>=1oau1E z&d%0{;I%!|8D4(uv=8~RgLmmo zdwkJ-YxlgTmM*z3V7KPG=;G6#5*n^8#@Ah?#Z_OSN0Ben;i`n@n{k}xlYX4)mwA#J zly{yURdtP)-u?JX@sZbmRG#@TP+6S9QVDt-sgP)=1{Gj?H7DGs=B z<$$>YIJbDjckEVlc8*Eyv>S)Y?;hDrg|RoB!sqD` z>R%bL6;~O=%wxbcdN0i-q?KmolmzTu;HMYAdEG(G`b6XZLc94eg8q7Dbv;T~wr%&QP zkyM0~WJ4O}l(j7cFu|2p&S8z&5YY~df8}vU--;o$H~ALq^S*EEQTW8pt?-q-NAY{u z(=ZxSetsga@4-@5_wOLB^*7|CmIDheE)w(4e7AT#=?~*`F7^sU_0`};2(GxCVK>8GU8k_OX1>KVr{Lx# z6tQl~-X(7a?VeA8sSX-G=>P~WJO^Mp8-x^Hpc68V0MDpysw1w7qGstr(+*Jv#<7|J z7Zn7EQANPjD+TBp`am25sYXtyxFsh-$x>i?4<)MX2ra1|>S{&@eAAt_Q(k*fUB&RF zpnzB>Hz%(v{AsdqcC*S*?7crx^1g5KKY`p0-)4ua4fY*!YP@J-i6JJeITcH)?{Xp5 zp1=lFU52fZH_=|@zoYPFPf_kguh96C_YR(Aqwq5msm;H9tT_I9wD7>QFKHbQ=M!7+ ze~4?mJCxXbuPnLqJ}Ir|orEiLXO~fq9-aGfRe{#!Q zOxYo7TEj^YThI%z4q?D_j}_Ha#d2C!OyQ0&uW&x}$VSk)BZ*OtpUG(HU+_;16<8QT z6p>}0jaP;$IV?micPlMB1y8WWbI9y1!qP-hQP}kgPzC9I!(bX_n+OklLkLZ{(2l$^utSwF~T^h7=Feh#4mq9Gr8OELEJTR!WXETeA@0 z8U)oX^&kk$JPdr3dx1j$8E6@M)8q`4s3N*zRBiz!VCjSdS}w{UI3*SM1Qh{8Oe9U& zz=NXYZh(VV77?cHJ>nOi{
  • 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 Du+CEz diff --git a/images/skins/classic_skin.tga b/images/skins/classic_skin.tga new file mode 100644 index 0000000000000000000000000000000000000000..0d9cf51583abd3550d813c902c2f444735340b6d GIT binary patch literal 134812 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 TvuIA&{PyLy&FSp8w&ec-o;B>J diff --git a/locales/Details-enUS.lua b/locales/Details-enUS.lua index a82909fb..96f38353 100644 --- a/locales/Details-enUS.lua +++ b/locales/Details-enUS.lua @@ -2,7 +2,8 @@ local Loc = LibStub("AceLocale-3.0"):NewLocale("Details", "enUS", true) if not Loc then return end -------------------------------------------------------------------------------------------------------------------------------------------- - Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v1.11.3|r\n\n|cFFFFFF00-|r Fixed more known issues with skins.\n\n|cFFFFFF00-|r Fixed an issue where plugin icons wasn't hiding after close all windows.\n\n|cFFFFFF00v1.11.2|r\n\n|cFFFFFF00-|r Fixed bugs where Details! stop working if no plugin is actived on Wow addon panel.\n\n|cFFFFFF00v1.11.0|r\n\n|cFFFFFF00-|r Added an option for abbreviate Dps and Hps.\n\n|cFFFFFF00-|r Fixed issue where the window icon fade away when reopening the window.\n\n|cFFFFFF00-|r Improvements in class recognition.\n\n|cFFFFFF00-|r Added follow spells as defensive cooldowns:\nHealing Tide Totem, Spirit Link Totem, Demoralizing Banner, Mass Spell Reflection and Shield Block.\n\n|cFFFFFF00-|r More improvements done in Encounter Details plugin.\n\n|cFFFFFF00-|r Improvements made in the downloadable plugins: Timeline and Advanced Death Logs.\n\n|cFFFFFF00v1.10.0|r\n\n|cFFFFFF00-|r Fixed a issue with overall data Dps when have only one segment.\n\n|cFFFFFF00-|r Changed colors and added some backgrounds for menus.\n\n|cFFFFFF00-|r Options panel has his height size increased.\n\n|cFFFFFF00-|r Added options for hide the window or change the transparency when in combat.\n\n|cFFFFFF00-|r Added a control panel for plugins, where you can enable or disable then.\n\n|cFFFFFF00v1.9.5|r\n\n|cFFFFFF00-|r More fixes on Skins support and new tools for plugins.|r\n\n|cFFFFFF00v1.9.4|r\n\n|cFFFFFF00-|r Minor bug fixes and improvements on Welcome Screen.\n\n|cFFFFFF00v1.9.3|r\n\n|cFFFFFF00-|r The bar now starts after the icon instead of left window border.\n\n|cFFFFFF00-|r Welcome window now is localizated to others languages\n\n|cFFFFFF00-|r Fixed issue with Damage Rank Plugin.\n\n|cFFFFFF00v1.9.1|r\n\n|cFFFFFF00-|r fixed issue with main window icon when no plugin installed. \n\n|cFFFFFF00-|r fixed issue with some options button text which where out of positioning.\n\n|cFFFFFF00-|r fixed sub menu overlap when near right screen edge.\n\n|cFFFFFF00-|r fixed close button position for default skin.\n\n|cFFFFFF00-|r fixed skin error when selecting solo or right plugins.|cFFFFFF00v1.9.0|r\n\n|cFFFFFF00-|r Fixed minimap icon stuck problem.\n\n|cFFFFFF00-|r Skin support has been rewrite and now is more flexibe.\n\n|cFFFFFF00-|r Added up to 20 new customization options over options panel.\n\n|cFFFFFF00v1.8.4|r\n\n|cFFFFFF00-|r Added slash command 'details reinstall' which cleans Details! config in case of erros.\n\n|cFFFFFF00v1.8.3|r\n\n|cFFFFFF00-|r Added new skin: Simple Gray.\n\n|cFFFFFF00-|r Added minimap and interface addon panel buttons.\n\n|cFFFFFF00-|r Added new tutorials bubbles for basic aspects of Details! window.\n\n|cFFFFFF00-|r Fixed a issue with Panic Mode where sometimes his isnt triggered." + + Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v1.11.6|r\n\n|cFFFFFF00-|r Added new skin: Minimalistic, a very clean one.\n\n|cFFFFFF00-|r Added a new tab called avoidance on Player Details window for tanks.\n\n|cFFFFFF00-|r Added Copy & Paste option on report window. Now you can share your dps on twitter and facebook!\n\n|cFFFFFF00-|r Added a new option for auto switch what a window shows when you enter in a combat.\n\n|cFFFFFF00-|r Fixed issue with window background alpha which was changing the value everytime the options window is opened.\n\n|cFFFFFF00-|r Fixed the gap between the bar and the window background when disabling borders.\n\n|cFFFFFF00-|r Make some improvements on Tiny Threat plugin.\n\n|cFFFFFF00v1.11.3|r\n\n|cFFFFFF00-|r Fixed more known issues with skins.\n\n|cFFFFFF00-|r Fixed an issue where plugin icons wasn't hiding after close all windows.\n\n|cFFFFFF00v1.11.2|r\n\n|cFFFFFF00-|r Fixed bugs where Details! stop working if no plugin is actived on Wow addon panel.\n\n|cFFFFFF00v1.11.0|r\n\n|cFFFFFF00-|r Added an option for abbreviate Dps and Hps.\n\n|cFFFFFF00-|r Fixed issue where the window icon fade away when reopening the window.\n\n|cFFFFFF00-|r Improvements in class recognition.\n\n|cFFFFFF00-|r Added follow spells as defensive cooldowns:\nHealing Tide Totem, Spirit Link Totem, Demoralizing Banner, Mass Spell Reflection and Shield Block.\n\n|cFFFFFF00-|r More improvements done in Encounter Details plugin.\n\n|cFFFFFF00-|r Improvements made in the downloadable plugins: Timeline and Advanced Death Logs.\n\n|cFFFFFF00v1.10.0|r\n\n|cFFFFFF00-|r Fixed a issue with overall data Dps when have only one segment.\n\n|cFFFFFF00-|r Changed colors and added some backgrounds for menus.\n\n|cFFFFFF00-|r Options panel has his height size increased.\n\n|cFFFFFF00-|r Added options for hide the window or change the transparency when in combat.\n\n|cFFFFFF00-|r Added a control panel for plugins, where you can enable or disable then.\n\n|cFFFFFF00v1.9.5|r\n\n|cFFFFFF00-|r More fixes on Skins support and new tools for plugins.|r\n\n|cFFFFFF00v1.9.4|r\n\n|cFFFFFF00-|r Minor bug fixes and improvements on Welcome Screen.\n\n|cFFFFFF00v1.9.3|r\n\n|cFFFFFF00-|r The bar now starts after the icon instead of left window border.\n\n|cFFFFFF00-|r Welcome window now is localizated to others languages\n\n|cFFFFFF00-|r Fixed issue with Damage Rank Plugin.\n\n|cFFFFFF00v1.9.1|r\n\n|cFFFFFF00-|r fixed issue with main window icon when no plugin installed. \n\n|cFFFFFF00-|r fixed issue with some options button text which where out of positioning.\n\n|cFFFFFF00-|r fixed sub menu overlap when near right screen edge.\n\n|cFFFFFF00-|r fixed close button position for default skin.\n\n|cFFFFFF00-|r fixed skin error when selecting solo or right plugins.|cFFFFFF00v1.9.0|r\n\n|cFFFFFF00-|r Fixed minimap icon stuck problem.\n\n|cFFFFFF00-|r Skin support has been rewrite and now is more flexibe.\n\n|cFFFFFF00-|r Added up to 20 new customization options over options panel.\n\n|cFFFFFF00v1.8.4|r\n\n|cFFFFFF00-|r Added slash command 'details reinstall' which cleans Details! config in case of erros.\n\n|cFFFFFF00v1.8.3|r\n\n|cFFFFFF00-|r Added new skin: Simple Gray.\n\n|cFFFFFF00-|r Added minimap and interface addon panel buttons.\n\n|cFFFFFF00-|r Added new tutorials bubbles for basic aspects of Details! window.\n\n|cFFFFFF00-|r Fixed a issue with Panic Mode where sometimes his isnt triggered." Loc ["STRING_DETAILS1"] = "|cffffaeaeDetails:|r " --> color and details name @@ -218,7 +219,7 @@ if not Loc then return end Loc ["STRING_PETS"] = "Pets" Loc ["STRING_DPS"] = "Dps" Loc ["STRING_SEE_BELOW"] = "see below" - Loc ["STRING_GERAL"] = "Geral" + Loc ["STRING_GERAL"] = "General" Loc ["STRING_PERCENTAGE"] = "Percentage" Loc ["STRING_MEDIA"] = "Media" Loc ["STRING_HITS"] = "Hits" @@ -318,6 +319,7 @@ if not Loc then return end Loc ["STRING_REPORTFRAME_OFFICERS"] = "Officer Channel" Loc ["STRING_REPORTFRAME_WHISPER"] = "Whisper" Loc ["STRING_REPORTFRAME_WHISPERTARGET"] = "Whisper Target" + Loc ["STRING_REPORTFRAME_COPY"] = "Copy & Paste" Loc ["STRING_REPORTFRAME_SAY"] = "Say" Loc ["STRING_REPORTFRAME_LINES"] = "Lines" Loc ["STRING_REPORTFRAME_INSERTNAME"] = "insert player name" @@ -423,6 +425,8 @@ if not Loc then return end Loc ["STRING_OPTIONS_HIDECOMBAT_DESC"] = "If enabled, this instance window is hidden when you enter in combat." Loc ["STRING_OPTIONS_HIDECOMBATALPHA"] = "Transparency" Loc ["STRING_OPTIONS_HIDECOMBATALPHA_DESC"] = "The window can be completely hidden or just be more transparent." + Loc ["STRING_OPTIONS_AUTO_SWITCH"] = "Auto Switch" + Loc ["STRING_OPTIONS_AUTO_SWITCH_DESC"] = "When you enter in combat, this window change for the selected attribute or plugin.\n\nLeaving the combat, it switch back." Loc ["STRING_OPTIONS_PS_ABBREVIATE"] = "PS Abbreviation" Loc ["STRING_OPTIONS_PS_ABBREVIATE_DESC"] = "Choose the abbreviation method for Dps and Hps.\n\n|cFFFFFFFFNone|r: no abbreviation, the raw number is shown.\n\n|cFFFFFFFFHundreds I|r: the number is reduced with a letter representing his value.\n\n59874 = 59.8K\n100.000 = 100.0K\n19.530.000 = 19.53M\n\n|cFFFFFFFFHundreds II|r: the number is reduced with a letter representing his value.\n\n59874 = 59.8K\n100.000 = 100K\n19.530.000 = 19.53M" Loc ["STRING_OPTIONS_PS_ABBREVIATE_NONE"] = "None" diff --git a/locales/Details-ptBR.lua b/locales/Details-ptBR.lua index e6d60e81..c452669d 100644 --- a/locales/Details-ptBR.lua +++ b/locales/Details-ptBR.lua @@ -3,7 +3,7 @@ if not Loc then return end -------------------------------------------------------------------------------------------------------------------------------------------- - Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v1.11.3|r\n\n|cFFFFFF00-|r Corrigido mais problemas conhecidos com as Skins.\n\n|cFFFFFF00-|r Corrigido problema onde os icones dos plugins nao eram escondidos apos fechar todas as janelas.\n\n|cFFFFFF00v1.11.2|r\n\n|cFFFFFF00-|r Corrigido problemas onde o Details! parava de funcionar se nenhum plugin estiver ligado no painel de addons do Wow.|cFFFFFF00v1.11.0|r\n\n|cFFFFFF00-|r Adicionado opcao para abreviar o Dps e o Hps.\n\n|cFFFFFF00-|r Corrigido um problema onde o icone da janela desaparecia ao reabri-la.\n\n|cFFFFFF00-|r Melhorias no reconhecimento das classes.\n\n|cFFFFFF00-|r As seguintes magias foram adicionadas como cooldowns: Healing Tide Totem, Spirit Link Totem, Demoralizing Banner, Mass Spell Reflection and Shield Block.\n\n|cFFFFFF00-|r Mais melhorias feitas no plugin Encounter Details.\n\n|cFFFFFF00-|r Melhorias feitas nos plugins disponiveis para download: Timeline e Advanced Death Logs.\n\n|cFFFFFF00v1.10.0|r\n\n|cFFFFFF00-|r Corrigido um problema no Dps no segmento total quando existia apenas 1 segmento.\n\n|cFFFFFF00-|r Cores e imagem de fundo dos menus foram alterados.\n\n|cFFFFFF00-|r A altura do painel de opcoes foi aumentada.\n\n|cFFFFFF00-|r Adicionada opcao para esconder ou alterar a transparencia da janela quando estiver em combate.\n\n|cFFFFFF00-|r Adicionado um painel de controle de plugins para ativar ou desativa-los.\n\n|cFFFFFF00v1.9.5|r\n\n|cFFFFFF00-|rMais correcoes para as Skins e suporte a novos plugins.|r\n\n|cFFFFFF00v1.9.4|r\n\n|cFFFFFF00-|r Pequenas correcoes e melhorias na tela de boas vindas.\n\n|cFFFFFF00v1.9.3|r\n\n|cFFFFFF00-|r A barra agora comeca apos o icone e nao mais na borda esquerda da janela.\n\n|cFFFFFF00-|r Janela de boas vindas agora esta traduzida para outros idiomas.\n\n|cFFFFFF00-|r Corrigido o problema que estava afetando o plugin de Rank de Dano.\n\n|cFFFFFF00v1.9.1|r\n\n|cFFFFFF00-|r corrigido problema do icone na janela principal quando nao havia nenhum plugin instalado. \n\n|cFFFFFF00-|r corrigido problema com alguns botoes no painel de opcoes onde o texto estava fora do lugar.\n\n|cFFFFFF00-|r corrigido a posicao dos sub menus quando proximos a borda direita do monitor.\n\n|cFFFFFF00-|r corrigida a posicao do botao de fechar do skin padrao.\n\n|cFFFFFF00-|r corrigido um erro nas skins ao selecionar um plugin de raide ou solo.|cFFFFFF00v1.9.0|r\n\n|cFFFFFF00-|r Corrigido o problema de nao movimentar o botao no minimapa.\n\n|cFFFFFF00-|r Suporte a skins foi reescrito e agora ficou mais flexivel.\n\n|cFFFFFF00-|r Adicionadas mais de 20 opcoes de customizacao no painel de opcoes.\n\n|cFFFFFF00v1.8.4|r\n\n|cFFFFFF00-|r Adicionado comando 'details reinstalar' no qual limpa a configuracao do Details! em caso de erros.\n\n|cFFFFFF00v1.8.3|r\n\n|cFFFFFF00-|r Adicionada nova skin: Simple Gray.\n\n|cFFFFFF00-|r Adicionado botoes para o Details! no minimapa e menu de addons no painel de intercace.\n\n|cFFFFFF00-|r Adicionados novas bolhas de tutoriais para aspectos basicos das janelas do Details!.\n\n|cFFFFFF00-|r Corrigido o Modo Panico aonde as vezes ele nao era disparado." + Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v1.11.6|r\n\n|cFFFFFF00-|r Adicionado nova skin: Minimalistic.\n\n|cFFFFFF00-|r Adicionado nova aba chamada avoidance no painel de detalhes do jogador apenas para tanques.\n\n|cFFFFFF00-|r Adicionado opcao de Copiar e Coloar na janela de criar relatorios. Agora voce pode dizer seu dps aos seus amigos no twitter e facebook!\n\n|cFFFFFF00-|r Adicionada nova opcao de troca o que uma janela esta mostrando quando voce entrar em combate.\n\n|cFFFFFF00-|r Corrigido problema com a transparencia da janela onde ela mudava sozinha sempre que a janela de opcoes eta aberta.\n\n|cFFFFFF00-|r Corrigido o vao em branco que ficava entre o inicio de uma barra e o fundo da janela quando as bordas eram desligadas.\n\n|cFFFFFF00-|r Feito algumas melhorias no plugin Tiny Threat.\n\n|cFFFFFF00v1.11.3|r\n\n|cFFFFFF00-|r Corrigido mais problemas conhecidos com as Skins.\n\n|cFFFFFF00-|r Corrigido problema onde os icones dos plugins nao eram escondidos apos fechar todas as janelas.\n\n|cFFFFFF00v1.11.2|r\n\n|cFFFFFF00-|r Corrigido problemas onde o Details! parava de funcionar se nenhum plugin estiver ligado no painel de addons do Wow.|cFFFFFF00v1.11.0|r\n\n|cFFFFFF00-|r Adicionado opcao para abreviar o Dps e o Hps.\n\n|cFFFFFF00-|r Corrigido um problema onde o icone da janela desaparecia ao reabri-la.\n\n|cFFFFFF00-|r Melhorias no reconhecimento das classes.\n\n|cFFFFFF00-|r As seguintes magias foram adicionadas como cooldowns: Healing Tide Totem, Spirit Link Totem, Demoralizing Banner, Mass Spell Reflection and Shield Block.\n\n|cFFFFFF00-|r Mais melhorias feitas no plugin Encounter Details.\n\n|cFFFFFF00-|r Melhorias feitas nos plugins disponiveis para download: Timeline e Advanced Death Logs.\n\n|cFFFFFF00v1.10.0|r\n\n|cFFFFFF00-|r Corrigido um problema no Dps no segmento total quando existia apenas 1 segmento.\n\n|cFFFFFF00-|r Cores e imagem de fundo dos menus foram alterados.\n\n|cFFFFFF00-|r A altura do painel de opcoes foi aumentada.\n\n|cFFFFFF00-|r Adicionada opcao para esconder ou alterar a transparencia da janela quando estiver em combate.\n\n|cFFFFFF00-|r Adicionado um painel de controle de plugins para ativar ou desativa-los.\n\n|cFFFFFF00v1.9.5|r\n\n|cFFFFFF00-|rMais correcoes para as Skins e suporte a novos plugins.|r\n\n|cFFFFFF00v1.9.4|r\n\n|cFFFFFF00-|r Pequenas correcoes e melhorias na tela de boas vindas.\n\n|cFFFFFF00v1.9.3|r\n\n|cFFFFFF00-|r A barra agora comeca apos o icone e nao mais na borda esquerda da janela.\n\n|cFFFFFF00-|r Janela de boas vindas agora esta traduzida para outros idiomas.\n\n|cFFFFFF00-|r Corrigido o problema que estava afetando o plugin de Rank de Dano.\n\n|cFFFFFF00v1.9.1|r\n\n|cFFFFFF00-|r corrigido problema do icone na janela principal quando nao havia nenhum plugin instalado. \n\n|cFFFFFF00-|r corrigido problema com alguns botoes no painel de opcoes onde o texto estava fora do lugar.\n\n|cFFFFFF00-|r corrigido a posicao dos sub menus quando proximos a borda direita do monitor.\n\n|cFFFFFF00-|r corrigida a posicao do botao de fechar do skin padrao.\n\n|cFFFFFF00-|r corrigido um erro nas skins ao selecionar um plugin de raide ou solo.|cFFFFFF00v1.9.0|r\n\n|cFFFFFF00-|r Corrigido o problema de nao movimentar o botao no minimapa.\n\n|cFFFFFF00-|r Suporte a skins foi reescrito e agora ficou mais flexivel.\n\n|cFFFFFF00-|r Adicionadas mais de 20 opcoes de customizacao no painel de opcoes.\n\n|cFFFFFF00v1.8.4|r\n\n|cFFFFFF00-|r Adicionado comando 'details reinstalar' no qual limpa a configuracao do Details! em caso de erros.\n\n|cFFFFFF00v1.8.3|r\n\n|cFFFFFF00-|r Adicionada nova skin: Simple Gray.\n\n|cFFFFFF00-|r Adicionado botoes para o Details! no minimapa e menu de addons no painel de intercace.\n\n|cFFFFFF00-|r Adicionados novas bolhas de tutoriais para aspectos basicos das janelas do Details!.\n\n|cFFFFFF00-|r Corrigido o Modo Panico aonde as vezes ele nao era disparado." Loc ["STRING_DETAILS1"] = "|cffffaeaeDetalhes:|r " --> color and details name @@ -317,6 +317,7 @@ if not Loc then return end Loc ["STRING_REPORTFRAME_WHISPER"] = "Sussurrar" Loc ["STRING_REPORTFRAME_WHISPERTARGET"] = "Sussurar o Alvo" Loc ["STRING_REPORTFRAME_SAY"] = "Dizer" + Loc ["STRING_REPORTFRAME_COPY"] = "Copiar e Colar" Loc ["STRING_REPORTFRAME_LINES"] = "Linhas" Loc ["STRING_REPORTFRAME_INSERTNAME"] = "entre com um nome" Loc ["STRING_REPORTFRAME_CURRENT"] = "Mostrando" @@ -421,6 +422,8 @@ if not Loc then return end Loc ["STRING_OPTIONS_HIDECOMBATALPHA_DESC"] = "A janela pode ser completamente escondida ou apenas ficar mais transparente." Loc ["STRING_OPTIONS_PS_ABBREVIATE"] = "PS Abreviacao" Loc ["STRING_OPTIONS_PS_ABBREVIATE_DESC"] = "Escolha o metodo de abreviacao para o Dps e Hps.\n\n|cFFFFFFFFNenhuma|r: sem abreviacao, o numero inteiro e mostrado.\n\n|cFFFFFFFFCem I|r: o numero e reduzido e uma letra indica o valor.\n\n59874 = 59.8K\n100.000 = 100.0K\n19.530.000 = 19.53M\n\n|cFFFFFFFFHundreds II|r: o numero e reduzido e uma letra indica o valor.\n\n59874 = 59.8K\n100.000 = 100K\n19.530.000 = 19.53M" + Loc ["STRING_OPTIONS_AUTO_SWITCH"] = "Troca Automatica" + Loc ["STRING_OPTIONS_AUTO_SWITCH_DESC"] = "Quando voce entra em combate, esta janela mudara o atributo mostrado para outro atributo ou plugin.\n\nSaindo do combate o atributo antigo volta a ser mostrado." Loc ["STRING_OPTIONS_PS_ABBREVIATE_NONE"] = "Nenhuma" Loc ["STRING_OPTIONS_PS_ABBREVIATE_TOK"] = "Cem I" Loc ["STRING_OPTIONS_PS_ABBREVIATE_TOK2"] = "Cem II" diff --git a/plugins/Details_TinyThreat/Details_TinyThreat.lua b/plugins/Details_TinyThreat/Details_TinyThreat.lua index 8b7c551d..a0b4c3e7 100644 --- a/plugins/Details_TinyThreat/Details_TinyThreat.lua +++ b/plugins/Details_TinyThreat/Details_TinyThreat.lua @@ -14,6 +14,7 @@ local _ipairs = ipairs --> lua api local _table_sort = table.sort --> lua api local _cstr = string.format --> lua api local _unpack = unpack +local RAID_CLASS_COLORS = RAID_CLASS_COLORS --> Create the plugin Object local ThreatMeter = _detalhes:NewPluginObject ("Details_Threat") @@ -45,17 +46,10 @@ local function CreatePluginFrames (data) local instance local player - function _detalhes:FadeOnShow() - DetailsFrameWork:Fade (ThreatMeterFrame.titleIcon, "ALPHAANIM", 0.05) - DetailsFrameWork:Fade (ThreatMeterFrame.titleText, "ALPHAANIM", 0.05) - DetailsFrameWork:Fade (ThreatMeterFrame.titleText2, "IN", 0.5) - end - --> OnEvent Table function ThreatMeter:OnDetailsEvent (event) if (event == "HIDE") then --> plugin hidded, disabled - ThreatMeterFrame:SetScript ("OnUpdate", nil) ThreatMeter.Actived = false ThreatMeter:Cancel() @@ -69,42 +63,24 @@ local function CreatePluginFrames (data) ThreatMeter:SizeChanged() - player = UnitName ("player") - ThreatMeterFrame:RegisterEvent ("PLAYER_TARGET_CHANGED") + player = GetUnitName ("player", true) + ThreatMeter.Actived = false - _detalhes:ScheduleTimer ("FadeOnShow", 3) - if (ThreatMeter:IsInCombat()) then + if (ThreatMeter:IsInCombat() or UnitAffectingCombat ("player")) then ThreatMeter.Actived = true ThreatMeter:Start() - else - DetailsFrameWork:Fade (ThreatMeterFrame.titleIcon, 0) - DetailsFrameWork:Fade (ThreatMeterFrame.titleText, 0) - DetailsFrameWork:Fade (ThreatMeterFrame.titleText2, 0) end - - elseif (event == "REFRESH") then --> requested a refresh window - --> - - elseif (event == "COMBAT_PLAYER_ENTER") then --> combat started - --print ("ENTER COMBAT - nova tabela") - if (IsInGroup() or IsInRaid()) then - DetailsFrameWork:Fade (ThreatMeterFrame.titleIcon, 1) - DetailsFrameWork:Fade (ThreatMeterFrame.titleText, 1) - DetailsFrameWork:Fade (ThreatMeterFrame.titleText2, 1) + + elseif (event == "COMBAT_PLAYER_ENTER") then + if (not ThreatMeter.Actived) then + ThreatMeter.Actived = true + ThreatMeter:Start() end - ThreatMeter.Actived = true - ThreatMeter:Start() - - elseif (event == "COMBAT_PLAYER_LEAVE") then --> combat ended - DetailsFrameWork:Fade (ThreatMeterFrame.titleIcon, "alpha", 0.05) - DetailsFrameWork:Fade (ThreatMeterFrame.titleText, "alpha", 0.05) - DetailsFrameWork:Fade (ThreatMeterFrame.titleText2, 1) - ThreatMeter:End() - ThreatMeter.Actived = false elseif (event == "DETAILS_INSTANCE_ENDRESIZE" or event == "DETAILS_INSTANCE_SIZECHANGED") then ThreatMeter:SizeChanged() + ThreatMeter:RefreshRows() elseif (event == "DETAILS_INSTANCE_STARTSTRETCH") then ThreatMeterFrame:SetFrameStrata ("TOOLTIP") @@ -114,9 +90,14 @@ local function CreatePluginFrames (data) ThreatMeterFrame:SetFrameStrata ("MEDIUM") elseif (event == "PLUGIN_DISABLED") then - + ThreatMeterFrame:UnregisterEvent ("PLAYER_TARGET_CHANGED") + ThreatMeterFrame:UnregisterEvent ("PLAYER_REGEN_DISABLED") + ThreatMeterFrame:UnregisterEvent ("PLAYER_REGEN_ENABLED") + elseif (event == "PLUGIN_ENABLED") then - + ThreatMeterFrame:RegisterEvent ("PLAYER_TARGET_CHANGED") + ThreatMeterFrame:RegisterEvent ("PLAYER_REGEN_DISABLED") + ThreatMeterFrame:RegisterEvent ("PLAYER_REGEN_ENABLED") end end @@ -129,9 +110,8 @@ local function CreatePluginFrames (data) tile = true, tileSize = 16, insets = {left = 1, right = 1, top = 0, bottom = 1},}) ThreatMeterFrame:SetBackdropColor (.3, .3, .3, .3) - --]] - local icon1 = DetailsFrameWork:NewImage (ThreatMeterFrame, nil, nil, "titleIcon", 64, 64, [[Interface\HELPFRAME\HelpIcon-ItemRestoration]]) + local icon1 = DetailsFrameWork:NewImage (ThreatMeterFrame, nil, nil, "titleIcon", 64, 64, "Interface\\HELPFRAME\\HelpIcon-ItemRestoration") icon1:SetPoint (10, -10) local title = DetailsFrameWork:NewLabel (ThreatMeterFrame, nil, nil, "titleText", "Tiny Threat", "CoreAbilityFont", 26) title:SetPoint ("left", icon1, "right", 2) @@ -140,6 +120,7 @@ local function CreatePluginFrames (data) DetailsFrameWork:Fade (title, 1) local title2 = DetailsFrameWork:NewLabel (ThreatMeterFrame, nil, nil, "titleText2", "A (very) small threat meter.", "GameFontHighlightSmall", 9) title2:SetPoint ("bottomright", title, "bottomright", 0, -10) +--]] function ThreatMeter:UpdateContainers() for _, row in _ipairs (ThreatMeter.Rows) do @@ -166,7 +147,8 @@ local function CreatePluginFrames (data) local RoleIconCoord = { ["TANK"] = {0, 0.28125, 0.328125, 0.625}, ["HEALER"] = {0.3125, 0.59375, 0, 0.296875}, - ["DAMAGER"] = {0.3125, 0.59375, 0.328125, 0.625} + ["DAMAGER"] = {0.3125, 0.59375, 0.328125, 0.625}, + ["NONE"] = {0.3125, 0.59375, 0.328125, 0.625} } function ThreatMeter:SizeChanged() @@ -197,6 +179,19 @@ local function CreatePluginFrames (data) end + function ThreatMeter:RefreshRow (row) + row.textsize = instance.row_info.font_size + row.textfont = instance.row_info.font_face + row.texture = instance.row_info.texture + row.shadow = instance.row_info.textL_outline + end + + function ThreatMeter:RefreshRows() + for i = 1, #ThreatMeter.Rows do + ThreatMeter:RefreshRow (ThreatMeter.Rows [i]) + end + end + function ThreatMeter:NewRow (i) local newrow = DetailsFrameWork:NewBar (ThreatMeterFrame, _, "DetailsThreatRow"..i, _, 300, 14) newrow:SetPoint (3, -((i-1)*15)) @@ -206,7 +201,11 @@ local function CreatePluginFrames (data) newrow.fontface = "GameFontHighlightSmall" newrow:SetIcon ("Interface\\LFGFRAME\\UI-LFG-ICON-PORTRAITROLES", RoleIconCoord ["DAMAGER"]) ThreatMeter.Rows [#ThreatMeter.Rows+1] = newrow + + ThreatMeter:RefreshRow (newrow) + newrow:Hide() + return newrow end @@ -225,52 +224,129 @@ local function CreatePluginFrames (data) thisRow:SetColor ( 1, percent/100, 0, 1) end --]] + local Threater = function() - - local threat_table = {} - - if (target) then + + if (ThreatMeter.Actived and UnitExists ("target") and not _UnitIsFriend ("player", "target")) then if (_IsInRaid()) then for i = 1, _GetNumGroupMembers(), 1 do + + local thisplayer_name = GetUnitName ("raid"..i, true) + local threat_table_index = ThreatMeter.player_list_hash [thisplayer_name] + local threat_table = ThreatMeter.player_list_indexes [threat_table_index] + + if (not threat_table) then + --> some one joined the group while the player are in combat + ThreatMeter:Start() + return + end + local isTanking, status, threatpct, rawthreatpct, threatvalue = _UnitDetailedThreatSituation ("raid"..i, "target") if (status) then - threat_table [#threat_table+1] = {_UnitName ("raid"..i), threatpct, isTanking} + threat_table [2] = threatpct + threat_table [3] = isTanking + else + threat_table [2] = 0 + threat_table [3] = false end + end + elseif (_IsInGroup()) then for i = 1, _GetNumGroupMembers()-1, 1 do + local thisplayer_name = GetUnitName ("party"..i, true) + local threat_table_index = ThreatMeter.player_list_hash [thisplayer_name] + local threat_table = ThreatMeter.player_list_indexes [threat_table_index] + + if (not threat_table) then + --> some one joined the group while the player are in combat + ThreatMeter:Start() + return + end + local isTanking, status, threatpct, rawthreatpct, threatvalue = _UnitDetailedThreatSituation ("party"..i, "target") if (status) then - threat_table [#threat_table+1] = {_UnitName ("party"..i), threatpct, isTanking} + threat_table [2] = threatpct + threat_table [3] = isTanking + else + threat_table [2] = 0 + threat_table [3] = false end end + + local thisplayer_name = GetUnitName ("player", true) + local threat_table_index = ThreatMeter.player_list_hash [thisplayer_name] + local threat_table = ThreatMeter.player_list_indexes [threat_table_index] + + local isTanking, status, threatpct, rawthreatpct, threatvalue = _UnitDetailedThreatSituation ("player", "target") + if (status) then + threat_table [2] = threatpct + threat_table [3] = isTanking + else + threat_table [2] = 0 + threat_table [3] = false + end + + else + local thisplayer_name = GetUnitName ("player", true) + local threat_table_index = ThreatMeter.player_list_hash [thisplayer_name] + local threat_table = ThreatMeter.player_list_indexes [threat_table_index] + + local isTanking, status, threatpct, rawthreatpct, threatvalue = _UnitDetailedThreatSituation ("player", "target") + if (status) then + threat_table [2] = threatpct + threat_table [3] = isTanking + else + threat_table [2] = 0 + threat_table [3] = false + end end - _table_sort (threat_table, sort) + --> sort + _table_sort (ThreatMeter.player_list_indexes, sort) + for index, t in _ipairs (ThreatMeter.player_list_indexes) do + ThreatMeter.player_list_hash [t[1]] = index + end + + --> no threat on this enemy + if (ThreatMeter.player_list_indexes [1] [2] < 1) then + ThreatMeter:HideBars() + return + end + + --and ThreatMeter.player_list_indexes [1] [2] > 0 + -- ThreatMeter.player_list_indexes = {} + -- ThreatMeter.player_list_hash = {} local lastIndex = 0 local shownMe = false for index = 1, #ThreatMeter.ShownRows do local thisRow = ThreatMeter.ShownRows [index] - local threat_actor = threat_table [index] + local threat_actor = ThreatMeter.player_list_indexes [index] if (threat_actor) then - local role = _UnitGroupRolesAssigned (threat_actor [1]) - thisRow.icon:SetTexCoord (_unpack (RoleIconCoord [role])) + local role = threat_actor [4] + thisRow._icon:SetTexCoord (_unpack (RoleIconCoord [role])) + + --local color = RAID_CLASS_COLORS [threat_actor [5]] + --thisRow.textleft:SetTextColor (color.r, color.g, color.b) + thisRow:SetLeftText (threat_actor [1]) - thisRow:SetRightText (_cstr ("%.1f", threat_actor [2]).."%") - thisRow:SetValue (threat_actor [2]) + + local pct = threat_actor [2] + + thisRow:SetRightText (_cstr ("%.1f", pct).."%") + thisRow:SetValue (pct) if (index == 1) then - thisRow:SetColor (threat_actor [2]*0.01, math.abs (threat_actor [2]-100)*0.01, 0, 1) + thisRow:SetColor (pct*0.01, math.abs (pct-100)*0.01, 0, 1) else - thisRow:SetColor (threat_actor [2]*0.01, math.abs (threat_actor [2]-100)*0.01, 0, .3) - local percent = threat_actor [2] - if (percent >= 50) then - thisRow:SetColor ( 1, math.abs (percent - 100)/100, 0, 1) + thisRow:SetColor (pct*0.01, math.abs (pct-100)*0.01, 0, .3) + if (pct >= 50) then + thisRow:SetColor ( 1, math.abs (pct - 100)/100, 0, 1) else - thisRow:SetColor ( percent/100, 1, 0, 1) + thisRow:SetColor (pct/100, 1, 0, 1) end end @@ -287,15 +363,18 @@ local function CreatePluginFrames (data) if (not shownMe) then --> show my self into last bar - local isTanking, status, threatpct, rawthreatpct, threatvalue = _UnitDetailedThreatSituation ("player", "target") - if (threatpct and threatpct > 0.1) then - local thisRow = ThreatMeter.ShownRows [#ThreatMeter.ShownRows] - thisRow:SetLeftText (player) - local role = _UnitGroupRolesAssigned (player) - thisRow.icon:SetTexCoord (_unpack (RoleIconCoord [role])) - thisRow:SetRightText (_cstr ("%.1f", threatpct).."%") - thisRow:SetValue (threatpct) - thisRow:SetColor (threatpct*0.01, math.abs (threatpct-100)*0.01, 0, .3) + local threat_actor = ThreatMeter.player_list_indexes [ ThreatMeter.player_list_hash [player] ] + if (threat_actor) then + if (threat_actor [2] and threat_actor [2] > 0.1) then + local thisRow = ThreatMeter.ShownRows [#ThreatMeter.ShownRows] + thisRow:SetLeftText (player) + --thisRow.textleft:SetTextColor (unpack (RAID_CLASS_COLORS [threat_actor [5]])) + local role = threat_actor [4] + thisRow._icon:SetTexCoord (_unpack (RoleIconCoord [role])) + thisRow:SetRightText (_cstr ("%.1f", threat_actor [2]).."%") + thisRow:SetValue (threat_actor [2]) + thisRow:SetColor (threat_actor [2]*0.01, math.abs (threat_actor [2]-100)*0.01, 0, .3) + end end end @@ -318,35 +397,78 @@ local function CreatePluginFrames (data) end end - local OnUpdate = function (self, elapsed) - timer = timer + elapsed - if (timer > interval) then - timer = 0 - --if (_IsInRaid() or _IsInGroup()) then - --print ("aqui") - Threater() - --end - end + function ThreatMeter:Tick() + Threater() end function ThreatMeter:Start() ThreatMeter:HideBars() if (ThreatMeter.Actived) then - if (_IsInRaid() or _IsInGroup()) then - --print ("Iniciando analizador de Threat") - ThreatMeterFrame:SetScript ("OnUpdate", OnUpdate) + if (ThreatMeter.job_thread) then + ThreatMeter:CancelTimer (ThreatMeter.job_thread) + ThreatMeter.job_thread = nil end + + ThreatMeter.player_list_indexes = {} + ThreatMeter.player_list_hash = {} + + --> pre build player list + if (_IsInRaid()) then + for i = 1, _GetNumGroupMembers(), 1 do + local thisplayer_name = GetUnitName ("raid"..i, true) + local role = _UnitGroupRolesAssigned (thisplayer_name) + local _, class = UnitClass (thisplayer_name) + local t = {thisplayer_name, 0, false, role, class} + ThreatMeter.player_list_indexes [#ThreatMeter.player_list_indexes+1] = t + ThreatMeter.player_list_hash [thisplayer_name] = #ThreatMeter.player_list_indexes + end + + elseif (_IsInGroup()) then + for i = 1, _GetNumGroupMembers()-1, 1 do + local thisplayer_name = GetUnitName ("party"..i, true) + local role = _UnitGroupRolesAssigned (thisplayer_name) + local _, class = UnitClass (thisplayer_name) + local t = {thisplayer_name, 0, false, role, class} + ThreatMeter.player_list_indexes [#ThreatMeter.player_list_indexes+1] = t + ThreatMeter.player_list_hash [thisplayer_name] = #ThreatMeter.player_list_indexes + end + local thisplayer_name = GetUnitName ("player", true) + local role = _UnitGroupRolesAssigned (thisplayer_name) + local _, class = UnitClass (thisplayer_name) + local t = {thisplayer_name, 0, false, role, class} + ThreatMeter.player_list_indexes [#ThreatMeter.player_list_indexes+1] = t + ThreatMeter.player_list_hash [thisplayer_name] = #ThreatMeter.player_list_indexes + + else + local thisplayer_name = GetUnitName ("player", true) + local role = _UnitGroupRolesAssigned (thisplayer_name) + local _, class = UnitClass (thisplayer_name) + local t = {thisplayer_name, 0, false, role, class} + ThreatMeter.player_list_indexes [#ThreatMeter.player_list_indexes+1] = t + ThreatMeter.player_list_hash [thisplayer_name] = #ThreatMeter.player_list_indexes + + end + + local job_thread = ThreatMeter:ScheduleRepeatingTimer ("Tick", 1) + ThreatMeter.job_thread = job_thread end end function ThreatMeter:End() - --print ("=== COMBAT LEAVE ===") ThreatMeter:HideBars() - ThreatMeterFrame:SetScript ("OnEvent", nil) + if (ThreatMeter.job_thread) then + ThreatMeter:CancelTimer (ThreatMeter.job_thread) + ThreatMeter.job_thread = nil + end end function ThreatMeter:Cancel() ThreatMeter:HideBars() + if (ThreatMeter.job_thread) then + ThreatMeter:CancelTimer (ThreatMeter.job_thread) + ThreatMeter.job_thread = nil + end + ThreatMeter.Actived = false end end @@ -355,7 +477,17 @@ function ThreatMeter:OnEvent (_, event, ...) if (event == "PLAYER_TARGET_CHANGED") then ThreatMeter:TargetChanged() + + elseif (event == "PLAYER_REGEN_DISABLED") then + ThreatMeter.Actived = true + ThreatMeter:Start() + --print ("tiny theat: regen disabled") + elseif (event == "PLAYER_REGEN_ENABLED") then + ThreatMeter:End() + ThreatMeter.Actived = false + --print ("tiny theat: regen enabled") + elseif (event == "ADDON_LOADED") then local AddonName = select (1, ...) if (AddonName == "Details_TinyThreat") then @@ -382,6 +514,8 @@ function ThreatMeter:OnEvent (_, event, ...) _G._detalhes:RegisterEvent (ThreatMeter, "DETAILS_INSTANCE_ENDSTRETCH") ThreatMeterFrame:RegisterEvent ("PLAYER_TARGET_CHANGED") + ThreatMeterFrame:RegisterEvent ("PLAYER_REGEN_DISABLED") + ThreatMeterFrame:RegisterEvent ("PLAYER_REGEN_ENABLED") end end diff --git a/plugins/Details_Vanguard/Details_Vanguard.lua b/plugins/Details_Vanguard/Details_Vanguard.lua index 81889530..6e842a9e 100644 --- a/plugins/Details_Vanguard/Details_Vanguard.lua +++ b/plugins/Details_Vanguard/Details_Vanguard.lua @@ -486,13 +486,13 @@ local function CreatePluginFrames (data) --> members can be found at details/classes/classe_damage line 75 local avoidance = actorDamage.avoidance --> table with DODGE, PARRY, HITS members - local totalAvoid = avoidance.DODGE + avoidance.PARRY - local totalOver = totalAvoid + avoidance.HITS + local totalAvoid = avoidance.overall.DODGE + avoidance.overall.PARRY + local totalOver = totalAvoid + avoidance.overall.HITS if (totalOver > 0) then - hitsReceivedAmount.text = avoidance.HITS .. " (" .. _math_floor (avoidance.HITS / totalOver * 100) .. "%)" - dodgeAmount.text = avoidance.DODGE .. " (" .. _math_floor (avoidance.DODGE / totalOver * 100) .. "%)" - parryAmount.text = avoidance.PARRY .. " (" .. _math_floor (avoidance.PARRY / totalOver * 100) .. "%)" + hitsReceivedAmount.text = avoidance.overall.HITS .. " (" .. _math_floor (avoidance.overall.HITS / totalOver * 100) .. "%)" + dodgeAmount.text = avoidance.overall.DODGE .. " (" .. _math_floor (avoidance.overall.DODGE / totalOver * 100) .. "%)" + parryAmount.text = avoidance.overall.PARRY .. " (" .. _math_floor (avoidance.overall.PARRY / totalOver * 100) .. "%)" else hitsReceivedAmount.text = "0 (0%)" dodgeAmount.text = "0 (0%)" @@ -1003,21 +1003,21 @@ local function CreatePluginFrames (data) --> capture the amount of hits and avoids - _table_insert (hits_taken, 1, _track_player_object.avoidance.HITS - hits_last) - hits_now = hits_now + (_track_player_object.avoidance.HITS - hits_last) + _table_insert (hits_taken, 1, _track_player_object.avoidance.overall.HITS - hits_last) + hits_now = hits_now + (_track_player_object.avoidance.overall.HITS - hits_last) if (#hits_taken > 10) then hits_now = hits_now - hits_taken [11] _table_remove (hits_taken, 11) end - hits_last = _track_player_object.avoidance.HITS + hits_last = _track_player_object.avoidance.overall.HITS - _table_insert (avoid_taken, 1, _track_player_object.avoidance.DODGE + _track_player_object.avoidance.PARRY - avoid_last) - avoid_now = avoid_now + (_track_player_object.avoidance.DODGE + _track_player_object.avoidance.PARRY - avoid_last) + _table_insert (avoid_taken, 1, _track_player_object.avoidance.overall.DODGE + _track_player_object.avoidance.overall.PARRY - avoid_last) + avoid_now = avoid_now + (_track_player_object.avoidance.overall.DODGE + _track_player_object.avoidance.overall.PARRY - avoid_last) if (#avoid_taken > 10) then avoid_now = avoid_now - avoid_taken [11] _table_remove (avoid_taken, 11) end - avoid_last = _track_player_object.avoidance.DODGE + _track_player_object.avoidance.PARRY + avoid_last = _track_player_object.avoidance.overall.DODGE + _track_player_object.avoidance.overall.PARRY --> compute the hits vs avoid @@ -1155,6 +1155,12 @@ local function CreatePluginFrames (data) _track_player_name = MyTarget + local role = UnitGroupRolesAssigned (_track_player_name) + if (role ~= "TANK") then + _detalhes:ScheduleTimer ("VanguardWait", 1) + return + end + if (VanguardFrame.InfoShown) then Vanguard:VanguardRefreshInfoFrame() end @@ -1168,6 +1174,12 @@ local function CreatePluginFrames (data) _track_player_name = MyName + local role = UnitGroupRolesAssigned (_track_player_name) + if (role ~= "TANK") then + _detalhes:ScheduleTimer ("VanguardWait", 1) + return + end + if (VanguardFrame.InfoShown) then Vanguard:VanguardRefreshInfoFrame() end diff --git a/plugins/Details_YouAreNotPrepared/Details_YouAreNotPrepared.lua b/plugins/Details_YouAreNotPrepared/Details_YouAreNotPrepared.lua index c386424d..2e1e26d5 100644 --- a/plugins/Details_YouAreNotPrepared/Details_YouAreNotPrepared.lua +++ b/plugins/Details_YouAreNotPrepared/Details_YouAreNotPrepared.lua @@ -171,7 +171,7 @@ local function CreatePluginFrames() if (data[3] and type (data [1]) == "boolean") then --> is a real damage, not a battle ress and its not a last cooldown line bar.statusbar.textleft:SetText (string.format ("%.1f", data [4] - time_of_death) .. "s " .. spellname .. " (" .. data [6] .. ")") bar.statusbar.textright:SetText ("-" .. YouAreNotPrepared:ToK (data [3]) .. " (" .. hp .. "%)") - bar.statusbar.icon:SetTexture (icon) + bar.statusbar._icon:SetTexture (icon) bar.statusbar.color = "red" bar.statusbar.background:SetVertexColor (1, 0, 0, .2) bar.statusbar.textleft:SetWidth (250 - bar.statusbar.textright:GetStringWidth() - 20) @@ -181,7 +181,7 @@ local function CreatePluginFrames() else bar.statusbar.textleft:SetText (string.format ("%.1f", data [4] - time_of_death) .. "s " .. spellname .. " (" .. data [6] .. ")") bar.statusbar.textright:SetText ("+" .. YouAreNotPrepared:ToK (data [3]) .. " (" .. hp .. "%)") - bar.statusbar.icon:SetTexture (icon) + bar.statusbar._icon:SetTexture (icon) bar.statusbar.color = "green" bar.statusbar.background:SetVertexColor (0, 1, 0, .2) bar.statusbar.textleft:SetWidth (250 - bar.statusbar.textright:GetStringWidth() - 20) diff --git a/startup.lua b/startup.lua index 9f3471c7..ad5efaae 100644 --- a/startup.lua +++ b/startup.lua @@ -7,9 +7,10 @@ function _G._detalhes:Start() +-- slider de scale nas opções + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> details defaults - _detalhes.debug = false local _ --> who is @@ -177,7 +178,7 @@ function _G._detalhes:Start() 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 @@ -242,7 +243,7 @@ function _G._detalhes:Start() end end end - + if (self.tutorial.version_announce < 4) then self:ScheduleTimer ("AnnounceVersion", 20) self.tutorial.version_announce = self.tutorial.version_announce + 1 @@ -253,6 +254,10 @@ function _G._detalhes:Start() instancia._version:SetText ("Details! Alpha " .. _detalhes.userversion .. " (core: " .. self.realversion .. ")") instancia._version:SetPoint ("bottomleft", instancia.baseframe, "bottomleft", 0, 1) self.gump:Fade (instancia._version, "in", 10) + + if (instancia.auto_switch_to_old) then + instancia:SwitchBack() + end end end end @@ -288,10 +293,102 @@ function _G._detalhes:Start() --_detalhes:OpenWelcomeWindow() - if (self.tutorial.logons < 5) then + if (self.tutorial.logons < 2) then self:StartTutorial() end + --> feedback trhead + if (self.tutorial.logons > 100 and self.tutorial.logons < 104) then + + if (not self.tutorial.feedback_window1) then + self.tutorial.feedback_window1 = true + + local feedback_frame = CreateFrame ("FRAME", "DetailsFeedbackWindow", UIParent, "ButtonFrameTemplate") + tinsert (UISpecialFrames, "DetailsFeedbackWindow") + feedback_frame:SetPoint ("center", UIParent, "center") + feedback_frame:SetSize (512, 200) + feedback_frame.portrait:SetTexture ([[Interface\CHARACTERFRAME\TEMPORARYPORTRAIT-FEMALE-GNOME]]) + + feedback_frame.TitleText:SetText ("Details! Need Your Help!") + + feedback_frame.uppertext = feedback_frame:CreateFontString (nil, "artwork", "GameFontNormal") + feedback_frame.uppertext:SetText ("Tell us about your experience using Details!, what you liked most, where we could improve, what things you want to see in the future?") + feedback_frame.uppertext:SetPoint ("topleft", feedback_frame, "topleft", 60, -32) + local font, _, flags = feedback_frame.uppertext:GetFont() + feedback_frame.uppertext:SetFont (font, 10, flags) + feedback_frame.uppertext:SetTextColor (1, 1, 1, .8) + feedback_frame.uppertext:SetWidth (440) + + + local editbox = _detalhes.gump:NewTextEntry (feedback_frame, nil, "$parentTextEntry", "text", 387, 14) + editbox:SetPoint (20, -106) + editbox:SetAutoFocus (false) + editbox:SetHook ("OnEditFocusGained", function() + editbox.text = "http://www.mmo-champion.com/threads/1480721-New-damage-meter-%28Details!%29-need-help-with-tests-and-feedbacks" + editbox:HighlightText() + end) + editbox:SetHook ("OnEditFocusLost", function() + editbox.text = "http://www.mmo-champion.com/threads/1480721-New-damage-meter-%28Details!%29-need-help-with-tests-and-feedbacks" + editbox:HighlightText() + end) + editbox:SetHook ("OnChar", function() + editbox.text = "http://www.mmo-champion.com/threads/1480721-New-damage-meter-%28Details!%29-need-help-with-tests-and-feedbacks" + editbox:HighlightText() + end) + editbox.text = "http://www.mmo-champion.com/threads/1480721-New-damage-meter-%28Details!%29-need-help-with-tests-and-feedbacks" + + + feedback_frame.midtext = feedback_frame:CreateFontString (nil, "artwork", "GameFontNormal") + feedback_frame.midtext:SetText ("visit the link above and let's make Details! stronger!") + feedback_frame.midtext:SetPoint ("center", editbox.widget, "center") + feedback_frame.midtext:SetPoint ("top", editbox.widget, "bottom", 0, -2) + feedback_frame.midtext:SetJustifyH ("center") + local font, _, flags = feedback_frame.midtext:GetFont() + feedback_frame.midtext:SetFont (font, 10, flags) + --feedback_frame.midtext:SetTextColor (1, 1, 1, 1) + feedback_frame.midtext:SetWidth (440) + + + feedback_frame.gnoma = feedback_frame:CreateTexture (nil, "artwork") + feedback_frame.gnoma:SetPoint ("topright", feedback_frame, "topright", -1, -59) + feedback_frame.gnoma:SetTexture ("Interface\\AddOns\\Details\\images\\icons2") + feedback_frame.gnoma:SetSize (105*1.05, 107*1.05) + feedback_frame.gnoma:SetTexCoord (0.2021484375, 0, 0.7919921875, 1) + + feedback_frame.close = CreateFrame ("Button", "DetailsFeedbackWindowCloseButton", feedback_frame, "OptionsButtonTemplate") + feedback_frame.close:SetPoint ("bottomleft", feedback_frame, "bottomleft", 8, 4) + feedback_frame.close:SetText ("Close") + feedback_frame.close:SetScript ("OnClick", function (self) + editbox:ClearFocus() + feedback_frame:Hide() + end) + + feedback_frame.postpone = CreateFrame ("Button", "DetailsFeedbackWindowPostPoneButton", feedback_frame, "OptionsButtonTemplate") + feedback_frame.postpone:SetPoint ("bottomright", feedback_frame, "bottomright", -10, 4) + feedback_frame.postpone:SetText ("Remind-me Later") + feedback_frame.postpone:SetScript ("OnClick", function (self) + editbox:ClearFocus() + feedback_frame:Hide() + _detalhes.tutorial.feedback_window1 = false + end) + feedback_frame.postpone:SetWidth (130) + + feedback_frame:SetScript ("OnHide", function() + editbox:ClearFocus() + end) + + --0.0009765625 512 + function _detalhes:FeedbackSetFocus() + DetailsFeedbackWindow:Show() + DetailsFeedbackWindowTextEntry.MyObject:SetFocus() + DetailsFeedbackWindowTextEntry.MyObject:HighlightText() + end + _detalhes:ScheduleTimer ("FeedbackSetFocus", 5) + + end + + end + if (self.is_version_first_run) then local lower_instance = _detalhes:GetLowerInstanceNumber() if (lower_instance) then @@ -569,5 +666,7 @@ function _G._detalhes:Start() f:Hide() + + end