c30e2312b7
Fixed some annoyances with auto current feature where it was changing the segments even when the user were using the window.
3284 lines
101 KiB
Lua
3284 lines
101 KiB
Lua
local AceLocale = LibStub ("AceLocale-3.0")
|
|
local Loc = AceLocale:GetLocale ( "Details" )
|
|
local SharedMedia = LibStub:GetLibrary("LibSharedMedia-3.0")
|
|
|
|
local _type= type --> lua local
|
|
local _ipairs = ipairs --> lua local
|
|
local _pairs = pairs --> lua local
|
|
local _math_floor = math.floor --> lua local
|
|
local _math_abs = math.abs --> lua local
|
|
local _table_remove = table.remove --> lua local
|
|
local _getmetatable = getmetatable --> lua local
|
|
local _setmetatable = setmetatable --> lua local
|
|
local _string_len = string.len --> lua local
|
|
local _unpack = unpack --> lua local
|
|
local _cstr = string.format --> lua local
|
|
local _SendChatMessage = SendChatMessage --> wow api locals
|
|
local _GetChannelName = GetChannelName --> wow api locals
|
|
local _UnitExists = UnitExists --> wow api locals
|
|
local _UnitName = UnitName --> wow api locals
|
|
local _UnitIsPlayer = UnitIsPlayer --> wow api locals
|
|
local _UnitGroupRolesAssigned = UnitGroupRolesAssigned --> wow api locals
|
|
|
|
local _detalhes = _G._detalhes
|
|
local gump = _detalhes.gump
|
|
|
|
local historico = _detalhes.historico
|
|
|
|
local modo_raid = _detalhes._detalhes_props["MODO_RAID"]
|
|
local modo_alone = _detalhes._detalhes_props["MODO_ALONE"]
|
|
local modo_grupo = _detalhes._detalhes_props["MODO_GROUP"]
|
|
local modo_all = _detalhes._detalhes_props["MODO_ALL"]
|
|
|
|
local _
|
|
|
|
local atributos = _detalhes.atributos
|
|
local sub_atributos = _detalhes.sub_atributos
|
|
local segmentos = _detalhes.segmentos
|
|
|
|
--> STARTUP reativa as instancias e regenera as tabelas das mesmas
|
|
function _detalhes:RestartInstances()
|
|
return _detalhes:ReativarInstancias()
|
|
end
|
|
|
|
function _detalhes:ReativarInstancias()
|
|
|
|
_detalhes.opened_windows = 0
|
|
|
|
--> set metatables
|
|
for index = 1, #_detalhes.tabela_instancias do
|
|
local instancia = _detalhes.tabela_instancias [index]
|
|
if (not _getmetatable (instancia)) then
|
|
_setmetatable (_detalhes.tabela_instancias[index], _detalhes)
|
|
end
|
|
end
|
|
|
|
--> create frames
|
|
for index = 1, #_detalhes.tabela_instancias do
|
|
local instancia = _detalhes.tabela_instancias [index]
|
|
if (instancia:IsEnabled()) then
|
|
_detalhes.opened_windows = _detalhes.opened_windows + 1
|
|
instancia:RestauraJanela (index, nil, true)
|
|
else
|
|
instancia.iniciada = false
|
|
end
|
|
end
|
|
|
|
--> load
|
|
for index = 1, #_detalhes.tabela_instancias do
|
|
local instancia = _detalhes.tabela_instancias [index]
|
|
if (instancia:IsEnabled()) then
|
|
instancia.iniciada = true
|
|
instancia:AtivarInstancia()
|
|
instancia:ChangeSkin()
|
|
end
|
|
end
|
|
|
|
--> send open event
|
|
for index = 1, #_detalhes.tabela_instancias do
|
|
local instancia = _detalhes.tabela_instancias [index]
|
|
if (instancia:IsEnabled()) then
|
|
if (not _detalhes.initializing) then
|
|
_detalhes:SendEvent ("DETAILS_INSTANCE_OPEN", nil, instancia)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
|
|
--> API: call a function to all enabled instances
|
|
function _detalhes:InstanceCall (funcao, ...)
|
|
if (type (funcao) == "string") then
|
|
funcao = _detalhes [funcao]
|
|
end
|
|
for index, instance in _ipairs (_detalhes.tabela_instancias) do
|
|
if (instance:IsAtiva()) then --> only enabled
|
|
funcao (instance, ...)
|
|
end
|
|
end
|
|
end
|
|
|
|
--> chama a função para ser executada em todas as instâncias (internal)
|
|
function _detalhes:InstanciaCallFunction (funcao, ...)
|
|
for index, instancia in _ipairs (_detalhes.tabela_instancias) do
|
|
if (instancia:IsAtiva()) then --> só reabre se ela estiver ativa
|
|
funcao (_, instancia, ...)
|
|
end
|
|
end
|
|
end
|
|
|
|
--> chama a função para ser executada em todas as instâncias (internal)
|
|
function _detalhes:InstanciaCallFunctionOffline (funcao, ...)
|
|
for index, instancia in _ipairs (_detalhes.tabela_instancias) do
|
|
funcao (_, instancia, ...)
|
|
end
|
|
end
|
|
|
|
function _detalhes:GetLowerInstanceNumber()
|
|
local lower = 999
|
|
for index, instancia in _ipairs (_detalhes.tabela_instancias) do
|
|
if (instancia.ativa and instancia.baseframe) then
|
|
if (instancia.meu_id < lower) then
|
|
lower = instancia.meu_id
|
|
end
|
|
end
|
|
end
|
|
if (lower == 999) then
|
|
_detalhes.lower_instance = 0
|
|
return nil
|
|
else
|
|
_detalhes.lower_instance = lower
|
|
return lower
|
|
end
|
|
end
|
|
|
|
function _detalhes:IsLowerInstance()
|
|
local lower = _detalhes:GetLowerInstanceNumber()
|
|
if (lower) then
|
|
return lower == self.meu_id
|
|
end
|
|
return false
|
|
end
|
|
|
|
function _detalhes:IsInteracting()
|
|
return self.is_interacting
|
|
end
|
|
|
|
function _detalhes:GetMode()
|
|
return self.modo
|
|
end
|
|
|
|
function _detalhes:GetInstance (id)
|
|
return _detalhes.tabela_instancias [id]
|
|
end
|
|
|
|
function _detalhes:GetId()
|
|
return self.meu_id
|
|
end
|
|
function _detalhes:GetInstanceId()
|
|
return self.meu_id
|
|
end
|
|
|
|
function _detalhes:GetSegment()
|
|
return self.segmento
|
|
end
|
|
|
|
function _detalhes:GetSoloMode()
|
|
return _detalhes.tabela_instancias [_detalhes.solo]
|
|
end
|
|
function _detalhes:GetRaidMode()
|
|
return _detalhes.tabela_instancias [_detalhes.raid]
|
|
end
|
|
|
|
function _detalhes:IsSoloMode (offline)
|
|
if (offline) then
|
|
return self.modo == 1
|
|
end
|
|
if (not _detalhes.solo) then
|
|
return false
|
|
else
|
|
return _detalhes.solo == self:GetInstanceId()
|
|
end
|
|
end
|
|
|
|
function _detalhes:IsRaidMode()
|
|
return self.modo == _detalhes._detalhes_props["MODO_RAID"]
|
|
end
|
|
|
|
function _detalhes:IsGroupMode()
|
|
return self.modo == _detalhes._detalhes_props["MODO_GROUP"]
|
|
end
|
|
|
|
function _detalhes:IsNormalMode()
|
|
if (self:GetInstanceId() == 2 or self:GetInstanceId() == 3) then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
function _detalhes:GetShowingCombat()
|
|
return self.showing
|
|
end
|
|
|
|
function _detalhes:GetCustomObject()
|
|
return _detalhes.custom [self.sub_atributo]
|
|
end
|
|
|
|
function _detalhes:ResetAttribute()
|
|
if (self.iniciada) then
|
|
self:TrocaTabela (nil, 1, 1, true)
|
|
else
|
|
self.atributo = 1
|
|
self.sub_atributo = 1
|
|
end
|
|
end
|
|
|
|
function _detalhes:ListInstances()
|
|
return _ipairs (_detalhes.tabela_instancias)
|
|
end
|
|
|
|
function _detalhes:GetPosition()
|
|
return self.posicao
|
|
end
|
|
|
|
function _detalhes:GetDisplay()
|
|
return self.atributo, self.sub_atributo
|
|
end
|
|
|
|
function _detalhes:GetMaxInstancesAmount()
|
|
return _detalhes.instances_amount
|
|
end
|
|
|
|
function _detalhes:SetMaxInstancesAmount (amount)
|
|
if (_type (amount) == "number") then
|
|
_detalhes.instances_amount = amount
|
|
end
|
|
end
|
|
|
|
function _detalhes:GetFreeInstancesAmount()
|
|
return _detalhes.instances_amount - #_detalhes.tabela_instancias
|
|
end
|
|
|
|
function _detalhes:GetOpenedWindowsAmount()
|
|
local amount = 0
|
|
for _, instance in _detalhes:ListInstances() do
|
|
if (instance:IsEnabled()) then
|
|
amount = amount + 1
|
|
end
|
|
end
|
|
return amount
|
|
end
|
|
|
|
function _detalhes:GetNumRows()
|
|
return self.rows_fit_in_window
|
|
end
|
|
|
|
function _detalhes:GetRow (index)
|
|
return self.barras [index]
|
|
end
|
|
|
|
function _detalhes:GetSkin()
|
|
return _detalhes.skins [self.skin]
|
|
end
|
|
|
|
function _detalhes:GetSkinTexture()
|
|
return _detalhes.skins [self.skin] and _detalhes.skins [self.skin].file
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
|
|
--> retorna se a instância esta ou não ativa
|
|
function _detalhes:IsAtiva()
|
|
return self.ativa
|
|
end
|
|
--> english alias
|
|
function _detalhes:IsEnabled()
|
|
return self.ativa
|
|
end
|
|
|
|
function _detalhes:IsStarted()
|
|
return self.iniciada
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
|
|
function _detalhes:LoadLocalInstanceConfig()
|
|
local config = _detalhes.local_instances_config [self.meu_id]
|
|
if (config) then
|
|
|
|
if (not _detalhes.profile_save_pos) then
|
|
self.posicao = table_deepcopy (config.pos)
|
|
end
|
|
|
|
if (_type (config.attribute) ~= "number") then
|
|
config.attribute = 1
|
|
end
|
|
if (_type (config.sub_attribute) ~= "number") then
|
|
config.sub_attribute = 1
|
|
end
|
|
if (_type (config.segment) ~= "number") then
|
|
config.segment = 1
|
|
end
|
|
|
|
self.ativa = config.is_open
|
|
self.atributo = config.attribute
|
|
self.sub_atributo = config.sub_attribute
|
|
self.modo = config.mode
|
|
self.segmento = config.segment
|
|
self.snap = config.snap and table_deepcopy (config.snap) or {}
|
|
self.horizontalSnap = config.horizontalSnap
|
|
self.verticalSnap = config.verticalSnap
|
|
self.sub_atributo_last = table_deepcopy (config.sub_atributo_last)
|
|
self.isLocked = config.isLocked
|
|
self.last_raid_plugin = config.last_raid_plugin
|
|
|
|
end
|
|
end
|
|
|
|
function _detalhes:ShutDownAllInstances()
|
|
for index, instance in _ipairs (_detalhes.tabela_instancias) do
|
|
if (instance:IsEnabled() and instance.baseframe and not instance.ignore_mass_showhide) then
|
|
instance:ShutDown()
|
|
end
|
|
end
|
|
end
|
|
|
|
function _detalhes:ShutDown()
|
|
return self:DesativarInstancia()
|
|
end
|
|
|
|
function _detalhes:GetNumWindows()
|
|
|
|
end
|
|
|
|
--> desativando a instância ela fica em stand by e apenas hida a janela ~shutdown ~close ~fechar
|
|
function _detalhes:DesativarInstancia()
|
|
|
|
local lower = _detalhes:GetLowerInstanceNumber()
|
|
|
|
self.ativa = false
|
|
_detalhes:GetLowerInstanceNumber()
|
|
|
|
if (lower == self.meu_id) then
|
|
--> os icones dos plugins estao hostiados nessa instancia.
|
|
_detalhes.ToolBar:ReorganizeIcons (true) --não precisa recarregar toda a skin
|
|
end
|
|
|
|
if (_detalhes.switch.current_instancia and _detalhes.switch.current_instancia == self) then
|
|
_detalhes.switch:CloseMe()
|
|
end
|
|
|
|
_detalhes.opened_windows = _detalhes.opened_windows-1
|
|
self:ResetaGump()
|
|
|
|
--gump:Fade (self.baseframe.cabecalho.atributo_icon, _unpack (_detalhes.windows_fade_in))
|
|
--gump:Fade (self.baseframe.cabecalho.ball, _unpack (_detalhes.windows_fade_in))
|
|
--gump:Fade (self.baseframe, _unpack (_detalhes.windows_fade_in))
|
|
--gump:Fade (self.rowframe, _unpack (_detalhes.windows_fade_in))
|
|
|
|
gump:Fade (self.baseframe.cabecalho.ball, 1)
|
|
gump:Fade (self.baseframe, 1)
|
|
gump:Fade (self.rowframe, 1)
|
|
|
|
self:Desagrupar (-1)
|
|
|
|
if (self.modo == modo_raid) then
|
|
_detalhes.RaidTables:DisableRaidMode (self)
|
|
|
|
elseif (self.modo == modo_alone) then
|
|
_detalhes.SoloTables:switch()
|
|
self.atualizando = false
|
|
_detalhes.solo = nil
|
|
end
|
|
|
|
--print ("Abertas: " .. _detalhes.opened_windows)
|
|
if (not _detalhes.initializing) then
|
|
_detalhes:SendEvent ("DETAILS_INSTANCE_CLOSE", nil, self)
|
|
end
|
|
|
|
end
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
|
|
function _detalhes:InstanciaFadeBarras (instancia, segmento)
|
|
local _fadeType, _fadeSpeed = _unpack (_detalhes.row_fade_in)
|
|
if (segmento) then
|
|
if (instancia.segmento == segmento) then
|
|
return gump:Fade (instancia, _fadeType, _fadeSpeed, "barras")
|
|
end
|
|
else
|
|
return gump:Fade (instancia, _fadeType, _fadeSpeed, "barras")
|
|
end
|
|
end
|
|
|
|
function _detalhes:ToggleWindow (index)
|
|
local window = _detalhes:GetInstance (index)
|
|
|
|
if (window and _getmetatable (window)) then
|
|
if (window:IsEnabled()) then
|
|
window:ShutDown()
|
|
else
|
|
window:EnableInstance()
|
|
|
|
if (window.meu_id == 1) then
|
|
local instance2 = _detalhes:GetInstance(2)
|
|
if (instance2 and instance2:IsEnabled()) then
|
|
_detalhes.move_janela_func (instance2.baseframe, true, instance2, true)
|
|
_detalhes.move_janela_func (instance2.baseframe, false, instance2, true)
|
|
end
|
|
|
|
elseif (window.meu_id == 2) then
|
|
_detalhes.move_janela_func (window.baseframe, true, window, true)
|
|
_detalhes.move_janela_func (window.baseframe, false, window, true)
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
|
|
function _detalhes:CheckCoupleWindows (instance1, instance2)
|
|
instance1 = instance1 or _detalhes:GetInstance (1)
|
|
instance2 = instance2 or _detalhes:GetInstance (2)
|
|
|
|
if (instance1 and instance2 and not instance1.ignore_mass_showhide and not instance1.ignore_mass_showhide) then
|
|
|
|
instance1.baseframe:ClearAllPoints()
|
|
instance2.baseframe:ClearAllPoints()
|
|
|
|
instance1:RestoreMainWindowPosition()
|
|
instance2:RestoreMainWindowPosition()
|
|
|
|
instance1:AtualizaPontos()
|
|
instance2:AtualizaPontos()
|
|
|
|
local _R, _T, _L, _B = _detalhes.VPL (instance2, instance1), _detalhes.VPB (instance2, instance1), _detalhes.VPR (instance2, instance1), _detalhes.VPT (instance2, instance1)
|
|
|
|
if (_R) then
|
|
--print ("R")
|
|
instance2:MakeInstanceGroup ({false, false, 1, false})
|
|
elseif (_T) then
|
|
--print ("T")
|
|
instance2:MakeInstanceGroup ({false, false, false, 1})
|
|
elseif (_L) then
|
|
--print ("L")
|
|
instance2:MakeInstanceGroup ({1, false, false, false})
|
|
elseif (_B) then
|
|
--print ("B")
|
|
instance2:MakeInstanceGroup ({false, 1, false, false})
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
function _detalhes:ToggleWindows()
|
|
|
|
local instance
|
|
|
|
for i = 1, #_detalhes.tabela_instancias do
|
|
local this_instance = _detalhes:GetInstance (i)
|
|
if (this_instance and not this_instance.ignore_mass_showhide) then
|
|
instance = this_instance
|
|
break
|
|
end
|
|
end
|
|
|
|
if (instance) then
|
|
if (instance:IsEnabled()) then
|
|
_detalhes:ShutDownAllInstances()
|
|
else
|
|
_detalhes:ReabrirTodasInstancias()
|
|
|
|
local instance1 = _detalhes:GetInstance (1)
|
|
local instance2 = _detalhes:GetInstance (2)
|
|
|
|
_detalhes:CheckCoupleWindows (instance1, instance2)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- reabre todas as instancias
|
|
function _detalhes:ReabrirTodasInstancias (temp)
|
|
for index = math.min (#_detalhes.tabela_instancias, _detalhes.instances_amount), 1, -1 do
|
|
local instancia = _detalhes:GetInstance (index)
|
|
if (instancia and not instancia.ignore_mass_showhide) then
|
|
instancia:AtivarInstancia (temp)
|
|
end
|
|
end
|
|
end
|
|
|
|
function _detalhes:LockInstance (flag)
|
|
|
|
if (type (flag) == "boolean") then
|
|
self.isLocked = not flag
|
|
end
|
|
|
|
if (self.isLocked) then
|
|
self.isLocked = false
|
|
if (self.baseframe) then
|
|
self.baseframe.isLocked = false
|
|
self.baseframe.lock_button.label:SetText (Loc ["STRING_LOCK_WINDOW"])
|
|
self.baseframe.lock_button:SetWidth (self.baseframe.lock_button.label:GetStringWidth()+2)
|
|
self.baseframe.resize_direita:SetAlpha (0)
|
|
self.baseframe.resize_esquerda:SetAlpha (0)
|
|
self.baseframe.lock_button:ClearAllPoints()
|
|
self.baseframe.lock_button:SetPoint ("right", self.baseframe.resize_direita, "left", -1, 1.5)
|
|
end
|
|
else
|
|
self.isLocked = true
|
|
if (self.baseframe) then
|
|
self.baseframe.isLocked = true
|
|
self.baseframe.lock_button.label:SetText (Loc ["STRING_UNLOCK_WINDOW"])
|
|
self.baseframe.lock_button:SetWidth (self.baseframe.lock_button.label:GetStringWidth()+2)
|
|
self.baseframe.lock_button:ClearAllPoints()
|
|
self.baseframe.lock_button:SetPoint ("bottomright", self.baseframe, "bottomright", -3, 0)
|
|
self.baseframe.resize_direita:SetAlpha (0)
|
|
self.baseframe.resize_esquerda:SetAlpha (0)
|
|
end
|
|
end
|
|
end
|
|
|
|
function _detalhes:TravasInstancias()
|
|
for index, instancia in ipairs (_detalhes.tabela_instancias) do
|
|
instancia:LockInstance (true)
|
|
end
|
|
end
|
|
|
|
function _detalhes:DestravarInstancias()
|
|
for index, instancia in ipairs (_detalhes.tabela_instancias) do
|
|
instancia:LockInstance (false)
|
|
end
|
|
end
|
|
|
|
--> alias
|
|
function _detalhes:EnableInstance (temp)
|
|
return self:AtivarInstancia (temp)
|
|
end
|
|
|
|
function _detalhes:AtivarInstancia (temp)
|
|
|
|
self.ativa = true
|
|
local lower = _detalhes:GetLowerInstanceNumber()
|
|
|
|
if (lower == self.meu_id) then
|
|
--> os icones dos plugins precisam ser hostiados nessa instancia.
|
|
_detalhes.ToolBar:ReorganizeIcons (true) --> não precisa recarregar toda a skin
|
|
end
|
|
|
|
if (not self.iniciada) then
|
|
self:RestauraJanela (self.meu_id)
|
|
else
|
|
_detalhes.opened_windows = _detalhes.opened_windows+1
|
|
end
|
|
|
|
_detalhes:TrocaTabela (self, nil, nil, nil, true)
|
|
|
|
if (self.hide_icon) then
|
|
gump:Fade (self.baseframe.cabecalho.atributo_icon, 1)
|
|
else
|
|
gump:Fade (self.baseframe.cabecalho.atributo_icon, 0)
|
|
end
|
|
|
|
gump:Fade (self.baseframe.cabecalho.ball, 0)
|
|
gump:Fade (self.baseframe, 0)
|
|
gump:Fade (self.rowframe, 0)
|
|
|
|
self:SetMenuAlpha()
|
|
|
|
self.baseframe.cabecalho.fechar:Enable()
|
|
|
|
self:ChangeIcon()
|
|
|
|
if (not temp) then
|
|
if (self.modo == modo_raid) then
|
|
_detalhes.RaidTables:EnableRaidMode (self)
|
|
|
|
elseif (self.modo == modo_alone) then
|
|
self:SoloMode (true)
|
|
end
|
|
end
|
|
|
|
self:SetCombatAlpha (nil, nil, true)
|
|
self:DesaturateMenu()
|
|
|
|
if (not temp and not _detalhes.initializing) then
|
|
_detalhes:SendEvent ("DETAILS_INSTANCE_OPEN", nil, self)
|
|
end
|
|
|
|
end
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
|
|
--> apaga de vez um instância
|
|
function _detalhes:ApagarInstancia (ID)
|
|
return _table_remove (_detalhes.tabela_instancias, ID)
|
|
end
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
|
|
--> retorna quantas instância há no momento
|
|
function _detalhes:GetNumInstancesAmount()
|
|
return #_detalhes.tabela_instancias
|
|
end
|
|
function _detalhes:QuantasInstancias()
|
|
return #_detalhes.tabela_instancias
|
|
end
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
|
|
function _detalhes:DeleteInstance (id)
|
|
|
|
local instance = _detalhes:GetInstance (id)
|
|
|
|
if (not instance) then
|
|
return false
|
|
end
|
|
|
|
--> break snaps of previous and next window
|
|
local left_instance = _detalhes:GetInstance (id-1)
|
|
if (left_instance) then
|
|
for snap_side, instance_id in _pairs (left_instance.snap) do
|
|
if (instance_id == id) then --snap na proxima instancia
|
|
left_instance.snap [snap_side] = nil
|
|
end
|
|
end
|
|
end
|
|
local right_instance = _detalhes:GetInstance (id+1)
|
|
if (right_instance) then
|
|
for snap_side, instance_id in _pairs (right_instance.snap) do
|
|
if (instance_id == id) then --snap na proxima instancia
|
|
right_instance.snap [snap_side] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
--> re align snaps for higher instances
|
|
for i = id+1, #_detalhes.tabela_instancias do
|
|
local this_instance = _detalhes:GetInstance (i)
|
|
--fix the snaps
|
|
for snap_side, instance_id in _pairs (this_instance.snap) do
|
|
if (instance_id == i+1) then --snap na proxima instancia
|
|
this_instance.snap [snap_side] = i
|
|
elseif (instance_id == i-1 and i-2 > 0) then --snap na instancia anterior
|
|
this_instance.snap [snap_side] = i-2
|
|
else
|
|
this_instance.snap [snap_side] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
table.remove (_detalhes.tabela_instancias, id)
|
|
|
|
end
|
|
|
|
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
--> cria uma nova instância e a joga para o container de instâncias
|
|
|
|
function _detalhes:CreateInstance (id)
|
|
return _detalhes:CriarInstancia (_, id)
|
|
end
|
|
|
|
function _detalhes:CriarInstancia (_, id)
|
|
|
|
if (id and _type (id) == "boolean") then
|
|
|
|
if (#_detalhes.tabela_instancias >= _detalhes.instances_amount) then
|
|
_detalhes:Msg (Loc ["STRING_INSTANCE_LIMIT"])
|
|
return false
|
|
end
|
|
|
|
local next_id = #_detalhes.tabela_instancias+1
|
|
|
|
if (_detalhes.unused_instances [next_id]) then
|
|
local new_instance = _detalhes.unused_instances [next_id]
|
|
_detalhes.tabela_instancias [next_id] = new_instance
|
|
_detalhes.unused_instances [next_id] = nil
|
|
new_instance:AtivarInstancia()
|
|
return new_instance
|
|
end
|
|
|
|
local new_instance = _detalhes:NovaInstancia (next_id)
|
|
|
|
if (_detalhes.standard_skin) then
|
|
for key, value in pairs (_detalhes.standard_skin) do
|
|
if (type (value) == "table") then
|
|
new_instance [key] = table_deepcopy (value)
|
|
else
|
|
new_instance [key] = value
|
|
end
|
|
end
|
|
new_instance:ChangeSkin()
|
|
|
|
else
|
|
--> se não tiver um padrão, criar de outra instância já aberta.
|
|
local copy_from
|
|
for i = 1, next_id-1 do
|
|
local opened_instance = _detalhes:GetInstance (i)
|
|
if (opened_instance and opened_instance:IsEnabled() and opened_instance.baseframe) then
|
|
copy_from = opened_instance
|
|
break
|
|
end
|
|
end
|
|
|
|
if (copy_from) then
|
|
for key, value in pairs (copy_from) do
|
|
if (_detalhes.instance_defaults [key] ~= nil) then
|
|
if (type (value) == "table") then
|
|
new_instance [key] = table_deepcopy (value)
|
|
else
|
|
new_instance [key] = value
|
|
end
|
|
end
|
|
end
|
|
new_instance:ChangeSkin()
|
|
end
|
|
end
|
|
|
|
return new_instance
|
|
|
|
elseif (id) then
|
|
local instancia = _detalhes.tabela_instancias [id]
|
|
if (instancia and not instancia:IsAtiva()) then
|
|
instancia:AtivarInstancia()
|
|
_detalhes:DelayOptionsRefresh (instancia)
|
|
return instancia
|
|
end
|
|
end
|
|
|
|
--> antes de criar uma nova, ver se não há alguma para reativar
|
|
for index, instancia in _ipairs (_detalhes.tabela_instancias) do
|
|
if (not instancia:IsAtiva()) then
|
|
instancia:AtivarInstancia()
|
|
return instancia
|
|
end
|
|
end
|
|
|
|
if (#_detalhes.tabela_instancias >= _detalhes.instances_amount) then
|
|
return _detalhes:Msg (Loc ["STRING_INSTANCE_LIMIT"])
|
|
end
|
|
|
|
--> verifica se não tem uma janela na pool de janelas fechadas
|
|
local next_id = #_detalhes.tabela_instancias+1
|
|
|
|
if (_detalhes.unused_instances [next_id]) then
|
|
local new_instance = _detalhes.unused_instances [next_id]
|
|
_detalhes.tabela_instancias [next_id] = new_instance
|
|
_detalhes.unused_instances [next_id] = nil
|
|
new_instance:AtivarInstancia()
|
|
|
|
_detalhes:GetLowerInstanceNumber()
|
|
|
|
return new_instance
|
|
end
|
|
|
|
--> cria uma nova janela
|
|
local new_instance = _detalhes:NovaInstancia (#_detalhes.tabela_instancias+1)
|
|
|
|
if (not _detalhes.initializing) then
|
|
_detalhes:SendEvent ("DETAILS_INSTANCE_OPEN", nil, new_instance)
|
|
end
|
|
|
|
_detalhes:GetLowerInstanceNumber()
|
|
|
|
return new_instance
|
|
end
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
|
|
--> self é a instância que esta sendo movida.. instancia é a que esta parada
|
|
function _detalhes:EstaAgrupada (esta_instancia, lado) --> lado //// 1 = encostou na esquerda // 2 = escostou emaixo // 3 = encostou na direita // 4 = encostou em cima
|
|
--local meu_snap = self.snap --> pegou a tabela com {side, side, side, side}
|
|
|
|
if (esta_instancia.snap [lado]) then
|
|
return true --> ha possui uma janela grudapa neste lado
|
|
elseif (lado == 1) then
|
|
if (self.snap [3]) then
|
|
return true
|
|
end
|
|
elseif (lado == 2) then
|
|
if (self.snap [4]) then
|
|
return true
|
|
end
|
|
elseif (lado == 3) then
|
|
if (self.snap [1]) then
|
|
return true
|
|
end
|
|
elseif (lado == 4) then
|
|
if (self.snap [2]) then
|
|
return true
|
|
end
|
|
end
|
|
|
|
return false --> do contrário retorna false
|
|
end
|
|
|
|
function _detalhes:BaseFrameSnap()
|
|
|
|
local group = self:GetInstanceGroup()
|
|
|
|
for meu_id, instancia in _ipairs (group) do
|
|
if (instancia:IsAtiva()) then
|
|
instancia.baseframe:ClearAllPoints()
|
|
end
|
|
end
|
|
|
|
local scale = self.window_scale
|
|
for _, instance in _ipairs (group) do
|
|
instance:SetWindowScale (scale)
|
|
end
|
|
|
|
local my_baseframe = self.baseframe
|
|
for lado, snap_to in _pairs (self.snap) do
|
|
--print ("DEBUG instancia " .. snap_to .. " lado "..lado)
|
|
local instancia_alvo = _detalhes.tabela_instancias [snap_to]
|
|
|
|
if (instancia_alvo.ativa and instancia_alvo.baseframe) then
|
|
if (lado == 1) then --> a esquerda
|
|
instancia_alvo.baseframe:SetPoint ("TOPRIGHT", my_baseframe, "TOPLEFT")
|
|
|
|
elseif (lado == 2) then --> em baixo
|
|
local statusbar_y_mod = 0
|
|
if (not self.show_statusbar) then
|
|
statusbar_y_mod = 14
|
|
end
|
|
instancia_alvo.baseframe:SetPoint ("TOPLEFT", my_baseframe, "BOTTOMLEFT", 0, -34 + statusbar_y_mod)
|
|
|
|
elseif (lado == 3) then --> a direita
|
|
instancia_alvo.baseframe:SetPoint ("BOTTOMLEFT", my_baseframe, "BOTTOMRIGHT")
|
|
|
|
elseif (lado == 4) then --> em cima
|
|
local statusbar_y_mod = 0
|
|
if (not instancia_alvo.show_statusbar) then
|
|
statusbar_y_mod = -14
|
|
end
|
|
instancia_alvo.baseframe:SetPoint ("BOTTOMLEFT", my_baseframe, "TOPLEFT", 0, 34 + statusbar_y_mod)
|
|
|
|
end
|
|
end
|
|
end
|
|
|
|
--[
|
|
--> aqui precisa de um efeito reverso
|
|
local reverso = self.meu_id - 2 --> se existir
|
|
if (reverso > 0) then --> se tiver uma instância lá trás
|
|
--> aqui faz o efeito reverso:
|
|
local inicio_retro = self.meu_id - 1
|
|
for meu_id = inicio_retro, 1, -1 do
|
|
local instancia = _detalhes.tabela_instancias [meu_id]
|
|
for lado, snap_to in _pairs (instancia.snap) do
|
|
if (snap_to < instancia.meu_id and snap_to ~= self.meu_id) then --> se o lado que esta grudado for menor que o meu id... EX instnacia #2 grudada na #1
|
|
|
|
--> então tenho que pegar a instância do snap
|
|
|
|
local instancia_alvo = _detalhes.tabela_instancias [snap_to]
|
|
local lado_reverso
|
|
if (lado == 1) then
|
|
lado_reverso = 3
|
|
elseif (lado == 2) then
|
|
lado_reverso = 4
|
|
elseif (lado == 3) then
|
|
lado_reverso = 1
|
|
elseif (lado == 4) then
|
|
lado_reverso = 2
|
|
end
|
|
|
|
--> fazer os setpoints
|
|
if (instancia_alvo.ativa and instancia_alvo.baseframe) then
|
|
|
|
if (lado_reverso == 1) then --> a esquerda
|
|
instancia_alvo.baseframe:SetPoint ("BOTTOMLEFT", instancia.baseframe, "BOTTOMRIGHT")
|
|
|
|
elseif (lado_reverso == 2) then --> em baixo
|
|
|
|
local statusbar_y_mod = 0
|
|
if (not instancia_alvo.show_statusbar) then
|
|
statusbar_y_mod = -14
|
|
end
|
|
|
|
instancia_alvo.baseframe:SetPoint ("BOTTOMLEFT", instancia.baseframe, "TOPLEFT", 0, 34 + statusbar_y_mod) -- + (statusbar_y_mod*-1)
|
|
|
|
elseif (lado_reverso == 3) then --> a direita
|
|
instancia_alvo.baseframe:SetPoint ("TOPRIGHT", instancia.baseframe, "TOPLEFT")
|
|
|
|
elseif (lado_reverso == 4) then --> em cima
|
|
|
|
local statusbar_y_mod = 0
|
|
if (not instancia.show_statusbar) then
|
|
statusbar_y_mod = 14
|
|
end
|
|
|
|
instancia_alvo.baseframe:SetPoint ("TOPLEFT", instancia.baseframe, "BOTTOMLEFT", 0, -34 + statusbar_y_mod)
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
--]]
|
|
|
|
for meu_id, instancia in _ipairs (_detalhes.tabela_instancias) do
|
|
if (meu_id > self.meu_id) then
|
|
for lado, snap_to in _pairs (instancia.snap) do
|
|
if (snap_to > instancia.meu_id and snap_to ~= self.meu_id) then
|
|
local instancia_alvo = _detalhes.tabela_instancias [snap_to]
|
|
|
|
if (instancia_alvo.ativa and instancia_alvo.baseframe) then
|
|
if (lado == 1) then --> a esquerda
|
|
instancia_alvo.baseframe:SetPoint ("TOPRIGHT", instancia.baseframe, "TOPLEFT")
|
|
|
|
elseif (lado == 2) then --> em baixo
|
|
local statusbar_y_mod = 0
|
|
if (not instancia.show_statusbar) then
|
|
statusbar_y_mod = 14
|
|
end
|
|
instancia_alvo.baseframe:SetPoint ("TOPLEFT", instancia.baseframe, "BOTTOMLEFT", 0, -34 + statusbar_y_mod)
|
|
|
|
elseif (lado == 3) then --> a direita
|
|
instancia_alvo.baseframe:SetPoint ("BOTTOMLEFT", instancia.baseframe, "BOTTOMRIGHT")
|
|
|
|
elseif (lado == 4) then --> em cima
|
|
|
|
local statusbar_y_mod = 0
|
|
if (not instancia_alvo.show_statusbar) then
|
|
statusbar_y_mod = -14
|
|
end
|
|
|
|
instancia_alvo.baseframe:SetPoint ("BOTTOMLEFT", instancia.baseframe, "TOPLEFT", 0, 34 + statusbar_y_mod)
|
|
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function _detalhes:agrupar_janelas (lados)
|
|
|
|
local instancia = self
|
|
|
|
for lado, esta_instancia in _pairs (lados) do
|
|
if (esta_instancia) then
|
|
instancia.baseframe:ClearAllPoints()
|
|
esta_instancia = _detalhes.tabela_instancias [esta_instancia]
|
|
|
|
instancia:SetWindowScale (esta_instancia.window_scale)
|
|
|
|
if (lado == 3) then --> direita
|
|
--> mover frame
|
|
instancia.baseframe:SetPoint ("TOPRIGHT", esta_instancia.baseframe, "TOPLEFT")
|
|
instancia.baseframe:SetPoint ("RIGHT", esta_instancia.baseframe, "LEFT")
|
|
instancia.baseframe:SetPoint ("BOTTOMRIGHT", esta_instancia.baseframe, "BOTTOMLEFT")
|
|
|
|
local _, height = esta_instancia:GetSize()
|
|
instancia:SetSize (nil, height)
|
|
|
|
--> salva o snap
|
|
self.snap [3] = esta_instancia.meu_id
|
|
esta_instancia.snap [1] = self.meu_id
|
|
|
|
elseif (lado == 4) then --> cima
|
|
--> mover frame
|
|
|
|
local statusbar_y_mod = 0
|
|
if (not esta_instancia.show_statusbar) then
|
|
statusbar_y_mod = 14
|
|
end
|
|
|
|
instancia.baseframe:SetPoint ("TOPLEFT", esta_instancia.baseframe, "BOTTOMLEFT", 0, -34 + statusbar_y_mod)
|
|
instancia.baseframe:SetPoint ("TOP", esta_instancia.baseframe, "BOTTOM", 0, -34 + statusbar_y_mod)
|
|
instancia.baseframe:SetPoint ("TOPRIGHT", esta_instancia.baseframe, "BOTTOMRIGHT", 0, -34 + statusbar_y_mod)
|
|
|
|
local _, height = esta_instancia:GetSize()
|
|
instancia:SetSize (nil, height)
|
|
|
|
--> salva o snap
|
|
self.snap [4] = esta_instancia.meu_id
|
|
esta_instancia.snap [2] = self.meu_id
|
|
|
|
elseif (lado == 1) then --> esquerda
|
|
--> mover frame
|
|
|
|
--print (esta_instancia.baseframe:GetPoint (0)[2], esta_instancia.baseframe:GetPoint (0)[2] == instancia.baseframe)
|
|
|
|
instancia.baseframe:SetPoint ("TOPLEFT", esta_instancia.baseframe, "TOPRIGHT")
|
|
instancia.baseframe:SetPoint ("LEFT", esta_instancia.baseframe, "RIGHT")
|
|
instancia.baseframe:SetPoint ("BOTTOMLEFT", esta_instancia.baseframe, "BOTTOMRIGHT")
|
|
|
|
local _, height = esta_instancia:GetSize()
|
|
instancia:SetSize (nil, height)
|
|
|
|
--> salva o snap
|
|
self.snap [1] = esta_instancia.meu_id
|
|
esta_instancia.snap [3] = self.meu_id
|
|
|
|
elseif (lado == 2) then --> baixo
|
|
--> mover frame
|
|
|
|
local statusbar_y_mod = 0
|
|
if (not instancia.show_statusbar) then
|
|
statusbar_y_mod = -14
|
|
end
|
|
|
|
instancia.baseframe:SetPoint ("BOTTOMLEFT", esta_instancia.baseframe, "TOPLEFT", 0, 34 + statusbar_y_mod)
|
|
instancia.baseframe:SetPoint ("BOTTOM", esta_instancia.baseframe, "TOP", 0, 34 + statusbar_y_mod)
|
|
instancia.baseframe:SetPoint ("BOTTOMRIGHT", esta_instancia.baseframe, "TOPRIGHT", 0, 34 + statusbar_y_mod)
|
|
|
|
local _, height = esta_instancia:GetSize()
|
|
instancia:SetSize (nil, height)
|
|
|
|
--> salva o snap
|
|
self.snap [2] = esta_instancia.meu_id
|
|
esta_instancia.snap [4] = self.meu_id
|
|
|
|
end
|
|
|
|
if (not esta_instancia.ativa) then
|
|
esta_instancia:AtivarInstancia()
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
instancia.break_snap_button:SetAlpha (1)
|
|
|
|
if (_detalhes.tutorial.unlock_button < 4) then
|
|
|
|
_detalhes.temp_table1.IconSize = 32
|
|
_detalhes.temp_table1.TextHeightMod = -6
|
|
_detalhes.popup:ShowMe (instancia.break_snap_button, "tooltip", "Interface\\Buttons\\LockButton-Unlocked-Up", Loc ["STRING_UNLOCK"], 150, _detalhes.temp_table1)
|
|
|
|
--UIFrameFlash (instancia.break_snap_button, .5, .5, 5, false, 0, 0)
|
|
_detalhes.tutorial.unlock_button = _detalhes.tutorial.unlock_button + 1
|
|
end
|
|
|
|
_detalhes:DelayOptionsRefresh()
|
|
|
|
end
|
|
|
|
_detalhes.MakeInstanceGroup = _detalhes.agrupar_janelas
|
|
|
|
function _detalhes:UngroupInstance()
|
|
return self:Desagrupar (-1)
|
|
end
|
|
|
|
function _detalhes:Desagrupar (instancia, lado)
|
|
|
|
if (self.meu_id) then --> significa que self é uma instancia
|
|
lado = instancia
|
|
instancia = self
|
|
end
|
|
|
|
if (_type (instancia) == "number") then --> significa que passou o número da instância
|
|
instancia = _detalhes.tabela_instancias [instancia]
|
|
end
|
|
|
|
_detalhes:DelayOptionsRefresh (nil, true)
|
|
|
|
if (not lado) then
|
|
--print ("DEBUG: Desagrupar esta sem lado")
|
|
return
|
|
end
|
|
|
|
if (lado < 0) then --> clicou no botão para desagrupar tudo
|
|
local ID = instancia.meu_id
|
|
|
|
for id, esta_instancia in _ipairs (_detalhes.tabela_instancias) do
|
|
for index, iid in _pairs (esta_instancia.snap) do -- index = 1 left , 3 right, 2 bottom, 4 top
|
|
if (iid and (iid == ID or id == ID)) then -- iid = instancia.meu_id
|
|
|
|
esta_instancia.snap [index] = nil
|
|
|
|
if (instancia.verticalSnap or esta_instancia.verticalSnap) then
|
|
if (not esta_instancia.snap [2] and not esta_instancia.snap [4]) then
|
|
esta_instancia.verticalSnap = false
|
|
esta_instancia.horizontalSnap = false
|
|
end
|
|
elseif (instancia.horizontalSnap or esta_instancia.horizontalSnap) then
|
|
if (not esta_instancia.snap [1] and not esta_instancia.snap [3]) then
|
|
esta_instancia.horizontalSnap = false
|
|
esta_instancia.verticalSnap = false
|
|
end
|
|
end
|
|
|
|
if (index == 2) then -- index é o codigo do snap
|
|
--esta_instancia.baseframe.rodape.StatusBarLeftAnchor:SetPoint ("left", esta_instancia.baseframe.rodape.top_bg, "left", 5, 58)
|
|
--esta_instancia.baseframe.rodape.StatusBarCenterAnchor:SetPoint ("center", esta_instancia.baseframe.rodape.top_bg, "center", 0, 58)
|
|
--esta_instancia.baseframe.rodape.esquerdo:SetTexture ("Interface\\AddOns\\Details\\images\\bar_down_left")
|
|
--esta_instancia.baseframe.rodape.esquerdo.have_snap = nil
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
|
|
instancia.break_snap_button:SetAlpha (0)
|
|
|
|
instancia.verticalSnap = false
|
|
instancia.horizontalSnap = false
|
|
return
|
|
end
|
|
|
|
local esta_instancia = _detalhes.tabela_instancias [instancia.snap[lado]]
|
|
|
|
if (not esta_instancia) then
|
|
--print ("DEBUG: Erro, a instancia nao existe")
|
|
return
|
|
end
|
|
|
|
instancia.snap [lado] = nil
|
|
|
|
if (lado == 1) then
|
|
esta_instancia.snap [3] = nil
|
|
elseif (lado == 2) then
|
|
esta_instancia.snap [4] = nil
|
|
elseif (lado == 3) then
|
|
esta_instancia.snap [1] = nil
|
|
elseif (lado == 4) then
|
|
esta_instancia.snap [2] = nil
|
|
end
|
|
|
|
instancia.break_snap_button:SetAlpha (0)
|
|
|
|
|
|
if (instancia.iniciada) then
|
|
instancia:SaveMainWindowPosition()
|
|
instancia:RestoreMainWindowPosition()
|
|
end
|
|
|
|
if (esta_instancia.iniciada) then
|
|
esta_instancia:SaveMainWindowPosition()
|
|
esta_instancia:RestoreMainWindowPosition()
|
|
end
|
|
|
|
--print ("DEBUG: Details: Instancias desagrupadas")
|
|
|
|
--_detalhes:RefreshAgrupamentos()
|
|
|
|
end
|
|
|
|
function _detalhes:SnapTextures (remove)
|
|
for id, esta_instancia in _ipairs (_detalhes.tabela_instancias) do
|
|
if (esta_instancia:IsAtiva()) then
|
|
if (esta_instancia.baseframe.rodape.esquerdo.have_snap) then
|
|
if (remove) then
|
|
--esta_instancia.baseframe.rodape.esquerdo:SetTexture ("Interface\\AddOns\\Details\\images\\bar_down_left")
|
|
else
|
|
--esta_instancia.baseframe.rodape.esquerdo:SetTexture ("Interface\\AddOns\\Details\\images\\bar_down_left_snap")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--> cria uma janela para uma nova instância
|
|
--> search key: ~new ~nova
|
|
function _detalhes:CreateDisabledInstance (ID, skin_table)
|
|
|
|
--> first check if we can recycle a old instance
|
|
if (_detalhes.unused_instances [ID]) then
|
|
local new_instance = _detalhes.unused_instances [ID]
|
|
_detalhes.tabela_instancias [ID] = new_instance
|
|
_detalhes.unused_instances [ID] = nil
|
|
--> replace the values on recycled instance
|
|
new_instance:ResetInstanceConfig()
|
|
|
|
--> copy values from a previous skin saved
|
|
if (skin_table) then
|
|
--> copy from skin_table to new_instance
|
|
_detalhes.table.copy (new_instance, skin_table)
|
|
end
|
|
|
|
return new_instance
|
|
end
|
|
|
|
--> must create a new one
|
|
local new_instance = {
|
|
--> instance id
|
|
meu_id = ID,
|
|
--> internal stuff
|
|
barras = {}, --container que irá armazenar todas as barras
|
|
barraS = {nil, nil}, --de x até x são as barras que estão sendo mostradas na tela
|
|
rolagem = false, --barra de rolagem não esta sendo mostrada
|
|
largura_scroll = 26,
|
|
bar_mod = 0,
|
|
bgdisplay_loc = 0,
|
|
|
|
--> displaying row info
|
|
rows_created = 0,
|
|
rows_showing = 0,
|
|
rows_max = 50,
|
|
|
|
--> saved pos for normal mode and lone wolf mode
|
|
posicao = {
|
|
["normal"] = {x = 1, y = 2, w = 300, h = 200},
|
|
["solo"] = {x = 1, y = 2, w = 300, h = 200}
|
|
},
|
|
|
|
--> save information about window snaps
|
|
snap = {},
|
|
|
|
--> current state starts as normal
|
|
mostrando = "normal",
|
|
--> menu consolidated
|
|
consolidate = false, --deprecated
|
|
icons = {true, true, true, true},
|
|
|
|
--> status bar stuff
|
|
StatusBar = {options = {}},
|
|
|
|
--> more stuff
|
|
atributo = 1, --> dano
|
|
sub_atributo = 1, --> damage done
|
|
sub_atributo_last = {1, 1, 1, 1, 1},
|
|
segmento = 0, --> combate atual
|
|
modo = modo_grupo,
|
|
last_modo = modo_grupo,
|
|
LastModo = modo_grupo,
|
|
}
|
|
|
|
_setmetatable (new_instance, _detalhes)
|
|
_detalhes.tabela_instancias [#_detalhes.tabela_instancias+1] = new_instance
|
|
|
|
--> fill the empty instance with default values
|
|
new_instance:ResetInstanceConfig()
|
|
|
|
--> copy values from a previous skin saved
|
|
if (skin_table) then
|
|
--> copy from skin_table to new_instance
|
|
_detalhes.table.copy (new_instance, skin_table)
|
|
end
|
|
|
|
--> setup default wallpaper
|
|
local spec = GetSpecialization()
|
|
if (spec) then
|
|
local id, name, description, icon, _background, role = GetSpecializationInfo (spec)
|
|
if (_background) then
|
|
local bg = "Interface\\TALENTFRAME\\" .. _background
|
|
if (new_instance.wallpaper) then
|
|
new_instance.wallpaper.texture = bg
|
|
new_instance.wallpaper.texcoord = {0, 1, 0, 0.703125}
|
|
end
|
|
end
|
|
end
|
|
|
|
--> finish
|
|
return new_instance
|
|
end
|
|
|
|
function _detalhes:NovaInstancia (ID)
|
|
|
|
local new_instance = {}
|
|
_setmetatable (new_instance, _detalhes)
|
|
_detalhes.tabela_instancias [#_detalhes.tabela_instancias+1] = new_instance
|
|
|
|
--> instance number
|
|
new_instance.meu_id = ID
|
|
|
|
--> setup all config
|
|
new_instance:ResetInstanceConfig()
|
|
--> setup default wallpaper
|
|
local spec = GetSpecialization()
|
|
if (spec) then
|
|
local id, name, description, icon, _background, role = GetSpecializationInfo (spec)
|
|
if (_background) then
|
|
local bg = "Interface\\TALENTFRAME\\" .. _background
|
|
if (new_instance.wallpaper) then
|
|
new_instance.wallpaper.texture = bg
|
|
new_instance.wallpaper.texcoord = {0, 1, 0, 0.703125}
|
|
end
|
|
end
|
|
end
|
|
|
|
--> internal stuff
|
|
new_instance.barras = {} --container que irá armazenar todas as barras
|
|
new_instance.barraS = {nil, nil} --de x até x são as barras que estão sendo mostradas na tela
|
|
new_instance.rolagem = false --barra de rolagem não esta sendo mostrada
|
|
new_instance.largura_scroll = 26
|
|
new_instance.bar_mod = 0
|
|
new_instance.bgdisplay_loc = 0
|
|
|
|
--> displaying row info
|
|
new_instance.rows_created = 0
|
|
new_instance.rows_showing = 0
|
|
new_instance.rows_max = 50
|
|
new_instance.rows_fit_in_window = nil
|
|
|
|
--> saved pos for normal mode and lone wolf mode
|
|
new_instance.posicao = {
|
|
["normal"] = {x = 1, y = 2, w = 300, h = 200},
|
|
["solo"] = {x = 1, y = 2, w = 300, h = 200}
|
|
}
|
|
--> save information about window snaps
|
|
new_instance.snap = {}
|
|
|
|
--> current state starts as normal
|
|
new_instance.mostrando = "normal"
|
|
--> menu consolidated
|
|
new_instance.consolidate = false
|
|
new_instance.icons = {true, true, true, true}
|
|
|
|
--> create window frames
|
|
|
|
local _baseframe, _bgframe, _bgframe_display, _scrollframe = gump:CriaJanelaPrincipal (ID, new_instance, true)
|
|
new_instance.baseframe = _baseframe
|
|
new_instance.bgframe = _bgframe
|
|
new_instance.bgdisplay = _bgframe_display
|
|
new_instance.scroll = _scrollframe
|
|
|
|
--> status bar stuff
|
|
new_instance.StatusBar = {}
|
|
new_instance.StatusBar.left = nil
|
|
new_instance.StatusBar.center = nil
|
|
new_instance.StatusBar.right = nil
|
|
new_instance.StatusBar.options = {}
|
|
|
|
local clock = _detalhes.StatusBar:CreateStatusBarChildForInstance (new_instance, "DETAILS_STATUSBAR_PLUGIN_CLOCK")
|
|
_detalhes.StatusBar:SetCenterPlugin (new_instance, clock)
|
|
|
|
local segment = _detalhes.StatusBar:CreateStatusBarChildForInstance (new_instance, "DETAILS_STATUSBAR_PLUGIN_PSEGMENT")
|
|
_detalhes.StatusBar:SetLeftPlugin (new_instance, segment)
|
|
|
|
local dps = _detalhes.StatusBar:CreateStatusBarChildForInstance (new_instance, "DETAILS_STATUSBAR_PLUGIN_PDPS")
|
|
_detalhes.StatusBar:SetRightPlugin (new_instance, dps)
|
|
|
|
--> internal stuff
|
|
new_instance.alturaAntiga = _baseframe:GetHeight()
|
|
new_instance.atributo = 1 --> dano
|
|
new_instance.sub_atributo = 1 --> damage done
|
|
new_instance.sub_atributo_last = {1, 1, 1, 1, 1}
|
|
new_instance.segmento = -1 --> combate atual
|
|
new_instance.modo = modo_grupo
|
|
new_instance.last_modo = modo_grupo
|
|
new_instance.LastModo = modo_grupo
|
|
|
|
--> change the attribute
|
|
_detalhes:TrocaTabela (new_instance, 0, 1, 1)
|
|
|
|
--> internal stuff
|
|
new_instance.row_height = new_instance.row_info.height + new_instance.row_info.space.between
|
|
|
|
new_instance.oldwith = new_instance.baseframe:GetWidth()
|
|
new_instance.iniciada = true
|
|
new_instance:SaveMainWindowPosition()
|
|
new_instance:ReajustaGump()
|
|
|
|
new_instance.rows_fit_in_window = _math_floor (new_instance.posicao[new_instance.mostrando].h / new_instance.row_height)
|
|
|
|
--> all done
|
|
new_instance:AtivarInstancia()
|
|
|
|
new_instance:ShowSideBars()
|
|
|
|
new_instance.skin = "no skin"
|
|
new_instance:ChangeSkin (_detalhes.default_skin_to_use)
|
|
|
|
--> apply standard skin if have one saved
|
|
--[[
|
|
if (_detalhes.standard_skin) then
|
|
|
|
local style = _detalhes.standard_skin
|
|
local instance = new_instance
|
|
local skin = style.skin
|
|
|
|
instance.skin = ""
|
|
instance:ChangeSkin (skin)
|
|
|
|
--> overwrite all instance parameters with saved ones
|
|
for key, value in pairs (style) do
|
|
if (key ~= "skin") then
|
|
if (type (value) == "table") then
|
|
instance [key] = table_deepcopy (value)
|
|
else
|
|
instance [key] = value
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
--]]
|
|
|
|
--> apply all changed attributes
|
|
--new_instance:ChangeSkin()
|
|
|
|
return new_instance
|
|
end
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
|
|
function _detalhes:FixToolbarMenu (instance)
|
|
--print ("fixing...", instance.meu_id)
|
|
--instance:ToolbarMenuButtons()
|
|
end
|
|
|
|
--> ao reiniciar o addon esta função é rodada para recriar a janela da instância
|
|
--> search key: ~restaura ~inicio ~start
|
|
function _detalhes:RestauraJanela (index, temp, load_only)
|
|
|
|
--> load
|
|
self:LoadInstanceConfig()
|
|
|
|
--> reset internal stuff
|
|
self.sub_atributo_last = self.sub_atributo_last or {1, 1, 1, 1, 1}
|
|
self.rolagem = false
|
|
self.need_rolagem = false
|
|
self.barras = {}
|
|
self.barraS = {nil, nil}
|
|
self.rows_fit_in_window = nil
|
|
self.consolidate = self.consolidate or false
|
|
self.icons = self.icons or {true, true, true, true}
|
|
self.rows_created = 0
|
|
self.rows_showing = 0
|
|
self.rows_max = 50
|
|
self.rows_fit_in_window = nil
|
|
self.largura_scroll = 26
|
|
self.bar_mod = 0
|
|
self.bgdisplay_loc = 0
|
|
self.last_modo = self.last_modo or modo_grupo
|
|
|
|
self.row_height = self.row_info.height + self.row_info.space.between
|
|
|
|
--> create frames
|
|
local _baseframe, _bgframe, _bgframe_display, _scrollframe = gump:CriaJanelaPrincipal (self.meu_id, self)
|
|
self.baseframe = _baseframe
|
|
self.bgframe = _bgframe
|
|
self.bgdisplay = _bgframe_display
|
|
self.scroll = _scrollframe
|
|
_baseframe:EnableMouseWheel (false)
|
|
self.alturaAntiga = _baseframe:GetHeight()
|
|
|
|
--> change the attribute
|
|
_detalhes:TrocaTabela (self, self.segmento, self.atributo, self.sub_atributo, true) --> passando true no 5º valor para a função ignorar a checagem de valores iguais
|
|
|
|
--> set wallpaper
|
|
if (self.wallpaper.enabled) then
|
|
self:InstanceWallpaper (true)
|
|
end
|
|
|
|
--> set the color of this instance window
|
|
self:InstanceColor (self.color)
|
|
|
|
--> scrollbar
|
|
self:EsconderScrollBar (true)
|
|
|
|
--> check snaps
|
|
self.snap = self.snap or {}
|
|
|
|
--> status bar stuff
|
|
self.StatusBar = {}
|
|
self.StatusBar.left = nil
|
|
self.StatusBar.center = nil
|
|
self.StatusBar.right = nil
|
|
self.StatusBarSaved = self.StatusBarSaved or {options = {}}
|
|
self.StatusBar.options = self.StatusBarSaved.options
|
|
|
|
if (self.StatusBarSaved.center and self.StatusBarSaved.center == "NONE") then
|
|
self.StatusBarSaved.center = "DETAILS_STATUSBAR_PLUGIN_CLOCK"
|
|
end
|
|
local clock = _detalhes.StatusBar:CreateStatusBarChildForInstance (self, self.StatusBarSaved.center or "DETAILS_STATUSBAR_PLUGIN_CLOCK")
|
|
_detalhes.StatusBar:SetCenterPlugin (self, clock, true)
|
|
|
|
if (self.StatusBarSaved.left and self.StatusBarSaved.left == "NONE") then
|
|
self.StatusBarSaved.left = "DETAILS_STATUSBAR_PLUGIN_PSEGMENT"
|
|
end
|
|
local segment = _detalhes.StatusBar:CreateStatusBarChildForInstance (self, self.StatusBarSaved.left or "DETAILS_STATUSBAR_PLUGIN_PSEGMENT")
|
|
_detalhes.StatusBar:SetLeftPlugin (self, segment, true)
|
|
|
|
if (self.StatusBarSaved.right and self.StatusBarSaved.right == "NONE") then
|
|
self.StatusBarSaved.right = "DETAILS_STATUSBAR_PLUGIN_PDPS"
|
|
end
|
|
local dps = _detalhes.StatusBar:CreateStatusBarChildForInstance (self, self.StatusBarSaved.right or "DETAILS_STATUSBAR_PLUGIN_PDPS")
|
|
_detalhes.StatusBar:SetRightPlugin (self, dps, true)
|
|
|
|
--> load mode
|
|
|
|
if (self.modo == modo_alone) then
|
|
if (_detalhes.solo and _detalhes.solo ~= self.meu_id) then --> proteção para ter apenas uma instância com a janela SOLO
|
|
self.modo = modo_grupo
|
|
self.mostrando = "normal"
|
|
else
|
|
self:SoloMode (true)
|
|
_detalhes.solo = self.meu_id
|
|
end
|
|
elseif (self.modo == modo_raid) then
|
|
_detalhes.raid = self.meu_id
|
|
else
|
|
self.mostrando = "normal"
|
|
end
|
|
|
|
--> internal stuff
|
|
self.oldwith = self.baseframe:GetWidth()
|
|
|
|
self:RestoreMainWindowPosition()
|
|
self:ReajustaGump()
|
|
--self:SaveMainWindowPosition()
|
|
|
|
if (not load_only) then
|
|
self.iniciada = true
|
|
self:AtivarInstancia (temp)
|
|
self:ChangeSkin()
|
|
end
|
|
|
|
--> all done
|
|
return
|
|
end
|
|
|
|
function _detalhes:SwitchBack()
|
|
local prev_switch = self.auto_switch_to_old
|
|
|
|
if (prev_switch) then
|
|
if (self.modo ~= prev_switch [1]) then
|
|
_detalhes:AlteraModo (self, prev_switch [1])
|
|
end
|
|
|
|
if (self.modo == _detalhes._detalhes_props["MODO_RAID"]) then
|
|
_detalhes.RaidTables:switch (nil, prev_switch [5], self)
|
|
|
|
elseif (self.modo == _detalhes._detalhes_props["MODO_ALONE"]) then
|
|
_detalhes.SoloTables:switch (nil, prev_switch [6])
|
|
|
|
else
|
|
_detalhes:TrocaTabela (self, prev_switch [4], prev_switch [2], prev_switch [3])
|
|
end
|
|
|
|
self.auto_switch_to_old = nil
|
|
end
|
|
end
|
|
|
|
function _detalhes:SwitchTo (switch_table, nosave)
|
|
if (not nosave) then
|
|
self.auto_switch_to_old = {self.modo, self.atributo, self.sub_atributo, self.segmento, self:GetRaidPluginName(), _detalhes.SoloTables.Mode}
|
|
end
|
|
|
|
if (switch_table [1] == "raid") then
|
|
_detalhes.RaidTables:EnableRaidMode (self, switch_table [2])
|
|
else
|
|
--muda para um atributo normal
|
|
if (self.modo ~= _detalhes._detalhes_props["MODO_GROUP"]) then
|
|
_detalhes:AlteraModo (self, _detalhes._detalhes_props["MODO_GROUP"])
|
|
end
|
|
_detalhes:TrocaTabela (self, nil, switch_table [1], switch_table [2])
|
|
end
|
|
end
|
|
|
|
--backtable indexes: [1]: mode [2]: attribute [3]: sub attribute [4]: segment [5]: raidmode index [6]: solomode index
|
|
function _detalhes:CheckSwitchOnCombatEnd (nowipe, warning)
|
|
|
|
self:SwitchBack()
|
|
|
|
local role = _UnitGroupRolesAssigned ("player")
|
|
|
|
local got_switch = false
|
|
|
|
if (role == "DAMAGER" and self.switch_damager) then
|
|
self:SwitchTo (self.switch_damager)
|
|
got_switch = true
|
|
|
|
elseif (role == "HEALER" and self.switch_healer) then
|
|
self:SwitchTo (self.switch_healer)
|
|
got_switch = true
|
|
|
|
elseif (role == "TANK" and self.switch_tank) then
|
|
self:SwitchTo (self.switch_tank, true)
|
|
got_switch = true
|
|
|
|
elseif (role == "NONE" and _detalhes.last_assigned_role ~= "NONE") then
|
|
self:SwitchBack()
|
|
got_switch = true
|
|
|
|
end
|
|
|
|
if (warning and got_switch) then
|
|
local attribute_name = self:GetInstanceAttributeText()
|
|
self:InstanceAlert (string.format (Loc ["STRING_SWITCH_WARNING"], attribute_name), {[[Interface\AddOns\Details\images\sword]], 18, 18, false}, 4)
|
|
end
|
|
|
|
if (self.switch_all_roles_after_wipe and not nowipe) then
|
|
if (_detalhes.tabela_vigente.is_boss and _detalhes.tabela_vigente.instance_type == "raid" and not _detalhes.tabela_vigente.is_boss.killed and _detalhes.tabela_vigente.is_boss.name) then
|
|
self:SwitchBack()
|
|
self:SwitchTo (self.switch_all_roles_after_wipe)
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
function _detalhes:CheckSwitchOnLogon (warning)
|
|
for index, instancia in ipairs (_detalhes.tabela_instancias) do
|
|
if (instancia.ativa) then
|
|
instancia:CheckSwitchOnCombatEnd (true, warning)
|
|
end
|
|
end
|
|
end
|
|
|
|
function _detalhes:CheckSegmentForSwitchOnCombatStart()
|
|
|
|
end
|
|
|
|
function _detalhes:CheckSwitchOnCombatStart (check_segment)
|
|
|
|
self:SwitchBack()
|
|
|
|
local all_roles = self.switch_all_roles_in_combat
|
|
|
|
local role = _UnitGroupRolesAssigned ("player")
|
|
local got_switch = false
|
|
|
|
if (role == "DAMAGER" and self.switch_damager_in_combat) then
|
|
self:SwitchTo (self.switch_damager_in_combat)
|
|
got_switch = true
|
|
|
|
elseif (role == "HEALER" and self.switch_healer_in_combat) then
|
|
self:SwitchTo (self.switch_healer_in_combat)
|
|
got_switch = true
|
|
|
|
elseif (role == "TANK" and self.switch_tank_in_combat) then
|
|
self:SwitchTo (self.switch_tank_in_combat)
|
|
got_switch = true
|
|
|
|
elseif (self.switch_all_roles_in_combat) then
|
|
self:SwitchTo (self.switch_all_roles_in_combat)
|
|
got_switch = true
|
|
|
|
end
|
|
|
|
if (check_segment and got_switch) then
|
|
if (self:GetSegment() ~= 0) then
|
|
self:TrocaTabela (0)
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
function _detalhes:ExportSkin()
|
|
|
|
--create the table
|
|
local exported = {
|
|
version = _detalhes.preset_version --skin version
|
|
}
|
|
|
|
--export the keys
|
|
for key, value in pairs (self) do
|
|
if (_detalhes.instance_defaults [key] ~= nil) then
|
|
if (type (value) == "table") then
|
|
exported [key] = table_deepcopy (value)
|
|
else
|
|
exported [key] = value
|
|
end
|
|
end
|
|
end
|
|
|
|
--export size and positioning
|
|
if (_detalhes.profile_save_pos) then
|
|
exported.posicao = self.posicao
|
|
else
|
|
exported.posicao = nil
|
|
end
|
|
|
|
--export mini displays
|
|
if (self.StatusBar and self.StatusBar.left) then
|
|
exported.StatusBarSaved = {
|
|
["left"] = self.StatusBar.left.real_name or "NONE",
|
|
["center"] = self.StatusBar.center.real_name or "NONE",
|
|
["right"] = self.StatusBar.right.real_name or "NONE",
|
|
}
|
|
exported.StatusBarSaved.options = {
|
|
[exported.StatusBarSaved.left] = table_deepcopy (self.StatusBar.left.options),
|
|
[exported.StatusBarSaved.center] = table_deepcopy (self.StatusBar.center.options),
|
|
[exported.StatusBarSaved.right] = table_deepcopy (self.StatusBar.right.options)
|
|
}
|
|
|
|
elseif (self.StatusBarSaved) then
|
|
exported.StatusBarSaved = table_deepcopy (self.StatusBarSaved)
|
|
|
|
end
|
|
|
|
return exported
|
|
|
|
end
|
|
|
|
function _detalhes:ApplySavedSkin (style)
|
|
|
|
if (not style.version or _detalhes.preset_version > style.version) then
|
|
return _detalhes:Msg (Loc ["STRING_OPTIONS_PRESETTOOLD"])
|
|
end
|
|
|
|
--> set skin preset
|
|
local skin = style.skin
|
|
self.skin = ""
|
|
self:ChangeSkin (skin)
|
|
|
|
-- /script print (_detalhes.tabela_instancias[1].baseframe:GetAlpha())
|
|
|
|
--> overwrite all instance parameters with saved ones
|
|
for key, value in pairs (style) do
|
|
if (key ~= "skin") then
|
|
if (type (value) == "table") then
|
|
self [key] = table_deepcopy (value)
|
|
else
|
|
self [key] = value
|
|
end
|
|
end
|
|
end
|
|
|
|
--> check for new keys inside tables
|
|
for key, value in pairs (_detalhes.instance_defaults) do
|
|
if (type (value) == "table") then
|
|
for key2, value2 in pairs (value) do
|
|
if (self [key] [key2] == nil) then
|
|
if (type (value2) == "table") then
|
|
self [key] [key2] = table_deepcopy (_detalhes.instance_defaults [key] [key2])
|
|
else
|
|
self [key] [key2] = value2
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
self.StatusBarSaved = style.StatusBarSaved and table_deepcopy (style.StatusBarSaved) or {options = {}}
|
|
self.StatusBar.options = self.StatusBarSaved.options
|
|
_detalhes.StatusBar:UpdateChilds (self)
|
|
|
|
--> apply all changed attributes
|
|
self:ChangeSkin()
|
|
|
|
--export size and positioning
|
|
if (_detalhes.profile_save_pos) then
|
|
self.posicao = style.posicao
|
|
self:RestoreMainWindowPosition()
|
|
else
|
|
self.posicao = table_deepcopy (self.posicao)
|
|
end
|
|
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
|
|
function _detalhes:InstanceReset (instance)
|
|
if (instance) then
|
|
self = instance
|
|
end
|
|
_detalhes.gump:Fade (self, "in", nil, "barras")
|
|
self:AtualizaSegmentos (self)
|
|
self:AtualizaSoloMode_AfertReset()
|
|
self:ResetaGump()
|
|
|
|
if (not _detalhes.initializing) then
|
|
_detalhes:AtualizaGumpPrincipal (self, true) --atualiza todas as instancias
|
|
end
|
|
end
|
|
|
|
function _detalhes:RefreshBars (instance)
|
|
if (instance) then
|
|
self = instance
|
|
end
|
|
self:InstanceRefreshRows (instancia)
|
|
end
|
|
|
|
function _detalhes:SetBackgroundColor (...)
|
|
|
|
local red = select (1, ...)
|
|
if (not red) then
|
|
self.bgdisplay:SetBackdropColor (self.bg_r, self.bg_g, self.bg_b, self.bg_alpha)
|
|
self.baseframe:SetBackdropColor (self.bg_r, self.bg_g, self.bg_b, self.bg_alpha)
|
|
return
|
|
end
|
|
|
|
local r, g, b = gump:ParseColors (...)
|
|
self.bgdisplay:SetBackdropColor (r, g, b, self.bg_alpha or _detalhes.default_bg_alpha)
|
|
self.baseframe:SetBackdropColor (r, g, b, self.bg_alpha or _detalhes.default_bg_alpha)
|
|
self.bg_r = r
|
|
self.bg_g = g
|
|
self.bg_b = b
|
|
end
|
|
|
|
function _detalhes:SetBackgroundAlpha (alpha)
|
|
if (not alpha) then
|
|
alpha = self.bg_alpha
|
|
-- else
|
|
-- print (alpha)
|
|
-- alpha = _detalhes:Scale (0, 1, 0.2, 1, alpha) - 0.8
|
|
end
|
|
|
|
self.bgdisplay:SetBackdropColor (self.bg_r, self.bg_g, self.bg_b, alpha)
|
|
self.baseframe:SetBackdropColor (self.bg_r, self.bg_g, self.bg_b, alpha)
|
|
self.bg_alpha = alpha
|
|
end
|
|
|
|
function _detalhes:GetSize()
|
|
return self.baseframe:GetWidth(), self.baseframe:GetHeight()
|
|
end
|
|
|
|
function _detalhes:GetRealSize()
|
|
return self.baseframe:GetWidth() * self.baseframe:GetScale(), self.baseframe:GetHeight() * self.baseframe:GetScale()
|
|
end
|
|
|
|
function _detalhes:GetPositionOnScreen()
|
|
local xOfs, yOfs = self.baseframe:GetCenter()
|
|
if (not xOfs) then
|
|
return
|
|
end
|
|
-- credits to ckknight (http://www.curseforge.com/profiles/ckknight/)
|
|
local _scale = self.baseframe:GetEffectiveScale()
|
|
local _UIscale = UIParent:GetScale()
|
|
xOfs = xOfs*_scale - GetScreenWidth()*_UIscale/2
|
|
yOfs = yOfs*_scale - GetScreenHeight()*_UIscale/2
|
|
return xOfs/_UIscale, yOfs/_UIscale
|
|
end
|
|
|
|
--> alias
|
|
function _detalhes:SetSize (w, h)
|
|
return self:Resize (w, h)
|
|
end
|
|
|
|
function _detalhes:Resize (w, h)
|
|
if (w) then
|
|
self.baseframe:SetWidth (w)
|
|
end
|
|
|
|
if (h) then
|
|
self.baseframe:SetHeight (h)
|
|
end
|
|
|
|
self:SaveMainWindowPosition()
|
|
|
|
return true
|
|
end
|
|
|
|
------------------------------------------------------------------------------------------------------------------------
|
|
|
|
function _detalhes:CheckSwitchToCurrent()
|
|
if (DetailsReportWindow and DetailsReportWindow:IsShown()) then
|
|
_detalhes.delay_CheckSwitchToCurrent = true
|
|
return
|
|
end
|
|
for _, instance in _ipairs (_detalhes.tabela_instancias) do
|
|
if (instance.ativa and instance.baseframe and instance.segmento ~= 0 and instance.auto_current) then
|
|
instance:TrocaTabela (0) --> muda o segmento pra current
|
|
instance:InstanceAlert (Loc ["STRING_CHANGED_TO_CURRENT"], {[[Interface\AddOns\Details\images\toolbar_icons]], 18, 18, false, 32/256, 64/256, 0, 1}, 6)
|
|
end
|
|
end
|
|
end
|
|
|
|
function _detalhes:Freeze (instancia)
|
|
|
|
if (not instancia) then
|
|
instancia = self
|
|
end
|
|
|
|
if (not _detalhes.initializing) then
|
|
instancia:ResetaGump()
|
|
gump:Fade (instancia, "in", nil, "barras")
|
|
end
|
|
|
|
instancia:InstanceMsg (Loc ["STRING_FREEZE"], [[Interface\CHARACTERFRAME\Disconnect-Icon]], "silver")
|
|
|
|
--instancia.freeze_icon:Show()
|
|
--instancia.freeze_texto:Show()
|
|
|
|
local width = instancia:GetSize()
|
|
instancia.freeze_texto:SetWidth (width-64)
|
|
|
|
instancia.freezed = true
|
|
end
|
|
|
|
function _detalhes:UnFreeze (instancia)
|
|
|
|
if (not instancia) then
|
|
instancia = self
|
|
end
|
|
|
|
self:InstanceMsg (false)
|
|
|
|
--instancia.freeze_icon:Hide()
|
|
--instancia.freeze_texto:Hide()
|
|
instancia.freezed = false
|
|
|
|
if (not _detalhes.initializing) then
|
|
--instancia:RestoreMainWindowPosition()
|
|
instancia:ReajustaGump()
|
|
end
|
|
end
|
|
|
|
function _detalhes:AtualizaSegmentos (instancia)
|
|
if (instancia.iniciada) then
|
|
if (instancia.segmento == -1) then
|
|
--instancia.baseframe.rodape.segmento:SetText (segmentos.overall) --> localiza-me
|
|
instancia.showing = _detalhes.tabela_overall
|
|
elseif (instancia.segmento == 0) then
|
|
--instancia.baseframe.rodape.segmento:SetText (segmentos.current) --> localiza-me
|
|
instancia.showing = _detalhes.tabela_vigente
|
|
else
|
|
instancia.showing = _detalhes.tabela_historico.tabelas [instancia.segmento]
|
|
--instancia.baseframe.rodape.segmento:SetText (segmentos.past..instancia.segmento) --> localiza-me
|
|
end
|
|
end
|
|
end
|
|
|
|
function _detalhes:AtualizaSegmentos_AfterCombat (instancia, historico)
|
|
|
|
if (instancia.freezed) then
|
|
return --> se esta congelada não tem o que fazer
|
|
end
|
|
|
|
local segmento = instancia.segmento
|
|
|
|
local _fadeType, _fadeSpeed = _unpack (_detalhes.row_fade_in)
|
|
|
|
if (segmento == _detalhes.segments_amount) then --> significa que o index [5] passou a ser [6] com a entrada da nova tabela
|
|
instancia.showing = historico.tabelas [_detalhes.segments_amount] --> então ele volta a pegar o index [5] que antes era o index [4]
|
|
|
|
gump:Fade (instancia, _fadeType, _fadeSpeed, "barras")
|
|
instancia.showing[instancia.atributo].need_refresh = true
|
|
instancia.v_barras = true
|
|
instancia:ResetaGump()
|
|
instancia:AtualizaGumpPrincipal (true)
|
|
_detalhes:AtualizarJanela (instancia)
|
|
|
|
elseif (segmento < _detalhes.segments_amount and segmento > 0) then
|
|
instancia.showing = historico.tabelas [segmento]
|
|
|
|
gump:Fade (instancia, _fadeType, _fadeSpeed, "barras") --"in", nil
|
|
instancia.showing[instancia.atributo].need_refresh = true
|
|
instancia.v_barras = true
|
|
instancia:ResetaGump()
|
|
instancia:AtualizaGumpPrincipal (true)
|
|
_detalhes:AtualizarJanela (instancia)
|
|
end
|
|
|
|
end
|
|
|
|
local function ValidateAttribute (atributo, sub_atributo)
|
|
|
|
if (atributo == 1) then
|
|
if (sub_atributo < 0 or sub_atributo > _detalhes.atributos[1]) then
|
|
return false
|
|
end
|
|
elseif (atributo == 2) then
|
|
if (sub_atributo < 0 or sub_atributo > _detalhes.atributos[2]) then
|
|
return false
|
|
end
|
|
elseif (atributo == 3) then
|
|
if (sub_atributo < 0 or sub_atributo > _detalhes.atributos[3]) then
|
|
return false
|
|
end
|
|
elseif (atributo == 4) then
|
|
if (sub_atributo < 0 or sub_atributo > _detalhes.atributos[4]) then
|
|
return false
|
|
end
|
|
elseif (atributo == 5) then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
function _detalhes:SetDisplay (segmento, atributo, sub_atributo, iniciando_instancia, InstanceMode)
|
|
if (not self.meu_id) then
|
|
return
|
|
end
|
|
return self:TrocaTabela (segmento, atributo, sub_atributo, iniciando_instancia, InstanceMode)
|
|
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
|
|
segmento = instancia
|
|
instancia = self
|
|
end
|
|
|
|
if (_type (instancia) == "number") then
|
|
sub_atributo = atributo
|
|
atributo = segmento
|
|
segmento = instancia
|
|
instancia = self
|
|
end
|
|
|
|
if (InstanceMode and InstanceMode ~= instancia:GetMode()) then
|
|
instancia:AlteraModo (instancia, InstanceMode)
|
|
end
|
|
|
|
local update_coolTip = false
|
|
local sub_attribute_click = false
|
|
|
|
if (_type (segmento) == "boolean" and segmento) then --> clicou em um sub atributo
|
|
sub_attribute_click = true
|
|
segmento = instancia.segmento
|
|
|
|
elseif (segmento == -2) then --> clicou para mudar de segmento
|
|
segmento = instancia.segmento + 1
|
|
|
|
if (segmento > _detalhes.segments_amount) then
|
|
segmento = -1
|
|
end
|
|
update_coolTip = true
|
|
|
|
elseif (segmento == -3) then --> clicou para mudar de atributo
|
|
segmento = instancia.segmento
|
|
|
|
atributo = instancia.atributo+1
|
|
if (atributo > atributos[0]) then
|
|
atributo = 1
|
|
end
|
|
update_coolTip = true
|
|
|
|
elseif (segmento == -4) then --> clicou para mudar de sub atributo
|
|
segmento = instancia.segmento
|
|
|
|
sub_atributo = instancia.sub_atributo+1
|
|
if (sub_atributo > atributos[instancia.atributo]) then
|
|
sub_atributo = 1
|
|
end
|
|
update_coolTip = true
|
|
|
|
end
|
|
|
|
--> pega os atributos desta instancia
|
|
local current_segmento = instancia.segmento
|
|
local current_atributo = instancia.atributo
|
|
local current_sub_atributo = instancia.sub_atributo
|
|
|
|
local atributo_changed = false
|
|
|
|
--> verifica se os valores passados são válidos
|
|
|
|
if (not segmento) then
|
|
segmento = instancia.segmento
|
|
elseif (_type (segmento) ~= "number") then
|
|
segmento = instancia.segmento
|
|
end
|
|
|
|
if (not atributo) then
|
|
atributo = instancia.atributo
|
|
elseif (_type (atributo) ~= "number") then
|
|
atributo = instancia.atributo
|
|
end
|
|
|
|
if (not sub_atributo) then
|
|
if (atributo == current_atributo) then
|
|
sub_atributo = instancia.sub_atributo
|
|
else
|
|
sub_atributo = instancia.sub_atributo_last [atributo]
|
|
end
|
|
elseif (_type (sub_atributo) ~= "number") then
|
|
sub_atributo = instancia.sub_atributo
|
|
end
|
|
|
|
--> já esta mostrando isso que esta pedindo
|
|
if (not iniciando_instancia and segmento == current_segmento and atributo == current_atributo and sub_atributo == current_sub_atributo and not _detalhes.initializing) then
|
|
return
|
|
end
|
|
|
|
if (not ValidateAttribute (atributo, sub_atributo)) then
|
|
sub_atributo = 1
|
|
atributo = 1
|
|
_detalhes:Msg ("invalid attribute, switching to damage done.")
|
|
end
|
|
|
|
--> Muda o segmento caso necessário
|
|
if (segmento ~= current_segmento or _detalhes.initializing or iniciando_instancia) then
|
|
|
|
--> na troca de segmento, conferir se a instancia esta frozen
|
|
if (instancia.freezed) then
|
|
if (not iniciando_instancia) then
|
|
instancia:UnFreeze()
|
|
else
|
|
instancia.freezed = false
|
|
end
|
|
end
|
|
|
|
instancia.segmento = segmento
|
|
|
|
if (segmento == -1) then --> overall
|
|
instancia.showing = _detalhes.tabela_overall
|
|
elseif (segmento == 0) then --> combate atual
|
|
instancia.showing = _detalhes.tabela_vigente
|
|
else --> alguma tabela do histórico
|
|
instancia.showing = _detalhes.tabela_historico.tabelas [segmento]
|
|
end
|
|
|
|
if (update_coolTip) then
|
|
_detalhes.popup:Select (1, segmento+2)
|
|
end
|
|
|
|
if (instancia.showing and instancia.showing.contra) then
|
|
--print ("DEBUG: contra", instancia.showing.contra)
|
|
end
|
|
|
|
_detalhes:SendEvent ("DETAILS_INSTANCE_CHANGESEGMENT", nil, instancia, segmento)
|
|
|
|
if (_detalhes.instances_segments_locked and not iniciando_instancia) then
|
|
for _, instance in ipairs (_detalhes.tabela_instancias) do
|
|
if (instance.meu_id ~= instancia.meu_id and instance.ativa) then
|
|
if (instance.modo == 2 or instance.modo == 3) then
|
|
--> na troca de segmento, conferir se a instancia esta frozen
|
|
if (instance.freezed) then
|
|
if (not iniciando_instancia) then
|
|
instance:UnFreeze()
|
|
else
|
|
instance.freezed = false
|
|
end
|
|
end
|
|
|
|
instance.segmento = segmento
|
|
|
|
if (segmento == -1) then --> overall
|
|
instance.showing = _detalhes.tabela_overall
|
|
elseif (segmento == 0) then --> combate atual
|
|
instance.showing = _detalhes.tabela_vigente
|
|
else --> alguma tabela do histórico
|
|
instance.showing = _detalhes.tabela_historico.tabelas [segmento]
|
|
end
|
|
|
|
if (not instance.showing) then
|
|
if (not iniciando_instancia) then
|
|
instance:Freeze()
|
|
end
|
|
return
|
|
end
|
|
|
|
instance.v_barras = true
|
|
instance.showing [atributo].need_refresh = true
|
|
|
|
if (not _detalhes.initializing and not iniciando_instancia) then
|
|
instance:ResetaGump()
|
|
instance:AtualizaGumpPrincipal (true)
|
|
end
|
|
|
|
_detalhes:SendEvent ("DETAILS_INSTANCE_CHANGESEGMENT", nil, instance, segmento)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
--> Muda o atributo caso necessário
|
|
--print ("DEBUG atributos", instancia, segmento, atributo, sub_atributo, iniciando_instancia)
|
|
|
|
if (atributo == 5) then
|
|
if (#_detalhes.custom < 1) then
|
|
atributo = 1
|
|
sub_atributo = 1
|
|
end
|
|
end
|
|
|
|
if (atributo ~= current_atributo or _detalhes.initializing or iniciando_instancia or (instancia.modo == modo_alone or instancia.modo == modo_raid)) then
|
|
|
|
if (instancia.modo == modo_alone and not (_detalhes.initializing or iniciando_instancia)) then
|
|
if (_detalhes.SoloTables.Mode == #_detalhes.SoloTables.Plugins) then
|
|
_detalhes.popup:Select (1, 1)
|
|
else
|
|
if (_detalhes.PluginCount.SOLO > 0) then
|
|
_detalhes.popup:Select (1, _detalhes.SoloTables.Mode+1)
|
|
end
|
|
end
|
|
return _detalhes.SoloTables.switch (nil, nil, -1)
|
|
|
|
elseif ( (instancia.modo == modo_raid) and not (_detalhes.initializing or iniciando_instancia) ) then --> raid
|
|
return --nao faz nada quando clicar no botão
|
|
end
|
|
|
|
atributo_changed = true
|
|
instancia.atributo = atributo
|
|
instancia.sub_atributo = instancia.sub_atributo_last [atributo]
|
|
|
|
--> troca icone
|
|
instancia:ChangeIcon()
|
|
|
|
if (update_coolTip) then
|
|
_detalhes.popup:Select (1, atributo)
|
|
_detalhes.popup:Select (2, instancia.sub_atributo, atributo)
|
|
end
|
|
|
|
--_detalhes:SetTutorialCVar ("ATTRIBUTE_SELECT_TUTORIAL1", nil)
|
|
if (not _detalhes:GetTutorialCVar ("ATTRIBUTE_SELECT_TUTORIAL1") and not _detalhes.initializing and not iniciando_instancia) then
|
|
if (not _G ["DetailsWelcomeWindow"] or not _G ["DetailsWelcomeWindow"]:IsShown()) then
|
|
_detalhes:TutorialBookmark (instancia)
|
|
end
|
|
end
|
|
|
|
if (_detalhes.cloud_process) then
|
|
|
|
if (_detalhes.debug) then
|
|
_detalhes:Msg ("(debug) instancia #"..instancia.meu_id.." found cloud process.")
|
|
end
|
|
|
|
local atributo = instancia.atributo
|
|
local time_left = (_detalhes.last_data_requested+7) - _detalhes._tempo
|
|
|
|
if (atributo == 1 and _detalhes.in_combat and not _detalhes:CaptureGet ("damage") and _detalhes.host_by) then
|
|
if (_detalhes.debug) then
|
|
_detalhes:Msg ("(debug) instancia need damage cloud.")
|
|
end
|
|
elseif (atributo == 2 and _detalhes.in_combat and (not _detalhes:CaptureGet ("heal") or _detalhes:CaptureGet ("aura")) and _detalhes.host_by) then
|
|
if (_detalhes.debug) then
|
|
_detalhes:Msg ("(debug) instancia need heal cloud.")
|
|
end
|
|
elseif (atributo == 3 and _detalhes.in_combat and not _detalhes:CaptureGet ("energy") and _detalhes.host_by) then
|
|
if (_detalhes.debug) then
|
|
_detalhes:Msg ("(debug) instancia need energy cloud.")
|
|
end
|
|
elseif (atributo == 4 and _detalhes.in_combat and not _detalhes:CaptureGet ("miscdata") and _detalhes.host_by) then
|
|
if (_detalhes.debug) then
|
|
_detalhes:Msg ("(debug) instancia need misc cloud.")
|
|
end
|
|
else
|
|
time_left = nil
|
|
end
|
|
|
|
if (time_left) then
|
|
if (_detalhes.debug) then
|
|
_detalhes:Msg ("(debug) showing instance alert.")
|
|
end
|
|
instancia:InstanceAlert (Loc ["STRING_PLEASE_WAIT"], {[[Interface\COMMON\StreamCircle]], 22, 22, true}, time_left)
|
|
end
|
|
end
|
|
|
|
_detalhes:InstanceCall (_detalhes.CheckPsUpdate)
|
|
_detalhes:SendEvent ("DETAILS_INSTANCE_CHANGEATTRIBUTE", nil, instancia, atributo, sub_atributo)
|
|
|
|
end
|
|
|
|
if (sub_atributo ~= current_sub_atributo or _detalhes.initializing or iniciando_instancia or atributo_changed) then
|
|
|
|
instancia.sub_atributo = sub_atributo
|
|
|
|
if (sub_attribute_click) then
|
|
--print ("aqui", instancia.sub_atributo)
|
|
instancia.sub_atributo_last [instancia.atributo] = instancia.sub_atributo
|
|
end
|
|
|
|
if (instancia.atributo == 5) then --> custom
|
|
instancia:ChangeIcon()
|
|
end
|
|
|
|
_detalhes:InstanceCall (_detalhes.CheckPsUpdate)
|
|
_detalhes:SendEvent ("DETAILS_INSTANCE_CHANGEATTRIBUTE", nil, instancia, atributo, sub_atributo)
|
|
end
|
|
|
|
if (_detalhes.janela_info:IsShown() and instancia == _detalhes.janela_info.instancia) then
|
|
if (not instancia.showing or instancia.atributo > 4) then
|
|
_detalhes:FechaJanelaInfo()
|
|
else
|
|
local actor = instancia.showing (instancia.atributo, _detalhes.janela_info.jogador.nome)
|
|
if (actor) then
|
|
instancia:AbreJanelaInfo (actor, true)
|
|
else
|
|
_detalhes:FechaJanelaInfo()
|
|
end
|
|
end
|
|
--_detalhes:FechaJanelaInfo()
|
|
end
|
|
|
|
if (not instancia.showing) then
|
|
if (not iniciando_instancia) then
|
|
instancia:Freeze()
|
|
end
|
|
return
|
|
else
|
|
--> verificar relogio, precisaria dar refresh no plugin clock
|
|
end
|
|
|
|
instancia.v_barras = true
|
|
|
|
instancia.showing [atributo].need_refresh = true
|
|
|
|
if (not _detalhes.initializing and not iniciando_instancia) then
|
|
instancia:ResetaGump()
|
|
--print ("atualizando: ", instancia.atributo, instancia.sub_atributo)
|
|
instancia:AtualizaGumpPrincipal (true)
|
|
end
|
|
|
|
end
|
|
|
|
function _detalhes:GetRaidPluginName()
|
|
return self.current_raid_plugin or self.last_raid_plugin
|
|
end
|
|
|
|
function _detalhes:GetInstanceAttributeText()
|
|
|
|
if (self.modo == modo_grupo or self.modo == modo_all) then
|
|
local attribute = self.atributo
|
|
local sub_attribute = self.sub_atributo
|
|
local name = _detalhes:GetSubAttributeName (attribute, sub_attribute)
|
|
return name or "Unknown"
|
|
|
|
elseif (self.modo == modo_raid) then
|
|
local plugin_name = self.current_raid_plugin or self.last_raid_plugin
|
|
if (plugin_name) then
|
|
local plugin_object = _detalhes:GetPlugin (plugin_name)
|
|
if (plugin_object) then
|
|
return plugin_object.__name
|
|
else
|
|
return "Unknown Plugin"
|
|
end
|
|
else
|
|
return "Unknown Plugin"
|
|
end
|
|
|
|
elseif (self.modo == modo_alone) then
|
|
local atributo = _detalhes.SoloTables.Mode or 1
|
|
local SoloInfo = _detalhes.SoloTables.Menu [atributo]
|
|
if (SoloInfo) then
|
|
return SoloInfo [1]
|
|
else
|
|
return "Unknown Plugin"
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
function _detalhes:MontaRaidOption (instancia)
|
|
|
|
local available_plugins = _detalhes.RaidTables:GetAvailablePlugins()
|
|
|
|
if (#available_plugins == 0) then
|
|
return false
|
|
end
|
|
|
|
local amount = 0
|
|
for index, ptable in _ipairs (available_plugins) do
|
|
if (ptable [3].__enabled) then
|
|
GameCooltip:AddMenu (1, _detalhes.RaidTables.switch, ptable [4], instancia, nil, ptable [1], ptable [2], true) --PluginName, PluginIcon, PluginObject, PluginAbsoluteName
|
|
amount = amount + 1
|
|
end
|
|
end
|
|
|
|
if (amount == 0) then
|
|
return false
|
|
end
|
|
|
|
GameCooltip:SetOption ("NoLastSelectedBar", true)
|
|
|
|
GameCooltip:SetWallpaper (1, [[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0, 0.64453125}, {1, 1, 1, 0.1}, true)
|
|
return true
|
|
end
|
|
|
|
function _detalhes:MontaSoloOption (instancia)
|
|
for index, ptable in _ipairs (_detalhes.SoloTables.Menu) do
|
|
if (ptable [3].__enabled) then
|
|
GameCooltip:AddMenu (1, _detalhes.SoloTables.switch, index, nil, nil, ptable [1], ptable [2], true)
|
|
end
|
|
end
|
|
|
|
if (_detalhes.SoloTables.Mode) then
|
|
GameCooltip:SetLastSelected (1, _detalhes.SoloTables.Mode)
|
|
end
|
|
|
|
GameCooltip:SetWallpaper (1, [[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0, 0.64453125}, {1, 1, 1, 0.1}, true)
|
|
|
|
return true
|
|
end
|
|
|
|
-- ~menu
|
|
|
|
local wallpaper_bg_color = {.8, .8, .8, 0.2}
|
|
function _detalhes:MontaAtributosOption (instancia, func)
|
|
|
|
func = func or instancia.TrocaTabela
|
|
|
|
local checked1 = instancia.atributo
|
|
local atributo_ativo = instancia.atributo --> pega o numero
|
|
|
|
local options
|
|
if (atributo_ativo == 5) then --> custom
|
|
options = {Loc ["STRING_CUSTOM_NEW"]}
|
|
for index, custom in _ipairs (_detalhes.custom) do
|
|
options [#options+1] = custom.name
|
|
end
|
|
else
|
|
options = sub_atributos [atributo_ativo].lista
|
|
end
|
|
|
|
local icones = {
|
|
"Interface\\AddOns\\Details\\images\\atributos_icones_damage",
|
|
"Interface\\AddOns\\Details\\images\\atributos_icones_heal",
|
|
"Interface\\AddOns\\Details\\images\\atributos_icones_energyze",
|
|
"Interface\\AddOns\\Details\\images\\atributos_icones_misc"
|
|
}
|
|
|
|
local CoolTip = _G.GameCooltip
|
|
local p = 0.125 --> 32/256
|
|
|
|
local gindex = 1
|
|
for i = 1, atributos[0] do --> [0] armazena quantos atributos existem
|
|
|
|
CoolTip:AddMenu (1, func, nil, i, nil, atributos.lista[i], nil, true)
|
|
CoolTip:AddIcon ("Interface\\AddOns\\Details\\images\\atributos_icones", 1, 1, 20, 20, p*(i-1), p*(i), 0, 1)
|
|
|
|
if (i == 1) then
|
|
CoolTip:SetWallpaper (2, [[Interface\TALENTFRAME\WarlockDestruction-TopLeft]], {1, 0.22, 0, 0.55}, wallpaper_bg_color)
|
|
elseif (i == 2) then
|
|
--CoolTip:SetWallpaper (2, [[Interface\TALENTFRAME\PriestHoly-TopLeft]], {0, .8, 0, 1}, {1, 1, 1, .1})
|
|
CoolTip:SetWallpaper (2, [[Interface\TALENTFRAME\bg-priest-holy]], {1, .6, 0, .2}, wallpaper_bg_color)
|
|
elseif (i == 3) then
|
|
CoolTip:SetWallpaper (2, [[Interface\TALENTFRAME\ShamanEnhancement-TopLeft]], {0, 1, .2, .6}, wallpaper_bg_color)
|
|
elseif (i == 4) then
|
|
CoolTip:SetWallpaper (2, [[Interface\TALENTFRAME\WarlockCurses-TopLeft]], {.2, 1, 0, 1}, wallpaper_bg_color)
|
|
end
|
|
|
|
local options = sub_atributos [i].lista
|
|
|
|
for o = 1, atributos [i] do
|
|
if (_detalhes:CaptureIsEnabled ( _detalhes.atributos_capture [gindex] )) then
|
|
CoolTip:AddMenu (2, func, true, i, o, options[o], nil, true)
|
|
CoolTip:AddIcon (icones[i], 2, 1, 20, 20, p*(o-1), p*(o), 0, 1)
|
|
else
|
|
CoolTip:AddLine (options[o], nil, 2, .5, .5, .5, 1)
|
|
CoolTip:AddMenu (2, func, true, i, o)
|
|
CoolTip:AddIcon (icones[i], 2, 1, 20, 20, p*(o-1), p*(o), 0, 1, {.3, .3, .3, 1})
|
|
end
|
|
|
|
gindex = gindex + 1
|
|
end
|
|
|
|
CoolTip:SetLastSelected (2, i, instancia.sub_atributo_last [i])
|
|
end
|
|
|
|
--> custom
|
|
|
|
--GameCooltip:AddLine ("$div")
|
|
CoolTip:AddLine ("$div", nil, 1, -3, 1)
|
|
|
|
CoolTip:AddMenu (1, func, nil, 5, nil, atributos.lista[5], nil, true)
|
|
CoolTip:AddIcon ("Interface\\AddOns\\Details\\images\\atributos_icones", 1, 1, 20, 20, p*(5-1), p*(5), 0, 1)
|
|
|
|
CoolTip:AddMenu (2, _detalhes.OpenCustomDisplayWindow, nil, nil, nil, Loc ["STRING_CUSTOM_NEW"], nil, true)
|
|
CoolTip:AddIcon ([[Interface\CHATFRAME\UI-ChatIcon-Maximize-Up]], 2, 1, 20, 20, 3/32, 29/32, 3/32, 29/32)
|
|
|
|
CoolTip:AddLine ("$div", nil, 2, nil, -8, -13)
|
|
|
|
for index, custom in _ipairs (_detalhes.custom) do
|
|
if (custom.temp) then
|
|
CoolTip:AddLine (custom.name .. Loc ["STRING_CUSTOM_TEMPORARILY"], nil, 2)
|
|
else
|
|
CoolTip:AddLine (custom.name, nil, 2)
|
|
end
|
|
|
|
CoolTip:AddMenu (2, func, true, 5, index)
|
|
CoolTip:AddIcon (custom.icon, 2, 1, 20, 20)
|
|
end
|
|
|
|
--> set the wallpaper on custom
|
|
GameCooltip:SetWallpaper (2, [[Interface\TALENTFRAME\WarriorArm-TopLeft]], {1, 0, 0, 1}, wallpaper_bg_color)
|
|
|
|
if (#_detalhes.custom == 0) then
|
|
CoolTip:SetLastSelected (2, 6, 2)
|
|
else
|
|
if (instancia.atributo == 5) then
|
|
CoolTip:SetLastSelected (2, 6, instancia.sub_atributo+2)
|
|
else
|
|
CoolTip:SetLastSelected (2, 6, instancia.sub_atributo_last [5]+2)
|
|
end
|
|
end
|
|
|
|
CoolTip:SetOption ("StatusBarTexture", [[Interface\AddOns\Details\images\bar4_vidro]])
|
|
CoolTip:SetOption ("ButtonsYMod", -7)
|
|
CoolTip:SetOption ("ButtonsYModSub", -7)
|
|
CoolTip:SetOption ("HeighMod", 8)
|
|
CoolTip:SetOption ("HeighModSub", 8)
|
|
|
|
CoolTip:SetOption ("SelectedTopAnchorMod", -2)
|
|
CoolTip:SetOption ("SelectedBottomAnchorMod", 2)
|
|
|
|
CoolTip:SetOption ("TextFont", _detalhes.font_faces.menus)
|
|
|
|
local last_selected = atributo_ativo
|
|
if (atributo_ativo == 5) then
|
|
last_selected = 6
|
|
end
|
|
CoolTip:SetLastSelected (1, last_selected)
|
|
|
|
CoolTip:SetWallpaper (1, [[Interface\SPELLBOOK\DeathKnightBlood-TopLeft]], {.6, 0.1, 0, 0.64453125}, wallpaper_bg_color, true)
|
|
--CoolTip:SetWallpaper (1, [[Interface\ACHIEVEMENTFRAME\UI-Achievement-Parchment-Horizontal-Desaturated]], nil, {1, 1, 1, 0.3})
|
|
|
|
return menu_principal, sub_menus
|
|
end
|
|
|
|
--> O Modo não vai afetar a tabela do SHOWING.
|
|
-- o modo é apenas afetado na hora de mostrar o que na tabela
|
|
|
|
function _detalhes:ChangeIcon (icon)
|
|
|
|
local skin = _detalhes.skins [self.skin]
|
|
|
|
--print (debugstack())
|
|
|
|
if (not self.hide_icon) then
|
|
if (skin.icon_on_top) then
|
|
self.baseframe.cabecalho.atributo_icon:SetParent (self.floatingframe)
|
|
else
|
|
self.baseframe.cabecalho.atributo_icon:SetParent (self.baseframe)
|
|
end
|
|
end
|
|
|
|
if (icon) then
|
|
|
|
--> plugin chamou uma troca de icone
|
|
self.baseframe.cabecalho.atributo_icon:SetTexture (icon)
|
|
self.baseframe.cabecalho.atributo_icon:SetTexCoord (5/64, 60/64, 3/64, 62/64)
|
|
|
|
local icon_size = skin.icon_plugins_size
|
|
self.baseframe.cabecalho.atributo_icon:SetWidth (icon_size[1])
|
|
self.baseframe.cabecalho.atributo_icon:SetHeight (icon_size[2])
|
|
local icon_anchor = skin.icon_anchor_plugins
|
|
self.baseframe.cabecalho.atributo_icon:SetPoint ("TOPRIGHT", self.baseframe.cabecalho.ball_point, "TOPRIGHT", icon_anchor[1], icon_anchor[2])
|
|
|
|
elseif (self.modo == modo_alone) then --> solo
|
|
-- o icone é alterado pelo próprio plugin
|
|
|
|
elseif (self.modo == modo_grupo or self.modo == modo_all) then --> grupo
|
|
|
|
if (self.atributo == 5) then
|
|
--> custom
|
|
if (_detalhes.custom [self.sub_atributo]) then
|
|
local icon = _detalhes.custom [self.sub_atributo].icon
|
|
self.baseframe.cabecalho.atributo_icon:SetTexture (icon)
|
|
self.baseframe.cabecalho.atributo_icon:SetTexCoord (5/64, 60/64, 3/64, 62/64)
|
|
|
|
local icon_size = skin.icon_plugins_size
|
|
self.baseframe.cabecalho.atributo_icon:SetWidth (icon_size[1])
|
|
self.baseframe.cabecalho.atributo_icon:SetHeight (icon_size[2])
|
|
local icon_anchor = skin.icon_anchor_plugins
|
|
self.baseframe.cabecalho.atributo_icon:SetPoint ("TOPRIGHT", self.baseframe.cabecalho.ball_point, "TOPRIGHT", icon_anchor[1], icon_anchor[2])
|
|
end
|
|
else
|
|
--> normal
|
|
local half = 0.00048828125
|
|
local size = 0.03125
|
|
|
|
--normal icons
|
|
--local icones = _detalhes.sub_atributos [self.atributo].icones
|
|
--self.baseframe.cabecalho.atributo_icon:SetTexture (icones [self.sub_atributo] [1])
|
|
--self.baseframe.cabecalho.atributo_icon:SetTexCoord ( unpack (icones [self.sub_atributo] [2]) )
|
|
|
|
self.baseframe.cabecalho.atributo_icon:SetTexture (skin.file)
|
|
self.baseframe.cabecalho.atributo_icon:SetTexCoord ( (0.03125 * (self.atributo-1)) + half, (0.03125 * self.atributo) - half, 0.35693359375, 0.38720703125)
|
|
|
|
local icon_anchor = skin.icon_anchor_main
|
|
self.baseframe.cabecalho.atributo_icon:SetPoint ("TOPRIGHT", self.baseframe.cabecalho.ball_point, "TOPRIGHT", icon_anchor[1], icon_anchor[2])
|
|
|
|
self.baseframe.cabecalho.atributo_icon:SetWidth (32)
|
|
self.baseframe.cabecalho.atributo_icon:SetHeight (32)
|
|
end
|
|
|
|
elseif (self.modo == modo_raid) then --> raid
|
|
-- o icone é alterado pelo próprio plugin
|
|
end
|
|
end
|
|
|
|
function _detalhes:SetMode (qual)
|
|
return self:AlteraModo (qual)
|
|
end
|
|
|
|
function _detalhes:AlteraModo (instancia, qual, from_mode_menu)
|
|
|
|
if (_type (instancia) == "number") then
|
|
qual = instancia
|
|
instancia = self
|
|
end
|
|
|
|
local update_coolTip = false
|
|
|
|
if (qual == -2) then --clicou para mudar
|
|
local update_coolTip = true
|
|
|
|
if (instancia.modo == 1) then
|
|
qual = 2
|
|
elseif (instancia.modo == 2) then
|
|
qual = 3
|
|
elseif (instancia.modo == 3) then
|
|
qual = 4
|
|
elseif (instancia.modo == 4) then
|
|
qual = 1
|
|
end
|
|
end
|
|
|
|
if (instancia.showing) then
|
|
if (not instancia.atributo) then
|
|
instancia.atributo = 1
|
|
instancia.sub_atributo = 1
|
|
--print ("Details found a internal probleam and fixed: 'instancia.atributo' were null, now is 1.")
|
|
end
|
|
if (not instancia.showing[instancia.atributo]) then
|
|
instancia.showing = _detalhes.tabela_vigente
|
|
--print ("Details found a internal problem and fixed: container for instancia.showing were null, now is current combat.")
|
|
end
|
|
instancia.atributo = instancia.atributo or 1
|
|
instancia.showing[instancia.atributo].need_refresh = true
|
|
end
|
|
|
|
if (qual == modo_alone) then
|
|
|
|
instancia.LastModo = instancia.modo
|
|
|
|
if (instancia:IsRaidMode()) then
|
|
_detalhes.RaidTables:DisableRaidMode (instancia)
|
|
end
|
|
|
|
--> verifica se ja tem alguma instancia desativada em solo e remove o solo dela
|
|
_detalhes:InstanciaCallFunctionOffline (_detalhes.InstanciaCheckForDisabledSolo)
|
|
|
|
instancia.modo = modo_alone
|
|
instancia:ChangeIcon()
|
|
|
|
instancia:SoloMode (true)
|
|
_detalhes:SendEvent ("DETAILS_INSTANCE_CHANGEMODE", nil, instancia, modo_alone)
|
|
|
|
elseif (qual == modo_raid) then
|
|
|
|
instancia.LastModo = instancia.modo
|
|
|
|
if (instancia:IsSoloMode()) then
|
|
instancia:SoloMode (false)
|
|
end
|
|
|
|
--_detalhes:InstanciaCallFunctionOffline (_detalhes.InstanciaCheckForDisabledRaid)
|
|
|
|
instancia.modo = modo_raid
|
|
instancia:ChangeIcon()
|
|
|
|
_detalhes.RaidTables:EnableRaidMode (instancia)
|
|
|
|
_detalhes:SendEvent ("DETAILS_INSTANCE_CHANGEMODE", nil, instancia, modo_raid)
|
|
|
|
elseif (qual == modo_grupo) then
|
|
|
|
instancia.LastModo = instancia.modo
|
|
|
|
if (instancia:IsSoloMode()) then
|
|
--instancia.modo = modo_grupo
|
|
instancia:SoloMode (false)
|
|
elseif (instancia:IsRaidMode()) then
|
|
_detalhes.RaidTables:DisableRaidMode (instancia)
|
|
end
|
|
|
|
_detalhes:ResetaGump (instancia)
|
|
--gump:Fade (instancia, 1, nil, "barras")
|
|
|
|
instancia.modo = modo_grupo
|
|
instancia:ChangeIcon()
|
|
|
|
instancia:AtualizaGumpPrincipal (true)
|
|
instancia.last_modo = modo_grupo
|
|
_detalhes:SendEvent ("DETAILS_INSTANCE_CHANGEMODE", nil, instancia, modo_grupo)
|
|
_detalhes:SendEvent ("DETAILS_INSTANCE_CHANGEATTRIBUTE", nil, instancia, instancia.atributo, instancia.sub_atributo)
|
|
|
|
elseif (qual == modo_all) then
|
|
|
|
instancia.LastModo = instancia.modo
|
|
|
|
if (instancia:IsSoloMode()) then
|
|
instancia.modo = modo_all
|
|
instancia:SoloMode (false)
|
|
|
|
elseif (instancia:IsRaidMode()) then
|
|
_detalhes.RaidTables:DisableRaidMode (instancia)
|
|
end
|
|
|
|
instancia.modo = modo_all
|
|
instancia:ChangeIcon()
|
|
|
|
instancia:AtualizaGumpPrincipal (true)
|
|
instancia.last_modo = modo_all
|
|
_detalhes:SendEvent ("DETAILS_INSTANCE_CHANGEMODE", nil, instancia, modo_all)
|
|
_detalhes:SendEvent ("DETAILS_INSTANCE_CHANGEATTRIBUTE", nil, instancia, instancia.atributo, instancia.sub_atributo)
|
|
end
|
|
|
|
local checked
|
|
if (instancia.modo == 1) then
|
|
checked = 4
|
|
elseif (instancia.modo == 2) then
|
|
checked = 1
|
|
elseif (instancia.modo == 3) then
|
|
checked = 2
|
|
elseif (instancia.modo == 4) then
|
|
checked = 3
|
|
end
|
|
|
|
_detalhes.popup:Select (1, checked)
|
|
|
|
if (from_mode_menu) then
|
|
instancia.baseframe.cabecalho.modo_selecao:GetScript ("OnEnter")(instancia.baseframe.cabecalho.modo_selecao)
|
|
|
|
--> running OnEnter does also trigger an instance enter event, so we need to manually leave the instance:
|
|
_detalhes.OnLeaveMainWindow (instancia, instancia.baseframe.cabecalho.modo_selecao)
|
|
|
|
if (instancia.desaturated_menu) then
|
|
instancia.baseframe.cabecalho.modo_selecao:GetNormalTexture():SetDesaturated (true)
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
local function GetDpsHps (_thisActor, key)
|
|
|
|
local keyname
|
|
if (key == "dps") then
|
|
keyname = "last_dps"
|
|
elseif (key == "hps") then
|
|
keyname = "last_hps"
|
|
end
|
|
|
|
if (_thisActor [keyname]) then
|
|
return _thisActor [keyname]
|
|
else
|
|
if ((_detalhes.time_type == 2 and _thisActor.grupo) or not _detalhes:CaptureGet ("damage")) then
|
|
local dps = _thisActor.total / _thisActor:GetCombatTime()
|
|
_thisActor [keyname] = dps
|
|
return dps
|
|
else
|
|
if (not _thisActor.on_hold) then
|
|
local dps = _thisActor.total/_thisActor:Tempo() --calcula o dps deste objeto
|
|
_thisActor [keyname] = dps --salva o dps dele
|
|
return dps
|
|
else
|
|
if (_thisActor [keyname] == 0) then --> não calculou o dps dele ainda mas entrou em standby
|
|
local dps = _thisActor.total/_thisActor:Tempo()
|
|
_thisActor [keyname] = dps
|
|
return dps
|
|
else
|
|
return _thisActor [keyname]
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--> Reportar o que esta na janela da instância
|
|
function _detalhes:monta_relatorio (este_relatorio, custom)
|
|
|
|
if (custom) then
|
|
--> shrink
|
|
local report_lines = {}
|
|
for i = 1, _detalhes.report_lines+1, 1 do --#este_relatorio -- o +1 é pq ele conta o cabeçalho como uma linha
|
|
report_lines [#report_lines+1] = este_relatorio[i]
|
|
end
|
|
|
|
return self:envia_relatorio (report_lines, true)
|
|
end
|
|
|
|
local amt = _detalhes.report_lines
|
|
|
|
local report_lines = {}
|
|
|
|
if (self.atributo == 5) then --> custom
|
|
if (self.segmento == -1) then --overall
|
|
report_lines [#report_lines+1] = "Details!: " .. Loc ["STRING_OVERALL"] .. " " .. self.customName .. " " .. Loc ["STRING_CUSTOM_REPORT"]
|
|
else
|
|
report_lines [#report_lines+1] = "Details!: " .. self.customName .. " " .. Loc ["STRING_CUSTOM_REPORT"]
|
|
end
|
|
|
|
else
|
|
if (self.segmento == -1) then --overall
|
|
report_lines [#report_lines+1] = "Details!: " .. Loc ["STRING_OVERALL"] .. " " .. _detalhes.sub_atributos [self.atributo].lista [self.sub_atributo]
|
|
else
|
|
report_lines [#report_lines+1] = "Details!: " .. _detalhes.sub_atributos [self.atributo].lista [self.sub_atributo]
|
|
end
|
|
end
|
|
|
|
local barras = self.barras
|
|
local esta_barra
|
|
|
|
local is_current = _G ["Details_Report_CB_1"]:GetChecked()
|
|
local is_reverse = _G ["Details_Report_CB_2"]:GetChecked()
|
|
|
|
if (not _detalhes.fontstring_len) then
|
|
_detalhes.fontstring_len = _detalhes.listener:CreateFontString (nil, "background", "GameFontNormal")
|
|
end
|
|
local _, fontSize = FCF_GetChatWindowInfo (1)
|
|
if (fontSize < 1) then
|
|
fontSize = 10
|
|
end
|
|
local fonte, _, flags = _detalhes.fontstring_len:GetFont()
|
|
_detalhes.fontstring_len:SetFont (fonte, fontSize, flags)
|
|
_detalhes.fontstring_len:SetText ("hello details!")
|
|
local default_len = _detalhes.fontstring_len:GetStringWidth()
|
|
|
|
local name_member = "nome"
|
|
|
|
--> pegar a font do chat
|
|
--_detalhes.fontstring_len:
|
|
|
|
if (not is_reverse) then
|
|
|
|
if (not is_current) then
|
|
--> assumindo que self é sempre uma instância aqui.
|
|
local total, keyName, keyNameSec, first
|
|
local container_amount = 0
|
|
local atributo = self.atributo
|
|
local container = self.showing [atributo]._ActorTable
|
|
|
|
if (atributo == 1) then --> damage
|
|
|
|
if (self.sub_atributo == 5) then --> frags
|
|
local frags = self.showing.frags
|
|
local reportarFrags = {}
|
|
for name, amount in pairs (frags) do
|
|
--> string para imprimir direto sem calculos
|
|
reportarFrags [#reportarFrags+1] = {frag = tostring (amount), nome = name}
|
|
end
|
|
container = reportarFrags
|
|
container_amount = #reportarFrags
|
|
keyName = "frag"
|
|
|
|
elseif (self.sub_atributo == 7) then --> auras e voidzones
|
|
|
|
total, keyName, first, container_amount, container = _detalhes.atributo_damage:RefreshWindow (self, self.showing, true, true)
|
|
|
|
|
|
else
|
|
total, keyName, first, container_amount = _detalhes.atributo_damage:RefreshWindow (self, self.showing, true, true)
|
|
if (self.sub_atributo == 1) then
|
|
keyNameSec = "dps"
|
|
elseif (self.sub_atributo == 2) then
|
|
|
|
end
|
|
end
|
|
elseif (atributo == 2) then --> heal
|
|
total, keyName, first, container_amount = _detalhes.atributo_heal:RefreshWindow (self, self.showing, true, true)
|
|
|
|
if (self.sub_atributo == 1) then
|
|
keyNameSec = "hps"
|
|
end
|
|
elseif (atributo == 3) then --> energy
|
|
total, keyName, first, container_amount = _detalhes.atributo_energy:RefreshWindow (self, self.showing, true, true)
|
|
elseif (atributo == 4) then --> misc
|
|
if (self.sub_atributo == 5) then --> mortes
|
|
|
|
local mortes = self.showing.last_events_tables
|
|
local reportarMortes = {}
|
|
for index, morte in ipairs (mortes) do
|
|
reportarMortes [#reportarMortes+1] = {dead = morte [6], nome = morte [3]:gsub (("%-.*"), "")}
|
|
end
|
|
container = reportarMortes
|
|
container_amount = #reportarMortes
|
|
keyName = "dead"
|
|
else
|
|
total, keyName, first, container_amount = _detalhes.atributo_misc:RefreshWindow (self, self.showing, true, true)
|
|
end
|
|
elseif (atributo == 5) then --> custom
|
|
|
|
if (_detalhes.custom [self.sub_atributo]) then
|
|
total, container, first, container_amount, nm = _detalhes.atributo_custom:RefreshWindow (self, self.showing, true, true)
|
|
if (nm) then
|
|
name_member = nm
|
|
print ("nm:", nm)
|
|
end
|
|
keyName = "report_value"
|
|
else
|
|
total, keyName, first, container_amount = _detalhes.atributo_damage:RefreshWindow (self, self.showing, true, true)
|
|
total = 1
|
|
atributo = 1
|
|
container = self.showing [atributo]._ActorTable
|
|
end
|
|
--print (total, keyName, first, atributo, container_amount)
|
|
end
|
|
|
|
amt = math.min (amt, container_amount or 0)
|
|
--amt é zero
|
|
for i = 1, amt do
|
|
local _thisActor = container [i]
|
|
|
|
if (_thisActor) then
|
|
|
|
local amount, is_string
|
|
if (type (_thisActor [keyName]) == "number") then
|
|
amount = _math_floor (_thisActor [keyName])
|
|
else
|
|
amount = _thisActor [keyName]
|
|
is_string = true
|
|
end
|
|
|
|
local name = _thisActor [name_member] .. " "
|
|
if (_detalhes.remove_realm_from_name and name:find ("-")) then
|
|
name = name:gsub (("%-.*"), "")
|
|
end
|
|
|
|
_detalhes.fontstring_len:SetText (name)
|
|
local stringlen = _detalhes.fontstring_len:GetStringWidth()
|
|
|
|
while (stringlen < default_len) do
|
|
name = name .. "."
|
|
_detalhes.fontstring_len:SetText (name)
|
|
stringlen = _detalhes.fontstring_len:GetStringWidth()
|
|
end
|
|
|
|
local percent
|
|
|
|
if (self.atributo == 2 and self.sub_atributo == 3) then --overheal
|
|
percent = _cstr ("%.1f", _thisActor.totalover / (_thisActor.totalover + _thisActor.total) * 100)
|
|
elseif (not is_string) then
|
|
percent = _cstr ("%.1f", amount/total*100)
|
|
end
|
|
|
|
if (_type (amount) == "number" and amount > 0) then
|
|
if (keyNameSec) then
|
|
local dps = GetDpsHps (_thisActor, keyNameSec)
|
|
if (_detalhes.report_schema == 1) then
|
|
report_lines [#report_lines+1] = i .. ". " .. name .. " " .. _detalhes:ToKMin ( _math_floor (amount) ) .. " (" .. _detalhes:ToKMin (_math_floor (dps)) .. ", " .. percent .. "%)"
|
|
elseif (_detalhes.report_schema == 2) then
|
|
report_lines [#report_lines+1] = i .. ". " .. name .. " " .. percent .. "% (" .. _detalhes:ToKMin (_math_floor (dps)) .. ", " .. _detalhes:ToKMin ( _math_floor (amount)) .. ")"
|
|
elseif (_detalhes.report_schema == 3) then
|
|
report_lines [#report_lines+1] = i .. ". " .. name .. " " .. percent .. "% (" .. _detalhes:ToKMin ( _math_floor (amount) ) .. ", " .. _detalhes:ToKMin (_math_floor (dps)) .. ")"
|
|
end
|
|
else
|
|
if (_detalhes.report_schema == 1) then
|
|
report_lines [#report_lines+1] = i .. ". " .. name .. " " .. _detalhes:ToKReport (amount) .. " (" .. percent .. "%)"
|
|
else
|
|
report_lines [#report_lines+1] = i .. ". " .. name .. " " .. percent .. "% (" .. _detalhes:ToKReport (amount) .. ")"
|
|
end
|
|
end
|
|
|
|
elseif (_type (amount) == "string") then
|
|
|
|
report_lines [#report_lines+1] = i .. ". " .. name .. " " .. amount
|
|
|
|
else
|
|
break
|
|
end
|
|
else
|
|
break
|
|
end
|
|
end
|
|
|
|
else
|
|
for i = 1, amt do
|
|
local ROW = self.barras [i]
|
|
if (ROW) then
|
|
if (not ROW.hidden or ROW.fading_out) then --> a barra esta visivel na tela
|
|
report_lines [#report_lines+1] = ROW.texto_esquerdo:GetText().." ".. ROW.texto_direita:GetText()
|
|
else
|
|
break
|
|
end
|
|
else
|
|
break --> chegou a final, parar de pegar as linhas
|
|
end
|
|
end
|
|
end
|
|
|
|
else --> é reverso
|
|
report_lines[1] = report_lines[1].." (" .. Loc ["STRING_REPORTFRAME_REVERTED"] .. ")"
|
|
|
|
if (not is_current) then
|
|
--> assumindo que self é sempre uma instância aqui.
|
|
local total, keyName, first, container_amount
|
|
local atributo = self.atributo
|
|
|
|
local container = self.showing [atributo]._ActorTable
|
|
local quantidade = 0
|
|
|
|
if (atributo == 1) then --> damage
|
|
if (self.sub_atributo == 5) then --> frags
|
|
local frags = self.showing.frags
|
|
local reportarFrags = {}
|
|
for name, amount in pairs (frags) do
|
|
--> string para imprimir direto sem calculos
|
|
reportarFrags [#reportarFrags+1] = {frag = tostring (amount), nome = name}
|
|
end
|
|
container = reportarFrags
|
|
keyName = "frag"
|
|
else
|
|
if (self.sub_atributo == 1) then
|
|
keyNameSec = "dps"
|
|
end
|
|
total, keyName, first, container_amount = _detalhes.atributo_damage:RefreshWindow (self, self.showing, true, true)
|
|
end
|
|
elseif (atributo == 2) then --> heal
|
|
total, keyName, first, container_amount = _detalhes.atributo_heal:RefreshWindow (self, self.showing, true, true)
|
|
if (self.sub_atributo == 1) then
|
|
keyNameSec = "hps"
|
|
end
|
|
elseif (atributo == 3) then --> energy
|
|
total, keyName, first, container_amount = _detalhes.atributo_energy:RefreshWindow (self, self.showing, true, true)
|
|
elseif (atributo == 4) then --> misc
|
|
if (self.sub_atributo == 5) then --> mortes
|
|
local mortes = self.showing.last_events_tables
|
|
local reportarMortes = {}
|
|
for index, morte in ipairs (mortes) do
|
|
reportarMortes [#reportarMortes+1] = {dead = morte [6], nome = morte [3]:gsub (("%-.*"), "")}
|
|
end
|
|
container = reportarMortes
|
|
keyName = "dead"
|
|
else
|
|
total, keyName, first, container_amount = _detalhes.atributo_misc:RefreshWindow (self, self.showing, true, true)
|
|
end
|
|
elseif (atributo == 5) then --> custom
|
|
total, container, first, container_amount, nm = _detalhes.atributo_custom:RefreshWindow (self, self.showing, true, true)
|
|
if (nm) then
|
|
name_member = nm
|
|
end
|
|
keyName = "report_value"
|
|
end
|
|
|
|
local this_amt = math.min (#container, container_amount or 0, amt)
|
|
this_amt = #container - this_amt
|
|
|
|
for i = container_amount, this_amt, -1 do
|
|
|
|
local _thisActor = container [i]
|
|
if (_thisActor) then
|
|
|
|
local amount
|
|
if (type (_thisActor [keyName]) == "number") then
|
|
amount = _math_floor (_thisActor [keyName])
|
|
else
|
|
amount = _thisActor [keyName]
|
|
end
|
|
|
|
local name = _thisActor [name_member] .. " "
|
|
|
|
_detalhes.fontstring_len:SetText (name)
|
|
local stringlen = _detalhes.fontstring_len:GetStringWidth()
|
|
|
|
while (stringlen < default_len) do
|
|
name = name .. "."
|
|
_detalhes.fontstring_len:SetText (name)
|
|
stringlen = _detalhes.fontstring_len:GetStringWidth()
|
|
end
|
|
|
|
if (_type (amount) == "number") then
|
|
if (amount > 0) then
|
|
|
|
local percent
|
|
|
|
if (self.atributo == 2 and self.sub_atributo == 3) then --overheal
|
|
percent = _cstr ("%.1f", _thisActor.totalover / (_thisActor.totalover + _thisActor.total) * 100)
|
|
else
|
|
percent = _cstr ("%.1f", amount/total*100)
|
|
end
|
|
|
|
if (keyNameSec) then
|
|
local dps = GetDpsHps (_thisActor, keyNameSec)
|
|
if (_detalhes.report_schema == 1) then
|
|
report_lines [#report_lines+1] = i .. ". " .. name .. " " .. _detalhes:ToKMin ( _math_floor (amount) ) .. " (" .. _detalhes:ToKMin (_math_floor (dps)) .. ", " .. percent .. "%)"
|
|
elseif (_detalhes.report_schema == 2) then
|
|
report_lines [#report_lines+1] = i .. ". " .. name .. " " .. percent .. "% (" .. _detalhes:ToKMin (_math_floor (dps)) .. ", " .. _detalhes:ToKMin ( _math_floor (amount)) .. ")"
|
|
elseif (_detalhes.report_schema == 3) then
|
|
report_lines [#report_lines+1] = i .. ". " .. name .. " " .. percent .. "% (" .. _detalhes:ToKMin ( _math_floor (amount) ) .. ", " .. _detalhes:ToKMin (_math_floor (dps)) .. ")"
|
|
end
|
|
else
|
|
if (_detalhes.report_schema == 1) then
|
|
report_lines [#report_lines+1] = i .. ". " .. name .. " " .. _detalhes:ToKReport (amount) .. " (" .. percent .. "%)"
|
|
else
|
|
report_lines [#report_lines+1] = i .. ". " .. name .. " " .. _cstr ("%.1f", amount/total*100) .. "% (" .. percent .. ")"
|
|
end
|
|
end
|
|
|
|
quantidade = quantidade + 1
|
|
if (quantidade == amt) then
|
|
break
|
|
end
|
|
end
|
|
elseif (_type (amount) == "string") then
|
|
report_lines [#report_lines+1] = i .. ". " .. name .. " " .. amount
|
|
else
|
|
break
|
|
end
|
|
end
|
|
end
|
|
else
|
|
local nova_tabela = {}
|
|
|
|
for i = 1, amt do
|
|
local ROW = self.barras [i]
|
|
if (ROW) then
|
|
if (not ROW.hidden or ROW.fading_out) then --> a barra esta visivel na tela
|
|
nova_tabela [#nova_tabela+1] = ROW.texto_esquerdo:GetText().." ".. ROW.texto_direita:GetText()
|
|
else
|
|
break
|
|
end
|
|
else
|
|
break
|
|
end
|
|
end
|
|
|
|
for i = #nova_tabela, 1, -1 do
|
|
report_lines [#report_lines+1] = nova_tabela[i]
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
return self:envia_relatorio (report_lines)
|
|
|
|
end
|
|
|
|
function _detalhes:envia_relatorio (linhas, custom)
|
|
|
|
local segmento = self.segmento
|
|
local luta = nil
|
|
|
|
if (not custom) then
|
|
if (segmento == -1) then --overall
|
|
--luta = Loc ["STRING_REPORT_LAST"] .. " " .. #_detalhes.tabela_historico.tabelas .. " " .. Loc ["STRING_REPORT_FIGHTS"]
|
|
luta = _detalhes.tabela_overall.overall_enemy_name
|
|
|
|
elseif (segmento == 0) then --current
|
|
|
|
if (_detalhes.tabela_vigente.is_boss) then
|
|
local encounterName = _detalhes.tabela_vigente.is_boss.name
|
|
if (encounterName) then
|
|
luta = encounterName
|
|
end
|
|
|
|
elseif (_detalhes.tabela_vigente.is_pvp) then
|
|
local battleground_name = _detalhes.tabela_vigente.is_pvp.name
|
|
if (battleground_name) then
|
|
luta = battleground_name
|
|
end
|
|
end
|
|
|
|
if (not luta) then
|
|
if (_detalhes.tabela_vigente.enemy) then
|
|
luta = _detalhes.tabela_vigente.enemy
|
|
end
|
|
end
|
|
|
|
if (not luta) then
|
|
luta = _detalhes.segmentos.current
|
|
end
|
|
else
|
|
if (segmento == 1) then
|
|
|
|
if (_detalhes.tabela_historico.tabelas[1].is_boss) then
|
|
local encounterName = _detalhes.tabela_historico.tabelas[1].is_boss.name
|
|
if (encounterName) then
|
|
luta = encounterName .. " (" .. Loc ["STRING_REPORT_LASTFIGHT"] .. ")"
|
|
end
|
|
|
|
elseif (_detalhes.tabela_historico.tabelas[1].is_pvp) then
|
|
local battleground_name = _detalhes.tabela_historico.tabelas[1].is_pvp.name
|
|
if (battleground_name) then
|
|
luta = battleground_name .. " (" .. Loc ["STRING_REPORT_LASTFIGHT"] .. ")"
|
|
end
|
|
end
|
|
|
|
if (not luta) then
|
|
if (_detalhes.tabela_historico.tabelas[1].enemy) then
|
|
luta = _detalhes.tabela_historico.tabelas[1].enemy .. " (" .. Loc ["STRING_REPORT_LASTFIGHT"] .. ")"
|
|
end
|
|
end
|
|
|
|
if (not luta) then
|
|
luta = Loc ["STRING_REPORT_LASTFIGHT"]
|
|
end
|
|
|
|
else
|
|
|
|
if (_detalhes.tabela_historico.tabelas[segmento].is_boss) then
|
|
local encounterName = _detalhes.tabela_historico.tabelas[segmento].is_boss.name
|
|
if (encounterName) then
|
|
luta = encounterName .. " (" .. segmento .. " " .. Loc ["STRING_REPORT_PREVIOUSFIGHTS"] .. ")"
|
|
end
|
|
|
|
elseif (_detalhes.tabela_historico.tabelas[segmento].is_pvp) then
|
|
local battleground_name = _detalhes.tabela_historico.tabelas[segmento].is_pvp.name
|
|
if (battleground_name) then
|
|
luta = battleground_name .. " (" .. Loc ["STRING_REPORT_LASTFIGHT"] .. ")"
|
|
end
|
|
end
|
|
|
|
if (not luta) then
|
|
if (_detalhes.tabela_historico.tabelas[segmento].enemy) then
|
|
luta = _detalhes.tabela_historico.tabelas[segmento].enemy .. " (" .. segmento .. " " .. Loc ["STRING_REPORT_PREVIOUSFIGHTS"] .. ")"
|
|
end
|
|
end
|
|
|
|
if (not luta) then
|
|
luta = " (" .. segmento .. " " .. Loc ["STRING_REPORT_PREVIOUSFIGHTS"] .. ")"
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
linhas[1] = linhas[1] .. " " .. Loc ["STRING_REPORT"] .. " " .. luta
|
|
|
|
end
|
|
|
|
if (_detalhes.time_type == 2) then
|
|
linhas[1] = linhas[1] .. " (Ef)"
|
|
else
|
|
linhas[1] = linhas[1] .. " (Ac)"
|
|
end
|
|
|
|
local editbox = _detalhes.janela_report.editbox
|
|
if (editbox.focus) then --> não precionou enter antes de clicar no okey
|
|
local texto = _detalhes:trim (editbox:GetText())
|
|
if (_string_len (texto) > 0) then
|
|
_detalhes.report_to_who = texto
|
|
editbox:AddHistoryLine (texto)
|
|
editbox:SetText (texto)
|
|
else
|
|
_detalhes.report_to_who = ""
|
|
editbox:SetText ("")
|
|
end
|
|
editbox.perdeu_foco = true --> isso aqui pra quando estiver editando e clicar em outra caixa
|
|
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 ("CHANNEL")
|
|
local is_btag = to_who:find ("REALID")
|
|
|
|
if (channel) then
|
|
|
|
channel = to_who:gsub ((".*|"), "")
|
|
|
|
for i = 1, #linhas do
|
|
_SendChatMessage (linhas[i], "CHANNEL", nil, _GetChannelName (channel))
|
|
end
|
|
|
|
return
|
|
|
|
elseif (is_btag) then
|
|
|
|
local id = to_who:gsub ((".*|"), "")
|
|
local presenceID = tonumber (id)
|
|
|
|
for i = 1, #linhas do
|
|
BNSendWhisper (presenceID, linhas[i])
|
|
end
|
|
|
|
return
|
|
|
|
elseif (to_who == "WHISPER") then --> whisper
|
|
|
|
local alvo = _detalhes.report_to_who
|
|
|
|
if (not alvo or alvo == "") then
|
|
_detalhes:Msg (Loc ["STRING_REPORT_INVALIDTARGET"])
|
|
return
|
|
end
|
|
|
|
for i = 1, #linhas do
|
|
_SendChatMessage (linhas[i], to_who, nil, alvo)
|
|
end
|
|
return
|
|
|
|
elseif (to_who == "WHISPER2") then --> whisper target
|
|
to_who = "WHISPER"
|
|
|
|
local alvo
|
|
if (_UnitExists ("target")) then
|
|
if (_UnitIsPlayer ("target")) then
|
|
alvo = _UnitName ("target")
|
|
else
|
|
_detalhes:Msg (Loc ["STRING_REPORT_INVALIDTARGET"])
|
|
return
|
|
end
|
|
else
|
|
_detalhes:Msg (Loc ["STRING_REPORT_INVALIDTARGET"])
|
|
return
|
|
end
|
|
|
|
for i = 1, #linhas do
|
|
_SendChatMessage (linhas[i], to_who, nil, alvo)
|
|
end
|
|
|
|
return
|
|
end
|
|
|
|
if (to_who == "RAID" or to_who == "PARTY") then
|
|
--LE_PARTY_CATEGORY_HOME - default
|
|
--LE_PARTY_CATEGORY_INSTANCE - player's automatic group
|
|
if (GetNumGroupMembers (LE_PARTY_CATEGORY_INSTANCE) > 0) then
|
|
to_who = "INSTANCE_CHAT"
|
|
end
|
|
end
|
|
|
|
for i = 1, #linhas do
|
|
_SendChatMessage (linhas[i], to_who)
|
|
end
|
|
|
|
end
|