vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
function GB_Get(bar, button, param3)
        if (not GB_INITIALIZED) then return; end
        if (param3) then
                return GB_Settings[GB_INDEX][bar].Button[button][param3];
        elseif (button) then
                return GB_Settings[GB_INDEX][bar].Button[button];
        else
                return GB_Settings[GB_INDEX][bar];
        end
end

function GB_Set(bar, arg2, arg3, arg4)
        if (arg4 ~= nil) then
                GB_Settings[GB_INDEX][bar].Button[arg2][arg3] = arg4;
        elseif (arg3 ~= nil) then
                GB_Settings[GB_INDEX][bar][arg2] = arg3;
        else
                GB_Settings[GB_INDEX][bar] = arg2;
        end
end

function GB_Get_ActionUsuable(name, rank, button)
        if (GB_Get("disableActionInProgressSpam") and GB_SPELLISCASTING) then
                return false;
        end
        if (GB_Get("disableOutOfRangeSpam")) then
                local range = GB_SPELLS[name][rank].range;
                if (range) then
                        if (IsActionInRange(range) == 0 and button:GetParent().unit == "target") then
                                return false;
                        end
                end
        end
        if (GB_Get("disableCantDoYetSpam")) then
                local _,duration = GetSpellCooldown(GB_SPELLS[name][rank].id, BOOKTYPE_SPELL);
                if (duration ~= 0) then return; end
        end
        return true;
end

function GB_Get_AnnounceText(spellName, spellRank, unit, announceNum)
        local text = GB_Settings[GB_INDEX].announcements[announceNum];
        local target = UnitName(unit);
        if (not target) then target = ""; end
        local castingTime = GB_SPELLS[spellName][spellRank].castingTime;
        if (not castingTime) then castingTime = ""; end
        local healAmount = math.floor(GB_SPELLS[spellName][spellRank].avg);
        if (not healAmount) then healAmount = ""; end
        local manaRemaining = math.floor(UnitMana("player") / UnitManaMax("player") * 100);
        if (manaRemaining) then
                manaRemaining = manaRemaining.."%%";
        else
                manaRemaining = "";
        end
        text = string.gsub(text, '$t', target);
        text = string.gsub(text, '$r', spellRank);
        text = string.gsub(text, '$s', spellName);
        text = string.gsub(text, '$c', castingTime);
        text = string.gsub(text, '$m', manaRemaining);
        text = string.gsub(text, '$a', healAmount);

        GB_ANNOUNCED = {};
        GB_ANNOUNCED.spellName = spellName;
        GB_ANNOUNCED.spellRank = spellRank;
        GB_ANNOUNCED.target = target;

        return text;
end

function GB_Get_BuffMatch(buff, target)
        if (GB_BUFFS[target] and GB_BUFFS[target][buff]) then
                return GB_BUFFS[target][buff];
        elseif (GB_BUFFS[target] and GB_SPELLS[buff]) then
                for i in GB_SPELLS[buff] do
                        return GB_BUFFS[target][GetSpellTexture(GB_SPELLS[buff][i].id, "BOOKTYPE_SPELL")];
                end
        end
end

