local addonId, edTable = ... local AceLocale = LibStub("AceLocale-3.0") local Loc = AceLocale:GetLocale("Details_EncounterDetails") local Details = Details local _ local openAtStartup = "false" local isDebug = false local function DebugMessage(...) if (isDebug) then print("|cFFFFFF00EBreakDown|r:", ...) end end local PLUGIN_REAL_NAME = "DETAILS_PLUGIN_ENCOUNTER_DETAILS" edTable.PluginAbsoluteName = PLUGIN_REAL_NAME local _GetSpellInfo = Details.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 ipairs = ipairs local pairs = pairs local bitBand = bit.band --create the plugin object local encounterDetails = Details:NewPluginObject("Details_EncounterDetails", DETAILSPLUGIN_ALWAYSENABLED) table.insert(UISpecialFrames, "Details_EncounterDetails") edTable.PluginObject = encounterDetails EncounterDetailsGlobal = encounterDetails --[[GLOBAL]] edTable.defaultBackgroundColor = {0.5, 0.5, 0.5, 0.3} edTable.defaultBackgroundColor_OnEnter = {0.5, 0.5, 0.5, 0.7} edTable.defaultBackdrop = {bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true} local edFrame = encounterDetails.Frame edFrame.DefaultBarHeight = 20 edFrame.CooltipStatusbarAlpha = .834 edFrame.DefaultBarTexture = "Interface\\AddOns\\Details\\images\\bar_serenity" edFrame.encounterSummaryWidgets = {} encounterDetails:SetPluginDescription("Raid encounters summary, show basic stuff like dispels, interrupts and also graphic charts, boss emotes and the Weakaura Creation Tool.") --main combat object local _combat_object 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 --main object frame functions local function CreatePluginFrames(data) --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 if (openAtStartup) then C_Timer.After(0.1, function() --Details:OpenPlugin('Encounter Breakdown') end) end --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 string_damage_done_func = [[ --get the current combat local currentCombat = Details:GetCurrentCombat() --total damage done by the raid group local raidGroupDamageDone = currentCombat:GetTotal(DETAILS_ATTRIBUTE_DAMAGE, nil, DETAILS_TOTALS_ONLYGROUP) return raidGroupDamageDone or 0 ]] Details: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 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 chartName = "Raid Damage Done" local combatUniquieID = _combat_object:GetCombatNumber() local chartData = _combat_object:GetTimeData(chartName) if (chartData) then EncounterDetailsDB.chartData[combatUniquieID] = EncounterDetailsDB.chartData[combatUniquieID] or {} EncounterDetailsDB.chartData[combatUniquieID][chartName] = chartData --store when this chart was created to cleanup later chartData.__time = time() --remove the time data from the combat object _combat_object:EraseTimeData(chartName) end local whisperTable = encounterDetails.current_whisper_table if (whisperTable and _combat_object.is_boss and _combat_object.is_boss.name) then whisperTable.boss = _combat_object.is_boss.name table.insert(encounterDetails.boss_emotes_table, 1, whisperTable) 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 (encounterDetails.chartPanel) then encounterDetails.chartPanel:Reset() end if (encounterDetails.db.show_icon == 5) then encounterDetails:AutoShowIcon() end encounterDetails:CloseWindow() --drop last combat table encounterDetails.LastSegmentShown = nil --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 function encounterDetails:WasEncounter() --check if last combat was a boss encounter 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, show the icon encounterDetails:ShowIcon() end function encounterDetails:ShowIcon() encounterDetails.showing = true --[1] button to show [2] button animation: "star", "blink" or true(blink) encounterDetails:ShowToolbarIcon(encounterDetails.ToolbarButton, "star") end --hide icon on toolbar function encounterDetails:HideIcon() encounterDetails.showing = false encounterDetails:HideToolbarIcon(encounterDetails.ToolbarButton) 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 edFrame:Show() encounterDetails.open = true if (edFrame.ShowType == "graph") then encounterDetails:ShowChartFrame() end --select latest emote segment encounterDetails.emoteSegmentsDropdown:Select(1) encounterDetails.emoteSegmentsDropdown:Refresh() encounterDetails:SetEmoteSegment(1) if (edFrame.ShowType ~= "emotes") then --hide emote frames for _, widget in pairs(encounterDetails.Frame.EmoteWidgets) do widget:Hide() end end DetailsPluginContainerWindow.OpenPlugin(encounterDetails) return true end function encounterDetails:CloseWindow() encounterDetails.open = false edFrame:Hide() return true end local cooltip_menu = function() local gameCooltip = GameCooltip gameCooltip:Reset() gameCooltip:SetType("menu") gameCooltip:SetOption("TextSize", Details.font_sizes.menus) gameCooltip:SetOption("TextFont", Details.font_faces.menus) gameCooltip:SetOption("ButtonHeightModSub", -2) gameCooltip:SetOption("ButtonHeightMod", -5) gameCooltip:SetOption("ButtonsYModSub", -3) gameCooltip:SetOption("ButtonsYMod", -6) gameCooltip:SetOption("YSpacingModSub", -3) gameCooltip:SetOption("YSpacingMod", 1) gameCooltip:SetOption("HeighMod", 3) gameCooltip:SetOption("SubFollowButton", true) Details:SetTooltipMinWidth() --summary gameCooltip:AddLine("Encounter Summary") gameCooltip:AddMenu(1, encounterDetails.Frame.switch, "main") gameCooltip:AddIcon("Interface\\AddOns\\Details_EncounterDetails\\images\\boss_frame_buttons", 1, 1, 20, 20, 0, 0.125, 0, 0.5) --chart gameCooltip:AddLine("Damage Graphic") gameCooltip:AddMenu(1, encounterDetails.Frame.switch, "graph") gameCooltip:AddIcon("Interface\\AddOns\\Details_EncounterDetails\\images\\boss_frame_buttons", 1, 1, 20, 20, 0.125*3, 0.125*4, 0, 0.5) --emotes gameCooltip:AddLine("Boss Emotes") gameCooltip:AddMenu(1, encounterDetails.Frame.switch, "emotes") gameCooltip:AddIcon("Interface\\AddOns\\Details_EncounterDetails\\images\\boss_frame_buttons", 1, 1, 20, 20, 0.125*4, 0.125*5, 0, 0.5) --phases gameCooltip:AddLine("Damage by Boss Phase") gameCooltip:AddMenu(1, encounterDetails.Frame.switch, "phases") gameCooltip:AddIcon("Interface\\AddOns\\Details_EncounterDetails\\images\\boss_frame_buttons", 1, 1, 20, 20, 0.125, 0.125*2, 0, 0.505625) --apply the backdrop settings to the menu Details:FormatCooltipBackdrop() gameCooltip:SetOwner(ENCOUNTERDETAILS_BUTTON, "bottom", "top", 0, 0) gameCooltip:ShowCooltip() end encounterDetails.ToolbarButton = Details.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 Details.EncounterDetailsTempWindow(encounterDetails) Details.EncounterDetailsTempWindow = nil 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 = "(" .. Details:ToK(overkill) .. " |cFFFF8800overkill|r)" else overkill = "" end if (source:find("%[")) then source = source:gsub("%[%*%] ", "") end GameCooltip:AddLine("" .. string.format("%.1f", time - hora_da_morte) .. "s " .. spellname .. "(" .. source .. ")", "-" .. Details: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("" .. string.format("%.1f", time - hora_da_morte) .. "s " .. spellname .. "(" .. Details:GetOnlyName(Details:AddClassOrSpecIcon(source, class, spec, 16, true)) .. ")", "+" .. Details: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("" .. string.format("%.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("" .. string.format("%.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("+" .. string.format("%.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(string.format("%.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, Details.cooltip_preset2_backdrop, bgColor, borderColor) GameCooltip:SetOwner(row, "bottomright", "bottomleft", -2, -50) row.OverlayTexture:Show() GameCooltip:ShowCooltip() end --custom tooltip for dispells details --------------------------------------------------------------------------------------------------------- --custom tooltip for kick details --------------------------------------------------------------------------------------------------------- --custom tooltip clicks on any bar --------------------------------------------------------------------------------------------------------- function Details: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 Details: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() edFrame.isMoving = true end) barra:SetScript("OnMouseUp", function(self) if (self.fading_in) then return end if (edFrame.isMoving) then --EncounterDetailsFrame:GetParent():StopMovingOrSizing() edFrame.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 Details: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 segmentsDropdown = _G[edFrame:GetName() .. "SegmentsDropdown"] segmentsDropdown.MyObject:Refresh() encounterDetails.LastOpenedTime = GetTime() segmentsDropdown.MyObject:Refresh() edFrame.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 segmentsTable = Details:GetCombatSegments() local foundABoss = false for index, combatObject in ipairs(segmentsTable) do if (combatObject.is_boss and combatObject.is_boss.index) then encounterDetails._segment = index _combat_object = combatObject DebugMessage("segment found: ", index, combatObject:GetCombatName(), combatObject.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 [edFrame:GetName().."SegmentsDropdown"].MyObject:Select(1, true) foundABoss = true 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 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 [edFrame: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 encounterDetails.LastSegmentShown = _combat_object encounterDetails.Frame.switch(edFrame.ShowType) if (edFrame.ShowType == "phases") then EncounterDetailsPhaseFrame.OnSelectPhase(1) elseif (edFrame.ShowType == "graph") then encounterDetails:ShowChartFrame() end -------------- set boss name and zone name -------------- edFrame.bossNameLabel:SetText(_combat_object.is_boss.encounter) edFrame.raidNameLabel: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 edFrame.bossIcon:SetTexture(Texture) edFrame.bossIcon:SetTexCoord(L, R, T, B) else edFrame.bossIcon:SetTexture([[Interface\CHARACTERFRAME\TempPortrait]]) edFrame.bossIcon:SetTexCoord(0, 1, 0, 1) end --[=[ local file, L, R, T, B = EncounterDetails:GetRaidBackground(_combat_object.is_boss.mapid) if (file) then edFrame.raidBackgroundTexture:SetTexture(file) edFrame.raidBackgroundTexture:SetTexCoord(L, R, T, B) else edFrame.raidBackgroundTexture:SetTexture([[Interface\Glues\LOADINGSCREENS\LoadScreenDungeon]]) edFrame.raidBackgroundTexture:SetTexCoord(0, 1, 120/512, 408/512) end --]=] edFrame.raidBackgroundTexture:SetTexture(.3, .3, .3, .5) 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 bitBand(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_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 encounterDetails.charsaved = EncounterDetailsDB or {emotes = {}, chartData = {}} EncounterDetailsDB = encounterDetails.charsaved EncounterDetailsDB.chartData = EncounterDetailsDB.chartData or {} EncounterDetailsDB.emotes = EncounterDetailsDB.emotes or {} --make a cleanup on saved charts local now = time() for combatUniqueId, charts in pairs(EncounterDetailsDB.chartData) do --check if details! still have a combat with the same id local bCombatExists = Details:DoesCombatWithUIDExists(combatUniqueId) if (not bCombatExists) then EncounterDetailsDB.chartData[combatUniqueId] = nil else --check if the data is already 48hrs old for chartName, chartData in pairs(charts) do if (chartData.__time) then if (now - chartData.__time > 60*60*24*2) then charts[chartName] = nil end end end end end 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 Details.global_plugin_database["DETAILS_PLUGIN_ENCOUNTER_DETAILS"]) then Details.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") edFrame:RegisterEvent("ENCOUNTER_START") edFrame: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", } 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