ElvUI/Modules/Misc/RaidMarker.lua

110 lines
3.3 KiB
Lua

--Credit Baudzilla
local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
local M = E:GetModule('Misc')
local sin, cos, rad = math.sin, math.cos, rad -- sin~=math.sin, cos~=math.cos, rad==math.rad; why? who knows? :P
local CreateFrame = CreateFrame
local GetNumGroupMembers = GetNumGroupMembers
local UnitIsGroupLeader = UnitIsGroupLeader
local UnitIsGroupAssistant = UnitIsGroupAssistant
local IsInGroup, IsInRaid = IsInGroup, IsInRaid
local UnitExists, UnitIsDead = UnitExists, UnitIsDead
local GetCursorPosition = GetCursorPosition
local PlaySound = PlaySound
local SetRaidTarget = SetRaidTarget
local SetRaidTargetIconTexture = SetRaidTargetIconTexture
local UIErrorsFrame = UIErrorsFrame
-- GLOBALS: RaidMark_HotkeyPressed
local ButtonIsDown
function M:RaidMarkCanMark()
if not self.RaidMarkFrame then return false; end
if GetNumGroupMembers() > 0 then
if UnitIsGroupLeader('player') or UnitIsGroupAssistant('player') then
return true;
elseif IsInGroup() and not IsInRaid() then
return true;
else
UIErrorsFrame:AddMessage(L["You don't have permission to mark targets."], 1.0, 0.1, 0.1, 1.0);
return false;
end
else
return true
end
end
function M:RaidMarkShowIcons()
if not UnitExists('target') or UnitIsDead('target')then
return;
end
local x, y = GetCursorPosition();
local scale = E.UIParent:GetEffectiveScale();
self.RaidMarkFrame:Point('CENTER', E.UIParent, 'BOTTOMLEFT', x / scale, y / scale);
self.RaidMarkFrame:Show();
end
function RaidMark_HotkeyPressed(keystate)
ButtonIsDown = (keystate=='down') and M:RaidMarkCanMark();
if ButtonIsDown and M.RaidMarkFrame then
M:RaidMarkShowIcons();
elseif M.RaidMarkFrame then
M.RaidMarkFrame:Hide();
end
end
function M:RaidMark_OnEvent()
if ButtonIsDown and self.RaidMarkFrame then
self:RaidMarkShowIcons();
end
end
M:RegisterEvent('PLAYER_TARGET_CHANGED', 'RaidMark_OnEvent');
function M:RaidMarkButton_OnEnter()
self.Texture:ClearAllPoints();
self.Texture:Point('TOPLEFT', -10, 10);
self.Texture:Point('BOTTOMRIGHT', 10, -10);
end
function M:RaidMarkButton_OnLeave()
self.Texture:SetAllPoints();
end
function M:RaidMarkButton_OnClick(arg1)
PlaySound(1115) --U_CHAT_SCROLL_BUTTON
SetRaidTarget('target', (arg1~='RightButton') and self:GetID() or 0);
self:GetParent():Hide();
end
local ANG_RAD = rad(360) / 7
function M:LoadRaidMarker()
local marker = CreateFrame('Frame', nil, E.UIParent);
marker:EnableMouse(true);
marker:SetFrameStrata('DIALOG');
marker:Size(100);
for i = 1, 8 do
local button = CreateFrame('Button', 'RaidMarkIconButton'..i, marker);
button:Size(40);
button:SetID(i);
button.Texture = button:CreateTexture(button:GetName()..'NormalTexture', 'ARTWORK');
button.Texture:SetTexture([[Interface\TargetingFrame\UI-RaidTargetingIcons]]);
button.Texture:SetAllPoints();
SetRaidTargetIconTexture(button.Texture, i);
button:RegisterForClicks('LeftbuttonUp','RightbuttonUp');
button:SetScript('OnClick', M.RaidMarkButton_OnClick);
button:SetScript('OnEnter', M.RaidMarkButton_OnEnter);
button:SetScript('OnLeave', M.RaidMarkButton_OnLeave);
if i == 8 then
button:Point('CENTER');
else
local angle = ANG_RAD * (i - 1)
button:Point('CENTER', sin(angle) * 60, cos(angle) * 60);
end
end
M.RaidMarkFrame = marker;
end