function GB_Get_BuffTarget(name)
        if (not GB_Get_BuffMatch(name, "player")) then
                return "player";
        end
        local unit;
        for i=1,4 do
                if (UnitIsVisible("party"..i)) then
                        if ((not GB_Get("limitlhrange")) or CheckInteractDistance("party"..i, 4)) then
                                unit = "party"..i;
                                if ((not GB_Get_BuffMatch(name, unit)) and UnitName(unit)) then
                                        return unit;
                                end
                        end
                end
        end
        if (GB_Settings[GB_INDEX].includePets) then
                if ((not GB_Get_BuffMatch(name, "pet")) and UnitName("pet")) then return "pet"; end
                for i=1,4 do
                        if (UnitIsVisible("partypet"..i)) then
                                if ((not GB_Get("limitlhrange")) or CheckInteractDistance("partypet"..i, 4)) then
                                        unit = "partypet"..i;
                                        if ((not GB_Get_BuffMatch(name, unit)) and UnitName(unit)) then
                                                return unit;
                                        end
                                end
                        end
                end
        end
        if (GB_Settings[GB_INDEX].includeRaid) then
                for i=1,GetNumRaidMembers() do
                        if (UnitIsVisible("raid"..i)) then
                                unit = "raid"..i;
                                if ((not GB_Get("limitlhrange")) or CheckInteractDistance(unit, 4)) then
                                        if ((not GB_Get_BuffMatch(name, unit)) and UnitName(unit)) then
                                                return unit;
                                        end
                                end
                        end
                end
        end
        return;
end

function GB_Get_CorrectSpell(bar, button, target, overridePO)
        local name = GB_Settings[GB_INDEX][bar].Button[button].name;
        local rank = GB_Settings[GB_INDEX][bar].Button[button].rank;

        if (not name) then
                return;
        end

        if (GB_Settings[GB_INDEX][bar].Button[button].preventRebuff) then
                local buffFound = GB_Get_BuffMatch(name, target);
                if (not buffFound) then
                        buffFound = GB_Get_DebuffMatch(name, target);
                end
                if (buffFound) then
                        GB_Feedback(GB_TEXT.PreventedRebuff);
                        return;
                end
        end

        if (name and GB_Settings[GB_INDEX][bar].Button[button].scaleRank) then
                name, rank = GB_Get_ScaledRank(name, rank, target);
        end

        if (name and GB_Settings[GB_INDEX][bar].Button[button].preventOverhealing and (not overridePO)) then
                name, rank = GB_Get_EfficientHeal(name, rank, target, GB_Settings[GB_INDEX][bar].Button[button].matchCastingTime, GB_Settings[GB_INDEX][bar].Button[button].matchSpellName);
        end

        if (name and GB_Settings[GB_INDEX][bar].Button[button].preventOverkill and (not overridePO)) then
                name, rank = GB_Get_EfficientDamage(name, rank);
        end

        if (name and GB_Settings[GB_INDEX][bar].Button[button].lowManaRank) then
                name, rank = GB_Get_EnoughManaRank(name, rank);
        end

        return name, rank;
end

function GB_Get_CureTarget(name)
        local effects;
        for _, v in GB_CURES do
                if (v.text == name) then
                        effects = v.effects;
                        break;
                end
        end
        for _, status in effects do
                if (GB_Get_DebuffMatch(status, "player", 1)) then
                        return "player";
                end
                local unit;
                for i=1,4 do
                        if (UnitIsVisible("party"..i)) then
                                unit = "party"..i;
                                if ((not GB_Get("limitlhrange")) or CheckInteractDistance(unit, 4)) then
                                        if (GB_Get_DebuffMatch(status, unit, 1)) then
                                                return unit;
                                        end
                                end
                        end
                end
                if (GB_Settings[GB_INDEX].includePets) then
                        if (GB_Get_DebuffMatch(status, "pet", 1)) then return "pet"; end
                        for i=1,4 do
                                if (UnitIsVisible("partypet"..i)) then
                                        unit = "partypet"..i;
                                        if ((not GB_Get("limitlhrange")) or CheckInteractDistance(unit, 4)) then
                                                if (GB_Get_DebuffMatch(status, unit, 1)) then
                                                        return unit;
                                                end
                                        end
                                end
                        end
                end
                if (GB_Settings[GB_INDEX].includeRaid) then
                        for i=1,GetNumRaidMembers() do
                                if (UnitIsVisible("raid"..i)) then
                                        unit = "raid"..i;
                                        if ((not GB_Get("limitlhrange")) or CheckInteractDistance(unit, 4)) then
                                                if (GB_Get_DebuffMatch(status, unit, 1)) then
                                                        return unit;
                                                end
                                        end
                                end
                        end
                end
        end
        return;
