Files
coa-elvui/ElvUI/Modules/Misc/RaidUtility.lua
T
Andrew6810 60ef8a38af init
2022-10-21 07:09:01 -07:00

226 lines
8.3 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
local PANEL_HEIGHT = 100
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("ReadyCheckButton", RaidUtilityPanel, nil, RaidUtilityPanel:GetWidth() * 0.8, 18, "TOPLEFT", MainTankButton, "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")
self:CreateUtilButton("RaidControlButton", RaidUtilityPanel, nil, MainTankButton:GetWidth(), 18, "TOPLEFT", ReadyCheckButton, "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", ReadyCheckButton, "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")
--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)