vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
CT_AddMovable("CT_BuffMod_Drag", CT_BUFFMOD_MOVABLE_BUFFBAR, "BOTTOMLEFT", "BOTTOMLEFT", "MinimapCluster", 10, -20, function(status)
        if ( status ) then
                CT_BuffMod_Drag:Show()
        else
                CT_BuffMod_Drag:Hide();
        end
end, BuffModResetFunction);

CT_ExpireBuffs = { };
CT_BuffNames = { };
CT_LastExpiredBuffs = { };
CT_PlaySound = 0;
local CT_UsingTooltip = 0;

CT_BuffMod_BuffSides = "RIGHT";

CT_ShowDuration = 1;
CT_ShowExpire = 1;
CT_ShowRed = 0;

-- Buffs not to recast
CT_BuffMod_NoRecastBuffs = {
        ["Mind Control"] = 1
};

function CT_BuffFrame_OnLoad()
        MinBuffDurationExpireMessage = 51;      -- Never display an expire message if the buff duration is less than this.
        ExpireMessageTime = 15;         -- How long before the buff expires to display the expire message.
        ExpireMessageColors = { };
        ExpireMessageColors["r"] = 1.0;
        ExpireMessageColors["g"] = 0.0;
        ExpireMessageColors["b"] = 0.0;
        ExpireMessageFrame = DEFAULT_CHAT_FRAME; -- The frame in which to display the expire message.

        BuffStartFlashTime = 16;        -- How long before the buff expires to start flashing.
        BuffFlashOn = 0.50;             -- How long to flash.
        BuffFlashOff = 0.50;            -- How long between each flash.
        BuffMinOpacity = 0.30;          -- Minimum level of opacity.

        BuffFlashState = 0;
        BuffFlashTime = 0;
        BuffFlashUpdateTime = 0;
        BuffFrame:Hide();
        CT_BuffFrame:Show();
end

function CT_BuffFrame_OnUpdate(elapsed)

        if ( BuffFlashUpdateTime > 0 ) then
                BuffFlashUpdateTime = BuffFlashUpdateTime - elapsed;
        else
                BuffFlashUpdateTime = BuffFlashUpdateTime + TOOLTIP_UPDATE_TIME;
        end

        BuffFlashTime = BuffFlashTime - elapsed;

        if ( BuffFlashTime < 0 ) then
                local overtime = -BuffFlashTime;
                if ( BuffFlashState == 1 ) then
                        BuffFlashState = 0;
                        BuffFlashTime = BuffFlashOff;
                else
                        BuffFlashState = 1;
                        BuffFlashTime = BuffFlashOn;
                end
                if ( overtime < BuffFlashTime ) then
                        BuffFlashTime = BuffFlashTime - overtime;
                end
        end
end

function CT_BuffIsDebuff(id)
        for z=0, 23, 1 do
                local dbIndex, dbTemp = GetPlayerBuff(z, "HARMFUL");
                if ( dbIndex == -1 ) then return 0; end

                if ( dbIndex == id ) then
                        return 1;
                end
        end
        return 0;
end

function CT_GetBuffName(unit, i, filt)
        CT_UsingTooltip = 1;
        local filter;
        if ( not filt ) then
                filter = "HELPFUL|HARMFUL";
        else
                filter = filt;
        end
        local buffIndex, untilCancelled = GetPlayerBuff(i, filter);
        local buff;

        if ( buffIndex < 24 ) then
                buff = buffIndex;
                if (buff == -1) then
                        buff = nil;
                end
        end

        if (buff) then
                local tooltip = BTooltip;
                if (unit == "player" and tooltip ) then
                        tooltip:SetPlayerBuff(buffIndex);
                end
                local tooltiptext = getglobal("BTooltipTextLeft1");
                if ( tooltiptext ) then
                        local name = tooltiptext:GetText();
                        if ( name ~= nil ) then
                                CT_UsingTooltip = 0;
                                return name;
                        end
                end
        end
        CT_UsingTooltip = 0;
        return nil;
end


function CT_BuffButton_Update()
        local buffIndex, untilCancelled = GetPlayerBuff(this:GetID(), "HELPFUL|HARMFUL");
        this.buffIndex = buffIndex;
        this.untilCancelled = untilCancelled;

        if ( buffIndex < 0 ) then
                this:Hide();
                return;
        else
                this:SetAlpha(1.0);
                this:Show();
        end

        local icon = getglobal(this:GetName().."Icon");
        icon:SetTexture(GetPlayerBuffTexture(buffIndex, "HELPFUL|HARMFUL"));

        if ( GameTooltip:IsOwned(this) ) then
                GameTooltip:SetPlayerBuff(buffIndex, "HELPFUL|HARMFUL");
        end
        local name = CT_GetBuffName("player", this:GetID(), "HELPFUL|HARMFUL");
        if ( name ) then
                getglobal(this:GetName() .. "DescribeText"):SetText( name );
        end
        CT_BuffNames[this:GetID()] = nil;

