diff --git a/Libs/DF/auras.lua b/Libs/DF/auras.lua
new file mode 100644
index 00000000..f76a9728
--- /dev/null
+++ b/Libs/DF/auras.lua
@@ -0,0 +1,425 @@
+
+local DF = _G ["DetailsFramework"]
+if (not DF or not DetailsFrameworkCanLoad) then
+ return
+end
+
+local _
+local tinsert = tinsert
+local GetSpellInfo = GetSpellInfo
+local lower = string.lower
+local GetSpellBookItemInfo = GetSpellBookItemInfo
+
+local cleanfunction = function() end
+
+do
+ local metaPrototype = {
+ WidgetType = "aura_tracker",
+ SetHook = DF.SetHook,
+ RunHooksForWidget = DF.RunHooksForWidget,
+ }
+
+ _G [DF.GlobalWidgetControlNames ["aura_tracker"]] = _G [DF.GlobalWidgetControlNames ["aura_tracker"]] or metaPrototype
+end
+
+local AuraTrackerMetaFunctions = _G [DF.GlobalWidgetControlNames ["aura_tracker"]]
+
+--create panels
+local on_profile_changed = function (self, newdb)
+ self.db = newdb
+ self.tracking_method:Select (newdb.aura_tracker.track_method)
+
+ --automatic
+ self.buff_ignored:SetData (newdb.aura_tracker.buff_banned)
+ self.debuff_ignored:SetData (newdb.aura_tracker.debuff_banned)
+ self.buff_available:Refresh()
+ self.buff_ignored:Refresh()
+ self.debuff_available:Refresh()
+ self.debuff_ignored:Refresh()
+
+ --manual
+ self.buffs_added:SetData (newdb.aura_tracker.buff)
+ self.debuffs_added:SetData (newdb.aura_tracker.debuff)
+ self.buffs_added:Refresh()
+ self.debuffs_added:Refresh()
+
+ --method
+ if (newdb.aura_tracker.track_method == 0x1) then
+ self.f_auto:Show()
+ self.f_manual:Hide()
+ elseif (newdb.aura_tracker.track_method == 0x2) then
+ self.f_auto:Hide()
+ self.f_manual:Show()
+ end
+end
+
+local aura_panel_defaultoptions = {
+ height = 400,
+ row_height = 16,
+ width = 230,
+}
+function DF:CreateAuraConfigPanel (parent, name, db, method_change_callback, options)
+
+ local options_text_template = DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")
+ local options_dropdown_template = DF:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")
+ local options_switch_template = DF:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE")
+ local options_slider_template = DF:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE")
+ local options_button_template = DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE")
+
+ local f = CreateFrame ("frame", name, parent)
+ f.db = db
+ f.OnProfileChanged = on_profile_changed
+ options = options or {}
+ self.table.deploy (options, aura_panel_defaultoptions)
+
+ local f_auto = CreateFrame ("frame", "$parent_Automatic", f)
+ local f_manual = CreateFrame ("frame", "$parent_Manual", f)
+ f_auto:SetPoint ("topleft", f, "topleft", 0, -24)
+ f_manual:SetPoint ("topleft", f, "topleft", 0, -24)
+ f_auto:SetSize (600, 600)
+ f_manual:SetSize (600, 600)
+ f.f_auto = f_auto
+ f.f_manual = f_manual
+
+ local on_select_tracking_option = function (_, _, method)
+ f.db.aura_tracker.track_method = method
+ if (method_change_callback) then
+ method_change_callback (self, method)
+ end
+
+ if (method == 0x1) then
+ f_auto:Show()
+ f_manual:Hide()
+ elseif (method == 0x2) then
+ f_auto:Hide()
+ f_manual:Show()
+ end
+ end
+
+ local tracking_options = function()
+ return {
+ {label = "Automatic", value = 0x1, onclick = on_select_tracking_option, desc = "Show all your auras by default, you can exclude those you don't want to show."},
+ {label = "Manual", value = 0x2, onclick = on_select_tracking_option, desc = "Do not show any aura by default, you need to manually add each aura you want to track."},
+ }
+ end
+
+ local tracking_method_label = self:CreateLabel (f, "Tracking Aura Method:", 12, "orange")
+ local tracking_method = self:CreateDropDown (f, tracking_options, f.db.aura_tracker.track_method, 120, 20, "dropdown_tracking_method", _, self:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE"))
+
+ tracking_method_label:SetPoint ("topleft", f, "topleft", 10, -10)
+ tracking_method:SetPoint ("left", tracking_method_label, "right", 2, 0)
+ tracking_method:SetFrameStrata ("tooltip")
+ tracking_method.tooltip = "Choose which aura tracking method you want to use."
+ f.tracking_method = tracking_method
+
+--------automatic
+
+ local ALL_BUFFS = {}
+ local ALL_DEBUFFS = {}
+
+ local width, height, row_height = options.width, options.height, options.row_height
+
+ local buff_ignored = self:CreateSimpleListBox (f_auto, "$parentBuffIgnored", "Buffs Ignored", "The list is empty, select a spell from the buff list to ignore it.", f.db.aura_tracker.buff_banned,
+ function (spellid)
+ f.db.aura_tracker.buff_banned [spellid] = nil;
+ end,
+ {
+ icon = function(spellid) return select (3, GetSpellInfo (spellid)) end,
+ text = function(spellid) return select (1, GetSpellInfo (spellid)) end,
+ height = height,
+ row_height = row_height,
+ width = width,
+ onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:AddLine ("Click to un-ignore this aura", .2, 1, .2); GameTooltip:Show() end,
+ })
+
+ local buff_available = self:CreateSimpleListBox (f_auto, "$parentBuffAvailable", "Buffs Available", "The list is empty, cast spells to fill it", ALL_BUFFS, function (spellid)
+ f.db.aura_tracker.buff_banned [spellid] = true; buff_ignored:Refresh()
+ end,
+ {
+ icon = function(spellid) return select (3, GetSpellInfo (spellid)) end,
+ text = function(spellid) return select (1, GetSpellInfo (spellid)) end,
+ height = height,
+ row_height = row_height,
+ width = width,
+ onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:AddLine ("Click to ignore this aura", .2, 1, .2); GameTooltip:Show() end,
+ })
+
+ local debuff_ignored = self:CreateSimpleListBox (f_auto, "$parentDebuffIgnored", "Debuffs Ignored", "The list is empty, select a spell from the debuff list to ignore it.", f.db.aura_tracker.debuff_banned, function (spellid)
+ f.db.aura_tracker.debuff_banned [spellid] = nil;
+ end,
+ {
+ icon = function(spellid) return select (3, GetSpellInfo (spellid)) end,
+ text = function(spellid) return select (1, GetSpellInfo (spellid)) end,
+ height = height,
+ row_height = row_height,
+ width = width,
+ onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:AddLine ("Click to un-ignore this aura", .2, 1, .2); GameTooltip:Show() end,
+ })
+
+ local debuff_available = self:CreateSimpleListBox (f_auto, "$parentDebuffAvailable", "Debuffs Available", "The list is empty, cast spells to fill it", ALL_DEBUFFS, function (spellid)
+ f.db.aura_tracker.debuff_banned [spellid] = true; debuff_ignored:Refresh()
+ end, {
+ icon = function(spellid) return select (3, GetSpellInfo (spellid)) end,
+ text = function(spellid) return select (1, GetSpellInfo (spellid)) end,
+ height = height,
+ row_height = row_height,
+ width = width,
+ onenter = function(self, capsule, value) GameTooltip:SetOwner (self, "ANCHOR_RIGHT"); GameTooltip:SetSpellByID(value); GameTooltip:AddLine (" "); GameTooltip:AddLine ("Click to ignore this aura", .2, 1, .2); GameTooltip:Show() end,
+ })
+
+ --como ira preencher ela no inicio e como ficara o lance dos profiles
+
+ local y = -30
+ buff_available:SetPoint ("topleft", f_auto, "topleft", 0, y)
+ buff_ignored:SetPoint ("topleft", f_auto, "topleft", 6 + width, y)
+ debuff_available:SetPoint ("topleft", f_auto, "topleft", 12 + (width*2), y)
+ debuff_ignored:SetPoint ("topleft", f_auto, "topleft", 18 + (width*3), y)
+
+ f.buff_available = buff_available
+ f.buff_ignored = buff_ignored
+ f.debuff_available = debuff_available
+ f.debuff_ignored = debuff_ignored
+
+ local readCombatLog = CreateFrame ("frame", nil, f_auto)
+ readCombatLog:SetScript ("OnEvent", function (self, event, time, token, hidding, sourceGUID, sourceName, sourceFlag, sourceFlag2, targetGUID, targetName, targetFlag, targetFlag2, spellid, spellname, spellschool, auraType, amount)
+ if (auraType == "BUFF" and sourceGUID == readCombatLog.playerGUID) then
+ if (not ALL_BUFFS [spellid]) then
+ ALL_BUFFS [spellid] = true
+ buff_available:Refresh()
+ end
+ elseif (auraType == "DEBUFF" and sourceGUID == readCombatLog.playerGUID) then
+ if (not ALL_DEBUFFS [spellid]) then
+ ALL_DEBUFFS [spellid] = true
+ debuff_available:Refresh()
+ end
+ end
+ end)
+
+ f_auto:SetScript ("OnShow", function()
+ for i = 1, BUFF_MAX_DISPLAY do
+ local name, rank, texture, count, debuffType, duration, expirationTime, caster, _, nameplateShowPersonal, spellId, _, _, _, nameplateShowAll = UnitAura ("player", i, "HELPFUL")
+ if (name) then
+ ALL_BUFFS [spellId] = true
+ end
+ local name, rank, texture, count, debuffType, duration, expirationTime, caster, _, nameplateShowPersonal, spellId, _, _, _, nameplateShowAll = UnitAura ("player", i, "HARMFUL")
+ if (name) then
+ ALL_DEBUFFS [spellId] = true
+ end
+ end
+
+ buff_available:Refresh()
+ buff_ignored:Refresh()
+ debuff_available:Refresh()
+ debuff_ignored:Refresh()
+
+ readCombatLog.playerGUID = UnitGUID ("player")
+ readCombatLog:RegisterEvent ("COMBAT_LOG_EVENT_UNFILTERED")
+ end)
+ f_auto:SetScript ("OnHide", function()
+ readCombatLog:UnregisterEvent ("COMBAT_LOG_EVENT_UNFILTERED")
+ end)
+
+ --show the frame selecton on the f.db
+ on_select_tracking_option (_, _, f.db.aura_tracker.track_method)
+
+-------manual
+
+ --> build the two aura scrolls for buff and debuff
+
+ local scroll_width = width
+ local scroll_height = height
+ local scroll_lines = 15
+ local scroll_line_height = 20
+
+ local line_onenter = function (self)
+ self:SetBackdropColor (.3, .3, .3, 0.4)
+ local spellid = select (7, GetSpellInfo (self.value))
+ if (spellid) then
+ GameTooltip:SetOwner (self, "ANCHOR_RIGHT");
+ GameTooltip:SetSpellByID (spellid)
+ GameTooltip:AddLine (" ")
+ GameTooltip:AddLine ("Click to untrack this aura", .2, 1, .2)
+ GameTooltip:Show()
+ end
+ end
+ local line_onleave = function (self)
+ self:SetBackdropColor (0, 0, 0, 0.2)
+ GameTooltip:Hide()
+ end
+ local line_onclick = function (self)
+ local spell = self.value
+ local data = self:GetParent():GetData()
+
+ for i = 1, #data do
+ if (data[i] == spell) then
+ tremove (data, i)
+ break
+ end
+ end
+
+ self:GetParent():Refresh()
+ end
+
+ local scroll_createline = function (self, index)
+ local line = CreateFrame ("button", "$parentLine" .. index, self)
+ line:SetPoint ("topleft", self, "topleft", 0, -((index-1)*(scroll_line_height+1)))
+ line:SetSize (scroll_width, scroll_line_height)
+ line:SetScript ("OnEnter", line_onenter)
+ line:SetScript ("OnLeave", line_onleave)
+ line:SetScript ("OnClick", line_onclick)
+
+ line:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
+ line:SetBackdropColor (0, 0, 0, 0.2)
+
+ local icon = line:CreateTexture ("$parentIcon", "overlay")
+ icon:SetSize (scroll_line_height, scroll_line_height)
+ local name = line:CreateFontString ("$parentName", "overlay", "GameFontNormal")
+ icon:SetPoint ("left", line, "left", 2, 0)
+ name:SetPoint ("left", icon, "right", 2, 0)
+ line.icon = icon
+ line.name = name
+
+ return line
+ end
+
+ local scroll_refresh = function (self, data, offset, total_lines)
+ for i = 1, total_lines do
+ local index = i + offset
+ local aura = data [index]
+ if (aura) then
+ local line = self:GetLine (i)
+ local name, _, icon = GetSpellInfo (aura)
+ line.value = aura
+ if (name) then
+ line.name:SetText (name)
+ line.icon:SetTexture (icon)
+ else
+ line.name:SetText (aura)
+ line.icon:SetTexture ([[Interface\InventoryItems\WoWUnknownItem01]])
+ end
+ end
+ end
+ end
+
+ local buffs_added = self:CreateScrollBox (f_manual, "$parentBuffsAdded", scroll_refresh, f.db.aura_tracker.buff, scroll_width, scroll_height, scroll_lines, scroll_line_height)
+ buffs_added:SetPoint ("topleft", f_manual, "topleft", 0, y)
+ buffs_added:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
+ buffs_added:SetBackdropColor (0, 0, 0, 0.2)
+ buffs_added:SetBackdropBorderColor (0, 0, 0, 1)
+ for i = 1, scroll_lines do
+ buffs_added:CreateLine (scroll_createline)
+ end
+
+ local debuffs_added = self:CreateScrollBox (f_manual, "$parentDebuffsAdded", scroll_refresh, f.db.aura_tracker.debuff, scroll_width, scroll_height, scroll_lines, scroll_line_height)
+ debuffs_added:SetPoint ("topleft", f_manual, "topleft", width+30, y)
+ debuffs_added:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
+ debuffs_added:SetBackdropColor (0, 0, 0, 0.2)
+ debuffs_added:SetBackdropBorderColor (0, 0, 0, 1)
+ for i = 1, scroll_lines do
+ debuffs_added:CreateLine (scroll_createline)
+ end
+
+ f.buffs_added = buffs_added
+ f.debuffs_added = debuffs_added
+
+ local buffs_added_name = DF:CreateLabel (buffs_added, "Buffs", 12, "silver")
+ buffs_added_name:SetTemplate (DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
+ buffs_added_name:SetPoint ("bottomleft", buffs_added, "topleft", 0, 2)
+ buffs_added.Title = buffs_added_name
+ local debuffs_added_name = DF:CreateLabel (debuffs_added, "Debuffs", 12, "silver")
+ debuffs_added_name:SetTemplate (DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
+ debuffs_added_name:SetPoint ("bottomleft", debuffs_added, "topleft", 0, 2)
+ debuffs_added.Title = debuffs_added_name
+
+ --> build the text entry to type the spellname
+ local new_buff_string = self:CreateLabel (f_manual, "Add Buff")
+ local new_debuff_string = self:CreateLabel (f_manual, "Add Debuff")
+
+ local new_buff_entry = self:CreateTextEntry (f_manual, function()end, 200, 20, "NewBuffTextBox", _, _, options_dropdown_template)
+ local new_debuff_entry = self:CreateTextEntry (f_manual, function()end, 200, 20, "NewDebuffTextBox", _, _, options_dropdown_template)
+
+ new_buff_entry:SetJustifyH ("left")
+ new_debuff_entry:SetJustifyH ("left")
+
+ DF:SetAutoCompleteWithSpells (new_buff_entry)
+ DF:SetAutoCompleteWithSpells (new_debuff_entry)
+
+ local add_buff_button = self:CreateButton (f_manual, function()
+ local text = new_buff_entry.text
+ new_buff_entry:SetText ("")
+ new_buff_entry:ClearFocus()
+ if (text ~= "") then
+ tinsert (f.db.aura_tracker.buff, text)
+ buffs_added:Refresh()
+ end
+ end, 100, 20, "Add Buff", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"))
+ local add_debuff_button = self:CreateButton (f_manual, function()
+ local text = new_debuff_entry.text
+ new_debuff_entry:SetText ("")
+ new_debuff_entry:ClearFocus()
+ if (text ~= "") then
+ tinsert (f.db.aura_tracker.debuff, text)
+ debuffs_added:Refresh()
+ end
+ end, 100, 20, "Add Debuff", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"))
+
+ new_buff_string:SetPoint ("topleft", f_manual, "topleft", 480, -40)
+ new_buff_entry:SetPoint ("topleft", new_buff_string, "bottomleft", 0, -2)
+ add_buff_button:SetPoint ("left", new_buff_entry, "right", 2, 0)
+ add_buff_button.tooltip = "Add the aura to be tracked.\n\nClick an aura on the list to remove it."
+
+ new_debuff_string:SetPoint ("topleft", f_manual, "topleft", 480, -200)
+ new_debuff_entry:SetPoint ("topleft", new_debuff_string, "bottomleft", 0, -2)
+ add_debuff_button:SetPoint ("left", new_debuff_entry, "right", 2, 0)
+ add_debuff_button.tooltip = "Add the aura to be tracked.\n\nClick an aura on the list to remove it."
+
+ buffs_added:Refresh()
+ debuffs_added:Refresh()
+
+ return f
+end
+
+
+function DF:GetAllPlayerSpells (include_lower_case)
+ local playerSpells = {}
+ local tab, tabTex, offset, numSpells = GetSpellTabInfo (2)
+ for i = 1, numSpells do
+ local index = offset + i
+ local spellType, spellId = GetSpellBookItemInfo (index, "player")
+ if (spellType == "SPELL") then
+ local spellName = GetSpellInfo (spellId)
+ tinsert (playerSpells, spellName)
+ if (include_lower_case) then
+ tinsert (playerSpells, lower (spellName))
+ end
+ end
+ end
+ return playerSpells
+end
+
+function DF:SetAutoCompleteWithSpells (textentry)
+ textentry:SetHook ("OnEditFocusGained", function()
+ local playerSpells = DF:GetAllPlayerSpells (true)
+ textentry.WordList = playerSpells
+ end)
+ textentry:SetAsAutoComplete ("WordList")
+end
+
+--check for aura
+
+
+-- add aura
+
+
+--handle savedvariables
+
+
+--remove a aura
+
+
+
+
+
+--handle UNIT_AURA event
+
+
diff --git a/Libs/DF/fw.lua b/Libs/DF/fw.lua
index 5323e6e1..990f6f50 100644
--- a/Libs/DF/fw.lua
+++ b/Libs/DF/fw.lua
@@ -1,5 +1,5 @@
-local dversion = 24
+local dversion = 27
local major, minor = "DetailsFramework-1.0", dversion
local DF, oldminor = LibStub:NewLibrary (major, minor)
@@ -110,6 +110,7 @@ local embed_functions = {
"SetFrameworkDebugState",
"FindHighestParent",
"OpenInterfaceProfile",
+ "CreateInCombatTexture",
}
DF.table = {}
@@ -562,6 +563,10 @@ end
slider.widget_type = "range"
slider:SetHook ("OnValueChange", widget_table.set)
+ if (widget_table.thumbscale) then
+ slider:SetThumbSize (slider.thumb:GetWidth()*widget_table.thumbscale, nil)
+ end
+
local label = DF:NewLabel (parent, nil, "$parentLabel" .. index, nil, widget_table.name .. (use_two_points and ": " or ""), "GameFontNormal", widget_table.text_template or text_template or 12)
slider:SetPoint ("left", label, "right", 2)
label:SetPoint (cur_x, cur_y)
@@ -683,6 +688,34 @@ end
end
end)
+
+ function DF:CreateInCombatTexture (frame)
+ if (DF.debug and not frame) then
+ error ("Details! Framework: CreateInCombatTexture invalid frame on parameter 1.")
+ end
+
+ local in_combat_background = DF:CreateImage (frame)
+ in_combat_background:SetColorTexture (.6, 0, 0, .1)
+ in_combat_background:Hide()
+
+ local in_combat_label = Plater:CreateLabel (frame, "you are in combat", 24, "silver")
+ in_combat_label:SetPoint ("right", in_combat_background, "right", -10, 0)
+ in_combat_label:Hide()
+
+ frame:RegisterEvent ("PLAYER_REGEN_DISABLED")
+ frame:RegisterEvent ("PLAYER_REGEN_ENABLED")
+ frame:SetScript ("OnEvent", function (self, event)
+ if (event == "PLAYER_REGEN_DISABLED") then
+ in_combat_background:Show()
+ in_combat_label:Show()
+ elseif (event == "PLAYER_REGEN_ENABLED") then
+ in_combat_background:Hide()
+ in_combat_label:Hide()
+ end
+ end)
+
+ return in_combat_background
+ end
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> tutorials
@@ -1051,6 +1084,7 @@ DF.GlobalWidgetControlNames = {
image = "DF_ImageMetaFunctions",
slider = "DF_SliderMetaFunctions",
split_bar = "DF_SplitBarMetaFunctions",
+ aura_tracker = "DF_AuraTracker",
}
function DF:AddMemberForWidget (widgetName, memberType, memberName, func)
diff --git a/Libs/DF/load.xml b/Libs/DF/load.xml
index 2a5f0ffa..72344efb 100644
--- a/Libs/DF/load.xml
+++ b/Libs/DF/load.xml
@@ -20,4 +20,5 @@
+
\ No newline at end of file
diff --git a/Libs/DF/normal_bar.lua b/Libs/DF/normal_bar.lua
index d676c8c6..245f4f55 100644
--- a/Libs/DF/normal_bar.lua
+++ b/Libs/DF/normal_bar.lua
@@ -510,11 +510,11 @@ local BarMetaFunctions = _G [DF.GlobalWidgetControlNames ["normal_bar"]]
function BarMetaFunctions:OnTimerEnd()
local capsule = self
- local kill = capsule:RunHooksForWidget ("OnTimerEnd", self.widget, button, capsule)
+ local kill = capsule:RunHooksForWidget ("OnTimerEnd", self.widget, capsule)
if (kill) then
return
end
-
+
self.timer_texture:Hide()
self.timer_textureR:Hide()
self.div_timer:Hide()
diff --git a/Libs/DF/panel.lua b/Libs/DF/panel.lua
index 936be69b..18cdc779 100644
--- a/Libs/DF/panel.lua
+++ b/Libs/DF/panel.lua
@@ -3330,10 +3330,263 @@ end
-
-
-
-
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+-- ~listbox
+
+local simple_list_box_ResetWidgets = function (self)
+ for _, widget in ipairs (self.widgets) do
+ widget:Hide()
+ end
+ self.nextWidget = 1
+end
+
+local simple_list_box_onenter = function (self, capsule)
+ self:GetParent().options.onenter (self, capsule, capsule.value)
+end
+
+local simple_list_box_onleave = function (self, capsule)
+ self:GetParent().options.onleave (self, capsule, capsule.value)
+ GameTooltip:Hide()
+end
+
+local simple_list_box_GetOrCreateWidget = function (self)
+ local index = self.nextWidget
+ local widget = self.widgets [index]
+ if (not widget) then
+ widget = DF:CreateButton (self, function()end, self.options.width, self.options.row_height, "", nil, nil, nil, nil, nil, nil, DF:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE"))
+ widget:SetHook ("OnEnter", simple_list_box_onenter)
+ widget:SetHook ("OnLeave", simple_list_box_onleave)
+ widget.textcolor = self.options.textcolor
+ tinsert (self.widgets, widget)
+ end
+ self.nextWidget = self.nextWidget + 1
+ return widget
+end
+
+local simple_list_box_RefreshWidgets = function (self)
+ self:ResetWidgets()
+ local amt = 0
+ for value, _ in pairs (self.list_table) do
+ local widget = self:GetOrCreateWidget()
+ widget:SetPoint ("topleft", self, "topleft", 1, -self.options.row_height * (self.nextWidget-2) - 4)
+ widget:SetPoint ("topright", self, "topright", -1, -self.options.row_height * (self.nextWidget-2) - 4)
+ widget:SetClickFunction (self.func, value)
+ widget.value = value
+
+ if (self.options.icon) then
+ if (type (self.options.icon) == "string" or type (self.options.icon) == "number") then
+ widget:SetIcon (self.options.icon, self.options.row_height, self.options.row_height)
+ elseif (type (self.options.icon) == "function") then
+ local icon = self.options.icon (value)
+ if (icon) then
+ widget:SetIcon (icon, self.options.row_height, self.options.row_height)
+ end
+ end
+ else
+ widget:SetIcon ("", self.options.row_height, self.options.row_height)
+ end
+
+ if (self.options.text) then
+ if (type (self.options.text) == "function") then
+ local text = self.options.text (value)
+ if (text) then
+ widget:SetText (text)
+ else
+ widget:SetText ("")
+ end
+ else
+ widget:SetText (self.options.text or "")
+ end
+ else
+ widget:SetText ("")
+ end
+
+ widget.value = value
+ widget:Show()
+ amt = amt + 1
+ end
+ if (amt == 0) then
+ self.EmptyLabel:Show()
+ else
+ self.EmptyLabel:Hide()
+ end
+end
+
+local backdrop = {bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16, edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1}
+local default_options = {
+ height = 400,
+ row_height = 16,
+ width = 230,
+ icon = false,
+ text = "",
+ textcolor = "wheat",
+ onenter = function (self, capsule)
+ if (capsule) then
+ capsule.textcolor = "white"
+ end
+ end,
+ onleave = function (self, capsule)
+ if (capsule) then
+ capsule.textcolor = self:GetParent().options.textcolor
+ end
+ GameTooltip:Hide()
+ end,
+}
+
+local simple_list_box_SetData = function (self, t)
+ self.list_table = t
+end
+
+function DF:CreateSimpleListBox (parent, name, title, empty_text, list_table, onclick, options)
+ local f = CreateFrame ("frame", name, parent)
+
+ f.ResetWidgets = simple_list_box_ResetWidgets
+ f.GetOrCreateWidget = simple_list_box_GetOrCreateWidget
+ f.Refresh = simple_list_box_RefreshWidgets
+ f.SetData = simple_list_box_SetData
+ f.nextWidget = 1
+ f.list_table = list_table
+ f.func = function (self, button, value)
+ onclick (value)
+ f:Refresh()
+ end
+ f.widgets = {}
+ f:SetBackdrop (backdrop)
+ f:SetBackdropColor (0, 0, 0, 0.3)
+ f:SetBackdropBorderColor (0, 0, 0, 0.5)
+ f.options = options or {}
+ self.table.deploy (f.options, default_options)
+
+ f:SetSize (f.options.width + 2, f.options.height)
+
+ local name = DF:CreateLabel (f, title, 12, "silver")
+ name:SetTemplate (DF:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE"))
+ name:SetPoint ("bottomleft", f, "topleft", 0, 2)
+ f.Title = name
+
+ local emptyLabel = DF:CreateLabel (f, empty_text, 12, "gray")
+ emptyLabel:SetAlpha (.6)
+ emptyLabel:SetSize (f.options.width-10, f.options.height)
+ emptyLabel:SetPoint ("center", 0, 0)
+ emptyLabel:Hide()
+ emptyLabel.align = "center"
+ f.EmptyLabel = emptyLabel
+
+ return f
+end
+
+
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+-- ~scrollbox
+
+
+-- preciso de uma fauxscroll que seja facil de lidar
+-- ele cria scroll aqui, preciso falar a função que cria a linha e a função que atualiza
+-- precisa passsar o tamanho em height width quantas barras vai mostrar
+-- search box incluso opcionalmente
+
+
+DF.SortFunctions = {}
+
+local SortMember = ""
+local SortByMember = function (t1, t2)
+ return t1[SortMember] > t2[SortMember]
+end
+local SortByMemberReverse = function (t1, t2)
+ return t1[SortMember] < t2[SortMember]
+end
+
+DF.SortFunctions.Sort = function (self, t, by, is_reverse)
+ SortMember = by
+ if (not is_reverse) then
+ table.sort (t, SortByMember)
+ else
+ table.sort (t, SortByMemberReverse)
+ end
+end
+
+
+DF.ScrollBoxFunctions = {}
+
+DF.ScrollBoxFunctions.Refresh = function (self)
+ for _, frame in ipairs (self.Frames) do
+ frame:Hide()
+ frame._InUse = nil
+ end
+
+ local offset = 0
+ if (self.IsFauxScroll) then
+ FauxScrollFrame_Update (self, #self.data, self.LineAmount, self.LineHeight+1)
+ offset = FauxScrollFrame_GetOffset (self)
+ end
+
+ local okay, totalLines = pcall (self.refresh_func, self, self.data, offset, #self.Frames)
+ if (not okay) then
+ error ("Details! FrameWork: Refresh(): " .. result)
+ end
+
+ for _, frame in ipairs (self.Frames) do
+ if (not frame._InUse) then
+ frame:Hide()
+ else
+ frame:Show()
+ end
+ end
+
+ self:Show()
+
+ return self.Frames
+end
+
+DF.ScrollBoxFunctions.OnVerticalScroll = function (self, offset)
+ FauxScrollFrame_OnVerticalScroll (self, offset, self.LineHeight, self.Refresh)
+ return true
+end
+
+DF.ScrollBoxFunctions.CreateLine = function (self, func)
+ local okay, newLine = pcall (func, self, #self.Frames+1)
+ if (okay) then
+ tinsert (self.Frames, newLine)
+ return newLine
+ else
+ error ("Details! FrameWork: CreateLine(): " .. newLine)
+ end
+end
+
+DF.ScrollBoxFunctions.GetLine = function (self, line_index)
+ local line = self.Frames [line_index]
+ if (line) then
+ line._InUse = true
+ end
+ return line
+end
+
+DF.ScrollBoxFunctions.SetData = function (self, data)
+ self.data = data
+end
+DF.ScrollBoxFunctions.GetData = function (self)
+ return self.data
+end
+
+function DF:CreateScrollBox (parent, name, refresh_func, data, width, height, line_amount, line_height)
+ local scroll = CreateFrame ("scrollframe", name, parent, "FauxScrollFrameTemplate")
+
+ scroll:SetSize (width, height)
+ scroll.LineAmount = line_amount
+ scroll.LineHeight = line_height
+ scroll.IsFauxScroll = true
+ scroll.Frames = {}
+
+ DF:Mixin (scroll, DF.SortFunctions)
+ DF:Mixin (scroll, DF.ScrollBoxFunctions)
+
+ scroll.refresh_func = refresh_func
+ scroll.data = data
+
+ scroll:SetScript ("OnVerticalScroll", scroll.OnVerticalScroll)
+
+ return scroll
+end
diff --git a/boot.lua b/boot.lua
index a81ac65c..1fd9efcb 100644
--- a/boot.lua
+++ b/boot.lua
@@ -4,8 +4,8 @@
_ = nil
_detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0")
_detalhes.build_counter = 2698 --it's 2697 for release
- _detalhes.userversion = "v5.10c"
- _detalhes.realversion = 109 --core version
+ _detalhes.userversion = "v5.11"
+ _detalhes.realversion = 110 --core version
_detalhes.version = _detalhes.userversion .. " (core " .. _detalhes.realversion .. ")"
Details = _detalhes
@@ -21,12 +21,15 @@ do
local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" )
--[[
-|cFFFFFF00v5.10c (|cFFFFCC00July 22, 2016|r|cFFFFFF00)|r:\n\n
-|cFFFFFF00-|r Trying a workaround for the wow client image cache bug, please delete the file 'spec_icons_normal.TGA' from details/image folder.\n\n
+|cFFFFFF00v5.11 (|cFFFFCC00July 26, 2016|r|cFFFFFF00)|r:\n\n
+|cFFFFFF00-|r fixed the spam of 'segment not added to overall'.\n\n
+|cFFFFFF00-|r stormlash and blessing of might workarouds.\n\n
+|cFFFFFF00-|r warrior rampage fix.\n\n
+|cFFFFFF00-|r hunter throw axe fix.\n\n
--]]
--
- Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v5.10c (|cFFFFCC00July 22, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Trying a workaround for the wow client's texture cache bug which causes FPS drops, please delete the file 'spec_icons_normal.TGA' from details/image folder.\n\n|cFFFFFF00v5.10b (|cFFFFCC00July 21, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed warlock's Soul Effigy.\n\n|cFFFFFF00v5.10a (|cFFFFCC00July 20, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with Calc Leech plugin.\n\n|cFFFFFF00v5.10 (|cFFFFCC00July 19, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Using .BLP format for images. If you have FPS drops caused by Details!, delete ALL .TGA files inside the folder Details/Images/\n\n|cFFFFFF00v5.8 (|cFFFFCC00July 11, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Big framework update. May have some bugs, please report to us if you find any.\n\n|cFFFFFF00v5.8 (|cFFFFCC00June 27, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Energy and Resources are working properly now.\n\n|cFFFFFF00-|r Added raid information for The Emerald Nightmare.\n\n|cFFFFFF00v5.7 (|cFFFFCC00June 16, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Most of the raid plugins got added on this version.\n\n|cFFFFFF00-|r Plugin 'Damage, The Game!' also got damage goals updated.\n\n|cFFFFFF00v5.5 (|cFFFFCC00June 03, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Default skin is now 'Safe Skin Legion Beta' which helps a little with the disabled texture issue.\n|cFFFFFF00-|r If you're using another skin, you may change at the options panel /details options > Skin Selection.\n|cFFFFFF00-|r You also can disable the class icons at Bars: General > Icon File.\n\n|cFFFFFF00v5.4 (|cFFFFCC00May 19, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Tracking spec for Demon Hunters is now implemented, you may see spec icons for demon hunters now.\n\n|cFFFFFF00-|r Fix some issues with Healing display.\n\n|cFFFFFF00v5.3a (|cFFFFCC00May 16, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed tooltip spell icons.\n\n|cFFFFFF00-|r Fixed some issues with demon hunter class icons."
+ Loc ["STRING_VERSION_LOG"] = "|cFFFFFF00v5.11 (|cFFFFCC00July 26, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r fixed the spam of 'segment not added to overall'.\n\n|cFFFFFF00-|r stormlash and blessing of might workarouds.\n\n|cFFFFFF00-|r warrior rampage fix.\n\n|cFFFFFF00-|r hunter throw axe fix.\n\n|cFFFFFF00v5.10c (|cFFFFCC00July 22, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Trying a workaround for the wow client's texture cache bug which causes FPS drops, please delete the file 'spec_icons_normal.TGA' from details/image folder.\n\n|cFFFFFF00v5.10b (|cFFFFCC00July 21, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed warlock's Soul Effigy.\n\n|cFFFFFF00v5.10a (|cFFFFCC00July 20, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Fixed an issue with Calc Leech plugin.\n\n|cFFFFFF00v5.10 (|cFFFFCC00July 19, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Using .BLP format for images. If you have FPS drops caused by Details!, delete ALL .TGA files inside the folder Details/Images/\n\n|cFFFFFF00v5.8 (|cFFFFCC00July 11, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Big framework update. May have some bugs, please report to us if you find any.\n\n|cFFFFFF00v5.8 (|cFFFFCC00June 27, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Energy and Resources are working properly now.\n\n|cFFFFFF00-|r Added raid information for The Emerald Nightmare.\n\n|cFFFFFF00v5.7 (|cFFFFCC00June 16, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Most of the raid plugins got added on this version.\n\n|cFFFFFF00-|r Plugin 'Damage, The Game!' also got damage goals updated.\n\n|cFFFFFF00v5.5 (|cFFFFCC00June 03, 2016|r|cFFFFFF00)|r:\n\n|cFFFFFF00-|r Default skin is now 'Safe Skin Legion Beta' which helps a little with the disabled texture issue.\n|cFFFFFF00-|r If you're using another skin, you may change at the options panel /details options > Skin Selection.\n|cFFFFFF00-|r You also can disable the class icons at Bars: General > Icon File."
Loc ["STRING_DETAILS1"] = "|cffffaeaeDetails!:|r "
diff --git a/classes/container_historico.lua b/classes/container_historico.lua
index 06416993..d4854ad4 100644
--- a/classes/container_historico.lua
+++ b/classes/container_historico.lua
@@ -161,10 +161,12 @@ function historico:adicionar (tabela)
overall_added = true
--print ("0x10")
end
-
+
if (overall_added) then
if (tabela.is_boss and tabela:InstanceType() == "raid" and tabela:GetCombatTime() < 30) then
- _detalhes:Msg ("segment not added to overall (less than 30 seconds of combat time).")
+ if (_detalhes.debug) then
+ _detalhes:Msg ("segment not added to overall (less than 30 seconds of combat time).")
+ end
else
if (_detalhes.debug) then
_detalhes:Msg ("(debug) overall data flag match with the current combat.")
diff --git a/core/parser.lua b/core/parser.lua
index 1712ea95..6977626d 100644
--- a/core/parser.lua
+++ b/core/parser.lua
@@ -87,7 +87,10 @@
local ignore_death = {}
--> special items
local soul_capacitor = {} --> trinket from Socrethar the Eternal
-
+ local paladin_gbom = {} --greater blessing of might
+ local shaman_slash = {} --storm lash
+ local source_cache = {} --store the source's guid, name and flag
+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> constants
@@ -118,6 +121,19 @@
[1] = true, --0x1 star
}
+ local WARRIOR_RAMPAGE = {
+ [184707] = true,
+ [184709] = true,
+ [201364] = true,
+ [201363] = true,
+ }
+
+ local SPELLID_WARRIOR_RAMPAGE = 218617
+ local SPELLID_SHAMAN_SLASH_AURA = 195222
+ local SPELLID_SHAMAN_SLASH_DAMAGE = 195256
+ local SPELLID_PALADIN_GBOM_AURA = 203528
+ local SPELLID_PALADIN_GBOM_DAMAGE = 205729
+
--> recording data options flags
local _recording_self_buffs = false
local _recording_ability_with_buffs = false
@@ -152,8 +168,7 @@
end
function parser:range (token, time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, alvo_flags2, spellid, spellname, spelltype, amount, overkill, school, resisted, blocked, absorbed, critical, glacing, crushing, isoffhand)
- return parser:spell_dmg (token, time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, alvo_flags2, 2, "Tiro-Automático", 00000001, amount, overkill, school, resisted, blocked, absorbed, critical, glacing, crushing, isoffhand) --> localize-me
- --spellid, spellname, spelltype
+ return parser:spell_dmg (token, time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, alvo_flags2, spellid, spellname, spelltype, amount, overkill, school, resisted, blocked, absorbed, critical, glacing, crushing, isoffhand) --> localize-me
end
-- /run local f=CreateFrame("frame");f:RegisterAllEvents();f:SetScript("OnEvent", function(self, ...)print (...);end)
@@ -162,7 +177,6 @@
-- /run local f=CreateFrame("frame");f:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED");f:SetScript("OnEvent", function(self, ...)print (...);end)
-- /run local f=CreateFrame("frame");f:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED");f:SetScript("OnEvent",function(self, ...) local a = select(6, ...);if (a=="")then print (...) end end)
-
-- /run local f=CreateFrame("frame");f:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED");f:SetScript("OnEvent",function(self, ...) local a = select(3, ...);print (a);if (a=="SPELL_CAST_SUCCESS")then print (...) end end)
function parser:spell_dmg (token, time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, alvo_flags2, spellid, spellname, spelltype, amount, overkill, school, resisted, blocked, absorbed, critical, glacing, crushing, isoffhand)
@@ -212,6 +226,17 @@
return parser:SLT_damage (token, time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, spellid, spellname, spelltype, amount, overkill, school, resisted, blocked, absorbed, critical, glacing, crushing, isoffhand)
end
+ if (WARRIOR_RAMPAGE [spellid]) then
+ spellid = SPELLID_WARRIOR_RAMPAGE
+ end
+
+ if (spellid == SPELLID_PALADIN_GBOM_DAMAGE) then
+ who_serial, who_name, who_flags = parser:GetRealHitSourceFromBuffOwner (paladin_gbom, who_serial, who_name, who_flags)
+ elseif (spellid == SPELLID_SHAMAN_SLASH_DAMAGE) then
+ who_serial, who_name, who_flags = parser:GetRealHitSourceFromBuffOwner (shaman_slash, who_serial, who_name, who_flags)
+ end
+
+ --> REMOVE AFTER LEGION LAUNCH
if (soul_capacitor [who_serial]) then
if (soul_capacitor [who_serial]+12 < _tempo) then
--> something went wrong, debuff didn't expired or we didn't saw it going out.
@@ -225,7 +250,7 @@
--> check if need start an combat
if (not _in_combat) then
- if ( token ~= "SPELL_PERIODIC_DAMAGE" and
+ if ( token ~= "SPELL_PERIODIC_DAMAGE" and spellid ~= SPELLID_PALADIN_GBOM_DAMAGE and
(
(who_flags and _bit_band (who_flags, AFFILIATION_GROUP) ~= 0 and _UnitAffectingCombat (who_name) )
or
@@ -1233,7 +1258,7 @@
end
-----------------------------------------------------------------------------------------------------------------------------------------
- --> BUFFS & DEBUFFS serach key: ~buff ~aura ~shield |
+ --> BUFFS & DEBUFFS search key: ~buff ~aura ~shield |
-----------------------------------------------------------------------------------------------------------------------------------------
function parser:buff (token, time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, alvo_flags2, spellid, spellname, spellschool, tipo, amount, arg1, arg2, arg3)
@@ -1254,13 +1279,23 @@
if (tipo == "BUFF") then
------------------------------------------------------------------------------------------------
--> buff uptime
-
+
if (spellid == 27827) then --> spirit of redemption (holy priest)
parser:dead ("UNIT_DIED", time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags)
ignore_death [who_name] = true
return
- elseif (spellid == 184293) then --> WOD trinket: Soul Capacitor T18 (soul eruption 184559)
+
+ elseif (spellid == 184293) then --> WOD trinket: Soul Capacitor T18 (soul eruption 184559) --REMOVE ON LEGION LAUNCH
soul_capacitor [who_serial] = _tempo
+
+ elseif (spellid == SPELLID_SHAMAN_SLASH_AURA) then --shaman slash
+ --> handle the bugg on parser time
+ parser:Handle3rdPartyBuff (shaman_slash, who_serial, alvo_serial, true, who_name, who_flags)
+
+ elseif (spellid == SPELLID_PALADIN_GBOM_AURA) then --paladin gbom
+ --> handle the buff on parser time
+ parser:Handle3rdPartyBuff (paladin_gbom, who_serial, alvo_serial, true, who_name, who_flags)
+
end
if (_recording_buffs_and_debuffs) then
@@ -1622,8 +1657,15 @@
end
end
- if (spellid == 184293) then --> WOD trinket: Soul Capacitor T18
+ if (spellid == 184293) then --> WOD trinket: Soul Capacitor T18 REMOVE ON LEGION LAUNCH
soul_capacitor [who_serial] = nil
+
+ elseif (spellid == SPELLID_SHAMAN_SLASH_AURA) then --shaman slash
+ parser:Handle3rdPartyBuff (shaman_slash, who_serial, alvo_serial)
+
+ elseif (spellid == SPELLID_PALADIN_GBOM_AURA) then --paladin gbom
+ parser:Handle3rdPartyBuff (paladin_gbom, who_serial, alvo_serial)
+
end
------------------------------------------------------------------------------------------------
@@ -2797,6 +2839,106 @@ SPELL_POWER_OBSOLETE2 = 15;
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> core
+ local shaman_slash = {} --storm lash
+ --[[
+ paladin buffs = {}
+ player = paladin buffs [ target GUID ]
+
+ paladin buffs [ GUID ] = {sourceGUID, sourceGUID, sourceGUID, offset = X}
+ it's a table with a indexed side and a hash side
+ on index side, there is GUIDs of all paladins that buffed the player
+ on the hash side, there is a member 'offset' which points the index of the next paladin to attribute the damage to
+ --]]
+
+ function parser:WipeSourceCache()
+ wipe (source_cache)
+ wipe (paladin_gbom)
+ wipe (shaman_slash)
+ end
+
+ function parser:Handle3rdPartyBuffs_OnEncounterStart()
+ --> wipe and rebuild the list
+ parser:WipeSourceCache()
+ local get_name = _detalhes.GetCLName
+
+ for i = 1, _GetNumGroupMembers() do
+ for auraIndex = 1, 40 do
+ --gbom
+ local name, rank, texture, count, debuffType, duration, expirationTime, caster, canStealOrPurge, nameplateShowPersonal, spellId = UnitAura ("raid" .. i, auraIndex, "HELPFUL")
+ if (spellId == SPELLID_SHAMAN_SLASH_AURA) then
+ local source_serial = UnitGUID (caster)
+ local target_serial = UnitGUID ("raid" .. i)
+ local name, flag = get_name (_, caster), 0x514
+ parser:Handle3rdPartyBuff (shaman_slash, source_serial, target_serial, true, name, flag)
+
+ elseif (spellId == SPELLID_PALADIN_GBOM_AURA) then
+ local source_serial = UnitGUID (caster)
+ local target_serial = UnitGUID ("raid" .. i)
+ local name, flag = get_name (_, caster), 0x514
+ parser:Handle3rdPartyBuff (paladin_gbom, source_serial, target_serial, true, name, flag)
+ end
+ end
+ end
+ end
+
+ function parser:GetRealHitSourceFromBuffOwner (container, actor_serial, acter_name, acter_flags) --actor can be anything, a player, pet, etc
+ local target_buffs = container [actor_serial]
+ if (target_buffs) then
+ local real_source = source_cache [target_buffs [target_buffs.offset]]
+ --> set the next source
+ target_buffs.offset = (target_buffs.offset % #target_buffs) + 1
+ if (real_source) then
+ return unpack (real_source)
+ else
+ print ("Details! Debug: buff real source not found.")
+ end
+ end
+ return actor_serial, acter_name, acter_flags
+ end
+
+ function parser:Handle3rdPartyBuff (container, source, target, is_applying, name, flags) --source/target are GUIDs/is_applying bool/name and flag are from the caster
+ if (is_applying) then
+ local target_buffs = container [target]
+ if (not target_buffs) then
+ --> create the source pool
+ container [target] = {source, ["offset"] = 1}
+ --> add the source to source cache
+ if (not source_cache [source]) then
+ source_cache [source] = {source, name, flags}
+ end
+ else
+ --> is already on the pool
+ for i = 1, #target_buffs do
+ if (target_buffs [i] == source) then
+ --target_buffs.offset = i
+ return
+ end
+ end
+ target_buffs [#target_buffs+1] = source
+ --target_buffs.offset = #target_buffs
+ end
+ else
+ local target_buffs = container [target]
+ if (target_buffs) then
+ for i = 1, #target_buffs do
+ if (target_buffs [i] == source) then
+ tremove (target_buffs, i)
+ if (#target_buffs == 0) then
+ --> drop the table
+ container [target] = nil
+ else
+ --> if the target was the last index, the offset is nil
+ if (not target_buffs [i]) then
+ target_buffs.offset = target_buffs.offset - 1
+ end
+ end
+ return
+ end
+ end
+ end
+ end
+ end
+
local token_list = {
-- neutral
["SPELL_SUMMON"] = parser.summon,
@@ -3171,6 +3313,8 @@ SPELL_POWER_OBSOLETE2 = 15;
_detalhes.zone_id = zoneMapID
_detalhes.zone_name = zoneName
+ parser:WipeSourceCache()
+
if (_detalhes.last_zone_type ~= zoneType) then
_detalhes:SendEvent ("ZONE_TYPE_CHANGED", nil, zoneType)
_detalhes.last_zone_type = zoneType
@@ -3331,6 +3475,7 @@ SPELL_POWER_OBSOLETE2 = 15;
_detalhes.encounter_table.index = boss_index
end
+ parser:Handle3rdPartyBuffs_OnEncounterStart()
end
function _detalhes.parser_functions:ENCOUNTER_END (...)
diff --git a/images/skins/imperial_skin.blp b/images/skins/imperial_skin.blp
deleted file mode 100644
index 2946ad0c..00000000
Binary files a/images/skins/imperial_skin.blp and /dev/null differ