--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