end

function CT_BuffButton_OnLoad()
        getglobal(this:GetName() .. "DurationText"):SetTextColor(1, 1, 0);
        local bIndex, untilCancelled = GetPlayerBuff(this:GetID(), "HELPFUL|HARMFUL");
        if ( CT_BuffIsDebuff( temp ) == 1 ) then
                if ( CT_ShowRed == 1 ) then
                        getglobal(this:GetName() .. "DescribeText"):SetTextColor(1, 0, 0);
                else
                        getglobal(this:GetName() .. "DescribeText"):SetTextColor(1, 1, 0);
                end
                getglobal(this:GetName() .. "Debuff"):Show();
        else
                getglobal(this:GetName() .. "DescribeText"):SetTextColor(1, 1, 0);
                getglobal(this:GetName() .. "Debuff"):Hide();
        end
        if ( untilCancelled == 1 or CT_ShowDuration == 0 ) then
                getglobal(this:GetName() .. "DurationText"):SetText("");
        end

        CT_BuffButton_Update();
        this:RegisterForClicks("RightButtonUp");
        this:RegisterEvent("PLAYER_AURAS_CHANGED");

        local descript = getglobal(this:GetName() .. "DescribeText");
        if ( descript ) then descript:Show(); end
end

function CT_BuffButton_OnEvent(event)
        CT_BuffButton_Update();
end

function CT_GetStringTime(seconds)
        local str = "";
        if ( seconds >= 60 ) then
                local minutes = ceil(seconds / 60);
                str = minutes .. " " .. CT_BUFFMOD_MINUTE;
                if ( minutes > 1 ) then
                        str = minutes .. " " .. CT_BUFFMOD_MINUTES;
                else
                        str = minutes .. " " .. CT_BUFFMOD_MINUTE;
                end
        else
                if ( seconds > 1 ) then
                        str = floor(seconds) .. " " .. CT_BUFFMOD_SECONDS;
                else
                        str = floor(seconds) .. " " .. CT_BUFFMOD_SECOND;
                end
        end
        return str;
end

function CT_BuffButton_OnUpdate(elapsed)
        local buffname;
        local bIndex, untilCancelled = GetPlayerBuff( this:GetID(), "HELPFUL|HARMFUL" );
        local isDebuff = CT_BuffIsDebuff(bIndex);
        local buffnum = GetPlayerBuffApplications(bIndex)
        if ( buffnum > 1 ) then
                getglobal(this:GetName() .. "Count"):SetText(buffnum);
        else
                getglobal(this:GetName() .. "Count"):SetText("");
        end
        if ( isDebuff == 1 ) then
                if ( CT_ShowRed == 1 ) then
                        getglobal(this:GetName() .. "DescribeText"):SetTextColor(1, 0, 0);
                else
                        getglobal(this:GetName() .. "DescribeText"):SetTextColor(1, 1, 0);
                end
                getglobal(this:GetName() .. "Debuff"):Show();
        else
                getglobal(this:GetName() .. "DescribeText"):SetTextColor(1, 1, 0);
                getglobal(this:GetName() .. "Debuff"):Hide();
        end
        if ( untilCancelled == 1 ) then
                getglobal(this:GetName() .. "DurationText"):SetText("");
                return;
        end
        if ( not CT_BuffNames[this:GetID()] ) then
                buffname = CT_GetBuffName( "player", this:GetID() );
                CT_BuffNames[this:GetID()] = buffname;
        else
                buffname = CT_BuffNames[this:GetID()];
        end
        local timeLeft = GetPlayerBuffTimeLeft(bIndex);
        local buffAlphaValue;
        if ( timeLeft >= 1 and CT_ShowDuration == 1 ) then 
                getglobal(this:GetName() .. "DurationText"):SetText(CT_GetStringTime(timeLeft)); 
        else
                getglobal(this:GetName() .. "DurationText"):SetText("");
        end

        if ( floor(timeLeft) == MinBuffDurationExpireMessage and not CT_ExpireBuffs[buffname] ) then
                CT_ExpireBuffs[buffname] = 1;
        end

        if ( ceil(timeLeft) == ExpireMessageTime and CT_ExpireBuffs[buffname] and CT_BuffIsDebuff(bIndex) == 0 ) then
                if ( CT_ShowExpire == 1 and not CT_BuffMod_NoRecastBuffs[buffname]) then
                        if ( CT_PlaySound == 1 ) then
                                PlaySound("TellMessage");
                        end
                        CT_BuffMod_AddToQueue(buffname);
                        local message;
                        if ( CT_PlayerSpells[buffname] and GetBindingKey("CT_RECASTBUFF") ) then
                                message = format(ExpireMessageRecastString, buffname, GetBindingText(GetBindingKey("CT_RECASTBUFF"), "KEY_"));
                        else
                                message = format(ExpireMessageString, buffname);
                        end
                        ExpireMessageFrame:AddMessage(message, ExpireMessageColors["r"], ExpireMessageColors["g"], ExpireMessageColors["b"]);
                end
                CT_ExpireBuffs[buffname] = nil;
                CT_BuffNames[this:GetID()] = nil;
        end
        if ( timeLeft < BuffStartFlashTime ) then
                if ( BuffFlashState == 1 ) then
                        buffAlphaValue = (BuffFlashOn - BuffFlashTime) / BuffFlashOn;
                        buffAlphaValue = buffAlphaValue * (1 - BuffMinOpacity) + BuffMinOpacity;
                else
                        buffAlphaValue = BuffFlashTime / BuffFlashOn;
                        buffAlphaValue = (buffAlphaValue * (1 - BuffMinOpacity)) + BuffMinOpacity;
                        this:SetAlpha(BuffFlashTime / BuffFlashOn);
                end
                this:SetAlpha(buffAlphaValue);
        else
                this:SetAlpha(1.0);
        end

        if ( BuffFlashUpdateTime > 0 ) then
                return;
        end
        if ( GameTooltip:IsOwned(this) ) then
                GameTooltip:SetPlayerBuff(bIndex);
        end
