local Loc = LibStub ("AceLocale-3.0"):GetLocale ("Details_SpellDetails") local Graphics = LibStub:GetLibrary("LibGraph-2.0") --> Main Plugin Object local SpellDetails = _detalhes:NewPluginObject ("Details_SpellDetails") --> Main Frame local SpellDetailsFrame = SpellDetails.Frame --> 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 _CreateFrame = CreateFrame --> wow api local local _ipairs = ipairs --> lua library local local _pairs = pairs --> lua library local local _string_len = string.len --> lua library local local _math_floor = math.floor --> lua library local local _cstr = string.format --> lua library local local _string_format = string.format local _table_sort = table.sort local _tostring = tostring local _GetSpellInfo =_detalhes.getspellinfo --> details spell cache local _string_lower = string.lower local _string_sub = string.sub --> this function will run when the plugin receives the Addon_Loaded event, ["data"] = previus saved player rank local function CreatePluginFrames (data) --> catch Details! main object local _detalhes = _G._detalhes local DetailsFrameWork = _detalhes.gump if (not _detalhes) then --> details isn't active return end --> Saved Data SpellDetails.data = data or {} SpellDetails.updating = false local player_damage_done = function (support_table, time_table, tick_second) local player = _detalhes.tabela_vigente (1, _detalhes.playername) if (player) then local total_damage = player.total local current_damage = 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 = total_damage else time_table [tick_second] = 0 end end local string_player_damage_done = [[ -- the goal of this script is get the current combat then get your character and extract your damage done. -- the first thing to do is get the combat, so, we use here the command "_detalhes:GetCombat ( "overall" "current" or "segment number")" local current_combat = _detalhes:GetCombat ("current") --> getting the current combat -- the next step is request your character from the combat -- to do this, we take the combat which here we named "current_combat" and tells what we want inside parentheses. local my_self = current_combat (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername) -- _detalhes.playername holds the name of your character. -- DETAILS_ATTRIBUTE_DAMAGE means we want the damage table, _HEAL _ENERGY _MISC is the other 3 tables. -- before we proceed, the result needs to be checked to make sure its a valid result. if (not my_self) then return 0 -- the combat doesnt have *you*, this happens when you didn't deal any damage in the combat yet. end -- now its time to get the total damage. local my_damage = my_self.total -- then finally return the amount to the capture. return my_damage ]] function SpellDetails:OnDetailsEvent (event, ...) if (event == "SHOW") then --> plugin shown on screen, actived --> register a custom time capture // time capture is a custom function wich will run every second and grab any kind of data. --> here we want to capture the damage of "player". --> _detalhes:RegisterTimeCapture ( function, give a name, parameters table ) elseif (event == "HIDE") then --> plugin hidded, disabled SpellDetailsFrame:SetScript ("OnUpdate", nil) SpellDetails.playerActor = nil elseif (event == "DETAILS_STARTED") then -- _detalhes:TimeDataRegister ("Player Damage Done", player_damage_done, {last_damage = 0, max_damage = 0}, "Spell Details", "v1.0", [[Interface\ICONS\Achievement_Leader_Tyrande_Whisperwind]], true) _detalhes:TimeDataRegister ("Player Damage Done", string_player_damage_done, nil, "Spell Details", "v1.0", [[Interface\ICONS\Achievement_Leader_Tyrande_Whisperwind]], true, true) elseif (event == "REFRESH") then --> requested a refresh window SpellDetails:Refresh() elseif (event == "COMBAT_PLAYER_TIMESTARTED") then --> combat started if (not SpellDetailsFrame:GetScript ("OnUpdate")) then _detalhes:RegisterEvent (SpellDetails, "BUFF_UPDATE") --> register buffs on player _detalhes:RegisterEvent (SpellDetails, "BUFF_UPDATE_DEBUFFPOWER") --> register debuffs wich player cast on oponents SpellDetails:RefreshBuffs() SpellDetails:JanelaSoloUpdate (1) SpellDetails.playerActor = select (2, ...) end elseif (event == "BUFF_UPDATE") then --> trigger when a buff is applyed on player SpellDetails:RefreshBuffs() elseif (event == "PLUGIN_DISABLED") then elseif (event == "PLUGIN_ENABLED") then end end function SpellDetails:CombatEnd() _detalhes:UnregisterEvent (SpellDetails, "BUFF_UPDATE") _detalhes:UnregisterEvent (SpellDetails, "BUFF_UPDATE_DEBUFFPOWER") SpellDetailsFrame:SetScript ("OnUpdate", nil) SpellDetails:RefreshBuffs() end --------> Build Frame and Widgets --------------------------------------------------------------------------------------------------------------------------- SpellDetailsFrame:SetResizable (false) SpellDetailsFrame:SetPoint ("TOPLEFT", UIParent, "TOPLEFT") SpellDetailsFrame:SetWidth (1) SpellDetailsFrame:SetHeight (1) --> Widgets Container SpellDetails.SummaryLine = {} SpellDetails.SpellButtons = {} SpellDetails.SpellInfoLabels = {} SpellDetails.BuffTextEntry = {} --> reset all labels function SpellDetails:ResetWindow() SpellDetails.SummaryLine:Reset() SpellDetails.SpellButtons:Reset() SpellDetails.SpellInfoLabels:Reset() SpellDetails:ClearBuffTexts() end --------> Build head displays ----------------------------------------------------------------------------------------- local y = -5 local x = { 25, 55, --> total de feito 120, 158, --> media 200, 240 --> tempo decorrido } --> background SpellDetailsFrame.bg_status = SpellDetailsFrame:CreateTexture (nil, "BACKGROUND") SpellDetailsFrame.bg_status:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", -35, y+5) SpellDetailsFrame.bg_status:SetWidth (370) SpellDetailsFrame.bg_status:SetHeight (30) SpellDetailsFrame.bg_status:SetTexture ("Interface\\UNITPOWERBARALT\\WowUI_Horizontal_Frame") local TotalLabel = DetailsFrameWork:NewLabel (SpellDetailsFrame, SpellDetailsFrame, nil, "SummaryDmg", Loc ["STRING_DAMAGE"]..": ".." 0", "GameFontHighlightSmall") TotalLabel:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", x[1]-5, y-5) local TotalDpsLabel = DetailsFrameWork:NewLabel (SpellDetailsFrame, SpellDetailsFrame, nil, "SummaryDps", Loc ["STRING_DPS"]..":".." 0", "GameFontHighlightSmall") TotalDpsLabel:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", x[3], y-5) local TotalTimeLabel = DetailsFrameWork:NewLabel (SpellDetailsFrame, SpellDetailsFrame, nil, "SummaryTime", Loc ["STRING_TEMPO"]..":".." 0.0", "GameFontHighlightSmall") TotalTimeLabel:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", x[5]+10, y-5) SpellDetails.SummaryLine.total = TotalLabel SpellDetails.SummaryLine.dps = TotalDpsLabel SpellDetails.SummaryLine.time = TotalTimeLabel function SpellDetails.SummaryLine:Reset() SpellDetails.SummaryLine.total:SetText (Loc ["STRING_DAMAGE"]..": 0") SpellDetails.SummaryLine.dps:SetText (Loc ["STRING_DPS"]..":".." 0") SpellDetails.SummaryLine.time:SetText (Loc ["STRING_TEMPO"]..":".." 0") end --------> Build 9 spells boxes ----------------------------------------------------------------------------------------- function SpellDetails:ChangeSpellBox (id, spellid, icon, line1, line2, tooltip) local BoxTable = SpellDetails.SpellButtons [id] if (BoxTable) then if (icon) then BoxTable.icon:SetTexture (icon) end if (line1) then BoxTable.label1:SetText (line1) end if (line2) then BoxTable.label2:SetText (line2) end if (tooltip) then BoxTable.button.tooltip = tooltip end BoxTable.spellid = spellid end end function SpellDetails.ShowSpellDetails (id) if (SpellDetails.CurrentSpellSlot) then SpellDetails.SpellButtons [SpellDetails.CurrentSpellSlot].background:Hide() end return SpellDetails:DetalhesDaMagia (id) end local CreateSpellBox = function (x, y, w, h, id, framelevel) local button = DetailsFrameWork:NewDetailsButton (SpellDetailsFrame, SpellDetailsFrame, _, SpellDetails.ShowSpellDetails, id, _, w, h+10, "Interface\\BUTTONS\\UI-DialogBox-Button-Disabled.blp") button:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", x, y) button:SetFrameLevel (framelevel) local icon = button:CreateTexture (nil, "OVERLAY") icon:SetPoint ("TOPLEFT", button, "TOPLEFT", 6, -5) icon:SetWidth (18) icon:SetHeight (18) local label2 = DetailsFrameWork:NewLabel (button, button, nil, "text2", "", "GameFontHighlightSmall", 9.2) label2:SetPoint ("LEFT", icon, "RIGHT", 5, 4) local label1 = DetailsFrameWork:NewLabel (button, button, nil, "text1", "", "GameFontHighlightSmall", 9.2) label1:SetPoint ("LEFT", icon, "RIGHT", 5, -5) local box = button:CreateTexture (nil, "artwork") box:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", x, y) box:SetWidth (w) box:SetHeight (h+10) box:SetTexture ("Interface\\BUTTONS\\UI-DialogBox-Button-Disabled.blp") box:SetBlendMode ("ADD") box:Hide() SpellDetails.SpellButtons [id] = {background = box, button = button, icon = icon, label1 = label1, label2 = label2, selected = false} end SpellDetails.SpellButtons.LastSelected = nil SpellDetails.SpellButtons.selected = SpellDetailsFrame:CreateTexture (nil, "background") SpellDetails.SpellButtons.selected:SetDrawLayer ("background", 1) SpellDetails.SpellButtons.selected:SetWidth (98) SpellDetails.SpellButtons.selected:SetHeight (36) function SpellDetails:ClearSpellBox (id) local BoxTable = SpellDetails.SpellButtons [id] if (BoxTable) then BoxTable.icon:SetTexture (nil) BoxTable.label1:SetText ("") BoxTable.label2:SetText ("") BoxTable.button.tooltip = nil BoxTable.selected = false end end function SpellDetails.SpellButtons:Reset() for i = 1, 9 do SpellDetails:ClearSpellBox (i) SpellDetails.SpellButtons.LastSelected = nil SpellDetails.SpellButtons.selected:ClearAllPoints() end end --> Call the build function for the 9 spell boxes local ROWX = {6, 106, 206} --> up for i = 1, 3 do CreateSpellBox (ROWX[i], -32, 90, 30, i, 5) end for i = 4, 6 do CreateSpellBox (ROWX[i-3], -62, 90, 30, i, 6) end for i = 7, 9 do CreateSpellBox (ROWX[i-6], -92, 90, 30, i, 7) end --------> Cria o background da esquerda SpellDetails.graphic = {} SpellDetails.graphic.fundo = _CreateFrame ("frame", nil, SpellDetailsFrame) SpellDetails.graphic.fundo:SetPoint ("topleft", SpellDetailsFrame, "topleft", 5, -133) SpellDetails.graphic.fundo:SetWidth (288) SpellDetails.graphic.fundo:SetHeight (160) SpellDetails.graphic.fundo:SetBackdrop ({ --edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 16, edgeSize = 10, insets = {left = 1, right = 1, top = 0, bottom = 1}, bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background"}) SpellDetails.graphic.fundo:SetScript ("OnEnter", function() local _r, _g, _b, _a =SpellDetails.graphic.fundo:GetBackdropColor() DetailsFrameWork:GradientEffect (SpellDetails.graphic.fundo, "frame", _r, _g, _b, _a, .3, .3, .3, .5, 0.9) end) SpellDetails.graphic.fundo:SetScript ("OnLeave", function() local _r, _g, _b, _a = SpellDetails.graphic.fundo:GetBackdropColor() DetailsFrameWork:GradientEffect (SpellDetails.graphic.fundo, "frame", _r, _g, _b, _a, .9, .7, .7, 1, 0.9) end) --> Cria a janela do gráfico if (not _G.DetailsSoloDpsGraph) then local g = Graphics:CreateGraphLine ("DetailsSoloDpsGraph", SpellDetails.graphic.fundo, "topleft", "topleft", 0, 0, 288, 140) g:SetXAxis (-1,1) g:SetYAxis (-1,1) g:SetGridSpacing (false, 0.105) g:SetGridColor ({0.5, 0.5, 0.5, 0.5}) g:SetAxisDrawing (true, true) g:SetAxisColor({1.0, 1.0, 1.0, 1.0}) g:SetAutoScale (true) g.CustomRightBorder = 0.001 g.max_time = 0 g.max_damage = 0 g.BuffLines = {} g.LinesContainer = {} g.CustomLine = "Interface\\AddOns\\Details\\Libs\\LibGraph-2.0\\smallline" --g.LockOnXMax = true for i = 1, 8, 1 do DetailsFrameWork:NewLabel (SpellDetails.graphic.fundo, SpellDetails.graphic.fundo, nil, "dpsamt"..i, "", "GameFontHighlightSmall") SpellDetails.graphic.fundo["dpsamt"..i]:SetPoint ("TOPLEFT", SpellDetails.graphic.fundo, "TOPLEFT", -1, -(14.4*i)) _detalhes:SetFontSize (SpellDetails.graphic.fundo["dpsamt"..i], 9) end end function SpellDetails:UpdateDamageGraphic() local GraphicObject = _G.DetailsSoloDpsGraph if (not GraphicObject) then print ("Nao ha um grafico criado.") return end SpellDetails.LastGraphicDrew = SpellDetails.LastGraphicDrew or {} local graphicData = _detalhes.tabela_vigente:GetTimeData ("Player Damage Done") if (not graphicData) then print ("No graphic available for this segment.") return end if (graphicData == SpellDetails.LastGraphicDrew) then return else SpellDetails.LastGraphicDrew = SpellDetails.LastGraphicDrew end if (graphicData.max_damage == 0) then return end if (#graphicData < 2) then local timetooshort = SpellDetails.graphic.fundo.timetooshot or DetailsFrameWork:NewLabel (SpellDetails.graphic.fundo, SpellDetails.graphic.fundo, nil, "timetooshort", Loc ["STRING_TOOSHORT"], "GameFontHighlightSmall") timetooshort:SetPoint ("TOPLEFT", SpellDetails.graphic.fundo, "TOPLEFT", 40, -55) _detalhes:SetFontSize (timetooshort, 10) timetooshort:SetJustifyH ("center") timetooshort:Show() return elseif (SpellDetails.graphic.fundo.timetooshort) then SpellDetails.graphic.fundo.timetooshort:Hide() end GraphicObject:ResetData() local _data = {} local dps_max = graphicData.max_value local amount = #graphicData local scaleW = 1/288 local content = graphicData table.insert (content, 1, 0) table.insert (content, 1, 0) table.insert (content, #content+1, 0) table.insert (content, #content+1, 0) local _i = 3 while (_i <= #content-2) do local v = (content[_i-2]+content[_i-1]+content[_i]+content[_i+1]+content[_i+2])/5 _data [#_data+1] = {scaleW*(_i-2), v/dps_max} --> _i = _i + 1 end local BuffTable = _detalhes.Buffs.BuffsTable local iconIndex = 1 if (BuffTable) then local geralLineIndex = 1 local scaleG = 277/_detalhes.tabela_vigente:GetCombatTime() --288 for spellName, spellTable in _pairs (BuffTable) do local timeTable = {} for index, appliedAt in _ipairs (spellTable.appliedAt) do timeTable [#timeTable+1] = {appliedAt, spellTable.tableIndex} end for index, appliedAt in _ipairs (timeTable) do local thisLine = GraphicObject.BuffLines [geralLineIndex] if (not thisLine) then thisLine = GraphicObject:CreateTexture (nil, "overlay") thisLine:SetTexture ("Interface\\AddOns\\Details\\images\\verticalline") thisLine:SetWidth (3) thisLine:SetHeight (160) thisLine:SetPoint ("topleft", SpellDetails.graphic.fundo, "topleft", (appliedAt[1]*scaleG)+25, 0) thisLine:SetVertexColor (.4, .4, .4, .8) thisLine.icon = GraphicObject:CreateTexture (nil, "overlay") local _, _, icon = GetSpellInfo (spellName) --print (spellName, icon) thisLine.icon:SetTexture (icon) thisLine.icon:SetWidth (12) thisLine.icon:SetHeight (12) if (iconIndex == 1) then thisLine.icon:SetPoint ("left", thisLine, "right", -2, 0) thisLine.icon:SetPoint ("top", thisLine, "bottom", 0, 25) elseif (iconIndex == 2) then thisLine.icon:SetPoint ("right", thisLine, "left", 2, 0) thisLine.icon:SetPoint ("top", thisLine, "bottom", 0, 25) elseif (iconIndex == 3) then thisLine.icon:SetPoint ("right", thisLine, "left", 2, 0) thisLine.icon:SetPoint ("top", thisLine, "bottom", 0, 12) elseif (iconIndex == 4) then thisLine.icon:SetPoint ("left", thisLine, "right", -2, 0) thisLine.icon:SetPoint ("top", thisLine, "bottom", 0, 12) end GraphicObject.BuffLines [geralLineIndex] = thisLine else thisLine:SetPoint ("topleft", SpellDetails.graphic.fundo, "topleft", (appliedAt[1]*scaleG)+28, 0) local _, _, icon = GetSpellInfo (spellName) thisLine.icon:SetTexture (icon) end geralLineIndex = geralLineIndex + 1 end iconIndex = iconIndex + 1 if (iconIndex == 5) then iconIndex = 1 end end end local dano_divisao = dps_max/8 local o = 1 for i = 8, 1, -1 do local d = _detalhes:ToK0 (dano_divisao*i) SpellDetails.graphic.fundo["dpsamt"..o]:SetText (d) o = o + 1 end GraphicObject:AddDataSeries (_data, {1, 1, 1, 1}) end --> Hida SpellDetails.graphic.fundo:Hide() --------> Cria o background SpellDetailsFrame.fundo = SpellDetailsFrame:CreateTexture (nil, "background") SpellDetailsFrame.fundo:SetTexture ("Interface\\AddOns\\Details_SpellDetails\\images\\solo_bg") SpellDetailsFrame.fundo:SetPoint ("topleft", SpellDetailsFrame, "topleft", 0, -125) SpellDetailsFrame.fundo:SetWidth (298) SpellDetailsFrame.fundo:SetHeight (175) SpellDetailsFrame.fundo:SetTexCoord (0, 0.615234375, 0, 0.6640625) SpellDetailsFrame.fundo:SetDrawLayer ("background", 1) --------> Cria o background da esquerda SpellDetailsFrame.fundoEsq = _CreateFrame ("frame", nil, SpellDetailsFrame) --SpellDetailsFrame.fundoEsq:SetTexture ("Interface\\Tooltips\\UI-Tooltip-Background") SpellDetailsFrame.fundoEsq:SetPoint ("topleft", SpellDetailsFrame, "topleft", 5, -133) SpellDetailsFrame.fundoEsq:SetWidth (120) SpellDetailsFrame.fundoEsq:SetHeight (160) SpellDetailsFrame.fundoEsq:SetBackdrop ({ edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 16, edgeSize = 10, insets = {left = 1, right = 1, top = 0, bottom = 1}, bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background"}) SpellDetailsFrame.fundoEsq:SetScript ("OnEnter", function() local _r, _g, _b, _a =SpellDetailsFrame.fundoEsq:GetBackdropColor() DetailsFrameWork:GradientEffect (SpellDetailsFrame.fundoEsq, "frame", _r, _g, _b, _a, .3, .3, .3, .5, .9) end) SpellDetailsFrame.fundoEsq:SetScript ("OnLeave", function() local _r, _g, _b, _a = SpellDetailsFrame.fundoEsq:GetBackdropColor() DetailsFrameWork:GradientEffect (SpellDetailsFrame.fundoEsq, "frame", _r, _g, _b, _a, .9, .7, .7, 1, .9) end) --------> Cria o background da direita SpellDetailsFrame.fundoDir = _CreateFrame ("frame", nil, SpellDetailsFrame) SpellDetailsFrame.fundoDir:SetPoint ("topleft", SpellDetailsFrame, "topright", 127, -138+5) SpellDetailsFrame.fundoDir:SetWidth (166) SpellDetailsFrame.fundoDir:SetHeight (160) SpellDetailsFrame.fundoDir:SetBackdrop ({ edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 16, edgeSize = 10, insets = {left = 1, right = 1, top = 0, bottom = 1}, bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background"}) SpellDetailsFrame.fundoDir:SetScript ("OnEnter", function() local _r, _g, _b, _a =SpellDetailsFrame.fundoDir:GetBackdropColor() DetailsFrameWork:GradientEffect (SpellDetailsFrame.fundoDir, "frame", _r, _g, _b, _a, .3, .3, .3, .5, .9) end) SpellDetailsFrame.fundoDir:SetScript ("OnLeave", function() local _r, _g, _b, _a = SpellDetailsFrame.fundoDir:GetBackdropColor() DetailsFrameWork:GradientEffect (SpellDetailsFrame.fundoDir, "frame", _r, _g, _b, _a, .9, .7, .7, 1, .9) end) ----------------------------------------------------------------------------------------------------------------------------------------------- --> botão switch SpellDetails.Detalhes = 1 --> normal function SpellDetails:ShowGraphic() --> hidar os 2 blocos em baixo: if (SpellDetails.Detalhes == 1) then --> show graphic if (InCombatLockdown()) then print ("|cffFF2222"..Loc ["STRING_INCOMBAT"]) return end SpellDetailsFrame.fundoEsq:Hide() SpellDetailsFrame.fundoDir:Hide() SpellDetails.Detalhes = 2 SpellDetails.SwitchButton.text:SetText ("X") --> localize-me SpellDetails.SwitchButton:SetWidth (15) SpellDetails.graphic.fundo:Show() SpellDetails:UpdateDamageGraphic (SpellDetailsFrame) SpellDetails.SwitchButton:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", 275, -136) elseif (SpellDetails.Detalhes == 2) then --> show normal details SpellDetailsFrame.fundoEsq:Show() SpellDetailsFrame.fundoDir:Show() SpellDetails.Detalhes = 1 SpellDetails.SwitchButton.text:SetText ("Graphic") --> localize-me SpellDetails.SwitchButton:SetWidth (110) SpellDetails.graphic.fundo:Hide() SpellDetails.SwitchButton:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", 10, -274) end end --> botão para o gráfico: local SwitchButton = DetailsFrameWork:NewDetailsButton (SpellDetailsFrame, SpellDetailsFrame, _, SpellDetails.ShowGraphic, _, _, 110, 15) SwitchButton:SetFrameStrata ("TOOLTIP") SwitchButton:SetFrameLevel (50) SwitchButton:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", 10, -274) SwitchButton:SetFrameLevel (6) SwitchButton:InstallCustomTexture() SwitchButton.text:SetText ("Graphic") --> localize-me SpellDetails.SwitchButton = SwitchButton -------------------------------------------------------------------------------------------------------------------------------------------- --> painel da esquerda inferior (informações da magia) local loc_y = {-140, -150, -160, -170, -180, -190, -200, -210, -220, -230, -240} local xStart = 10 local total = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "total", Loc ["STRING_DAMAGE"]..":", "GameFontHighlightSmall") SpellDetailsFrame.fundoEsq.total:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[1]) SpellDetails.SpellInfoLabels.total = total local dps = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "dps", Loc ["STRING_DPS"]..":", "GameFontHighlightSmall") SpellDetailsFrame.fundoEsq.dps:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[2]) SpellDetails.SpellInfoLabels.dps = dps local media = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "porcento", Loc ["STRING_PERCENT"]..":", "GameFontHighlightSmall") SpellDetailsFrame.fundoEsq.porcento:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[3]) SpellDetails.SpellInfoLabels.porcento = media local uptime = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "tempo_em_uso", Loc ["STRING_UPTIME"]..":", "GameFontHighlightSmall") SpellDetailsFrame.fundoEsq.tempo_em_uso:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[4]) SpellDetails.SpellInfoLabels.uptime = uptime local critical = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "critico", Loc ["STRING_CRIT"]..":", "GameFontHighlightSmall") SpellDetailsFrame.fundoEsq.critico:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[5]) SpellDetails.SpellInfoLabels.critical = critical local miss = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "miss", Loc ["STRING_MISS"]..":", "GameFontHighlightSmall") SpellDetailsFrame.fundoEsq.miss:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[6]) SpellDetails.SpellInfoLabels.miss = miss local block = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "blocked", Loc ["STRING_BLOCKED"]..":", "GameFontHighlightSmall") SpellDetailsFrame.fundoEsq.blocked:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[7]) SpellDetails.SpellInfoLabels.block = block local glancing = DetailsFrameWork:NewLabel (SpellDetailsFrame.fundoEsq, SpellDetailsFrame.fundoEsq, nil, "glancing", "Glancing: ", "GameFontHighlightSmall") SpellDetailsFrame.fundoEsq.glancing:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPLEFT", xStart, loc_y[8]) SpellDetails.SpellInfoLabels.glancing = glancing function SpellDetails.SpellInfoLabels:Reset() SpellDetails.SpellInfoLabels.total:SetText (Loc ["STRING_DAMAGE"]..": 0") SpellDetails.SpellInfoLabels.dps:SetText (Loc ["STRING_DPS"]..":".." 0") SpellDetails.SpellInfoLabels.porcento:SetText (Loc ["STRING_PERCENT"]..":".." 0") SpellDetails.SpellInfoLabels.uptime:SetText (Loc ["STRING_UPTIME"]..":".." 0") SpellDetails.SpellInfoLabels.critical:SetText (Loc ["STRING_CRIT"]..":".." 0") SpellDetails.SpellInfoLabels.miss:SetText (Loc ["STRING_MISS"]..":".." 0") SpellDetails.SpellInfoLabels.block:SetText (Loc ["STRING_BLOCKED"]..":".." 0") SpellDetails.SpellInfoLabels.glancing:SetText (Loc ["STRING_GLANCING"]..":".." 0") end -------------------------------------------------------------------------------------------------------------------------------------------- --> painel da direita inferior (detalhes dos buffs do jogador) --_detalhes.SoloTables.BuffsTable.BuffIds = _detalhes.SoloTables.BuffsTable.BuffIds or {0, 0, 0, 0} --_detalhes.SoloTables.BuffsTableNameCache = _detalhes.SoloTables.BuffsTableNameCache or {"", "", "", ""} local BuffIndex = {} function SpellDetails:ClearBuffTexts() for _, BuffInput in _ipairs (SpellDetails.BuffTextEntry) do BuffInput.amtdone:SetText ("") BuffInput.dps:SetText ("") BuffInput.uptime:SetText ("") end end function SpellDetails:SetBuffTexts (id, damage, dps) local BuffInput = SpellDetails.BuffTextEntry [id] BuffInput.amtdone:SetText (Loc ["STRING_DAMAGE"]..": "..damage) BuffInput.dps:SetText (Loc ["STRING_DPS"]..":".." "..dps) end local Clear = function (BuffEntryTable) --> clicked on X to clear the buff _detalhes.Buffs:RemoveBuff (BuffEntryTable.name:GetText()) --_detalhes.SoloTables.BuffsTable.BuffIds [BuffEntryTable.id] = 0 BuffIndex [BuffEntryTable.name:GetText()] = nil BuffEntryTable.icon:SetTexture (nil) BuffEntryTable.name:SetText ("") BuffEntryTable.amtdone:SetText ("") BuffEntryTable.dps:SetText ("") BuffEntryTable.editbox:SetText (Loc ["STRING_DEBUFFNAME"]) BuffEntryTable.editbox:Show() BuffEntryTable.background:Hide() BuffEntryTable.backgroundFrame:Hide() BuffEntryTable.button:Hide() end local SetBuff = function (BuffEntryTable, spellid, id) local spellname, _, spellicon = GetSpellInfo (spellid) if (not _detalhes.Buffs:IsRegistred (spellid)) then _detalhes.Buffs:NewBuff (spellname, spellid) end BuffIndex [spellname] = BuffEntryTable BuffEntryTable.icon:SetTexture (spellicon) BuffEntryTable.name:SetText (spellname) BuffEntryTable.amtdone:SetText (Loc ["STRING_DAMAGE"]..": 0") BuffEntryTable.dps:SetText (Loc ["STRING_DPS"]..":".." 0") BuffEntryTable.editbox:Hide() BuffEntryTable.background:Show() BuffEntryTable.backgroundFrame:Show() BuffEntryTable.button:Show() --print (debugstack()) end local OnEnter = function (_, id, texto, editbox, by) if (_string_len (texto) > 0 and texto ~= Loc ["STRING_DEBUFFNAME"]) then if (by == editbox) then --> By Enter if (_detalhes.popup.NumLines > 0) then local texto2 = _detalhes.popup:GetText(1):match ("(.-):") texto = texto2 end end if (not tonumber (texto)) then editbox:SetText (Loc ["STRING_DEBUFFNAME"]) return end SetBuff (SpellDetails.BuffTextEntry [id], tonumber (texto), id) else editbox:SetText (Loc ["STRING_DEBUFFNAME"]) end if (_detalhes.popup.active) then _detalhes.popup:ShowMe (false) end end local CreateBuffInput = function (y, id) local backgroundFrame = _CreateFrame ("frame", "SoloBuffEditBox"..id.."Background", SpellDetailsFrame.fundoDir) backgroundFrame:SetWidth (166) backgroundFrame:SetHeight (40) backgroundFrame:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPRIGHT", 127, y+5+8) backgroundFrame:SetBackdrop ({edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border", tile = true, tileSize = 16, edgeSize = 10, insets = {left = 1, right = 1, top = 0, bottom = 1}, bgFile = "Interface\\DialogFrame\\UI-DialogBox-Gold-Background"}) backgroundFrame:SetBackdropColor (.3, .3, .3, .5) --backgroundFrame:SetBackdropBorderColor (1, 0, 0, 1) backgroundFrame:Hide() backgroundFrame:SetScript ("OnEnter", function() if (not backgroundFrame.Actived) then local _r, _g, _b, _a = backgroundFrame:GetBackdropColor() DetailsFrameWork:GradientEffect (backgroundFrame, "frame", _r, _g, _b, _a, .9, .7, .7, 1, .9) else local _r, _g, _b, _a = backgroundFrame:GetBackdropColor() DetailsFrameWork:GradientEffect (backgroundFrame, "frame", _r, _g, _b, _a, 75/255, 246/255, 78/255, 1, .9) end end) backgroundFrame:SetScript ("OnLeave", function() if (not backgroundFrame.Actived) then local _r, _g, _b, _a = backgroundFrame:GetBackdropColor() DetailsFrameWork:GradientEffect (backgroundFrame, "frame", _r, _g, _b, _a, .3, .3, .3, .5, .9) else local _r, _g, _b, _a = backgroundFrame:GetBackdropColor() DetailsFrameWork:GradientEffect (backgroundFrame, "frame", _r, _g, _b, _a, 22/255, 155/255, 29/255, .9, .9) end end) function backgroundFrame:Active() local _r, _g, _b, _a = backgroundFrame:GetBackdropColor() DetailsFrameWork:GradientEffect (backgroundFrame, "frame", _r, _g, _b, _a, 22/255, 155/255, 29/255, .9, .9) backgroundFrame.Actived = true end function backgroundFrame:Desactive() local _r, _g, _b, _a = backgroundFrame:GetBackdropColor() DetailsFrameWork:GradientEffect (backgroundFrame, "frame", _r, _g, _b, _a, .3, .3, .3, .5, .9) backgroundFrame.Actived = false end local background = SpellDetailsFrame.fundoDir:CreateTexture (nil, "background") --background:SetTexture ("Interface\\DialogFrame\\UI-DialogBox-Background") background:SetWidth (166) background:SetHeight (36) background:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPRIGHT", 127, y+3+8) background:SetDrawLayer ("background", 2) background:Hide() --> editbox --local editbox = DetailsFrameWork:NewTextBox (SpellDetailsFrame.fundoDir, SpellDetailsFrame.fundoDir, "SoloBuffEditBox"..id, OnEnter, "param_1", id, 120, 14) local editbox = DetailsFrameWork:NewTextEntry (SpellDetailsFrame.fundoDir, nil, "DetailsSpellDetailsBox"..id, "SoloBuffEditBox"..id, 120, 14, OnEnter, "param_1", id) editbox:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPRIGHT", 150, y) editbox.text = Loc ["STRING_DEBUFFNAME"] local imageLeft = editbox:CreateTexture (nil, "overlay") imageLeft:SetPoint ("right", "DetailsSpellDetailsBox"..id, "left", 0.5, -2) imageLeft:SetTexture ("Interface\\ARCHEOLOGY\\ArchaeologyParts") imageLeft:SetTexCoord (0.119140625, 0.1875, 0.8046875, 0.87890625) imageLeft:SetWidth (19) imageLeft:SetHeight (10) local imageRight = editbox:CreateTexture (nil, "overlay") imageRight:SetPoint ("left", "DetailsSpellDetailsBox"..id, "right", -0.5, -2) imageRight:SetTexture ("Interface\\ARCHEOLOGY\\ArchaeologyParts") imageRight:SetTexCoord (0.0078125, 0.078125, 0.859375, 0.93359375) imageRight:SetWidth (19) imageRight:SetHeight (10) editbox.HaveMenu = false local OnClickMenu = function (_, _, SpellID) editbox:SetText (SpellID) editbox:PressEnter (true) editbox.HaveMenu = false _detalhes.popup:ShowMe (false) end editbox.OnTextChangedHook = function (frame, userChanged) if (not userChanged) then return end local texto = editbox:GetText() texto = _detalhes:trim (texto) texto = _string_lower (texto) texto = texto:gsub ("%(", "") texto = texto:gsub ("%[", "") local index = _string_sub (texto, 1, 1) local cached = _detalhes.spellcachefull [index] if (cached) then local CoolTip = _G.GameCooltip CoolTip:Reset() CoolTip:SetType ("menu") CoolTip:SetOwner (_G ["DetailsSpellDetailsBox"..id]) CoolTip:SetOption ("NoLastSelectedBar", true) CoolTip:SetOption ("HeightAnchorMod", -8) CoolTip:SetOption ("TextSize", 9.5) local CoolTipTable = {} local texcoord = {0,1,0,1} local i = 1 for SpellID, SpellTable in _pairs (cached) do if (_string_lower (SpellTable[1]):find (texto)) then local rank = SpellTable[3] if (not rank or rank == "") then rank = "" else rank = " ("..rank..")" end CoolTip:AddMenu (1, OnClickMenu, SpellID, nil, nil, SpellID..": "..SpellTable[1]..rank, SpellTable[2], true) if (i > 20) then break else i = i + 1 end end end _detalhes.popup.buttonOver = true editbox.HaveMenu = true CoolTip:ShowCooltip() end end local icon = backgroundFrame:CreateTexture (nil, "OVERLAY") icon:SetWidth (16) icon:SetHeight (16) icon:SetPoint ("TOPLEFT", SpellDetailsFrame, "TOPRIGHT", 133, y+8) local name = DetailsFrameWork:NewLabel (backgroundFrame, backgroundFrame, nil, "BuffName"..id, "", "GameFontHighlightSmall") name:SetPoint ("LEFT", icon, "RIGHT", 3, 4) local amtdone = DetailsFrameWork:NewLabel (backgroundFrame, backgroundFrame, nil, "BuffDone"..id, "", "GameFontHighlightSmall") amtdone:SetPoint ("LEFT", icon, "RIGHT", 3, -6) local uptime = DetailsFrameWork:NewLabel (backgroundFrame, backgroundFrame, nil, "BuffUptime"..id, "", "GameFontHighlightSmall") uptime:SetPoint ("LEFT", icon, "RIGHT", 55, -6) local dps = DetailsFrameWork:NewLabel (backgroundFrame, backgroundFrame, nil, "BuffDps"..id, "", "GameFontHighlightSmall") dps:SetPoint ("LEFT", icon, "RIGHT", 3, -16) local clearbutton = _CreateFrame ("Button", nil, backgroundFrame, "UIPanelCloseButton") clearbutton:SetWidth (20) clearbutton:SetHeight (20) clearbutton:SetPoint ("TOPLEFT", icon, "TOPRIGHT", -18, -15) SpellDetails.BuffTextEntry [id] = {id = id, editbox = editbox, icon = icon, name = name, amtdone = amtdone, dps = dps, uptime = uptime, button = clearbutton, background = background, backgroundFrame = backgroundFrame} --clearbutton:SetText ("x") clearbutton:SetScript ("OnClick", function() Clear (SpellDetails.BuffTextEntry [id]) end) clearbutton:Hide() editbox.OnEscapePressedHook = function() editbox:SetText (Loc ["STRING_DEBUFFNAME"]) _detalhes.popup:ShowMe (false) end editbox.OnEnterPressedHook = function() if (editbox:GetText() == Loc ["STRING_DEBUFFNAME"]) then editbox:SetText ("") elseif (_string_len (editbox:GetText()) > 0) then if (not _detalhes.popup.active) then editbox.OnTextChangedHook (true) end end end editbox.OnLeaveHook = function() if (not editbox:HasFocus()) then if (editbox:GetText() == "") then editbox:SetText (Loc ["STRING_DEBUFFNAME"]) end end _detalhes.popup.buttonOver = false if (_detalhes.popup.active) then local passou = 0 editbox:SetScript ("OnUpdate", function (self, elapsed) passou = passou+elapsed if (passou > 0.3) then if (not _detalhes.popup.mouseOver and not _detalhes.popup.buttonOver) then _detalhes.popup:ShowMe (false) end editbox:SetScript ("OnUpdate", nil) end end) elseif (_detalhes.popup.tooltip) then _detalhes.popup:ShowMe (false) else editbox:SetScript ("OnUpdate", nil) end end editbox.OnEditFocusGainedHook = function() if (InCombatLockdown()) then GameCooltip:Reset() GameCooltip:AddLine ("|cffFF2222"..Loc ["STRING_INCOMBAT"]) GameCooltip:AddIcon ("Interface\\Buttons\\LockButton-Locked-Up",_,_, 25, 25) GameCooltip:ShowCooltip (_G ["DetailsSpellDetailsBox"..id], "tooltip") editbox:PressEnter() else editbox:SetText ("") _detalhes:BuildSpellList() end end editbox.OnEditFocusLostHook = function() editbox.HaveMenu = false local texto = editbox:GetText() if (_string_len (texto) > 0 and texto ~= Loc ["STRING_DEBUFFNAME"]) then SetBuff (SpellDetails.BuffTextEntry [id], tonumber (texto), id) else editbox:SetText (Loc ["STRING_DEBUFFNAME"]) end _detalhes:ClearSpellList() end end --> Crias as caixas dos buffs local y = {-146, -186, -226, -266} -- +8 for i = 1, 4 do CreateBuffInput (y [i], i) end --> fill with buff information: --> inject inside details for ace3 delay function _detalhes:SpellDetailsStartupBuffs() local buffmax = 4 local BuffList = _detalhes.Buffs:GetBuffListIds() for i = 1, #BuffList do if (i >= 5) then break end SetBuff (SpellDetails.BuffTextEntry [i], BuffList [i], i) end end _detalhes:ScheduleTimer ("SpellDetailsStartupBuffs", 5) --_detalhes:SpellDetailsStartupBuffs() function SpellDetails:RefreshBuffs() for BuffName, BuffTable in _pairs (_detalhes.Buffs.BuffsTable) do if (BuffTable.active and SpellDetails:IsInCombat()) then if (BuffIndex [BuffName]) then BuffIndex [BuffName].backgroundFrame:Active() end else if (BuffIndex [BuffName]) then BuffIndex [BuffName].backgroundFrame:Desactive() end end end end function SpellDetails:Refresh() SpellDetails:AtualizaSoloMode() SpellDetails:DetalhesDaMagia (SpellDetails.CurrentSpellSlot) SpellDetails:ForceUpdateUpDisplay() end function SpellDetails:JanelaSoloUpdate (OnOff) local janela_solo = SpellDetailsFrame if (OnOff > 0) then if (not _detalhes.SoloTables.CombatID) then return end local MySelf if (_detalhes.SoloTables.CombatID == _detalhes:NumeroCombate()) then MySelf = _detalhes.tabela_vigente (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername) else local vigente = _detalhes.tabela_historico.tabelas[_detalhes:NumeroCombate() - _detalhes.SoloTables.CombatID] MySelf = vigente (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername) end if (MySelf) then janela_solo.SoloInicioCombate = MySelf.start_time janela_solo.SoloInicioTimer = _GetTime() janela_solo.SoloTimer = 0 janela_solo.SoloDps = 0 janela_solo.AtualizarJanelaDetalhes = 0 janela_solo.MySelf = MySelf janela_solo.Instancia = self janela_solo:SetScript ("OnUpdate", SpellDetails.SoloUpdater) end else janela_solo.SoloInicioCombate = nil janela_solo.SoloTimer = nil janela_solo.SoloDps = nil janela_solo.AtualizarJanelaDetalhes = nil janela_solo.MySelf = nil janela_solo.Instancia = nil janela_solo:SetScript ("OnUpdate", nil) end end function SpellDetails:ForceUpdateUpDisplay() local MySelf = _detalhes.tabela_vigente (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername) if (MySelf and MySelf.end_time and MySelf.start_time) then local tempo_in_combat = MySelf.end_time - MySelf.start_time SpellDetails.SummaryLine.time:SetText (Loc ["STRING_TEMPO"]..":".." ".._string_format ("%.1f", tempo_in_combat)) SpellDetails.SummaryLine.dps:SetText (Loc ["STRING_DPS"]..":".." ".._cstr ("%.1f", MySelf.total/tempo_in_combat)) SpellDetails.SummaryLine.total:SetText (Loc ["STRING_DAMAGE"]..": " .. _tostring (MySelf.total)) else SpellDetails.SummaryLine.time:SetText (Loc ["STRING_TEMPO"]..":".." 0.0") SpellDetails.SummaryLine.dps:SetText (Loc ["STRING_DPS"]..":".." 0") SpellDetails.SummaryLine.total:SetText (Loc ["STRING_DAMAGE"]..": 0") end end function SpellDetails:SoloUpdater (elapsed) self.SoloTimer = self.SoloTimer + elapsed self.SoloDps = self.SoloDps + elapsed self.AtualizarJanelaDetalhes = self.AtualizarJanelaDetalhes + elapsed if (self.SoloTimer > 0.1) then local tempo_agora = (_GetTime() - self.SoloInicioTimer) SpellDetails.SummaryLine.time:SetText (Loc ["STRING_TEMPO"]..":".." ".._string_format ("%.1f", tempo_agora)) self.SoloTimer = 0 end if (self.SoloDps > 0.2) then --print (_GetTime() .. " " .._detalhes._tempo .. " " .. time()) --print (self.MySelf.start_time) --_detalhes.SoloTables.SummaryLine.dps:SetText (Loc ["STRING_DPS"]..":".." ".._detalhes:comma_value( _math_floor (self.MySelf.total/(_tempo - self.SoloInicioCombate))) ) --print (self.MySelf.total .. " / " .. (time() - self.MySelf.start_time)) SpellDetails.SummaryLine.dps:SetText (Loc ["STRING_DPS"]..":".." ".._detalhes:comma_value( _math_floor (self.MySelf.total/( time() - self.MySelf.start_time))) ) self.SoloDps = 0 end if (self.AtualizarJanelaDetalhes > 1.0) then SpellDetails:AtualizaSoloMode() SpellDetails:DetalhesDaMagia (SpellDetails.CurrentSpellSlot) self.AtualizarJanelaDetalhes = 0 if (not _UFC ("player")) then return SpellDetails:CombatEnd() end end end function SpellDetails:AtualizaSoloMode() if (not _detalhes.SoloTables.CombatID) then return end -- self.atributo <- retorna o que esta sendo mostrado na instancia local atributo = DETAILS_ATTRIBUTE_DAMAGE local MySelf if (_detalhes.SoloTables.CombatID == _detalhes:NumeroCombate()) then MySelf = _detalhes.tabela_vigente (atributo, _detalhes.playername) else local vigente = _detalhes.tabela_historico.tabelas[_detalhes:NumeroCombate() - _detalhes.SoloTables.CombatID] if (not vigente) then --print ("!Vigente> solo_id = ".._detalhes.SoloTables.CombatID.." <> " .. _detalhes:NumeroCombate() - _detalhes.SoloTables.CombatID) return end MySelf = vigente (atributo, _detalhes.playername) end local janela = SpellDetailsFrame if (MySelf) then local meu_total, dps = MySelf.total, MySelf.last_dps SpellDetails.SummaryLine.total:SetText (Loc ["STRING_DAMAGE"]..": ".._detalhes:comma_value (meu_total)) --> gravar total --> pegar as magias que castei local tabela = MySelf.spell_tables._ActorTable local meus_danos = {} local SpellsTotalHits = 0 for _spellid, _tabela in _pairs (tabela) do meus_danos [#meus_danos+1] = {_spellid, _tabela, _tabela.total} SpellsTotalHits = SpellsTotalHits + _tabela.counter end --> spellvalue for _, _tabela in _ipairs (meus_danos) do local PercentDamage = (_tabela[3]/MySelf.total)+1 -- a escala é de 0.0 a 0.9 + 1 então é de 1 a 1.999 local PercentHits = ((_tabela[2].counter/SpellsTotalHits)*0.1) + 1 --> 0.1 scale down --> 1.09 local pow = math.pow (PercentDamage, PercentHits) local scaled = _detalhes:Scale (1, 2.15, 1, 100, pow) _tabela[4] = scaled end _table_sort (meus_danos, function (_spell1, _spell2) return _spell1[4] > _spell2[4] end) for i = 1, 9 do local esta_magia = meus_danos[i] if (esta_magia) then local SpellName, _, Icon = _GetSpellInfo (esta_magia[1]) local SpellBoxObject = SpellDetails.SpellButtons [i] SpellDetails:ChangeSpellBox (i, esta_magia[1], Icon, "DPS: ".. _detalhes:ToK (_math_floor (esta_magia[3]/MySelf:Tempo())), "SV: ".. _string_format ("%.1f", esta_magia[4]), nil) else SpellDetails:ClearSpellBox (i) end end end end function SpellDetails:DetalhesDaMagia (slot) local SoloCombatID = _detalhes.SoloTables.CombatID if (not SoloCombatID) then return end if (not slot) then --> slot é qual dos 9 quadros vai mostrar slot = 1 SpellDetails.CurrentSpellSlot = 1 SpellDetails.SpellButtons.LastSelected = slot SpellDetails.SpellButtons.selected:SetPoint ("TOPLEFT", SpellDetails.SpellButtons [slot].background, "TOPLEFT", -5, 3) SpellDetails.SpellButtons [slot].background:Show() end if (slot ~= SpellDetails.CurrentSpellSlot) then --> se o player clicou em outro quadro SpellDetails.CurrentSpellSlot = slot SpellDetails:ClearBuffTexts() SpellDetails.SpellButtons.LastSelected = slot SpellDetails.SpellButtons.selected:SetPoint ("TOPLEFT", SpellDetails.SpellButtons [slot].background, "TOPLEFT", -5, 3) SpellDetails.SpellButtons [slot].background:Show() end local SpellBoxTable = SpellDetails.SpellButtons [slot] local spellid = SpellBoxTable.spellid local CombatTable local MySelf if (SoloCombatID == _detalhes:NumeroCombate()) then MySelf = _detalhes.tabela_vigente (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername) CombatTable = _detalhes.tabela_vigente else if (_detalhes.SoloTables.CombatID == 0) then return end local vigente = _detalhes.tabela_historico.tabelas [_detalhes:NumeroCombate() - SoloCombatID] if (not vigente) then --print ("!Vigente> solo_id = "..SoloCombatID.." <> " .. _detalhes:NumeroCombate() .. " table: " .. (_detalhes:NumeroCombate() - SoloCombatID)) return end MySelf = vigente (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername) CombatTable = vigente end if (not MySelf) then --> caso o jogador não esteja em combate return end local habilidade = MySelf.spell_tables._ActorTable [spellid] --> agora tem o objeto classe_TIPO_habilidade if (not habilidade) then --> caso a tabela do jogador não tenha a skill pedida. return end local SpellInfoLabels = SpellDetails.SpellInfoLabels --> shortcut SpellInfoLabels.total:SetText (Loc ["STRING_DAMAGE"]..": ".._detalhes:comma_value (habilidade.total)) SpellInfoLabels.dps:SetText (Loc ["STRING_DPS"]..":".." ".._detalhes:comma_value (_math_floor (habilidade.total/(MySelf:Tempo())))) SpellInfoLabels.porcento:SetText (Loc ["STRING_PERCENT"]..":".." ".. _detalhes:comma_value ( _math_floor (habilidade.total/MySelf.total*100)).."%") local SoloDebuffUptime = CombatTable.SoloDebuffUptime if (SoloDebuffUptime) then local DebuffTable = SoloDebuffUptime [spellid] if (DebuffTable) then --SpellInfoLabels.uptime:SetText (Loc ["STRING_UPTIME"]..":".." ".._math_floor (DebuffTable.duration).."s (".._math_floor (DebuffTable.duration/MySelf:Tempo()*100).."%) "..DebuffTable.castedAmt.."/"..DebuffTable.refreshAmt.."/"..DebuffTable.droppedAmt) --> localize-me local duration = DebuffTable.duration if (DebuffTable.Active) then duration = duration + (_detalhes._tempo - DebuffTable.start) end SpellInfoLabels.uptime:SetText (Loc ["STRING_UPTIME"]..":".." ".._math_floor (duration).."s (".._math_floor (duration/MySelf:Tempo()*100).."%) ") --> localize-me else SpellInfoLabels.uptime:SetText (Loc ["STRING_UPTIME"]..":".." 0") --> localize-me end else SpellInfoLabels.uptime:SetText (Loc ["STRING_UPTIME"]..":".." 0") --> localize-me end SpellInfoLabels.critical:SetText (Loc ["STRING_CRIT"]..":".." "..habilidade.c_amt.." (".. _math_floor ( habilidade.c_amt/habilidade.counter*100 ) .."%)") -- /"..habilidade.counter.." if (habilidade.c_amt < 1) then SpellInfoLabels.critical:SetTextColor (0.5, 0.5, 0.5) SpellInfoLabels.critical:SetText (Loc ["STRING_CRIT"]..":".." "..habilidade.c_amt.."/"..habilidade.counter) --> localize-me else SpellInfoLabels.critical:SetTextColor (1, 1, 1) end local erros = 0 for _, missType in _ipairs (MySelf.missTypes) do local este_erro = habilidade [missType] if (este_erro) then erros = erros + este_erro end end SpellInfoLabels.miss:SetText (Loc ["STRING_MISS"]..":".." "..erros.. " (".._string_format ("%.1f", erros/habilidade.counter*100).."%)") --> localize-me if (erros < 1) then SpellInfoLabels.miss:SetTextColor (0.5, 0.5, 0.5) else SpellInfoLabels.miss:SetTextColor (1, 1, 1) end SpellInfoLabels.block:SetText (Loc ["STRING_BLOCKED"]..":".." ".. _string_format ("%.1f", habilidade.b_amt/habilidade.counter*100).."%") --> ..habilidade.b_dmg if (habilidade.b_dmg < 1) then SpellInfoLabels.block:SetTextColor (0.5, 0.5, 0.5) else SpellInfoLabels.block:SetTextColor (1, 1, 1) end SpellInfoLabels.glancing:SetText ("Glancing: "..habilidade.g_amt.. " (".._string_format ("%.1f", habilidade.g_amt/habilidade.counter*100).."%)") --> localize-me if (habilidade.g_amt < 1) then SpellInfoLabels.glancing:SetTextColor (0.5, 0.5, 0.5) else SpellInfoLabels.glancing:SetTextColor (1, 1, 1) end --> BUFFS local HabilidadeDetails = habilidade.BuffTable if (not HabilidadeDetails) then print ("!buffs -> !habilidade.BuffTable") return end local BuffTextEntry = SpellDetails.BuffTextEntry --> { 1,2,3,4 } --local SoloBuffUptime = _detalhes.SoloTables.SoloBuffUptime local SoloBuffUptime = _detalhes.Buffs.BuffsTable for BuffName, BuffTable in _pairs (_detalhes.Buffs.BuffsTable) do local tabela = HabilidadeDetails [BuffName] if (tabela) then local EntryObject = BuffIndex [BuffName] if (EntryObject) then local tempo = MySelf:Tempo() local EntryObject = BuffIndex [BuffName] EntryObject.amtdone:SetText ("Hits: "..tabela.counter) local duration = BuffTable.duration if (BuffTable.active) then if (not BuffTable.start) then print ("BUFF " .. BuffTable.name.." sem START") else duration = duration + (_detalhes._tempo - BuffTable.start) end end tempo = duration --SpellInfoLabels.uptime:SetText (Loc ["STRING_UPTIME"]..":".." ".._math_floor (DebuffTable.duration).."s (".._math_floor (DebuffTable.duration/MySelf:Tempo()*100).."%) "..DebuffTable.castedAmt.."/"..DebuffTable.refreshAmt.."/"..DebuffTable.droppedAmt) --> localize-me EntryObject.uptime:SetText (Loc ["STRING_UPTIME"]..":" .. " " .. _math_floor (tempo/MySelf:Tempo()*100).."%") --me _math_floor (BuffTable.duration).."s (".. EntryObject.dps:SetText ("Dps: ".._detalhes:comma_value (_math_floor (tabela.total/tempo))) end end end end end function SpellDetails:OnEvent (_, event, ...) if (event == "ADDON_LOADED") then local AddonName = select (1, ...) if (AddonName == "Details_SpellDetails") then if (_G._detalhes) then --> create main plugin object CreatePluginFrames (_detalhes_databaseSpellDetails) local MINIMAL_DETAILS_VERSION_REQUIRED = 1 --> Install plugin inside details local install = _G._detalhes:InstallPlugin ("SOLO", Loc ["PLUGIN_NAME"], "Interface\\Icons\\INV_Fabric_Spellweave", SpellDetails, "DETAILS_PLUGIN_SPELL_DETAILS", MINIMAL_DETAILS_VERSION_REQUIRED, "Details! Team", "v1.08") if (type (install) == "table" and install.error) then print (install.error) end --> Register needed events _G._detalhes:RegisterEvent (SpellDetails, "COMBAT_PLAYER_TIMESTARTED") end end elseif (event == "PLAYER_LOGOUT") then _detalhes_databaseSpellDetails = SpellDetails.data end end