end

function GB_Get_CurrentForm()
        for i=1,GetNumShapeshiftForms() do
                local _, _, isActive = GetShapeshiftFormInfo(i);
                if isActive then return i; end
        end
        return 0;
end

function GB_Get_DebuffMatch(buff, target, statustoggle)
        if (GB_DEBUFFS[target]) then
                return GB_DEBUFFS[target][buff];                
        end
end

function GB_Get_DefaultButtonSettings()
        local value = {
                        name = nil,
                        rank = nil,
                        idType = "",
                        hide = false,
                        context = "Always",
                        inCombat = false,
                        notInCombat = false,
                        outdoors = false,
                        form = nil,
                        preventOverhealing = false,
                        preventOverkill = false,
                        preventRebuff = false,
                        matchCastingTime = false,
                        matchSpellName = false,
                        assist = false,
                        autoUpdate = false,
                        validTarget = false,
                        classes = {     [GB_TEXT.Priest] = true,
                                                [GB_TEXT.Warrior] = true,
                                                [GB_TEXT.Paladin] = true,
                                                [GB_TEXT.Mage] = true,
                                                [GB_TEXT.Hunter] = true,
                                                [GB_TEXT.Shaman] = true,
                                                [GB_TEXT.Druid] = true,
                                                [GB_TEXT.Rogue] = true,
                                                [GB_TEXT.Warlock] = true
                                        },
                        scaleRank = false,
                        announce = false,
                        announceText = 1,
                        lowManaRank = false,
                        OOCoption = "hide",
                        flashInContext = false
                };
        return value;
end

function GB_Get_EfficientDamage(name, rank)
        if (not MobHealthFrame) then return name, rank; end
        if (GB_SPELLS[name][rank].type ~= "damage") then
                if (GB_SPELLS[name][rank].type == "DoT") then
                        if (GB_SPELLS[name][rank].avg == 0) then
                                return name, rank;
                        end
                else
                        return name, rank;
                end
        end
        health = MobHealth_GetTargetCurHP();
        if ((not health) or health == 0) then return name, rank; end
        local difference = math.abs(GB_SPELLS[name][rank].min - health);
        local origRank = rank;
        for spellrank, spelldata in GB_SPELLS[name] do
                local diff2 = math.abs(spelldata.min - health);
                if (diff2 < difference and spelldata.min > health) then
                        difference = diff2;
                        rank = spellrank;
                end
        end
        if (origRank ~= rank) then
                GB_SpellChanged(GB_TEXT.POkillChangedSpell, name, rank);
        end
        return name, rank;
end