end

function CT_BuffButton_OnClick()
        CancelPlayerBuff(this.buffIndex);
end

function CT_Buffs_SwapSides(onLoad)
        local i;
        for i = 0, 23, 1 do
                getglobal("CT_BuffButton" .. i .. "DescribeText"):ClearAllPoints();
                getglobal("CT_BuffButton" .. i .. "DurationText"):ClearAllPoints();
                if ( CT_BuffMod_BuffSides == "RIGHT" or onLoad ) then
                        getglobal("CT_BuffButton" .. i .. "DescribeText"):SetPoint("RIGHT", "CT_BuffButton" .. i, "LEFT", -8, 7);
                        getglobal("CT_BuffButton" .. i .. "DurationText"):SetPoint("RIGHT", "CT_BuffButton" .. i, "LEFT", -8, -7);
                elseif ( CT_BuffMod_BuffSides == "LEFT" ) then
                        getglobal("CT_BuffButton" .. i .. "DescribeText"):SetPoint("LEFT", "CT_BuffButton" .. i, "LEFT", 40, 7);
                        getglobal("CT_BuffButton" .. i .. "DurationText"):SetPoint("LEFT", "CT_BuffButton" .. i, "LEFT", 40, -7);
                end
        end
        if ( onLoad ) then return; end
        if ( CT_BuffMod_BuffSides == "LEFT" ) then
                CT_BuffMod_BuffSides = "RIGHT";
        else
                CT_BuffMod_BuffSides = "LEFT";
        end
end

expirefunction = function(modId, count)
        local val = CT_Mods[modId]["modValue"];
        if ( val == "1min" ) then
                CT_Mods[modId]["modValue"] = "Off";
                if ( count ) then count:SetText("Off"); end
                CT_ShowExpire = 0;
                CT_Print(CT_BUFFMOD_ON_EXPIRE, 1.0, 1.0, 0.0);
        else
                CT_ShowExpire = 1;
                if ( val == "15sec" ) then
                        CT_Mods[modId]["modValue"] = "1min";
                        if ( count ) then count:SetText("1min"); end
                        CT_Print(CT_BUFFMOD_MIN_EXPIRE, 1.0, 1.0, 0.0);
                        ExpireMessageTime = 60;
                        MinBuffDurationExpireMessage = 120;
                elseif ( val == "Off" ) then
                        CT_Mods[modId]["modValue"] = "15sec";
                        if ( count ) then count:SetText("15sec"); end
                        CT_Print(CT_BUFFMOD_SEC_EXPIRE, 1.0, 1.0, 0.0);
                        ExpireMessageTime = 15;
                        MinBuffDuratioonExpireMessage = 51;
                end
        end
