-- Copyright 2023 -- -- This file is part of Omicron Frames -- -- Omicron Frames is free software: you can redistribute it and/or modify it -- under the terms of the GNU General Public License as published by the Free -- Software Foundation, either version 3 of the License, or (at your option) -- any later version. -- -- Omicron Frames is distributed in the hope that it will be useful, but -- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -- more details. -- -- You should have received a copy of the GNU General Public License along with -- Omicron Frames. If not, see . local omif = select(2, ...) local colors = { cyan = { 0.0, 0.8, 0.8 }, white = { 1.0, 1.0, 1.0 }, orange = { 1.0, 0.5, 0 }, violet = { 1.0, 0, 1.0 }, magic = { 0.4, 0.4, 1.0 }, disease = { 0.4, 0.2, 0.0 }, poison = { 0.0, 0.7, 0.7 }, curse = { 0.7, 0.0, 0.7 }, red = { 1, 0, 0 }, blue = { .4, 0.4, 1 }, light_blue = { .7, .7, 1 }, } local function RangeConfig() local _, class = UnitClass("player") if class == "SHAMAN" then return { friendly = "Healing Surge", enemy = "Lightning Bolt", fade = 0.2 } elseif class == "PRIEST" then return { friendly = "Flash Heal", enemy = "Smite", fade = 0.2 } else return { fade = 0.2 } end end local function MouseConfig() local _, class = UnitClass("player") if class == "SHAMAN" then return { -- No modifier { button = "mouse1", mods = {}, kind = "target" }, { button = "mouse2", mods = {}, kind = "macro", data = "/use [@UNIT,dead,help]Ancestral Vision; [@UNIT,help]Chain Heal" }, { button = "mouse3", mods = {}, kind = "macro", data = "/use [@UNIT,dead,help]Ancestral Spirit; [@UNIT,help]Purify Spirit" }, { button = "wheel-up", mods = {}, kind = "macro", data = "/use [@UNIT,help]Healing Surge" }, { button = "wheel-down", mods = {}, kind = "macro", data = "/use [@UNIT,help]Riptide" }, -- alt { button = "wheel-up", mods = { alt = true }, kind = "spell", data = "Healing Wave" }, { button = "wheel-down", mods = { alt = true }, kind = "spell", data = "Earth Shield" }, -- Shift { button = "mouse2", mods = { shift = true }, kind = "togglemenu" }, { button = "wheel-up", mods = { shift = true }, kind = "macro", data = "/cast [@UNIT,help]Water Walking;\n/stopspelltarget" }, } elseif class == "PRIEST" then return { -- No modifier { button = "mouse1", mods = {}, kind = "target" }, { button = "mouse2", mods = {}, kind = "macro", data = "/use [@UNIT,dead,help]Mass Resurrection; [@UNIT,help]Power Word: Radiance" }, { button = "mouse3", mods = {}, kind = "macro", data = "/use [@UNIT,dead,help]Resurrection; [@UNIT,help]Purify" }, { button = "mouse4", mods = {}, kind = "spell", data = "Shadow Covenant" }, { button = "wheel-up", mods = {}, kind = "macro", data = "/use [@UNIT,help]Flash Heal" }, { button = "wheel-down", mods = {}, kind = "macro", data = "/use [@UNIT,help]Renew" }, -- alt { button = "mouse1", mods = { alt = true }, kind = "spell", data = "Power Word: Life" }, { button = "mouse2", mods = { alt = true }, kind = "spell", data = "Pain Suppression" }, { button = "mouse3", mods = { alt = true }, kind = "spell", data = "Power Infusion" }, { button = "wheel-up", mods = { alt = true }, kind = "spell", data = "Rapture" }, { button = "wheel-down", mods = { alt = true }, kind = "spell", data = "Power Word: Shield" }, -- Shift { button = "mouse2", mods = { shift = true }, kind = "togglemenu" }, { button = "wheel-up", mods = { shift = true }, kind = "macro", data = "/cast [@UNIT,help]Levitate;\n/stopspelltarget" }, { button = "wheel-down", mods = { shift = true }, kind = "macro", data = "/cast [@UNIT,help]Leap of Faith;\n/stopspelltarget" }, } elseif class == "MONK" then return { -- No modifier { button = "mouse1", mods = {}, kind = "target" }, { button = "mouse2", mods = {}, kind = "macro", data = ("/use [@UNIT,known:Reawaken,dead,help]Reawaken; " .. "[@UNIT,dead,help]Resuscitate; " .. "[@UNIT,help]Tiger's Lust"), }, { button = "mouse3", mods = {}, kind = "macro", data = "/use [@UNIT,dead,help]Resuscitate; [@UNIT,help]Detox" }, { button = "mouse4", mods = {}, kind = "spell", data = "Shadow Covenant" }, { button = "wheel-up", mods = {}, kind = "macro", data = "/use [@UNIT,help]Vivify" }, { button = "wheel-down", mods = {}, kind = "macro", data = "/use [@UNIT,help]Soothing Mist" }, -- alt { button = "mouse1", mods = { alt = true }, kind = "spell", data = "Power Word: Life" }, { button = "mouse2", mods = { alt = true }, kind = "spell", data = "Pain Suppression" }, { button = "mouse3", mods = { alt = true }, kind = "spell", data = "Power Infusion" }, { button = "wheel-up", mods = { alt = true }, kind = "spell", data = "Rapture" }, { button = "wheel-down", mods = { alt = true }, kind = "spell", data = "Power Word: Shield" }, -- Shift { button = "mouse2", mods = { shift = true }, kind = "togglemenu" }, { button = "wheel-up", mods = { shift = true }, kind = "macro", data = "/cast [@UNIT,help]Levitate;\n/stopspelltarget" }, { button = "wheel-down", mods = { shift = true }, kind = "macro", data = "/cast [@UNIT,help]Leap of Faith;\n/stopspelltarget" }, } else return { -- Super basic defaults { button = "mouse1", mods = {}, kind = "target" }, { button = "mouse2", mods = { shift = true }, kind = "togglemenu" }, } end end local function TriggerClassConfig() local _, class = UnitClass("player") if class == "SHAMAN" then return { { kind = "AuraTrigger", spellId = 383648, own = true, -- Second Earth Shield on yourself indicator = { kind = "SquareIndicator", size = 17, point = "TOPLEFT", x = 3, y = -3, color = colors.white, showStacks = true, } }, { kind = "AuraTrigger", spellId = 974, own = true, -- Second Earth Shield on yourself indicator = { kind = "SquareIndicator", size = 17, point = "TOPLEFT", x = 3, y = -3, color = colors.white, showStacks = true, } }, { kind = "AuraTrigger", spellId = 61295, own = true, -- Riptide indicator = { kind = "SquareIndicator", size = 17, point = "BOTTOMLEFT", x = 3, y = 3, color = colors.cyan, fadeTime = 10.0, } }, { kind = "StatusTrigger", status = "Burn", invert = false, indicator = { kind = "BorderIndicator", thickness = 3.0, color = colors.red, level = 0, } }, } elseif class == "PRIEST" then return { { kind = "AuraTrigger", spellId = 17, own = true, -- Power Word: Shield indicator = { kind = "SquareIndicator", size = 17, point = "TOPLEFT", x = 3, y = -3, color = colors.white, fadeTime = 10.0, } }, { kind = "AuraTrigger", spellId = 33206, own = true, -- Pain Suppression indicator = { kind = "SquareIndicator", size = 17, point = "TOPLEFT", x = 22, y = -3, color = colors.orange, fadeTime = 10.0, flashTime = 1.3, } }, { kind = "AuraTrigger", spellId = 41635, own = true, -- Prayer of Mending indicator = { kind = "SquareIndicator", size = 17, point = "TOPLEFT", x = 41, y = -3, color = { 0.7, 0.9, 1 }, showStacks = true, } }, { kind = "AuraTrigger", spellId = 139, own = true, -- Renew indicator = { kind = "SquareIndicator", size = 17, point = "BOTTOMLEFT", x = 3, y = 3, color = colors.cyan, fadeTime = 10.0, } }, { kind = "AuraTrigger", spellId = 194384, own = true, -- Atonement indicator = { kind = "SquareIndicator", size = 17, point = "BOTTOMLEFT", x = 22, y = 3, color = colors.white, fadeTime = 10.0, flashTime = 1.3, } }, { kind = "AuraTrigger", spellId = 10060, own = true, -- Power Infusion indicator = { kind = "SquareIndicator", size = 17, point = "BOTTOMLEFT", x = 41, y = 3, color = colors.violet, fadeTime = 10.0, } }, { kind = "StatusTrigger", status = "Burn", invert = false, indicator = { kind = "BorderIndicator", thickness = 3.0, color = colors.red, level = 0, } }, --[[{ kind="MultiTrigger", invert=false, children = { {kind="StatusTrigger", status="Immune", defaultData={color=colors.violet}}, -- Renew {kind="AuraTrigger", spellId=139, own=true, defaultData={color=colors.cyan}}, -- Renew {kind="AuraTrigger", spellId=21562, own=true, defaultData={color=colors.white}}, -- pw:f }, indicator = { kind="SquareIndicator", size=17, point="TOPRIGHT", x=-3, y=-3, color=colors.white, } }--]] } else return {} end end -- Quick helper function to create a config for debuff triggers local function MakeDebuffTrigger(slot, spellid, color, stacks) if stacks == nil then stacks = false end return { kind = "AuraTrigger", spellId = spellid, indicator = { kind = "SquareIndicator", size = 15, point = "TOPRIGHT", x = -17 * slot, y = -3, color = color, showStacks = stacks, } } end local function TriggerConfig() local triggers = TriggerClassConfig() -- slot, spellid, color, stacks local debuffs = { -- Kezzara, Aberrus { 1, 406525, colors.orange }, -- Dread Rift { 2, 402253, colors.red }, -- Ray of Anguish { 3, 404743, colors.violet, true }, -- Terror Claws -- Forgotten Experiment, Aberrus { 1, 406365, colors.red, true }, -- Rending Charge (p1) { 1, 407327, colors.cyan, true }, -- Unstable Essence (p2/p3) { 3, 407313, colors.violet, true }, -- Infused Strikes -- Uldaman: Legacy of Tyr { 1, 377510, colors.cyan, true }, -- Stolen Time -- Brackenhide Hollow { 1, 367521, colors.cyan, true }, -- Bone Bolt -- The Underrot --{1, 273226, colors.green, true}, -- Decaying Spores -- Sarkareth, Aberrus { 3, 401330, colors.violet }, -- Burning Claws (P1 tank) { 3, 411241, colors.violet }, -- Void Claws (P2 tank) { 3, 408429, colors.violet }, -- Void Slash (P3 tank) { 2, 404218, colors.blue }, -- Void Fracture (carry bomb) { 1, 401951, colors.cyan, true }, -- Oblivion } for _, debuff in ipairs(debuffs) do table.insert(triggers, MakeDebuffTrigger(debuff[1], debuff[2], debuff[3], debuff[4])) end return triggers end local types = omif.GetModule("types") local UnitFrame = types.UnitFrame local UnitGroup = types.UnitGroup -- re-parent all blizzard frames and then hide the new parent function HideBlizzardFrames() local toggleFrame = CreateFrame("Frame", nil, UIParent) blizzardFrames = { PlayerFrame, TargetFrame, FocusFrame, PartyFrame, CompactRaidFrameContainer } for _, frame in ipairs(blizzardFrames) do frame:SetParent(toggleFrame) end toggleFrame:Hide() end function CreateRaidFrames(left, top, config) local width = config.size.width local height = config.size.height local group = UnitGroup:new(left, top, width, height) for i = 0, 5 do for j = 0, 4 do local num = i * 5 + j + 1 local frame = UnitFrame:new("raid" .. num, config) group:AddUnitFrame(frame) end end end function CreatePartyFrames(left, top, config) local width = config.size.width local height = config.size.height local group = UnitGroup:new(left, top, width, height) local player = UnitFrame:new("player", config) group:AddUnitFrame(player) for i = 1, 4 do local frame = UnitFrame:new("party" .. i, config) group:AddUnitFrame(frame) end group:Sort() end function CreateTargetFrames(left, top, config) local width = config.size.width local height = config.size.height local focus = UnitFrame:new("focus", config) focus:SetPosition(left, top) local target = UnitFrame:new("target", config) target:SetPosition(left, top - height) for i = 1, 4 do local boss = UnitFrame:new("boss" .. i, config) boss:SetPosition(left, top - (i + 1) * height) end end function CreateFrames() local config = { size = { width = 111, height = 45, }, range = RangeConfig(), mouse = MouseConfig(), hideInRaid = true, triggers = TriggerConfig(), } CreatePartyFrames(-0.05, -290.05, config) config.hideInRaid = false CreateRaidFrames(-0.05, -290.05, config) CreateTargetFrames(110 * 3 + 50 - 0.05, -245.05, config) HideBlizzardFrames() end omif.SetEventHandler("OMICRON_LOADING", CreateFrames)