function GB_Get_EfficientHeal(name, rank, target, matchTime, matchName)
        if (UnitHealthMax(target) == 100) then
                return name, rank;
        end
        if (GB_SPELLS[name][rank].type ~= "heal") then
                if (GB_SPELLS[name][rank].type == "HoT") then
                        if (GB_SPELLS[name][rank].avg == 0) then
                                return name, rank;
                        end
                else
                        return name, rank;
                end
        end
        local origName, origRank = name, rank;
        local damage = UnitHealthMax(target) - UnitHealth(target);
        local pastThreshold = GB_Get_PastThreshold("cancelHealThreshold", target);
        if ((not pastThreshold) or damage == 0) then
                GB_Feedback(GB_TEXT.HealPrevented);
                return;
        end
        local modifier = 1;
        if (GB_Get_BuffMatch(GB_TEXT.PowerInfusion, "player")) then
                modifier = 1.2;
        end
        local difference = math.abs(GB_SPELLS[name][rank].avg * modifier - damage);
        if ((not matchTime) and (not matchName)) then
                local lowestMana = 99999;
                for spellname, ranks in GB_SPELLS do
                        for spellrank, spelldata in ranks do
                                if (spelldata.type == "heal" and spelldata.avg > 0 and spelldata.avg * modifier > damage and (not GB_SKIP_SPELLS[spellname])) then
                                        if (spelldata.mana and spelldata.mana < lowestMana) then
                                                lowestMana = spelldata.mana;
                                                name = spellname;
                                                rank = spellrank;
                                        end
                                end
                        end
                end
        elseif (matchName) then
                for spellrank, spelldata in GB_SPELLS[name] do
                        local diff2 = math.abs(spelldata.avg * modifier - damage);
                        if (diff2 < difference) then
                                difference = diff2;
                                rank = spellrank;
                        end
                end
        elseif (matchTime) then
                local basetime = GB_SPELLS[name][rank].castingTime;
                for spellname, ranks in GB_SPELLS do
                        for spellrank, spelldata in ranks do
                                if (spelldata.type == "heal" and spelldata.castingTime == basetime and (not GB_SKIP_SPELLS[spellname])) then
                                        local diff2 = math.abs(spelldata.avg * modifier - damage);
                                        if (diff2 < difference) then
                                                difference = diff2;
                                                name = spellname;
                                                rank = spellrank;
                                        end
                                end
                        end
                end
        end
        if (origName == name) then
                local _,_,orignum = string.find(origRank, " (%d*)");
                local _,_,ranknum = string.find(rank, " (%d*)");
                orignum = tonumber(orignum);
                ranknum = tonumber(ranknum);
                if (orignum and ranknum) then
                        if (ranknum > orignum) then
                                name = origName;
                                rank = origRank;
                        end
                end             
        end
        if (origName ~= name or origRank ~= rank) then
                GB_SpellChanged(GB_TEXT.POChangedSpell, name, rank);
        end
        return name, rank;
end

function GB_Get_EnoughManaRank(name, rank)
        if (GB_Get_BuffMatch(GB_TEXT.InnerFocus, "player") or GB_Get_BuffMatch(GB_TEXT.Clearcasting, "player") or GB_Get_BuffMatch(GB_TEXT.SpiritOfRedemption, "player")) then return name, rank; end
        local mana = UnitMana("player");
        local newrank = rank;
        local _,_,ranknum = string.find(rank, " (%d*)");
        ranknum = tonumber(ranknum);
        local difference = 99999;
        for spellrank, data in GB_SPELLS[name] do
                if (data.mana < mana) then
                        if ( (mana - data.mana) < difference) then
                                local _,_,newranknum = string.find(spellrank, " (%d*)");
                                newranknum = tonumber(newranknum);
                                if (ranknum and newranknum) then
                                        if (newranknum <= ranknum) then
                                                difference = mana - data.mana;
                                                newrank = spellrank;    
                                        end
                                end
                        end
                end
        end
        if (GB_SPELLS[name][newrank].mana > mana) then
                GB_Feedback(GB_TEXT.TooLowForAnyRank);
                return;
        end
        if (newrank ~= rank) then
                GB_SpellChanged(GB_TEXT.NotEnoughMana, name, newrank);
        end
        return name, newrank;
end

function GB_Get_HealthPercent(unit)
        if (UnitIsGhost(unit)) then
                return 2;
        elseif (UnitHealthMax(unit) <= 0) then
                return 1;
        elseif (UnitHealth(unit) <= 0) then
                return 2;
        else
                return UnitHealth(unit)/UnitHealthMax(unit);
        end
end

function GB_Get_InContext(button)
        local context = 0;
        if (button.InContext) then
                for i, value in button.InContext do
                        if (value == -1) then return false; end
                end
        end
        return true;
end

function GB_Get_ItemName(bag, slot)
        local itemname, itemlink;
        if (slot) then
                itemlink = GetContainerItemLink(bag,slot);
        else
                itemlink = GetInventoryItemLink("player", bag);
        end
        if (itemlink) then
                itemname = string.sub(itemlink, string.find(itemlink, "[", 1, true) + 1, string.find(itemlink, "]", 1, true) - 1);
        end
        return itemname;
