Files
coa-elvui/ElvUI/Modules/Misc/RaidUtility.lua
T
Cristian Barzotti ff118b5dc0 Added DBM Pull timer, moved around buttons (#28)
* Added DBM Pull timer, moved around buttons

Added DBM Pull timer button (will do nothing without DBM, calls the command through the chat) and moved around buttons so you have Ready Check and DBM Pull as the last 2 buttons (easier to use imo)

* Update RaidUtility.lua

Added a check for DBM-Core, has to be loaded for the buttons to show. Split the timers in 2, one for a 10s pull timer and one for a 5s pull timer. Right now it calls the command through the chat box, if I find the correct API from DBM I will make it call that
2023-01-27 15:16:16 -07:00

254 lines
9.5 KiB
Lua

local E, L = unpack(select(2, ...)); --Import: Engine, Locales
local RU = E:GetModule("RaidUtility")
local S = E:GetModule("Skins")
--Lua functions
local find = string.find
--WoW API / Variables
local CreateFrame = CreateFrame
local IsInInstance = IsInInstance
local GetNumRaidMembers = GetNumRaidMembers
local GetNumPartyMembers = GetNumPartyMembers
local IsPartyLeader = IsPartyLeader
local IsRaidLeader = IsRaidLeader
local IsRaidOfficer = IsRaidOfficer
local InCombatLockdown = InCombatLockdown
local DoReadyCheck = DoReadyCheck
local ToggleFriendsFrame = ToggleFriendsFrame
if IsAddOnLoaded("DBM-Core") then
PANEL_HEIGHT = 120
else
PANEL_HEIGHT = 100
end
local function CheckRaidStatus()
local inInstance, instanceType = IsInInstance()
if (((IsRaidLeader() or IsRaidOfficer()) and GetNumRaidMembers() > 0) or (IsPartyLeader() and GetNumPartyMembers() > 0)) and not (inInstance and (instanceType == "pvp" or instanceType == "arena")) then
return true
else
return false
end
end
-- Function to create buttons in this module
function RU:CreateUtilButton(name, parent, template, width, height, point, relativeto, point2, xOfs, yOfs, text, texture)
local button = CreateFrame("Button", name, parent, template)
button:Width(width)
button:Height(height)
button:Point(point, relativeto, point2, xOfs, yOfs)
S:HandleButton(button)
if text then
button.text = button:CreateFontString(nil, "OVERLAY", button)
button.text:FontTemplate()
button.text:Point("CENTER", button, "CENTER", 0, -1)
button.text:SetJustifyH("CENTER")
button.text:SetText(text)
button:SetFontString(button.text)
elseif texture then
button.texture = button:CreateTexture(nil, "OVERLAY", nil)
button.texture:SetTexture(texture)
button.texture:Point("TOPLEFT", button, "TOPLEFT", E.mult, -E.mult)
button.texture:Point("BOTTOMRIGHT", button, "BOTTOMRIGHT", -E.mult, E.mult)
end
end
function RU:ToggleRaidUtil(event)
if InCombatLockdown() then
self:RegisterEvent("PLAYER_REGEN_ENABLED", "ToggleRaidUtil")
return
end
if CheckRaidStatus() then
if RaidUtilityPanel.toggled == true then
RaidUtility_ShowButton:Hide()
RaidUtilityPanel:Show()
else
RaidUtility_ShowButton:Show()
RaidUtilityPanel:Hide()
end
else
RaidUtility_ShowButton:Hide()
RaidUtilityPanel:Hide()
end
if event == "PLAYER_REGEN_ENABLED" then
self:UnregisterEvent("PLAYER_REGEN_ENABLED", "ToggleRaidUtil")
end
end
function RU:Initialize()
if not E.private.general.raidUtility then return end
self.Initialized = true
--Create main frame
local RaidUtilityPanel = CreateFrame("Frame", "RaidUtilityPanel", E.UIParent, "SecureHandlerClickTemplate")
RaidUtilityPanel:SetTemplate("Transparent")
RaidUtilityPanel:Width(230)
RaidUtilityPanel:Height(PANEL_HEIGHT)
RaidUtilityPanel:Point("TOP", E.UIParent, "TOP", -400, 1)
RaidUtilityPanel:SetFrameLevel(3)
RaidUtilityPanel.toggled = false
RaidUtilityPanel:SetFrameStrata("HIGH")
self:CreateUtilButton("RaidUtility_ShowButton", E.UIParent, "SecureHandlerClickTemplate", 136, 18, "TOP", E.UIParent, "TOP", -400, E.Border, RAID_CONTROL, nil)
RaidUtility_ShowButton:SetFrameRef("RaidUtilityPanel", RaidUtilityPanel)
RaidUtility_ShowButton:SetAttribute("_onclick", ([=[
local raidUtil = self:GetFrameRef("RaidUtilityPanel")
local closeButton = raidUtil:GetFrameRef("RaidUtility_CloseButton")
self:Hide()
raidUtil:Show()
local point = self:GetPoint()
local raidUtilPoint, closeButtonPoint, yOffset
if string.find(point, "BOTTOM") then
raidUtilPoint = "BOTTOM"
closeButtonPoint = "TOP"
yOffset = 1
else
raidUtilPoint = "TOP"
closeButtonPoint = "BOTTOM"
yOffset = -1
end
yOffset = yOffset * (tonumber(%d))
raidUtil:ClearAllPoints()
closeButton:ClearAllPoints()
raidUtil:SetPoint(raidUtilPoint, self, raidUtilPoint)
closeButton:SetPoint(raidUtilPoint, raidUtil, closeButtonPoint, 0, yOffset)
]=]):format(-E.Border + E.Spacing * 3))
RaidUtility_ShowButton:SetScript("OnMouseUp", function()
RaidUtilityPanel.toggled = true
end)
RaidUtility_ShowButton:SetMovable(true)
RaidUtility_ShowButton:SetClampedToScreen(true)
RaidUtility_ShowButton:SetClampRectInsets(0, 0, -1, 1)
RaidUtility_ShowButton:RegisterForDrag("RightButton")
RaidUtility_ShowButton:SetFrameStrata("HIGH")
RaidUtility_ShowButton:SetScript("OnDragStart", function(self)
if InCombatLockdown() then E:Print(ERR_NOT_IN_COMBAT) return end
self:StartMoving()
end)
RaidUtility_ShowButton:SetScript("OnDragStop", function(self)
self:StopMovingOrSizing()
local point = self:GetPoint()
local xOffset = self:GetCenter()
local screenWidth = E.UIParent:GetWidth() / 2
xOffset = xOffset - screenWidth
self:ClearAllPoints()
if find(point, "BOTTOM") then
self:Point("BOTTOM", E.UIParent, "BOTTOM", xOffset, -1)
else
self:Point("TOP", E.UIParent, "TOP", xOffset, 1)
end
end)
self:CreateUtilButton("RaidUtility_CloseButton", RaidUtilityPanel, "SecureHandlerClickTemplate", 136, 18, "TOP", RaidUtilityPanel, "BOTTOM", 0, -1, CLOSE, nil)
RaidUtility_CloseButton:SetFrameRef("RaidUtility_ShowButton", RaidUtility_ShowButton)
RaidUtility_CloseButton:SetAttribute("_onclick", [=[self:GetParent():Hide(); self:GetFrameRef("RaidUtility_ShowButton"):Show();]=])
RaidUtility_CloseButton:SetScript("OnMouseUp", function() RaidUtilityPanel.toggled = false end)
RaidUtilityPanel:SetFrameRef("RaidUtility_CloseButton", RaidUtility_CloseButton)
self:CreateUtilButton("DisbandRaidButton", RaidUtilityPanel, nil, RaidUtilityPanel:GetWidth() * 0.8, 18, "TOP", RaidUtilityPanel, "TOP", 0, -5, L["Disband Group"], nil)
DisbandRaidButton:SetScript("OnMouseUp", function()
if CheckRaidStatus() then
E:StaticPopup_Show("DISBAND_RAID")
end
end)
self:CreateUtilButton("MainTankButton", RaidUtilityPanel, "SecureActionButtonTemplate", (DisbandRaidButton:GetWidth() / 2) - 2, 18, "TOPLEFT", DisbandRaidButton, "BOTTOMLEFT", 0, -5, MAINTANK, nil)
MainTankButton:SetAttribute("type", "maintank")
MainTankButton:SetAttribute("unit", "target")
MainTankButton:SetAttribute("action", "toggle")
self:CreateUtilButton("MainAssistButton", RaidUtilityPanel, "SecureActionButtonTemplate", (DisbandRaidButton:GetWidth() / 2) - 2, 18, "TOPRIGHT", DisbandRaidButton, "BOTTOMRIGHT", 0, -5, MAINASSIST, nil)
MainAssistButton:SetAttribute("type", "mainassist")
MainAssistButton:SetAttribute("unit", "target")
MainAssistButton:SetAttribute("action", "toggle")
self:CreateUtilButton("RaidControlButton", RaidUtilityPanel, nil, MainTankButton:GetWidth(), 18, "TOPLEFT", MainTankButton, "BOTTOMLEFT", 0, -5, L["Raid Menu"], nil)
RaidControlButton:SetScript("OnMouseUp", function()
if InCombatLockdown() then E:Print(ERR_NOT_IN_COMBAT) return end
ToggleFriendsFrame(5)
end)
self:CreateUtilButton("ConvertRaidButton", RaidUtilityPanel, nil, MainAssistButton:GetWidth(), 18, "TOPRIGHT", MainAssistButton, "BOTTOMRIGHT", 0, -5, CONVERT_TO_RAID, nil)
ConvertRaidButton:SetScript("OnMouseUp", function()
if CheckRaidStatus() then
ConvertToRaid()
SetLootMethod("master", "player")
end
end)
ConvertRaidButton:SetScript("OnEvent", function(btn)
if GetNumRaidMembers() == 0 and GetNumPartyMembers() > 0 and IsPartyLeader() then
if not btn:IsShown() then
RaidControlButton:Width(MainAssistButton:GetWidth())
btn:Show()
end
elseif btn:IsShown() then
RaidControlButton:Width(DisbandRaidButton:GetWidth())
btn:Hide()
end
end)
ConvertRaidButton:RegisterEvent("RAID_ROSTER_UPDATE")
ConvertRaidButton:RegisterEvent("PARTY_MEMBERS_CHANGED")
ConvertRaidButton:RegisterEvent("PLAYER_ENTERING_WORLD")
self:CreateUtilButton("ReadyCheckButton", RaidUtilityPanel, nil, RaidUtilityPanel:GetWidth() * 0.8, 18, "TOPLEFT", RaidControlButton, "BOTTOMLEFT", 0, -5, READY_CHECK, nil)
ReadyCheckButton:SetScript("OnMouseUp", function()
if CheckRaidStatus() then
DoReadyCheck()
end
end)
ReadyCheckButton:SetScript("OnEvent", function(btn)
if not (IsRaidLeader("player") or IsRaidOfficer("player")) then
btn:Disable()
else
btn:Enable()
end
end)
ReadyCheckButton:RegisterEvent("RAID_ROSTER_UPDATE")
ReadyCheckButton:RegisterEvent("PARTY_MEMBERS_CHANGED")
ReadyCheckButton:RegisterEvent("PLAYER_ENTERING_WORLD")
if IsAddOnLoaded("DBM-Core") then
self:CreateUtilButton("DBMPullButton10", RaidUtilityPanel, nil, MainTankButton:GetWidth(), 18, "TOPLEFT", ReadyCheckButton, "BOTTOMLEFT", 0, -5, L["Pull 10"], nil)
DBMPullButton10:SetScript("OnMouseUp", function()
if InCombatLockdown() then E:Print(ERR_NOT_IN_COMBAT) return end
-- Hacked way to make the dbm call, will update if I find the apis for it
local editbox=ChatEdit_ChooseBoxForSend(DEFAULT_CHAT_FRAME)
ChatEdit_ActivateChat(editbox)
editbox:SetText("/dbm pull 10")
ChatEdit_OnEnterPressed(editbox)
end)
self:CreateUtilButton("DBMPullButton5", RaidUtilityPanel, nil, MainTankButton:GetWidth(), 18, "TOPRIGHT", ReadyCheckButton, "BOTTOMRIGHT", 0, -5, L["Pull 5"], nil)
DBMPullButton5:SetScript("OnMouseUp", function()
if InCombatLockdown() then E:Print(ERR_NOT_IN_COMBAT) return end
-- Hacked way to make the dbm call, will update if I find the apis for it
local editbox=ChatEdit_ChooseBoxForSend(DEFAULT_CHAT_FRAME)
ChatEdit_ActivateChat(editbox)
editbox:SetText("/dbm pull 5")
ChatEdit_OnEnterPressed(editbox)
end)
end
--Automatically show/hide the frame if we have RaidLeader or RaidOfficer
self:RegisterEvent("RAID_ROSTER_UPDATE", "ToggleRaidUtil")
self:RegisterEvent("PLAYER_ENTERING_WORLD", "ToggleRaidUtil")
self:RegisterEvent("PARTY_MEMBERS_CHANGED", "ToggleRaidUtil")
end
local function InitializeCallback()
RU:Initialize()
end
E:RegisterInitialModule(RU:GetName(), InitializeCallback)