Release Candidate 1

This commit is contained in:
Tercio Jose
2022-11-18 16:54:25 -03:00
parent bbbda84c68
commit 1c8dfb3ab7
96 changed files with 3053 additions and 1427 deletions
+2 -1
View File
@@ -1,4 +1,4 @@
## Interface: 100000
## Interface: 100002
## Title: Details! Damage Meter
## Notes: Essential tool to impress that chick in your raid.
## SavedVariables: _detalhes_global
@@ -28,6 +28,7 @@ core\util.lua
API.lua
functions\events.lua
functions\private.lua
functions\profiles.lua
functions\hooks.lua
functions\bossmods.lua
+1
View File
@@ -25,6 +25,7 @@ indent.lua
core\util.lua
API.lua
functions\private.lua
functions\profiles.lua
functions\hooks.lua
functions\bossmods.lua
+1
View File
@@ -26,6 +26,7 @@ indent.lua
core\util.lua
API.lua
functions\private.lua
functions\profiles.lua
functions\hooks.lua
functions\bossmods.lua
+49
View File
@@ -1029,3 +1029,52 @@ end
return colorPickButton
end
function DF:SetRegularButtonTexture(button, texture, left, right, top, bottom)
if (type(left) == "table") then
left, right, top, bottom = unpack(left)
end
if (not left) then
left, right, top, bottom = 0, 1, 0, 1
end
local atlas
if (type(texture) == "string") then
atlas = C_Texture.GetAtlasInfo(texture)
end
local normalTexture = button:GetNormalTexture()
local pushedTexture = button:GetPushedTexture()
local highlightTexture = button:GetHightlightTexture()
local disabledTexture = button:GetDisabledTexture()
if (atlas) then
normalTexture:SetAtlas(texture)
pushedTexture:SetAtlas(texture)
highlightTexture:SetAtlas(texture)
disabledTexture:SetAtlas(texture)
else
normalTexture:SetTexture(texture)
pushedTexture:SetTexture(texture)
highlightTexture:SetTexture(texture)
disabledTexture:SetTexture(texture)
normalTexture:SetTexCoord(left, right, top, bottom)
pushedTexture:SetTexCoord(left, right, top, bottom)
highlightTexture:SetTexCoord(left, right, top, bottom)
disabledTexture:SetTexCoord(left, right, top, bottom)
end
end
function DF:SetRegularButtonVertexColor(button, ...)
local r, g, b, a = DF:ParseColor(...)
local normalTexture = button:GetNormalTexture()
local pushedTexture = button:GetPushedTexture()
local highlightTexture = button:GetHightlightTexture()
local disabledTexture = button:GetDisabledTexture()
normalTexture:SetVertexColor(r, g, b, a)
pushedTexture:SetVertexColor(r, g, b, a)
highlightTexture:SetVertexColor(r, g, b, a)
disabledTexture:SetVertexColor(r, g, b, a)
end
+4 -2
View File
@@ -28,6 +28,8 @@ function DF:CreateCoolTip()
return
end
local maxStatusBarValue = 100000000
local defaultBackdrop = {bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1,
tile = true, tileSize = 16, insets = {left = 0, right = 0, top = 0, bottom = 0}}
local defaultBackdropColor = {0.1215, 0.1176, 0.1294, 0.8000}
@@ -1159,7 +1161,7 @@ function DF:CreateCoolTip()
function gameCooltip:StatusBar(menuButton, statusBarSettings)
if (statusBarSettings) then
menuButton.statusbar:SetValue(statusBarSettings[1])
menuButton.statusbar:SetValue(Clamp(statusBarSettings[1], 0, maxStatusBarValue))
menuButton.statusbar:SetStatusBarColor(statusBarSettings[2], statusBarSettings[3], statusBarSettings[4], statusBarSettings[5])
menuButton.statusbar:SetHeight(20 + (gameCooltip.OptionsTable.StatusBarHeightMod or 0))
@@ -1171,7 +1173,7 @@ function DF:CreateCoolTip()
end
if (statusBarSettings[7]) then
menuButton.statusbar2:SetValue(statusBarSettings[7].value)
menuButton.statusbar2:SetValue(Clamp(statusBarSettings[7].value, 0, maxStatusBarValue))
menuButton.statusbar2.texture:SetTexture(statusBarSettings[7].texture or [[Interface\RaidFrame\Raid-Bar-Hp-Fill]])
if (statusBarSettings[7].specialSpark) then
menuButton.spark2:Show()
+84 -20
View File
@@ -191,10 +191,10 @@ DF:Mixin(DropDownMetaFunctions, DF.ScriptHookMixin)
--menu width and height
function DropDownMetaFunctions:SetMenuSize(width, height)
if (width) then
return rawset(self, "realsizeW", width)
rawset(self, "realsizeW", width)
end
if (height) then
return rawset(self, "realsizeH", height)
rawset(self, "realsizeH", height)
end
end
@@ -515,6 +515,18 @@ function DropDownMetaFunctions:Selected(thisOption)
self.label:SetPoint("left", self.label:GetParent(), "left", 4, 0)
end
if (thisOption.centerTexture) then
self.dropdown.centerTexture:SetTexture(thisOption.centerTexture)
else
self.dropdown.centerTexture:SetTexture("")
end
if (thisOption.rightTexture) then
self.dropdown.rightTexture:SetTexture(thisOption.rightTexture)
else
self.dropdown.rightTexture:SetTexture("")
end
if (thisOption.statusbar) then
self.statusbar:SetTexture(thisOption.statusbar)
if (thisOption.statusbarcolor) then
@@ -540,6 +552,7 @@ function DropDownMetaFunctions:Selected(thisOption)
self:SetValue(thisOption.value)
end
--on click on any option in the dropdown
function DetailsFrameworkDropDownOptionClick(button)
--update name and icon on main frame
button.object:Selected(button.table)
@@ -555,9 +568,11 @@ function DetailsFrameworkDropDownOptionClick(button)
button.object.myvaluelabel = button.table.label
end
--on click on the dropdown show the menu frame with the options to select
function DropDownMetaFunctions:Open()
self.dropdown.dropdownframe:Show()
self.dropdown.dropdownborder:Show()
self.opened = true
if (lastOpened) then
lastOpened:Close()
@@ -565,6 +580,7 @@ function DropDownMetaFunctions:Open()
lastOpened = self
end
--close the menu showing the options
function DropDownMetaFunctions:Close()
--when menu is being close, just hide the border and the script will call back this again
if (self.dropdown.dropdownborder:IsShown()) then
@@ -585,6 +601,7 @@ function DetailsFrameworkDropDownOptionsFrameOnHide(self)
self:GetParent().MyObject:Close()
end
--on enter an option in the menu dropdown
function DetailsFrameworkDropDownOptionOnEnter(self)
if (self.table.desc) then
GameCooltip2:Preset(2)
@@ -603,10 +620,22 @@ function DetailsFrameworkDropDownOptionOnEnter(self)
self.tooltip = true
end
if (self.table.audiocue) then
if (DF.CurrentSoundHandle) then
StopSound(DF.CurrentSoundHandle, 0.1)
end
local willPlay, soundHandle = PlaySoundFile(self.table.audiocue, "Master")
if (willPlay) then
DF.CurrentSoundHandle = soundHandle
end
end
self:GetParent().mouseover:SetPoint("left", self)
self:GetParent().mouseover:Show()
end
--on leave an option on the menu dropdown
function DetailsFrameworkDropDownOptionOnLeave(frame)
if (frame.table.desc) then
GameCooltip2:ShowMe(false)
@@ -615,6 +644,7 @@ function DetailsFrameworkDropDownOptionOnLeave(frame)
end
--@button is the raw button frame, object is the button capsule
--click on the main dropdown frame (not the menu options popup)
function DetailsFrameworkDropDownOnMouseDown(button, buttontype)
local object = button.MyObject
@@ -645,9 +675,9 @@ function DetailsFrameworkDropDownOnMouseDown(button, buttontype)
end
for tindex, thisOption in ipairs(optionsTable) do
local show = isOptionVisible(button, thisOption)
local bIsOptionVisible = isOptionVisible(button, thisOption)
if (show) then
if (bIsOptionVisible) then
local thisOptionFrame = object.menus[i]
showing = showing + 1
@@ -657,14 +687,26 @@ function DetailsFrameworkDropDownOnMouseDown(button, buttontype)
thisOptionFrame = DF:CreateDropdownButton(parent, name)
local optionIndex = i - 1
thisOptionFrame:SetPoint("topleft", parent, "topleft", 1, (-optionIndex*20)-0)
thisOptionFrame:SetPoint("topright", parent, "topright", 0, (-optionIndex*20)-0)
thisOptionFrame:SetPoint("topleft", parent, "topleft", 1, (-optionIndex * 20))
thisOptionFrame:SetPoint("topright", parent, "topright", 0, (-optionIndex * 20))
thisOptionFrame.object = object
object.menus[i] = thisOptionFrame
end
thisOptionFrame:SetFrameStrata(thisOptionFrame:GetParent():GetFrameStrata())
thisOptionFrame:SetFrameLevel(thisOptionFrame:GetParent():GetFrameLevel()+10)
thisOptionFrame:SetFrameLevel(thisOptionFrame:GetParent():GetFrameLevel() + 10)
if (thisOption.rightTexture) then
thisOptionFrame.rightTexture:SetTexture(thisOption.rightTexture)
else
thisOptionFrame.rightTexture:SetTexture("")
end
if (thisOption.centerTexture) then
thisOptionFrame.centerTexture:SetTexture(thisOption.centerTexture)
else
thisOptionFrame.centerTexture:SetTexture("")
end
thisOptionFrame.icon:SetTexture(thisOption.icon)
if (thisOption.icon) then
@@ -742,8 +784,8 @@ function DetailsFrameworkDropDownOnMouseDown(button, buttontype)
thisOptionFrame.table = thisOption
local labelwitdh = thisOptionFrame.label:GetStringWidth()
if (labelwitdh+40 > frameWitdh) then
frameWitdh = labelwitdh+40
if (labelwitdh + 40 > frameWitdh) then
frameWitdh = labelwitdh + 40
end
thisOptionFrame:Show()
@@ -763,7 +805,7 @@ function DetailsFrameworkDropDownOnMouseDown(button, buttontype)
local size = object.realsizeH
if (showing*20 > size) then
if (showing * 20 > size) then
--show scrollbar and setup scroll
object:ShowScroll()
scrollFrame:EnableMouseWheel(true)
@@ -817,6 +859,10 @@ function DetailsFrameworkDropDownOnMouseDown(button, buttontype)
end
object:Open()
--scrollFrame:SetHeight(300)
--scrollChild:SetHeight(300)
--scrollBorder:SetHeight(300)
else
--clear menu
end
@@ -1050,8 +1096,8 @@ function DF:NewDropDown(parent, container, name, member, width, height, func, de
end
dropDownObject.func = func
dropDownObject.realsizeW = 150
dropDownObject.realsizeH = 150
dropDownObject.realsizeW = 165
dropDownObject.realsizeH = 300
dropDownObject.FixedValue = nil
dropDownObject.opened = false
dropDownObject.menus = {}
@@ -1138,6 +1184,16 @@ function DF:CreateNewDropdownFrame(parent, name)
icon:SetVertexColor(1, 1, 1, 0.4)
newDropdownFrame.icon = icon
local rightTexture = newDropdownFrame:CreateTexture("$parent_RightTexture", "OVERLAY")
rightTexture:SetPoint("right", newDropdownFrame, "right", -2, 0)
rightTexture:SetSize(20, 20)
newDropdownFrame.rightTexture = rightTexture
local centerTexture = newDropdownFrame:CreateTexture("$parent_CenterTexture", "OVERLAY")
centerTexture:SetPoint("center", newDropdownFrame, "center", 0, 0)
centerTexture:SetSize(20, 20)
newDropdownFrame.centerTexture = centerTexture
local text = newDropdownFrame:CreateFontString("$parent_Text", "ARTWORK", "GameFontHighlightSmall")
text:SetPoint("left", icon, "right", 5, 0)
text:SetJustifyH("left")
@@ -1168,33 +1224,31 @@ function DF:CreateNewDropdownFrame(parent, name)
local border = CreateFrame("frame", "$Parent_Border", newDropdownFrame, "BackdropTemplate")
border:Hide()
border:SetFrameStrata("FULLSCREEN")
border:SetSize(150, 150)
border:SetSize(150, 300)
border:SetPoint("topleft", newDropdownFrame, "bottomleft", 0, 0)
border:SetBackdrop(borderBackdrop)
border:SetScript("OnHide", DetailsFrameworkDropDownOptionsFrameOnHide)
border:SetBackdropColor(0, 0, 0, 0.92)
border:SetBackdropBorderColor(0, 0, 0, 1)
border:SetBackdropBorderColor(.2, .2, .2, 0.8)
newDropdownFrame.dropdownborder = border
local scroll = CreateFrame("ScrollFrame", "$Parent_ScrollFrame", newDropdownFrame, "BackdropTemplate")
scroll:SetFrameStrata("FULLSCREEN")
scroll:SetSize(150, 150)
scroll:SetSize(150, 300)
scroll:SetPoint("topleft", newDropdownFrame, "bottomleft", 0, 0)
scroll:Hide()
newDropdownFrame.dropdownframe = scroll
local child = CreateFrame("frame", "$Parent_ScrollChild", scroll, "BackdropTemplate")
child:SetSize(150, 150)
--child:SetAllPoints()
child:SetSize(150, 300)
child:SetPoint("topleft", scroll, "topleft", 0, 0)
child:SetBackdrop(childBackdrop)
child:SetBackdropColor(0, 0, 0, 1)
DF:ApplyStandardBackdrop(child)
local backgroundTexture = child:CreateTexture(nil, "background")
backgroundTexture:SetAllPoints()
backgroundTexture:SetColorTexture(0, 0, 0, 1)
DF:ApplyStandardBackdrop(child)
local selected = child:CreateTexture("$parent_SelectedTexture", "BACKGROUND")
selected:SetSize(150, 16)
selected:SetPoint("left", child, "left", 2, 0)
@@ -1243,6 +1297,16 @@ function DF:CreateDropdownButton(parent, name)
rightButton:SetPoint("right", newButton, "right", -2, 0)
rightButton:Hide()
local rightTexture = newButton:CreateTexture("$parent_RightTexture", "OVERLAY")
rightTexture:SetPoint("right", newButton, "right", -2, 0)
rightTexture:SetSize(20, 20)
newButton.rightTexture = rightTexture
local centerTexture = newButton:CreateTexture("$parent_CenterTexture", "OVERLAY")
centerTexture:SetPoint("center", newButton, "center", 0, 0)
centerTexture:SetSize(20, 20)
newButton.centerTexture = centerTexture
newButton:SetScript("OnMouseDown", DetailsFrameworkDropDownOptionClick)
newButton:SetScript("OnEnter", DetailsFrameworkDropDownOptionOnEnter)
newButton:SetScript("OnLeave", DetailsFrameworkDropDownOptionOnLeave)
+9 -3
View File
@@ -1,6 +1,6 @@
local dversion = 387
local dversion = 393
local major, minor = "DetailsFramework-1.0", dversion
local DF, oldminor = LibStub:NewLibrary(major, minor)
@@ -694,7 +694,7 @@ function DF:GroupIterator(callback, ...)
end
end
function DF:IntegerToTimer(value)
function DF:IntegerToTimer(value) --~formattime
return "" .. floor(value/60) .. ":" .. format("%02.f", value%60)
end
@@ -3372,7 +3372,12 @@ end
--this is most copied from the wow client code, few changes applied to customize it
function DF:CreateGlowOverlay (parent, antsColor, glowColor)
local glowFrame = CreateFrame("frame", parent:GetName() and "$parentGlow2" or "OverlayActionGlow" .. math.random(1, 10000000), parent, "ActionBarButtonSpellActivationAlert")
local pName = parent:GetName()
local fName = pName and (pName.."Glow2") or "OverlayActionGlow" .. math.random(1, 10000000)
if fName and string.len(fName) > 50 then -- shorten to work around too long names
fName = strsub(fName, string.len(fName)-49)
end
local glowFrame = CreateFrame("frame", fName, parent, "ActionBarButtonSpellActivationAlert")
glowFrame:HookScript ("OnShow", glow_overlay_onshow)
glowFrame:HookScript ("OnHide", glow_overlay_onhide)
@@ -4827,6 +4832,7 @@ end
["getglobal"] = true,
["setmetatable"] = true,
["DevTools_DumpCommand"] = true,
["ChatEdit_SendText"] = true,
--avoid creating macros
["SetBindingMacro"] = true,
+93 -48
View File
@@ -1971,48 +1971,64 @@ function detailsFramework:CreateScaleBar(frame, config) --~scale
end
local no_options = {}
function detailsFramework:CreateSimplePanel(parent, w, h, title, name, panel_options, db)
if (db and name and not db [name]) then
db [name] = {scale = 1}
--[=[
options available to panel_options:
NoScripts = false, --if true, won't set OnMouseDown and OnMouseUp (won't be movable)
NoTUISpecialFrame = false, --if true, won't add the frame to 'UISpecialFrames'
DontRightClickClose = false, --if true, won't make the frame close when clicked with the right mouse button
UseScaleBar = false, --if true, will create a scale bar in the top left corner (require a table on 'db' to save the scale)
UseStatusBar = false, --if true, creates a status bar at the bottom of the frame (frame.StatusBar)
NoCloseButton = false, --if true, won't show the close button
NoTitleBar = false, --if true, don't create the title bar
]=]
function detailsFramework:CreateSimplePanel(parent, width, height, title, frameName, panelOptions, savedVariableTable)
if (savedVariableTable and frameName and not savedVariableTable[frameName]) then
savedVariableTable[frameName] = {
scale = 1
}
end
if (not name) then
name = "DetailsFrameworkSimplePanel" .. detailsFramework.SimplePanelCounter
if (not frameName) then
frameName = "DetailsFrameworkSimplePanel" .. detailsFramework.SimplePanelCounter
detailsFramework.SimplePanelCounter = detailsFramework.SimplePanelCounter + 1
end
if (not parent) then
parent = UIParent
end
panel_options = panel_options or no_options
panelOptions = panelOptions or no_options
local f = CreateFrame("frame", name, UIParent,"BackdropTemplate")
f:SetSize(w or 400, h or 250)
f:SetPoint("center", UIParent, "center", 0, 0)
f:SetFrameStrata("FULLSCREEN")
f:EnableMouse()
f:SetMovable(true)
f:SetBackdrop(SimplePanel_frame_backdrop)
f:SetBackdropColor(unpack(SimplePanel_frame_backdrop_color))
f:SetBackdropBorderColor(unpack(SimplePanel_frame_backdrop_border_color))
local simplePanel = CreateFrame("frame", frameName, UIParent,"BackdropTemplate")
simplePanel:SetSize(width or 400, height or 250)
simplePanel:SetPoint("center", UIParent, "center", 0, 0)
simplePanel:SetFrameStrata("FULLSCREEN")
simplePanel:EnableMouse()
simplePanel:SetMovable(true)
simplePanel:SetBackdrop(SimplePanel_frame_backdrop)
simplePanel:SetBackdropColor(unpack(SimplePanel_frame_backdrop_color))
simplePanel:SetBackdropBorderColor(unpack(SimplePanel_frame_backdrop_border_color))
f.DontRightClickClose = panel_options.DontRightClickClose
simplePanel.DontRightClickClose = panelOptions.DontRightClickClose
if (not panel_options.NoTUISpecialFrame) then
tinsert(UISpecialFrames, name)
if (not panelOptions.NoTUISpecialFrame) then
tinsert(UISpecialFrames, frameName)
end
local title_bar = CreateFrame("frame", name .. "TitleBar", f,"BackdropTemplate")
title_bar:SetPoint("topleft", f, "topleft", 2, -3)
title_bar:SetPoint("topright", f, "topright", -2, -3)
title_bar:SetHeight(20)
title_bar:SetBackdrop(SimplePanel_frame_backdrop)
title_bar:SetBackdropColor(.2, .2, .2, 1)
title_bar:SetBackdropBorderColor(0, 0, 0, 1)
f.TitleBar = title_bar
if (panelOptions.UseStatusBar) then
local statusBar = detailsFramework:CreateStatusBar(simplePanel)
simplePanel.StatusBar = statusBar
end
local close = CreateFrame("button", name and name .. "CloseButton", title_bar)
local titleBar = CreateFrame("frame", frameName .. "TitleBar", simplePanel,"BackdropTemplate")
titleBar:SetPoint("topleft", simplePanel, "topleft", 2, -3)
titleBar:SetPoint("topright", simplePanel, "topright", -2, -3)
titleBar:SetHeight(20)
titleBar:SetBackdrop(SimplePanel_frame_backdrop)
titleBar:SetBackdropColor(.2, .2, .2, 1)
titleBar:SetBackdropBorderColor(0, 0, 0, 1)
simplePanel.TitleBar = titleBar
local close = CreateFrame("button", frameName and frameName .. "CloseButton", titleBar)
close:SetFrameLevel(detailsFramework.FRAMELEVEL_OVERLAY)
close:SetSize(16, 16)
@@ -2025,31 +2041,37 @@ function detailsFramework:CreateSimplePanel(parent, w, h, title, name, panel_opt
close:SetAlpha(0.7)
close:SetScript("OnClick", simple_panel_close_click)
f.Close = close
simplePanel.Close = close
local title_string = title_bar:CreateFontString(name and name .. "Title", "overlay", "GameFontNormal")
title_string:SetTextColor(.8, .8, .8, 1)
title_string:SetText(title or "")
f.Title = title_string
local titleText = titleBar:CreateFontString(frameName and frameName .. "Title", "overlay", "GameFontNormal")
titleText:SetTextColor(.8, .8, .8, 1)
titleText:SetText(title or "")
simplePanel.Title = titleText
if (panel_options.UseScaleBar and db [name]) then
detailsFramework:CreateScaleBar (f, db [name])
f:SetScale(db [name].scale)
if (panelOptions.UseScaleBar and savedVariableTable [frameName]) then
detailsFramework:CreateScaleBar (simplePanel, savedVariableTable [frameName])
simplePanel:SetScale(savedVariableTable [frameName].scale)
end
f.Title:SetPoint("center", title_bar, "center")
f.Close:SetPoint("right", title_bar, "right", -2, 0)
simplePanel.Title:SetPoint("center", titleBar, "center")
simplePanel.Close:SetPoint("right", titleBar, "right", -2, 0)
if (panel_options.NoCloseButton) then
f.Close:Hide()
if (panelOptions.NoCloseButton) then
simplePanel.Close:Hide()
end
f:SetScript("OnMouseDown", simple_panel_mouse_down)
f:SetScript("OnMouseUp", simple_panel_mouse_up)
if (panelOptions.NoTitleBar) then
simplePanel.TitleBar:Hide()
end
f.SetTitle = simple_panel_settitle
if (not panelOptions.NoScripts) then
simplePanel:SetScript("OnMouseDown", simple_panel_mouse_down)
simplePanel:SetScript("OnMouseUp", simple_panel_mouse_up)
end
return f
simplePanel.SetTitle = simple_panel_settitle
return simplePanel
end
local Panel1PxBackdrop = {bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 64,
@@ -7622,6 +7644,9 @@ detailsFramework.CastFrameFunctions = {
CanLazyTick = true, --if true, it'll execute the lazy tick function, it ticks in a much slower pace comparece with the regular tick
LazyUpdateCooldown = 0.2, --amount of time to wait for the next lazy update, this updates non critical things like the cast timer
FillOnInterrupt = true,
HideSparkOnInterrupt = true,
--default size
Width = 100,
Height = 20,
@@ -8268,12 +8293,26 @@ detailsFramework.CastFrameFunctions = {
UNIT_SPELLCAST_STOP = function(self, unit, ...)
local unitID, castID, spellID = ...
if (self.castID == castID) then
self.Spark:Hide()
if (self.interrupted) then
if (self.Settings.HideSparkOnInterrupt) then
self.Spark:Hide()
end
else
self.Spark:Hide()
end
self.percentText:Hide()
local value = self:GetValue()
local _, maxValue = self:GetMinMaxValues()
self:SetValue(self.maxValue or maxValue or 1)
if (self.interrupted) then
if (self.Settings.FillOnInterrupt) then
self:SetValue(self.maxValue or maxValue or 1)
end
else
self:SetValue(self.maxValue or maxValue or 1)
end
self.casting = nil
self.finished = true
@@ -8357,12 +8396,18 @@ detailsFramework.CastFrameFunctions = {
self.channeling = nil
self.interrupted = true
self.finished = true
self:SetValue(self.maxValue or select(2, self:GetMinMaxValues()) or 1)
if (self.Settings.FillOnInterrupt) then
self:SetValue(self.maxValue or select(2, self:GetMinMaxValues()) or 1)
end
if (self.Settings.HideSparkOnInterrupt) then
self.Spark:Hide()
end
local castColor = self:GetCastColor()
self:SetColor (castColor) --SetColor handles with ParseColors()
self.Spark:Hide()
self.percentText:Hide()
self.Text:SetText(INTERRUPTED) --auto locale within the global namespace
+129 -28
View File
@@ -19,6 +19,10 @@ local CONST_COOLDOWN_TYPE_DEFENSIVE_RAID = 4
local CONST_COOLDOWN_TYPE_UTILITY = 5
local CONST_COOLDOWN_TYPE_INTERRUPT = 6
--hold spellIds and which custom caches the spell is in
--map[spellId] = map[filterName] = true
local spellsWithCustomFiltersCache = {}
--simple non recursive table copy
function openRaidLib.TCopy(tableToReceive, tableToCopy)
if (not tableToCopy) then
@@ -137,8 +141,9 @@ function openRaidLib.GetUnitID(playerName)
return openRaidLib.UnitIDCache[playerName] or playerName
end
local filterStringToCooldownType = { --report: "filterStringToCooldownType doesn't include the new filters."
--report: "filterStringToCooldownType doesn't include the new filters."
--answer: custom filter does not have a cooldown type, it is a mesh of spells
local filterStringToCooldownType = {
["defensive-raid"] = CONST_COOLDOWN_TYPE_DEFENSIVE_RAID,
["defensive-target"] = CONST_COOLDOWN_TYPE_DEFENSIVE_TARGET,
["defensive-personal"] = CONST_COOLDOWN_TYPE_DEFENSIVE_PERSONAL,
@@ -147,34 +152,116 @@ local filterStringToCooldownType = { --report: "filterStringToCooldownType doesn
["interrupt"] = CONST_COOLDOWN_TYPE_INTERRUPT,
}
function openRaidLib.CooldownManager.DoesSpellPassFilters(spellId, filters)
local allCooldownsData = LIB_OPEN_RAID_COOLDOWNS_INFO
local cooldownData = allCooldownsData[spellId]
if (cooldownData) then
for filter in filters:gmatch("([^,%s]+)") do
local cooldownType = filterStringToCooldownType[filter]
if (cooldownData.type == cooldownType) then
return true
elseif (cooldownData[filter]) then --custom filter
return true
end
end
else
return false
local filterStringToCooldownTypeReverse = {
[CONST_COOLDOWN_TYPE_DEFENSIVE_RAID] = "defensive-raid",
[CONST_COOLDOWN_TYPE_DEFENSIVE_TARGET] = "defensive-target",
[CONST_COOLDOWN_TYPE_DEFENSIVE_PERSONAL] = "defensive-personal",
[CONST_COOLDOWN_TYPE_OFFENSIVE] = "ofensive",
[CONST_COOLDOWN_TYPE_UTILITY] = "utility",
[CONST_COOLDOWN_TYPE_INTERRUPT] = "interrupt",
}
local removeSpellFromCustomFilterCache = function(spellId, filterName)
local spellFilterCache = spellsWithCustomFiltersCache[spellId]
if (spellFilterCache) then
spellFilterCache[filterName] = nil
end
end
local addSpellToCustomFilterCache = function(spellId, filterName)
local spellFilterCache = spellsWithCustomFiltersCache[spellId]
if (not spellFilterCache) then
spellFilterCache = {}
spellsWithCustomFiltersCache[spellId] = spellFilterCache
end
spellFilterCache[filterName] = true
end
local getSpellCustomFiltersFromCache = function(spellId)
local spellFilterCache = spellsWithCustomFiltersCache[spellId]
local result = {}
if (spellFilterCache) then
for filterName in pairs(spellFilterCache) do
result[filterName] = true
end
end
return result
end
--LIB_OPEN_RAID_COOLDOWNS_INFO store all registered cooldowns in the file ThingsToMantain_<game version>
function openRaidLib.CooldownManager.GetAllRegisteredCooldowns()
return LIB_OPEN_RAID_COOLDOWNS_INFO
end
function openRaidLib.CooldownManager.GetCooldownInfo(spellId)
return openRaidLib.CooldownManager.GetAllRegisteredCooldowns()[spellId]
end
--return a map of filter names which the spell is in, map: {[filterName] = true}
--API Call documented in the docs.txt as openRaidLib.GetSpellFilters() the declaration is on the main file of the lib
function openRaidLib.CooldownManager.GetSpellFilters(spellId, defaultFilterOnly, customFiltersOnly)
local result = {}
if (not customFiltersOnly) then
local thisCooldownInfo = openRaidLib.CooldownManager.GetCooldownInfo(spellId)
local cooldownTypeFilter = filterStringToCooldownTypeReverse[thisCooldownInfo.type]
if (cooldownTypeFilter) then
result[cooldownTypeFilter] = true
end
end
if (defaultFilterOnly) then
return result
end
local customFilters = getSpellCustomFiltersFromCache(spellId)
for filterName in pairs(customFilters) do
result[filterName] = true
end
return result
end
function openRaidLib.CooldownManager.DoesSpellPassFilters(spellId, filters)
--table with information about a single cooldown
local thisCooldownInfo = openRaidLib.CooldownManager.GetCooldownInfo(spellId)
--check if this spell is registered as a cooldown
if (thisCooldownInfo) then
for filter in filters:gmatch("([^,%s]+)") do
--filterStringToCooldownType is a map where the key is the filter name and value is the cooldown type
local cooldownType = filterStringToCooldownType[filter]
--cooldown type is a number from 1 to 8 telling its type
if (cooldownType == thisCooldownInfo.type) then
return true
--check for custom filter, the custom filter name is set as a key in the cooldownInfo: cooldownInfo[filterName] = true
elseif (thisCooldownInfo[filter]) then
return true
end
end
end
return false
end
local getCooldownsForFilter = function(unitName, allCooldowns, unitDataFilteredCache, filter)
local allCooldownsData = LIB_OPEN_RAID_COOLDOWNS_INFO
local allCooldownsData = openRaidLib.CooldownManager.GetAllRegisteredCooldowns()
local filterTable = unitDataFilteredCache[filter]
--if the unit already sent its full list of cooldowns, the cache can be built
--when NeedRebuildFilters is true, HasFullCooldownList is always true
--bug: filterTable is nil and HasFullCooldownList is also nil, happening after leaving a grou´p internal callback
if ((not filterTable and openRaidLib.CooldownManager.HasFullCooldownList[unitName]) or openRaidLib.CooldownManager.NeedRebuildFilters[unitName]) then
--bug: filterTable is nil and HasFullCooldownList is also nil, happening after leaving a group internal callback
--November 06, 2022 note: is this bug still happening?
local doesNotHaveFilterYet = not filterTable and openRaidLib.CooldownManager.HasFullCooldownList[unitName]
local isDirty = openRaidLib.CooldownManager.NeedRebuildFilters[unitName]
if (doesNotHaveFilterYet or isDirty) then
--reset the filterTable
filterTable = {}
unitDataFilteredCache[filter] = filterTable
--
for spellId, cooldownInfo in pairs(allCooldowns) do
local cooldownData = allCooldownsData[spellId]
if (cooldownData) then
@@ -190,27 +277,41 @@ local getCooldownsForFilter = function(unitName, allCooldowns, unitDataFilteredC
return filterTable
end
--API Call
--@filterName: a string representing a name of the filter
--@spells: an array of spellIds
--important: a spell can be part of any amount of custom filters,
--declaring a spell on a new filter does NOT remove it from other filters where it was previously added
function openRaidLib.AddCooldownFilter(filterName, spells)
--integrity check
if (type(filterName) ~= "string") then
openRaidLib.DiagnosticError("Usage: openRaidLib.AddFilter(string: filterName, table: spells)", debugstack())
return false
end
if (type(spells) ~= "table") then
elseif (type(spells) ~= "table") then
openRaidLib.DiagnosticError("Usage: openRaidLib.AddFilter(string: filterName, table: spells)", debugstack())
return false
end
--clear previous filter spell table of the same name
for spellId, cooldownData in pairs(LIB_OPEN_RAID_COOLDOWNS_INFO) do
local allCooldownsData = openRaidLib.CooldownManager.GetAllRegisteredCooldowns()
--iterate among the all cooldowns table and erase the filterName from all spells
for spellId, cooldownData in pairs(allCooldownsData) do
cooldownData[filterName] = nil
removeSpellFromCustomFilterCache(spellId, filterName)
end
local allCooldownsData = LIB_OPEN_RAID_COOLDOWNS_INFO
--iterate among spells passed within the spells table and set the new filter on them
--problem: the filter is set directly into the global cooldown table
--this could in rare cases make an addon to override settings of another addon
for spellIndex, spellId in ipairs(spells) do
local cooldownData = allCooldownsData[spellId]
cooldownData[filterName] = true
if (cooldownData) then
cooldownData[filterName] = true
addSpellToCustomFilterCache(spellId, filterName)
else
openRaidLib.DiagnosticError("A spellId on your spell list for openRaidLib.AddFilter isn't registered as cooldown:", spellId, debugstack())
end
end
--tag all cache filters as dirt
@@ -222,8 +323,9 @@ function openRaidLib.AddCooldownFilter(filterName, spells)
return true
end
--@allCooldowns: all cooldowns sent by an unit, {[spellId] = cooldownInfo}
--@filters: string with filters, "defensive-raid, "defensive-personal"
--API Call
--@allCooldowns: all cooldowns sent by a unit, map{[spellId] = cooldownInfo}
--@filters: string with filter names: array{"defensive-raid, "defensive-personal"}
function openRaidLib.FilterCooldowns(unitName, allCooldowns, filters)
local allDataFiltered = openRaidLib.CooldownManager.UnitDataFilterCache --["unitName"] = {defensive-raid = {[spellId = cooldownInfo]}}
local unitDataFilteredCache = allDataFiltered[unitName]
@@ -238,7 +340,6 @@ function openRaidLib.FilterCooldowns(unitName, allCooldowns, filters)
return filterAlreadyInCache
end
local allCooldownsData = LIB_OPEN_RAID_COOLDOWNS_INFO
local resultFilters = {}
--break the string into pieces and filter cooldowns
+74 -10
View File
@@ -18,6 +18,7 @@ local CONST_TALENT_VERSION_DRAGONFLIGHT = 5
local CONST_BTALENT_VERSION_COVENANTS = 9
local CONST_SPELLBOOK_CLASSSPELLS_TABID = 2
local CONST_SPELLBOOK_GENERAL_TABID = 1
local isTimewalkWoW = function()
local _, _, _, buildInfo = GetBuildInfo()
@@ -418,6 +419,23 @@ local getSpellListAsHashTableFromSpellBook = function()
--this line might not be compatible with classic
local specId, specName, _, specIconTexture = GetSpecializationInfo(GetSpecialization())
local classNameLoc, className, classId = UnitClass("player")
local locPlayerRace, playerRace, playerRaceId = UnitRace("player")
--get racials from the general tab
local tabName, tabTexture, offset, numSpells, isGuild, offspecId = GetSpellTabInfo(CONST_SPELLBOOK_GENERAL_TABID)
offset = offset + 1
local tabEnd = offset + numSpells
for entryOffset = offset, tabEnd - 1 do
local spellType, spellId = GetSpellBookItemInfo(entryOffset, "player")
if (spellId and LIB_OPEN_RAID_COOLDOWNS_INFO[spellId] and LIB_OPEN_RAID_COOLDOWNS_INFO[spellId].raceid == playerRaceId) then
spellId = C_SpellBook.GetOverrideSpell(spellId)
local spellName = GetSpellInfo(spellId)
local isPassive = IsPassiveSpell(entryOffset, "player")
if (spellName and not isPassive) then
completeListOfSpells[spellId] = true
end
end
end
--get spells from the Spec spellbook
for i = 1, GetNumSpellTabs() do
@@ -464,13 +482,13 @@ end
local updateCooldownAvailableList = function()
table.wipe(LIB_OPEN_RAID_PLAYERCOOLDOWNS)
local _, playerClass = UnitClass("player")
local locPlayerRace, playerRace, playerRaceId = UnitRace("player")
local spellBookSpellList = getSpellListAsHashTableFromSpellBook()
--build a list of all spells assigned as cooldowns for the player class
for spellID, spellData in pairs(LIB_OPEN_RAID_COOLDOWNS_INFO) do
if (spellData.class == playerClass) then
if (spellData.class == playerClass or spellData.raceid == playerRaceId) then --need to implement here to get the racial as racial cooldowns does not carry a class
if (spellBookSpellList[spellID]) then
LIB_OPEN_RAID_PLAYERCOOLDOWNS[spellID] = spellData
end
@@ -538,32 +556,78 @@ function openRaidLib.CooldownManager.GetPlayerCooldownList()
return {}
end
--aura frame handles only UNIT_AURA events to grab the duration of the buff placed by the aura
local IS_NEW_UNIT_AURA_AVAILABLE = C_UnitAuras and C_UnitAuras.GetAuraDataBySlot and true
local auraSpellID
local foundAuraDuration
local handleBuffAura = function(aura)
local auraInfo = C_UnitAuras.GetAuraDataByAuraInstanceID("player", aura.auraInstanceID)
if (auraInfo) then
local spellId = auraInfo.spellId
if (auraSpellID == spellId) then
auraSpellID = nil
foundAuraDuration = auraInfo.duration
return true
end
end
end
local getAuraDuration = function(spellId)
--some auras does not have the same spellId of the cast as the spell for its aura duration
--in these cases, it's necessary to declare the buff spellId which tells the duration of the effect by adding 'durationSpellId = spellId' within the cooldown data
local customBuffDuration = LIB_OPEN_RAID_PLAYERCOOLDOWNS[spellId].durationSpellId
--spellId = customBuffDuration or spellId --can't replace the spellId by customBuffDurationSpellId has it wount be found in LIB_OPEN_RAID_PLAYERCOOLDOWNS
if (IS_NEW_UNIT_AURA_AVAILABLE) then
local batchCount = nil
local usePackedAura = true
auraSpellID = customBuffDuration or spellId
foundAuraDuration = 0 --reset duration
AuraUtil.ForEachAura("player", "HELPFUL", batchCount, handleBuffAura, usePackedAura) --check auras to find a buff for the spellId
if (foundAuraDuration == 0) then --if the buff wasn't found, attempt to get the duration from the file
local spellName = GetSpellInfo(spellId)
return LIB_OPEN_RAID_PLAYERCOOLDOWNS[spellId].duration or 0
end
return foundAuraDuration
else
end
end
function openRaidLib.CooldownManager.GetSpellBuffDuration(spellId)
return getAuraDuration(spellId)
end
--check if a player cooldown is ready or if is in cooldown
--@spellId: the spellId to check for cooldown
--return timeLeft, charges, startTimeOffset, duration, buffDuration
function openRaidLib.CooldownManager.GetPlayerCooldownStatus(spellId)
--check if is a charge spell
local cooldownInfo = LIB_OPEN_RAID_COOLDOWNS_INFO[spellId]
if (cooldownInfo) then
if (cooldownInfo.charges and cooldownInfo.charges > 1) then
local chargesAvailable, chargesTotal, start, duration = GetSpellCharges(spellId)
local buffDuration = getAuraDuration(spellId)
local chargesAvailable, chargesTotal, start, duration = GetSpellCharges(spellId)
if chargesAvailable then
if (chargesAvailable == chargesTotal) then
return 0, chargesTotal, 0, 0 --all charges are ready to use
return 0, chargesTotal, 0, 0, 0 --all charges are ready to use
else
--return the time to the next charge
local timeLeft = start + duration - GetTime()
local startTimeOffset = start - GetTime()
return ceil(timeLeft), chargesAvailable, startTimeOffset, duration --time left, charges, startTime
return ceil(timeLeft), chargesAvailable, startTimeOffset, duration, buffDuration --time left, charges, startTime, duration, buffDuration
end
else
local start, duration = GetSpellCooldown(spellId)
if (start == 0) then --cooldown is ready
return 0, 1, 0, 0 --time left, charges, startTime
return 0, 1, 0, 0, 0 --time left, charges, startTime
else
local timeLeft = start + duration - GetTime()
local startTimeOffset = start - GetTime()
return ceil(timeLeft), 0, ceil(startTimeOffset), duration --time left, charges, startTime, duration
return ceil(timeLeft), 0, ceil(startTimeOffset), duration, buffDuration --time left, charges, startTime, duration, buffDuration
end
end
else
+85 -73
View File
@@ -14,7 +14,18 @@ Code Rules:
- Internal callbacks are the internal communication of the library, e.g. when an event triggers it send to all modules that registered that event.
- Public callbacks are callbacks registered by an external addon.
Change Log:
Change Log (most recent on 2022 Nov 18):
- added racials with cooldown type 9
- added buff duration in the index 6 of the cooldownInfo table returned on any cooldown event
- added 'durationSpellId' for cooldowns where the duration effect is another spell other than the casted cooldown spellId, add this member on cooldown table at LIB_OPEN_RAID_COOLDOWNS_INFO
------- Nov 07 and older
- added:
* added openRaidLib.GetSpellFilters(spellId, defaultFilterOnly, customFiltersOnly) (see docs)
- passing a spellId of a non registered cooldown on LIB_OPEN_RAID_COOLDOWNS_INFO will trigger a diagnostic error if diagnostic errors are enabled.
- player cast doesn't check anymore for cooldowns in the player spec, now it check towards the cache LIB_OPEN_RAID_PLAYERCOOLDOWNS.
LIB_OPEN_RAID_PLAYERCOOLDOWNS is a cache built with cooldowns present in the player spellbook.
- things to maintain now has 1 file per expansion
- player conduits, covenant internally renamed to playerInfo1 and playerInfo2 to make the lib more future proof
- player conduits tree is now Borrowed Talents Tree, for future proof
@@ -25,29 +36,14 @@ Change Log:
* openRaidLib.GetFlaskTierFromAura(auraInfo)
* openRaidLib.GetFoodInfoBySpellId(spellId)
* openRaidLib.GetFoodTierFromAura(auraInfo)
- added dragonflight talents support
* added dragonflight talents support
* added openRaidLib.RequestCooldownInfo(spellId)
* added openRaidLib.AddCooldownFilter(filterName, spells)
- ensure to register events after 'PLAYER_ENTERING_WORLD' has triggered
- added openRaidLib.RequestCooldownInfo(spellId)
- added openRaidLib.AddCooldownFilter(filterName, spells)
- if Ace Comm is installed, use it
- added "KeystoneWipe" callback
- finished keystone info, see docs
- added interrupts to cooldown tracker, new filter: "interrupt"
- after encounter_end cooldowns now check for cooldowns reset.
- each module now controls what to do with regen_enabled.
- filter cooldowns done.
- move portions of the code to other files to make this one smaller.
- major function and variables rename.
- implemented pvp talents.
- player information is always available even when not in a group.
- added cooldown check to se which cooldown has removed or added into the list.
- added two new callbacks: "CooldownAdded" and "CooldownRemoved", see documents.
TODO:
- make talents changes also send only cooldowns added or changed
- add into gear info how many tier set parts the player has
- raid lockouts normal-heroic-mythic
- soulbind character (covenant choise) - probably not used in 10.0
BUGS:
- after a /reload, it is not starting new tickers for spells under cooldown
@@ -68,7 +64,7 @@ if (WOW_PROJECT_ID ~= WOW_PROJECT_MAINLINE and not isExpansion_Dragonflight()) t
end
local major = "LibOpenRaid-1.0"
local CONST_LIB_VERSION = 69
local CONST_LIB_VERSION = 72
LIB_OPEN_RAID_CAN_LOAD = false
local unpack = table.unpack or _G.unpack
@@ -133,6 +129,7 @@ local unpack = table.unpack or _G.unpack
local CONST_COOLDOWN_INDEX_TIMEOFFSET = 3
local CONST_COOLDOWN_INDEX_DURATION = 4
local CONST_COOLDOWN_INDEX_UPDATETIME = 5
local CONST_COOLDOWN_INDEX_AURA_DURATION = 6
local GetContainerNumSlots = GetContainerNumSlots or C_Container.GetContainerNumSlots
local GetContainerItemID = GetContainerItemID or C_Container.GetContainerItemID
@@ -1632,14 +1629,14 @@ local cooldownTimeLeftCheck_Ticker = function(tickerObject)
end
tickerObject.cooldownTimeLeft = tickerObject.cooldownTimeLeft - CONST_COOLDOWN_CHECK_INTERVAL
local timeLeft, charges, startTimeOffset, duration = openRaidLib.CooldownManager.GetPlayerCooldownStatus(spellId)
local timeLeft, charges, startTimeOffset, duration, auraDuration = openRaidLib.CooldownManager.GetPlayerCooldownStatus(spellId)
local bUpdateLocally = false
--is the spell ready to use?
if (timeLeft == 0) then
--it's ready
openRaidLib.CooldownManager.SendPlayerCooldownUpdate(spellId, 0, charges, 0, 0)
openRaidLib.CooldownManager.SendPlayerCooldownUpdate(spellId, 0, charges, 0, 0, 0)
openRaidLib.CooldownManager.CooldownTickers[spellId] = nil
tickerObject:Cancel()
bUpdateLocally = true
@@ -1647,7 +1644,7 @@ local cooldownTimeLeftCheck_Ticker = function(tickerObject)
--check if the time left has changed, this check if the cooldown got its time reduced and if the cooldown time has been slow down by modRate
if (not openRaidLib.isNearlyEqual(tickerObject.cooldownTimeLeft, timeLeft, CONST_COOLDOWN_TIMELEFT_HAS_CHANGED)) then
--there's a deviation, send a comm to communicate the change in the time left
openRaidLib.CooldownManager.SendPlayerCooldownUpdate(spellId, timeLeft, charges, startTimeOffset, duration)
openRaidLib.CooldownManager.SendPlayerCooldownUpdate(spellId, timeLeft, charges, startTimeOffset, duration, auraDuration)
tickerObject.cooldownTimeLeft = timeLeft
bUpdateLocally = true
end
@@ -1655,9 +1652,9 @@ local cooldownTimeLeftCheck_Ticker = function(tickerObject)
if (bUpdateLocally) then
--get the cooldown time for this spell
local timeLeft, charges, startTimeOffset, duration = openRaidLib.CooldownManager.GetPlayerCooldownStatus(spellId)
local timeLeft, charges, startTimeOffset, duration, auraDuration = openRaidLib.CooldownManager.GetPlayerCooldownStatus(spellId) --return 5 values
--update the cooldown
openRaidLib.CooldownManager.CooldownSpellUpdate(playerName, spellId, timeLeft, charges, startTimeOffset, duration)
openRaidLib.CooldownManager.CooldownSpellUpdate(playerName, spellId, timeLeft, charges, startTimeOffset, duration, auraDuration) --need 7 values
local playerCooldownTable = openRaidLib.GetUnitCooldowns(playerName)
local cooldownInfo = openRaidLib.GetUnitCooldownInfo(playerName, spellId)
@@ -1696,7 +1693,7 @@ end
function openRaidLib.CooldownManager.CleanupCooldownTickers()
for spellId, tickerObject in pairs(openRaidLib.CooldownManager.CooldownTickers) do
local timeLeft, charges, startTimeOffset, duration = openRaidLib.CooldownManager.GetPlayerCooldownStatus(spellId)
local timeLeft, charges, startTimeOffset, duration, auraDuration = openRaidLib.CooldownManager.GetPlayerCooldownStatus(spellId)
if (timeLeft == 0) then
tickerObject:Cancel()
openRaidLib.CooldownManager.CooldownTickers[spellId] = nil
@@ -1722,22 +1719,26 @@ end
local cooldownGetSpellInfo = function(unitName, spellId)
local unitCooldownTable = cooldownGetUnitTable(unitName)
local spellIdTable = unitCooldownTable[spellId]
return spellIdTable
local cooldownInfo = unitCooldownTable[spellId]
return cooldownInfo
end
--update a single cooldown timer
--called when the player casted a cooldown and when received a cooldown update from another player
--only update the db, no other action is taken
function openRaidLib.CooldownManager.CooldownSpellUpdate(unitName, spellId, newTimeLeft, newCharges, startTimeOffset, duration)
--cooldownInfo: [1] timeLeft [2] charges [3] startOffset [4] duration [5] updateTime [6] auraDuration
function openRaidLib.CooldownManager.CooldownSpellUpdate(unitName, spellId, newTimeLeft, newCharges, startTimeOffset, duration, auraDuration)
--get the cooldown table where all cooldowns are stored for this unit
local unitCooldownTable = cooldownGetUnitTable(unitName)
local spellIdTable = unitCooldownTable[spellId] or {}
spellIdTable[CONST_COOLDOWN_INDEX_TIMELEFT] = newTimeLeft
spellIdTable[CONST_COOLDOWN_INDEX_CHARGES] = newCharges
spellIdTable[CONST_COOLDOWN_INDEX_TIMEOFFSET] = startTimeOffset
spellIdTable[CONST_COOLDOWN_INDEX_DURATION] = duration
spellIdTable[CONST_COOLDOWN_INDEX_UPDATETIME] = GetTime()
unitCooldownTable[spellId] = spellIdTable
--is this a cooldown info?
local cooldownInfo = unitCooldownTable[spellId] or {}
cooldownInfo[CONST_COOLDOWN_INDEX_TIMELEFT] = newTimeLeft
cooldownInfo[CONST_COOLDOWN_INDEX_CHARGES] = newCharges
cooldownInfo[CONST_COOLDOWN_INDEX_TIMEOFFSET] = startTimeOffset
cooldownInfo[CONST_COOLDOWN_INDEX_DURATION] = duration
cooldownInfo[CONST_COOLDOWN_INDEX_UPDATETIME] = GetTime()
cooldownInfo[CONST_COOLDOWN_INDEX_AURA_DURATION] = auraDuration
unitCooldownTable[spellId] = cooldownInfo
end
--API Calls
@@ -1774,6 +1775,10 @@ end
return openRaidLib.CooldownManager.DoesSpellPassFilters(spellId, filter)
end
function openRaidLib.GetSpellFilters(spellId, defaultFilterOnly, customFiltersOnly)
return openRaidLib.CooldownManager.GetSpellFilters(spellId, defaultFilterOnly, customFiltersOnly)
end
--return values about the cooldown time
--values returned: timeLeft, charges, timeOffset, duration, updateTime
function openRaidLib.GetCooldownTimeFromUnitSpellID(unitId, spellId)
@@ -1781,7 +1786,7 @@ end
if (unitCooldownsTable) then
local cooldownInfo = unitCooldownsTable[spellId]
if (cooldownInfo) then
return unpack(cooldownInfo)
return openRaidLib.CooldownManager.GetCooldownInfoValues(cooldownInfo)
end
end
end
@@ -1790,7 +1795,7 @@ end
--values returned: timeLeft, charges, timeOffset, duration, updateTime
function openRaidLib.GetCooldownTimeFromCooldownInfo(cooldownInfo)
if (cooldownInfo) then
return unpack(cooldownInfo)
return openRaidLib.CooldownManager.GetCooldownInfoValues(cooldownInfo)
end
end
@@ -1833,12 +1838,12 @@ end
--values returned: isReady, timeLeft, charges, normalized percent, minValue, maxValue, currentValue
--values are in the GetTime() format
function openRaidLib.GetCooldownStatusFromUnitSpellID(unitId, spellId)
local timeLeft, charges, timeOffset, duration, updateTime
local timeLeft, charges, timeOffset, duration, updateTime, auraDuration
local unitCooldownsTable = openRaidLib.GetUnitCooldowns(unitId)
if (unitCooldownsTable) then
local cooldownInfo = unitCooldownsTable[spellId]
if (cooldownInfo) then
timeLeft, charges, timeOffset, duration, updateTime = unpack(cooldownInfo)
timeLeft, charges, timeOffset, duration, updateTime, auraDuration = openRaidLib.CooldownManager.GetCooldownInfoValues(cooldownInfo)
end
end
@@ -1851,39 +1856,40 @@ end
--values are in the GetTime() format
--GetPercentFromCooldownInfo
function openRaidLib.GetCooldownStatusFromCooldownInfo(cooldownInfo)
local timeLeft, charges, timeOffset, duration, updateTime = unpack(cooldownInfo)
local timeLeft, charges, timeOffset, duration, updateTime, auraDuration = openRaidLib.CooldownManager.GetCooldownInfoValues(cooldownInfo)
return calculatePercent(timeOffset, duration, updateTime, charges)
end
--internals
function openRaidLib.CooldownManager.GetCooldownInfoValues(cooldownInfo)
local timeLeft, charges, timeOffset, duration, updateTime, auraDuration = unpack(cooldownInfo)
return timeLeft, charges, timeOffset, duration, updateTime, auraDuration
end
function openRaidLib.CooldownManager.OnPlayerCast(event, spellId, isPlayerPet) --~cast
--player casted a spell, check if the spell is registered as cooldown
--local playerSpec = openRaidLib.GetPlayerSpecId() --should be deprecated with cooldowns from spellbook
--if (playerSpec) then
--if (LIB_OPEN_RAID_COOLDOWNS_BY_SPEC[playerSpec] and LIB_OPEN_RAID_COOLDOWNS_BY_SPEC[playerSpec][spellId]) then --kinda deprecated with the new spell from spellbook
--issue: pet spells isn't in this table yet, might mess with pet interrupts
if (LIB_OPEN_RAID_PLAYERCOOLDOWNS[spellId]) then --check if the casted spell is a cooldown the player has available
local playerName = UnitName("player")
--issue: pet spells isn't in this table yet, might mess with pet interrupts
if (LIB_OPEN_RAID_PLAYERCOOLDOWNS[spellId]) then --check if the casted spell is a cooldown the player has available
local playerName = UnitName("player")
--get the cooldown time for this spell
local timeLeft, charges, startTimeOffset, duration = openRaidLib.CooldownManager.GetPlayerCooldownStatus(spellId)
--get the cooldown time for this spell
local timeLeft, charges, startTimeOffset, duration, auraDuration = openRaidLib.CooldownManager.GetPlayerCooldownStatus(spellId) --return 5 values
--update the cooldown
openRaidLib.CooldownManager.CooldownSpellUpdate(playerName, spellId, timeLeft, charges, startTimeOffset, duration)
local cooldownInfo = cooldownGetSpellInfo(playerName, spellId)
--update the cooldown
openRaidLib.CooldownManager.CooldownSpellUpdate(playerName, spellId, timeLeft, charges, startTimeOffset, duration, auraDuration) --receive 7 values
local cooldownInfo = cooldownGetSpellInfo(playerName, spellId)
--trigger a public callback
local playerCooldownTable = openRaidLib.GetUnitCooldowns(playerName)
openRaidLib.publicCallback.TriggerCallback("CooldownUpdate", "player", spellId, cooldownInfo, playerCooldownTable, openRaidLib.CooldownManager.UnitData)
--trigger a public callback
local playerCooldownTable = openRaidLib.GetUnitCooldowns(playerName)
openRaidLib.publicCallback.TriggerCallback("CooldownUpdate", "player", spellId, cooldownInfo, playerCooldownTable, openRaidLib.CooldownManager.UnitData)
--send to comm
openRaidLib.CooldownManager.SendPlayerCooldownUpdate(spellId, timeLeft, charges, startTimeOffset, duration)
--send to comm
openRaidLib.CooldownManager.SendPlayerCooldownUpdate(spellId, timeLeft, charges, startTimeOffset, duration, auraDuration)
--create a timer to monitor the time of this cooldown
--as there's just a few of them to monitor, there's no issue on creating one timer per spell
cooldownStartTicker(spellId, timeLeft)
end
--end
--create a timer to monitor the time of this cooldown
--as there's just a few of them to monitor, there's no issue on creating one timer per spell
cooldownStartTicker(spellId, timeLeft)
end
end
--when the player is ressed while in a group, send the cooldown list
@@ -2015,8 +2021,8 @@ function openRaidLib.CooldownManager.OnReceiveUnitCooldownChanges(data, unitName
local cooldownsAddedUnpacked = openRaidLib.UnpackTable(addedCooldowns, 1, true, true, 5)
for spellId, cooldownInfo in pairs(cooldownsAddedUnpacked) do
--add the spell into the list of cooldowns of this unit
local timeLeft, charges, timeOffset, duration = unpack(cooldownInfo)
openRaidLib.CooldownManager.CooldownSpellUpdate(unitName, spellId, timeLeft, charges, timeOffset, duration)
local timeLeft, charges, timeOffset, duration, updateTime, auraDuration = openRaidLib.CooldownManager.GetCooldownInfoValues(cooldownInfo)
openRaidLib.CooldownManager.CooldownSpellUpdate(unitName, spellId, timeLeft, charges, timeOffset, duration, auraDuration)
--mark the filter cache of this unit as dirt
openRaidLib.CooldownManager.NeedRebuildFilters[unitName] = true
@@ -2054,15 +2060,16 @@ function openRaidLib.CooldownManager.CheckForSpellsAdeedOrRemoved()
for spellId, cooldownInfo in pairs(newCooldownList) do
if (not currentCooldowns[spellId]) then
--a spell has been added
local timeLeft, charges, timeOffset, duration = unpack(cooldownInfo)
openRaidLib.CooldownManager.CooldownSpellUpdate(playerName, spellId, timeLeft, charges, timeOffset, duration)
local timeLeft, charges, timeOffset, duration, updateTime, auraDuration = openRaidLib.CooldownManager.GetCooldownInfoValues(cooldownInfo)
openRaidLib.CooldownManager.CooldownSpellUpdate(playerName, spellId, timeLeft, charges, timeOffset, duration, auraDuration)
local timeLeft, charges, startTimeOffset, duration = openRaidLib.CooldownManager.GetPlayerCooldownStatus(spellId)
local timeLeft, charges, startTimeOffset, duration, auraDuration = openRaidLib.CooldownManager.GetPlayerCooldownStatus(spellId) --return 5 values
spellsAdded[#spellsAdded+1] = spellId
spellsAdded[#spellsAdded+1] = timeLeft
spellsAdded[#spellsAdded+1] = charges
spellsAdded[#spellsAdded+1] = startTimeOffset
spellsAdded[#spellsAdded+1] = duration
spellsAdded[#spellsAdded+1] = auraDuration
--mark the filter cache of this unit as dirt
openRaidLib.CooldownManager.NeedRebuildFilters[playerName] = true
@@ -2126,6 +2133,7 @@ openRaidLib.commHandler.RegisterComm(CONST_COMM_COOLDOWNUPDATE_PREFIX, function(
local charges = tonumber(dataAsArray[3])
local startTime = tonumber(dataAsArray[4])
local duration = tonumber(dataAsArray[5])
local auraDuration = tonumber(dataAsArray[6])
--check integrity
if (not spellId or spellId == 0) then
@@ -2142,10 +2150,14 @@ openRaidLib.commHandler.RegisterComm(CONST_COMM_COOLDOWNUPDATE_PREFIX, function(
elseif (not duration) then
return openRaidLib.DiagnosticError("CooldownManager|comm received|duration is invalid")
elseif (not auraDuration) then
return openRaidLib.DiagnosticError("CooldownManager|comm received|auraDuration is invalid")
end
--update
openRaidLib.CooldownManager.CooldownSpellUpdate(unitName, spellId, cooldownTimer, charges, startTime, duration)
--unitName, spellId, cooldownTimer, charges, startTime, duration, auraDuration
openRaidLib.CooldownManager.CooldownSpellUpdate(unitName, spellId, cooldownTimer, charges, startTime, duration, auraDuration)
local cooldownInfo = cooldownGetSpellInfo(unitName, spellId)
local unitCooldownTable = openRaidLib.GetUnitCooldowns(unitName)
@@ -2180,8 +2192,8 @@ function openRaidLib.CooldownManager.SendAllPlayerCooldowns()
end
--send to comm a specific cooldown that was just used, a charge got available or its cooldown is over (ready to use)
function openRaidLib.CooldownManager.SendPlayerCooldownUpdate(spellId, cooldownTimeLeft, charges, startTimeOffset, duration)
local dataToSend = "" .. CONST_COMM_COOLDOWNUPDATE_PREFIX .. "," .. spellId .. "," .. cooldownTimeLeft .. "," .. charges .. "," .. startTimeOffset .. "," .. duration
function openRaidLib.CooldownManager.SendPlayerCooldownUpdate(spellId, cooldownTimeLeft, charges, startTimeOffset, duration, auraDuration)
local dataToSend = "" .. CONST_COMM_COOLDOWNUPDATE_PREFIX .. "," .. spellId .. "," .. cooldownTimeLeft .. "," .. charges .. "," .. startTimeOffset .. "," .. duration .. "," .. auraDuration
openRaidLib.commHandler.SendCommData(dataToSend)
diagnosticComm("SendPlayerCooldownUpdate| " .. dataToSend) --debug
end
@@ -2219,8 +2231,8 @@ function openRaidLib.CooldownManager.OnReceiveRequestForCooldownInfoUpdate(data,
end
--get the cooldown time for this spell
local timeLeft, charges, startTimeOffset, duration = openRaidLib.CooldownManager.GetPlayerCooldownStatus(spellId)
openRaidLib.CooldownManager.SendPlayerCooldownUpdate(spellId, timeLeft, charges, startTimeOffset, duration)
local timeLeft, charges, startTimeOffset, duration, auraDuration = openRaidLib.CooldownManager.GetPlayerCooldownStatus(spellId)
openRaidLib.CooldownManager.SendPlayerCooldownUpdate(spellId, timeLeft, charges, startTimeOffset, duration, auraDuration)
end
openRaidLib.commHandler.RegisterComm(CONST_COMM_COOLDOWNREQUEST_PREFIX, openRaidLib.CooldownManager.OnReceiveRequestForCooldownInfoUpdate)
@@ -2533,7 +2545,7 @@ C_Timer.After(0.1, function()
--trigger a cooldown usage
local duration = cooldownInfo.duration
--time left, charges, startTimeOffset, duration
openRaidLib.CooldownManager.CooldownSpellUpdate(unitName, spellId, duration, 0, 0, duration)
openRaidLib.CooldownManager.CooldownSpellUpdate(unitName, spellId, duration, 0, 0, duration, 0)
local cooldownInfo = cooldownGetSpellInfo(unitName, spellId)
local unitCooldownsTable = openRaidLib.GetUnitCooldowns(unitName)
@@ -260,6 +260,10 @@ LIB_OPEN_RAID_MELEE_SPECS = {
--/dump GetTalentInfo (talentTier, talentColumn, 1)
--example: to get the second talent of the last talent line, use: /dump GetTalentInfo (7, 2, 1)
--todo:
--get cooldown duration from the buff placed on the player or target player
--spell scanner not getting the spell from the pet spellbook
LIB_OPEN_RAID_COOLDOWNS_INFO = {
-- Filter Types:
@@ -269,7 +273,53 @@ LIB_OPEN_RAID_COOLDOWNS_INFO = {
-- 4 raid defensive cooldown
-- 5 personal utility cooldown
-- 6 interrupt
-- 7 dispel
-- 8 crowd control
-- 9 racials
--racials
--maintanance: login into the new race and type /run Details.GenerateRacialSpellList()
--this command give a formated line to paste here
[312411] = {cooldown = 90, duration = 0, specs = {}, talent = false, charges = 1, raceid = 35, race = "Vulpera", class = "", type = 9}, --Bag of Tricks (Vulpera)
--[312370] = {cooldown = 600, duration = 0, specs = {}, talent = false, charges = 1, raceid = 35, race = "Vulpera", class = "", type = 9}, --Make Camp (Vulpera)
--[312372] = {cooldown = 3600, duration = 0, specs = {}, talent = false, charges = 1, raceid = 35, race = "Vulpera", class = "", type = 9}, --Return to Camp (Vulpera)
--[312425] = {cooldown = 300, duration = 0, specs = {}, talent = false, charges = 1, raceid = 35, race = "Vulpera", class = "", type = 9}, --Rummage Your Bag (Vulpera)
[274738] = {cooldown = 120, duration = 0, specs = {}, talent = false, charges = 1, raceid = 36, race = "MagharOrc", class = "", type = 9}, --Ancestral Call (MagharOrc)
--[292752] = {cooldown = 432000, duration = 0, specs = {}, talent = false, charges = 1, raceid = 31, race = "ZandalariTroll", class = "", type = 9}, --Embrace of the Loa (ZandalariTroll)
--[281954] = {cooldown = 900, duration = 0, specs = {}, talent = false, charges = 1, raceid = 31, race = "ZandalariTroll", class = "", type = 9}, --Pterrordax Swoop (ZandalariTroll)
[291944] = {cooldown = 150, duration = 0, specs = {}, talent = false, charges = 1, raceid = 31, race = "ZandalariTroll", class = "", type = 9}, --Regeneratin' (ZandalariTroll)
[255654] = {cooldown = 120, duration = 0, specs = {}, talent = false, charges = 1, raceid = 28, race = "HighmountainTauren", class = "", type = 9}, --Bull Rush (HighmountainTauren)
[260364] = {cooldown = 180, duration = 0, specs = {}, talent = false, charges = 1, raceid = 27, race = "Nightborne", class = "", type = 9}, --Arcane Pulse (Nightborne)
--[255661] = {cooldown = 600, duration = 0, specs = {}, talent = false, charges = 1, raceid = 27, race = "Nightborne", class = "", type = 9}, --Cantrips (Nightborne)
--[69046] = {cooldown = 1800, duration = 0, specs = {}, talent = false, charges = 1, raceid = 9, race = "Goblin", class = "", type = 9}, --Pack Hobgoblin (Goblin)
[69041] = {cooldown = 90, duration = 0, specs = {}, talent = false, charges = 1, raceid = 9, race = "Goblin", class = "", type = 9}, --Rocket Barrage (Goblin)
[69070] = {cooldown = 90, duration = 0, specs = {}, talent = false, charges = 1, raceid = 9, race = "Goblin", class = "", type = 9}, --Rocket Jump (Goblin)
[20549] = {cooldown = 90, duration = 0, specs = {}, talent = false, charges = 1, raceid = 6, race = "Tauren", class = "", type = 9}, --War Stomp (Tauren)
--[20577] = {cooldown = 120, duration = 0, specs = {}, talent = false, charges = 1, raceid = 5, race = "Scourge", class = "", type = 9}, --Cannibalize (Scourge)
[7744] = {cooldown = 120, duration = 0, specs = {}, talent = false, charges = 1, raceid = 5, race = "Scourge", class = "", type = 9}, --Will of the Forsaken (Scourge)
[20572] = {cooldown = 120, duration = 0, specs = {}, talent = false, charges = 1, raceid = 2, race = "Orc", class = "", type = 9}, --Blood Fury (Orc)
[312924] = {cooldown = 180, duration = 0, specs = {}, talent = false, charges = 1, raceid = 37, race = "Mechagnome", class = "", type = 9}, --Hyper Organic Light Originator (Mechagnome)
--[312890] = {cooldown = 0, duration = 0, specs = {}, talent = false, charges = 1, raceid = 37, race = "Mechagnome", class = "", type = 9}, --Skeleton Pinkie (Mechagnome)
[287712] = {cooldown = 150, duration = 0, specs = {}, talent = false, charges = 1, raceid = 32, race = "KulTiran", class = "", type = 9}, --Haymaker (KulTiran)
[265221] = {cooldown = 120, duration = 0, specs = {}, talent = false, charges = 1, raceid = 34, race = "DarkIronDwarf", class = "", type = 9}, --Fireblood (DarkIronDwarf)
--[265225] = {cooldown = 1800, duration = 0, specs = {}, talent = false, charges = 1, raceid = 34, race = "DarkIronDwarf", class = "", type = 9}, --Mole Machine (DarkIronDwarf)
--[259930] = {cooldown = 900, duration = 0, specs = {}, talent = false, charges = 1, raceid = 30, race = "LightforgedDraenei", class = "", type = 9}, --Forge of Light (LightforgedDraenei)
[255647] = {cooldown = 150, duration = 0, specs = {}, talent = false, charges = 1, raceid = 30, race = "LightforgedDraenei", class = "", type = 9}, --Light's Judgment (LightforgedDraenei)
[256948] = {cooldown = 180, duration = 0, specs = {}, talent = false, charges = 1, raceid = 29, race = "VoidElf", class = "", type = 9}, --Spatial Rift (VoidElf)
--[358733] = {cooldown = 1, duration = 0, specs = {}, talent = false, charges = 1, raceid = 52, race = "Dracthyr", class = "", type = 9}, --Glide (Dracthyr)
[368970] = {cooldown = 90, duration = 0, specs = {}, talent = false, charges = 1, raceid = 52, race = "Dracthyr", class = "", type = 9}, --Tail Swipe (Dracthyr)
[357214] = {cooldown = 90, duration = 0, specs = {}, talent = false, charges = 1, raceid = 52, race = "Dracthyr", class = "", type = 9}, --Wing Buffet (Dracthyr)
[107079] = {cooldown = 120, duration = 0, specs = {}, talent = false, charges = 1, raceid = 25, race = "Pandaren", class = "", type = 9}, --Quaking Palm (Pandaren)
[68992] = {cooldown = 120, duration = 0, specs = {}, talent = false, charges = 1, raceid = 22, race = "Worgen", class = "", type = 9}, --Darkflight (Worgen)
--[68996] = {cooldown = 1, duration = 0, specs = {}, talent = false, charges = 1, raceid = 22, race = "Worgen", class = "", type = 9}, --Two Forms (Worgen)
[26297] = {cooldown = 180, duration = 0, specs = {}, talent = false, charges = 1, raceid = 8, race = "Troll", class = "", type = 9}, --Berserking (Troll)
[20589] = {cooldown = 60, duration = 0, specs = {}, talent = false, charges = 1, raceid = 7, race = "Gnome", class = "", type = 9}, --Escape Artist (Gnome)
[232633] = {cooldown = 120, duration = 0, specs = {}, talent = false, charges = 1, raceid = 10, race = "BloodElf", class = "", type = 9}, --Arcane Torrent (BloodElf)
[59752] = {cooldown = 180, duration = 0, specs = {}, talent = false, charges = 1, raceid = 1, race = "Human", class = "", type = 9}, --Will to Survive (Human)
[20594] = {cooldown = 120, duration = 0, specs = {}, talent = false, charges = 1, raceid = 3, race = "Dwarf", class = "", type = 9}, --Stoneform (Dwarf)
[58984] = {cooldown = 120, duration = 0, specs = {}, talent = false, charges = 1, raceid = 4, race = "NightElf", class = "", type = 9}, --Shadowmeld (NightElf)
[59542] = {cooldown = 180, duration = 0, specs = {}, talent = false, charges = 1, raceid = 11, race = "Draenei", class = "", type = 9}, --Gift of the Naaru (Draenei)
--interrupts
[6552] = {class = "WARRIOR", specs = {71, 72, 73}, cooldown = 15, silence = 4, talent = false, cooldownWithTalent = false, cooldownTalentId = false, type = 6, charges = 1}, --Pummel
@@ -319,6 +369,7 @@ LIB_OPEN_RAID_COOLDOWNS_INFO = {
--[343527] = {cooldown = 1 min cooldown, duration = 0, specs = {}, talent = false, charges = 1, class = "PALADIN", type = 1}, --Execution Sentence
--[343721] = {cooldown = 1 min cooldown, duration = 0, specs = {}, talent = false, charges = 1, class = "PALADIN", type = 1}, --Final Reckoning
--[391054] = {cooldown = 10 min cooldown, duration = 0, specs = {}, talent = false, charges = 1, class = "PALADIN", type = 5}, --Intercession (battle ress)
[20066] = {cooldown = 15, duration = 0, specs = {}, talent = false, charges = 1, class = "PALADIN", type = 8}, --Repentance
--warrior
-- 71 - Arms
@@ -342,6 +393,8 @@ LIB_OPEN_RAID_COOLDOWNS_INFO = {
[376079] = {cooldown = 90, duration = 4, specs = {}, talent = false, charges = 1, class = "WARRIOR", type = 1}, --Spear of Bastion
[392966] = {cooldown = 90, duration = 20, specs = {73}, talent = false, charges = 1, class = "WARRIOR", type = 2}, --Spell Block
[384318] = {cooldown = 90, duration = 0, specs = {71, 72, 73}, talent = false, charges = 1, class = "WARRIOR", type = 1}, --Thunderous Roar
[46968] = {cooldown = 40, duration = 0, specs = {}, talent = false, charges = 1, class = "WARRIOR", type = 8}, --Shockwave
[23920] = {cooldown = 25, duration = 5, specs = {}, talent = false, charges = 1, class = "WARRIOR", type = 5}, --Shockwave
--warlock
-- 265 - Affliction
@@ -383,6 +436,10 @@ LIB_OPEN_RAID_COOLDOWNS_INFO = {
[192077] = {cooldown = 120, duration = 15, specs = {262, 263, 264}, talent = false, charges = 1, class = "SHAMAN", type = 5}, --Wind Rush Totem
--[198838] = {cooldown = 60, duration = 15, specs = {264}, talent = false, charges = 1, class = "SHAMAN", type = 4}, --Earthen Wall Totem
[51485] = {cooldown = 60, duration = 20, specs = {262, 263, 264}, talent = false, charges = 1, class = "SHAMAN", type = 8}, --Earthgrab Totem
--[383017] = {cooldown = 30, duration = 0, specs = {}, talent = false, charges = 1, class = "SHAMAN", type = 4}, --Stoneskin Totem
[51514] = {cooldown = 30, duration = 0, specs = {}, talent = false, charges = 1, class = "SHAMAN", type = 8}, --Hex
[108968] = {cooldown = 5*60, duration = 0, specs = {}, talent = false, charges = 1, class = "PRIEST", type = 3}, --Void Shift
--monk
-- 268 - Brewmaster
@@ -408,6 +465,7 @@ LIB_OPEN_RAID_COOLDOWNS_INFO = {
[115176] = {cooldown = 300, duration = 8, specs = {268}, talent = false, charges = 1, class = "MONK", type = 2}, --Zen Meditation
[388686] = {cooldown = 120, duration = 30, specs = {268, 269, 270}, talent = false, charges = 1, class = "MONK", type = 1}, --Summon White Tiger Statue
--[322109] = {cooldown = 180, duration = 0, specs = {268, 269, 270}, talent = false, charges = 1, class = "MONK", type = 1}, --Touch of Death
[116841] = {cooldown = 30, duration = 0, specs = {}, talent = false, charges = 1, class = "MONK", type = 5}, --Tiger's Lust
--hunter
@@ -422,13 +480,14 @@ LIB_OPEN_RAID_COOLDOWNS_INFO = {
[109248] = {cooldown = 45, duration = 10, specs = {253, 254, 255}, talent = false, charges = 1, class = "HUNTER", type = 8}, --Binding Shot
[199483] = {cooldown = 60, duration = 60, specs = {253, 254, 255}, talent = false, charges = 1, class = "HUNTER", type = 2}, --Camouflage
[266779] = {cooldown = 120, duration = 20, specs = {255}, talent = false, charges = 1, class = "HUNTER", type = 1}, --Coordinated Assault
[109304] = {cooldown = 120, duration = 0, specs = {253, 254, 255}, talent = false, charges = 1, class = "HUNTER", type = 2}, --Exhilaration
[109304] = {cooldown = 120, duration = 8, durationSpellId = 385540, specs = {253, 254, 255}, talent = false, charges = 1, class = "HUNTER", type = 2}, --Exhilaration
[187650] = {cooldown = 25, duration = 60, specs = {253, 254, 255}, talent = false, charges = 1, class = "HUNTER", type = 8}, --Freezing Trap
[19577] = {cooldown = 60, duration = 5, specs = {253, 255}, talent = false, charges = 1, class = "HUNTER", type = 8}, --Intimidation
[201430] = {cooldown = 180, duration = 12, specs = {253}, talent = false, charges = 1, class = "HUNTER", type = 1}, --Stampede
[281195] = {cooldown = 180, duration = 6, specs = {253, 254, 255}, talent = false, charges = 1, class = "HUNTER", type = 2}, --Survival of the Fittest
--[281195] = {cooldown = 180, duration = 6, specs = {253, 254, 255}, talent = false, charges = 1, class = "HUNTER", type = 2}, --Survival of the Fittest
[288613] = {cooldown = 180, duration = 15, specs = {254}, talent = false, charges = 1, class = "HUNTER", type = 1}, --Trueshot
[264735] = {cooldown = 180, duration = 0, specs = {253, 254, 255}, talent = false, charges = 1, class = "HUNTER", type = 2}, --Survival of the Fittest
[187698] = {cooldown = 30, duration = 0, specs = {}, talent = false, charges = 1, class = "HUNTER", type = 8}, --Tar Trap
--druid
-- 102 - Balance
@@ -458,6 +517,7 @@ LIB_OPEN_RAID_COOLDOWNS_INFO = {
[102793] = {cooldown = 60, duration = 10, specs = {102, 103, 104, 105}, talent = false, charges = 1, class = "DRUID", type = 8}, --Ursol's Vortex
[124974] = {cooldown = 90, duration = 0, specs = {102, 103, 104, 105}, talent = false, charges = 1, class = "DRUID", type = 3}, --Nature's Vigil
[106898] = {cooldown = 120, duration = 8, specs = {102, 103, 104, 105}, talent = false, charges = 1, class = "DRUID", type = 5}, --Stampeding Roar
[5211] = {cooldown = 60, duration = 0, specs = {}, talent = false, charges = 1, class = "DRUID", type = 8}, --Mighty Bash
--death knight
-- 252 - Unholy
@@ -484,7 +544,7 @@ LIB_OPEN_RAID_COOLDOWNS_INFO = {
[207289] = {cooldown = 78, duration = 12, specs = {252}, talent = false, charges = 1, class = "DEATHKNIGHT", type = 1}, --Unholy Assault
[55233] = {cooldown = 90, duration = 10, specs = {250}, talent = false, charges = 1, class = "DEATHKNIGHT", type = 2}, --Vampiric Blood
[212552] = {cooldown = 60, duration = 4, specs = {250, 251, 252}, talent = false, charges = 1, class = "DEATHKNIGHT", type = 2}, --Wraith Walk
[49576] = {cooldown = 25, duration = 0, specs = {}, talent = false, charges = 1, class = "DEATHKNIGHT", type = 8}, --Death Grip
--demon hunter
-- 577 - Havoc
@@ -510,6 +570,7 @@ LIB_OPEN_RAID_COOLDOWNS_INFO = {
-- 62 - Arcane
-- 63 - Fire
-- 64 - Frost
[365350] = {cooldown = 90, duration = 15, specs = {62}, talent = false, charges = 1, class = "MAGE", type = 1}, --Arcane Surge
[12042] = {cooldown = 90, duration = 10, specs = {62}, talent = false, charges = 1, class = "MAGE", type = 1}, --Arcane Power
[235313] = {cooldown = 25, duration = 60, specs = {63}, talent = false, charges = 1, class = "MAGE", type = 5}, --Blazing Barrier
[235219] = {cooldown = 300, duration = 0, specs = {64}, talent = false, charges = 1, class = "MAGE", type = 2}, --Cold Snap
@@ -525,6 +586,7 @@ LIB_OPEN_RAID_COOLDOWNS_INFO = {
[235450] = {cooldown = 25, duration = 60, specs = {62}, talent = false, charges = 1, class = "MAGE", type = 5}, --Prismatic Barrier
[205021] = {cooldown = 78, duration = 5, specs = {64}, talent = false, charges = 1, class = "MAGE", type = 1}, --Ray of Frost
[113724] = {cooldown = 45, duration = 10, specs = {62, 63, 64}, talent = false, charges = 1, class = "MAGE", type = 8}, --Ring of Frost
[31661] = {cooldown = 45, duration = 0, specs = {}, talent = false, charges = 1, class = "MAGE", type = 8}, --Dragon's Breath
--priest
-- 256 - Discipline
@@ -571,11 +633,14 @@ LIB_OPEN_RAID_COOLDOWNS_INFO = {
[114018] = {cooldown = 360, duration = 15, specs = {259, 260, 261}, talent = false, charges = 1, class = "ROGUE", type = 5}, --Shroud of Concealment
[1856] = {cooldown = 120, duration = 3, specs = {259, 260, 261}, talent = false, charges = 1, class = "ROGUE", type = 1}, --Vanish
[79140] = {cooldown = 120, duration = 20, specs = {259}, talent = false, charges = 1, class = "ROGUE", type = 1}, --Vendetta
[1776] = {cooldown = 20, duration = 0, specs = {}, talent = false, charges = 1, class = "ROGUE", type = 8}, --Gouge
[408] = {cooldown = 20, duration = 0, specs = {}, talent = false, charges = 1, class = "ROGUE", type = 8}, --Kidney Shot
[1966] = {cooldown = 15, duration = 0, specs = {}, talent = false, charges = 1, class = "ROGUE", type = 2}, --Feint
--evoker
-- 1467 - Devastation
-- 1468 - Preservation
--[374251] = {cooldown = 60, duration = 0, specs = {1467, 1468}, talent = false, charges = 1, class = "EVOKER", type = 7}, --Cauterizing Flame
[374251] = {cooldown = 60, duration = 0, specs = {1467, 1468}, talent = false, charges = 1, class = "EVOKER", type = 7}, --Cauterizing Flame
--[365585] = {cooldown = 8, duration = 0, specs = {1467, 1468}, talent = false, charges = 1, class = "EVOKER", type = 7}, --Expunge
--[360823] = {cooldown = 8, duration = 0, specs = {1468}, talent = false, charges = 1, class = "EVOKER", type = 7}, --Naturalize
[357210] = {cooldown = 120, duration = 0, specs = {1467, 1468}, talent = false, charges = 1, class = "EVOKER", type = 1}, --Deep Breath
+6
View File
@@ -55,6 +55,12 @@ local isReady, normalizedPercent, timeLeft, charges, minValue, maxValue, current
@spells: a table containing spellIds {spellId, spellId, spellId, ...}
openRaidLib.AddCooldownFilter(filterName, spells)
--get a list of filters which a spell has, returns a table in map format: {[filterName] = true}
--@spellId: the ID of a spell
--@defaultFilterOnly (bool): if true only return built-in filters, example: "defensive-raid", "ofensive".
--@customFiltersOnly (bool): if true onlt return a list of custom filters where the spell was added.
local filterListArray = openRaidLib.GetSpellFilters(spellId, defaultFilterOnly, customFiltersOnly)
--request information about a spell for all units in the raid, units which has this cooldown will report back with a "CooldownUpdate" event
openRaidLib.RequestCooldownInfo(spellId)
+63 -239
View File
@@ -3,11 +3,11 @@
_ = nil
_G._detalhes = LibStub("AceAddon-3.0"):NewAddon("_detalhes", "AceTimer-3.0", "AceComm-3.0", "AceSerializer-3.0", "NickTag-1.0")
local addonName, Details222 = ...
local version, build, date, tocversion = GetBuildInfo()
_detalhes.build_counter = 10259
_detalhes.alpha_build_counter = 10259 --if this is higher than the regular counter, use it instead
_detalhes.build_counter = 10277
_detalhes.alpha_build_counter = 10277 --if this is higher than the regular counter, use it instead
_detalhes.dont_open_news = true
_detalhes.game_version = version
_detalhes.userversion = version .. " " .. _detalhes.build_counter
@@ -64,15 +64,45 @@ do
local Loc = _G.LibStub("AceLocale-3.0"):GetLocale( "Details" )
--[=[
-
-
- this is an empty comment section
-
-
--]=]
local news = {
{"v10.0.2.10277.146", "Nov 18th, 2022"},
"REMINDER: '/details coach' to get damage/healing/deaths in real time as the 21st person (coach) for the next raid tier in dragonflight.",
"",
"New <Plugin: Cast Log> show a time line of spells used by players in the group, Raid Leader: show all attack and defense cooldowns used by the raid.",
"Wago: Details! Standalone version is now hosted on addons.wago.io and WowUp.com.",
"",
"Details! will count class play time, everyone using Details! from day 1 in Dragonflight should have an accurate play time in the class.",
"Visual updates on default skin.",
"All panels from options to plugins received visual updates.",
"Profiles won't export Auto Hide automations to stop issues with players not knowing why the window is hidding.",
"Details! should decrease the amount of chat spam errors and instead show them in the bug report window like al the other addons.",
"Player Details! Breakdown window: player selection now uses the same font as the regular window.",
"Death log tooltip revamp for more clarity to see the ability name and the damage done.",
"Dragonflight Trinkets damage will show the trinket name after the spell name.",
"'/details scroll' feature: spell name and spell id can now be copied, the frame got a scale bar.",
"Added option: 'Use Dynamic Overall Damage', if enabled swap to Dynamic Overall Damage when combat start while showing Overall Damage.",
"Fixed for most of the user having the problem of the encounter time not showing.",
"Fixed most of the issues with the melee spell name being called 'Word of Recall'.",
"Details! Damage Meter, Deatails! Framework, LibOpenRaid has been successfully updated to Dragonflight.",
"New class Evoker are now fully supported by Details!.",
"",
"Fixed an issue where warlocks was entering in combat from a debug doing damage (Flamanis).",
"Fixed 'Auto of Range' problem in Wrath of the Lich King (Flamanis).",
"Fixed a bug with custom displays when showing players outside the player group (Flamanis).",
"Fixed an issue where specs wheren't sent on Wrath (Flamanis).",
"Fixed Buff Uptime Tooltip where the buff had zero uptime (Flamanis)",
"Fixed shield damage preventing rare error when the absorption was zero (Flamanis).",
"Fixed chat embed system built in Details! from the Skins section (Flamanis).",
"Fixed an issue where damage in battlegrounds was not being sync with battleground score board in Wrath (Flamanis).",
"",
"New Slash Commands:",
"/playedclass: show how much time you have played this class on this expansion.",
"/dumpt <anything>: show the value of any table, global, spellId, etc.",
"/details auras: show a panel with your current auras, spell ids and spell payload.",
"/details perf: show performance issues when you get a warning about freezes due to UpdateAddOnMemoryUsage().",
"/details npcid: get the npc id of your target (a box is shown with the number ready to be copied).",
{"v9.2.0.10001.146", "Aug 10th, 2022"},
"New feature: Arena DPS Bar, can be enabled at the Broadcaster Tools section, shows a bar in 'kamehameha' style showing which team is doing more damage in the latest 3 seconds.",
"/keystone now has more space for the dungeon name.",
@@ -95,225 +125,6 @@ do
"Major cleanup and code improvements on dropdowns for library Details! Framework.",
"Cleanup on NickTag library.",
"Removed LibGroupInSpecT, LibItemUpgradeInfo and LibCompress. These libraries got replaced by OpenRaidLib and LibDeflate.",
{"v9.2.0.9814.146", "May 15th, 2022"},
"Added slash command /keystone, this command show keystones of other users with addons using Open Raid library.",
"Added a second Title Bar (disabled by default), is recomended to make the Skin Color (under Window Body) full transparent while using it.",
"Added Overlay Texture and Color options under Bars: General.",
"Added Wallpaper Alignment 'Full Body', this alignment make the wallpaper fill over the title bar.",
"Added Auto Alignment for 'Aligned Text Columns', this option is enabled by default.",
"Added 'Window Area Border' and 'Row Area Border' under 'Window Body' section in the options panel.",
"Added an option to color the Row Border by player class.",
"Added new automation auto hide option: Arena.",
"Blizzard Death Recap kill ability only shows on Dungeons and Raids now.",
"Fixed an issue where player names was overlapping damage numbers with enbaled 'Aligned Text Columns'.",
"Fixed a bug on 'DeathLog Min Healing' option where it was reseting to 1 on each logon.",
"Fixed several bugs with 'Bar Orientation: Right to Left' (fix by Flamanis).",
"Fixed an error on Vanguard plugin.",
"Fixed Spec Icons 'Specialization Alpha' offseted by 2 pixels to the right.",
{"v9.2.0.9778.146", "April 26th, 2022"},
--"A cooldown tracker experiment has been added, its options is visible at the Options Panel.",
"Added a search box in the '/details scroll' feature.",
"When using Details! Death Recap, a message is now printed to chat showing what killed you accordingly to Blizzard Death Recap.",
"Fixed some errors while using Mind Control on an arena match.",
"Fixed encounter phase detection while using voice packs for boss mods addons.",
"Fixed an error after killing a boss encounter on heroic dificulty for the first time.",
"Fixed the issue of skins installed after the window has been loaded and the skin was not found at that time.",
"API: added 'UNIT_SPEC' and 'UNIT_TALENTS' event to details! event listener.",
"API: added Details:GetUnitId(unitName) which return the unitId for a given player name.",
{"v9.2.0.9735.146", "April 8th, 2022"},
"Arena Enemy Player deaths has been greatly improved on this version.",
"Added M+ Score into the player info tooltip (hover over the spec icon).",
"Fixed windows ungrouping after a /reload (fix by Flamanis).",
"Opening a tooltip from a bar or a menu in the title bar will close the All Displays Panel (from right clicking the title bar).",
"[TBC] fixed an error given by users using old versions of Details! in the raid.",
{"v9.2.0.9715.146", "March 6th, 2022"},
"More Tiny Threat fixes and implementations (by Treeston)",
"Fixed Chinese and Taiwan 'Thousand' abbreviation letter (fix by github user Maioro).",
{"v9.2.0.9699.146", "March 4th, 2022"},
"Align Text Columns now have a warning at the bracket and separators option",
"Silence from interrupts shall be counted as a crowd control.",
"More phrases in the options panel has been added to translation.",
"A revamp has beed started on the erase data prompt.",
{"v9.2.0.9696.146", "February 24th, 2022"},
"Fixed DPS display when using Aligned Text Columns.",
"Fixed percent showing even it's disabled when using Aligned Text Columns.",
{"v9.2.0.9255.146", "February 22th, 2022"},
"Added Cosmic Healing Potion to script 'Health Potion & Stone'.",
{"v9.1.5.9213.146", "February 15th, 2022"},
"Added an option to change your own bar color.",
"Added 'Ignore this Npc' into the Npc list under the spell list section.",
"Bookmark window now uses the same scale than the options panel.",
"Class Color window now uses the same scale than the options panel.",
"If not casted on the player itself Power Infusion now shows in the buff list of the target.",
"Allowed nicknames on custom displays (by Flamanis).",
"Aligned Text Columns enabled is now default for new installs.",
"Fodder to the flames DH ability won't count damage done by the player on the add summoned.",
"Fixed the load time for the Npc Ids panel on the spell list section.",
"Fixed all issues with the options panel scale.",
"Fixed tooltips overlap when the window is positioned at the top of the screen (fix by Flamanis).",
"Fixed auto hide windows which wasn't saving its group when unhiding (fix by Flamanis).",
"Fixed some XML Headers which was giving errors on loading (fix by github user h0tw1r3).",
"Fixed '/details me' on TBC, which wasn't working correctly (fix by github user Baugstein).",
"Fixed a typo on Vanguard plugin (fix by github user cruzerthebruzer).",
"Fixed font 'NuevaStd' where something the font didn't work at all.",
"Fixed an issue where for some characters the options panel won't open showing an error in the chat instead.",
"New API: combat:GetPlayerDeaths(deadPlayerName).",
"New API: Details:ShowDeathTooltip(combatObject, deathTable) for Cooltip tooltips.",
{"v9.1.5.9213.145", "December 9th, 2021"},
"Fixed an issue where after reloading, overall data won't show the players nickname.",
"Fixed overkill damage on death log tooltip.",
"Fixed the percent bars for the healing done target on the player breakdown window.",
"Fixed an issue with resource tooltips.",
{"v9.1.5.9108.145", "November 02th, 2021"},
"Necrotic Wake: weapons damage does not count anymore for the player which uses it.",
"Necrotic Wake: a new 'fake player' is shown showing the damage done of all weapons during combat.",
"Necrotic Wake: these npcs now does not award damage done to players anymore: Brittlebone Mage, Brittlebone Warrior, Brittlebone Crossbowman",
"The Other Side: the npc Volatile Memory does not award anymore damage to players.",
"Plaguefall: the npcs Fungret Shroomtender and Plaguebound Fallen does not award anymore damage to players.",
"Sanguine Affix: the amount of healing done by sanguine pools now shows on all segments (was shown only in the overall).",
"Tiny Threat (plugin): fixed an issue when hidding the pull aggro bar makes the first line be invisible.",
"Statistics: fixed several small bugs with guild statistics (/details stats).",
"Scale slider (top left slider shown on panels) are now more responsible.",
{"v9.1.0.8888.145", "October 7th, 2021"},
"Search has been added into the options panel",
"Improvements on overkill amount of damage",
"Fonts 'Oswald' and 'NuevaStd' enabled again.",
"Added critical hits to Death Log (by C. Raethke)",
"Added settings to change the color on death log, they are within the class colors panel.",
"Don't show TaintWarning frame if MiniMapBattlefieldFrame is hidden (by Flamanis).",
{"v9.1.0.8812.145", "September 5th, 2021"},
"Fonts 'Oswald' and 'NuevaStd' disabled due to some erros on the client side.",
"Death Knight adds now include the icon of the spell whose summoned them.",
"Fixes and improvements on the backend of the addon.",
{"v9.1.0.8782.145", "August 11th, 2021"},
"Clicking on the minimap while the options panel is open will close it.",
"Fixed Raid Check plugin position when the window is anchored at the top of the monitor.",
"Shadow priest Void Erruption spells got merged into only one.",
"Added settings to adjust the scale or font size of the title bar menu (right click): /run Details.all_switch_config.font_size = 12; /run Details.all_switch_config.scale = 1.0;",
"Added transliteration to healing done.",
"Tiny Threat (plugin): added options to Hide the Pull Bar and Use Focus Target.",
{"v9.0.5.8637.144", "June 22nd, 2021"},
"Major update on Vanguard plugin.",
"Added utility module to Coach, this module will send interrupt, dispel, cc breaks, cooldown usege and battle resses to the Coach.",
"Added plugins into the title bar display menu.",
{"v9.0.5.8502.144", "May 21th, 2021"},
"Added options to change the color of each team during an arena match.",
"Fixed One Segment Battleground.",
"Fixed an error with Howl of Terror on Demo Warlocks.",
{"v9.0.5.8501.144", "May 17th, 2021"},
"Complete overhaul and rerritten on Fade In and Out animations, this should fix all bugs related to animations not being consistent.",
"Complete overhaul on the broadcaster tool for arenas 'Current DPS'. It shows now a bar indicating the dps of both teams.",
"Yellow arena team now has purple color.",
"Several updates on the combat log engine and bug fixes.",
{"v9.0.5.8357.144", "March 15th, 2021"},
"Max amount of segments raised to 40, was 30.",
"Added a 'Sanguine Heal' actor to show how much the void zone healed enemies, shown on Everything mode.",
"Death events are now ignore after the necrolord triggers Forgeborne Reveries.",
"Mythic dungeon settings are reset after importing a profile.",
"Scripts now support Inline text feature.",
"Fixed a rare bug when exporting a profile would result into a bug.",
"Fixed an issue with Spirit Shell overhealing.",
"Fixed a rare bug on dispel toooltips giving errors.",
"Fixed a bug on exporting scripts.",
"Fixed an error given when an a battleground opponent die.",
"Fixed an issue where sometimes entering an arena cause errors.",
"Fixed some issues with pet detection.",
{"v9.0.2.8246.144", "February 17th, 2021"},
"Added healing done to Coach feature (in testing).",
"Ignore Forgeborne Reveries healing done (Necrolords ability).",
"Arena enemy deaths now are shown in the Deaths display.",
"Guild statistics data has been wiped, this system had a major improvement overall.",
"Fixed 'Clear Overall Data' on Logout which wasn't clearing.",
{"v9.0.2.8192.144", "January 27th, 2021"},
"If you get issues with nicknames, disable any weakaura which modifies this feature.",
"Advanced Death Logs plugin got some fixes and should work properly.",
"Added the word 'Overall' at the end of the title bar text when the segment is overall.",
"Added covenant and durability into the Raid Check plugin.",
"Added API Window:SetTitleBarText(text) and Window:GetTitleBarText().",
"Fixed some issues where Details! printed 'combat start time not found.'",
"Fixed damage per Phase.",
"Fixed resizing window with no background error.",
"Fixed 'Always Show player' on ascending sort direction.",
"Added more foods into the Ready Check plugin.",
"Fixed some issues with the coach fearure.",
{"v9.0.2.8154.144", "January 14th, 2021"},
"Added total damage bars into the player list in the Breakdown window.",
"Added 'Square' or 'Roll' mode to Details! Streamer plugin, to change the statusbar mode to Squares, visit the options panel for the plugin.",
"Added Binding Shot to crowd control (Hunter)",
"Merged all whirlwind damage (Warrior).",
"Fixed errors on the 1-10 tutorial levels while playing Demon Hunters.",
"Fixed some cases of DeathLog not showing healing",
"Fixed windows making a group after '/details toggle', while the option to not make groups enabled.",
"Fixed some issues with the custom display 'Potion Used' and 'Health Potion & Stone'.",
"Fixed the breakdown window where using the comparisson tab sometimes made the frame to overlap with the aura tab.",
{"v9.0.2.8001.144", "December 19th, 2020"},
"Added Details! Coach as a new experimental feature, you may want to test using /details coach",
"Coach feature allows the raid leader to stay outside the raid while seeing in real time player deaths and damage information.",
"Fixed issues with some raid encounters in Castle Nathria.",
"Druid Kyrian Spirits ability now has some rules to credit the druid for damage and heal.",
"Several small bug fixes has been done.",
{"v9.0.1.8001.144", "November 30rd, 2020"},
"Added back the report to bnet friend.",
"@Flamanis: fixed issues on custom displays.",
{"v9.0.1.7950.144", "November 3rd, 2020"},
"Added the baseline for the Coach feature, for testing use '/details coach', all users in the raid must have details! up to date.",
"Added container_spells:GetOrCreateSpell(id, shouldCreate, token).",
"Added Details:GetRaidLeader(), return the RL name.",
"Fixed Tiny Threat not showing threat.",
"Fixed annoucement interrupt enable toggle checkbox was reseting on logon.",
{"v9.0.1.7938.142", "October 29th, 2020"},
"Added option to select the icon buttons in the title bar.",
{"v9.0.1.7739.142", "August 18th, 2020"},
"More development on the new plugin Cast Timeline.",
"More development on Details! Scroll Damage.",
"Added options to opt-out show pets on solo play.",
"Added back Profiles and Plugins into the options panel.",
"Many framework fixes from retail ported to shadowlands.",
{"v9.0.1.7721.142", "August 14th, 2020"},
"Encounter time in the title bar got new code and might work now for some people that had issues with it.",
"Fixed an error with the Welcome Window showing errors.",
"Statusbar got fixed, it should now show it's widgets normally.",
"Alignment for the title bar text also got fixed.",
{"v9.0.1.7707.142", "August 11th, 2020"},
"While in The Concil of Blood, Details! now deletes the damage done to alive bosses when one of them dies. This condition can be turned off with /run Details.exp90temp.delete_damage_TCOB = false",
"Many Important Npcs like Jaina and Thrall shows as group members of your group.",
"More progress on the options panel overhaul.",
"General bug fixes.",
{"v9.0.1.7590.142", "July 31th, 2020"},
"New options panel in progress",
"Added options for the 'Inline' right texts in the window",
"General round of fixes",
{"v9.0.1.7544.142", "July 25th, 2020"},
"Changed texts alignment to be parallel.",
"Changed icons to white color.",
"Added player list on the Player Breakdown Window.",
"Added a new plugin: 'Cast Timeline' available at the Player Breakdown Window.",
"Added macro '/Details me' to open your Breakdown Window.",
}
local newsString = "|cFFF1F1F1"
@@ -325,7 +136,11 @@ do
local date = line[2]
newsString = newsString .. "|cFFFFFF00" .. version .. " (|cFFFF8800" .. date .. "|r):|r\n\n"
else
newsString = newsString .. "|cFFFFFF00-|r " .. line .. "\n\n"
if (line ~= "") then
newsString = newsString .. "|cFFFFFF00-|r " .. line .. "\n\n"
else
newsString = newsString .. " \n"
end
end
end
@@ -980,15 +795,16 @@ do
SharedMedia:Register("font", "Harry P", [[Interface\Addons\Details\fonts\HARRYP__.TTF]])
SharedMedia:Register("font", "FORCED SQUARE", [[Interface\Addons\Details\fonts\FORCED SQUARE.ttf]])
SharedMedia:Register("sound", "d_gun1", [[Interface\Addons\Details\sounds\sound_gun2.ogg]])
SharedMedia:Register("sound", "d_gun2", [[Interface\Addons\Details\sounds\sound_gun3.ogg]])
SharedMedia:Register("sound", "d_jedi1", [[Interface\Addons\Details\sounds\sound_jedi1.ogg]])
SharedMedia:Register("sound", "d_whip1", [[Interface\Addons\Details\sounds\sound_whip1.ogg]])
SharedMedia:Register("sound", "Details Gun1", [[Interface\Addons\Details\sounds\sound_gun2.ogg]])
SharedMedia:Register("sound", "Details Gun2", [[Interface\Addons\Details\sounds\sound_gun3.ogg]])
SharedMedia:Register("sound", "Details Jedi1", [[Interface\Addons\Details\sounds\sound_jedi1.ogg]])
SharedMedia:Register("sound", "Details Whip1", [[Interface\Addons\Details\sounds\sound_whip1.ogg]])
SharedMedia:Register("sound", "Details Horn", [[Interface\Addons\Details\sounds\Details Horn.ogg]])
SharedMedia:Register("sound", "Details Threat Warning Volume 1", [[Interface\Addons\Details\sounds\threat_warning_1.ogg]])
SharedMedia:Register("sound", "Details Threat Warning Volume 2", [[Interface\Addons\Details\sounds\threat_warning_2.ogg]])
SharedMedia:Register("sound", "Details Threat Warning Volume 3", [[Interface\Addons\Details\sounds\threat_warning_3.ogg]])
SharedMedia:Register("sound", "Details Threat Warning Volume 4", [[Interface\Addons\Details\sounds\threat_warning_4.ogg]])
SharedMedia:Register("sound", "Details Warning", [[Interface\Addons\Details\sounds\Details Warning 100.ogg]])
--SharedMedia:Register("sound", "Details Warning (Volume 75%)", [[Interface\Addons\Details\sounds\Details Warning 75.ogg]])
--SharedMedia:Register("sound", "Details Warning Volume 50%", [[Interface\Addons\Details\sounds\Details Warning 50.ogg]])
--SharedMedia:Register("sound", "Details Warning Volume 25%", [[Interface\Addons\Details\sounds\Details Warning 25.ogg]])
@@ -1004,6 +820,14 @@ do
end
function dumpt(value) --[[GLOBAL]]
--check if this is a spellId
local spellId = tonumber(value)
if (spellId) then
local spellInfo = {GetSpellInfo(spellId)}
if (type(spellInfo[1]) == "string") then
return Details:Dump(spellInfo)
end
end
return Details:Dump(value)
end
+1
View File
@@ -2,6 +2,7 @@
local _detalhes = _G._detalhes
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
local _
local addonName, Details222 = ...
--[[global]] DETAILS_TOTALS_ONLYGROUP = true
+11 -2
View File
@@ -1,7 +1,7 @@
local _detalhes = _G._detalhes
local _
local _ = nil
_detalhes.custom_function_cache = {}
local addonName, Details222 = ...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--local pointers
@@ -1160,6 +1160,14 @@
end
end
function Details222.GetCustomDisplayIDByName(customDisplayName)
for customDisplayID, customObject in ipairs(_detalhes.custom) do
if (customObject.name == customDisplayName) then
return customDisplayID
end
end
end
function _detalhes:AddDefaultCustomDisplays()
local PotionUsed = {
@@ -2258,6 +2266,7 @@
local DynamicOverallDamage = {
name = Loc ["STRING_CUSTOM_DYNAMICOVERAL"], --"Dynamic Overall Damage",
displayName = Loc ["STRING_ATTRIBUTE_DAMAGE_DONE"],
icon = [[Interface\Buttons\Spell-Reset]],
attribute = false,
spellid = false,
+4 -10
View File
@@ -3,8 +3,9 @@
local Details = _G.Details
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
local Translit = LibStub("LibTranslit-1.0")
local gump = Details.gump
local _
local gump = Details.gump
local _ = nil
local addonName, Details222 = ...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--local pointers
@@ -13,12 +14,10 @@
local _math_floor = math.floor --lua local
local _table_sort = table.sort --lua local
local tinsert = table.insert --lua local
local _table_size = table.getn --lua local
local setmetatable = setmetatable --lua local
local _getmetatable = getmetatable --lua local
local ipairs = ipairs --lua local
local pairs = pairs --lua local
local rawget= rawget --lua local
local _math_min = math.min --lua local
local _math_max = math.max --lua local
local abs = math.abs --lua local
@@ -39,15 +38,10 @@
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--constants
local alvo_da_habilidade = Details.alvo_da_habilidade
local container_habilidades = Details.container_habilidades
local container_combatentes = Details.container_combatentes
local atributo_damage = Details.atributo_damage
local atributo_misc = Details.atributo_misc
local habilidade_dano = Details.habilidade_dano
local container_damage_target = Details.container_type.CONTAINER_DAMAGETARGET_CLASS
local container_damage = Details.container_type.CONTAINER_DAMAGE_CLASS
local container_friendlyfire = Details.container_type.CONTAINER_FRIENDLYFIRE
local modo_GROUP = Details.modos.group
local modo_ALL = Details.modos.all
@@ -1630,7 +1624,7 @@ end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--main refresh function
function atributo_damage:RefreshWindow (instancia, combatObject, forcar, exportar, refreshRequired)
function atributo_damage:RefreshWindow(instancia, combatObject, forcar, exportar, refreshRequired)
local showing = combatObject[class_type] --o que esta sendo mostrado -> [1] - dano [2] - cura --pega o container com ._NameIndexTable ._ActorTable
--not have something to show
+1
View File
@@ -1,5 +1,6 @@
do
local _detalhes = _G._detalhes
local addonName, Details222 = ...
local _error = {
["error"] = true,
+8 -12
View File
@@ -1,6 +1,13 @@
local _detalhes = _G._detalhes
local _
local addonName, Details222 = ...
local AceLocale = LibStub("AceLocale-3.0")
local Loc = AceLocale:GetLocale ( "Details" )
local Translit = LibStub("LibTranslit-1.0")
--lua locals
local _cstr = string.format
local _math_floor = math.floor
local setmetatable = setmetatable
local pairs = pairs
@@ -10,7 +17,6 @@ local type = type
local _table_sort = table.sort
local _cstr = string.format
local tinsert = table.insert
local _bit_band = bit.band
local _math_min = math.min
local _math_ceil = math.ceil
--api locals
@@ -18,18 +24,8 @@ local GetSpellInfo = GetSpellInfo
local _GetSpellInfo = _detalhes.getspellinfo
local IsInRaid = IsInRaid
local IsInGroup = IsInGroup
local _UnitName = UnitName
local GetNumGroupMembers = GetNumGroupMembers
local _string_replace = _detalhes.string.replace --details api
local _detalhes = _G._detalhes
local _
local AceLocale = LibStub("AceLocale-3.0")
local Loc = AceLocale:GetLocale ( "Details" )
local Translit = LibStub("LibTranslit-1.0")
local gump = _detalhes.gump
local alvo_da_habilidade = _detalhes.alvo_da_habilidade
+29 -9
View File
@@ -6,7 +6,6 @@ local type= type --lua local
local ipairs = ipairs --lua local
local pairs = pairs --lua local
local _math_floor = math.floor --lua local
local abs = math.abs --lua local
local _table_remove = table.remove --lua local
local _getmetatable = getmetatable --lua local
local setmetatable = setmetatable --lua local
@@ -14,27 +13,23 @@ local _string_len = string.len --lua local
local _unpack = unpack --lua local
local _cstr = string.format --lua local
local _SendChatMessage = SendChatMessage --wow api locals
local _GetChannelName = GetChannelName --wow api locals
local _UnitExists = UnitExists --wow api locals
local _UnitName = UnitName --wow api locals
local _UnitIsPlayer = UnitIsPlayer --wow api locals
local _UnitGroupRolesAssigned = DetailsFramework.UnitGroupRolesAssigned --wow api locals
local _detalhes = _G._detalhes
local _
local addonName, Details222 = ...
local gump = _detalhes.gump
local historico = _detalhes.historico
local modo_raid = _detalhes._detalhes_props["MODO_RAID"]
local modo_alone = _detalhes._detalhes_props["MODO_ALONE"]
local modo_grupo = _detalhes._detalhes_props["MODO_GROUP"]
local modo_all = _detalhes._detalhes_props["MODO_ALL"]
local _
local atributos = _detalhes.atributos
local sub_atributos = _detalhes.sub_atributos
local segmentos = _detalhes.segmentos
--STARTUP reativa as instancias e regenera as tabelas das mesmas
function _detalhes:RestartInstances()
@@ -2301,6 +2296,29 @@ function _detalhes:TrocaTabela(instancia, segmento, atributo, sub_atributo, inic
_detalhes:Msg("invalid attribute, switching to damage done.")
end
if (Details.auto_swap_to_dynamic_overall and Details.in_combat and UnitAffectingCombat("player")) then
if (segmento >= 0) then
if (atributo == 5) then
local dynamicOverallDataCustomID = Details222.GetCustomDisplayIDByName(Loc["STRING_CUSTOM_DYNAMICOVERAL"])
if (dynamicOverallDataCustomID == sub_atributo) then
atributo = 1
sub_atributo = 1
end
end
elseif (segmento == -1) then
if (atributo == 1) then
if (sub_atributo == 1) then
local dynamicOverallDataCustomID = Details222.GetCustomDisplayIDByName(Loc["STRING_CUSTOM_DYNAMICOVERAL"])
if (dynamicOverallDataCustomID) then
atributo = 5
sub_atributo = dynamicOverallDataCustomID
end
end
end
end
end
--Muda o segmento caso necessrio
if (segmento ~= current_segmento or _detalhes.initializing or iniciando_instancia) then
--na troca de segmento, conferir se a instancia esta frozen
@@ -2419,6 +2437,7 @@ function _detalhes:TrocaTabela(instancia, segmento, atributo, sub_atributo, inic
_detalhes.popup:Select(2, instancia.sub_atributo, atributo)
end
--DEPRECATED
if (_detalhes.cloud_process) then
if (_detalhes.debug) then
_detalhes:Msg("(debug) instancia #"..instancia.meu_id.." found cloud process.")
@@ -2426,7 +2445,7 @@ function _detalhes:TrocaTabela(instancia, segmento, atributo, sub_atributo, inic
local atributo = instancia.atributo
local time_left = (_detalhes.last_data_requested+7) - _detalhes._tempo
if (atributo == 1 and _detalhes.in_combat and not _detalhes:CaptureGet("damage") and _detalhes.host_by) then
if (_detalhes.debug) then
_detalhes:Msg("(debug) instancia need damage cloud.")
@@ -2446,7 +2465,7 @@ function _detalhes:TrocaTabela(instancia, segmento, atributo, sub_atributo, inic
else
time_left = nil
end
if (time_left) then
if (_detalhes.debug) then
_detalhes:Msg("(debug) showing instance alert.")
@@ -2454,6 +2473,7 @@ function _detalhes:TrocaTabela(instancia, segmento, atributo, sub_atributo, inic
instancia:InstanceAlert (Loc ["STRING_PLEASE_WAIT"], {[[Interface\COMMON\StreamCircle]], 22, 22, true}, time_left)
end
end
--END OF DEPRECATED
_detalhes:InstanceCall(_detalhes.CheckPsUpdate)
_detalhes:SendEvent("DETAILS_INSTANCE_CHANGEATTRIBUTE", nil, instancia, atributo, sub_atributo)
+1 -4
View File
@@ -7,10 +7,6 @@ local tinsert = table.insert
local setmetatable = setmetatable
local ipairs = ipairs
local pairs = pairs
local rawget= rawget
local _math_min = math.min
local _math_max = math.max
local _bit_band = bit.band
local _unpack = unpack
local type = type
--api locals
@@ -25,6 +21,7 @@ local _detalhes = _G._detalhes
local AceLocale = LibStub("AceLocale-3.0")
local Loc = AceLocale:GetLocale ( "Details" )
local _
local addonName, Details222 = ...
local gump = _detalhes.gump
+1
View File
@@ -1,6 +1,7 @@
-- damage ability file
local _detalhes = _G._detalhes
local _
local addonName, Details222 = ...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--local pointers
+2 -1
View File
@@ -2,7 +2,8 @@
local _detalhes = _G._detalhes
local _
local addonName, Details222 = ...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--constants
+1
View File
@@ -2,6 +2,7 @@
local _detalhes = _G._detalhes
local _
local addonName, Details222 = ...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--local pointers
+1
View File
@@ -1,6 +1,7 @@
-- misc ability file
local _detalhes = _G._detalhes
local _
local addonName, Details222 = ...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--local pointers
+1 -22
View File
@@ -2,14 +2,9 @@
local _cstr = string.format
local _math_floor = math.floor
local tinsert = table.insert
local _table_size = table.getn
local ipairs = ipairs
local pairs = pairs
local rawget= rawget
local min = math.min
local _math_max = math.max
local abs = math.abs
local _bit_band = bit.band
local unpack = unpack
local type = type
--api locals
@@ -18,7 +13,6 @@ local GameTooltip = GameTooltip
local IsInRaid = IsInRaid
local IsInGroup = IsInGroup
local GetNumGroupMembers = GetNumGroupMembers
local _GetNumSubgroupMembers = GetNumSubgroupMembers
local _UnitAura = UnitAura
local UnitGUID = UnitGUID
local _UnitName = UnitName
@@ -32,39 +26,24 @@ local _detalhes = _G._detalhes
local Details = _detalhes
local AceLocale = LibStub("AceLocale-3.0")
local Loc = AceLocale:GetLocale ( "Details" )
local addonName, Details222 = ...
local gump = _detalhes.gump
local _
local alvo_da_habilidade = _detalhes.alvo_da_habilidade
local container_habilidades = _detalhes.container_habilidades
local container_combatentes = _detalhes.container_combatentes
local container_pets = _detalhes.container_pets
local atributo_misc = _detalhes.atributo_misc
local habilidade_misc = _detalhes.habilidade_misc
local container_damage_target = _detalhes.container_type.CONTAINER_DAMAGETARGET_CLASS
local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC
local container_misc = _detalhes.container_type.CONTAINER_MISC_CLASS
local container_misc_target = _detalhes.container_type.CONTAINER_ENERGYTARGET_CLASS
local modo_GROUP = _detalhes.modos.group
local modo_ALL = _detalhes.modos.all
local class_type = _detalhes.atributos.misc
local DATA_TYPE_START = _detalhes._detalhes_props.DATA_TYPE_START
local DATA_TYPE_END = _detalhes._detalhes_props.DATA_TYPE_END
local div_abre = _detalhes.divisores.abre
local div_fecha = _detalhes.divisores.fecha
local div_lugar = _detalhes.divisores.colocacao
local ToKFunctions = _detalhes.ToKFunctions
local SelectedToKFunction = ToKFunctions[1]
local UsingCustomLeftText = false
local UsingCustomRightText = false
local FormatTooltipNumber = ToKFunctions[8]
local TooltipMaximizedMethod = 1
local info = _detalhes.playerDetailWindow
+1
View File
@@ -4,6 +4,7 @@
local Details = _G.Details
local DF = _G.DetailsFramework
local _
local addonName, Details222 = ...
local CONST_CLIENT_LANGUAGE = DF.ClientLanguage
+2 -1
View File
@@ -1,6 +1,8 @@
local _detalhes = _G._detalhes
local gump = _detalhes.gump
local container_pets = _detalhes.container_pets
local _
local addonName, Details222 = ...
-- api locals
local UnitGUID = _G.UnitGUID
@@ -14,7 +16,6 @@ local GetNumGroupMembers = _G.GetNumGroupMembers
local setmetatable = setmetatable
local _bit_band = bit.band --lua local
local pairs = pairs
local ipairs = ipairs
local wipe = table.wipe
--details locals
+3
View File
@@ -6,6 +6,9 @@ local tinsert = table.insert
local wipe = table.wipe
local Details = _G._detalhes
local _
local addonName, Details222 = ...
local combatClass = Details.combate
local segmentClass = Details.historico
local timeMachine = Details.timeMachine
+1
View File
@@ -2,6 +2,7 @@
local _detalhes = _G._detalhes
local _
local addonName, Details222 = ...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--local pointers
+1
View File
@@ -12,6 +12,7 @@
local _detalhes = _G._detalhes
local _
local addonName, Details222 = ...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--local pointers
+2 -1
View File
@@ -5,7 +5,8 @@
local _detalhes = _G._detalhes
local _
local addonName, Details222 = ...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--local pointers
+4 -1
View File
@@ -6,9 +6,10 @@
--values added into 'instance_skin_ignored_values' won't be passed when the user exports the profile or exports the skin individually.
local _detalhes = _G._detalhes
local SharedMedia = LibStub:GetLibrary("LibSharedMedia-3.0")
local addonName, Details222 = ...
local _ = nil
function _detalhes:ResetInstanceConfig (maintainsnap)
for key, value in pairs(_detalhes.instance_defaults) do
@@ -157,6 +158,8 @@ _detalhes.instance_defaults = {
menu_icons_alpha = 1,
--blackwhiite icons
desaturated_menu = false, --mode segment attribute report
--menu icons color
menu_icons_color = {1, 1, 1},
--icons on menu
menu_icons = {true, true, true, true, true, false, space = -2, shadow = false}, --mode segment attribute report reset close
--menu icons size multiplicator factor
+1
View File
@@ -5,6 +5,7 @@
local SharedMedia = LibStub:GetLibrary("LibSharedMedia-3.0")
local _tempo = time()
local _
local addonName, Details222 = ...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--local pointers
+30
View File
@@ -9,6 +9,7 @@ local floor = floor
local GetNumGroupMembers = GetNumGroupMembers
local CONST_INSPECT_ACHIEVEMENT_DISTANCE = 1 --Compare Achievements, 28 yards
local CONST_SPELLBOOK_GENERAL_TABID = 1
local CONST_SPELLBOOK_CLASSSPELLS_TABID = 2
local storageDebug = false --remember to turn this to false!
@@ -2968,6 +2969,35 @@ function Details.GenerateSpecSpellList()
end)
end
function Details.GenerateRacialSpellList()
local racialsSpells = "|n"
local locClassName, unitClass = UnitClass("player")
local locPlayerRace, playerRace, playerRaceId = UnitRace("player")
--get general spells from the spell book
local tabName, tabTexture, offset, numSpells, isGuild, offspecId = GetSpellTabInfo(CONST_SPELLBOOK_GENERAL_TABID)
offset = offset + 1
local tabEnd = offset + numSpells
for entryOffset = offset, tabEnd - 1 do
local spellType, spellId = GetSpellBookItemInfo(entryOffset, "player")
if (spellId) then
local spell = Spell:CreateFromSpellID(spellId)
local subSpellName = spell:GetSpellSubtext()
if (subSpellName == "Racial") then
spellId = C_SpellBook.GetOverrideSpell(spellId)
local spellName = GetSpellInfo(spellId)
local isPassive = IsPassiveSpell(entryOffset, "player")
if (spellName and not isPassive) then
local cooldownTime = floor(GetSpellBaseCooldown(spellId) / 1000)
racialsSpells = racialsSpells .. "[" .. spellId .. "] = {cooldown = " .. cooldownTime .. ", duration = 0, specs = {}, talent = false, charges = 1, raceid = " .. playerRaceId .. ", race = \"".. playerRace .."\", class = \"\", type = 9}, --" .. spellName .. " (" .. playerRace .. ")|n"
end
end
end
end
racialsSpells = racialsSpells .. "|n"
dumpt(racialsSpells)
end
--fill the passed table with spells from talents and spellbook, affect only the active spec
function Details.FillTableWithPlayerSpells(completeListOfSpells)
local specId, specName, _, specIconTexture = GetSpecializationInfo(GetSpecialization())
+89 -65
View File
@@ -2,11 +2,7 @@
local _detalhes = _G._detalhes
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
local _tempo = time()
local _
local DetailsFramework = DetailsFramework
local isTBC = DetailsFramework.IsTBCWow()
local isWOTLK = DetailsFramework.IsWotLKWow()
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--local pointers
@@ -33,10 +29,15 @@
local _UnitGroupRolesAssigned = DetailsFramework.UnitGroupRolesAssigned
local _GetSpellInfo = _detalhes.getspellinfo
local isWOTLK = DetailsFramework.IsWotLKWow()
local _tempo = time()
local _, Details222 = ...
_ = nil
local escudo = _detalhes.escudos --details local
local parser = _detalhes.parser --details local
local absorb_spell_list = _detalhes.AbsorbSpells --details local
local trinketData = {}
local cc_spell_list = DetailsFramework.CrowdControlSpells
local container_habilidades = _detalhes.container_habilidades --details local
@@ -186,12 +187,9 @@
}
--spellIds override
local override_spellId
local override_spellId = {}
if (isTBC) then
override_spellId = {}
elseif (isWOTLK) then
if (isWOTLK) then
override_spellId = {
--Scourge Strike
[55090] = 55271,
@@ -314,7 +312,6 @@
--tbc spell caches
local TBC_PrayerOfMendingCache = {}
local TBC_EarthShieldCache = {}
local TBC_LifeBloomLatestHeal
local TBC_JudgementOfLightCache = {
_damageCache = {}
}
@@ -440,8 +437,8 @@
--in combat flag
local _in_combat = false
local _current_encounter_id
local _is_storing_cleu = false
local _in_resting_zone = false
local _global_combat_counter = 0
--deathlog
local _death_event_amt = 16
@@ -515,7 +512,7 @@
Details.SpecialSpellActorsName = {}
--add sanguine affix
if (not isTBC) then
if (not isWOTLK) then
if (Details.SanguineHealActorName) then
Details.SpecialSpellActorsName[Details.SanguineHealActorName] = SPELLID_SANGUINE_HEAL
end
@@ -913,7 +910,7 @@
end
--end
if (isTBC or isWOTLK) then
if (isWOTLK) then
--is the target an enemy with judgement of light?
if (TBC_JudgementOfLightCache[alvo_name] and false) then
--store the player name which just landed a damage
@@ -941,9 +938,9 @@
if (_detalhes.encounter_table.id and _detalhes.encounter_table["start"] >= GetTime() - 3 and _detalhes.announce_firsthit.enabled) then
local link
if (spellid <= 10) then
link = GetSpellInfo(spellid)
link = _GetSpellInfo(spellid)
else
link = GetSpellLink(spellid)
link = _GetSpellInfo(spellid)
end
if (_detalhes.WhoAggroTimer) then
@@ -1395,9 +1392,31 @@
end
end
if (_is_storing_cleu) then
_current_combat_cleu_events [_current_combat_cleu_events.n] = {_tempo, _token_ids [token] or 0, who_name, alvo_name or "", spellid, amount}
_current_combat_cleu_events.n = _current_combat_cleu_events.n + 1
if (trinketData[spellid] and _in_combat) then
local thisData = trinketData[spellid]
if (thisData.lastCombatId == _global_combat_counter) then
if (thisData.lastPlayerName == who_name) then
if (thisData.lastActivation < (time - 40)) then
local cooldownTime = time - thisData.lastActivation
thisData.totalCooldownTime = thisData.totalCooldownTime + cooldownTime
thisData.activations = thisData.activations + 1
thisData.lastActivation = time
thisData.averageTime = floor(thisData.totalCooldownTime / thisData.activations)
if (cooldownTime < thisData.minTime) then
thisData.minTime = cooldownTime
end
if (cooldownTime > thisData.maxTime) then
thisData.maxTime = cooldownTime
end
end
end
else
thisData.lastCombatId = _global_combat_counter
thisData.lastActivation = time
thisData.lastPlayerName = who_name
end
end
return spell_damage_func (spell, alvo_serial, alvo_name, alvo_flags, amount, who_name, resisted, blocked, absorbed, critical, glacing, token, isoffhand, isreflected)
@@ -1925,7 +1944,6 @@
--SUMMON serach key: ~summon |
-----------------------------------------------------------------------------------------------------------------------------------------
function parser:summon (token, time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, alvo_flags2, spellid, spellName)
--[[statistics]]-- _detalhes.statistics.pets_summons = _detalhes.statistics.pets_summons + 1
if (not _detalhes.capture_real ["damage"] and not _detalhes.capture_real ["heal"]) then
@@ -2195,15 +2213,7 @@
cura_efetiva = cura_efetiva + amount - overhealing
end
if (isTBC) then
--life bloom explosion (second part of the heal)
if (spellid == SPELLID_DRUID_LIFEBLOOM_HEAL) then
TBC_LifeBloomLatestHeal = cura_efetiva
return
end
end
if (isTBC or isWOTLK) then
if (isWOTLK) then
--earth shield
if (spellid == SPELLID_SHAMAN_EARTHSHIELD_HEAL) then
--get the information of who placed the buff into this actor
@@ -2431,11 +2441,6 @@
end
end
if (_is_storing_cleu) then
_current_combat_cleu_events [_current_combat_cleu_events.n] = {_tempo, _token_ids [token] or 0, who_name, alvo_name or "", spellid, amount}
_current_combat_cleu_events.n = _current_combat_cleu_events.n + 1
end
if (is_shield) then
--return spell:Add (alvo_serial, alvo_name, alvo_flags, cura_efetiva, who_name, 0, nil, overhealing, true)
return spell_heal_func (spell, alvo_serial, alvo_name, alvo_flags, cura_efetiva, who_name, 0, nil, overhealing, true)
@@ -2564,7 +2569,7 @@
necro_cheat_deaths[who_serial] = true
end
if (isTBC or isWOTLK) then
if (isWOTLK) then
if (SHAMAN_EARTHSHIELD_BUFF[spellid]) then
TBC_EarthShieldCache[alvo_name] = {who_serial, who_name, who_flags}
@@ -2619,7 +2624,7 @@
_detalhes.tabela_pets:Adicionar(alvo_serial, alvo_name, alvo_flags, who_serial, who_name, 0x00000417)
end
if (isTBC or isWOTLK) then --buff applied
if (isWOTLK) then --buff applied
if (spellid == 27162 and false) then --Judgement Of Light
--which player applied the judgement of light on this mob
TBC_JudgementOfLightCache[alvo_name] = {who_serial, who_name, who_flags}
@@ -2856,15 +2861,6 @@
end
end
--buff refresh
if (isTBC) then
if (SHAMAN_EARTHSHIELD_BUFF[spellid]) then
TBC_EarthShieldCache[alvo_name] = {who_serial, who_name, who_flags}
elseif (spellid == SPELLID_PRIEST_POM_BUFF) then
TBC_PrayerOfMendingCache[alvo_name] = {who_serial, who_name, who_flags}
end
end
------------------------------------------------------------------------------------------------
--recording buffs
@@ -2896,7 +2892,7 @@
bargastBuffs[alvo_serial] = (bargastBuffs[alvo_serial] or 0) + 1
end
if (isTBC or isWOTLK) then --buff refresh
if (isWOTLK) then --buff refresh
if (spellid == 27162 and false) then --Judgement Of Light
--which player applied the judgement of light on this mob
TBC_JudgementOfLightCache[alvo_name] = {who_serial, who_name, who_flags}
@@ -3001,23 +2997,6 @@
necro_cheat_deaths[who_serial] = nil
end
if (isTBC) then
--shaman earth shield
if (SHAMAN_EARTHSHIELD_BUFF[spellid]) then
TBC_EarthShieldCache[alvo_name] = nil
end
--druid life bloom
if (spellid == SPELLID_DRUID_LIFEBLOOM_BUFF) then
local healAmount = TBC_LifeBloomLatestHeal
if (healAmount) then
--award the heal to the buff caster name
parser:heal("SPELL_HEAL", time, who_serial, who_name, who_flags, alvo_serial, alvo_name, alvo_flags, alvo_flags2, spellid, spellname, spellschool, healAmount, 0, 0, false, false)
TBC_LifeBloomLatestHeal = nil
end
end
end
--druid kyrian empower bounds (9.0 kyrian covenant - probably remove on 10.0)
if (spellid == SPELLID_KYRIAN_DRUID and alvo_name) then
druid_kyrian_bounds[alvo_name] = nil
@@ -3071,7 +3050,7 @@
who_serial, who_name, who_flags = "", enemyName, 0xa48
end
if (isTBC or isWOTLK) then --buff removed
if (isWOTLK) then --buff removed
if (spellid == 27162 and false) then --Judgement Of Light
TBC_JudgementOfLightCache[alvo_name] = nil
end
@@ -5248,6 +5227,35 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
_detalhes:SchedulePetUpdate(1)
end
local autoSwapDynamicOverallData = function(instance, inCombat)
local mainDisplayGroup, subDisplay = instance:GetDisplay()
local customDisplayAttributeId = 5
--entering in combat, swap to dynamic overall damage
if (inCombat) then
if (mainDisplayGroup == DETAILS_ATTRIBUTE_DAMAGE and subDisplay == DETAILS_SUBATTRIBUTE_DAMAGEDONE) then
local segment = instance:GetSegment()
if (segment == DETAILS_SEGMENTID_OVERALL) then
local dynamicOverallDataCustomID = Details222.GetCustomDisplayIDByName(Loc["STRING_CUSTOM_DYNAMICOVERAL"])
instance:SetDisplay(segment, customDisplayAttributeId, dynamicOverallDataCustomID)
end
end
else
--leaving combat
if (mainDisplayGroup == customDisplayAttributeId) then
local dynamicOverallDataCustomID = Details222.GetCustomDisplayIDByName(Loc["STRING_CUSTOM_DYNAMICOVERAL"])
if (subDisplay == dynamicOverallDataCustomID) then
local segment = instance:GetSegment()
if (segment == DETAILS_SEGMENTID_OVERALL) then
instance:SetDisplay(true, DETAILS_ATTRIBUTE_DAMAGE, DETAILS_SUBATTRIBUTE_DAMAGEDONE)
end
end
end
end
end
function _detalhes.parser_functions:PLAYER_REGEN_DISABLED(...)
C_Timer.After(0, function()
if (not Details.bossTargetAtPull) then
@@ -5260,6 +5268,15 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
end
end)
if (Details.auto_swap_to_dynamic_overall) then
Details:InstanceCall(autoSwapDynamicOverallData, true)
end
Details.combat_id_global = Details.combat_id_global + 1
_global_combat_counter = Details.combat_id_global
trinketData = Details:GetTrinketData()
if (_detalhes.zone_type == "pvp" and not _detalhes.use_battleground_server_parser) then
if (_in_combat) then
_detalhes:SairDoCombate()
@@ -5460,7 +5477,10 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
function _detalhes.parser_functions:CHALLENGE_MODE_START(...)
--send mythic dungeon start event
print("parser event", "CHALLENGE_MODE_START", ...)
if (_detalhes.debug) then
print("parser event", "CHALLENGE_MODE_START", ...)
end
local zoneName, instanceType, difficultyID, difficultyName, maxPlayers, dynamicDifficulty, isDynamic, instanceMapID, instanceGroupSize = GetInstanceInfo()
if (difficultyID == 8) then
_detalhes:SendEvent("COMBAT_MYTHICDUNGEON_START")
@@ -5488,6 +5508,10 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
end
end
if (Details.auto_swap_to_dynamic_overall) then
Details:InstanceCall(autoSwapDynamicOverallData, false)
end
--elapsed combat time
_detalhes.LatestCombatDone = GetTime()
_detalhes.tabela_vigente.CombatEndedAt = GetTime()
@@ -6397,7 +6421,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1
for i = 1, players do
local name, killingBlows, honorableKills, deaths, honorGained, faction, race, rank, class, classToken, damageDone, healingDone, bgRating, ratingChange, preMatchMMR, mmrChange, talentSpec
if (isTBC or isWOTLK) then
if (isWOTLK) then
name, killingBlows, honorableKills, deaths, honorGained, faction, rank, race, class, classToken, damageDone, healingDone, bgRating, ratingChange, preMatchMMR, mmrChange, talentSpec = GetBattlefieldScore(i)
else
name, killingBlows, honorableKills, deaths, honorGained, faction, race, class, classToken, damageDone, healingDone, bgRating, ratingChange, preMatchMMR, mmrChange, talentSpec = GetBattlefieldScore(i)
+552
View File
@@ -0,0 +1,552 @@
--próximo: ao criar uma janela AllInOne, precisa criar uma nova instancia no Details!
--na tabela de configuração precisa dizer que é uma all in one e o details vai chamar esse arquivo pra atualizar
--(ainda aqui) parei atualizando o height da titlebar
--proximo passo: atualizar o resto das propriedade da title bar
--fazer as funcções para setar os valores na titleBar
--verificar se precisa adicionar funcções no mixin dos bottões como SetTexture, SetVertexColor
--tem que fazer a função de ShowWindow() e ToggleWindows()
--fazer a criação do header e fazer o header ser redirecionado (aumentar ou diminuir o tamanho by dragging)
local LibWindow = LibStub("LibWindow-1.1")
local df = DetailsFramework
local detailsFramework = DetailsFramework
local textureCoords = {
show_mainmenu = {0/256, 32/256, 0, 1},
show_segments = {32/256, 64/256, 0, 1},
show_report = {96/256, 128/256, 0, 1},
show_reset = {128/256, 160/256, 0, 1},
show_displays = {66/256, 93/256, 0, 1},
show_close = {160/256, 192/256, 0, 1},
}
--namespace
Details.AllInOneWindow = {
--store the frame of all AllInOne windows, this table does not same with the addon
FramesCreated = {},
WindowsOpened = 0,
--return a table: {{settings}, {settings}, {settings}, {settings}, ...}
GetAllSettings = function()
--setting within profile
return Details.all_in_one_windows
end,
--return the amount of settings by calling the above function and returning the amount of indexes
GetNumSettings = function()
return #Details.AllInOneWindow.GetAllSettings()
end,
--return which will be the next settingID if a new setting is added
GetNextSettingID = function()
return #Details.all_in_one_windows + 1
end,
--return the settingTable of a settingID
GetSettingsByID = function(ID)
return Details.AllInOneWindow.GetAllSettings()[ID]
end,
--add a setting and return the settingID
AddSetting = function(newSettingTable)
local allSettings = Details.AllInOneWindow.GetAllSettings()
allSettings[#allSettings+1] = newSettingTable
return #allSettings
end,
--frames already created on this session
GetAllFrames = function()
return Details.AllInOneWindow.FramesCreated
end,
GetNumFrames = function()
return #Details.AllInOneWindow.GetAllFrames()
end,
GetFrameBySettingID = function(settingId)
local numFramesCreated = Details.AllInOneWindow.GetNumFrames()
for id = 1, numFramesCreated do
local window = Details.AllInOneWindow.GetFrameByID(id)
if (window:GetSettingsID() == settingId) then
return window:GetSettings()
end
end
end,
AddFrame = function(frame)
Details.AllInOneWindow.FramesCreated[#Details.AllInOneWindow.FramesCreated+1] = frame
return #Details.AllInOneWindow.FramesCreated+1
end,
GetFrameByID = function(ID)
return Details.AllInOneWindow.FramesCreated[ID]
end,
RestoreAllWindows = function()
end,
ShowWindow = function(settingId)
end,
HideWindow = function(settingId)
assert(type(settingId) ~= "number", "Details.AllInOneWindow.HideWindow require a number on 'settingId'")
local settings = Details.AllInOneWindow.GetAllSettings()
local windowSetting = settings[settingId]
assert(type(windowSetting) ~= "table", "Details.AllInOneWindow.HideWindow settings not found for settingId: " .. settingId)
if (windowSetting) then
if (windowSetting.isOpened) then
windowSetting.isOpened = false
--get the window being used by this setting
local window = Details.AllInOneWindow.GetFrameBySettingID(settingId)
if (window) then
window:Hide()
end
end
end
end,
HideAllWindows = function()
local numSettings = Details.AllInOneWindow.GetNumSettings()
--table with all the settings for all AllInOne windows in the current profile
local settings = Details.AllInOneWindow.GetAllSettings()
for settingId = 1, numSettings do
local windowSetting = Details.AllInOneWindow.GetSettingsByID(settingId)
if (windowSetting.isOpened) then
Details.AllInOneWindow.HideWindow(settingId)
end
end
end,
ToggleWindows = function()
end,
}
local menuButtonMixin = {
GetSettingName = function(button)
return button.settingName
end,
}
local menuSupportFrameMixin = {
Constructor = function(menuSupportFrame)
menuSupportFrame:SetSize(1, 1)
menuSupportFrame.allButtons = {}
menuSupportFrame:CreateMenuButton("CloseMenu", "show_close")
menuSupportFrame:CreateMenuButton("MainMenu", "show_mainmenu")
menuSupportFrame:CreateMenuButton("SegmentsMenu", "show_segments")
menuSupportFrame:CreateMenuButton("DisplaysMenu", "show_report")
menuSupportFrame:CreateMenuButton("ReportMenu", "show_reset")
menuSupportFrame:CreateMenuButton("ResetMenu", "show_displays")
end,
GetNumButtons = function(supportFrame)
return #supportFrame.allButtons
end,
GetButtonByIndex = function(supportFrame, buttonIndex)
return supportFrame.allButtons[buttonIndex]
end,
CreateMenuButton = function(supportFrame, name, settingName)
local newButton = CreateFrame("button", "$parent" .. name, supportFrame)
newButton:SetSize(20, 20)
newButton:SetScale(1)
supportFrame.allButtons[#supportFrame.allButtons+1] = newButton
df:Mixin(newButton, menuButtonMixin)
newButton.settingName = settingName
return newButton
end,
Refresh = function(supportFrame)
local window = supportFrame:GetParent():GetParent()
--problem: it is getting the settings from the AllInOneWindow settings, it should get from Details! default window settings
--this settings should return the regular window setting from Details! on _detalhes.tabela_instancias[windowId]
local settings = window:GetSettings().titlebar.menu_buttons
supportFrame:ClearAllPoints()
supportFrame:SetSize(1, 1)
supportFrame:SetScale(settings.scale)
supportFrame:SetAlpha(settings.alpha)
--buttons currently allowed to show by the user settings
local allShownButtons = {}
for i = 1, supportFrame:GetNumButtons() do
local button = supportFrame:GetButtonByIndex(i)
if (settings[button:GetSettingName()]) then
allShownButtons[#allShownButtons+1] = button
button:Show()
df:SetRegularButtonTexture(button, settings.texture_file, textureCoords[button:GetSettingName()])
df:SetRegularButtonVertexColor(button, settings.color)
else
button:Hide()
end
end
--hardcoded to place the menu buttons in the left side of the window
--if needed this can be "right" with the header leave space for it
local attachPoint = "left"
if (settings.alignment == "horizontal") then
--make it attach to the left side of the title bar or the right side of the title bar
supportFrame:SetPoint(attachPoint, window.TitleBar, attachPoint, settings.x_offset, settings.y_offset)
local paddingAmount = attachPoint == "left" and settings.padding or (settings.padding * -1)
for i = 1, #allShownButtons do
local button = allShownButtons[i]
if (i ==1) then
button:SetPoint(attachPoint, supportFrame, attachPoint, 0, 0)
else
local previousButton = allShownButtons[i - 1]
local sideToAttach = attachPoint == "left" and "right" or "left"
button:SetPoint(attachPoint, previousButton, sideToAttach, paddingAmount, 0)
end
end
elseif (settings.alignment == "vertical") then
if (attachPoint == "left") then
supportFrame:SetPoint("topright", window.TitleBar, "topleft", settings.x_offset, settings.y_offset)
else
supportFrame:SetPoint("topleft", window.TitleBar, "topright", settings.x_offset, settings.y_offset)
end
--here left == top to bottom | right = bottom to top
local paddingAmount = attachPoint == "left" and settings.padding or (settings.padding * -1)
local attachTo = attachPoint == "left" and "top" or "bottom"
for i = 1, #allShownButtons do
local button = allShownButtons[i]
if (i ==1) then
button:SetPoint(attachTo, supportFrame, attachTo, 0, 0)
else
local previousButton = allShownButtons[i - 1]
local sideToAttach = attachTo == "left" and "bottom" or "top"
button:SetPoint(attachTo, previousButton, sideToAttach, paddingAmount, 0)
end
end
end
end,
}
local titleBarMixin = {
--run when the title bar is created
Constructor = function(titleBar)
titleBar:EnableMouse(false)
--create support frame for control buttons, it also will create the control buttons as children
titleBar:CreateMenuSupportFrame()
--create the elapsed time string
titleBar:CreateCombatTimeString()
titleBar:SetCombatTimeText("02:36") --debug
end,
GetSettings = function(titleBar)
--get the settings from the main window
return titleBar:GetParent():GetSettings()
end,
SetSetting = function()
--this function exists and get overriden by the SetSetting of the window mixin
end,
SetTitleBarHeight = function(titleBar, height)
assert(type(height) == "number", "Invalid height, usage: TitleBar:SetTitleBarHeight(height)")
titleBar:SetHeight(height)
titleBar:SetSetting(height, "titlebar", "height")
titleBar:Refresh()
end,
SetTitleBarTextSize = function(window, size)
if (not size or type(size) ~= "number") then
return
end
df:SetFontSize(window.TitleBar.CombatTime, size)
end,
SetTitleBarTextColor = function(window, color)
local r, g, b, a = df:ParseColor(color)
df:SetFontColor(window.TitleBar.CombatTime, r, g, b, a)
end,
SetTitleBarTextFont = function(window, font)
end,
SetTitleBarTextOutline = function(window, outline)
end,
SetTitleBarTextShadow = function(window, shadow, xOffset, yOffset)
end,
CreateCombatTimeString = function(titleBar)
local combatTimeString = titleBar:CreateFontString("$parentCombatTime", "overlay", "GameFontNormal")
titleBar.CombatTime = combatTimeString
return titleBar.CombatTime
end,
GetCombatTimeString = function(titleBar)
return titleBar.CombatTime
end,
SetCombatTimeText = function(titleBar, combatTime)
local combatTimeString = titleBar:GetCombatTimeString()
if (type(combatTime) == "string") then
combatTimeString:SetText(combatTime)
elseif (type(combatTime) == "number") then
local timeAsString = DetailsFramework:IntegerToTimer(combatTime)
combatTimeString:SetText(timeAsString)
else
--if no valid time passed, clear the timer
combatTimeString:SetText("")
end
end,
Refresh = function(titleBar)
local config = titleBar:GetSettings()
--height
local height = config.titlebar.height
titleBar:SetHeight(height)
local timerShown = config.timer_show
local menuSupportFrame = titleBar:GetMenuSupportFrame()
menuSupportFrame:Update()
--[=[
--height = 20,
timer_show = true,
timer_ignore_openworld = true,
timer_only_encounters = false,
text_size = 10,
text_font = "Friz Quadrata TT",
text_outline = "NONE",
text_shadow = {
enabled = false,
color = {1, 1, 1, 1},
x_offset = 1,
y_offset = -1,
},
--]=]
end,
GetMenuSupportFrame = function(titleBar)
return titleBar.MenuSupportFrame
end,
--menu support frame is the frame which will parent the menu buttons (cogwheel, segments, report button, etc)
CreateMenuSupportFrame = function(titleBar)
local menuSupportFrame = CreateFrame("frame", "$parentMenuSupportFrame", titleBar, "BackdropTemplate")
titleBar.MenuSupportFrame = menuSupportFrame
detailsFramework:Mixin(menuSupportFrame, menuSupportFrameMixin)
menuSupportFrame:Constructor()
return menuSupportFrame
end,
}
local AllInOneWindowMixin = {
SetSetting = function(window, value, ...)
local config = window:GetSettings()
local currentTable = config
local lastKey = ""
for index, key in ipairs({...}) do
if (type(currentTable[key]) == "table") then
currentTable = currentTable[value]
else
lastKey = key
end
end
currentTable[lastKey] = value
end,
IsOpened = function(window)
return Details.AllInOneWindow.GetSettingsByID(window:GetSettingsID()).isOpened
end,
SetWindowSize = function(self, width, height)
end,
GetSettings = function(window)
return window.settings
end,
SetSettingID = function(window, newSettingId)
assert(type(newSettingId) ~= "number", "window.SetSettingID require a number on 'newSettingId'")
local settings = Details.AllInOneWindow.GetSettingsByID(newSettingId)
if (settings) then
window.id = newSettingId
window.settings = settings
else
error("window.SetSettingID could not find a settings for ID " .. newSettingId)
end
end,
GetSettingsID = function(window)
return window.id
end,
CreateTitleBar = function(window)
local titleBar = CreateFrame("frame", "$parentTitleBar", window, "BackdropTemplate")
window.TitleBar = titleBar
df:Mixin(titleBar, titleBarMixin)
titleBar:Constructor()
return titleBar
end,
GetTitleBar = function(window)
return window.TitleBar
end,
Refresh = function(window)
local settingsId = window:GetSettingsID()
local settings = window:GetSettings()
if (not settings.isOpened) then
window:Hide()
return
end
local titleBar = window:GetTitleBar()
titleBar:Refresh()
end,
}
--override
titleBarMixin.SetSetting = AllInOneWindowMixin.SetSetting
local defaultWindowSettings = {
isOpened = true,
libwindow = {},
width = 350, --
height = 150, --
titlebar = {
--done here: all options can be retrived from details! settings
menu_buttons = {},
},
}
--create only the frame for a new window ~newwindow ñewwindow
function Details.AllInOneWindow.CreateFrame(settingId)
--create the new window
local newWindowFrame = CreateFrame("frame", "DetailsNewWindow" .. settingId, UIParent, "BackdropTemplate")
newWindowFrame.id = settingId
df:Mixin(newWindowFrame, AllInOneWindowMixin)
newWindowFrame:SetPoint("center", UIParent, "center", -400, 0)
--create the title bar
newWindowFrame:CreateTitleBar()
--creare header
--create scroll bar
--create resizers
--add the frame to the frame pool
local frameId = Details.AllInOneWindow.AddFrame(newWindowFrame)
return newWindowFrame
end
--[=[
lib window need to be on the AllInOneWindow:Update() so it can register the new libwindow table on profile change
--register on libwindow
LibWindow.RegisterConfig(newWindow, windowSettings.libwindow)
LibWindow.RestorePosition(newWindow)
LibWindow.MakeDraggable(newWindow)
--set the size using the settings
newWindow:SetSize(windowSettings.width, windowSettings.height)
--rnable mouse for click through
newWindow:EnableMouse(true)
--setmovable for locked
newWindow:SetMovable(true)
--title bar position (default on top)
titleBar:SetPoint("topleft", newWindow, "topleft", 0, 0)
titleBar:SetPoint("topright", newWindow, "topright", 0, 0)
--title bar height
titleBar:SetHeight(20)
--combat time position
combatTimeString:SetPoint("left", titleBar, "left", 2, 0)
--]=]
--create the settings for a new window plus the frames
function Details:CreateNewAllInOneWindow()
--get profile settings
local profileSettings = Details:GetSettingsForAll_AllInOneWindows()
--get what is the ID if a new window is added
local nextSettingId = Details.AllInOneWindow.GetNextSettingID()
--copy the settings prototype
local windowSettings = df.table.deploy({}, defaultWindowSettings)
--add the new settings table into the profile where the new window settings are stored
local settingId = Details.AllInOneWindow.AddSetting(windowSettings)
--create window body
local windowFrame = Details.AllInOneWindow.CreateFrame(settingId)
return windowFrame
end
--assuming this will run when the profile is loaded
--used when a profile finished loading
--CURRENT THE ONLY ENTRY POINT
function Details.AllInOneWindow.ReloadAll()
--get the amount of settings
local numSettings = Details.AllInOneWindow.GetNumSettings()
--table with all window frames already created on this session
local framesCreated = Details.AllInOneWindow.GetAllFrames()
--next frame to be used
local frameIndex = 1
for settingId = 1, numSettings do
local windowSetting = Details.AllInOneWindow.GetSettingsByID(settingId)
if (windowSetting.isOpened) then
local windowFrame = framesCreated[frameIndex]
if (not windowFrame) then
windowFrame = Details.AllInOneWindow.CreateFrame(settingId)
end
frameIndex = frameIndex + 1
windowFrame:SetSettingID(settingId)
--setup the frame using the settings
windowFrame:Refresh()
end
end
end
+13 -5
View File
@@ -147,7 +147,7 @@ function Details.AuraTracker.CreatePanel()
local statusBar = DetailsFramework:CreateStatusBar(auraTrackerFrame)
statusBar.text = statusBar:CreateFontString(nil, "overlay", "GameFontNormal")
statusBar.text:SetPoint("left", statusBar, "left", 5, 0)
statusBar.text:SetText("Details! Damage Meter")
statusBar.text:SetText("By Terciob | Part of Details! Damage Meter")
DetailsFramework:SetFontSize(statusBar.text, 11)
DetailsFramework:SetFontColor(statusBar.text, "gray")
@@ -156,8 +156,8 @@ function Details.AuraTracker.CreatePanel()
{text = "", width = 20},
{text = "Aura Name", width = 162},
{text = "Spell Id", width = 100},
{text = "Lua Table", width = 250},
{text = "Points", width = 100},
{text = "Lua Table", width = 200},
{text = "Payload (Points)", width = 296},
}
local headerOptions = {
padding = 2,
@@ -260,6 +260,9 @@ local formatToLuaTable = {
end,
}
--if you need your own table format, override the function below as: function(auraInfo) return "" end
--[[GLOBAL]] DETAILS_AURATRACKER_LUATABLE_FUNC = nil
--[371354] = {[131] = 1, [151] = 2, [174] = 3, [1] = 131, [2] = 151, [3] = 174}, --Phial of the Eye in the Storm
function Details.AuraTracker.RefreshScroll(self, data, offset, totalLines)
@@ -273,8 +276,13 @@ function Details.AuraTracker.RefreshScroll(self, data, offset, totalLines)
line.Icon.texture = auraInfo.icon
line.Name.text = auraInfo.name
line.SpellId.text = auraInfo.spellId
line.LuaTableEntry.text = formatToLuaTable.doFormat5(auraInfo) --doFormat2NoIndex
line.Points.text = formatToLuaTable.doFormat2NoIndexFromCache(auraInfo)
local globalfunc = DETAILS_AURATRACKER_LUATABLE_FUNC
line.LuaTableEntry.text = globalfunc and globalfunc(auraInfo) or formatToLuaTable.doFormat2NoIndex(auraInfo) --doFormat2NoIndex
line.Points.text = formatToLuaTable.doFormat5(auraInfo)
line.Name:SetCursorPosition(0)
line.LuaTableEntry:SetCursorPosition(0)
line.Points:SetCursorPosition(0)
end
end
end
+72 -45
View File
@@ -5,13 +5,20 @@ local DF = _G.DetailsFramework
local openRaidLib = LibStub:GetLibrary("LibOpenRaid-1.0", true)
--namespace
Details.CooldownTracking = {}
Details.CooldownTracking = {
cooldownPanels = {},
}
--return if the cooldown tracker is enabled
--return truen if the cooldown tracker is enabled
function Details.CooldownTracking.IsEnabled()
return Details.ocd_tracker.enabled
end
--return a hash table with all cooldown panels created [filterName] = Frame
function Details.CooldownTracking.GetAllPanels()
return Details.CooldownTracking.cooldownPanels
end
--enable the cooldown tracker
function Details.CooldownTracking.EnableTracker()
Details.ocd_tracker.enabled = true
@@ -31,8 +38,9 @@ function Details.CooldownTracking.DisableTracker()
Details.ocd_tracker.enabled = false
--hide the panel
if (DetailsOnlineCDTrackerScreenPanel) then
DetailsOnlineCDTrackerScreenPanel:Hide()
local allPanels = Details.CooldownTracking.GetAllPanels()
for filterName, frameObject in pairs(allPanels) do
frameObject:Hide()
end
--unregister callbacks
@@ -59,7 +67,13 @@ end
--@unitCooldows: a table with [spellId] = cooldownInfo
--@allUnitsCooldowns: a table containing all units [unitName] = {[spellId] = cooldownInfo}
function Details.CooldownTracking.OnReceiveSingleCooldownUpdate(unitId, spellId, cooldownInfo, unitCooldows, allUnitsCooldowns)
local screenPanel = DetailsOnlineCDTrackerScreenPanel
--TODO: make a function inside lib open raid to get the filters the cooldown is in
--I dont known which panel will be used
--need to get the filter name which that spell belong
--and then check if that filter is enabled
local allPanels = Details.CooldownTracking.GetAllPanels()
local screenPanel = allPanels["main"] --this should be replaced with the cooldown panel
local gotUpdated = false
local unitName = GetUnitName(unitId, true)
@@ -102,8 +116,10 @@ end
--Frames
--hide all bars created
function Details.CooldownTracking.HideAllBars()
for _, bar in ipairs(DetailsOnlineCDTrackerScreenPanel.bars) do
function Details.CooldownTracking.HideAllBars(filterName)
filterName = filterName or "main"
local allPanels = Details.CooldownTracking.GetAllPanels()
for _, bar in ipairs(allPanels[filterName].bars) do
bar:ClearAllPoints()
bar:Hide()
@@ -126,49 +142,56 @@ end
return cooldownFrame
end
local eventFrame = CreateFrame("frame")
eventFrame:RegisterEvent("GROUP_ROSTER_UPDATE")
eventFrame:SetScript("OnShow", function()
eventFrame:RegisterEvent("GROUP_ROSTER_UPDATE")
end)
eventFrame:SetScript("OnHide", function()
eventFrame:UnregisterEvent("GROUP_ROSTER_UPDATE")
end)
eventFrame:SetScript("OnEvent", function(self, event)
if (event == "GROUP_ROSTER_UPDATE") then
if (eventFrame.scheduleRosterUpdate) then
return
end
eventFrame.scheduleRosterUpdate = C_Timer.NewTimer(1, Details.CooldownTracking.RefreshCooldownFrames)
end
end)
--create the screen panel, goes into the UIParent and show cooldowns
function Details.CooldownTracking.CreateScreenFrame()
DetailsOnlineCDTrackerScreenPanel = CreateFrame("frame", "DetailsOnlineCDTrackerScreenPanel", UIParent, "BackdropTemplate")
local screenPanel = DetailsOnlineCDTrackerScreenPanel
screenPanel:Hide()
screenPanel:SetSize(Details.ocd_tracker.width, Details.ocd_tracker.height)
screenPanel:SetPoint("center", 0, 0)
screenPanel:SetBackdrop({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
screenPanel:SetBackdropColor(0, 0, 0, .55)
screenPanel:SetBackdropBorderColor(0, 0, 0, .3)
screenPanel:EnableMouse(true)
function Details.CooldownTracking.CreateScreenFrame(filterName)
filterName = filterName or "main"
local frameName = "DetailsOnlineCDTrackerScreenPanel" .. filterName
local cooldownPanel = CreateFrame("frame", frameName, UIParent, "BackdropTemplate")
cooldownPanel:Hide()
cooldownPanel:SetSize(Details.ocd_tracker.width, Details.ocd_tracker.height)
cooldownPanel:SetPoint("center", 0, 0)
DetailsFramework:ApplyStandardBackdrop(cooldownPanel)
cooldownPanel:EnableMouse(true)
--register on libwindow
local libWindow = LibStub("LibWindow-1.1")
libWindow.RegisterConfig(screenPanel, _detalhes.ocd_tracker.pos)
libWindow.MakeDraggable(screenPanel)
libWindow.RestorePosition(screenPanel)
Details.ocd_tracker.frames[filterName] = Details.ocd_tracker.frames[filterName] or {}
libWindow.RegisterConfig(cooldownPanel, Details.ocd_tracker.frames[filterName])
libWindow.MakeDraggable(cooldownPanel)
libWindow.RestorePosition(cooldownPanel)
screenPanel:RegisterEvent("GROUP_ROSTER_UPDATE")
screenPanel:SetScript("OnShow", function()
screenPanel:RegisterEvent("GROUP_ROSTER_UPDATE")
end)
screenPanel:SetScript("OnHide", function()
screenPanel:UnregisterEvent("GROUP_ROSTER_UPDATE")
end)
cooldownPanel.bars = {}
cooldownPanel.cooldownCache = Details.ocd_tracker.current_cooldowns
cooldownPanel.playerCache = {}
cooldownPanel.statusBarFrameIndex = 1
screenPanel:SetScript("OnEvent", function(self, event)
if (event == "GROUP_ROSTER_UPDATE") then
if (screenPanel.scheduleRosterUpdate) then
return
end
screenPanel.scheduleRosterUpdate = C_Timer.NewTimer(1, Details.CooldownTracking.RefreshCooldownFrames)
end
end)
local allPanels = Details.CooldownTracking.GetAllPanels()
allPanels[filterName] = cooldownPanel
screenPanel.bars = {}
screenPanel.cooldownCache = Details.ocd_tracker.current_cooldowns
screenPanel.playerCache = {}
screenPanel.statusBarFrameIndex = 1
return screenPanel
return cooldownPanel
end
function Details.CooldownTracking.SetupCooldownFrame(cooldownFrame)
local spellIcon = GetSpellTexture(cooldownFrame.spellId)
if (spellIcon) then
@@ -184,8 +207,10 @@ end
function Details.CooldownTracking.ProcessUnitCooldowns(unitId, unitCooldowns, cooldownsOrganized)
if (unitCooldowns) then
local unitInfo = openRaidLib.GetUnitInfo(unitId)
local filterName = false
if (unitInfo) then
local screenPanel = DetailsOnlineCDTrackerScreenPanel
local allPanels = Details.CooldownTracking.GetAllPanels()
local screenPanel = allPanels[filterName or "main"]
for spellId, cooldownInfo in pairs(unitCooldowns) do
--get a bar
local cooldownFrame = Details.CooldownTracking.GetOrCreateNewCooldownFrame(screenPanel, screenPanel.statusBarFrameIndex)
@@ -212,8 +237,9 @@ end
end
--update cooldown frames based on the amount of players in the group or raid
function Details.CooldownTracking.RefreshCooldownFrames()
local screenPanel = DetailsOnlineCDTrackerScreenPanel
function Details.CooldownTracking.RefreshCooldownFrames(filterName)
local allPanels = Details.CooldownTracking.GetAllPanels()
local screenPanel = allPanels[filterName or "main"]
if (not screenPanel) then
screenPanel = Details.CooldownTracking.CreateScreenFrame()
@@ -537,7 +563,8 @@ end
}
DF:BuildMenu(f, generalOptions, 5, -30, 150, true, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template)
generalOptions.always_boxfirst = true
DF:BuildMenu(f, generalOptions, 5, -30, 150, false, options_text_template, options_dropdown_template, options_switch_template, true, options_slider_template, options_button_template)
--cooldown selection
local cooldownProfile = Details.ocd_tracker.cooldowns
+7 -1
View File
@@ -28,6 +28,9 @@ local IsInInstance = _G.IsInInstance
local tokFunctions = Details.ToKFunctions
local _, Details222 = ...
_ = nil
--constants
local baseframe_strata = "LOW"
local defaultBackdropSt = {
@@ -7933,7 +7936,10 @@ function Details:RefreshTitleBarText()
if (instanceMode == DETAILS_MODE_GROUP or instanceMode == DETAILS_MODE_ALL) then
local segment = self:GetSegment()
if (segment == DETAILS_SEGMENTID_OVERALL) then
sName = sName .. " " .. Loc["STRING_OVERALL"]
local dynamicOverallDataCustomID = Details222.GetCustomDisplayIDByName(Loc["STRING_CUSTOM_DYNAMICOVERAL"])
if ((dynamicOverallDataCustomID ~= self.sub_atributo) and self.atributo ~= 5) then
sName = sName .. " " .. Loc["STRING_OVERALL"]
end
elseif (segment >= 2) then
sName = sName .. " [" .. segment .. "]"
+7 -1
View File
@@ -2,12 +2,17 @@
local Details = _G.Details
local Loc = LibStub("AceLocale-3.0"):GetLocale( "Details" )
local gump = Details.gump
local _
local _, Details222 = ...
_ = nil
function Details:OpenNewsWindow(textToShow, dumpValues, keeptext)
Details.latest_news_saw = Details.userversion
local newsFrame = Details:CreateOrOpenNewsWindow()
local animationHub = DetailsFramework:CreateAnimationHub(newsFrame)
local fadeInAnim1 = DetailsFramework:CreateAnimation(animationHub, "alpha", 1, 0.2, 0, 0.2)
local fadeInAnim2 = DetailsFramework:CreateAnimation(animationHub, "alpha", 2, 1.5, 0.5, 1)
fadeInAnim2:SetStartDelay(1.3)
if (dumpValues == "change_log" or textToShow == "LeftButton") then
newsFrame:Text (Loc ["STRING_VERSION_LOG"])
@@ -57,6 +62,7 @@ function Details:OpenNewsWindow(textToShow, dumpValues, keeptext)
end
newsFrame:Show()
animationHub:Play()
end
function Details:CreateOrOpenNewsWindow()
+13 -2
View File
@@ -33,9 +33,9 @@ local Loc = _G.LibStub("AceLocale-3.0"):GetLocale("Details")
local SharedMedia = _G.LibStub:GetLibrary("LibSharedMedia-3.0")
local LDB = _G.LibStub("LibDataBroker-1.1", true)
local LDBIcon = LDB and _G.LibStub("LibDBIcon-1.0", true)
local _
local addonName, Details222 = ...
local _ = nil
local unpack = _G.unpack
local tinsert = _G.tinsert
local startX = 200
@@ -518,6 +518,17 @@ do
desc = Loc ["STRING_OPTIONS_OVERALL_LOGOFF_DESC"],
boxfirst = true,
},
{--auto switch to dynamic overall data when selecting overall data
type = "toggle",
get = function() return _detalhes.auto_swap_to_dynamic_overall end,
set = function(self, fixedparam, value)
Details.auto_swap_to_dynamic_overall = value
afterUpdate()
end,
name = "Use Dynamic Overall Damage",
desc = "When showing Damage Done Overall, swap to Dynamic Overall Damage on entering combat.",
boxfirst = true,
},
{type = "blank"},
+523
View File
@@ -0,0 +1,523 @@
--whenever it say 'CombatID' it is referencing the Details! unique combatId
--whenever it say 'SegmentID' it is referencing the internal chart data registered for some details! combat
local Details = _G.Details
local detailsFramework = _G.DetailsFramework
local addonName, detailsInternal = ...
local CONST_LATEST_SEGMENT = 1
local tinsert = table.insert
local tremove = table.remove
local CONST_TICKER_NAME = "ChartDataTicker"
local CONST_TICKER_INTERVAL = 3
--create the chart object
detailsInternal.Charts = {}
local chartsObject = detailsInternal.Charts
--store all segments data
chartsObject.SegmentsData = {}
--current segment being displayed in the charts
chartsObject.SegmentOnVisualization = 0
--this table will hold the saved variable which tells which infomation to get during combat
chartsObject.DataToCapture = {}
function chartsObject.GetConfigToCaptureData()
return chartsObject.DataToCapture
end
function chartsObject.SetConfigToCaptureData(configTable)
chartsObject.DataToCapture = configTable
end
function chartsObject.GetSavedVariable()
return Details.data_harvested_for_charts
end
function chartsObject.StoreChartsForCurrentCombat()
local savedVariableTable = chartsObject.GetSavedVariable()
--Details.data_harvested_for_charts
end
function chartsObject.BuildPlayersTable(playersTable)
if (IsInRaid()) then
for i = 1, GetNumGroupMembers() do
local unitName = GetUnitName("raid" .. i, true)
playersTable[unitName] = {}
end
elseif (InIsParty()) then
for i = 1, GetNumGroupMembers() - 1 do
local unitName = GetUnitName("party" .. i, true)
playersTable[unitName] = {}
end
playersTable[UnitName("player")] = {}
else
playersTable[UnitName("player")] = {}
end
end
function chartsObject.CreateTableToReceiveChartData()
local t = {}
--get the list of players captures
local configsForCaptureData = chartsObject.GetConfigToCaptureData()
--data set to capture data of each individual player
local playerCaptures = configsForCaptureData.players
--data set to capture data of some combat attribute or totals
local combatTotalCaptures = configsForCaptureData.totals
if (#playerCaptures > 0) then
t.players = {}
for i = 1, #playerCaptures do
local capturePreset = playerCaptures[i]
local playersTable = {}
t.players[capturePreset.name] = playersTable
chartsObject.BuildPlayersTable(playersTable)
end
end
if (#combatTotalCaptures > 0) then
t.totals = {}
for i = 1, #combatTotalCaptures do
local capturePreset = combatTotalCaptures[i]
t.totals[capturePreset.name] = {}
end
end
return t
end
--function to grab data during combat
function chartsObject.Ticker()
if (chartsObject.HasValidAndOpenCombat()) then
--get Details! combat object
local detaisCurrentCombat = Details:GetCurrentCombat()
--get the list of players captures
local configsForCaptureData = chartsObject.GetConfigToCaptureData()
--data set to capture data of each individual player
local playerCaptures = configsForCaptureData.players
--data set to capture data of some combat attribute or totals
local combatTotalCaptures = configsForCaptureData.totals
local currentSegmentData = chartsObject.GetCurrentSegmentData()
local chartData = currentSegmentData.ChartData
if (#playerCaptures > 0) then
--PAREI AQUI, PRECISA PEGAR O CAPTURE NAME, A TABELA COM OS NOMES DOS JOGADORES E PEGAR OS DADOS DO SEGMENTO DO DETAILS!
--DEPOIS TEM QUE FECHAR ISSO AQUI E GRAGAR NO SEGMENT DA CHART
--DEPOIS FAZER O MENU DE SELECIONAR O SEGMENTO MOSTRAR OS SEGMENTOS DO DETAILS PARA SELECIONAR
--POR FIM PROGRAMAR AS CHARTS PRA MOSTRAR OS GRAFICOS
for i = 1, #playerCaptures do
local capturePreset = playerCaptures[i]
local thisCaptureTable = chartData[capturePreset.Name]
t.players[capturePreset.name] = playersTable
chartsObject.BuildPlayersTable(playersTable)
end
end
if (#combatTotalCaptures > 0) then
t.totals = {}
for i = 1, #combatTotalCaptures do
local capturePreset = combatTotalCaptures[i]
t.totals[capturePreset.name] = {}
end
end
for i = 1, #playerCaptures do
local capturePreset = playerCaptures[i]
if (capturePreset.combatObjectSubTable) then
local subTable = detaisCurrentCombat[capturePreset.combatObjectSubTableName]
local value = subTable[capturePreset.combatObjectSubTableKey]
end
end
end
end
--[=[]]
players = {
--damage done by each player
{
name = "Damage of Each Individual Player",
combatObjectContainer = 1,
playerOnly = true,
playerKey = "total",
},
--total damage done by the raid group
{
name = "Damage of All Player Combined",
combatObjectSubTableName = "totals",
combatObjectSubTableKey = 1,
},
},
--]=]
function chartsObject.GetConfigToDataCaptureFromDetailsOptions()
local detailsObject = Details
local configTable = detailsObject.data_harvest_for_charsts
chartsObject.SetConfigToCaptureData(configTable)
end
function chartsObject.StartCombatDataTicker()
detailsInternal.Scheduler.NewTicker(CONST_TICKER_INTERVAL, chartsObject.Ticker, CONST_TICKER_NAME)
end
function chartsObject.StopCombatDataTicker()
detailsInternal.Scheduler.Cancel(CONST_TICKER_NAME)
end
--get a segment combat data
function chartsObject.GetSegmentsCombatData(combatIndex)
return chartsObject.SegmentsData[combatIndex]
end
--get a segment combat data by Details! combatId
function chartsObject.GetSegmentCombatDataByDetailsCombatID(detailsCombatId)
for i = 1, chartsObject.GetNumSegments() do
local thisSegmentCombatData = chartsObject.SegmentsData[i]
if (thisSegmentCombatData.detailsCombatID == detailsCombatId) then
return thisSegmentCombatData
end
end
end
--select a combat to make the chart frames show
function chartsObject.SelectSegmentDataToShow(segmentId)
segmentId = segmentId or CONST_LATEST_SEGMENT
local numSegments = chartsObject.GetNumSegments()
if (numSegments > 0) then
--pre step before calling the function which will signal the frame to update
chartsObject.ChartFramesShowSegment(CONST_LATEST_SEGMENT)
else
chartsObject.ChartFramesClear()
end
end
function chartsObject.ChartFramesClear()
--pre step before calling the function which will signal the frame to update
chartsObject.ChartFramesShowSegment(0)
end
--this function shouldn't be called directly, always call from SelectSegmentDataToShow or ChartFramesClear
function chartsObject.ChartFramesShowSegment(segmentId)
--set the combat data into the charts
chartsObject.SegmentOnVisualization = segmentId
--here go into the frames created and call refresh using the segment data
local segmentCombatData = chartsObject.GetSegmentsCombatData(segmentId)
if (segmentCombatData) then
--this is the lowest function and will call the frame api to refresh the data
else
chartsObject.SegmentOnVisualization = 0
--this is the lowest function and will call the frame api to refresh the data
end
end
--called when Details! reset the data
function chartsObject.ResetSegmentData()
wipe(chartsObject.SegmentsData)
--stop the ticker
chartsObject.StopCombatDataTicker()
--don't allow anything to be process under the start of a new combat
chartsObject.SetCombatState(false)
--signal the frames to update and shown no data
chartsObject.ChartFramesClear()
end
--set the combat state
function chartsObject.SetCombatState(state)
chartsObject.InCombat = state
end
function chartsObject.HasValidAndOpenCombat()
local bCombatState = chartsObject.GetCombatState()
if (bCombatState) then
local detaisCurrentCombat = Details:GetCurrentCombat()
local chartCurrentSegmentData = chartsObject.GetCurrentSegmentData()
if (detaisCurrentCombat:GetCombatId() == chartCurrentSegmentData:GetCombatId()) then
--it's all good
return true
end
end
end
--return true if in combat
function chartsObject.GetCombatState()
return chartsObject.InCombat
end
function chartsObject.RemoveSegmentData(segmentId)
tremove(chartsObject.SegmentsData, segmentId)
chartsObject.SelectSegmentDataToShow(CONST_LATEST_SEGMENT)
end
function chartsObject.GetNumSegments()
return #chartsObject.SegmentsData
end
function chartsObject.GetCurrentSegmentData()
return chartsObject.segmentData
end
--add the new combatData into the first index
local segmentDataMixin = {
GetCombatId = function(self)
return self.detailsCombatID
end,
}
--this is called when the player enter in combat
function chartsObject.CreateNewSegmentData(detailsCombatObject)
chartsObject.segmentData = {
--players Damage for the segment
PlayersDamage = {},
--players Healing for the segment
PlayersHealing = {},
--each index is a boss fight
BossTryDamage = 0,
--blood lust timer
BloodLustTimers = {},
--combatId
detailsCombatID = detailsCombatObject:GetCombatId(),
--charts data captured
ChartData = chartsObject.CreateTableToReceiveChartData(),
}
detailsFramework:Mixin(chartsObject.segmentData, segmentDataMixin)
tinsert(chartsObject.SegmentsData, 1, chartsObject.segmentData)
chartsObject.GetConfigToDataCaptureFromDetailsOptions()
chartsObject.SetCombatState(true)
chartsObject.StartCombatDataTicker()
return chartsObject.segmentData
end
--when a combat is finished, close and store the current combatData
function chartsObject.CloseSegmentData(bIsInvalid)
--in case a combat_invalid passed by here first
if (not chartsObject.GetCombatState()) then
return
end
chartsObject.StopCombatDataTicker()
chartsObject.SetCombatState(false)
local currentCombat = chartsObject.GetSegmentsCombatData(1)
currentCombat.Done = true
if (bIsInvalid) then
currentCombat.Invalid = true
chartsObject.RemoveSegmentData(1)
else
--check if the window is opened and update the chart current in sight
end
end
--Details Events:
function chartsObject.OnDetailsEvent(event, ...)
if (event == "COMBAT_PLAYER_ENTER") then --> combat started
local combatObject = select(1, ...)
if (not combatObject and Details) then
combatObject = Details:GetCurrentCombat()
if (not combatObject) then
return
end
end
chartsObject.CreateNewSegmentData(combatObject)
elseif (event == "COMBAT_PLAYER_LEAVE") then
chartsObject.CloseSegmentData()
elseif (event == "DETAILS_DATA_RESET") then
chartsObject.ResetSegmentData()
elseif (event == "COMBAT_INVALID") then
local bIsInvalid = true
chartsObject.CloseSegmentData(bIsInvalid)
elseif (event == "DETAILS_STARTED") then
--install the new tab on the Player Breakdown
chartsObject.InstallTab()
end
end
local eventListener = Details:CreateEventListener()
eventListener:RegisterEvent("COMBAT_PLAYER_ENTER", chartsObject.OnDetailsEvent)
eventListener:RegisterEvent("COMBAT_PLAYER_LEAVE", chartsObject.OnDetailsEvent)
eventListener:RegisterEvent("DETAILS_DATA_RESET", chartsObject.OnDetailsEvent)
eventListener:RegisterEvent("COMBAT_INVALID", chartsObject.OnDetailsEvent)
eventListener:RegisterEvent("DETAILS_STARTED", chartsObject.OnDetailsEvent)
function chartsObject.InstallTab()
local tabName = "Charts"
local tabNameLoc = "Damage Charts"
local canShowTab = function(tabOBject, playerObject)
local combatObject = Details:GetCombatFromBreakdownWindow()
if (combatObject) then
local chartsCombatData = chartsObject.GetSegmentCombatDataByDetailsCombatID(combatObject:GetCombatId())
if (chartsCombatData) then
return true
end
end
return false
end
local fillTab = function(tab, playerObject, combat)
--update the tab frame with information
end
local createdChartsTab = function(tab, frame)
chartsObject.CreateChartFrames(tab, frame)
end
local iconSettings = {
texture = [[Interface\BUTTONS\UI-GuildButton-OfficerNote-Disabled]],
coords = {0, 1, 0, 1},
width = 16,
height = 16,
}
Details:CreatePlayerDetailsTab(tabName, tabNameLoc, canShowTab, fillTab, nil, createdChartsTab, iconSettings)
end
function chartsObject.CreateChartFrames(tab, tabFrame)
--First Option: each player dps chart on each segment, this show the evolution of damage of each player
--Second Option: Total Damage Done by the entire raid comparing with other segments (one line of raid damage per segment)
--Thrid Option: your damage compared with other of the same class (chart damage of each player required)
--Your habilites compared segment by segment (no chart data required)
--segment scroll in the left
--boss image, boss name,
--when selecting a boss show the chart for the boss
local defaultChartSections = {
{
Name = "Raid Damage",
ChartID = 1,
ChartData = "alldamagers-segment",
},
{
},
}
local scrollWidth = 200
local scrollHeight = 500
local scrollButtonHeight = 20
local amountScrollLines = floor(scrollHeight / scrollButtonHeight)
local allLinesCreated = {}
local lineSelectedBackdropColor = {.5, .5, .5, .5}
local onClickLine_SelectChartToView = function(button, mouseButton)
for buttonId, line in ipairs(allLinesCreated) do
line:SetDefaultBackdropColor()
end
end
local lineMixin = {
SetDefaultBackdropColor = function(line)
line.__background:SetVertexColor(unpack(line.defaultBackgroundColor))
end,
SetSelectedBackdropColor = function(line)
line.__background:SetVertexColor(unpack(lineSelectedBackdropColor))
end,
OnClickLine = function(line)
--select the chart to view
end,
}
--function to create a line in the scroll frame
local createScrollLine = function(self, index)
--create a new line
local line = CreateFrame("button", "$parentLine" .. index, self, "BackdropTemplate")
detailsFramework:Mixin(line, lineMixin)
--set its parameters
line:SetPoint("topleft", self, "topleft", 1, -((index-1) * (scrollButtonHeight+1)) - 1)
line:SetSize(scrollWidth-19, scrollButtonHeight)
line:RegisterForClicks("LeftButtonDown", "RightButtonDown")
line:SetScript("OnClick", line.OnClickLine)
detailsFramework:ApplyStandardBackdrop(line)
line.defaultBackgroundColor = {line.__background:GetVertexColor()}
local icon = line:CreateTexture("$parentSpecIcon", "artwork")
icon:SetSize(scrollButtonHeight, scrollButtonHeight)
icon:SetAlpha(0.71)
local chartData = defaultChartSections[index]
local chartName = detailsFramework:CreateLabel(line, chartData.Name, 11, "white", "GameFontNormal")
icon:SetPoint("left", line, "left", 0, 0)
chartName:SetPoint("topleft", icon, "topright", 2, -3)
line.Icon = icon
line.ChartName = chartName
return line
end
local refreshScroll = function(self, data, offset, totalLines)
for i = 1, totalLines do
local index = i + offset
local chartData = data[index]
if (chartData) then
local line = self:GetLine(i)
line.ChartID = chartData.ChartID
line.ChartData = chartData.ChartData
line.ChartName.text = chartData.Name
end
end
end
--Create the scrollbox showing the selection for charts
local chartSelectionScrollBox = detailsFramework:CreateScrollBox(
tabFrame,
"$parentChartSelectionScroll",
refreshScroll,
{},
scrollWidth,
scrollHeight,
amountScrollLines,
scrollButtonHeight
)
detailsFramework:ReskinSlider(chartSelectionScrollBox)
chartSelectionScrollBox.ScrollBar:ClearAllPoints()
chartSelectionScrollBox.ScrollBar:SetPoint("topright", chartSelectionScrollBox, "topright", -2, -17)
chartSelectionScrollBox.ScrollBar:SetPoint("bottomright", chartSelectionScrollBox, "bottomright", -2, 17)
chartSelectionScrollBox:SetPoint("topright", tabFrame, "topleft", -1, 0)
chartSelectionScrollBox:SetPoint("bottomright", tabFrame, "bottomleft", -1, 0)
detailsFramework:ApplyStandardBackdrop(chartSelectionScrollBox)
tabFrame.chartSelectionScrollBox = chartSelectionScrollBox
--create the scrollbox lines
for i = 1, amountScrollLines do
chartSelectionScrollBox:CreateLine(createScrollLine)
end
end
+55 -31
View File
@@ -2,18 +2,24 @@
local Details = _G.Details
local DF = _G.DetailsFramework
local _
local _, Details222 = ...
_ = nil
local _GetSpellInfo = Details.GetSpellInfo
function Details:ScrollDamage()
if (not DetailsScrollDamage) then
DetailsScrollDamage = DetailsFramework:CreateSimplePanel(UIParent)
DetailsScrollDamage:SetSize(427 - 40 - 20 - 20, 505 - 150 + 20 + 40)
DetailsScrollDamage:SetTitle("Details! Scroll Damage (/details scroll)")
DetailsScrollDamage:SetTitle("/details scroll")
DetailsScrollDamage.Data = {}
DetailsScrollDamage:ClearAllPoints()
DetailsScrollDamage:SetPoint("left", UIParent, "left", 10, 0)
DetailsScrollDamage:Hide()
DetailsScrollDamage.Title:SetPoint("center", DetailsScrollDamage.TitleBar, "center", 108, 0)
DetailsFramework:ApplyStandardBackdrop(DetailsScrollDamage)
local scroll_width = 395 - 40 - 20 - 20
local scroll_height = 340
local scroll_lines = 16
@@ -24,9 +30,12 @@ function Details:ScrollDamage()
local backdrop_color_is_critical = {.4, .4, .2, 0.2}
local backdrop_color_is_critical_on_enter = {1, 1, .8, 0.4}
local dropdownTemplate = DetailsFramework:GetTemplate("dropdown", "OPTIONS_DROPDOWNDARK_TEMPLATE")
local y = -15
local headerY = y - 15
local scrollY = headerY - 20
local fontSize = 10
local LibWindow = _G.LibStub("LibWindow-1.1")
DetailsScrollDamage:SetScript("OnMouseDown", nil)
@@ -43,12 +52,15 @@ function Details:ScrollDamage()
LibWindow.MakeDraggable(DetailsScrollDamage)
LibWindow.RestorePosition(DetailsScrollDamage)
local scaleBar = DetailsFramework:CreateScaleBar(DetailsScrollDamage, Details.damage_scroll_position)
DetailsScrollDamage:SetScale(Details.damage_scroll_position.scale)
--header
local headerTable = {
{text = "", width = 20},
{text = "Spell Name", width = 104},
{text = "Amount", width = 60},
{text = "Time", width = 60},
{text = "Time", width = 45},
{text = "Spell ID", width = 80},
}
local headerOptions = {
@@ -60,7 +72,7 @@ function Details:ScrollDamage()
DetailsScrollDamage.searchText = ""
DetailsScrollDamage.searchCache = {}
local refreshFunc = function(self, data, offset, totalLines)
local refreshFunc = function(self, data, offset, totalLines) --~refresh
local ToK = _detalhes:GetCurrentToKFunction()
for i = 1, totalLines do
@@ -74,13 +86,14 @@ function Details:ScrollDamage()
local spellName, _, spellIcon
if (token ~= "SWING_DAMAGE") then
spellName, _, spellIcon = GetSpellInfo(spellID)
spellName, _, spellIcon = _GetSpellInfo(spellID)
else
spellName, _, spellIcon = GetSpellInfo(1)
spellName, _, spellIcon = _GetSpellInfo(1)
end
line.SpellID = spellID
line.IsCritical = isCritical
line.IconFrame.SpellID = spellID
if (isCritical) then
line:SetBackdropColor(unpack(backdrop_color_is_critical))
@@ -91,11 +104,12 @@ function Details:ScrollDamage()
if (spellName) then
line.Icon:SetTexture(spellIcon)
line.Icon:SetTexCoord(.1, .9, .1, .9)
line.DamageText.text = isCritical and "|cFFFFFF00" .. ToK(_, amount) or ToK(_, amount)
line.TimeText.text = format("%.2f", time - DetailsScrollDamage.Data.Started)
line.DamageText.text = isCritical and "|cFFFFFF00 " .. ToK(_, amount) or " " .. ToK(_, amount)
line.TimeText.text = " " .. format("%.2f", time - DetailsScrollDamage.Data.Started)
line.SpellIDText.text = spellID
line.SpellIDText:SetCursorPosition(0)
line.SpellNameText.text = spellName
DF:TruncateText(line.SpellNameText, 104)
line.SpellNameText:SetCursorPosition(0)
else
line:Hide()
end
@@ -103,41 +117,45 @@ function Details:ScrollDamage()
end
end
local lineOnEnter = function(self)
local lineOnEnter = function(self) --~onenter
--if this does not have IconFrame it means it is the IconFrame itself
if (not self.IconFrame) then
GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT")
GameTooltip:SetSpellByID(self.SpellID)
GameTooltip:AddLine(" ")
GameTooltip:Show()
self = self:GetParent()
end
if (self.IsCritical) then
self:SetBackdropColor(unpack(backdrop_color_is_critical_on_enter))
else
self:SetBackdropColor(unpack(backdrop_color_on_enter))
end
if (self.SpellID) then
--spell tooltip removed, it's to much annoying
--GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT")
--GameTooltip:SetSpellByID(self.SpellID)
--GameTooltip:AddLine(" ")
--GameTooltip:Show()
end
end
local lineOnLeave = function(self)
if (self.IsCritical) then
self:SetBackdropColor(unpack(backdrop_color_is_critical))
else
self:SetBackdropColor(unpack(backdrop_color))
local lineOnLeave = function(self) --~onleave
--if this has an icon frame it means its the line itself
if (self.IconFrame) then
if (self.IsCritical) then
self:SetBackdropColor(unpack(backdrop_color_is_critical))
else
self:SetBackdropColor(unpack(backdrop_color))
end
end
GameTooltip:Hide()
end
local createLineFunc = function(self, index)
local line = CreateFrame("button", "$parentLine" .. index, self,"BackdropTemplate")
line:SetPoint("topleft", self, "topleft", 1, -((index-1)*(scroll_line_height+1)) - 1)
line:SetSize(scroll_width - 2, scroll_line_height)
line:SetBackdrop({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
line:SetBackdropColor(unpack(backdrop_color))
-- ~createline --~line
DF:Mixin(line, DF.HeaderFunctions)
line:SetScript("OnEnter", lineOnEnter)
@@ -147,17 +165,22 @@ function Details:ScrollDamage()
local icon = line:CreateTexture("$parentSpellIcon", "overlay")
icon:SetSize(scroll_line_height - 2, scroll_line_height - 2)
local iconFrame = CreateFrame("frame", "$parentIconFrame", line)
iconFrame:SetAllPoints(icon)
iconFrame:SetScript("OnEnter", lineOnEnter)
iconFrame:SetScript("OnLeave", lineOnLeave)
--spellname
local spellNameText = DF:CreateLabel(line)
local spellNameText = DetailsFramework:CreateTextEntry(line, function()end, DetailsScrollDamage.Header:GetColumnWidth(2), scroll_line_height, _, _, _, dropdownTemplate)
--damage
local damageText = DF:CreateLabel(line)
local damageText = DF:CreateLabel(line, "", fontSize, "white")
--time
local timeText = DF:CreateLabel(line)
local timeText = DF:CreateLabel(line, "", fontSize, "white")
--spell ID
local spellIDText = DF:CreateLabel(line)
local spellIDText = DetailsFramework:CreateTextEntry(line, function()end, DetailsScrollDamage.Header:GetColumnWidth(5), scroll_line_height, _, _, _, dropdownTemplate)
line:AddFrameToHeaderAlignment(icon)
line:AddFrameToHeaderAlignment(spellNameText)
@@ -168,6 +191,7 @@ function Details:ScrollDamage()
line:AlignWithHeader(DetailsScrollDamage.Header, "left")
line.Icon = icon
line.IconFrame = iconFrame
line.DamageText = damageText
line.TimeText = timeText
line.SpellIDText = spellIDText
@@ -251,7 +275,7 @@ function Details:ScrollDamage()
autoOpenCheckbox:SetAsCheckBox()
autoOpenCheckbox:SetPoint("left", statusBar, "left", 5, 0)
local autoOpenText = DetailsFramework:CreateLabel(statusBar, "Auto Open on Training Dummy")
local autoOpenText = DetailsFramework:CreateLabel(statusBar, "Auto Open on Training Dummy", 10)
autoOpenText:SetPoint("left", autoOpenCheckbox, "right", 2, 0)
--search bar
+2
View File
@@ -7,6 +7,8 @@ This is a high level API for Details! Damage Meter
--]=]
local addonName, Details222 = ...
--local helpers
local getCombatObject = function(segmentNumber)
local combatObject
+2 -1
View File
@@ -1,7 +1,8 @@
--[[ Attributes: Damage, Heal, Energy, Miscellaneous ]]
do
do
local _detalhes = _G._detalhes
local addonName, Details222 = ...
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
--Globals
+1
View File
@@ -1,6 +1,7 @@
local Details = _G.Details
local DF = _G.DetailsFramework
local C_Timer = _G.C_Timer
local addonName, Details222 = ...
--auto run scripts
Details.AutoRunCode = {}
+2 -1
View File
@@ -1,7 +1,8 @@
do
do
local _detalhes = _G._detalhes
local addonName, Details222 = ...
_detalhes.EncounterInformation = {}
local ipairs = ipairs --lua local
+1 -1
View File
@@ -1,6 +1,6 @@
local Details = _G.Details
local addonName, Details222 = ...
--get the total of damage and healing of a phase of an encounter
function Details:OnCombatPhaseChanged()
+1
View File
@@ -8,6 +8,7 @@
local _detalhes = _G._detalhes
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
local _
local addonName, Details222 = ...
--initialize buffs name container
_detalhes.Buffs.BuffsTable = {} -- armazenara o [nome do buff] = { tabela do buff }
_detalhes.Buffs.__index = _detalhes.Buffs
+2 -1
View File
@@ -1,7 +1,8 @@
--[[ Declare all Details classes and container indexes ]]
do
do
local _detalhes = _G._detalhes
local addonName, Details222 = ...
local setmetatable = setmetatable
-------- container que armazena o cache de pets
_detalhes.container_pets = {}
+1
View File
@@ -1,5 +1,6 @@
local Details = _G.Details
local addonName, Details222 = ...
--stop yellow warning on my editor
local IsInRaid = _G.IsInRaid
+1
View File
@@ -1,6 +1,7 @@
local Details = _G.Details
local addonName, Details222 = ...
--namespace
Details.CurrentDps = {
+1 -1
View File
@@ -1,7 +1,7 @@
local Details = _G.Details
local addonName, Details222 = ...
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--extra buttons at the death options (release, death recap)
+1
View File
@@ -4,6 +4,7 @@ local Details = _G.Details
local textAlpha = 0.9
local AceLocale = LibStub("AceLocale-3.0")
local L = AceLocale:GetLocale ( "Details" )
local addonName, Details222 = ...
local on_deathrecap_line_enter = function(self)
if (self.spellid) then
+1
View File
@@ -4,6 +4,7 @@ local Details = _G._detalhes
local debugmode = false --print debug lines
local verbosemode = false --auto open the chart panel
local _
local addonName, Details222 = ...
local Loc = _G.LibStub("AceLocale-3.0"):GetLocale( "Details" )
+1
View File
@@ -2,6 +2,7 @@
local Details = _G.Details
local AceLocale = LibStub("AceLocale-3.0")
local L = AceLocale:GetLocale("Details")
local addonName, Details222 = ...
function Details.RegisterDragonFlightEditMode()
if (EventRegistry and type(EventRegistry) == "table") then
+2 -1
View File
@@ -4,7 +4,8 @@
local _detalhes = _G._detalhes
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
local _
local addonName, Details222 = ...
--Event types:
_detalhes.RegistredEvents = {
--instances
+2 -1
View File
@@ -15,7 +15,8 @@
local _detalhes = _G._detalhes
local _
local addonName, Details222 = ...
_detalhes.hooks ["HOOK_COOLDOWN"] = {}
_detalhes.hooks ["HOOK_DEATH"] = {}
_detalhes.hooks ["HOOK_BATTLERESS"] = {}
+1
View File
@@ -6,6 +6,7 @@ local Details = _G.Details
local C_Timer = _G.C_Timer
local C_Map = _G.C_Map
local ceil = math.ceil
local addonName, Details222 = ...
-- immersion namespace
Details.Immersion = {}
+2 -1
View File
@@ -4,7 +4,8 @@
local _detalhes = _G._detalhes
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
local _
local addonName, Details222 = ...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--On Details! Load:
--load default keys into the main object
+1
View File
@@ -1,4 +1,5 @@
local addonName, Details222 = ...
-- @windowN: number a a window to open the player details breakdown
-- /run Details:OpenPlayerDetails(windowN)
+2 -1
View File
@@ -5,6 +5,7 @@ local unpack = _G.unpack
local GetTime = _G.GetTime
local tremove = _G.tremove
local GetInstanceInfo = _G.GetInstanceInfo
local addonName, Details222 = ...
local Loc = _G.LibStub("AceLocale-3.0"):GetLocale("Details")
@@ -774,7 +775,7 @@ function DetailsMythicPlusFrame.EventListener.OnDetailsEvent(contextObject, even
--nothing
elseif (event == "COMBAT_MYTHICDUNGEON_START") then
print("COMBAT_MYTHICDUNGEON_START", ...)
--print("COMBAT_MYTHICDUNGEON_START", ...)
local lower_instance = _detalhes:GetLowerInstanceNumber()
if (lower_instance) then
lower_instance = _detalhes:GetInstance(lower_instance)
+1
View File
@@ -19,6 +19,7 @@ local GetNumGroupMembers = _G.GetNumGroupMembers
local GetRaidRosterInfo = _G.GetRaidRosterInfo
local unpack = _G.unpack
local IsInGroup = _G.IsInGroup
local addonName, Details222 = ...
Details.packFunctions = {}
+1 -1
View File
@@ -1,7 +1,7 @@
local Details = _G.Details
local addonName, Details222 = ...
local plater_integration_frame = CreateFrame("frame", "DetailsPlaterFrame", UIParent, "BackdropTemplate")
+1
View File
@@ -4,6 +4,7 @@ do
local _detalhes = _G._detalhes
local _
local addonName, Details222 = ...
local pairs = pairs
local ipairs = ipairs
local unpack = table.unpack or _G.unpack
+32
View File
@@ -0,0 +1,32 @@
local addonName, details222 = ...
details222.Scheduler = {
Names = {},
Debug = false,
}
local printDebug = function(...)
if (details222.Scheduler.Debug) then
print("ISE:", ...)
end
end
function details222.Scheduler.NewTicker(seconds, callback, name)
local tickerHandler = C_Timer.NewTicker(seconds, callback)
if (name) then
details222.Scheduler.Names[name] = tickerHandler
end
return tickerHandler
end
function details222.Scheduler.Cancel(name)
local ticker = details222.Scheduler.Names[name]
if (ticker) then
ticker:Cancel()
details222.Scheduler.Names[name] = nil
printDebug("Ticker", name, "Cancelled")
else
printDebug("Ticker", name, " Not Found")
end
end
+56 -10
View File
@@ -4,6 +4,7 @@
local _detalhes = _G._detalhes
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
local _
local addonName, Details222 = ...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--Profiles:
@@ -849,9 +850,6 @@ local default_profile = {
},
["EVOKER"] = {
--0.31764705882353, -- [1]
--0.24313725490196, -- [2]
--0.91372549019608, -- [3]
--0.2000,
--0.4980,
--0.5764,
@@ -1140,11 +1138,11 @@ local default_profile = {
line_height = 17,
},
--new window
all_in_one_windows = {
},
--new window system
all_in_one_windows = {},
--auto show overall data in dynamic mode
auto_swap_to_dynamic_overall = false,
}
_detalhes.default_profile = default_profile
@@ -1157,11 +1155,44 @@ local default_player_data = {
last_coach_name = false,
},
--this is used by the new data capture for charts
data_harvest_for_charsts = {
players = {
--damage done by each player
{
name = "Damage of Each Individual Player",
combatObjectContainer = 1,
playerOnly = true,
playerKey = "total",
},
},
totals = {
--total damage done by the raid group
{
name = "Damage of All Player Combined",
combatObjectSubTableName = "totals",
combatObjectSubTableKey = 1,
},
},
},
data_harvested_for_charts = {},
--ocd tracker test
ocd_tracker = {
enabled = false,
cooldowns = {},
pos = {},
frames = {
["defensive-raid"] = {},
["defensive-target"] = {},
["defensive-personal"] = {},
["ofensive"] = {},
["utility"] = {},
["main"] = {}, --any cooldown that does not have a frame is shown on main frame
}, --panels for each cooldown type
show_conditions = {
only_in_group = true,
only_inside_instance = true,
@@ -1175,7 +1206,16 @@ local default_player_data = {
["defensive-personal"] = false,
["ofensive"] = true,
["utility"] = false,
}, --when creating a filter, add it here and also add to 'own_frame'
own_frame = {
["defensive-raid"] = false,
["defensive-target"] = false,
["defensive-personal"] = false,
["ofensive"] = false,
["utility"] = false,
},
width = 120,
height = 18,
lines_per_column = 12,
@@ -1300,7 +1340,9 @@ local default_global_data = {
immersion_unit_special_icons = true, --custom icons for specific units
immersion_pets_on_solo_play = false, --pets showing when solo play
damage_scroll_auto_open = true,
damage_scroll_position = {},
damage_scroll_position = {
scale = 1,
},
data_wipes_exp = {
["9"] = false,
["10"] = false,
@@ -1312,6 +1354,11 @@ local default_global_data = {
current_exp_raid_encounters = {},
installed_skins_cache = {},
combat_id_global = 0,
slash_me_used = false,
trinket_data = {},
--spell category feedback
spell_category_savedtable = {},
spell_category_latest_query = 0,
@@ -1648,7 +1695,6 @@ local exportProfileBlacklist = {
active_profile = true,
SoloTablesSaved = true,
RaidTablesSaved = true,
savedStyles = true,
benchmark_db = true,
rank_window = true,
last_realversion = true,
+1
View File
@@ -5,6 +5,7 @@
local C_Timer = _G.C_Timer
local DetailsFramework = _G.DetailsFramework
local tinsert = _G.tinsert
local addonName, Details222 = ...
function Details.InstallRaidInfo()
+2 -1
View File
@@ -10,7 +10,8 @@
local _detalhes = _G._detalhes
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
local _
local addonName, Details222 = ...
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--basic functions
+1
View File
@@ -1,6 +1,7 @@
--[[this file save the data when player leave the game]]
local _detalhes = _G._detalhes
local addonName, Details222 = ...
function _detalhes:WipeConfig()
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
+1
View File
@@ -5,6 +5,7 @@ local Details = _G.Details
local DF = _G.DetailsFramework
local C_Timer = _G.C_Timer
local unpack = _G.unpack
local addonName, Details222 = ...
--make a namespace for schedules
Details.Schedules = {}
+1
View File
@@ -2,6 +2,7 @@
local _detalhes = _G._detalhes
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
local _
local addonName, Details222 = ...
--install skin function:
function _detalhes:InstallSkin (skin_name, skin_table)
+75 -72
View File
@@ -3,6 +3,7 @@
local _detalhes = _G._detalhes
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
local _
local addonName, Details222 = ...
local CreateFrame = CreateFrame
local pairs = pairs
@@ -11,11 +12,16 @@ local UnitGUID = UnitGUID
local tonumber= tonumber
local LoggingCombat = LoggingCombat
SLASH_PLAYEDCLASS1 = "/playedclass"
function SlashCmdList.PLAYEDCLASS(msg, editbox)
print(Details.GetPlayTimeOnClassString())
end
SLASH_DUMPTABLE1 = "/dumpt"
function SlashCmdList.DUMPTABLE(msg, editbox)
local result = "return function() return " .. msg .. " end"
local extractValue = loadstring(result)
return Details:Dump(extractValue()())
return dumpt(extractValue()())
end
SLASH_DETAILS1, SLASH_DETAILS2, SLASH_DETAILS3 = "/details", "/dt", "/de"
@@ -822,66 +828,57 @@ function SlashCmdList.DETAILS (msg, editbox)
elseif (command == "guid") then
local pass_guid = rest:match("^(%S*)%s*(.-)$")
if (not _detalhes.id_frame) then
local backdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\ChatFrame\\ChatFrameBackground",
tile = true, edgeSize = 1, tileSize = 5,
}
_detalhes.id_frame = CreateFrame("Frame", "DetailsID", UIParent)
_detalhes.id_frame:SetHeight(14)
_detalhes.id_frame:SetWidth(120)
_detalhes.id_frame:SetPoint("center", UIParent, "center")
_detalhes.id_frame:SetBackdrop(backdrop)
tinsert(UISpecialFrames, "DetailsID")
_detalhes.id_frame.texto = CreateFrame("editbox", nil, _detalhes.id_frame)
_detalhes.id_frame.texto:SetPoint("topleft", _detalhes.id_frame, "topleft")
_detalhes.id_frame.texto:SetAutoFocus(false)
_detalhes.id_frame.texto:SetFontObject(GameFontHighlightSmall)
_detalhes.id_frame.texto:SetHeight(14)
_detalhes.id_frame.texto:SetWidth(120)
_detalhes.id_frame.texto:SetJustifyH("CENTER")
_detalhes.id_frame.texto:EnableMouse(true)
_detalhes.id_frame.texto:SetBackdrop(ManualBackdrop)
_detalhes.id_frame.texto:SetBackdropColor(0, 0, 0, 0.5)
_detalhes.id_frame.texto:SetBackdropBorderColor(0.3, 0.3, 0.30, 0.80)
_detalhes.id_frame.texto:SetText("") --localize-me
_detalhes.id_frame.texto.perdeu_foco = nil
_detalhes.id_frame.texto:SetScript("OnEnterPressed", function()
_detalhes.id_frame.texto:ClearFocus()
_detalhes.id_frame:Hide()
end)
_detalhes.id_frame.texto:SetScript("OnEscapePressed", function()
_detalhes.id_frame.texto:ClearFocus()
_detalhes.id_frame:Hide()
end)
end
_detalhes.id_frame:Show()
_detalhes.id_frame.texto:SetFocus()
if (pass_guid == "-") then
local guid = UnitGUID("target")
if (guid) then
local g = _detalhes:GetNpcIdFromGuid (guid)
_detalhes.id_frame.texto:SetText("" .. g)
_detalhes.id_frame.texto:HighlightText()
if (UnitExists("target")) then
local serial = UnitGUID("target")
if (serial) then
local npcId = serial
if (not Details.id_frame) then
local backdrop = {
bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
edgeFile = "Interface\\ChatFrame\\ChatFrameBackground",
tile = true, edgeSize = 1, tileSize = 5,
}
Details.id_frame = CreateFrame("Frame", "DetailsID", UIParent, "BackdropTemplate")
Details.id_frame:SetHeight(14)
Details.id_frame:SetWidth(120)
Details.id_frame:SetPoint("center", UIParent, "center")
Details.id_frame:SetBackdrop(backdrop)
tinsert(UISpecialFrames, "DetailsID")
Details.id_frame.texto = CreateFrame("editbox", nil, Details.id_frame, "BackdropTemplate")
Details.id_frame.texto:SetPoint("topleft", Details.id_frame, "topleft")
Details.id_frame.texto:SetAutoFocus(false)
Details.id_frame.texto:SetFontObject(GameFontHighlightSmall)
Details.id_frame.texto:SetHeight(14)
Details.id_frame.texto:SetWidth(120)
Details.id_frame.texto:SetJustifyH("CENTER")
Details.id_frame.texto:EnableMouse(true)
Details.id_frame.texto:SetBackdropColor(0, 0, 0, 0.5)
Details.id_frame.texto:SetBackdropBorderColor(0.3, 0.3, 0.30, 0.80)
Details.id_frame.texto:SetText("")
Details.id_frame.texto.perdeu_foco = nil
Details.id_frame.texto:SetScript("OnEnterPressed", function()
Details.id_frame.texto:ClearFocus()
Details.id_frame:Hide()
end)
Details.id_frame.texto:SetScript("OnEscapePressed", function()
Details.id_frame.texto:ClearFocus()
Details.id_frame:Hide()
end)
end
C_Timer.After(0.1, function()
Details.id_frame:Show()
Details.id_frame.texto:SetFocus()
Details.id_frame.texto:SetText("" .. npcId)
Details.id_frame.texto:HighlightText()
end)
end
else
print(pass_guid.. " -> " .. tonumber(pass_guid:sub(6, 10), 16))
_detalhes.id_frame.texto:SetText(""..tonumber(pass_guid:sub(6, 10), 16))
_detalhes.id_frame.texto:HighlightText()
end
elseif (command == "profile") then
@@ -1350,7 +1347,8 @@ function SlashCmdList.DETAILS (msg, editbox)
Details:ScrollDamage()
elseif (msg == "me" or msg == "ME" or msg == "Me" or msg == "mE") then
local UnitGroupRolesAssigned = DetailsFramework.UnitGroupRolesAssigned
Details.slash_me_used = true
local UnitGroupRolesAssigned = DetailsFramework.UnitGroupRolesAssigned
local role = UnitGroupRolesAssigned("player")
if (role == "HEALER") then
Details:OpenPlayerDetails(2)
@@ -1674,6 +1672,9 @@ function SlashCmdList.DETAILS (msg, editbox)
elseif (msg == "generatespelllist") then
Details.GenerateSpecSpellList()
elseif (msg == "generateracialslist") then
Details.GenerateRacialSpellList()
elseif (msg == "survey") then
Details.Survey.OpenSurveyPanel()
@@ -1840,22 +1841,24 @@ function Details.RefreshUserList (ignoreIfHidden)
Details:UpdateUserPanel (newList)
end
function Details:UpdateUserPanel (usersTable)
function Details:UpdateUserPanel(usersTable)
if (not Details.UserPanel) then
local frameWidth, frameHeight = 470, 605
DetailsUserPanel = DetailsFramework:CreateSimplePanel(UIParent)
DetailsUserPanel:SetSize(707, 505)
DetailsUserPanel:SetSize(frameWidth, frameHeight)
DetailsUserPanel:SetTitle("Details! Version Check")
DetailsUserPanel.Data = {}
DetailsUserPanel:ClearAllPoints()
DetailsUserPanel:SetPoint("left", UIParent, "left", 10, 0)
DetailsUserPanel:SetPoint("left", UIParent, "left", 5, 100)
DetailsUserPanel:Hide()
DetailsFramework:ApplyStandardBackdrop(DetailsUserPanel)
Details.UserPanel = DetailsUserPanel
local scroll_width = 675
local scroll_height = 450
local scroll_lines = 21
local scroll_width = frameWidth - 30
local scroll_height = 605 - 60
local scroll_lines = 26
local scroll_line_height = 20
local backdrop_color = {.2, .2, .2, 0.2}
@@ -1869,9 +1872,9 @@ function Details:UpdateUserPanel (usersTable)
--header
local headerTable = {
{text = "User Name", width = 200},
{text = "Realm", width = 200},
{text = "Version", width = 200},
{text = "User Name", width = 160},
{text = "Realm", width = 130},
{text = "Version", width = 140},
}
local headerOptions = {
+151 -99
View File
@@ -1,12 +1,13 @@
--[[ Spell Cache store all spells shown on frames and make able to change spells name, icons, etc... ]]
do
do
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--On The Fly SpellCache
local _detalhes = _G._detalhes
local Details = _G._detalhes
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
local addonName, Details222 = ...
local _
local rawget = rawget
local rawset = rawset
@@ -18,9 +19,9 @@ do
local is_classic_exp = DetailsFramework.IsClassicWow()
--default container
_detalhes.spellcache = {}
Details.spellcache = {}
local unknowSpell = {Loc ["STRING_UNKNOWSPELL"], _, "Interface\\Icons\\Ability_Druid_Eclipse"} --localize-me
local AllSpellNames
if (is_classic_exp) then
AllSpellNames = {}
@@ -51,18 +52,18 @@ do
else
spellName, _, spellIcon = GetSpellInfo(spell)
end
if (not spellName) then
return spell, _, AllSpellNames [spell] or defaultSpellIcon
end
return spellName, _, AllSpellNames [spell] or spellIcon
end
--reset spell cache
function _detalhes:ClearSpellCache()
_detalhes.spellcache = setmetatable({},
{__index = function(tabela, valor)
function Details:ClearSpellCache()
Details.spellcache = setmetatable({},
{__index = function(tabela, valor)
local esta_magia = rawget (tabela, valor)
if (esta_magia) then
return esta_magia
@@ -81,26 +82,26 @@ do
else
return unknowSpell
end
end})
--default overwrites
--rawset (_detalhes.spellcache, 1, {Loc ["STRING_MELEE"], 1, "Interface\\AddOns\\Details\\images\\melee.tga"})
--rawset (_detalhes.spellcache, 2, {Loc ["STRING_AUTOSHOT"], 1, "Interface\\AddOns\\Details\\images\\autoshot.tga"})
--built-in overwrites
for spellId, spellTable in pairs(_detalhes.SpellOverwrite) do
for spellId, spellTable in pairs(Details.SpellOverwrite) do
local name, _, icon = _GetSpellInfo(spellId)
rawset (_detalhes.spellcache, spellId, {spellTable.name or name, 1, spellTable.icon or icon})
rawset (Details.spellcache, spellId, {spellTable.name or name, 1, spellTable.icon or icon})
end
--user overwrites
-- [1] spellid [2] spellname [3] spellicon
for index, spellTable in ipairs(_detalhes.savedCustomSpells) do
rawset (_detalhes.spellcache, spellTable [1], {spellTable [2], 1, spellTable [3]})
for index, spellTable in ipairs(Details.savedCustomSpells) do
rawset (Details.spellcache, spellTable [1], {spellTable [2], 1, spellTable [3]})
end
end
local lightOfTheMartyr_Name, _, lightOfTheMartyr_Icon = _GetSpellInfo(196917)
lightOfTheMartyr_Name = lightOfTheMartyr_Name or "Deprecated Spell - Light of the Martyr"
lightOfTheMartyr_Icon = lightOfTheMartyr_Icon or ""
@@ -183,6 +184,22 @@ do
else
--retail
local iconSize = 14 --icon size
local coords = {0.14, 0.86, 0.14, 0.86}
local formatTextForItem = function(itemId)
local result = ""
local itemIcon = C_Item.GetItemIconByID(itemId)
local itemName = C_Item.GetItemNameByID(itemId)
if (itemIcon and itemName) then
result = " (" .. CreateTextureMarkup(itemIcon, iconSize, iconSize, iconSize, iconSize, unpack(coords)) .. " " .. itemName .. ")"
end
return result
end
defaultSpellCustomization = {
[1] = {name = Loc ["STRING_MELEE"], icon = [[Interface\ICONS\INV_Sword_04]]},
[2] = {name = Loc ["STRING_AUTOSHOT"], icon = [[Interface\ICONS\INV_Weapon_Bow_07]]},
@@ -198,6 +215,38 @@ do
[77535] = {name = GetSpellInfo(77535), icon = "Interface\\Addons\\Details\\images\\icon_blood_shield"},
}
if (GetSpellInfo(394453)) then
local dragonflightTrinkets = {
[394453] = {name = GetSpellInfo(394453) .. formatTextForItem(195480), isPassive = true, itemId = 195480}, --ring: Seal of Diurna's Chosen
[382135] = {name = GetSpellInfo(382135) .. formatTextForItem(194308)}, --trinket: Manic Grieftorch
[382058] = {name = GetSpellInfo(382056) .. formatTextForItem(194299)}, --trinket: Decoration of Flame (shield)
[382056] = {name = GetSpellInfo(382056) .. formatTextForItem(194299)}, --trinket: Decoration of Flame
[382090] = {name = GetSpellInfo(382090) .. formatTextForItem(194302)}, --trinket: Storm-Eater's Boon
[381967] = {name = GetSpellInfo(381967) .. formatTextForItem(194305)}, --trinket: Controlled Current Technique
[382426] = {name = GetSpellInfo(382426) .. formatTextForItem(194309), isPassive = true, itemId = 194309}, --trinket: Spiteful Storm
[377455] = {name = GetSpellInfo(377455) .. formatTextForItem(194304)}, --trinket: Iceblood Deathsnare
[377451] = {name = GetSpellInfo(377451) .. formatTextForItem(194300)}, --trinket: Conjured Chillglobe
[382097] = {name = GetSpellInfo(382097) .. formatTextForItem(194303)}, --trinket: Rumbling Ruby
[385903] = {name = GetSpellInfo(385903) .. formatTextForItem(193639), isPassive = true, itemId = 193639}, --trinket: Umbrelskul's Fractured Heart
[381475] = {name = GetSpellInfo(381475) .. formatTextForItem(193769)}, --trinket: Erupting Spear Fragment
[388739] = {name = GetSpellInfo(388739) .. formatTextForItem(193660), isPassive = true, itemId = 193660}, --trinket: Idol of Pure Decay
[388855] = {name = GetSpellInfo(388855) .. formatTextForItem(193678)}, --trinket: Miniature Singing Stone
[388755] = {name = GetSpellInfo(388755) .. formatTextForItem(193677), isPassive = true, itemId = 193677}, --trinket: Furious Ragefeather
[383934] = {name = GetSpellInfo(383934) .. formatTextForItem(193736)}, --trinket: Water's Beating Heart
[214052] = {name = GetSpellInfo(214052) .. formatTextForItem(133641), isPassive = true, itemId = 133641}, --trinket: Eye of Skovald
[214200] = {name = GetSpellInfo(214200) .. formatTextForItem(133646)}, --trinket: Mote of Sanctification
[387036] = {name = GetSpellInfo(387036) .. formatTextForItem(193748)}, --trinket: Kyrakka's Searing Embers (heal)
[397376] = {name = GetSpellInfo(397376) .. formatTextForItem(193748), isPassive = true, itemId = 193748}, --trinket: Kyrakka's Searing Embers (damage)
--[] = {name = GetSpellInfo() .. formatTextForItem(193757), isPassive = true}, --trinket: Ruby Whelp Shell
}
for spellId, spellCustomization in pairs(dragonflightTrinkets) do
defaultSpellCustomization[spellId] = spellCustomization
end
end
end
if (LIB_OPEN_RAID_SPELL_CUSTOM_NAMES) then
@@ -209,153 +258,156 @@ do
end
end
function _detalhes:UserCustomSpellUpdate (index, name, icon)
local t = _detalhes.savedCustomSpells[index]
function Details:GetDefaultCustomSpellsList()
return defaultSpellCustomization
end
function Details:UserCustomSpellUpdate (index, name, icon)
local t = Details.savedCustomSpells[index]
if (t) then
t [2], t [3] = name or t [2], icon or t [3]
return rawset (_detalhes.spellcache, t [1], {t [2], 1, t [3]})
return rawset (Details.spellcache, t [1], {t [2], 1, t [3]})
else
return false
end
end
function _detalhes:UserCustomSpellReset (index)
local t = _detalhes.savedCustomSpells[index]
function Details:UserCustomSpellReset (index)
local t = Details.savedCustomSpells[index]
if (t) then
local spellid = t [1]
local name, _, icon = _GetSpellInfo(spellid)
if (defaultSpellCustomization [spellid]) then
name = defaultSpellCustomization [spellid].name
icon = defaultSpellCustomization [spellid].icon or icon or [[Interface\InventoryItems\WoWUnknownItem01]]
end
if (not name) then
name = "Unknown"
end
if (not icon) then
icon = [[Interface\InventoryItems\WoWUnknownItem01]]
end
rawset (_detalhes.spellcache, spellid, {name, 1, icon})
rawset (Details.spellcache, spellid, {name, 1, icon})
t[2] = name
t[3] = icon
end
end
function _detalhes:FillUserCustomSpells()
for spellid, t in pairs(defaultSpellCustomization) do
local already_have
for index, spelltable in ipairs(_detalhes.savedCustomSpells) do
if (spelltable [1] == spellid) then
already_have = spelltable
end
end
if (not already_have) then
local name, _, icon = GetSpellInfo(spellid)
_detalhes:UserCustomSpellAdd (spellid, t.name or name or "Unknown", t.icon or icon or [[Interface\InventoryItems\WoWUnknownItem01]])
end
function Details:FillUserCustomSpells()
for spellid, spellTable in pairs(defaultSpellCustomization) do
local spellName, _, spellIcon = Details.GetSpellInfo(spellid)
Details:UserCustomSpellAdd(spellid, spellTable.name or spellName or "Unknown", spellTable.icon or spellIcon or [[Interface\InventoryItems\WoWUnknownItem01]])
end
for i = #_detalhes.savedCustomSpells, 1, -1 do
local spelltable = _detalhes.savedCustomSpells [i]
for i = #Details.savedCustomSpells, 1, -1 do
local spelltable = Details.savedCustomSpells [i]
local spellid = spelltable [1]
if (spellid > 10) then
local exists = _GetSpellInfo(spellid)
if (not exists) then
tremove(_detalhes.savedCustomSpells, i)
tremove(Details.savedCustomSpells, i)
end
end
end
end
function _detalhes:UserCustomSpellAdd (spellid, name, icon)
local is_overwrite = false
for index, t in ipairs(_detalhes.savedCustomSpells) do
if (t [1] == spellid) then
t[2] = name
t[3] = icon
is_overwrite = true
C_Timer.After(0, function()
Details:FillUserCustomSpells()
end)
function Details:UserCustomSpellAdd(spellid, name, icon)
local isOverwrite = false
for index, spellTable in ipairs(Details.savedCustomSpells) do
if (spellTable[1] == spellid) then
spellTable[2] = name
spellTable[3] = icon
isOverwrite = true
break
end
end
if (not is_overwrite) then
tinsert(_detalhes.savedCustomSpells, {spellid, name, icon})
if (not isOverwrite) then
tinsert(Details.savedCustomSpells, {spellid, name, icon})
end
return rawset (_detalhes.spellcache, spellid, {name, 1, icon})
return rawset(Details.spellcache, spellid, {name, 1, icon})
end
function _detalhes:UserCustomSpellRemove (index)
local t = _detalhes.savedCustomSpells [index]
function Details:UserCustomSpellRemove (index)
local t = Details.savedCustomSpells [index]
if (t) then
local spellid = t [1]
local name, _, icon = _GetSpellInfo(spellid)
if (name) then
rawset (_detalhes.spellcache, spellid, {name, 1, icon})
rawset (Details.spellcache, spellid, {name, 1, icon})
end
return tremove(_detalhes.savedCustomSpells, index)
return tremove(Details.savedCustomSpells, index)
end
return false
end
--overwrite for API GetSpellInfo function
_detalhes.getspellinfo = function(spellid) return _unpack(_detalhes.spellcache[spellid]) end
_detalhes.GetSpellInfo = _detalhes.getspellinfo
Details.getspellinfo = function(spellid) return _unpack(Details.spellcache[spellid]) end
Details.GetSpellInfo = Details.getspellinfo
--overwrite SpellInfo if the spell is a DoT, so Details.GetSpellInfo will return the name modified
function _detalhes:SpellIsDot (spellid)
function Details:SpellIsDot(spellid)
--do nothing if this spell already has a customization
if (defaultSpellCustomization[spellid]) then
return
end
local spellName, rank, spellIcon = _GetSpellInfo(spellid)
if (spellName) then
rawset (_detalhes.spellcache, spellid, {spellName .. Loc ["STRING_DOT"], rank, spellIcon})
rawset (Details.spellcache, spellid, {spellName .. Loc ["STRING_DOT"], rank, spellIcon})
else
rawset (_detalhes.spellcache, spellid, {"Unknown DoT Spell? " .. Loc ["STRING_DOT"], rank, [[Interface\InventoryItems\WoWUnknownItem01]]})
rawset (Details.spellcache, spellid, {"Unknown DoT Spell? " .. Loc ["STRING_DOT"], rank, [[Interface\InventoryItems\WoWUnknownItem01]]})
end
end
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--Cache All Spells
function _detalhes:BuildSpellListSlow()
function Details:BuildSpellListSlow()
local load_frame = _G.DetailsLoadSpellCache
if (load_frame and (load_frame.completed or load_frame.inprogress)) then
return false
end
local step = 1
local max = 160000
if (not load_frame) then
load_frame = CreateFrame("frame", "DetailsLoadSpellCache", UIParent)
load_frame:SetFrameStrata("DIALOG")
local progress_label = load_frame:CreateFontString("DetailsLoadSpellCacheProgress", "overlay", "GameFontHighlightSmall")
progress_label:SetText("Loading Spells: 0%")
function _detalhes:BuildSpellListSlowTick()
function Details:BuildSpellListSlowTick()
progress_label:SetText("Loading Spells: " .. load_frame:GetProgress() .. "%")
end
load_frame.tick = _detalhes:ScheduleRepeatingTimer ("BuildSpellListSlowTick", 1)
load_frame.tick = Details:ScheduleRepeatingTimer ("BuildSpellListSlowTick", 1)
function load_frame:GetProgress()
return math.floor(step / max * 100)
end
end
local SpellCache = {a={}, b={}, c={}, d={}, e={}, f={}, g={}, h={}, i={}, j={}, k={}, l={}, m={}, n={}, o={}, p={}, q={}, r={}, s={}, t={}, u={}, v={}, w={}, x={}, y={}, z={}}
local _string_lower = string.lower
local _string_sub = string.sub
local blizzGetSpellInfo = GetSpellInfo
load_frame.inprogress = true
_detalhes.spellcachefull = SpellCache
Details.spellcachefull = SpellCache
load_frame:SetScript("OnUpdate", function()
for spellid = step, step+500 do
@@ -368,27 +420,27 @@ do
end
end
end
step = step + 500
if (step > max) then
step = max
_G.DetailsLoadSpellCache.completed = true
_G.DetailsLoadSpellCache.inprogress = false
_detalhes:CancelTimer(_G.DetailsLoadSpellCache.tick)
Details:CancelTimer(_G.DetailsLoadSpellCache.tick)
DetailsLoadSpellCacheProgress:Hide()
load_frame:SetScript("OnUpdate", nil)
end
end)
end)
return true
end
function _detalhes:BuildSpellList()
function Details:BuildSpellList()
local SpellCache = {a={}, b={}, c={}, d={}, e={}, f={}, g={}, h={}, i={}, j={}, k={}, l={}, m={}, n={}, o={}, p={}, q={}, r={}, s={}, t={}, u={}, v={}, w={}, x={}, y={}, z={}}
local _string_lower = string.lower
local _string_sub = string.sub
@@ -405,15 +457,15 @@ do
end
end
_detalhes.spellcachefull = SpellCache
Details.spellcachefull = SpellCache
return true
end
function _detalhes:ClearSpellList()
_detalhes.spellcachefull = nil
function Details:ClearSpellList()
Details.spellcachefull = nil
collectgarbage()
end
end
+3 -4
View File
@@ -1,7 +1,8 @@
do
local _detalhes = _G._detalhes
local addonName, Details222 = ...
--import potion list from the framework
_detalhes.PotionList = {}
for spellID, _ in pairs(DetailsFramework.PotionIDs) do
@@ -164,7 +165,6 @@ do
--Feral Druid:
[5217] = 103, --Tiger's Fury
[285381] = 103, --Primal Wrath
[213764] = 103, --Swipe
[106951] = 103, --Berserk
[274837] = 103, --Feral Frenzy
@@ -183,7 +183,6 @@ do
[191034] = 102, --Starfall
[78675] = 102, --Solar Beam
[202770] = 102, --Fury of Elune
[323764] = 102, --Convoke the Spirits
[102560] = 102, --Incarnation: Chosen of Elune
[202347] = 102, --Stellar Flare
[194223] = 102, --Celestial Alignment
@@ -652,7 +651,7 @@ do
[53385] = 70, -- Divine Storm
-- Discipline Priest:
[63944] = 256, -- Renewed Hope
--[63944] = 256, -- Renewed Hope
[10060] = 256, -- Power Infusion
[33206] = 256, -- Pain Suppression
[47540] = 256, -- Penance (rank 1)
+1 -1
View File
@@ -1,6 +1,6 @@
local Details = _G.Details
local addonName, Details222 = ...
function Details:TestBarsUpdate()
local current_combat = Details:GetCombat("current")
+2 -1
View File
@@ -2,7 +2,8 @@
local _
local _detalhes = _G._detalhes
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
local addonName, Details222 = ...
--mantain the enabled time captures
_detalhes.timeContainer = {}
_detalhes.timeContainer.Exec = {}
@@ -1,4 +1,4 @@
## Interface: 100000
## Interface: 100002
## Title: Details!: Storage
## Notes: Stores information for Details! Damage Meter
## DefaultState: Enabled
@@ -1,4 +1,4 @@
## Interface: 100000
## Interface: 100002
## Title: Details!: Encounter Breakdown (plugin)
## Notes: Show detailed information about a boss encounter. Also provide damage per phase, graphic charts, easy weakauras creation.
## RequiredDeps: Details
@@ -1,4 +1,4 @@
## Interface: 100000
## Interface: 100002
## Title: Details!: Raid Check (plugin)
## Notes: Show talents and item level for all members in your group, also shows food and flask state.
## RequiredDeps: Details
File diff suppressed because it is too large Load Diff
@@ -1,4 +1,4 @@
## Interface: 100000
## Interface: 100002
## Title: Details!: Streamer (plugin)
## Notes: Show which spells you are casting, viewers can see what are you doing and follow your steps.
## RequiredDeps: Details
+153 -153
View File
@@ -1,29 +1,29 @@
local AceLocale = LibStub("AceLocale-3.0")
local AceLocale = LibStub ("AceLocale-3.0")
local Loc = AceLocale:GetLocale ("Details_Threat")
local _GetNumSubgroupMembers = GetNumSubgroupMembers --wow api
local GetNumGroupMembers = GetNumGroupMembers --wow api
local _UnitIsFriend = UnitIsFriend --wow api
local _UnitName = UnitName --wow api
local IsInRaid = IsInRaid --wow api
local IsInGroup = IsInGroup --wow api
local _UnitGroupRolesAssigned = DetailsFramework.UnitGroupRolesAssigned --wow api
local _GetNumSubgroupMembers = GetNumSubgroupMembers --> wow api
local _GetNumGroupMembers = GetNumGroupMembers --> wow api
local _UnitIsFriend = UnitIsFriend --> wow api
local _UnitName = UnitName --> wow api
local _IsInRaid = IsInRaid --> wow api
local _IsInGroup = IsInGroup --> wow api
local _UnitGroupRolesAssigned = DetailsFramework.UnitGroupRolesAssigned --> wow api
local GetUnitName = GetUnitName
local ipairs = ipairs --lua api
local _table_sort = table.sort --lua api
local _cstr = string.format --lua api
local _ipairs = ipairs --> lua api
local _table_sort = table.sort --> lua api
local _cstr = string.format --> lua api
local _unpack = unpack
local _math_floor = math.floor
local abs = math.abs
local _math_abs = math.abs
local RAID_CLASS_COLORS = RAID_CLASS_COLORS
--Create the plugin Object
--> Create the plugin Object
local ThreatMeter = _detalhes:NewPluginObject ("Details_TinyThreat")
--Main Frame
--> Main Frame
local ThreatMeterFrame = ThreatMeter.Frame
ThreatMeter:SetPluginDescription ("Small tool for track the threat you and other raid members have in your current target.")
@@ -49,47 +49,47 @@ end
local function CreatePluginFrames (data)
--catch Details! main object
--> catch Details! main object
local _detalhes = _G._detalhes
local DetailsFrameWork = _detalhes.gump
--data
--> data
ThreatMeter.data = data or {}
--defaults
--> defaults
ThreatMeter.RowWidth = 294
ThreatMeter.RowHeight = 14
--amount of row wich can be displayed
--> amount of row wich can be displayed
ThreatMeter.CanShow = 0
--all rows already created
--> all rows already created
ThreatMeter.Rows = {}
--current shown rows
--> current shown rows
ThreatMeter.ShownRows = {}
-->
ThreatMeter.Actived = false
--localize functions
--> localize functions
ThreatMeter.percent_color = ThreatMeter.percent_color
ThreatMeter.GetOnlyName = ThreatMeter.GetOnlyName
--window reference
--> window reference
local instance
local player
--OnEvent Table
--> OnEvent Table
function ThreatMeter:OnDetailsEvent (event, ...)
if (event == "DETAILS_STARTED") then
ThreatMeter:RefreshRows()
elseif (event == "HIDE") then --plugin hidded, disabled
elseif (event == "HIDE") then --> plugin hidded, disabled
ThreatMeter.Actived = false
ThreatMeter:Cancel()
elseif (event == "SHOW") then
instance = ThreatMeter:GetInstance(ThreatMeter.instance_id)
instance = ThreatMeter:GetInstance (ThreatMeter.instance_id)
ThreatMeter.RowWidth = instance.baseframe:GetWidth()-6
@@ -98,11 +98,11 @@ local function CreatePluginFrames (data)
ThreatMeter:SizeChanged()
player = GetUnitName("player", true)
player = GetUnitName ("player", true)
ThreatMeter.Actived = false
if (ThreatMeter:IsInCombat() or UnitAffectingCombat("player")) then
if (ThreatMeter:IsInCombat() or UnitAffectingCombat ("player")) then
if (not ThreatMeter.initialized) then
return
end
@@ -118,24 +118,24 @@ local function CreatePluginFrames (data)
elseif (event == "DETAILS_INSTANCE_ENDRESIZE" or event == "DETAILS_INSTANCE_SIZECHANGED") then
local what_window = select(1, ...)
local what_window = select (1, ...)
if (what_window == instance) then
ThreatMeter:SizeChanged()
ThreatMeter:RefreshRows()
end
elseif (event == "DETAILS_OPTIONS_MODIFIED") then
local what_window = select(1, ...)
local what_window = select (1, ...)
if (what_window == instance) then
ThreatMeter:RefreshRows()
end
elseif (event == "DETAILS_INSTANCE_STARTSTRETCH") then
ThreatMeterFrame:SetFrameStrata("TOOLTIP")
ThreatMeterFrame:SetFrameLevel(instance.baseframe:GetFrameLevel()+1)
ThreatMeterFrame:SetFrameStrata ("TOOLTIP")
ThreatMeterFrame:SetFrameLevel (instance.baseframe:GetFrameLevel()+1)
elseif (event == "DETAILS_INSTANCE_ENDSTRETCH") then
ThreatMeterFrame:SetFrameStrata("MEDIUM")
ThreatMeterFrame:SetFrameStrata ("MEDIUM")
elseif (event == "PLUGIN_DISABLED") then
ThreatMeterFrame:UnregisterEvent ("PLAYER_TARGET_CHANGED")
@@ -143,29 +143,29 @@ local function CreatePluginFrames (data)
ThreatMeterFrame:UnregisterEvent ("PLAYER_REGEN_ENABLED")
elseif (event == "PLUGIN_ENABLED") then
ThreatMeterFrame:RegisterEvent("PLAYER_TARGET_CHANGED")
ThreatMeterFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
ThreatMeterFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
ThreatMeterFrame:RegisterEvent ("PLAYER_TARGET_CHANGED")
ThreatMeterFrame:RegisterEvent ("PLAYER_REGEN_DISABLED")
ThreatMeterFrame:RegisterEvent ("PLAYER_REGEN_ENABLED")
end
end
ThreatMeterFrame:SetWidth(300)
ThreatMeterFrame:SetHeight(100)
ThreatMeterFrame:SetWidth (300)
ThreatMeterFrame:SetHeight (100)
function ThreatMeter:UpdateContainers()
for _, row in ipairs(ThreatMeter.Rows) do
for _, row in _ipairs (ThreatMeter.Rows) do
row:SetContainer (instance.baseframe)
end
end
function ThreatMeter:UpdateRows()
for _, row in ipairs(ThreatMeter.Rows) do
for _, row in _ipairs (ThreatMeter.Rows) do
row.width = ThreatMeter.RowWidth
end
end
function ThreatMeter:HideBars()
for _, row in ipairs(ThreatMeter.Rows) do
for _, row in _ipairs (ThreatMeter.Rows) do
row:Hide()
end
end
@@ -186,10 +186,10 @@ local function CreatePluginFrames (data)
local instance = ThreatMeter:GetPluginInstance()
local w, h = instance:GetSize()
ThreatMeterFrame:SetWidth(w)
ThreatMeterFrame:SetHeight(h)
ThreatMeterFrame:SetWidth (w)
ThreatMeterFrame:SetHeight (h)
ThreatMeter.RowHeight = instance.row_info.height
ThreatMeter.CanShow = math.floor( h / (instance.row_info.height+1))
ThreatMeter.CanShow = math.floor ( h / (instance.row_info.height+1))
for i = #ThreatMeter.Rows+1, ThreatMeter.CanShow do
ThreatMeter:NewRow (i)
@@ -229,8 +229,8 @@ local function CreatePluginFrames (data)
row.height = instance.row_info.height
local rowHeight = - ( (row.rowId -1) * (instance.row_info.height + 1) )
row:ClearAllPoints()
row:SetPoint("topleft", ThreatMeterFrame, "topleft", 1, rowHeight)
row:SetPoint("topright", ThreatMeterFrame, "topright", -1, rowHeight)
row:SetPoint ("topleft", ThreatMeterFrame, "topleft", 1, rowHeight)
row:SetPoint ("topright", ThreatMeterFrame, "topright", -1, rowHeight)
end
end
@@ -243,7 +243,7 @@ local function CreatePluginFrames (data)
function ThreatMeter:NewRow (i)
local newrow = DetailsFrameWork:NewBar (ThreatMeterFrame, nil, "DetailsThreatRow"..i, nil, 300, ThreatMeter.RowHeight)
newrow:SetPoint(3, -((i-1)*(ThreatMeter.RowHeight+1)))
newrow:SetPoint (3, -((i-1)*(ThreatMeter.RowHeight+1)))
newrow.lefttext = "bar " .. i
newrow.color = "skyblue"
newrow.fontsize = 9.9
@@ -259,7 +259,7 @@ local function CreatePluginFrames (data)
return newrow
end
local absoluteSort = function(table1, table2)
local absoluteSort = function (table1, table2)
if (table1[6] > table2[6]) then
return true
else
@@ -267,7 +267,7 @@ local function CreatePluginFrames (data)
end
end
local relativeSort = function(table1, table2)
local relativeSort = function (table1, table2)
if (table1[2] > table2[2]) then
return true
else
@@ -322,16 +322,16 @@ local function CreatePluginFrames (data)
if (ThreatMeter.Actived and UnitExists(unitId) and not _UnitIsFriend("player", unitId)) then
--get the threat of all players
if (IsInRaid()) then
for i = 1, GetNumGroupMembers(), 1 do
--> get the threat of all players
if (_IsInRaid()) then
for i = 1, _GetNumGroupMembers(), 1 do
local thisplayer_name = GetUnitName("raid"..i, true)
local thisplayer_name = GetUnitName ("raid"..i, true)
local threat_table_index = ThreatMeter.player_list_hash [thisplayer_name]
local threat_table = ThreatMeter.player_list_indexes [threat_table_index]
if (not threat_table) then
--some one joined the group while the player are in combat
--> some one joined the group while the player are in combat
ThreatMeter:Start()
return
end
@@ -340,14 +340,14 @@ local function CreatePluginFrames (data)
end
elseif (IsInGroup()) then
for i = 1, GetNumGroupMembers()-1, 1 do
local thisplayer_name = GetUnitName("party"..i, true)
elseif (_IsInGroup()) then
for i = 1, _GetNumGroupMembers()-1, 1 do
local thisplayer_name = GetUnitName ("party"..i, true)
local threat_table_index = ThreatMeter.player_list_hash [thisplayer_name]
local threat_table = ThreatMeter.player_list_indexes [threat_table_index]
if (not threat_table) then
--some one joined the group while the player are in combat
--> some one joined the group while the player are in combat
ThreatMeter:Start()
return
end
@@ -356,7 +356,7 @@ local function CreatePluginFrames (data)
end
local thisplayer_name = GetUnitName("player", true)
local thisplayer_name = GetUnitName ("player", true)
local threat_table_index = ThreatMeter.player_list_hash [thisplayer_name]
local threat_table = ThreatMeter.player_list_indexes [threat_table_index]
@@ -364,16 +364,16 @@ local function CreatePluginFrames (data)
else
--player
local thisplayer_name = GetUnitName("player", true)
--> player
local thisplayer_name = GetUnitName ("player", true)
local threat_table_index = ThreatMeter.player_list_hash [thisplayer_name]
local threat_table = ThreatMeter.player_list_indexes [threat_table_index]
UpdateTableFromThreatSituation(threat_table, "player", unitId)
--pet
if (UnitExists("pet")) then
local thisplayer_name = GetUnitName("pet", true) .. " *PET*"
--> pet
if (UnitExists ("pet")) then
local thisplayer_name = GetUnitName ("pet", true) .. " *PET*"
local threat_table_index = ThreatMeter.player_list_hash [thisplayer_name]
local threat_table = ThreatMeter.player_list_indexes [threat_table_index]
@@ -387,23 +387,23 @@ local function CreatePluginFrames (data)
local gougeSpellId = (not disableGougeMode) and FindGougeSpellForUnit(unitId)
local useAbsoluteMode = gougeSpellId or ThreatMeter.saveddata.absolute_mode
--sort
--> sort
_table_sort (ThreatMeter.player_list_indexes, useAbsoluteMode and absoluteSort or relativeSort)
local needMainTankDummyBar = true
for index, t in ipairs(ThreatMeter.player_list_indexes) do
for index, t in _ipairs (ThreatMeter.player_list_indexes) do
ThreatMeter.player_list_hash [t[1]] = index
if t[3] then
needMainTankDummyBar = false
end
end
--no threat on this enemy
--> no threat on this enemy
if (ThreatMeter.player_list_indexes [1][7] < 1) then
ThreatMeter:HideBars()
return
end
--find main tank threat, even if they are not in group
--> find main tank threat, even if they are not in group
local mainTankAbsoluteThreat = ThreatMeter.player_list_indexes[1][6]/(ThreatMeter.player_list_indexes[1][7]/100)
local lastIndex = 0
@@ -415,7 +415,7 @@ local function CreatePluginFrames (data)
local needMeleePullBar = (not hidePullBar) and useAbsoluteMode
local needRelativePullBar = (not hidePullBar) and (not useAbsoluteMode) and me and (me[2] > 0) and (not me[3])
--find out scaling factor for bars
--> find out scaling factor for bars
local barValueUnit
if useAbsoluteMode then
barValueUnit = max(ThreatMeter.player_list_indexes[1][7]/100, needRangedPullBar and 1.3 or needMeleePullBar and 1.1 or 1.0)
@@ -423,10 +423,10 @@ local function CreatePluginFrames (data)
barValueUnit = 1.0
end
--find out gouge threshold (highest offtank threat, divided by 110%; this prevents the offtank from taking the boss back)
--> find out gouge threshold (highest offtank threat, divided by 110%; this prevents the offtank from taking the boss back)
local gougeThreshold = nil
if gougeSpellId then
for _, t in ipairs(ThreatMeter.player_list_indexes) do
for _, t in _ipairs (ThreatMeter.player_list_indexes) do
if not t[3] then
gougeThreshold = t[6] / 1.1
break
@@ -442,8 +442,8 @@ local function CreatePluginFrames (data)
local threatActor = ThreatMeter.player_list_indexes[index-dummyBarCount]
if needRelativePullBar then
thisRow._icon:SetTexture([[Interface\PVPFrame\Icon-Combat]])
thisRow._icon:SetTexCoord(0, 1, 0, 1)
thisRow._icon:SetTexture ([[Interface\PVPFrame\Icon-Combat]])
thisRow._icon:SetTexCoord (0, 1, 0, 1)
local myPullThreat = me[6]*(100/me[2])
local r,g = ThreatMeter:percent_color(me[2], true)
@@ -464,8 +464,8 @@ local function CreatePluginFrames (data)
if needRangedPullBar and ((not threatActor) or (threatActor[7] < 130)) then
thisRow._icon:SetTexture([[Interface\PaperDoll\UI-PaperDoll-Slot-Ranged]])
thisRow._icon:SetTexCoord(0, 1, 0, 1)
thisRow._icon:SetTexture ([[Interface\PaperDoll\UI-PaperDoll-Slot-Ranged]])
thisRow._icon:SetTexCoord (0, 1, 0, 1)
thisRow:SetLeftText ("Ranged pull at")
thisRow:SetRightText(ThreatMeter:ToK2 (mainTankAbsoluteThreat*1.3) .. " (130.0%)")
@@ -482,8 +482,8 @@ local function CreatePluginFrames (data)
end
if needMeleePullBar and ((not threatActor) or (threatActor[7] < 110)) then
thisRow._icon:SetTexture([[Interface\PaperDoll\UI-PaperDoll-Slot-MainHand]])
thisRow._icon:SetTexCoord(0, 1, 0, 1)
thisRow._icon:SetTexture ([[Interface\PaperDoll\UI-PaperDoll-Slot-MainHand]])
thisRow._icon:SetTexCoord (0, 1, 0, 1)
thisRow:SetLeftText ("Melee pull at")
thisRow:SetRightText(ThreatMeter:ToK2 (mainTankAbsoluteThreat*1.1) .. " (110.0%)")
@@ -500,8 +500,8 @@ local function CreatePluginFrames (data)
end
if needMainTankDummyBar and ((not threatActor) or (not useAbsoluteMode) or (threatActor[6] < mainTankAbsoluteThreat)) then
thisRow._icon:SetTexture([[Interface\LFGFrame\UI-LFG-Icon-PortraitRoles]])
thisRow._icon:SetTexCoord(_unpack(RoleIconCoord ["TANK"]))
thisRow._icon:SetTexture ([[Interface\LFGFrame\UI-LFG-Icon-PortraitRoles]])
thisRow._icon:SetTexCoord (_unpack (RoleIconCoord ["TANK"]))
thisRow:SetLeftText ("Current Tank")
thisRow:SetRightText(ThreatMeter:ToK2 (mainTankAbsoluteThreat) .. " (100.0%)")
@@ -509,10 +509,10 @@ local function CreatePluginFrames (data)
-- color main tank based on highest non-tank threat
local r,g = 0,1
for _, t in ipairs(ThreatMeter.player_list_indexes) do
for _, t in _ipairs (ThreatMeter.player_list_indexes) do
if not t[3] then
local otherPct = t[useAbsoluteMode and 7 or 2]
r,g = (otherPct*0.01), (abs(otherPct-100)*0.01)
r,g = (otherPct*0.01), (_math_abs(otherPct-100)*0.01)
break
end
end
@@ -528,9 +528,9 @@ local function CreatePluginFrames (data)
end
if gougeThreshold and ((not threatActor) or (threatActor[6] < gougeThreshold)) then
local spellName, _, spellTexture = GetSpellInfo(gougeSpellId)
thisRow._icon:SetTexture(spellTexture)
thisRow._icon:SetTexCoord(0, 1, 0, 1)
local spellName, _, spellTexture = GetSpellInfo (gougeSpellId)
thisRow._icon:SetTexture (spellTexture)
thisRow._icon:SetTexCoord (0, 1, 0, 1)
local pct = gougeThreshold * 100 / mainTankAbsoluteThreat
@@ -550,18 +550,18 @@ local function CreatePluginFrames (data)
if (threatActor) then
local role = threatActor[4]
thisRow._icon:SetTexture([[Interface\LFGFrame\UI-LFG-Icon-PortraitRoles]])
thisRow._icon:SetTexCoord(_unpack(RoleIconCoord [role]))
thisRow._icon:SetTexture ([[Interface\LFGFrame\UI-LFG-Icon-PortraitRoles]])
thisRow._icon:SetTexCoord (_unpack (RoleIconCoord [role]))
thisRow:SetLeftText (ThreatMeter:GetOnlyName(threatActor [1]))
thisRow:SetLeftText (ThreatMeter:GetOnlyName (threatActor [1]))
local pct = threatActor [useAbsoluteMode and 7 or 2]
thisRow:SetRightText (ThreatMeter:ToK2 (threatActor [6]) .. " (" .. _cstr ("%.1f", pct) .. "%)")
thisRow:SetValue(pct/barValueUnit)
thisRow:SetValue (pct/barValueUnit)
if (options.useplayercolor and threatActor [1] == player) then
thisRow:SetColor (_unpack(options.playercolor))
thisRow:SetColor (_unpack (options.playercolor))
elseif (options.useclasscolors) then
local color = RAID_CLASS_COLORS [threatActor [5]]
@@ -574,10 +574,10 @@ local function CreatePluginFrames (data)
if threatActor[3] then
-- color main tank based on highest non-tank threat
local r,g = 0,1
for _, t in ipairs(ThreatMeter.player_list_indexes) do
for _, t in _ipairs (ThreatMeter.player_list_indexes) do
if not t[3] then
local otherPct = t[useAbsoluteMode and 7 or 2]
r,g = (otherPct*0.01), (abs(otherPct-100)*0.01)
r,g = (otherPct*0.01), (_math_abs(otherPct-100)*0.01)
break
end
end
@@ -602,21 +602,21 @@ local function CreatePluginFrames (data)
end
if (not shownMe) then
--show my self into last bar
--> show my self into last bar
local threat_actor = ThreatMeter.player_list_indexes [ ThreatMeter.player_list_hash [player] ]
if (threat_actor) then
if (threat_actor [2] and threat_actor [2] > 0.1) then
local thisRow = ThreatMeter.ShownRows [#ThreatMeter.ShownRows]
thisRow:SetLeftText (player)
--thisRow.textleft:SetTextColor(unpack(RAID_CLASS_COLORS [threat_actor [5]]))
--thisRow.textleft:SetTextColor (unpack (RAID_CLASS_COLORS [threat_actor [5]]))
local role = threat_actor [4]
thisRow._icon:SetTexture([[Interface\LFGFrame\UI-LFG-Icon-PortraitRoles]])
thisRow._icon:SetTexCoord(_unpack(RoleIconCoord [role]))
thisRow._icon:SetTexture ([[Interface\LFGFrame\UI-LFG-Icon-PortraitRoles]])
thisRow._icon:SetTexCoord (_unpack (RoleIconCoord [role]))
thisRow:SetRightText (ThreatMeter:ToK2 (threat_actor [6]) .. " (" .. _cstr ("%.1f", threat_actor [2]) .. "%)")
thisRow:SetValue(threat_actor [2])
thisRow:SetValue (threat_actor [2])
if (options.useplayercolor) then
thisRow:SetColor (_unpack(options.playercolor))
thisRow:SetColor (_unpack (options.playercolor))
else
local r, g = ThreatMeter:percent_color (threat_actor [2], true)
thisRow:SetColor (r, g, 0, .3)
@@ -625,7 +625,7 @@ local function CreatePluginFrames (data)
end
end
else
--print("nao tem target")
--print ("nao tem target")
end
end
@@ -653,50 +653,50 @@ local function CreatePluginFrames (data)
ThreatMeter:HideBars()
if (ThreatMeter.Actived) then
if (ThreatMeter.job_thread) then
ThreatMeter:CancelTimer(ThreatMeter.job_thread)
ThreatMeter:CancelTimer (ThreatMeter.job_thread)
ThreatMeter.job_thread = nil
end
ThreatMeter.player_list_indexes = {}
ThreatMeter.player_list_hash = {}
--pre build player list
if (IsInRaid()) then
for i = 1, GetNumGroupMembers(), 1 do
local thisplayer_name = GetUnitName("raid"..i, true)
local role = _UnitGroupRolesAssigned(thisplayer_name)
local _, class = UnitClass(thisplayer_name)
--> pre build player list
if (_IsInRaid()) then
for i = 1, _GetNumGroupMembers(), 1 do
local thisplayer_name = GetUnitName ("raid"..i, true)
local role = _UnitGroupRolesAssigned (thisplayer_name)
local _, class = UnitClass (thisplayer_name)
local t = {thisplayer_name, 0, false, role, class, 0, 0}
ThreatMeter.player_list_indexes [#ThreatMeter.player_list_indexes+1] = t
ThreatMeter.player_list_hash [thisplayer_name] = #ThreatMeter.player_list_indexes
end
elseif (IsInGroup()) then
for i = 1, GetNumGroupMembers()-1, 1 do
local thisplayer_name = GetUnitName("party"..i, true)
local role = _UnitGroupRolesAssigned(thisplayer_name)
local _, class = UnitClass(thisplayer_name)
elseif (_IsInGroup()) then
for i = 1, _GetNumGroupMembers()-1, 1 do
local thisplayer_name = GetUnitName ("party"..i, true)
local role = _UnitGroupRolesAssigned (thisplayer_name)
local _, class = UnitClass (thisplayer_name)
local t = {thisplayer_name, 0, false, role, class, 0, 0}
ThreatMeter.player_list_indexes [#ThreatMeter.player_list_indexes+1] = t
ThreatMeter.player_list_hash [thisplayer_name] = #ThreatMeter.player_list_indexes
end
local thisplayer_name = GetUnitName("player", true)
local role = _UnitGroupRolesAssigned(thisplayer_name)
local _, class = UnitClass(thisplayer_name)
local thisplayer_name = GetUnitName ("player", true)
local role = _UnitGroupRolesAssigned (thisplayer_name)
local _, class = UnitClass (thisplayer_name)
local t = {thisplayer_name, 0, false, role, class, 0, 0}
ThreatMeter.player_list_indexes [#ThreatMeter.player_list_indexes+1] = t
ThreatMeter.player_list_hash [thisplayer_name] = #ThreatMeter.player_list_indexes
else
local thisplayer_name = GetUnitName("player", true)
local role = _UnitGroupRolesAssigned(thisplayer_name)
local _, class = UnitClass(thisplayer_name)
local thisplayer_name = GetUnitName ("player", true)
local role = _UnitGroupRolesAssigned (thisplayer_name)
local _, class = UnitClass (thisplayer_name)
local t = {thisplayer_name, 0, false, role, class, 0, 0}
ThreatMeter.player_list_indexes [#ThreatMeter.player_list_indexes+1] = t
ThreatMeter.player_list_hash [thisplayer_name] = #ThreatMeter.player_list_indexes
if (UnitExists("pet")) then
local thispet_name = GetUnitName("pet", true) .. " *PET*"
if (UnitExists ("pet")) then
local thispet_name = GetUnitName ("pet", true) .. " *PET*"
local role = "DAMAGER"
local t = {thispet_name, 0, false, role, class, 0, 0}
ThreatMeter.player_list_indexes [#ThreatMeter.player_list_indexes+1] = t
@@ -712,7 +712,7 @@ local function CreatePluginFrames (data)
function ThreatMeter:End()
ThreatMeter:HideBars()
if (ThreatMeter.job_thread) then
ThreatMeter:CancelTimer(ThreatMeter.job_thread)
ThreatMeter:CancelTimer (ThreatMeter.job_thread)
ThreatMeter.job_thread = nil
end
end
@@ -720,7 +720,7 @@ local function CreatePluginFrames (data)
function ThreatMeter:Cancel()
ThreatMeter:HideBars()
if (ThreatMeter.job_thread) then
ThreatMeter:CancelTimer(ThreatMeter.job_thread)
ThreatMeter:CancelTimer (ThreatMeter.job_thread)
ThreatMeter.job_thread = nil
end
ThreatMeter.Actived = false
@@ -736,7 +736,7 @@ local build_options_panel = function()
{
type = "range",
get = function() return ThreatMeter.saveddata.updatespeed end,
set = function(self, fixedparam, value) ThreatMeter.saveddata.updatespeed = value end,
set = function (self, fixedparam, value) ThreatMeter.saveddata.updatespeed = value end,
min = 0.2,
max = 3,
step = 0.2,
@@ -747,14 +747,14 @@ local build_options_panel = function()
{
type = "toggle",
get = function() return ThreatMeter.saveddata.useplayercolor end,
set = function(self, fixedparam, value) ThreatMeter.saveddata.useplayercolor = value end,
set = function (self, fixedparam, value) ThreatMeter.saveddata.useplayercolor = value end,
desc = "When enabled, your bar get the following color.",
name = "Player Color Enabled"
},
{
type = "color",
get = function() return ThreatMeter.saveddata.playercolor end,
set = function(self, r, g, b, a)
set = function (self, r, g, b, a)
local current = ThreatMeter.saveddata.playercolor
current[1], current[2], current[3], current[4] = r, g, b, a
end,
@@ -764,7 +764,7 @@ local build_options_panel = function()
{
type = "toggle",
get = function() return ThreatMeter.saveddata.useclasscolors end,
set = function(self, fixedparam, value) ThreatMeter.saveddata.useclasscolors = value end,
set = function (self, fixedparam, value) ThreatMeter.saveddata.useclasscolors = value end,
desc = "When enabled, threat bars uses the class color of the character.",
name = "Use Class Colors"
},
@@ -774,14 +774,14 @@ local build_options_panel = function()
{
type = "toggle",
get = function() return ThreatMeter.saveddata.usefocus end,
set = function(self, fixedparam, value) ThreatMeter.saveddata.usefocus = value end,
set = function (self, fixedparam, value) ThreatMeter.saveddata.usefocus = value end,
desc = "Show threat for the focus target if there's one.",
name = "Track Focus Target (if any)"
},
{
type = "toggle",
get = function() return not ThreatMeter.saveddata.hide_pull_bar end,
set = function(self, fixedparam, value) ThreatMeter.saveddata.hide_pull_bar = not value end,
set = function (self, fixedparam, value) ThreatMeter.saveddata.hide_pull_bar = not value end,
desc = "Show Pull Aggro Bar",
name = "Show Pull Aggro Bar"
},
@@ -805,7 +805,7 @@ local build_options_panel = function()
{
type = "toggle",
get = function() return ThreatMeter.saveddata.playSound end,
set = function(self, fixedparam, value) ThreatMeter.saveddata.playSound = value end,
set = function (self, fixedparam, value) ThreatMeter.saveddata.playSound = value end,
desc = "Except for tanks",
name = "Play Audio On High Threat"
},
@@ -834,15 +834,15 @@ function ThreatMeter:OnEvent (_, event, ...)
elseif (event == "PLAYER_REGEN_DISABLED") then
ThreatMeter.Actived = true
ThreatMeter:Start()
--print("tiny theat: regen disabled")
--print ("tiny theat: regen disabled")
elseif (event == "PLAYER_REGEN_ENABLED") then
ThreatMeter:End()
ThreatMeter.Actived = false
--print("tiny theat: regen enabled")
--print ("tiny theat: regen enabled")
elseif (event == "ADDON_LOADED") then
local AddonName = select(1, ...)
local AddonName = select (1, ...)
if (AddonName == "Details_TinyThreat") then
if (_G._detalhes) then
@@ -851,31 +851,31 @@ function ThreatMeter:OnEvent (_, event, ...)
--return
end
--create widgets
--> create widgets
CreatePluginFrames (data)
local MINIMAL_DETAILS_VERSION_REQUIRED = 1
--Install
local install, saveddata = _G._detalhes:InstallPlugin ("RAID", Loc ["STRING_PLUGIN_NAME"], "Interface\\Icons\\Ability_Druid_Cower", ThreatMeter, "DETAILS_PLUGIN_TINY_THREAT", MINIMAL_DETAILS_VERSION_REQUIRED, "Terciob", "v2.01")
if (type(install) == "table" and install.error) then
print(install.error)
--> Install
local install, saveddata = _G._detalhes:InstallPlugin ("RAID", Loc ["STRING_PLUGIN_NAME"], "Interface\\Icons\\Ability_Druid_Cower", ThreatMeter, "DETAILS_PLUGIN_TINY_THREAT", MINIMAL_DETAILS_VERSION_REQUIRED, "Terciob", "v2.20")
if (type (install) == "table" and install.error) then
print (install.error)
end
--Register needed events
_G._detalhes:RegisterEvent(ThreatMeter, "COMBAT_PLAYER_ENTER")
_G._detalhes:RegisterEvent(ThreatMeter, "COMBAT_PLAYER_LEAVE")
_G._detalhes:RegisterEvent(ThreatMeter, "DETAILS_INSTANCE_ENDRESIZE")
_G._detalhes:RegisterEvent(ThreatMeter, "DETAILS_INSTANCE_SIZECHANGED")
_G._detalhes:RegisterEvent(ThreatMeter, "DETAILS_INSTANCE_STARTSTRETCH")
_G._detalhes:RegisterEvent(ThreatMeter, "DETAILS_INSTANCE_ENDSTRETCH")
_G._detalhes:RegisterEvent(ThreatMeter, "DETAILS_OPTIONS_MODIFIED")
--> Register needed events
_G._detalhes:RegisterEvent (ThreatMeter, "COMBAT_PLAYER_ENTER")
_G._detalhes:RegisterEvent (ThreatMeter, "COMBAT_PLAYER_LEAVE")
_G._detalhes:RegisterEvent (ThreatMeter, "DETAILS_INSTANCE_ENDRESIZE")
_G._detalhes:RegisterEvent (ThreatMeter, "DETAILS_INSTANCE_SIZECHANGED")
_G._detalhes:RegisterEvent (ThreatMeter, "DETAILS_INSTANCE_STARTSTRETCH")
_G._detalhes:RegisterEvent (ThreatMeter, "DETAILS_INSTANCE_ENDSTRETCH")
_G._detalhes:RegisterEvent (ThreatMeter, "DETAILS_OPTIONS_MODIFIED")
ThreatMeterFrame:RegisterEvent("PLAYER_TARGET_CHANGED")
ThreatMeterFrame:RegisterEvent("PLAYER_REGEN_DISABLED")
ThreatMeterFrame:RegisterEvent("PLAYER_REGEN_ENABLED")
ThreatMeterFrame:RegisterEvent ("PLAYER_TARGET_CHANGED")
ThreatMeterFrame:RegisterEvent ("PLAYER_REGEN_DISABLED")
ThreatMeterFrame:RegisterEvent ("PLAYER_REGEN_ENABLED")
--Saved data
--> Saved data
ThreatMeter.saveddata = saveddata or {}
ThreatMeter.saveddata.updatespeed = ThreatMeter.saveddata.updatespeed or 1
@@ -894,8 +894,8 @@ function ThreatMeter:OnEvent (_, event, ...)
ThreatMeter.options = ThreatMeter.saveddata
--Register slash commands
SLASH_DETAILS_TINYTHREAT1, SLASH_DETAILS_TINYTHREAT2 = "/tinythreat", "/tt"
--> Register slash commands
SLASH_DETAILS_TINYTHREAT1 = "/tinythreat"
function SlashCmdList.DETAILS_TINYTHREAT (msg, editbox)
@@ -906,7 +906,7 @@ function ThreatMeter:OnEvent (_, event, ...)
elseif (command == Loc ["STRING_SLASH_SPEED"]) then
if (rest) then
local speed = tonumber(rest)
local speed = tonumber (rest)
if (speed) then
if (speed > 3) then
speed = 3
@@ -915,17 +915,17 @@ function ThreatMeter:OnEvent (_, event, ...)
end
ThreatMeter.saveddata.updatespeed = speed
ThreatMeter:Msg(Loc ["STRING_SLASH_SPEED_CHANGED"] .. speed)
ThreatMeter:Msg (Loc ["STRING_SLASH_SPEED_CHANGED"] .. speed)
else
ThreatMeter:Msg(Loc ["STRING_SLASH_SPEED_CURRENT"] .. ThreatMeter.saveddata.updatespeed)
ThreatMeter:Msg (Loc ["STRING_SLASH_SPEED_CURRENT"] .. ThreatMeter.saveddata.updatespeed)
end
end
elseif (command == Loc ["STRING_SLASH_AMOUNT"]) then
else
ThreatMeter:Msg(Loc ["STRING_COMMAND_LIST"])
print("|cffffaeae/tinythreat " .. Loc ["STRING_SLASH_SPEED"] .. "|r: " .. Loc ["STRING_SLASH_SPEED_DESC"])
ThreatMeter:Msg (Loc ["STRING_COMMAND_LIST"])
print ("|cffffaeae/tinythreat " .. Loc ["STRING_SLASH_SPEED"] .. "|r: " .. Loc ["STRING_SLASH_SPEED_DESC"])
end
end
@@ -1,4 +1,4 @@
## Interface: 100000
## Interface: 100002
## Title: Details!: Tiny Threat (plugin)
## Notes: Threat meter plugin, show threat for group members in the window. Select it from the Plugin menu in the Orange Cogwheel.
## RequiredDeps: Details
@@ -1,4 +1,4 @@
## Interface: 100000
## Interface: 100002
## Title: Details!: Vanguard (plugin)
## Notes: Show the health and debuffs for tanks in your group.
## SavedVariablesPerCharacter: _detalhes_databaseVanguard
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+34 -31
View File
@@ -1,10 +1,11 @@
local UnitGroupRolesAssigned = _G.DetailsFramework.UnitGroupRolesAssigned
local wipe = _G.wipe
local C_Timer = _G.C_Timer
local CreateFrame = _G.CreateFrame
local Loc = _G.LibStub("AceLocale-3.0"):GetLocale("Details")
local _
local tocName, Details222 = ...
--start funtion
function Details:StartMeUp() --I'll never stop!
@@ -341,12 +342,10 @@ function Details:StartMeUp() --I'll never stop!
local lowerInstanceId = Details:GetLowerInstanceNumber()
if (lowerInstanceId) then
lowerInstanceId = Details:GetInstance(lowerInstanceId)
if (lowerInstanceId) then
--check if there's changes in the size of the news string
if (Details.last_changelog_size < #Loc["STRING_VERSION_LOG"]) then
if (Details.last_changelog_size ~= #Loc["STRING_VERSION_LOG"]) then
Details.last_changelog_size = #Loc["STRING_VERSION_LOG"]
if (Details.auto_open_news_window) then
C_Timer.After(5, function()
Details.OpenNewsWindow()
@@ -441,6 +440,33 @@ function Details:StartMeUp() --I'll never stop!
Details:LoadFramesForBroadcastTools()
Details:BrokerTick()
--build trinket data
function Details:GetTrinketData()
return Details.trinket_data
end
local customSpellList = Details:GetDefaultCustomSpellsList()
local trinketData = Details:GetTrinketData()
for spellId, trinketTable in pairs(customSpellList) do
if (trinketTable.isPassive) then
if (not trinketData[spellId]) then
local thisTrinketData = {
itemName = C_Item.GetItemNameByID(trinketTable.itemId),
spellName = GetSpellInfo(spellId) or "spell not found",
lastActivation = 0,
lastPlayerName = "",
totalCooldownTime = 0,
activations = 0,
lastCombatId = 0,
minTime = 9999999,
maxTime = 0,
averageTime = 0,
}
trinketData[spellId] = thisTrinketData
end
end
end
--register boss mobs callbacks (DBM and BigWigs) -> functions/bossmods.lua
Details.Schedules.NewTimer(5, Details.BossModsLink, Details)
@@ -507,11 +533,10 @@ function Details:StartMeUp() --I'll never stop!
Details:InstallHook("HOOK_DEATH", Details.Coach.Client.SendMyDeath)
local sentMessageOnStartup = false
if (math.random(20) == 1) then
Details:Msg("use '/details me' macro to open the player breakdown for you!")
sentMessageOnStartup = true
if (not Details.slash_me_used) then
if (math.random(25) == 1) then
Details:Msg("use '/details me' macro to open the player breakdown for you!")
end
end
if (not DetailsFramework.IsTimewalkWoW()) then
@@ -557,21 +582,6 @@ function Details:StartMeUp() --I'll never stop!
end
end)
--[=[ --survey for cooldown types are done
if (DetailsFramework.IsDragonflight()) then
DetailsFramework.Schedules.NewTimer(5, Details.RegisterDragonFlightEditMode)
--run only on beta, remove on 10.0 launch
if (Details.Survey.GetTargetCharacterForRealm()) then
Details.Survey.InitializeSpellCategoryFeedback()
if (not sentMessageOnStartup) then
if (math.random(5) == 1) then
Details:Msg("use '/details survey' to help on identifying cooldown spells (Dragonflight Beta).")
end
end
end
end
--]=]
function Details:InstallOkey()
return true
end
@@ -583,13 +593,6 @@ function Details:StartMeUp() --I'll never stop!
--shutdown the old OnDeathMenu
--cleanup: this line can be removed after the first month of dragonflight
Details.on_death_menu = false
--reset to default the evoker color
local defaultEvokerColor = _detalhes.default_profile.class_colors.EVOKER
local currentEvokerColorTable = _detalhes.class_colors.EVOKER
currentEvokerColorTable[1] = defaultEvokerColor[1]
currentEvokerColorTable[2] = defaultEvokerColor[2]
currentEvokerColorTable[3] = defaultEvokerColor[3]
end
Details.AddOnLoadFilesTime = _G.GetTime()