end

durationfunction = function(modId)
        if ( CT_ShowDuration == 1 ) then
                CT_ShowDuration = 0;
                CT_SetModStatus(modId, "off");
                CT_Print(CT_BUFFMOD_OFF_DURATION, 1.0, 1.0, 0.0);
        else
                CT_ShowDuration = 1;
                CT_SetModStatus(modId, "on");
                CT_Print(CT_BUFFMOD_ON_DURATION, 1.0, 1.0, 0.0);
        end
end

expireinitfunction = function(modId)
        local val = CT_Mods[modId]["modValue"];
        if ( val == "Off" ) then
                CT_ShowExpire = 0;
        else
                CT_ShowExpire = 1;
                if ( val == "1min" ) then
                        ExpireMessageTime = 60;
                        MinBuffDurationExpireMessage = 120;
                elseif ( val == "15sec" ) then
                        ExpireMessageTime = 15;
                        MinBuffDurationExpireMessage = 51;
                end
        end
end
durationinitfunction = function(modId)
        local val = CT_Mods[modId]["modStatus"];
        if ( val == "on" ) then
                CT_ShowDuration = 1;
        else
                CT_ShowDuration = 0;
        end
end

debuffnamesfunction = function(modId)
        local val = CT_Mods[modId]["modStatus"];
        if ( val == "on" ) then
                CT_ShowRed = 1;
                CT_Print(CT_BUFFMOD_ON_DEBUFF, 1.0, 1.0, 0.0);
        else
                CT_ShowRed = 0;
                CT_Print(CT_BUFFMOD_OFF_DEBUFF, 1.0, 1.0, 0.0);
        end
end

debuffnamesinitfunction = function(modId)
        local val = CT_Mods[modId]["modStatus"];
        if ( val == "on" ) then
                CT_ShowRed = 1;
        else
                CT_ShowRed = 0;
        end
end

lockframefunction = function(modId)
        local val = CT_Mods[modId]["modStatus"];
        if ( val == "off" ) then
                CT_Print(CT_BUFFMOD_OFF_LOCK, 1, 1, 0);
                CT_BuffMod_Drag:Hide();
        else
                CT_Print(CT_BUFFMOD_ON_LOCK, 1, 1, 0);
                CT_BuffMod_Drag:Show();
        end
end

lockframeinitfunction = function(modId)
        local val = CT_Mods[modId]["modStatus"];
        if ( val == "off" ) then
                CT_BuffMod_Drag:Hide();
        else
                CT_BuffMod_Drag:Show();
        end
end

buffmodfunction = function(modId)
        local val = CT_Mods[modId]["modStatus"];
        if ( val == "off" ) then
                CT_Print(CT_BUFFMOD_OFF_TOGGLE, 1, 1, 0);
                CT_BuffFrame:Hide();
                BuffFrame:Show();
                if ( TemporaryEnchantFrame ) then
                        TemporaryEnchantFrame:Show();
                end
        else
                CT_Print(CT_BUFFMOD_ON_TOGGLE, 1, 1, 0);
                CT_BuffFrame:Show();
                BuffFrame:Hide();
                if ( TemporaryEnchantFrame and CT_ItemBuffFrame ) then
                        TemporaryEnchantFrame:Hide();
                elseif ( TemporaryEnchantFrame ) then
                        TemporaryEnchantFrame:Show();
                end
        end
end

buffmodinitfunction = function(modId)
        local val = CT_Mods[modId]["modStatus"];
        if ( val == "off" ) then
                CT_BuffFrame:Hide();
                BuffFrame:Show();
                if ( TemporaryEnchantFrame ) then
                        TemporaryEnchantFrame:Show();
                end
        else
                CT_BuffFrame:Show();
                BuffFrame:Hide();
                if ( TemporaryEnchantFrame and CT_ItemBuffFrame ) then
                        TemporaryEnchantFrame:Hide();
                elseif ( TemporaryEnchantFrame ) then
                        TemporaryEnchantFrame:Show();
                end
        end
end

