local AceLocale = LibStub ( " AceLocale-3.0 " )
local Loc = AceLocale : GetLocale ( " Details_EncounterDetails " )
local Graphics = LibStub : GetLibrary ( " LibGraph-2.0 " )
local _
local isDebug = false
local function DebugMessage ( ... )
if ( isDebug ) then
print ( " |cFFFFFF00EBreakDown|r: " , ... )
end
end
--> Needed locals
local _GetTime = GetTime --> wow api local
local _UFC = UnitAffectingCombat --> wow api local
local _IsInRaid = IsInRaid --> wow api local
local _IsInGroup = IsInGroup --> wow api local
local _UnitAura = UnitAura --> wow api local
local _GetSpellInfo = _detalhes.getspellinfo --> wow api local
local _CreateFrame = CreateFrame --> wow api local
local _GetTime = GetTime --> wow api local
local _GetCursorPosition = GetCursorPosition --> wow api local
local _GameTooltip = GameTooltip --> wow api local
local GameCooltip = GameCooltip2
local _math_floor = math.floor --> lua library local
local _cstr = string.format --> lua library local
local _ipairs = ipairs --> lua library local
local _pairs = pairs --> lua library local
local _table_sort = table.sort --> lua library local
local _table_insert = table.insert --> lua library local
local _unpack = unpack --> lua library local
local _bit_band = bit.band
local CONST_FONT_SIZE = 10
--> Create the plugin Object
local EncounterDetails = _detalhes : NewPluginObject ( " Details_EncounterDetails " , DETAILSPLUGIN_ALWAYSENABLED )
tinsert ( UISpecialFrames , " Details_EncounterDetails " )
--> Main Frame
local EncounterDetailsFrame = EncounterDetails.Frame
EncounterDetailsFrame.DefaultBarHeight = 20
EncounterDetailsFrame.CooltipStatusbarAlpha = .65
EncounterDetailsFrame.DefaultBarTexture = " Interface \\ AddOns \\ Details \\ images \\ bar_serenity "
EncounterDetails : SetPluginDescription ( " Raid encounters summary, show basic stuff like dispels, interrupts and also graphic charts, boss emotes and the Weakaura Creation Tool. " )
--> container types
local class_type_damage = _detalhes.atributos . dano --> damage
local class_type_misc = _detalhes.atributos . misc --> misc
--> main combat object
local _combat_object
local sort_by_name = function ( t1 , t2 ) return t1.nome < t2.nome end
local CLASS_ICON_TCOORDS = _G.CLASS_ICON_TCOORDS
EncounterDetails.name = " Encounter Breakdown "
EncounterDetails.debugmode = false
function EncounterDetails : FormatCooltipSettings ( )
GameCooltip : SetType ( " tooltip " )
GameCooltip : SetOption ( " StatusBarTexture " , [[Interface\AddOns\Details\images\bar_serenity]] )
GameCooltip : SetOption ( " StatusBarHeightMod " , 0 )
GameCooltip : SetOption ( " FixedWidth " , 280 )
GameCooltip : SetOption ( " TextSize " , 11 )
GameCooltip : SetOption ( " LeftBorderSize " , - 4 )
GameCooltip : SetOption ( " RightBorderSize " , 5 )
GameCooltip : SetOption ( " ButtonsYMod " , 0 )
GameCooltip : SetOption ( " YSpacingMod " , - 1 )
end
EncounterDetails.CooltipLineHeight = 18
local ability_type_table = {
[ 0x1 ] = " |cFF00FF00 " .. Loc [ " STRING_HEAL " ] .. " |r " ,
[ 0x2 ] = " |cFF710000 " .. Loc [ " STRING_LOWDPS " ] .. " |r " ,
[ 0x4 ] = " |cFF057100 " .. Loc [ " STRING_LOWHEAL " ] .. " |r " ,
[ 0x8 ] = " |cFFd3acff " .. Loc [ " STRING_VOIDZONE " ] .. " |r " ,
[ 0x10 ] = " |cFFbce3ff " .. Loc [ " STRING_DISPELL " ] .. " |r " ,
[ 0x20 ] = " |cFFffdc72 " .. Loc [ " STRING_INTERRUPT " ] .. " |r " ,
[ 0x40 ] = " |cFFd9b77c " .. Loc [ " STRING_POSITIONING " ] .. " |r " ,
[ 0x80 ] = " |cFFd7ff36 " .. Loc [ " STRING_RUNAWAY " ] .. " |r " ,
[ 0x100 ] = " |cFF9a7540 " .. Loc [ " STRING_TANKSWITCH " ] .. " |r " ,
[ 0x200 ] = " |cFFff7800 " .. Loc [ " STRING_MECHANIC " ] .. " |r " ,
[ 0x400 ] = " |cFFbebebe " .. Loc [ " STRING_CROWDCONTROL " ] .. " |r " ,
[ 0x800 ] = " |cFF6e4d13 " .. Loc [ " STRING_TANKCOOLDOWN " ] .. " |r " ,
[ 0x1000 ] = " |cFFffff00 " .. Loc [ " STRING_KILLADD " ] .. " |r " ,
[ 0x2000 ] = " |cFFff9999 " .. Loc [ " STRING_SPREADOUT " ] .. " |r " ,
[ 0x4000 ] = " |cFFffff99 " .. Loc [ " STRING_STOPCAST " ] .. " |r " ,
[ 0x8000 ] = " |cFFffff99 " .. Loc [ " STRING_FACING " ] .. " |r " ,
[ 0x10000 ] = " |cFFffff99 " .. Loc [ " STRING_STACK " ] .. " |r " ,
}
--> main object frame functions
local function CreatePluginFrames ( data )
--> catch Details! main object
local _detalhes = Details
local DetailsFrameWork = _detalhes.gump
--> saved data if any
EncounterDetails.data = data or { }
--> record if button is shown
EncounterDetails.showing = false
--> record if boss window is open or not
EncounterDetails.window_open = false
EncounterDetails.combat_boss_found = false
--> OnEvent Table
function EncounterDetails : OnDetailsEvent ( event , ... )
--> when main frame became hide
if ( event == " HIDE " ) then --> plugin hidded, disabled
self.open = false
--> when main frame is shown on screen
elseif ( event == " SHOW " ) then --> plugin hidded, disabled
self.open = true
EncounterDetails : RefreshScale ( )
--> when details finish his startup and are ready to work
elseif ( event == " DETAILS_STARTED " ) then
--> check if details are in combat, if not check if the last fight was a boss fight
if ( not EncounterDetails : IsInCombat ( ) ) then
--> get the current combat table
_combat_object = EncounterDetails : GetCombat ( )
--> check if was a boss fight
EncounterDetails : WasEncounter ( )
end
local damage_done_func = function ( support_table , time_table , tick_second )
local current_total_damage = _detalhes.tabela_vigente . totals_grupo [ 1 ]
local current_damage = current_total_damage - support_table.last_damage
time_table [ tick_second ] = current_damage
if ( current_damage > support_table.max_damage ) then
support_table.max_damage = current_damage
time_table.max_damage = current_damage
end
support_table.last_damage = current_total_damage
end
local string_damage_done_func = [ [
-- this script takes the current combat and request the total of damage done by the group.
-- first lets take the current combat and name it "current_combat".
local current_combat = _detalhes : GetCombat ( " current " ) --> getting the current combat
-- now lets ask the combat for the total damage done by the raide group.
local total_damage = current_combat : GetTotal ( DETAILS_ATTRIBUTE_DAMAGE , nil , DETAILS_TOTALS_ONLYGROUP )
-- checks if the result is valid
if ( not total_damage ) then
return 0
end
-- with the number in hands, lets finish the code returning the amount
return total_damage
] ]
--_detalhes:TimeDataRegister ("Raid Damage Done", damage_done_func, {last_damage = 0, max_damage = 0}, "Encounter Details", "v1.0", [[Interface\ICONS\Ability_DualWield]], true)
_detalhes : TimeDataRegister ( " Raid Damage Done " , string_damage_done_func , nil , " Encounter Details " , " v1.0 " , [[Interface\ICONS\Ability_DualWield]] , true , true )
if ( EncounterDetails.db . show_icon == 4 ) then
EncounterDetails : ShowIcon ( )
elseif ( EncounterDetails.db . show_icon == 5 ) then
EncounterDetails : AutoShowIcon ( )
end
--EncounterDetails:CreateCallbackListeners()
elseif ( event == " COMBAT_PLAYER_ENTER " ) then --> combat started
if ( EncounterDetails.showing and EncounterDetails.db . hide_on_combat ) then
--EncounterDetails:HideIcon()
EncounterDetails : CloseWindow ( )
end
EncounterDetails.current_whisper_table = { }
elseif ( event == " COMBAT_PLAYER_LEAVE " ) then
--> combat leave and enter always send current combat table
_combat_object = select ( 1 , ... )
--> check if was a boss fight
EncounterDetails : WasEncounter ( )
if ( EncounterDetails.combat_boss_found ) then
EncounterDetails.combat_boss_found = false
end
if ( EncounterDetails.db . show_icon == 5 ) then
EncounterDetails : AutoShowIcon ( )
end
local whisper_table = EncounterDetails.current_whisper_table
if ( whisper_table and _combat_object.is_boss and _combat_object.is_boss . name ) then
whisper_table.boss = _combat_object.is_boss . name
tinsert ( EncounterDetails.boss_emotes_table , 1 , whisper_table )
if ( # EncounterDetails.boss_emotes_table > EncounterDetails.db . max_emote_segments ) then
table.remove ( EncounterDetails.boss_emotes_table , EncounterDetails.db . max_emote_segments + 1 )
end
end
elseif ( event == " COMBAT_BOSS_FOUND " ) then
EncounterDetails.combat_boss_found = true
if ( EncounterDetails.db . show_icon == 5 ) then
EncounterDetails : AutoShowIcon ( )
end
elseif ( event == " DETAILS_DATA_RESET " ) then
if ( _G.DetailsRaidDpsGraph ) then
_G.DetailsRaidDpsGraph : ResetData ( )
end
if ( EncounterDetails.db . show_icon == 5 ) then
EncounterDetails : AutoShowIcon ( )
end
--EncounterDetails:HideIcon()
EncounterDetails : CloseWindow ( )
--drop last combat table
EncounterDetails.LastSegmentShown = nil
if ( DetailsRaidDpsGraph ) then
DetailsRaidDpsGraph.combat = nil
end
--wipe emotes
table.wipe ( EncounterDetails.boss_emotes_table )
elseif ( event == " GROUP_ONENTER " ) then
if ( EncounterDetails.db . show_icon == 2 ) then
EncounterDetails : ShowIcon ( )
end
elseif ( event == " GROUP_ONLEAVE " ) then
if ( EncounterDetails.db . show_icon == 2 ) then
EncounterDetails : HideIcon ( )
end
elseif ( event == " ZONE_TYPE_CHANGED " ) then
if ( EncounterDetails.db . show_icon == 1 ) then
if ( select ( 1 , ... ) == " raid " ) then
EncounterDetails : ShowIcon ( )
else
EncounterDetails : HideIcon ( )
end
end
elseif ( event == " PLUGIN_DISABLED " ) then
EncounterDetails : HideIcon ( )
EncounterDetails : CloseWindow ( )
elseif ( event == " PLUGIN_ENABLED " ) then
if ( EncounterDetails.db . show_icon == 5 ) then
EncounterDetails : AutoShowIcon ( )
elseif ( EncounterDetails.db . show_icon == 4 ) then
EncounterDetails : ShowIcon ( )
end
end
end
--desativado, agora ele � gerenciado dentro do proprio details!
function EncounterDetails : CreateCallbackListeners ( )
EncounterDetails.DBM_timers = { }
local current_encounter = false
local current_table_dbm = { }
local current_table_bigwigs = { }
local event_frame = CreateFrame ( " frame " , nil , UIParent , " BackdropTemplate " )
event_frame : SetScript ( " OnEvent " , function ( self , event , ... )
if ( event == " ENCOUNTER_START " ) then
local encounterID , encounterName , difficultyID , raidSize = select ( 1 , ... )
current_encounter = encounterID
elseif ( event == " ENCOUNTER_END " or event == " PLAYER_REGEN_ENABLED " ) then
if ( current_encounter ) then
if ( _G.DBM ) then
local db = _detalhes.global_plugin_database [ " DETAILS_PLUGIN_ENCOUNTER_DETAILS " ]
for spell , timer_table in pairs ( current_table_dbm ) do
if ( not db.encounter_timers_dbm [ timer_table [ 1 ] ] ) then
timer_table.id = current_encounter
db.encounter_timers_dbm [ timer_table [ 1 ] ] = timer_table
end
end
end
if ( BigWigs ) then
local db = _detalhes.global_plugin_database [ " DETAILS_PLUGIN_ENCOUNTER_DETAILS " ]
for timer_id , timer_table in pairs ( current_table_bigwigs ) do
if ( not db.encounter_timers_bw [ timer_id ] ) then
timer_table.id = current_encounter
db.encounter_timers_bw [ timer_id ] = timer_table
end
end
end
end
current_encounter = false
wipe ( current_table_dbm )
wipe ( current_table_bigwigs )
end
end )
event_frame : RegisterEvent ( " ENCOUNTER_START " )
event_frame : RegisterEvent ( " ENCOUNTER_END " )
event_frame : RegisterEvent ( " PLAYER_REGEN_ENABLED " )
--DBM_TimerStart Timer183828cdcount 2 Death Brand CD (2) 42.5 Interface\Icons\warlock_summon_doomguard cdcount 183828 1 1438
--DBM_TimerStart Timer183828cdcount 3 Death Brand CD (3) 42.5 Interface\Icons\warlock_summon_doomguard cdcount 183828 1 1438
--EncounterDetails.DBM_timers
if ( _G.DBM ) then
local dbm_timer_callback = function ( bar_type , id , msg , timer , icon , bartype , spellId , colorId , modid )
--print (bar_type, id, msg, timer, icon, bartype, spellId, colorId, modid)
local spell = tostring ( spellId )
if ( spell and not current_table_dbm [ spell ] ) then
current_table_dbm [ spell ] = { spell , id , msg , timer , icon , bartype , spellId , colorId , modid }
end
end
DBM : RegisterCallback ( " DBM_TimerStart " , dbm_timer_callback )
end
function EncounterDetails : RegisterBigWigsCallBack ( )
if ( BigWigsLoader ) then
function EncounterDetails : BigWigs_StartBar ( event , module , spellid , bar_text , time , icon , ... )
--print (event, module, spellid, bar_text, time, icon, ...)
spellid = tostring ( spellid )
if ( not current_table_bigwigs [ spellid ] ) then
current_table_bigwigs [ spellid ] = { ( type ( module ) == " string " and module ) or ( module and module.moduleName ) or " " , spellid or " " , bar_text or " " , time or 0 , icon or " " }
end
end
if ( BigWigsLoader.RegisterMessage ) then
BigWigsLoader.RegisterMessage ( EncounterDetails , " BigWigs_StartBar " )
end
end
end
EncounterDetails : ScheduleTimer ( " RegisterBigWigsCallBack " , 5 )
--BigWigs_StartBar BigWigs_Bosses_Brackenspore mind_fungus Mind Fungus 51 Interface\Icons\inv_mushroom_10 true
--bigwigs startbar mind_fungus
--BigWigs_StartBar BigWigs_Bosses_Brackenspore 159996 Infesting Spores (2) 58 Interface\Icons\Ability_Creature_Disease_01
--bigwigs startbar 160013
end
function EncounterDetails : WasEncounter ( )
--> check if last combat was a boss encounter fight
if ( not EncounterDetails.debugmode ) then
if ( not _combat_object.is_boss ) then
return
elseif ( _combat_object.is_boss . encounter == " pvp " ) then
return
end
if ( _combat_object.instance_type ~= " raid " ) then
return
end
end
--> boss found, we need to show the icon
EncounterDetails : ShowIcon ( )
end
--> show icon on toolbar
local re_ShowIconBallonTutorial = function ( )
EncounterDetails : ShowIconBallonTutorial ( )
end
function EncounterDetails : ShowIconBallonTutorial ( )
if ( InCombatLockdown ( ) ) then
C_Timer.After ( 5 , function ( )
--print ("in combat")
re_ShowIconBallonTutorial ( )
end )
return
end
local hook_AlertButtonCloseButton = function ( )
--print ("done tutorial")
EncounterDetails : SetTutorialCVar ( " ENCOUNTER_DETAILS_BALLON_TUTORIAL1 " , true )
end
if ( EncounterDetailsTutorialAlertButton1 or not EncounterDetails.ToolbarButton or not EncounterDetails.ToolbarButton : IsShown ( ) ) then
--print (EncounterDetailsTutorialAlertButton1, not EncounterDetails.ToolbarButton, not EncounterDetails.ToolbarButton:IsShown())
return
end
--[=[
local alert = CreateFrame ( " frame " , " EncounterDetailsTutorialAlertButton1 " , EncounterDetails.ToolbarButton , " MicroButtonAlertTemplate " )
alert : SetFrameLevel ( 302 )
alert.label = " Click here (on the skull icon) to bring the Encounter Breakdown panel "
alert.Text : SetSpacing ( 4 )
alert : SetClampedToScreen ( true )
MicroButtonAlert_SetText ( alert , alert.label )
alert : SetPoint ( " bottom " , EncounterDetails.ToolbarButton , " top " , 0 , 22 )
alert.CloseButton : HookScript ( " OnClick " , hook_AlertButtonCloseButton )
alert : Show ( )
--]=]
--print ("showing ballon")
end
function EncounterDetails : ShowIcon ( )
EncounterDetails.showing = true
--> [1] button to show [2] button animation: "star", "blink" or true (blink)
EncounterDetails : ShowToolbarIcon ( EncounterDetails.ToolbarButton , " star " )
--EncounterDetails:SetTutorialCVar ("ENCOUNTER_DETAILS_BALLON_TUTORIAL1", false) --debug
if ( not EncounterDetails : GetTutorialCVar ( " ENCOUNTER_DETAILS_BALLON_TUTORIAL1 " ) ) then
--print ("nao viu o tutorial ainda")
C_Timer.After ( 2 , EncounterDetails.ShowIconBallonTutorial )
end
end
--> hide icon on toolbar
function EncounterDetails : HideIcon ( )
EncounterDetails.showing = false
EncounterDetails : HideToolbarIcon ( EncounterDetails.ToolbarButton )
end
local re_ShowTutorialAlert = function ( )
EncounterDetails : ShowTutorial ( )
end
local hook_AlertCloseButton = function ( )
re_ShowTutorialAlert ( )
end
function EncounterDetails : ShowTutorial ( )
--deprecated
end
--[=[
EncounterDetailsFrame : HookScript ( " OnShow " , function ( )
C_Timer.After ( 0.1 , function ( )
if ( not EncounterDetails.LastOpenedTime or EncounterDetails.LastOpenedTime + 2 < GetTime ( ) ) then
if ( _detalhes.AddOnStartTime and _detalhes.AddOnStartTime + 30 < GetTime ( ) ) then
EncounterDetails : OpenAndRefresh ( )
end
end
end )
end )
--]=]
--> user clicked on button, need open or close window
function EncounterDetails : OpenWindow ( )
if ( EncounterDetails.Frame : IsShown ( ) ) then
return EncounterDetails : CloseWindow ( )
end
--> build all window data
EncounterDetails.db . opened = EncounterDetails.db . opened + 1
EncounterDetails : OpenAndRefresh ( )
--> show
EncounterDetailsFrame : Show ( )
EncounterDetails.open = true
if ( EncounterDetailsFrame.ShowType == " graph " ) then
EncounterDetails : BuildDpsGraphic ( )
end
--select latest emote segment
Details_EncounterDetailsEmotesSegmentDropdown.MyObject : Select ( 1 )
Details_EncounterDetailsEmotesSegmentDropdown.MyObject : Refresh ( )
FauxScrollFrame_SetOffset ( EncounterDetails_EmoteScroll , 0 )
EncounterDetails : SetEmoteSegment ( 1 )
EncounterDetails_EmoteScroll : Update ( )
if ( EncounterDetailsFrame.ShowType ~= " emotes " ) then
--hide emote frames
for _ , widget in pairs ( EncounterDetails.Frame . EmoteWidgets ) do
widget : Hide ( )
end
end
C_Timer.After ( 3 , function ( ) EncounterDetails : ShowTutorial ( ) end )
DetailsPluginContainerWindow.OpenPlugin ( EncounterDetails )
return true
end
function EncounterDetails : CloseWindow ( )
EncounterDetails.open = false
EncounterDetailsFrame : Hide ( )
return true
end
local cooltip_menu = function ( )
local CoolTip = GameCooltip2
CoolTip : Reset ( )
CoolTip : SetType ( " menu " )
CoolTip : SetOption ( " TextSize " , Details.font_sizes . menus )
CoolTip : SetOption ( " TextFont " , Details.font_faces . menus )
CoolTip : SetOption ( " ButtonHeightModSub " , - 2 )
CoolTip : SetOption ( " ButtonHeightMod " , - 5 )
CoolTip : SetOption ( " ButtonsYModSub " , - 3 )
CoolTip : SetOption ( " ButtonsYMod " , - 6 )
CoolTip : SetOption ( " YSpacingModSub " , - 3 )
CoolTip : SetOption ( " YSpacingMod " , 1 )
CoolTip : SetOption ( " HeighMod " , 3 )
CoolTip : SetOption ( " SubFollowButton " , true )
Details : SetTooltipMinWidth ( )
--build the header
-- CoolTip:AddLine (Loc ["STRING_PLUGIN_NAME"])
-- CoolTip:AddIcon (ENCOUNTERDETAILS_BUTTON.__icon, 1, 1, 20, 20)
-- CoolTip:AddMenu (1, EncounterDetails.Frame.switch, "main")
-- GameCooltip:AddLine ("$div")
--build the menu options
--summary
CoolTip : AddLine ( " Encounter Summary " )
CoolTip : AddMenu ( 1 , EncounterDetails.Frame . switch , " main " )
CoolTip : AddIcon ( " Interface \\ AddOns \\ Details_EncounterDetails \\ images \\ boss_frame_buttons " , 1 , 1 , 20 , 22 , 0 , 0.1015625 , 0 , 0.505625 )
--chart
CoolTip : AddLine ( " Damage Graphic " )
CoolTip : AddMenu ( 1 , EncounterDetails.Frame . switch , " graph " )
CoolTip : AddIcon ( " Interface \\ AddOns \\ Details_EncounterDetails \\ images \\ boss_frame_buttons " , 1 , 1 , 20 , 22 , 0.1271875 , 0.21875 , 0 , 0.505625 )
--emotes
CoolTip : AddLine ( " Boss Emotes " )
CoolTip : AddMenu ( 1 , EncounterDetails.Frame . switch , " emotes " )
CoolTip : AddIcon ( " Interface \\ AddOns \\ Details_EncounterDetails \\ images \\ boss_frame_buttons " , 1 , 1 , 20 , 22 , 91 / 256 , 116 / 256 , 0 , 0.505625 )
--weakauras
CoolTip : AddLine ( " Create Encounter Weakauras " )
CoolTip : AddMenu ( 1 , EncounterDetails.Frame . switch , " spellsauras " )
if ( _G.WeakAuras ) then
CoolTip : AddIcon ( [[Interface\AddOns\WeakAuras\Media\Textures\icon]] , 1 , 1 , 20 , 20 )
else
CoolTip : AddIcon ( " Interface \\ AddOns \\ Details_EncounterDetails \\ images \\ boss_frame_buttons " , 1 , 1 , 20 , 22 , 121 / 256 , 146 / 256 , 0 , 0.505625 )
end
--phases
CoolTip : AddLine ( " Damage by Boss Phase " )
CoolTip : AddMenu ( 1 , EncounterDetails.Frame . switch , " phases " )
CoolTip : AddIcon ( " Interface \\ AddOns \\ Details_EncounterDetails \\ images \\ boss_frame_buttons " , 1 , 1 , 20 , 22 , 151 / 256 , 176 / 256 , 0 , 0.505625 )
--
local textPoint = { " left " , " left " , 4 , 0 }
local SharedMedia = LibStub : GetLibrary ( " LibSharedMedia-3.0 " )
--apply the backdrop settings to the menu
Details : FormatCooltipBackdrop ( )
CoolTip : SetOwner ( ENCOUNTERDETAILS_BUTTON , " bottom " , " top " , 0 , 0 )
CoolTip : ShowCooltip ( )
end
EncounterDetails.ToolbarButton = _detalhes.ToolBar : NewPluginToolbarButton ( EncounterDetails.OpenWindow , " Interface \\ AddOns \\ Details_EncounterDetails \\ images \\ icon " , Loc [ " STRING_PLUGIN_NAME " ] , Loc [ " STRING_TOOLTIP " ] , 16 , 16 , " ENCOUNTERDETAILS_BUTTON " , cooltip_menu ) --"Interface\\COMMON\\help-i"
EncounterDetails.ToolbarButton . shadow = true --> loads icon_shadow.tga when the instance is showing icons with shadows
--> setpoint anchors mod if needed
EncounterDetails.ToolbarButton . y = 0.5
EncounterDetails.ToolbarButton . x = 0
--> build all frames ans widgets
_detalhes.EncounterDetailsTempWindow ( EncounterDetails )
_detalhes.EncounterDetailsTempWindow = nil
--> ~remover ~autoabrir �brir ~abrir ~auto
--C_Timer.After (.5, EncounterDetails.OpenWindow)
end
local sort_damage_from = function ( a , b )
if ( a [ 3 ] ~= " PET " and b [ 3 ] ~= " PET " ) then
return a [ 2 ] > b [ 2 ]
elseif ( a [ 3 ] == " PET " and b [ 3 ] ~= " PET " ) then
return false
elseif ( a [ 3 ] ~= " PET " and b [ 3 ] == " PET " ) then
return true
else
return a [ 2 ] > b [ 2 ]
end
end
--> custom tooltip for dead details ---------------------------------------------------------------------------------------------------------
--tooltip backdrop, color and border
local bgColor , borderColor = { 0.17 , 0.17 , 0.17 , .9 } , { .30 , .30 , .30 , .3 }
local function KillInfo ( deathTable , row )
local iconSize = 19
local eventos = deathTable [ 1 ]
local hora_da_morte = deathTable [ 2 ]
local hp_max = deathTable [ 5 ]
local battleress = false
local lastcooldown = false
GameCooltip : Reset ( )
GameCooltip : SetType ( " tooltipbar " )
GameCooltip : SetOwner ( row )
GameCooltip : AddLine ( " Click to Report " , nil , 1 , " orange " )
GameCooltip : AddIcon ( [[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]] , 1 , 1 , 12 , 16 , 0.015625 , 0.13671875 , 0.4375 , 0.59765625 )
GameCooltip : AddStatusBar ( 0 , 1 , 1 , 1 , 1 , 1 , false , { value = 100 , color = { .3 , .3 , .3 , .5 } , specialSpark = false , texture = [[Interface\AddOns\Details\images\bar_serenity]] } )
local statusBarBackground = { value = 100 , color = { .21 , .21 , .21 , 0.8 } , texture = [[Interface\AddOns\Details\images\bar_serenity]] }
--death parser
for index , event in _ipairs ( eventos ) do
local hp = _math_floor ( event [ 5 ] / hp_max * 100 )
if ( hp > 100 ) then
hp = 100
end
local evtype = event [ 1 ]
local spellname , _ , spellicon = _GetSpellInfo ( event [ 2 ] )
local amount = event [ 3 ]
local time = event [ 4 ]
local source = event [ 6 ]
if ( type ( evtype ) == " boolean " ) then
--> is damage or heal
if ( evtype ) then
--> damage
local overkill = event [ 10 ] or 0
if ( overkill > 0 ) then
amount = amount - overkill
overkill = " ( " .. _detalhes : ToK ( overkill ) .. " |cFFFF8800overkill|r) "
else
overkill = " "
end
if ( source : find ( " %[ " ) ) then
source = source : gsub ( " %[%*%] " , " " )
end
GameCooltip : AddLine ( " " .. _cstr ( " %.1f " , time - hora_da_morte ) .. " s " .. spellname .. " ( " .. source .. " ) " , " - " .. _detalhes : ToK ( amount ) .. overkill .. " ( " .. hp .. " %) " , 1 , " white " , " white " )
GameCooltip : AddIcon ( spellicon , 1 , 1 , 16 , 16 , .1 , .9 , .1 , .9 )
if ( event [ 9 ] ) then
--> friendly fire
GameCooltip : AddStatusBar ( hp , 1 , " darkorange " , true , statusBarBackground )
else
--> from a enemy
GameCooltip : AddStatusBar ( hp , 1 , " red " , true , statusBarBackground )
end
else
--> heal
local class = Details : GetClass ( source )
local spec = Details : GetSpec ( source )
GameCooltip : AddLine ( " " .. _cstr ( " %.1f " , time - hora_da_morte ) .. " s " .. spellname .. " ( " .. Details : GetOnlyName ( Details : AddClassOrSpecIcon ( source , class , spec , 16 , true ) ) .. " ) " , " + " .. _detalhes : ToK ( amount ) .. " ( " .. hp .. " %) " , 1 , " white " , " white " )
GameCooltip : AddIcon ( spellicon , 1 , 1 , 16 , 16 , .1 , .9 , .1 , .9 )
GameCooltip : AddStatusBar ( hp , 1 , " green " , true , statusBarBackground )
end
elseif ( type ( evtype ) == " number " ) then
if ( evtype == 1 ) then
--> cooldown
GameCooltip : AddLine ( " " .. _cstr ( " %.1f " , time - hora_da_morte ) .. " s " .. spellname .. " ( " .. source .. " ) " , " cooldown ( " .. hp .. " %) " , 1 , " white " , " white " )
GameCooltip : AddIcon ( spellicon , 1 , 1 , 16 , 16 , .1 , .9 , .1 , .9 )
GameCooltip : AddStatusBar ( 100 , 1 , " yellow " , true , statusBarBackground )
elseif ( evtype == 2 and not battleress ) then
--> battle ress
battleress = event
elseif ( evtype == 3 ) then
--> last cooldown used
lastcooldown = event
elseif ( evtype == 4 ) then
--> debuff
if ( source : find ( " %[ " ) ) then
source = source : gsub ( " %[%*%] " , " " )
end
GameCooltip : AddLine ( " " .. _cstr ( " %.1f " , time - hora_da_morte ) .. " s [x " .. amount .. " ] " .. spellname .. " ( " .. source .. " ) " , " debuff ( " .. hp .. " %) " , 1 , " white " , " white " )
GameCooltip : AddIcon ( spellicon , 1 , 1 , 16 , 16 , .1 , .9 , .1 , .9 )
GameCooltip : AddStatusBar ( 100 , 1 , " purple " , true , statusBarBackground )
end
end
end
GameCooltip : AddLine ( deathTable [ 6 ] .. " " .. " died " , " -- -- -- " , 1 , " white " )
GameCooltip : AddIcon ( " Interface \\ AddOns \\ Details \\ images \\ small_icons " , 1 , 1 , iconSize , iconSize , .75 , 1 , 0 , 1 )
GameCooltip : AddStatusBar ( 0 , 1 , .5 , .5 , .5 , .5 , false , { value = 100 , color = { .5 , .5 , .5 , 1 } , specialSpark = false , texture = [[Interface\AddOns\Details\images\bar4_vidro]] } )
if ( battleress ) then
local nome_magia , _ , icone_magia = _GetSpellInfo ( battleress [ 2 ] )
GameCooltip : AddLine ( " + " .. _cstr ( " %.1f " , battleress [ 4 ] - hora_da_morte ) .. " s " .. nome_magia .. " ( " .. battleress [ 6 ] .. " ) " , " " , 1 , " white " )
GameCooltip : AddIcon ( " Interface \\ Glues \\ CharacterSelect \\ Glues-AddOn-Icons " , 1 , 1 , nil , nil , .75 , 1 , 0 , 1 )
GameCooltip : AddStatusBar ( 0 , 1 , .5 , .5 , .5 , .5 , false , { value = 100 , color = { .5 , .5 , .5 , 1 } , specialSpark = false , texture = [[Interface\AddOns\Details\images\bar4_vidro]] } )
end
if ( lastcooldown ) then
if ( lastcooldown [ 3 ] == 1 ) then
local nome_magia , _ , icone_magia = _GetSpellInfo ( lastcooldown [ 2 ] )
GameCooltip : AddLine ( _cstr ( " %.1f " , lastcooldown [ 4 ] - hora_da_morte ) .. " s " .. nome_magia .. " ( " .. Loc [ " STRING_LAST_COOLDOWN " ] .. " ) " )
GameCooltip : AddIcon ( icone_magia )
else
GameCooltip : AddLine ( Loc [ " STRING_NOLAST_COOLDOWN " ] )
GameCooltip : AddIcon ( [[Interface\CHARACTERFRAME\UI-Player-PlayTimeUnhealthy]] , 1 , 1 , 18 , 18 )
end
GameCooltip : AddStatusBar ( 0 , 1 , 1 , 1 , 1 , 1 , false , { value = 100 , color = { .3 , .3 , .3 , 1 } , specialSpark = false , texture = [[Interface\AddOns\Details\images\bar_serenity]] } )
end
--death log cooltip settings
GameCooltip : SetOption ( " StatusBarHeightMod " , - 6 )
GameCooltip : SetOption ( " FixedWidth " , 400 )
GameCooltip : SetOption ( " TextSize " , 10 )
GameCooltip : SetOption ( " LeftBorderSize " , - 4 )
GameCooltip : SetOption ( " RightBorderSize " , 5 )
GameCooltip : SetOption ( " StatusBarTexture " , [[Interface\AddOns\Details\images\bar_serenity]] )
GameCooltip : SetBackdrop ( 1 , _detalhes.cooltip_preset2_backdrop , bgColor , borderColor )
GameCooltip : SetOwner ( row , " bottomright " , " bottomleft " , - 2 , - 50 )
row.OverlayTexture : Show ( )
GameCooltip : ShowCooltip ( )
end
--> custom tooltip for dispells details ---------------------------------------------------------------------------------------------------------
local function DispellInfo ( dispell , barra )
local jogadores = dispell [ 1 ] --> [nome od jogador] = total
local tabela_jogadores = { }
for nome , tabela in _pairs ( jogadores ) do --> tabela = [1] total tomado [2] classe
tabela_jogadores [ # tabela_jogadores + 1 ] = { nome , tabela [ 1 ] , tabela [ 2 ] }
end
_table_sort ( tabela_jogadores , _detalhes.Sort2 )
for index , tabela in _ipairs ( tabela_jogadores ) do
local coords = EncounterDetails.class_coords [ tabela [ 3 ] ]
if ( not coords ) then
GameCooltip : AddLine ( EncounterDetails : GetOnlyName ( tabela [ 1 ] ) , tabela [ 2 ] , 1 , " white " , " orange " )
GameCooltip : AddIcon ( " Interface \\ GossipFrame \\ DailyActiveQuestIcon " )
else
GameCooltip : AddLine ( EncounterDetails : GetOnlyName ( tabela [ 1 ] ) , tabela [ 2 ] , 1 , " white " , " orange " )
local specID = Details : GetSpec ( tabela [ 1 ] )
if ( specID ) then
local texture , l , r , t , b = Details : GetSpecIcon ( specID , false )
GameCooltip : AddIcon ( texture , 1 , 1 , EncounterDetails.CooltipLineHeight , EncounterDetails.CooltipLineHeight , l , r , t , b )
else
GameCooltip : AddIcon ( " Interface \\ AddOns \\ Details \\ images \\ classes_small " , nil , 1 , EncounterDetails.CooltipLineHeight , EncounterDetails.CooltipLineHeight , ( coords [ 1 ] ) , ( coords [ 2 ] ) , ( coords [ 3 ] ) , ( coords [ 4 ] ) )
end
end
end
local spellname = GetSpellInfo ( barra.spellid )
if ( spellname ) then
GameTooltip : SetOwner ( GameCooltipFrame1 , " ANCHOR_NONE " )
GameTooltip : SetSpellByID ( barra.spellid )
GameTooltip : SetPoint ( " topright " , GameCooltipFrame1 , " topleft " , - 2 , 0 )
GameTooltip : Show ( )
end
end
--> custom tooltip for kick details ---------------------------------------------------------------------------------------------------------
local function KickBy ( magia , barra )
local jogadores = magia [ 1 ] --> [nome od jogador] = total
local tabela_jogadores = { }
for nome , tabela in _pairs ( jogadores ) do --> tabela = [1] total tomado [2] classe
tabela_jogadores [ # tabela_jogadores + 1 ] = { nome , tabela [ 1 ] , tabela [ 2 ] }
end
_table_sort ( tabela_jogadores , _detalhes.Sort2 )
local spellName , _ , spellIcon = GetSpellInfo ( barra.lineText1 : GetText ( ) )
GameCooltip : AddLine ( barra.lineText1 : GetText ( ) )
if ( spellIcon ) then
GameCooltip : AddIcon ( spellIcon , nil , 1 , EncounterDetails.CooltipLineHeight , EncounterDetails.CooltipLineHeight , 5 / 64 , 59 / 64 , 5 / 64 , 59 / 64 )
end
for index , tabela in _ipairs ( tabela_jogadores ) do
local coords = EncounterDetails.class_coords [ tabela [ 3 ] ]
GameCooltip : AddLine ( EncounterDetails : GetOnlyName ( tabela [ 1 ] ) , tabela [ 2 ] , 1 , " white " )
local specID = Details : GetSpec ( tabela [ 1 ] )
if ( specID ) then
local texture , l , r , t , b = Details : GetSpecIcon ( specID , false )
GameCooltip : AddIcon ( texture , 1 , 1 , EncounterDetails.CooltipLineHeight , EncounterDetails.CooltipLineHeight , l , r , t , b )
else
GameCooltip : AddIcon ( " Interface \\ AddOns \\ Details \\ images \\ classes_small " , nil , 1 , EncounterDetails.CooltipLineHeight , EncounterDetails.CooltipLineHeight , ( coords [ 1 ] ) , ( coords [ 2 ] ) , ( coords [ 3 ] ) , ( coords [ 4 ] ) )
end
GameCooltip : AddStatusBar ( 100 , 1 , .3 , .3 , .3 , .3 , false , false , false )
end
local spellname = GetSpellInfo ( barra.spellid )
if ( spellname ) then
GameTooltip : SetOwner ( GameCooltipFrame1 , " ANCHOR_NONE " )
GameTooltip : SetSpellByID ( barra.spellid )
GameTooltip : SetPoint ( " topright " , GameCooltipFrame1 , " topleft " , - 2 , 0 )
GameTooltip : Show ( )
end
end
--> custom tooltip for enemy abilities details ---------------------------------------------------------------------------------------------------------
local function EnemySkills ( habilidade , barra )
--> barra.jogador agora tem a tabela com --> [1] total dano causado [2] jogadores que foram alvos [3] jogadores que castaram essa magia [4] ID da magia
local total = habilidade [ 1 ]
local jogadores = habilidade [ 2 ] --> [nome od jogador] = total
local tabela_jogadores = { }
local total = 0
for nome , tabela in _pairs ( jogadores ) do --> tabela = [1] total tomado [2] classe
tabela_jogadores [ # tabela_jogadores + 1 ] = { nome , tabela [ 1 ] , tabela [ 2 ] }
total = total + tabela [ 1 ]
end
_table_sort ( tabela_jogadores , _detalhes.Sort2 )
GameCooltip : AddLine ( barra.lineText1 : GetText ( ) .. " Damage Done " )
local ToK = _detalhes.ToKFunctions [ _detalhes.ps_abbreviation ]
local topValue = tabela_jogadores [ 1 ] and tabela_jogadores [ 1 ] [ 2 ]
for index , tabela in _ipairs ( tabela_jogadores ) do
local coords = EncounterDetails.class_coords [ tabela [ 3 ] ]
GameCooltip : AddLine ( EncounterDetails : GetOnlyName ( tabela [ 1 ] ) , ToK ( _ , tabela [ 2 ] ) .. " ( " .. format ( " %.1f " , tabela [ 2 ] / total * 100 ) .. " %) " , 1 , " white " )
local r , g , b , a = unpack ( _detalhes.tooltip . background )
local actorClass = Details : GetClass ( tabela [ 1 ] )
if ( actorClass ) then
local r , g , b = Details : GetClassColor ( actorClass )
GameCooltip : AddStatusBar ( tabela [ 2 ] / topValue * 100 , 1 , r , g , b , EncounterDetailsFrame.CooltipStatusbarAlpha , false , { value = 100 , color = { .21 , .21 , .21 , 0.5 } , texture = [[Interface\AddOns\Details\images\bar_serenity]] } )
else
GameCooltip : AddStatusBar ( tabela [ 2 ] / topValue * 100 , 1 , r , g , b , a , false , { value = 100 , color = { .21 , .21 , .21 , 0.8 } , texture = [[Interface\AddOns\Details\images\bar_serenity]] } )
end
local specID = Details : GetSpec ( tabela [ 1 ] )
if ( specID ) then
local texture , l , r , t , b = Details : GetSpecIcon ( specID , false )
GameCooltip : AddIcon ( texture , 1 , 1 , EncounterDetails.CooltipLineHeight - 0 , EncounterDetails.CooltipLineHeight - 0 , l , r , t , b )
else
if ( coords ) then
GameCooltip : AddIcon ( " Interface \\ AddOns \\ Details \\ images \\ classes_small " , nil , 1 , EncounterDetails.CooltipLineHeight - 2 , EncounterDetails.CooltipLineHeight - 2 , ( coords [ 1 ] ) , ( coords [ 2 ] ) , ( coords [ 3 ] ) , ( coords [ 4 ] ) )
end
end
end
local spellname = GetSpellInfo ( barra.spellid )
if ( spellname ) then
GameTooltip : SetOwner ( GameCooltipFrame1 , " ANCHOR_NONE " )
GameTooltip : SetSpellByID ( barra.spellid )
GameTooltip : SetPoint ( " right " , barra , " left " , - 2 , 0 )
GameTooltip : Show ( )
end
GameCooltip : SetOwner ( barra , " left " , " right " , 2 , 0 )
end
--> custom tooltip for damage taken details ---------------------------------------------------------------------------------------------------------
local function DamageTakenDetails ( jogador , barra )
local agressores = jogador.damage_from
local damage_taken = jogador.damage_taken
local showing = _combat_object [ class_type_damage ] --> o que esta sendo mostrado -> [1] - dano [2] - cura --> pega o container com ._NameIndexTable ._ActorTable
local meus_agressores = { }
for nome , _ in _pairs ( agressores ) do --> agressores seria a lista de nomes
local este_agressor = showing._ActorTable [ showing._NameIndexTable [ nome ] ]
if ( este_agressor ) then --> checagem por causa do total e do garbage collector que n�o limpa os nomes que deram dano
local habilidades = este_agressor.spells . _ActorTable
for id , habilidade in _pairs ( habilidades ) do
local alvos = habilidade.targets
for target_name , amount in _pairs ( alvos ) do
if ( target_name == jogador.nome ) then
meus_agressores [ # meus_agressores + 1 ] = { id , amount , este_agressor.nome }
end
end
end
end
end
_table_sort ( meus_agressores , _detalhes.Sort2 )
GameCooltip : AddLine ( barra.lineText1 : GetText ( ) .. " Damage Taken " )
local max = # meus_agressores
if ( max > 20 ) then
max = 20
end
local teve_melee = false
local ToK = _detalhes.ToKFunctions [ _detalhes.ps_abbreviation ]
local topDamage = meus_agressores [ 1 ] and meus_agressores [ 1 ] [ 2 ]
for i = 1 , max do
local nome_magia , _ , icone_magia = _GetSpellInfo ( meus_agressores [ i ] [ 1 ] )
if ( meus_agressores [ i ] [ 1 ] == 1 ) then
nome_magia = " * " .. meus_agressores [ i ] [ 3 ]
teve_melee = true
end
GameCooltip : AddLine ( nome_magia , ToK ( _ , meus_agressores [ i ] [ 2 ] ) .. " ( " .. _cstr ( " %.1f " , ( meus_agressores [ i ] [ 2 ] / damage_taken ) * 100 ) .. " %) " , 1 , " white " )
GameCooltip : AddStatusBar ( meus_agressores [ i ] [ 2 ] / topDamage * 100 , 1 , .55 , .55 , .55 , .834 , false , { value = 100 , color = { .21 , .21 , .21 , 0.8 } , texture = [[Interface\AddOns\Details\images\bar_serenity]] } )
GameCooltip : AddIcon ( icone_magia , nil , 1 , EncounterDetails.CooltipLineHeight - 0 , EncounterDetails.CooltipLineHeight - 0 , .1 , .9 , .1 , .9 )
end
if ( teve_melee ) then
GameTooltip : AddLine ( " * " .. Loc [ " STRING_MELEE_DAMAGE " ] , 0 , 1 , 0 )
end
GameCooltip : SetOwner ( barra , " left " , " right " , 2 , 0 )
end
--> custom tooltip clicks on any bar ---------------------------------------------------------------------------------------------------------
function _detalhes : BossInfoRowClick ( barra , param1 )
if ( type ( self ) == " table " ) then
barra , param1 = self , barra
end
if ( type ( param1 ) == " table " ) then
barra = param1
end
if ( barra._no_report ) then
return
end
local reportar
if ( barra.TTT == " morte " or true ) then --> deaths -- todos os boxes est�o usando cooltip, por isso o 'true'.
reportar = { barra.report_text .. " " .. ( barra.lineText1 and barra.lineText1 : GetText ( ) or barra : GetParent ( ) and barra : GetParent ( ) . lineText1 and barra : GetParent ( ) . lineText1 : GetText ( ) or " " ) }
local beginAt = 1
if ( barra.TTT == " damage_taken " or barra.TTT == " habilidades_inimigas " or barra.TTT == " total_interrupt " or barra.TTT == " add " ) then
beginAt = 2
end
--"habilidades_inimigas"
for i = beginAt , GameCooltip : GetNumLines ( ) , 1 do
local texto_left , texto_right = GameCooltip : GetText ( i )
if ( texto_left and texto_right ) then
texto_left = texto_left : gsub ( ( " |T(.*)|t " ) , " " )
reportar [ # reportar + 1 ] = " " .. texto_left .. " " .. texto_right .. " "
end
end
else
barra.report_text = barra.report_text or " "
reportar = { barra.report_text .. " " .. _G.GameTooltipTextLeft1 : GetText ( ) }
local numLines = _GameTooltip : NumLines ( )
for i = 1 , numLines , 1 do
local nome_left = " GameTooltipTextLeft " .. i
local texto_left = _G [ nome_left ]
texto_left = texto_left : GetText ( )
local nome_right = " GameTooltipTextRight " .. i
local texto_right = _G [ nome_right ]
texto_right = texto_right : GetText ( )
if ( texto_left and texto_right ) then
texto_left = texto_left : gsub ( ( " |T(.*)|t " ) , " " )
reportar [ # reportar + 1 ] = " " .. texto_left .. " " .. texto_right .. " "
end
end
end
return _detalhes : Reportar ( reportar , { _no_current = true , _no_inverse = true , _custom = true } )
end
--> custom tooltip that handle mouse enter and leave on customized rows ---------------------------------------------------------------------------------------------------------
local backdrop_bar_onenter = { bgFile = [[Interface\AddOns\Details\images\background]] , tile = true , tileSize = 16 , edgeFile = " Interface \\ DialogFrame \\ UI-DialogBox-Border " , edgeSize = 8 , insets = { left = 1 , right = 1 , top = 0 , bottom = 1 } }
local backdrop_bar_onleave = { bgFile = [[Interface\AddOns\Details\images\background]] , tile = true , tileSize = 16 , insets = { left = 1 , right = 1 , top = 0 , bottom = 1 } }
function EncounterDetails : SetRowScripts ( barra , index , container )
barra : SetScript ( " OnMouseDown " , function ( self )
if ( self.fading_in ) then
return
end
self.mouse_down = _GetTime ( )
local x , y = _GetCursorPosition ( )
self.x = _math_floor ( x )
self.y = _math_floor ( y )
--EncounterDetailsFrame:StartMoving()
EncounterDetailsFrame.isMoving = true
end )
barra : SetScript ( " OnMouseUp " , function ( self )
if ( self.fading_in ) then
return
end
if ( EncounterDetailsFrame.isMoving ) then
--EncounterDetailsFrame:GetParent():StopMovingOrSizing()
EncounterDetailsFrame.isMoving = false
--instancia:SaveMainWindowPosition() --> precisa fazer algo pra salvar o trem
end
local x , y = _GetCursorPosition ( )
x = _math_floor ( x )
y = _math_floor ( y )
if ( ( self.mouse_down + 0.4 > _GetTime ( ) and ( x == self.x and y == self.y ) ) or ( x == self.x and y == self.y ) ) then
_detalhes : BossInfoRowClick ( self )
end
end )
barra : SetScript ( " OnEnter " , --> MOUSE OVER
function ( self )
--> aqui 1
if ( container.fading_in or container.faded ) then
return
end
self.mouse_over = true
self : SetHeight ( EncounterDetails.Frame . DefaultBarHeight + 1 )
self : SetAlpha ( 1 )
EncounterDetails.SetBarBackdrop_OnEnter ( self )
--GameTooltip:SetOwner (self, "ANCHOR_TOPRIGHT")
GameCooltip : Preset ( 2 )
GameCooltip : SetOwner ( self )
EncounterDetails : FormatCooltipSettings ( )
if ( not self.TTT ) then --> tool tip type
return
end
if ( self.TTT == " damage_taken " ) then --> damage taken
DamageTakenDetails ( self.jogador , barra )
elseif ( self.TTT == " habilidades_inimigas " ) then --> enemy abilytes
self.spellid = self.jogador [ 4 ]
EnemySkills ( self.jogador , self )
elseif ( self.TTT == " total_interrupt " ) then
self.spellid = self.jogador [ 3 ]
KickBy ( self.jogador , self )
elseif ( self.TTT == " dispell " ) then
self.spellid = self.jogador [ 3 ]
DispellInfo ( self.jogador , self )
elseif ( self.TTT == " morte " ) then --> deaths
KillInfo ( self.jogador , self ) --> aqui 2
end
GameCooltip : Show ( )
end )
barra : SetScript ( " OnLeave " , --> MOUSE OUT
function ( self )
self : SetScript ( " OnUpdate " , nil )
if ( self.fading_in or self.faded or not self : IsShown ( ) or self.hidden ) then
return
end
self : SetHeight ( EncounterDetails.Frame . DefaultBarHeight )
self : SetAlpha ( 0.9 )
EncounterDetails.SetBarBackdrop_OnLeave ( self )
GameTooltip : Hide ( )
GameCooltip : Hide ( )
if ( self.OverlayTexture ) then
self.OverlayTexture : Hide ( )
end
end )
end
--> Here start the data mine ---------------------------------------------------------------------------------------------------------
function EncounterDetails : OpenAndRefresh ( _ , segment )
local frame = EncounterDetailsFrame --alias
DebugMessage ( " OpenAndRefresh() called " )
_G [ frame : GetName ( ) .. " SegmentsDropdown " ] . MyObject : Refresh ( )
EncounterDetails.LastOpenedTime = GetTime ( )
_G [ frame : GetName ( ) .. " SegmentsDropdown " ] . MyObject : Refresh ( )
EncounterDetailsFrame.ShowType = EncounterDetails.db . last_section_selected
if ( segment ) then
_combat_object = EncounterDetails : GetCombat ( segment )
EncounterDetails._segment = segment
DebugMessage ( " there's a segment to use: " , segment , _combat_object , _combat_object and _combat_object.is_boss )
else
DebugMessage ( " no segment has been passed, looping segments to find one. " )
local historico = _detalhes.tabela_historico . tabelas
local foundABoss = false
for index , combate in ipairs ( historico ) do
if ( combate.is_boss and combate.is_boss . index ) then
EncounterDetails._segment = index
_combat_object = combate
DebugMessage ( " segment found: " , index , combate : GetCombatName ( ) , combate.is_trash )
--the first segment found here will be the first segment the dropdown found, so it can use the index 1 of the dropdown list
_G [ frame : GetName ( ) .. " SegmentsDropdown " ] . MyObject : Select ( 1 , true )
foundABoss = index
break
end
end
if ( not foundABoss ) then
DebugMessage ( " boss not found during the segment loop " )
end
end
if ( not _combat_object ) then
--EncounterDetails:Msg ("no combat found.")
DebugMessage ( " _combat_object is nil, EXIT " )
return
end
local boss_id
local map_id
local boss_info
local ToK = _detalhes.ToKFunctions [ _detalhes.ps_abbreviation ]
if ( EncounterDetails.debugmode and not _combat_object.is_boss ) then
_combat_object.is_boss = {
index = 1 ,
name = " Immerseus " ,
zone = " Siege of Orggrimar " ,
mapid = 1136 ,
encounter = " Immerseus "
}
end
if ( not _combat_object.is_boss ) then
DebugMessage ( " _combat_object is not a boss, trying another loop in the segments " )
local foundSegment
for index , combat in _ipairs ( EncounterDetails : GetCombatSegments ( ) ) do
if ( combat.is_boss and EncounterDetails : GetBossDetails ( combat.is_boss . mapid , combat.is_boss . index ) ) then
_combat_object = combat
--the first segment found here will be the first segment the dropdown found, so it can use the index 1 of the dropdown list
_G [ frame : GetName ( ) .. " SegmentsDropdown " ] . MyObject : Select ( 1 , true )
DebugMessage ( " found another segment during another loop " , index , combat : GetCombatName ( ) , combat.is_trash )
foundSegment = true
break
end
end
if ( not foundSegment ) then
DebugMessage ( " boss not found during the second loop segment " )
end
if ( not _combat_object.is_boss ) then
DebugMessage ( " _combat_object still isn't a boss segment, trying to get the last segment shown. " )
if ( EncounterDetails.LastSegmentShown ) then
_combat_object = EncounterDetails.LastSegmentShown
DebugMessage ( " found the last segment shown, using it. " )
else
DebugMessage ( " the segment isn't a boss, EXIT. " )
return
end
end
end
--> the segment is a boss
boss_id = _combat_object.is_boss . index
map_id = _combat_object.is_boss . mapid
boss_info = _detalhes : GetBossDetails ( _combat_object.is_boss . mapid , _combat_object.is_boss . index )
EncounterDetails.Frame . switch ( EncounterDetailsFrame.ShowType )
if ( EncounterDetailsFrame.ShowType == " phases " ) then
EncounterDetailsPhaseFrame.OnSelectPhase ( 1 )
elseif ( EncounterDetailsFrame.ShowType == " graph " ) then
EncounterDetails : BuildDpsGraphic ( )
elseif ( EncounterDetailsFrame.ShowType == " spellsauras " ) then
--refresh spells and auras
--EncounterDetails.SpellScrollframe:Refresh()
EncounterDetails.update_enemy_spells ( )
EncounterDetails.update_bossmods ( )
end
EncounterDetails.LastSegmentShown = _combat_object
-------------- set boss name and zone name --------------
EncounterDetailsFrame.boss_name : SetText ( _combat_object.is_boss . encounter )
EncounterDetailsFrame.raid_name : SetText ( _combat_object.is_boss . zone )
-------------- set portrait and background image --------------
local mapID = _combat_object.is_boss . mapid
local L , R , T , B , Texture = EncounterDetails : GetBossIcon ( mapID , _combat_object.is_boss . index )
if ( L ) then
EncounterDetailsFrame.boss_icone : SetTexture ( Texture )
EncounterDetailsFrame.boss_icone : SetTexCoord ( L , R , T , B )
else
EncounterDetailsFrame.boss_icone : SetTexture ( [[Interface\CHARACTERFRAME\TempPortrait]] )
EncounterDetailsFrame.boss_icone : SetTexCoord ( 0 , 1 , 0 , 1 )
end
--[=[
local file , L , R , T , B = EncounterDetails : GetRaidBackground ( _combat_object.is_boss . mapid )
if ( file ) then
EncounterDetailsFrame.raidbackground : SetTexture ( file )
EncounterDetailsFrame.raidbackground : SetTexCoord ( L , R , T , B )
else
EncounterDetailsFrame.raidbackground : SetTexture ( [[Interface\Glues\LOADINGSCREENS\LoadScreenDungeon]] )
EncounterDetailsFrame.raidbackground : SetTexCoord ( 0 , 1 , 120 / 512 , 408 / 512 )
end
--]=]
EncounterDetailsFrame.raidbackground : SetTexture ( .3 , .3 , .3 , .5 )
-------------- set totals on down frame --------------
--[[ data mine:
_combat_object [ " totals_grupo " ] hold the total [ 1 ] damage // [ 2 ] heal // [ 3 ] [ energy_name ] energies // [ 4 ] [ misc_name ] miscs --]]
--> Container Overall Damage Taken ~damagetaken ~damage taken
--[[ data mine:
combat tables have 4 containers [ 1 ] damage [ 2 ] heal [ 3 ] energy [ 4 ] misc each container have 2 tables : . _NameIndexTable and . _ActorTable --]]
local DamageContainer = _combat_object [ class_type_damage ]
local damage_taken = _detalhes.atributo_damage : RefreshWindow ( { } , _combat_object , _ , { key = " damage_taken " , modo = _detalhes.modos . group } )
local container = frame.overall_damagetaken . gump
local quantidade = 0
local dano_do_primeiro = 0
for index , jogador in _ipairs ( DamageContainer._ActorTable ) do
--> ta em ordem de quem tomou mais dano.
if ( not jogador.grupo ) then --> s� aparecer nego da raid
break
end
if ( jogador.classe and jogador.classe ~= " UNGROUPPLAYER " and jogador.classe ~= " UNKNOW " ) then
local barra = container.barras [ index ]
if ( not barra ) then
barra = EncounterDetails : CreateRow ( index , container , 1 , 0 , - 1 )
_detalhes : SetFontSize ( barra.lineText1 , CONST_FONT_SIZE )
_detalhes : SetFontSize ( barra.lineText4 , CONST_FONT_SIZE )
barra.TTT = " damage_taken " -- tool tip type --> damage taken
barra.report_text = Loc [ " STRING_PLUGIN_NAME " ] .. " ! " .. Loc [ " STRING_DAMAGE_TAKEN_REPORT " ]
end
if ( jogador.nome : find ( " - " ) ) then
barra.lineText1 : SetText ( jogador.nome : gsub ( ( " -.* " ) , " " ) )
else
barra.lineText1 : SetText ( jogador.nome )
end
barra.lineText4 : SetText ( ToK ( _ , jogador.damage_taken ) )
_detalhes : name_space ( barra )
barra.jogador = jogador
barra.textura : SetStatusBarColor ( _unpack ( _detalhes.class_colors [ jogador.classe ] ) )
if ( index == 1 ) then
barra.textura : SetValue ( 100 )
dano_do_primeiro = jogador.damage_taken
else
barra.textura : SetValue ( jogador.damage_taken / dano_do_primeiro * 100 )
end
local specID = Details : GetSpec ( jogador.nome )
if ( specID ) then
local texture , l , r , t , b = Details : GetSpecIcon ( specID , false )
barra.icone : SetTexture ( texture )
barra.icone : SetTexCoord ( l , r , t , b )
else
barra.icone : SetTexture ( " Interface \\ AddOns \\ Details \\ images \\ classes_small " )
if ( EncounterDetails.class_coords [ jogador.classe ] ) then
barra.icone : SetTexCoord ( _unpack ( EncounterDetails.class_coords [ jogador.classe ] ) )
end
end
barra : Show ( )
quantidade = quantidade + 1
end
end
EncounterDetails : JB_AtualizaContainer ( container , quantidade )
if ( quantidade < # container.barras ) then
for i = quantidade + 1 , # container.barras , 1 do
if ( barra ) then
barra : Hide ( )
end
end
end
--> Fim do container Overall Damage Taken
--> Container Overall Habilidades Inimigas ~damage taken by spell
local habilidades_poll = { }
--> pega as magias cont�nuas presentes em todas as fases
--deprecated
if ( boss_info and boss_info.continuo ) then
for index , spellid in _ipairs ( boss_info.continuo ) do
habilidades_poll [ spellid ] = true
end
end
--> pega as habilidades que pertence especificamente a cada fase
--deprecated
if ( boss_info and boss_info.phases ) then
for fase_id , fase in _ipairs ( boss_info.phases ) do
if ( fase.spells ) then
for index , spellid in _ipairs ( fase.spells ) do
habilidades_poll [ spellid ] = true
end
end
end
end
local habilidades_usadas = { }
local have_pool = false
for spellid , _ in _pairs ( habilidades_poll ) do
have_pool = true
break
end
for index , jogador in _ipairs ( DamageContainer._ActorTable ) do
--> get all spells from neutral and hostile npcs
if (
_bit_band ( jogador.flag_original , 0x00000060 ) ~= 0 and --is neutral or hostile
( not jogador.owner or ( _bit_band ( jogador.owner . flag_original , 0x00000060 ) ~= 0 and not jogador.owner . grupo and _bit_band ( jogador.owner . flag_original , 0x00000400 ) == 0 ) ) and --isn't a pet or the owner isn't a player
not jogador.grupo and
_bit_band ( jogador.flag_original , 0x00000400 ) == 0
) then
local habilidades = jogador.spells . _ActorTable
for id , habilidade in _pairs ( habilidades ) do
--if (habilidades_poll [id]) then
--> esse jogador usou uma habilidade do boss
local esta_habilidade = habilidades_usadas [ id ] --> tabela n�o numerica, pq diferentes monstros podem castar a mesma magia
if ( not esta_habilidade ) then
esta_habilidade = { 0 , { } , { } , id } --> [1] total dano causado [2] jogadores que foram alvos [3] jogadores que castaram essa magia [4] ID da magia
habilidades_usadas [ id ] = esta_habilidade
end
--> adiciona ao [1] total de dano que esta habilidade causou
esta_habilidade [ 1 ] = esta_habilidade [ 1 ] + habilidade.total
--> adiciona ao [3] total do jogador que castou
if ( not esta_habilidade [ 3 ] [ jogador.nome ] ) then
esta_habilidade [ 3 ] [ jogador.nome ] = 0
end
esta_habilidade [ 3 ] [ jogador.nome ] = esta_habilidade [ 3 ] [ jogador.nome ] + habilidade.total
--> pega os alvos e adiciona ao [2]
local alvos = habilidade.targets
for target_name , amount in _pairs ( alvos ) do
--> ele tem o nome do jogador, vamos ver se este alvo � realmente um jogador verificando na tabela do combate
local tabela_dano_do_jogador = DamageContainer._ActorTable [ DamageContainer._NameIndexTable [ target_name ] ]
if ( tabela_dano_do_jogador and tabela_dano_do_jogador.grupo ) then
if ( not esta_habilidade [ 2 ] [ target_name ] ) then
esta_habilidade [ 2 ] [ target_name ] = { 0 , tabela_dano_do_jogador.classe }
end
esta_habilidade [ 2 ] [ target_name ] [ 1 ] = esta_habilidade [ 2 ] [ target_name ] [ 1 ] + amount
end
end
--end
end
elseif ( have_pool ) then
--> check if the spell id is in the spell poll.
local habilidades = jogador.spells . _ActorTable
for id , habilidade in _pairs ( habilidades ) do
if ( habilidades_poll [ id ] ) then
--> esse jogador usou uma habilidade do boss
local esta_habilidade = habilidades_usadas [ id ] --> tabela n�o numerica, pq diferentes monstros podem castar a mesma magia
if ( not esta_habilidade ) then
esta_habilidade = { 0 , { } , { } , id } --> [1] total dano causado [2] jogadores que foram alvos [3] jogadores que castaram essa magia [4] ID da magia
habilidades_usadas [ id ] = esta_habilidade
end
--> adiciona ao [1] total de dano que esta habilidade causou
esta_habilidade [ 1 ] = esta_habilidade [ 1 ] + habilidade.total
--> adiciona ao [3] total do jogador que castou
if ( not esta_habilidade [ 3 ] [ jogador.nome ] ) then
esta_habilidade [ 3 ] [ jogador.nome ] = 0
end
esta_habilidade [ 3 ] [ jogador.nome ] = esta_habilidade [ 3 ] [ jogador.nome ] + habilidade.total
--> pega os alvos e adiciona ao [2]
local alvos = habilidade.targets
for target_name , amount in _pairs ( alvos ) do
--> ele tem o nome do jogador, vamos ver se este alvo � realmente um jogador verificando na tabela do combate
local tabela_dano_do_jogador = DamageContainer._ActorTable [ DamageContainer._NameIndexTable [ target_name ] ]
if ( tabela_dano_do_jogador and tabela_dano_do_jogador.grupo ) then
if ( not esta_habilidade [ 2 ] [ target_name ] ) then
esta_habilidade [ 2 ] [ target_name ] = { 0 , tabela_dano_do_jogador.classe }
end
esta_habilidade [ 2 ] [ target_name ] [ 1 ] = esta_habilidade [ 2 ] [ target_name ] [ 1 ] + amount
end
end
end
end
end
end
--> por em ordem
local tabela_em_ordem = { }
local jaFoi = { }
for id , tabela in _pairs ( habilidades_usadas ) do
local spellname = Details.GetSpellInfo ( tabela [ 4 ] )
if ( not jaFoi [ spellname ] ) then
tabela [ 5 ] = spellname
tabela_em_ordem [ # tabela_em_ordem + 1 ] = tabela
jaFoi [ spellname ] = # tabela_em_ordem
else
local index = jaFoi [ spellname ]
tabela_em_ordem [ index ] [ 1 ] = tabela_em_ordem [ index ] [ 1 ] + tabela [ 1 ]
local tt = tabela_em_ordem [ index ] [ 2 ] -- tabela com [PlayerName] = {amount, class}
for playerName , t in pairs ( tabela [ 2 ] ) do
local amount , class = unpack ( t )
if ( tt [ playerName ] ) then
tt [ playerName ] [ 1 ] = tt [ playerName ] [ 1 ] + amount
else
tt [ playerName ] = { amount , class }
end
end
end
end
_table_sort ( tabela_em_ordem , _detalhes.Sort1 )
container = frame.overall_habilidades . gump
quantidade = 0
dano_do_primeiro = 0
--> mostra o resultado nas barras
for index , habilidade in _ipairs ( tabela_em_ordem ) do
--> ta em ordem das habilidades que deram mais dano
if ( habilidade [ 1 ] > 0 ) then
local barra = container.barras [ index ]
if ( not barra ) then
barra = EncounterDetails : CreateRow ( index , container , 1 , 0 , - 1 )
barra.TTT = " habilidades_inimigas " -- tool tip type --enemy abilities
barra.report_text = Loc [ " STRING_PLUGIN_NAME " ] .. " ! " .. Loc [ " STRING_ABILITY_DAMAGE " ]
_detalhes : SetFontSize ( barra.lineText1 , CONST_FONT_SIZE )
_detalhes : SetFontSize ( barra.lineText4 , CONST_FONT_SIZE )
barra.t : SetVertexColor ( 1 , .8 , .8 , .8 )
end
local nome_magia , _ , icone_magia = _GetSpellInfo ( habilidade [ 4 ] )
barra.lineText1 : SetText ( nome_magia ) -- .. " (|cFFa0a0a0" .. habilidade[4] .. "|r)
barra.lineText4 : SetText ( ToK ( _ , habilidade [ 1 ] ) )
_detalhes : name_space ( barra )
barra.jogador = habilidade --> barra.jogador agora tem a tabela com --> [1] total dano causado [2] jogadores que foram alvos [3] jogadores que castaram essa magia [4] ID da magia
local spellSchool = _detalhes.spell_school_cache [ nome_magia ] or 1
local r , g , b = _detalhes : GetSpellSchoolColor ( spellSchool )
barra.t : SetVertexColor ( r , g , b )
if ( index == 1 ) then
barra.textura : SetValue ( 100 )
dano_do_primeiro = habilidade [ 1 ]
else
barra.textura : SetValue ( habilidade [ 1 ] / dano_do_primeiro * 100 )
end
barra.icone : SetTexture ( icone_magia )
barra.icone : SetTexCoord ( .1 , .9 , .1 , .9 )
barra : Show ( )
quantidade = quantidade + 1
end
end
EncounterDetails : JB_AtualizaContainer ( container , quantidade )
if ( quantidade < # container.barras ) then
for i = quantidade + 1 , # container.barras , 1 do
container.barras [ i ] : Hide ( )
end
end
--> Fim do container Over Habilidades Inimigas
--> Identificar os ADDs da luta:
--> declara a pool onde ser�o armazenados os adds existentas na luta
local adds_pool = { }
--> pega as habilidades que pertence especificamente a cada fase
if ( boss_info and boss_info.phases ) then
for fase_id , fase in _ipairs ( boss_info.phases ) do
if ( fase.adds ) then
for index , addId in _ipairs ( fase.adds ) do
adds_pool [ addId ] = true
end
end
end
end
--> agora ja tenho a lista de todos os adds da luta
-- vasculhar o container de dano e achar os adds:
-- ~add
local adds = { }
for index , jogador in _ipairs ( DamageContainer._ActorTable ) do
--> s� estou interessado nos adds, conferir pelo nome
if ( adds_pool [ _detalhes : GetNpcIdFromGuid ( jogador.serial ) ] or (
jogador.flag_original and
bit.band ( jogador.flag_original , 0x00000060 ) ~= 0 and
( not jogador.owner or ( _bit_band ( jogador.owner . flag_original , 0x00000060 ) ~= 0 and not jogador.owner . grupo and _bit_band ( jogador.owner . flag_original , 0x00000400 ) == 0 ) ) and --isn't a pet or the owner isn't a player
not jogador.grupo and
_bit_band ( jogador.flag_original , 0x00000400 ) == 0
) ) then --> � um inimigo ou neutro
local nome = jogador.nome
if ( not nome : find ( " %* " ) ) then
local tabela = { nome = nome , total = 0 , dano_em = { } , dano_em_total = 0 , damage_from = { } , damage_from_total = 0 }
--> total de dano que ele causou
tabela.total = jogador.total
--> em quem ele deu dano
for target_name , amount in _pairs ( jogador.targets ) do
local este_jogador = _combat_object ( 1 , target_name )
if ( este_jogador ) then
if ( este_jogador.classe ~= " PET " and este_jogador.classe ~= " UNGROUPPLAYER " and este_jogador.classe ~= " UNKNOW " ) then
tabela.dano_em [ # tabela.dano_em + 1 ] = { target_name , amount , este_jogador.classe }
tabela.dano_em_total = tabela.dano_em_total + amount
end
end
end
_table_sort ( tabela.dano_em , _detalhes.Sort2 )
--> quem deu dano nele
for agressor , _ in _pairs ( jogador.damage_from ) do
--local este_jogador = DamageContainer._ActorTable [DamageContainer._NameIndexTable [agressor]]
local este_jogador = _combat_object ( 1 , agressor )
if ( este_jogador and este_jogador : IsPlayer ( ) ) then
for target_name , amount in _pairs ( este_jogador.targets ) do
if ( target_name == nome ) then
tabela.damage_from [ # tabela.damage_from + 1 ] = { agressor , amount , este_jogador.classe }
tabela.damage_from_total = tabela.damage_from_total + amount
end
end
end
end
_table_sort ( tabela.damage_from , sort_damage_from )
tabela [ 1 ] = tabela.damage_from_total
tinsert ( adds , tabela )
end
end
end
--> montou a tabela, agora precisa mostrar no painel
local function _DanoFeito ( self )
self.textura : SetBlendMode ( " ADD " )
local barra = self : GetParent ( )
local tabela = barra.jogador
local dano_em = tabela.dano_em
GameCooltip : Preset ( 2 )
GameCooltip : SetOwner ( self )
EncounterDetails : FormatCooltipSettings ( )
GameCooltip : AddLine ( barra.lineText1 : GetText ( ) .. " " .. " Damage Done " )
local topDamage = dano_em [ 1 ] and dano_em [ 1 ] [ 2 ]
local dano_em_total = tabela.dano_em_total
for _ , esta_tabela in _pairs ( dano_em ) do
local coords = EncounterDetails.class_coords [ esta_tabela [ 3 ] ]
GameCooltip : AddLine ( EncounterDetails : GetOnlyName ( esta_tabela [ 1 ] ) , _detalhes : ToK ( esta_tabela [ 2 ] ) .. " ( " .. _cstr ( " %.1f " , esta_tabela [ 2 ] / dano_em_total * 100 ) .. " %) " , 1 , " white " , " orange " )
local specID = Details : GetSpec ( esta_tabela [ 1 ] )
if ( specID ) then
local texture , l , r , t , b = Details : GetSpecIcon ( specID , false )
GameCooltip : AddIcon ( texture , 1 , 1 , EncounterDetails.CooltipLineHeight , EncounterDetails.CooltipLineHeight , l , r , t , b )
else
GameCooltip : AddIcon ( [[Interface\AddOns\Details\images\classes_small]] , 1 , 1 , EncounterDetails.CooltipLineHeight , EncounterDetails.CooltipLineHeight , ( coords [ 1 ] ) , ( coords [ 2 ] ) , ( coords [ 3 ] ) , ( coords [ 4 ] ) )
end
local actorClass = Details : GetClass ( esta_tabela [ 1 ] )
if ( actorClass ) then
local r , g , b = Details : GetClassColor ( actorClass )
GameCooltip : AddStatusBar ( esta_tabela [ 2 ] / topDamage * 100 , 1 , r , g , b , EncounterDetailsFrame.CooltipStatusbarAlpha , false , { value = 100 , color = { .21 , .21 , .21 , 0.5 } , texture = [[Interface\AddOns\Details\images\bar_serenity]] } )
else
GameCooltip : AddStatusBar ( esta_tabela [ 2 ] / topDamage * 100 , 1 , .3 , .3 , .3 , .3 , false , { value = 100 , color = { .21 , .21 , .21 , 0.8 } , texture = [[Interface\AddOns\Details\images\bar_serenity]] } )
end
end
self.textura : SetBlendMode ( " ADD " )
self.textura : SetSize ( 18 , 18 )
self.ArrowOnEnter = true
GameCooltip : SetOwner ( self , " right " , " left " , - 10 , 0 )
GameCooltip : AddLine ( " " )
GameCooltip : AddLine ( " CLICK to Report " )
GameCooltip : Show ( )
end
local function _DanoRecebido ( self )
local barra = self
local tabela = barra.jogador
local damage_from = tabela.damage_from
GameCooltip : Preset ( 2 )
GameCooltip : SetOwner ( self )
EncounterDetails : FormatCooltipSettings ( )
GameCooltip : AddLine ( barra.lineText1 : GetText ( ) .. " " .. Loc [ " STRING_DAMAGE_TAKEN " ] )
local damage_from_total = tabela.damage_from_total
local topDamage = damage_from [ 1 ] and damage_from [ 1 ] [ 2 ]
for _ , esta_tabela in _pairs ( damage_from ) do
local coords = EncounterDetails.class_coords [ esta_tabela [ 3 ] ]
if ( coords ) then
GameCooltip : AddLine ( EncounterDetails : GetOnlyName ( esta_tabela [ 1 ] ) , _detalhes : ToK ( esta_tabela [ 2 ] ) .. " ( " .. _cstr ( " %.1f " , esta_tabela [ 2 ] / damage_from_total * 100 ) .. " %) " , 1 , " white " , " orange " , nil , nil , " MONOCHRONE " )
local specID = Details : GetSpec ( esta_tabela [ 1 ] )
if ( specID ) then
local texture , l , r , t , b = Details : GetSpecIcon ( specID , false )
GameCooltip : AddIcon ( texture , 1 , 1 , EncounterDetails.CooltipLineHeight , EncounterDetails.CooltipLineHeight , l , r , t , b )
else
GameCooltip : AddIcon ( [[Interface\AddOns\Details\images\classes_small]] , 1 , 1 , EncounterDetails.CooltipLineHeight , EncounterDetails.CooltipLineHeight , ( coords [ 1 ] ) , ( coords [ 2 ] ) , ( coords [ 3 ] ) , ( coords [ 4 ] ) )
end
local actorClass = Details : GetClass ( esta_tabela [ 1 ] )
if ( actorClass ) then
local r , g , b = Details : GetClassColor ( actorClass )
GameCooltip : AddStatusBar ( esta_tabela [ 2 ] / topDamage * 100 , 1 , r , g , b , EncounterDetailsFrame.CooltipStatusbarAlpha , false , { value = 100 , color = { .21 , .21 , .21 , 0.5 } , texture = [[Interface\AddOns\Details\images\bar_serenity]] } )
else
GameCooltip : AddStatusBar ( esta_tabela [ 2 ] / topDamage * 100 , 1 , .3 , .3 , .3 , .3 , false , { value = 100 , color = { .21 , .21 , .21 , 0.8 } , texture = [[Interface\AddOns\Details\images\bar_serenity]] } )
end
else
GameCooltip : AddLine ( esta_tabela [ 1 ] , _detalhes : ToK ( esta_tabela [ 2 ] ) .. " ( " .. _cstr ( " %.1f " , esta_tabela [ 2 ] / damage_from_total * 100 ) .. " %) " )
GameCooltip : AddStatusBar ( esta_tabela [ 2 ] / topDamage * 100 , 1 , .3 , .3 , .3 , .3 , false , { value = 100 , color = { .21 , .21 , .21 , 0.8 } , texture = [[Interface\AddOns\Details\images\bar_serenity]] } )
end
end
self.mouse_over = true
self : SetHeight ( EncounterDetails.Frame . DefaultBarHeight + 1 )
self : SetAlpha ( 1 )
EncounterDetails.SetBarBackdrop_OnEnter ( self )
GameCooltip : AddLine ( " " )
GameCooltip : AddLine ( " CLICK to Report " )
GameCooltip : SetOwner ( self , " left " , " right " , - 60 , 0 )
GameCooltip : Show ( )
end
local function _OnHide ( self )
GameCooltip : Hide ( )
if ( self.ArrowOnEnter ) then
self.textura : SetBlendMode ( " BLEND " )
self.textura : SetSize ( 16 , 16 )
else
self : SetAlpha ( 0.9 )
self : SetHeight ( EncounterDetails.Frame . DefaultBarHeight )
EncounterDetails.SetBarBackdrop_OnLeave ( self )
end
end
local y = 10
local frame_adds = EncounterDetailsFrame.overall_adds
container = frame_adds.gump
local index = 1
quantidade = 0
--table.sort (adds, sort_by_name)
table.sort ( adds , _detalhes.Sort1 )
for index , esta_tabela in _ipairs ( adds ) do
local addName = esta_tabela.nome
local barra = container.barras [ index ]
if ( not barra ) then
barra = EncounterDetails : CreateRow ( index , container , - 0 )
barra : SetWidth ( 155 )
barra : SetScript ( " OnEnter " , _DanoRecebido )
barra : SetScript ( " OnLeave " , _OnHide )
barra : HookScript ( " OnMouseDown " , EncounterDetails.BossInfoRowClick )
local add_damage_done = _CreateFrame ( " Button " , nil , barra , " BackdropTemplate " )
barra.report_text = " Details! Damage Taken of "
add_damage_done.report_text = " Details! Damage Done of "
add_damage_done.barra = barra
add_damage_done : SetWidth ( EncounterDetails.CooltipLineHeight )
add_damage_done : SetHeight ( EncounterDetails.CooltipLineHeight )
add_damage_done : EnableMouse ( true )
add_damage_done : SetResizable ( false )
add_damage_done : SetPoint ( " left " , barra , " left " , 0 , 0 )
add_damage_done : SetBackdrop ( { bgFile = [[Interface\AddOns\Details\images\background]] , tile = true , tileSize = 16 } )
add_damage_done : SetBackdropColor ( .5 , .0 , .0 , 0.5 )
add_damage_done.textura = add_damage_done : CreateTexture ( nil , " overlay " )
add_damage_done.textura : SetTexture ( " Interface \\ Buttons \\ UI-MicroStream-Red " )
add_damage_done.textura : SetWidth ( 16 )
add_damage_done.textura : SetHeight ( 16 )
add_damage_done.textura : SetPoint ( " topleft " , add_damage_done , " topleft " )
add_damage_done : SetScript ( " OnEnter " , _DanoFeito )
add_damage_done : SetScript ( " OnLeave " , _OnHide )
add_damage_done : SetScript ( " OnClick " , EncounterDetails.BossInfoRowClick )
barra.lineText1 : SetPoint ( " left " , add_damage_done , " right " , 2 , 0 )
barra.textura : SetStatusBarTexture ( " " )
_detalhes : SetFontSize ( barra.lineText1 , CONST_FONT_SIZE )
_detalhes : SetFontSize ( barra.lineText4 , CONST_FONT_SIZE )
barra.TTT = " add "
add_damage_done.TTT = " add "
end
barra.lineText1 : SetText ( addName )
barra.lineText4 : SetText ( _detalhes : ToK ( esta_tabela.damage_from_total ) )
barra.lineText1 : SetSize ( barra : GetWidth ( ) - barra.lineText4 : GetStringWidth ( ) - 34 , 15 )
barra.jogador = esta_tabela --> barra.jogador agora tem a tabela com --> [1] total dano causado [2] jogadores que foram alvos [3] jogadores que castaram essa magia [4] ID da magia
--barra.textura:SetStatusBarColor (_unpack (_detalhes.class_colors [jogador.classe]))
barra.textura : SetStatusBarColor ( 1 , 1 , 1 , 1 ) --> a cor pode ser a spell school da magia
barra.textura : SetValue ( 100 )
barra : Show ( )
quantidade = quantidade + 1
index = index + 1
end
EncounterDetails : JB_AtualizaContainer ( container , quantidade , 4 )
if ( quantidade < # container.barras ) then
for i = quantidade + 1 , # container.barras , 1 do
container.barras [ i ] : Hide ( )
end
end
--> Fim do container Over ADDS
--> Inicio do Container de Interrupts:
local misc = _combat_object [ class_type_misc ]
local total_interrompido = _detalhes.atributo_misc : RefreshWindow ( { } , _combat_object , _ , { key = " interrupt " , modo = _detalhes.modos . group } )
local frame_interrupts = EncounterDetailsFrame.overall_interrupt
container = frame_interrupts.gump
quantidade = 0
local interrupt_do_primeiro = 0
local habilidades_interrompidas = { }
for index , jogador in _ipairs ( misc._ActorTable ) do
if ( not jogador.grupo ) then --> s� aparecer nego da raid
break
end
if ( jogador.classe and jogador.classe ~= " UNGROUPPLAYER " ) then
local interrupts = jogador.interrupt
if ( interrupts and interrupts > 0 ) then
local oque_interrompi = jogador.interrompeu_oque
--> vai ter [spellid] = quantidade
for spellid , amt in _pairs ( oque_interrompi ) do
if ( not habilidades_interrompidas [ spellid ] ) then --> se a spell n�o tiver na pool, cria a tabela dela
habilidades_interrompidas [ spellid ] = { { } , 0 , spellid } --> tabela com quem interrompeu e o total de vezes que a habilidade foi interrompida
end
if ( not habilidades_interrompidas [ spellid ] [ 1 ] [ jogador.nome ] ) then --> se o jogador n�o tiver na pool dessa habilidade interrompida, cria um indice pra ele.
habilidades_interrompidas [ spellid ] [ 1 ] [ jogador.nome ] = { 0 , jogador.classe }
end
habilidades_interrompidas [ spellid ] [ 2 ] = habilidades_interrompidas [ spellid ] [ 2 ] + amt
habilidades_interrompidas [ spellid ] [ 1 ] [ jogador.nome ] [ 1 ] = habilidades_interrompidas [ spellid ] [ 1 ] [ jogador.nome ] [ 1 ] + amt
end
end
end
end
--> por em ordem
tabela_em_ordem = { }
for spellid , tabela in _pairs ( habilidades_interrompidas ) do
tabela_em_ordem [ # tabela_em_ordem + 1 ] = tabela
end
_table_sort ( tabela_em_ordem , _detalhes.Sort2 )
index = 1
for _ , tabela in _ipairs ( tabela_em_ordem ) do
local barra = container.barras [ index ]
if ( not barra ) then
barra = EncounterDetails : CreateRow ( index , container , 3 , 0 , - 6 )
_detalhes : SetFontSize ( barra.lineText1 , CONST_FONT_SIZE )
_detalhes : SetFontSize ( barra.lineText4 , CONST_FONT_SIZE )
barra.TTT = " total_interrupt " -- tool tip type
barra.report_text = " Details! " .. Loc [ " STRING_INTERRUPTS_OF " ]
barra : SetWidth ( 155 )
end
local spellid = tabela [ 3 ]
local nome_magia , _ , icone_magia = _GetSpellInfo ( tabela [ 3 ] )
local successful = 0
--> pegar quantas vezes a magia passou com sucesso.
for _ , enemy_actor in _ipairs ( DamageContainer._ActorTable ) do
if ( enemy_actor.spells . _ActorTable [ spellid ] ) then
local spell = enemy_actor.spells . _ActorTable [ spellid ]
successful = spell.successful_casted
end
end
barra.lineText1 : SetText ( nome_magia )
local total = successful + tabela [ 2 ]
barra.lineText4 : SetText ( tabela [ 2 ] .. " / " .. total )
_detalhes : name_space ( barra )
barra.jogador = tabela
--barra.textura:SetStatusBarColor (_unpack (_detalhes.class_colors [jogador.classe]))
if ( index == 1 ) then
barra.textura : SetValue ( 100 )
dano_do_primeiro = tabela [ 2 ]
else
barra.textura : SetValue ( tabela [ 2 ] / dano_do_primeiro * 100 )
end
barra.icone : SetTexture ( icone_magia )
barra.icone : SetTexCoord ( .1 , .9 , .1 , .9 )
barra : Show ( )
quantidade = quantidade + 1
index = index + 1
end
EncounterDetails : JB_AtualizaContainer ( container , quantidade , 4 )
if ( quantidade < # container.barras ) then
for i = quantidade + 1 , # container.barras , 1 do
container.barras [ i ] : Hide ( )
end
end
--> Fim do container dos Interrupts
--> Inicio do Container dos Dispells:
--> force refresh window behavior
local total_dispelado = _detalhes.atributo_misc : RefreshWindow ( { } , _combat_object , _ , { key = " dispell " , modo = _detalhes.modos . group } )
local frame_dispell = EncounterDetailsFrame.overall_dispell
container = frame_dispell.gump
quantidade = 0
local dispell_do_primeiro = 0
local habilidades_dispeladas = { }
for index , jogador in _ipairs ( misc._ActorTable ) do
if ( not jogador.grupo ) then --> s� aparecer nego da raid
break
end
if ( jogador.classe and jogador.classe ~= " UNGROUPPLAYER " ) then
local dispells = jogador.dispell
if ( dispells and dispells > 0 ) then
local oque_dispelei = jogador.dispell_oque
--> vai ter [spellid] = quantidade
--print ("dispell: " .. jogador.classe .. " nome: " .. jogador.nome)
for spellid , amt in _pairs ( oque_dispelei ) do
if ( not habilidades_dispeladas [ spellid ] ) then --> se a spell n�o tiver na pool, cria a tabela dela
habilidades_dispeladas [ spellid ] = { { } , 0 , spellid } --> tabela com quem dispolou e o total de vezes que a habilidade foi dispelada
end
if ( not habilidades_dispeladas [ spellid ] [ 1 ] [ jogador.nome ] ) then --> se o jogador n�o tiver na pool dessa habilidade interrompida, cria um indice pra ele.
habilidades_dispeladas [ spellid ] [ 1 ] [ jogador.nome ] = { 0 , jogador.classe }
--print (jogador.nome)
--print (jogador.classe)
end
habilidades_dispeladas [ spellid ] [ 2 ] = habilidades_dispeladas [ spellid ] [ 2 ] + amt
habilidades_dispeladas [ spellid ] [ 1 ] [ jogador.nome ] [ 1 ] = habilidades_dispeladas [ spellid ] [ 1 ] [ jogador.nome ] [ 1 ] + amt
end
end
end
end
--> por em ordem
tabela_em_ordem = { }
for spellid , tabela in _pairs ( habilidades_dispeladas ) do
tabela_em_ordem [ # tabela_em_ordem + 1 ] = tabela
end
_table_sort ( tabela_em_ordem , _detalhes.Sort2 )
index = 1
for _ , tabela in _ipairs ( tabela_em_ordem ) do
local barra = container.barras [ index ]
if ( not barra ) then
barra = EncounterDetails : CreateRow ( index , container , 3 , 3 , - 6 )
_detalhes : SetFontSize ( barra.lineText1 , CONST_FONT_SIZE )
_detalhes : SetFontSize ( barra.lineText4 , CONST_FONT_SIZE )
barra.TTT = " dispell " -- tool tip type
barra.report_text = " Details! " .. Loc [ " STRING_DISPELLS_OF " ]
barra : SetWidth ( 160 )
end
local nome_magia , _ , icone_magia = _GetSpellInfo ( tabela [ 3 ] )
barra.lineText1 : SetText ( nome_magia )
barra.lineText4 : SetText ( tabela [ 2 ] )
_detalhes : name_space ( barra )
barra.jogador = tabela
--barra.textura:SetStatusBarColor (_unpack (_detalhes.class_colors [jogador.classe]))
if ( index == 1 ) then
barra.textura : SetValue ( 100 )
dano_do_primeiro = tabela [ 2 ]
else
barra.textura : SetValue ( tabela [ 2 ] / dano_do_primeiro * 100 )
end
barra.icone : SetTexture ( icone_magia )
barra.icone : SetTexCoord ( .1 , .9 , .1 , .9 )
barra : Show ( )
quantidade = quantidade + 1
index = index + 1
end
EncounterDetails : JB_AtualizaContainer ( container , quantidade , 4 )
if ( quantidade < # container.barras ) then
for i = quantidade + 1 , # container.barras , 1 do
container.barras [ i ] : Hide ( )
end
end
--> Fim do container dos Dispells
--> Inicio do Container das Mortes:
local frame_mortes = EncounterDetailsFrame.overall_dead
container = frame_mortes.gump
quantidade = 0
-- boss_info.spells_info o erro de lua do boss � a habilidade dele que n�o foi declarada ainda
local mortes = _combat_object.last_events_tables
local habilidades_info = boss_info and boss_info.spell_mechanics or { } --barra.extra pega esse cara aqui --> ent�o esse erro � das habilidades que n�o tao
for index , tabela in _ipairs ( mortes ) do
--> {esta_morte, time, este_jogador.nome, este_jogador.classe, _UnitHealthMax (alvo_name), minutos.."m "..segundos.."s", ["dead"] = true}
local barra = container.barras [ index ]
if ( not barra ) then
barra = EncounterDetails : CreateRow ( index , container , 3 , 0 , 1 )
barra.TTT = " morte " -- tool tip type
barra.report_text = " Details! " .. Loc [ " STRING_DEAD_LOG " ]
_detalhes : SetFontSize ( barra.lineText1 , CONST_FONT_SIZE )
_detalhes : SetFontSize ( barra.lineText4 , CONST_FONT_SIZE )
barra : SetWidth ( 169 )
local overlayTexture = barra : CreateTexture ( nil , " overlay " )
overlayTexture : SetAllPoints ( )
overlayTexture : SetColorTexture ( 1 , 1 , 1 )
overlayTexture : SetAlpha ( 1 )
overlayTexture : Hide ( )
barra.OverlayTexture = overlayTexture
end
if ( tabela [ 3 ] : find ( " - " ) ) then
barra.lineText1 : SetText ( index .. " . " .. tabela [ 3 ] : gsub ( ( " -.* " ) , " " ) )
else
barra.lineText1 : SetText ( index .. " . " .. tabela [ 3 ] )
end
barra.lineText4 : SetText ( tabela [ 6 ] )
_detalhes : name_space ( barra )
barra.jogador = tabela
barra.extra = habilidades_info
barra.textura : SetStatusBarColor ( _unpack ( _detalhes.class_colors [ tabela [ 4 ] ] ) )
barra.textura : SetValue ( 100 )
barra.icone : SetTexture ( " Interface \\ AddOns \\ Details \\ images \\ classes_small " )
barra.icone : SetTexCoord ( _unpack ( EncounterDetails.class_coords [ tabela [ 4 ] ] ) )
barra : Show ( )
quantidade = quantidade + 1
end
EncounterDetails : JB_AtualizaContainer ( container , quantidade , 10 )
if ( quantidade < # container.barras ) then
for i = quantidade + 1 , # container.barras , 1 do
container.barras [ i ] : Hide ( )
end
end
end
local events_to_track = {
[ " SPELL_CAST_START " ] = true , --not instant cast
[ " SPELL_CAST_SUCCESS " ] = true , --not instant cast
[ " SPELL_AURA_APPLIED " ] = true , --if is a debuff
[ " SPELL_DAMAGE " ] = true , --damage
[ " SPELL_PERIODIC_DAMAGE " ] = true , --dot damage
[ " SPELL_HEAL " ] = true , --healing
[ " SPELL_PERIODIC_HEAL " ] = true , --dot healing
}
local enemy_spell_pool
local CLEvents = function ( self , event )
local time , token , hidding , who_serial , who_name , who_flags , who_flags2 , alvo_serial , alvo_name , alvo_flags , alvo_flags2 , spellid , spellname , school , aura_type = CombatLogGetCurrentEventInfo ( )
if ( events_to_track [ token ] and _bit_band ( who_flags or 0x0 , 0x00000060 ) ~= 0 ) then
local t = enemy_spell_pool [ spellid ]
if ( not t ) then
t = { [ " token " ] = { [ token ] = true } , [ " source " ] = who_name , [ " school " ] = school }
if ( token == " SPELL_AURA_APPLIED " ) then
t.type = aura_type
end
enemy_spell_pool [ spellid ] = t
return
elseif ( t.token [ token ] ) then
return
end
t.token [ token ] = true
if ( token == " SPELL_AURA_APPLIED " ) then
t.type = aura_type
end
end
end
local installPluginFunc = function ( )
if ( Details and Details.InstallOkey and Details : InstallOkey ( ) ) then
if ( DetailsFramework.IsClassicWow ( ) ) then
return
end
--create widgets
CreatePluginFrames ( data )
local PLUGIN_MINIMAL_DETAILS_VERSION_REQUIRED = 1
local PLUGIN_TYPE = " TOOLBAR "
local PLUGIN_LOCALIZED_NAME = Loc [ " STRING_PLUGIN_NAME " ]
local PLUGIN_REAL_NAME = " DETAILS_PLUGIN_ENCOUNTER_DETAILS "
local PLUGIN_ICON = [[Interface\Scenarios\ScenarioIcon-Boss]]
local PLUGIN_AUTHOR = " Terciob "
local PLUGIN_VERSION = " v1.06 "
local defaultSettings = {
show_icon = 5 , --automatic
hide_on_combat = false , --hide the window when a new combat start
max_emote_segments = 3 ,
opened = 0 ,
encounter_timers_dbm = { } ,
encounter_timers_bw = { } ,
window_scale = 1 ,
last_section_selected = " main " ,
}
--install
local install , saveddata , isEnabled = Details : InstallPlugin (
PLUGIN_TYPE ,
PLUGIN_LOCALIZED_NAME ,
PLUGIN_ICON ,
EncounterDetails ,
PLUGIN_REAL_NAME ,
PLUGIN_MINIMAL_DETAILS_VERSION_REQUIRED ,
PLUGIN_AUTHOR ,
PLUGIN_VERSION ,
defaultSettings
)
if ( type ( install ) == " table " and install.error ) then
print ( install.error )
end
--table.wipe(EncounterDetailsDB.encounter_spells)
EncounterDetails.charsaved = EncounterDetailsDB or { emotes = { } }
EncounterDetailsDB = EncounterDetails.charsaved
EncounterDetails.charsaved . encounter_spells = EncounterDetails.charsaved . encounter_spells or { }
EncounterDetails.boss_emotes_table = EncounterDetails.charsaved . emotes
--build a table on global saved variables
if ( not _detalhes.global_plugin_database [ " DETAILS_PLUGIN_ENCOUNTER_DETAILS " ] ) then
_detalhes.global_plugin_database [ " DETAILS_PLUGIN_ENCOUNTER_DETAILS " ] = { encounter_timers_dbm = { } , encounter_timers_bw = { } }
end
--Register needed events
Details : RegisterEvent ( EncounterDetails , " COMBAT_PLAYER_ENTER " )
Details : RegisterEvent ( EncounterDetails , " COMBAT_PLAYER_LEAVE " )
Details : RegisterEvent ( EncounterDetails , " COMBAT_BOSS_FOUND " )
Details : RegisterEvent ( EncounterDetails , " DETAILS_DATA_RESET " )
Details : RegisterEvent ( EncounterDetails , " GROUP_ONENTER " )
Details : RegisterEvent ( EncounterDetails , " GROUP_ONLEAVE " )
Details : RegisterEvent ( EncounterDetails , " ZONE_TYPE_CHANGED " )
EncounterDetailsFrame : RegisterEvent ( " ENCOUNTER_START " )
EncounterDetailsFrame : RegisterEvent ( " ENCOUNTER_END " )
EncounterDetails.EnemySpellPool = EncounterDetails.charsaved . encounter_spells
enemy_spell_pool = EncounterDetails.EnemySpellPool
EncounterDetails.CLEvents = CreateFrame ( " frame " , nil , UIParent , " BackdropTemplate " )
EncounterDetails.CLEvents : SetScript ( " OnEvent " , CLEvents )
EncounterDetails.CLEvents : Hide ( )
EncounterDetails.BossWhispColors = {
[ 1 ] = " RAID_BOSS_EMOTE " ,
[ 2 ] = " RAID_BOSS_WHISPER " ,
[ 3 ] = " MONSTER_EMOTE " ,
[ 4 ] = " MONSTER_SAY " ,
[ 5 ] = " MONSTER_WHISPER " ,
[ 6 ] = " MONSTER_PARTY " ,
[ 7 ] = " MONSTER_YELL " ,
}
--embed the plugin into the plugin window
if ( DetailsPluginContainerWindow ) then
DetailsPluginContainerWindow.EmbedPlugin ( EncounterDetails , EncounterDetails.Frame , false , EncounterDetails.OpenAndRefresh )
end
end
end
function EncounterDetails : OnEvent ( self , event , ... )
if ( event == " ENCOUNTER_START " ) then
--tracks if a enemy spell is instant cast
EncounterDetails.CLEvents : RegisterEvent ( " COMBAT_LOG_EVENT_UNFILTERED " )
elseif ( event == " ENCOUNTER_END " ) then
EncounterDetails.CLEvents : UnregisterEvent ( " COMBAT_LOG_EVENT_UNFILTERED " )
elseif ( event == " ADDON_LOADED " ) then
local addonName = select ( 1 , ... )
if ( addonName == " Details_EncounterDetails " ) then
C_Timer.After ( 1 , installPluginFunc )
end
end
end