WoWInterface SVN ristrettoPower

[/] [trunk/] [core.lua] - Rev 2

Compare with Previous | Blame | View Log

addon, ns = ...
local util = ns.util

local pinfo = {
  class = string.upper(select(2, UnitClass('player'))),
  level = UnitLevel("player")
}

local __, _, _, tocversion = GetBuildInfo()

-- color definitions
local defaults = {
        ["SHAMAN"]  = {
                colors = { 0, 0, 1 },
                blips = 5,
        },
        ["PALADIN"] = {
                colors = { 0.81, 0.04, 0.97 },
                blips = 3,
        },
        ["DRUID"] = {
                colors = { 1, 1, 0 },
                blips  = 5,
        },
        ["ROGUE"] = {
                colors = { 1, 1, 0 },
                blips = 5,
        },
        ["WARLOCK"] = {
                colors = { 0.81, 0.04, 0.97 },
                blips = 3,
        },
        ["PRIEST"] = {
                colors = { 0.8, 0.4, 0.8 },
                blips = 3,
        },
}

-- if we don't have a color definition we don't need to carry on
if util.tmisses(defaults, pinfo.class) then return end

local backdrop = {
                bgFile = [[Interface\ChatFrame\ChatFrameBackground]],
    edgeFile = [[Interface/Tooltips/UI-Tooltip-Border]],
    tile = true, tileSize = 4, edgeSize = 4,
    insets = { left = 1, right = 1, top = 1, bottom = 1 }
}

if rPwrConf == nil then
        rPwrConf = {
                ato = "CENTER",
                x   = 0,
                y   = 0,
                scale = 1,
                enabled = true,
                mycolors = nil,
        }
end

local max_blip, red, green, blue, catStance
local cfg_size = 19

rCPFrame = CreateFrame("Frame", "rCPFrame")
rCPFrame:RegisterEvent("VARIABLES_LOADED")

rCPFrame:SetScript("OnEvent", function(self, event, ...)
        if event == "VARIABLES_LOADED" then
                self:UnregisterEvent("VARIABLES_LOADED")
                self:Init()
        end
end)