CT_RegisterMod(CT_BUFFMOD_MODNAME_TOGGLE, CT_BUFFMOD_MODNAME_SUB_TOGGLE, 4, "Interface\\Icons\\Spell_Holy_Renew", CT_BUFFMOD_MODNAME_TOOLTIP_TOGGLE, "on", nil, buffmodfunction, buffmodinitfunction);
CT_RegisterMod(CT_BUFFMOD_MODNAME_EXPIRE, CT_BUFFMOD_MODNAME_SUB_EXPIRE, 4, "Interface\\Icons\\INV_Misc_Note_03", CT_BUFFMOD_MODNAME_TOOLTIP_EXPIRE, "switch", "15sec", expirefunction, expireinitfunction);
CT_RegisterMod(CT_BUFFMOD_MODNAME_DURATION, CT_BUFFMOD_MODNAME_SUB_DURATION, 4, "Interface\\Icons\\INV_Misc_PocketWatch_01", CT_BUFFMOD_MODNAME_TOOLTIP_DURATION, "on", nil, durationfunction, durationinitfunction);
CT_RegisterMod(CT_BUFFMOD_MODNAME_DEBUFF, CT_BUFFMOD_MODNAME_SUB_DEBUFF, 4, "Interface\\Icons\\Spell_Holy_SealOfSacrifice", CT_BUFFMOD_MODNAME_TOOLTIP_DEBUFF, "off", nil, debuffnamesfunction, debuffnamesinitfunction);

function CT_BuffMod_RecastLastBuff()
        local buff = CT_BuffMod_GetExpiredBuff();
        if ( buff and CT_PlayerSpells[buff] ) then
                if ( CT_PlayerSpells[buff] ) then
                        CT_BuffMod_LastCastSpell = buff;
                        CT_BuffMod_LastCast = GetTime();
                        if ( UnitExists("target") and UnitIsFriend("player", "target") ) then
                                TargetUnit("player");
                        end
                        CastSpell(CT_PlayerSpells[buff]["spell"], CT_PlayerSpells[buff]["tab"]+1);
                        if ( SpellIsTargeting() and SpellCanTargetUnit("player") ) then
                                SpellTargetUnit("player");
                        end
                end
        end
end

function CT_BuffButton_OnEnter()
        if ( this:GetCenter() < UIParent:GetCenter() ) then
                GameTooltip:SetOwner(this, "ANCHOR_RIGHT");
        else
                GameTooltip:SetOwner(this, "ANCHOR_LEFT");
        end
        GameTooltip:SetPlayerBuff(this.buffIndex);
end

function CT_BuffMod_AddToQueue(name)
        local hKey = 0;
        local hVal = 0;
        for key, val in CT_LastExpiredBuffs do
                if ( val > hVal ) then
                        hKey = key; hVal = val;
                end
        end
        if ( hKey == name ) then return; end
        
        CT_LastExpiredBuffs[name] = hVal+1;
end

function CT_BuffMod_GetExpiredBuff()
        local hKey = 0;
        local hVal = 0;
        for key, val in CT_LastExpiredBuffs do
                if ( val > hVal ) then
                        hKey = key; hVal = val;
                end
        end
        if ( hKey ~= 0 and hVal ~= 0 ) then
                CT_LastExpiredBuffs[hKey] = nil;
                return hKey;
        else
                return nil;
        end
end

function CT_BuffMod_OnEvent(event)
        if ( CT_BuffMod_LastCast and (GetTime()-CT_BuffMod_LastCast) <= 0.1 ) then
                CT_BuffMod_AddToQueue(CT_BuffMod_LastCastSpell);
                CT_BuffMod_LastCast = nil;
                CT_BuffMod_LastCastSpell = nil;
        end
end

function BuffModResetFunction()
        if ( CT_BuffMod_BuffSides == "LEFT" ) then
                CT_Buffs_SwapSides();
        end
end

ChirpFunction = function(modId)
        local val = CT_Mods[modId]["modStatus"];
        if ( val == "off" ) then
                CT_Print(CT_BUFFMOD_OFF_CHIRP, 1, 1, 0);
                CT_PlaySound = 0;
        else
                CT_Print(CT_BUFFMOD_ON_CHIRP, 1, 1, 0);
                CT_PlaySound = 1;
        end
end

ChirpInitFunction = function(modId)
        local val = CT_Mods[modId]["modStatus"];
        if ( val == "off" ) then
                CT_PlaySound = 0;
        else
                CT_PlaySound = 1;
        end
end

CT_RegisterMod(CT_BUFFMOD_MODNAME_SOUND, CT_BUFFMOD_SUB_SOUND, 4, "Interface\\Icons\\INV_Misc_Bell_01", CT_BUFFMOD_TOOLTIP_SOUND, "off", nil, ChirpFunction, ChirpInitFunction);

Generated by GNU Enscript 1.6.5.90.