Release Candidate 1
This commit is contained in:
+2
-1
@@ -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
|
||||
|
||||
@@ -25,6 +25,7 @@ indent.lua
|
||||
core\util.lua
|
||||
API.lua
|
||||
|
||||
functions\private.lua
|
||||
functions\profiles.lua
|
||||
functions\hooks.lua
|
||||
functions\bossmods.lua
|
||||
|
||||
@@ -26,6 +26,7 @@ indent.lua
|
||||
core\util.lua
|
||||
API.lua
|
||||
|
||||
functions\private.lua
|
||||
functions\profiles.lua
|
||||
functions\hooks.lua
|
||||
functions\bossmods.lua
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,5 +1,6 @@
|
||||
do
|
||||
local _detalhes = _G._detalhes
|
||||
local addonName, Details222 = ...
|
||||
|
||||
local _error = {
|
||||
["error"] = true,
|
||||
|
||||
+8
-12
@@ -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
|
||||
|
||||
@@ -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 necess�rio
|
||||
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)
|
||||
|
||||
@@ -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,6 +1,7 @@
|
||||
-- damage ability file
|
||||
local _detalhes = _G._detalhes
|
||||
local _
|
||||
local addonName, Details222 = ...
|
||||
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
--local pointers
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
|
||||
local _detalhes = _G._detalhes
|
||||
local _
|
||||
|
||||
local addonName, Details222 = ...
|
||||
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
--constants
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
local _detalhes = _G._detalhes
|
||||
local _
|
||||
local addonName, Details222 = ...
|
||||
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
--local pointers
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
-- misc ability file
|
||||
local _detalhes = _G._detalhes
|
||||
local _
|
||||
local addonName, Details222 = ...
|
||||
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
--local pointers
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
local Details = _G.Details
|
||||
local DF = _G.DetailsFramework
|
||||
local _
|
||||
local addonName, Details222 = ...
|
||||
|
||||
local CONST_CLIENT_LANGUAGE = DF.ClientLanguage
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
local _detalhes = _G._detalhes
|
||||
local _
|
||||
local addonName, Details222 = ...
|
||||
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
--local pointers
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
local _detalhes = _G._detalhes
|
||||
local _
|
||||
local addonName, Details222 = ...
|
||||
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
--local pointers
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
|
||||
local _detalhes = _G._detalhes
|
||||
local _
|
||||
|
||||
local addonName, Details222 = ...
|
||||
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
--local pointers
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
local SharedMedia = LibStub:GetLibrary("LibSharedMedia-3.0")
|
||||
local _tempo = time()
|
||||
local _
|
||||
local addonName, Details222 = ...
|
||||
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
--local pointers
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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 .. "]"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"},
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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
@@ -1,7 +1,8 @@
|
||||
|
||||
do
|
||||
do
|
||||
|
||||
local _detalhes = _G._detalhes
|
||||
local addonName, Details222 = ...
|
||||
_detalhes.EncounterInformation = {}
|
||||
local ipairs = ipairs --lua local
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,5 +1,6 @@
|
||||
|
||||
local Details = _G.Details
|
||||
local addonName, Details222 = ...
|
||||
|
||||
--stop yellow warning on my editor
|
||||
local IsInRaid = _G.IsInRaid
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
|
||||
|
||||
local Details = _G.Details
|
||||
local addonName, Details222 = ...
|
||||
|
||||
--namespace
|
||||
Details.CurrentDps = {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
|
||||
local Details = _G.Details
|
||||
|
||||
local addonName, Details222 = ...
|
||||
|
||||
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
--extra buttons at the death options (release, death recap)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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" )
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -15,7 +15,8 @@
|
||||
|
||||
local _detalhes = _G._detalhes
|
||||
local _
|
||||
|
||||
local addonName, Details222 = ...
|
||||
|
||||
_detalhes.hooks ["HOOK_COOLDOWN"] = {}
|
||||
_detalhes.hooks ["HOOK_DEATH"] = {}
|
||||
_detalhes.hooks ["HOOK_BATTLERESS"] = {}
|
||||
|
||||
@@ -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 = {}
|
||||
|
||||
@@ -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,4 +1,5 @@
|
||||
|
||||
local addonName, Details222 = ...
|
||||
|
||||
-- @windowN: number a a window to open the player details breakdown
|
||||
-- /run Details:OpenPlayerDetails(windowN)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,7 +1,7 @@
|
||||
|
||||
|
||||
local Details = _G.Details
|
||||
|
||||
local addonName, Details222 = ...
|
||||
|
||||
|
||||
local plater_integration_frame = CreateFrame("frame", "DetailsPlaterFrame", UIParent, "BackdropTemplate")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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,
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
local C_Timer = _G.C_Timer
|
||||
local DetailsFramework = _G.DetailsFramework
|
||||
local tinsert = _G.tinsert
|
||||
local addonName, Details222 = ...
|
||||
|
||||
function Details.InstallRaidInfo()
|
||||
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
local _detalhes = _G._detalhes
|
||||
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
|
||||
local _
|
||||
|
||||
local addonName, Details222 = ...
|
||||
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
--basic functions
|
||||
|
||||
|
||||
@@ -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" )
|
||||
|
||||
@@ -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 = {}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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,6 +1,6 @@
|
||||
|
||||
local Details = _G.Details
|
||||
|
||||
local addonName, Details222 = ...
|
||||
|
||||
function Details:TestBarsUpdate()
|
||||
local current_combat = Details:GetCombat("current")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user