end

function GB_Get_ItemCount(itemname)
        local itemCount = 0;
        for bag = 0,  4 do
                local bagslots = GetContainerNumSlots(bag);
                if (bagslots) then
                        for slot = 1, bagslots do
                                itemlink = GetContainerItemLink(bag,slot);
                                if (itemlink) then
                                        local itemname2 = GB_Get_ItemName(bag, slot);
                                        if (itemname == itemname2) then
                                                local ic2;
                                                _, ic2 = GetContainerItemInfo(bag, slot);
                                                itemCount = itemCount + ic2;
                                        end
                                end
                        end
                end
        end
        return itemCount;
end

function GB_Get_LowestHealthUnit()
        local unit = "player";
        local lowest = GB_Get_HealthPercent("player");
        local check;
        for i=1,4 do
                if (UnitIsVisible("party"..i)) then
                        if ((not GB_Get("limitlhrange")) or CheckInteractDistance("party"..i, 4)) then
                                check = GB_Get_HealthPercent("party"..i);
                                if (check < lowest) then
                                        lowest = check;
                                        unit = "party"..i;
                                end
                        end
                end
        end
        if (GB_Settings[GB_INDEX].includePets) then
                if ((not GB_Get("limitlhrange")) or CheckInteractDistance("pet", 4)) then
                        check = GB_Get_HealthPercent("pet");
                        if (check < lowest) then
                                lowest = check;
                                unit = "pet";
                        end
                end
                for i=1,4 do
                        if (UnitIsVisible("partypet"..i)) then
                                if ((not GB_Get("limitlhrange")) or CheckInteractDistance("partypet"..i, 4)) then
                                        check = GB_Get_HealthPercent("partypet"..i);
                                        if (check < lowest) then
                                                lowest = check;
                                                unit = "partypet"..i;
                                        end
                                end
                        end
                end
        end
        if (GB_Settings[GB_INDEX].includeRaid) then
                for i=1,GetNumRaidMembers() do
                        if (UnitIsVisible("raid"..i)) then
                                if ((not GB_Get("limitlhrange")) or CheckInteractDistance("raid"..i, 4)) then
                                        check = GB_Get_HealthPercent("raid"..i);
                                        if (check < lowest) then
                                                lowest = check;
                                                unit = "raid"..i;
                                        end
                                end
                        end
                end
        end
        return unit;
end

function GB_Get_PastThreshold(threshold, target, thresholdnum)
        if ((not thresholdnum) or thresholdnum == "mana") then
                threshold = GB_Settings[GB_INDEX][threshold];           
        else
                threshold = GB_Settings[GB_INDEX][threshold][thresholdnum];
        end

        if ((not threshold) or threshold == "") then return true; end
        if (UnitHealthMax(target) == 0 or (not UnitHealthMax(target))) then return 0; end

        local damage = UnitHealthMax(target) - UnitHealth(target);
        local percent = 100 - UnitHealth(target) / UnitHealthMax(target) * 100;
        if (thresholdnum == "mana") then
                damage = UnitManaMax(target) - UnitMana(target);
                percent = 100 - UnitMana(target) / UnitManaMax(target) * 100;
        end
        if (threshold) then
                if (string.find(threshold, "%%")) then
                        _,_,threshold = string.find(threshold, "(%d*)%%");
                        threshold = tonumber(threshold);
                        if (threshold and percent < threshold) then
                                return false;
                        end
                else
                        threshold = tonumber(threshold);
                        if (UnitHealthMax(target) == 100 or (not threshold)) then return 0; end
                        if (damage < threshold) then
                                return false;
                        end
                end
        end
        return true;
end