function rCPFrame:Init()
        max_blip, red, green, blue = initClass()

        if pinfo.class == "DRUID" or pinfo.class == "ROGUE" then
                makeFrames(max_blip, red, green, blue, false)
                util.updateVisuals(max_blip, util.currCP(), red, green, blue)

                rCPFrame:RegisterEvent("UNIT_COMBO_POINTS")
                rCPFrame:RegisterEvent("PLAYER_TARGET_CHANGED")

                if pinfo.class == "DRUID" then -- turn display off when not in kitty
                        druidShowHide()
                        rCPFrame:RegisterEvent("UPDATE_SHAPESHIFT_FORM")
                end

                if pinfo.class == "ROGUE" then
                        if rPwrConf.dpstack == true then -- envenom counter
                                rCPFrame:RegisterEvent("UNIT_AURA")
                        end
                end

                rCPFrame:SetScript("OnEvent", function(self, event, unit)

                        if pinfo.class == "DRUID" and event == "UPDATE_SHAPESHIFT_FORM" then
                                druidShowHide()
                        end

                        if pinfo.class == "ROGUE" and event == "UNIT_AURA" then
                                if rPwrConf.dpstack == true and unit == "target" then
                                        local count = util.currDP()
                                        util.updateBorder(5, count, 0, 0, 0, 0, 1, 0)
                                end
                        end

                        util.updateVisuals(max_blip, util.currCP(), red, green, blue)
                        
                        if pinfo.class == "ROGUE" then
                                local count = util.currDP()
                                util.updateBorder(5, count, 0, 0, 0, 0, 1, 0)
                        end

                        if pinfo.class == "DRUID" then
                                druidShowHide()
                        end
                end)
        end

        if pinfo.class == "PALADIN" then
                max_blip, red, green, blue = initClass()

                makeFrames(max_blip, red, green, blue, false)
                util.updateVisuals(max_blip, util.currHolyPower(), red, green, blue)
                rCPFrame:RegisterEvent("UNIT_POWER")
                rCPFrame:SetScript("OnEvent", function(self, event, unit, power)
                        if unit ~= "player" or power ~= "HOLY_POWER" then return end
                                util.updateVisuals(max_blip, util.currHolyPower(), red, green, blue)
                end)
        end

        if pinfo.class == "WARLOCK" then
                max_blip, red, green, blue = initClass()

                makeFrames(max_blip, red, green, blue, false)
                util.updateVisuals(max_blip, util.currShards(), red, green, blue)
                rCPFrame:RegisterEvent("UNIT_POWER")
                rCPFrame:RegisterEvent("PLAYER_ALIVE")
                rCPFrame:SetScript("OnEvent", function(self, event, unit, power)
                  if event == "PLAYER_ALIVE" then
                    util.updateVisuals(max_blip, util.currShards(), red, green, blue)
                  end
                        if unit ~= "player" or power ~= "SOUL_SHARDS" then return end
                        util.updateVisuals(max_blip, util.currShards(), red, green, blue)
                end)
        end

        if pinfo.class == "SHAMAN" then
          rCPFrame.spec = GetPrimaryTalentTree()
                max_blip, red, green, blue = initClass()

    if rCPFrame.spec == 2 then
      cFunc = util.currMaelstrom
                  rCPFrame:RegisterEvent("UNIT_AURA")
                elseif rCPFrame.spec == 1 then
                  rCPFrame:RegisterEvent("UNIT_AURA")
                  cFunc = util.currLB
                  max_blip = 6
                end

    rCPFrame:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED")

                shamanShowHide(rCPFrame.spec)
                if rCPFrame.spec ~= 3 then
                        util.updateVisuals(max_blip, cFunc(), red, green, blue)
                end

                rCPFrame:SetScript("OnEvent", function(self, event, unit)
                        if event == "ACTIVE_TALENT_GROUP_CHANGED" then
                          rCPFrame.spec = GetPrimaryTalentTree()
                          if rCPFrame.spec == 2 then
                            rCPFrame:RegisterEvent("UNIT_AURA")
                            cFunc = util.currMaelstrom
                            max_blip = 5
                            shamanShowHide(rCPFrame.spec)
                                  util.updateVisuals(max_blip, cFunc(), red, green, blue)
        elseif rCPFrame.spec == 1 then
                            rCPFrame:RegisterEvent("UNIT_AURA")
                            cFunc = util.currLB
                            max_blip = 6
                            shamanShowHide(rCPFrame.spec)
                                  util.updateVisuals(max_blip, cFunc(), red, green, blue)                           
                          else
                            rCPFrame:UnregisterEvent("UNIT_AURA")
                            for i = 1, max_blip do
                              _G['powerframe'..i]:Hide()
                            end
                          end
                  else
                    if unit ~= "player" then return end
                          util.updateVisuals(max_blip, cFunc(), red, green, blue)
                        end
                end)
        end

        if pinfo.class == "PRIEST" and GetPrimaryTalentTree() == 3 then
                if pinfo.level < 80 then 
                        print("Priest in Shadow spec detected but not 80, yet. Disabling to preserve pristine power in perpetuum. Reload UI after hitting 80.")
                        return false
                end
                max_blip, red, green, blue = initClass()

                makeFrames(max_blip, red, green, blue, false)
                util.updateVisuals(max_blip, util.currOrbs(), red, green, blue)
                rCPFrame:RegisterEvent("UNIT_AURA")
                rCPFrame:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED")
                rCPFrame:SetScript("OnEvent", function(self, event, unit)
                        if event == "UNIT_AURA" then
                                if unit ~= "player" then return end
                                util.updateVisuals(max_blip, util.currOrbs(), red, green, blue)
                        elseif event == "ACTIVE_TALENT_GROUP_CHANGED" then
                                if GetPrimaryTalentTree() == 3 then
                                        rCPFrame:RegisterEvent("UNIT_AURA")
                                        priestShowHide(true)
                                        util.updateVisuals(max_blip, util.currOrbs(), red, gree, blue)
                                else
                                        rCPFrame:UnregisterEvent("UNIT_AURA")
                                        priestShowHide(false)
                                end
                        end
                end)
        end
end

genFrame = function(red, green, blue, height, width)
        local f = CreateFrame("Frame")
        f:SetWidth(width * (rPwrConf.ratio or 1))
        f:SetHeight(height)
        f:SetBackdrop(backdrop)
        f:SetBackdropColor(red,green,blue,0.5)
        f:SetBackdropBorderColor(0,0,0,1)
        f:Show()
        return f
end

function makeFrames(num, red, green, blue, stretch)
  local mult = 1
  if stretch then 
    mult = 5 / num
  end
        for i = 1, num do
                _G['powerframe'..i] = genFrame(red, green, blue, cfg_size, cfg_size * mult)
                if i == 1 then
                        local gb = _G['powerframe1']
                        gb:SetPoint(rPwrConf.ato, UIParent, rPwrConf.ato, rPwrConf.x, rPwrConf.y)
                        gb:SetMovable(true)
                        gb:EnableMouse(true)
                        gb:RegisterForDrag("LeftButton")
                        gb:SetScript("OnDragStart", function(self)
                                if IsAltKeyDown() and IsShiftKeyDown() then
                                        self:StartMoving()
                                end
                        end)
                        gb:SetScript("OnDragStop", function(self)
                                self:StopMovingOrSizing()
                                _,_, rPwrConf.ato, rPwrConf.x, rPwrConf.y = self:GetPoint(1)
                        end)
                        gb:SetScale(rPwrConf.scale)
                else
                        _G['powerframe'..i]:SetPoint("TOPLEFT", _G['powerframe'..i-1], "TOPRIGHT", 1, 0)
                        _G['powerframe'..i]:SetScale(rPwrConf.scale)
                end
        end