function GB_Get_ScaledRank(name, rank, target)
        local level = UnitLevel(target);
        if (level == -1) then return name, rank; end
        local _,_,orignum = string.find(rank, " (%d*)");
        orignum = tonumber(orignum);
        local ranknum = orignum;
        if (name==GB_MINLVL_SPELLS.Renew) then
                if (level < 4) then ranknum = 1;
                elseif (level < 10) then ranknum = 2;
                elseif (level < 16) then ranknum = 3;
                elseif (level < 22) then ranknum = 4;
                elseif (level < 28) then ranknum = 5;
                elseif (level < 34) then ranknum = 6;
                elseif (level < 40) then ranknum = 7;
                elseif (level < 46) then ranknum = 8;
                elseif (level < 50) then ranknum = 9;
                else ranknum = 10; end
                if (ranknum == 10 and GB_SPELLS[GB_MINLVL_SPELLS.Renew][GB_TEXT.Rank..11]) then
                        ranknum = 11;
                end
        elseif (name==GB_MINLVL_SPELLS.PWFortitude) then
                if (level < 2) then ranknum = 1;
                elseif (level < 14) then ranknum = 2;
                elseif (level < 26) then ranknum = 3;
                elseif (level < 38) then ranknum = 4;
                elseif (level < 50) then ranknum = 5;
                else ranknum = 6; end
        elseif (name==GB_MINLVL_SPELLS.DampenMagic) then
                if (level < 2) then ranknum = 0;
                elseif (level < 14) then ranknum = 1;
                elseif (level < 26) then ranknum = 2;
                elseif (level < 38) then ranknum = 3;
                elseif (level < 50) then ranknum = 4;
                else ranknum = 5; end
        elseif (name==GB_MINLVL_SPELLS.AmplifyMagic) then
                if (level < 8) then ranknum = 0;
                elseif (level < 20) then ranknum = 1;
                elseif (level < 32) then ranknum = 2;
                elseif (level < 44) then ranknum = 3;
                else ranknum = 4; end
        elseif (name==GB_MINLVL_SPELLS.DivineSpirit) then
                if (level < 20) then ranknum = 0;
                elseif (level < 30) then ranknum = 1;
                elseif (level < 40) then ranknum = 2;
                elseif (level < 50) then ranknum = 3;
                else ranknum = 4; end
        elseif (name==GB_MINLVL_SPELLS.ShadowProtection) then
                if (level < 20) then ranknum = 0;
                elseif (level < 32) then ranknum = 1;
                elseif (level < 46) then ranknum = 2;
                else ranknum = 3; end
        elseif (name==GB_MINLVL_SPELLS.PWShield) then
                if (level < 2) then ranknum = 1;
                elseif (level < 8) then ranknum = 2;
                elseif (level < 14) then ranknum = 3;
                elseif (level < 20) then ranknum = 4;
                elseif (level < 26) then ranknum = 5;
                elseif (level < 32) then ranknum = 6;
                elseif (level < 38) then ranknum = 7;
                elseif (level < 44) then ranknum = 8;
                elseif (level < 50) then ranknum = 9;
                else ranknum = 10; end
        elseif (name==GB_MINLVL_SPELLS.MarkOfTheWild) then
                if (level < 10) then ranknum = 2;
                elseif (level < 20) then ranknum = 3;
                elseif (level < 30) then ranknum = 4;
                elseif (level < 40) then ranknum = 5;
                elseif (level < 50) then ranknum = 6;
                else ranknum = 7; end
        elseif (name==GB_MINLVL_SPELLS.Rejuvenation) then
                if (level < 6) then ranknum = 2;
                elseif (level < 12) then ranknum = 3;
                elseif (level < 18) then ranknum = 4;
                elseif (level < 24) then ranknum = 5;
                elseif (level < 30) then ranknum = 6;
                elseif (level < 36) then ranknum = 7;
                elseif (level < 42) then ranknum = 8;
                elseif (level < 48) then ranknum = 9;
                else ranknum = 10; end
        elseif (name==GB_MINLVL_SPELLS.Thorns) then
                if (level < 4) then ranknum = 1;
                elseif (level < 14) then ranknum = 2;
                elseif (level < 24) then ranknum = 3;
                elseif (level < 34) then ranknum = 4;
                elseif (level < 44) then ranknum = 5;
                else ranknum = 6; end
        elseif (name==GB_MINLVL_SPELLS.Regrowth) then
                if (level < 2) then ranknum = 0;
                elseif (level < 8) then ranknum = 1;
                elseif (level < 14) then ranknum = 2;
                elseif (level < 20) then ranknum = 3;
                elseif (level < 26) then ranknum = 4;
                elseif (level < 32) then ranknum = 5;
                elseif (level < 38) then ranknum = 6;
                elseif (level < 44) then ranknum = 7;
                elseif (level < 50) then ranknum = 8;
                else ranknum = 9; end
        elseif (name==GB_MINLVL_SPELLS.ArcaneIntellect) then
                if (level < 4) then ranknum = 1;
                elseif (level < 18) then ranknum = 2;
                elseif (level < 32) then ranknum = 3;
                elseif (level < 46) then ranknum = 4;
                else ranknum = 5; end
        elseif (name==GB_MINLVL_SPELLS.BlessingMight) then
                if (level < 2) then ranknum = 1;
                elseif (level < 12) then ranknum = 2;
                elseif (level < 22) then ranknum = 3;
                elseif (level < 32) then ranknum = 4;
                elseif (level < 42) then ranknum = 5;
                elseif (level < 52) then ranknum = 6;
                else ranknum = 7; end
                if (ranknum == 7 and GB_SPELLS[GB_MINLVL_SPELLS.BlessingMight][GB_TEXT.Rank..8]) then
                   ranknum = 8;
                end
        elseif (name==GB_MINLVL_SPELLS.BlessingProtection) then
                if (level < 14) then ranknum = 1;
                elseif (level < 28) then ranknum = 2;
                else ranknum = 3; end
        elseif (name==GB_MINLVL_SPELLS.BlessingWisdom) then
                if (level < 4) then ranknum = 0;
                elseif (level < 14) then ranknum = 1;
                elseif (level < 24) then ranknum = 2;
                elseif (level < 34) then ranknum = 3;
                elseif (level < 44) then ranknum = 4;
                else ranknum = 5; end
                if (ranknum == 5 and GB_SPELLS[GB_MINLVL_SPELLS.BlessingWisdom][GB_TEXT.Rank..6] and level > 49) then
                        ranknum = 6;
                end
        elseif (name==GB_MINLVL_SPELLS.BlessingFreedom) then
                if (level < 8) then ranknum = 0; end
        elseif (name==GB_MINLVL_SPELLS.BlessingSalvation) then
                if (level < 16) then ranknum = 0; end
        elseif (name==GB_MINLVL_SPELLS.AbolishDisease) then
                if (level < 22) then ranknum = 0; end
        elseif (name==GB_MINLVL_SPELLS.AbolishPoison) then
                if (level < 16) then ranknum = 0; end
        elseif (name==GB_MINLVL_SPELLS.BlessingSanctuary) then
                if (level < 20) then ranknum = 0;
                elseif (level < 30) then ranknum = 1;
                elseif (level < 40) then ranknum = 2;
                elseif (level < 50) then ranknum = 3;
                else ranknum = 4; end
        elseif (name==GB_MINLVL_SPELLS.BlessingLight) then
                if (level < 30) then ranknum = 0;
                elseif (level < 40) then ranknum = 1;
                elseif (level < 50) then ranknum = 2;
                else ranknum = 3; end
        elseif (name==GB_MINLVL_SPELLS.BlessingKings) then
                if (level < 30) then ranknum = 0; end
        elseif (name==GB_MINLVL_SPELLS.BlessingSacrifice) then
                if (level < 36) then ranknum = 0;
                elseif (level < 44) then ranknum = 1;
                else ranknum = 2; end
        end
        if ( ranknum == 0 ) then
                GB_Feedback(GB_TEXT.LevelTooLow);
                return false;
        else
                if (ranknum and ranknum < orignum) then
                        rank = GB_TEXT.Rank..ranknum;                           
                        GB_SpellChanged(GB_TEXT.RankScaled, name, rank);
                end
                return name, rank;
        end
end

function GB_Get_Texture(bar, button)
        if (not GB_INITIALIZED) then return; end
        local name = GB_Settings[GB_INDEX][bar].Button[button].name;
        local idType = GB_Settings[GB_INDEX][bar].Button[button].idType;
        local texture = "Interface\\AddOns\\GroupButtons\\EmptyButton";
        if (not name) then
                return texture;
        end
        local id;
        if (idType == "spell") then
                id = GB_SPELLS[name][GB_Settings[GB_INDEX][bar].Button[button].rank].id;
                texture = GetSpellTexture(id, "BOOKTYPE_SPELL");
        elseif (idType == "item" and GB_ITEMS[name]) then
                id = GB_ITEMS[name];
                texture = GetContainerItemInfo(id.bag, id.slot);
        elseif (idType == "inv" and GB_INVENTORY[name]) then
                id = GB_INVENTORY[name].id;
                texture = GetInventoryItemTexture("player", id);
        elseif (idType == "macro" and GB_MACROS[name]) then
                id = GB_MACROS[name].id;
                _, texture = GetMacroInfo(id);
        end
        return texture;
end

function GB_Get_UnitBar(param)
        if (not param) then return; end
        local value;
        if (param == "self" or param == "player") then
                value =  "GB_PlayerBar";
        elseif (param == "party1") then
                value =  "GB_PartyBar1";
        elseif (param == "party2") then
                value =  "GB_PartyBar2";
        elseif (param == "party3") then
                value =  "GB_PartyBar3";
        elseif (param == "party4") then
                value =  "GB_PartyBar4";
        elseif (param == "target") then
                if (GB_HostileTargetBar:IsVisible()) then
                        value =  "GB_HostileTargetBar";
                elseif (GB_FriendlyTargetBar:IsVisible()) then
                        value =  "GB_FriendlyTargetBar";
                elseif (UnitName(param)) then
                        if (UnitCanAttack("player", param)) then
                                value =  "GB_HostileTargetBar";
                        elseif (UnitIsPlayer(param) and UnitFactionGroup("player") ~= UnitFactionGroup(param)) then
                                value =  "GB_HostileTargetBar";
                        else
                                value =  "GB_FriendlyTargetBar";
                        end
                end
        elseif (param == "targettarget") then
                if (UnitName(param)) then
                        if (UnitCanAttack("player", param)) then
                                value =  "GB_HostileTargetBar";
                        elseif (UnitIsPlayer(param) and UnitFactionGroup("player") ~= UnitFactionGroup(param)) then
                                value =  "GB_HostileTargetBar";
                        else
                                value =  "GB_FriendlyTargetBar";
                        end
                end
        elseif (param == "lowesthealth") then
                value =  "GB_LowestHealthBar";
        elseif (param == "hostiletarget") then
                value =  "GB_HostileTargetBar";
        elseif (param == "friendlytarget") then
                value =  "GB_FriendlyTargetBar";
        elseif (type(param) == "function") then
                value =  "GB_LowestHealthBar";
        elseif (string.find(param, "raid")) then
                local _,_,raidnum = string.find(param, "raid(%d*)");
                value = "GB_RaidBar"..raidnum;
        elseif (param == "pet") then
                value = "GB_PetBar0";
        elseif (string.find(param, "partypet")) then
                local _,_,petnum = string.find(param, "partypet(%d*)");
                value = "GB_PetBar"..petnum;
        end
        return value;
end

Generated by GNU Enscript 1.6.5.90.