end

function initClass()
        local red, green, blue
        if rPwrConf.mycolors then
                red, green, blue = unpack(rPwrConf.mycolors)
        else
                red, green, blue = unpack(defaults[pinfo.class]["colors"])
        end
        local blips = defaults[pinfo.class]["blips"]
        return blips, red, green, blue
end

local function kittyStance()
        local sid = 0
        local cat = GetSpellInfo(768)
        for i=1, GetNumShapeshiftForms() do
                local _, name, _, _ = GetShapeshiftFormInfo(i)
                if name == cat then sid = i end
        end
        return sid
end

function druidShowHide()
        if GetShapeshiftForm() ~= kittyStance() and util.currCP() == 0 then
                for i = 1, 5 do
                        rCPFrame:UnregisterEvent("UNIT_AURA")
                        _G['powerframe'..i]:Hide()
                end
        else
                for i = 1, 5 do
                        rCPFrame:RegisterEvent("UNIT_AURA")
                        _G['powerframe'..i]:Show()
                end
        end
end

function priestShowHide(show)
        if show then
                for i = 1, 3 do
                        _G['powerframe'..i]:Show()
                end
        else
                for i = 1, 3 do
                        _G['powerframe'..i]:Hide()
                end
        end
end

function shamanShowHide(spec)
  if spec == 1 then
    for i = 1,6 do
      _G['powerframe'..i]:SetWidth(cfg_size * (5/6))
    end
    _G['powerframe6']:Show()
  else
    for i = 1,5 do
      _G['powerframe'..i]:SetWidth(cfg_size)
    end
    _G['powerframe6']:Hide()
  end
end


function ShowColorPicker(r, g, b, cback)
 ColorPickerFrame:SetColorRGB(r,g,b);
 ColorPickerFrame.previousValues = {r,g,b};
 ColorPickerFrame.func, ColorPickerFrame.opacityFunc, ColorPickerFrame.cancelFunc = cback, cback, cback;
 ColorPickerFrame:Hide();
 ColorPickerFrame:Show();
end

function colorCallback(bail)
        local nr, ng, nb
        if bail then
                red, green, blue = unpack(bail)
        else
                red, green, blue = ColorPickerFrame:GetColorRGB();
        end
        util.updateVisuals(max_blip, max_blip, red, green, blue)
        rPwrConf.mycolors = { red, green, blue }
end

SLASH_RP1 = "/rp"
SlashCmdList["RP"] = function(str)
        local switch, message = str:match("^(%S*)%s*(.-)$");
        local cmd = string.lower(switch)
        local msg = string.lower(message)

        if cmd == "scale" then
                msg = tonumber(msg) or 1
                if not(msg <= 5) then msg = 1 end
                for i=1, max_blip do
                        rPwrConf.scale = msg
                        _G['powerframe'..i]:SetScale(msg)
                end
        elseif cmd == "dpstack" then
                if rPwrConf.dpstack == nil or rPwrConf.dpstack == false then
                        rPwrConf.dpstack = true
                        rCPFrame:RegisterEvent("UNIT_AURA")
                else
                        rPwrConf.dpstack = false
                        for i = 1, 5 do
                                _G["powerframe"..i]:SetBackdropBorderColor(0,0,0,1) -- black
                end
                        rCPFrame:UnregisterEvent("UNIT_AURA")
                end
        elseif cmd == "color" then
                if msg == "set" then
                        ShowColorPicker(red, green, blue, colorCallback)
                elseif msg == "reset" then
                        red, green, blue = unpack(defaults[pinfo.class]["colors"])
                        ShowColorPicker(red, green, blue, colorCallback)
                end
        elseif cmd == "ratio" then
                ra = tonumber(msg)
                if ra < 0.2 or ra > 10 then ra = 1 end
                rPwrConf.ratio = ra
                for i = 1,max_blip do
                        local p = _G['powerframe'..i]
                        p:SetWidth(rPwrConf.ratio * floor(p:GetHeight()))
                end
        else
                print("|cFF006699ristretto|r Power")
                print("by Hoern, Nesingwary <hoern@d8c.us>")
                print("Usage:")
                print("/rp scale x||dpstack||color (set||reset)")
                print("dpstack: turn deadly poison stacks on/off")
                print("scale 0-5: grow/shrink blips")
                print("color set: pick a color, any color")
                print("color reset: ugh, that pink is hideous")
        end
end

Compare with Previous | Blame