vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
function GB_ActionButton_Initialize(bar, button)
        if (button > GB_UNITS_ARRAY[bar].buttons) then
                return;
        end
        local settings = GB_Get(bar, button);
        local count;
        if (settings.idType == "item") then
                if (GB_ITEMS[settings.name]) then
                        if (GB_Get_ItemCount(settings.name) == 0) then
                                GB_Settings[GB_INDEX][bar].Button[button] = GB_Get_DefaultButtonSettings();
                                settings = GB_Get(bar, button);
                        end
                else
                        GB_Settings[GB_INDEX][bar].Button[button] = GB_Get_DefaultButtonSettings();
                        settings = GB_Get(bar, button);
                end
        elseif (settings.idType == "inv") then
                if (GB_INVENTORY[settings.name]) then
                        if (GB_INVENTORY[settings.name].count == 0) then
                                GB_Settings[GB_INDEX][bar].Button[button] = GB_Get_DefaultButtonSettings();
                                settings = GB_Get(bar, button);
                        end
                else
                        GB_Settings[GB_INDEX][bar].Button[button] = GB_Get_DefaultButtonSettings();
                        settings = GB_Get(bar, button);
                end
        end
        local texture = GB_Get_Texture(bar, button);
        for _, unitBar in GB_UNITS_ARRAY[bar].frames do
                local actionButton = unitBar.."_Button_"..button;
                getglobal(actionButton.."_Icon"):SetTexture(texture);
                getglobal(actionButton.."TextFrame_Name"):SetText("");
                if (settings.name) then
                        GB_ActionButton_SetCount(bar, button);
                        if (settings.idType == "macro") then
                                getglobal(actionButton.."TextFrame_Name"):SetText(settings.name);
                        end
                end
                actionButton = getglobal(actionButton);
                actionButton.InContext = {};
                if (not settings.name) then
                        if  (not GB_Get("showEmpty")) then
                                actionButton.InContext.empty = -1;
                                actionButton:Hide();
                        else
                                actionButton.InContext.empty = nil;
                                actionButton:Show();
                        end
                else
                        actionButton.InContext.empty = nil;
                        if (settings.hide) then
                                actionButton.InContext.userhidden = -1;
                                actionButton:Hide();
                        else
                                actionButton.InContext.userhidden = nil;
                                actionButton:Show();
                        end
                end
                if (GB_Options:IsVisible()) then
                        actionButton:Show();
                end

                actionButton:UnregisterEvent("PARTY_MEMBERS_CHANGED");
                actionButton:UnregisterEvent("PLAYER_ENTER_COMBAT");
                actionButton:UnregisterEvent("PLAYER_LEAVE_COMBAT");
                actionButton:UnregisterEvent("PLAYER_REGEN_DISABLED");
                actionButton:UnregisterEvent("PLAYER_REGEN_ENABLED");
                actionButton:UnregisterEvent("PLAYER_TARGET_CHANGED");
                actionButton:UnregisterEvent("RAID_ROSTER_UPDATE");
                actionButton:UnregisterEvent("UNIT_AURA");
                actionButton:UnregisterEvent("UNIT_HEALTH");
                actionButton:UnregisterEvent("UNIT_MANA");
                actionButton:UnregisterEvent("UPDATE_BONUS_ACTIONBAR");

                actionButton:RegisterEvent("ACTIONBAR_UPDATE_COOLDOWN");

                if (bar == "party" or bar == "lowesthealth") then
                        actionButton:RegisterEvent("PARTY_MEMBERS_CHANGED");
                elseif (string.find(bar, "target")) then
                        actionButton:RegisterEvent("PLAYER_TARGET_CHANGED");
                elseif (bar == "raid") then
                        actionButton:RegisterEvent("RAID_ROSTER_UPDATE");
                end
                actionButton.contextType = "";
                if (settings.name and settings.context ~= "Always") then
                        if (settings.context == "Mana") then
                                actionButton.contextType = "mana";
                                actionButton:RegisterEvent("UNIT_MANA");
                                actionButton:RegisterEvent("UNIT_MAXMANA");
                        elseif (settings.context == "Health1" or settings.context == "Health2" or settings.context == "Health3" or settings.context == "Health4" or settings.context == "Area" or settings.context == "Dead" or settings.context == "DmgGTHeal") then
                                actionButton.contextType = "health";
                                actionButton:RegisterEvent("UNIT_HEALTH");
                                actionButton:RegisterEvent("UNIT_MAXHEALTH");
                        elseif (settings.context == "Diseased" or settings.context == "Poisoned" or settings.context == "Cursed" or settings.context == "MagicDebuffed" or settings.context == "NotBuffed" or settings.context == "NotDebuffed") then
                                actionButton.contextType = "buffs";
                                if (bar == "player") then
                                        actionButton:RegisterEvent("PLAYER_AURAS_CHANGED");
                                end
                                actionButton:RegisterEvent("UNIT_AURA");
                        end
                end
                if (settings.name and bar == "lowesthealth") then
                        if (actionButton.contextType == "") then
                                if (settings.idType=="spell") then
                                        if (GB_SPELLS[settings.name][settings.rank].type == "cure" or GB_SPELLS[settings.name][settings.rank].type == "buff") then
                                                actionButton:RegisterEvent("UNIT_AURA");
                                        end
                                else
                                        actionButton:RegisterEvent("UNIT_HEALTH");
                                        actionButton:RegisterEvent("UNIT_MAXHEALTH");
                                end
                        end
                end
                if (settings.name == GB_MINLVL_SPELLS.PWShield and settings.validTarget) then
                        actionButton:RegisterEvent("UNIT_AURA");
                end
                if (settings.inCombat or settings.notInCombat) then
                        actionButton:RegisterEvent("PLAYER_LEAVE_COMBAT");
                        actionButton:RegisterEvent("PLAYER_ENTER_COMBAT");
                        actionButton:RegisterEvent("PLAYER_REGEN_DISABLED");
                        actionButton:RegisterEvent("PLAYER_REGEN_ENABLED");
                end
                if (settings.form) then
                        actionButton:RegisterEvent("UPDATE_BONUS_ACTIONBAR");
                end
--              if (settings.outdoors) then
--                      actionButton:RegisterEvent("ZONE_CHANGED");
--                      actionButton:RegisterEvent("ZONE_CHANGED_INDOORS");
--              end
                GB_ActionButton_CheckAllContexts(actionButton);
        end
end

function GB_ActionButton_CheckAllContexts(actionbutton)
        if (not GB_INITIALIZED) then return; end

        if (GB_Options:IsVisible()) then
                actionbutton:Show();
                return;
        end

        if (not actionbutton:GetParent():IsVisible()) then return; end

        local bar = actionbutton:GetParent().index;
        local button = actionbutton:GetID();
        local target = actionbutton:GetParent().unit;

        if (actionbutton:GetParent().index == "lowesthealth") then
                local spellname = GB_Settings[GB_INDEX][bar].Button[button].name;
                local spellrank = GB_Settings[GB_INDEX][bar].Button[button].rank;
                if (GB_SPELLS[spellname] and GB_SPELLS[spellname][spellrank].type == "cure") then
                        target = GB_Get_CureTarget(spellname);
                elseif (GB_SPELLS[spellname] and GB_SPELLS[spellname][spellrank].type == "buff") then
                        target = GB_Get_BuffTarget(spellname);
                else
                        target = actionbutton:GetParent().unit();
                end
                if (target) then
                        getglobal(actionbutton:GetName().."TextFrame_Name"):SetText(UnitName(target));
                else
                        getglobal(actionbutton:GetName().."TextFrame_Name"):SetText("");
                        target = "player";
                end
        end
        local origContext = GB_Get_InContext(actionbutton);

        actionbutton.InContext.class = GB_ActionButton_CheckClassContext(
                target,
                GB_Settings[GB_INDEX][bar].Button[button].classes);
        if (GB_Settings[GB_INDEX][bar].Button[button].playerOnly) then
                if (not UnitIsPlayer(target)) then
                        actionbutton.InContext.playerOnly = -1;
                else
                        actionbutton.InContext.playerOnly = nil;
                end
        else
                actionbutton.InContext.playerOnly = nil;
        end
        actionbutton.InContext.combat = GB_ActionButton_CheckCombatContext(
                GB_Settings[GB_INDEX][bar].Button[button].inCombat,
                GB_Settings[GB_INDEX][bar].Button[button].notInCombat);
        if (actionbutton.contextType == "buffs") then
                actionbutton.InContext.main = GB_ActionButton_CheckBuffContexts(
                        GB_Settings[GB_INDEX][bar].Button[button].context,
                        target,
                        GB_Settings[GB_INDEX][bar].Button[button].name);
        elseif (actionbutton.contextType == "health") then
                actionbutton.InContext.main = GB_ActionButton_CheckHealthContexts(
                        GB_Settings[GB_INDEX][bar].Button[button].context,
                        target,
                        GB_Settings[GB_INDEX][bar].Button[button].name,
                        GB_Settings[GB_INDEX][bar].Button[button].rank);
        elseif (actionbutton.contextType == "mana") then
                actionbutton.InContext.main = GB_ActionButton_CheckManaContexts(
                        GB_Settings[GB_INDEX][bar].Button[button].context, target);
        end
        actionbutton.InContext.form = GB_ActionButton_CheckFormContext(GB_Settings[GB_INDEX][bar].Button[button].form);
        actionbutton.InContext.validTarget = GB_ActionButton_CheckValidTargetContext(
                GB_Settings[GB_INDEX][bar].Button[button].validTarget,
                target,
                GB_Settings[GB_INDEX][bar].Button[button].name);

        GB_ActionButton_ShowInContext(actionbutton, origContext, GB_Settings[GB_INDEX][bar].Button[button].OOCoption, GB_Settings[GB_INDEX][bar].Button[button].flashInContext);
end

function GB_ActionButton_CheckBuffContexts(context, target, name)
        if (not UnitIsPlayer(target)) then
                if (UnitHealth(target) <= 0) then return 0; end
        end
        if (context == "NotBuffed") then
                if (GB_Get_BuffMatch(name, target)) then
                        return -1;
                elseif (name == GB_MINLVL_SPELLS.PWShield) then
                        if (GB_Get_DebuffMatch(GB_TEXT.WeakenedSoul, target)) then return -1; end
                elseif (GB_AREA_BUFFS[name]) then
                        if (GB_Get_BuffMatch(GB_AREA_BUFFS[name], target)) then return -1; end
                elseif (GB_Get("hideAllBlessings") and string.find(name, GB_TEXT.Blessing)) then
                        if (GB_Get_BuffMatch(GB_TEXT.Blessing, target)) then return -1; end
                end
        elseif (context == "NotDebuffed") then
                if (GB_Get_DebuffMatch(name, target)) then return -1; end
        elseif (context == "MagicDebuffed") then
                if (not GB_Get_DebuffMatch(GB_FILTERS.Magic, target, 1)) then return -1; end
        elseif (context == "Cursed") then
                if (not GB_Get_DebuffMatch(GB_FILTERS.Curse, target, 1)) then return -1; end
        elseif (context == "Diseased") then
                if (name ~= GB_TEXT.Purify) then
                        if (not GB_Get_DebuffMatch(GB_FILTERS.Disease, target, 1)) then return -1; end
                else
                        if ((not GB_Get_DebuffMatch(GB_FILTERS.Disease, target, 1)) and (not GB_Get_DebuffMatch(GB_FILTERS.Poison, target, 1))) then
                                return -1;
                        end
                end
        elseif (context == "Poisoned") then
                if (name ~= GB_TEXT.Purify) then
                        if (not GB_Get_DebuffMatch(GB_FILTERS.Poison, target, 1)) then return -1; end
                else
                        if ((not GB_Get_DebuffMatch(GB_FILTERS.Disease, target, 1)) and (not GB_Get_DebuffMatch(GB_FILTERS.Poison, target, 1))) then
                                return -1;
                        end
                end
        end
        return 0;
end

function GB_ActionButton_CheckClassContext(target, classes)
        if (UnitIsPlayer(target)) then
                if (not classes[UnitClass(target)]) then return -1; end
        end
        return 0;
end

function GB_ActionButton_CheckCombatContext(inCombat, notInCombat)
        if (inCombat and (not GB_INCOMBAT)) then
                return -1;
        end
        if (notInCombat and GB_INCOMBAT) then
                return -1;
        end
        return 0;
end

function GB_ActionButton_CheckFormContext(context)
        if (context and GB_Get_CurrentForm() ~= context) then
                return -1;
        else
                return 0;
        end
end

function GB_ActionButton_CheckHealthContexts(context, target, name, rank)
        if (not UnitIsPlayer(target)) then
                if (UnitHealth(target) <= 0) then return; end
        end
        local threshold;
        if (context == "Health1") then
                threshold = 1;
        elseif (context == "Health2") then
                threshold = 2;
        elseif (context == "Health3") then
                threshold = 3;
        elseif (context == "Health4") then
                threshold = 4;
        end
        if (threshold) then
                if (not GB_Get_PastThreshold("healthThresholds", target, threshold)) then return -1; end
        elseif (context == "Dead") then
                if (UnitHealth(target) > 0 and (not UnitIsDeadOrGhost(target))) then
                        return -1;
                end
                if (not UnitIsVisible(target)) then
                        return -1;
                end
        elseif (context == "DmgGTHeal") then
                if (rank and UnitHealthMax(target) and UnitHealthMax(target) ~= 100) then
                        if (GB_SPELLS[name][rank].avg > (UnitHealthMax(target) - UnitHealth(target))) then
                                return -1;
                        end
                end
        elseif (context == "Area") then
                local numPast = 0;
                if (GB_Get_PastThreshold("aeThreshold", "player")) then
                        numPast = numPast + 1;
                end
                for i = 1,GetNumPartyMembers() do
                        if (UnitHealth("party"..i) and UnitHealth("party"..i) > 0 and UnitIsVisible("party"..i) and (not GB_Get("limitaerange") or CheckInteractDistance("party"..i, 4))) then
                                if (GB_Get_PastThreshold("aeThreshold", "party"..i)) then
                                        numPast = numPast + 1;
                                end
                        end
                end
                if (numPast < GB_Settings[GB_INDEX].numPastAEThreshold) then
                        return -1;
                end
        end
        return 0;
end

function GB_ActionButton_CheckOutdoorsContext(context)
        if (not context) then return 0; end
        local outdoors = GetMapInfo();
        if (not outdoors) then
                return -1;
        else
                return 0;
        end
end

function GB_ActionButton_CheckManaContexts(context, target)
        if (not UnitIsPlayer(target)) then
                if (UnitHealth(target) <= 0) then return; end
        end
        local threshold = GB_Get("manaThreshold");
        local damage;
        if (string.find(threshold, "%%")) then
                _,_,threshold = string.find(threshold, "(%d*)%%");
                damage = 100 - UnitMana(target) / UnitManaMax(target) * 100;
        else
                if (UnitManaMax(target) == 100) then return 0; end
                damage = UnitManaMax(target) - UnitMana(target);
        end
        threshold = tonumber(threshold);
        if (not threshold) then return 0; end
        if (damage < threshold) then
                return -1;
        end
        return 0;
end

function GB_ActionButton_CheckValidTargetContext(validTarget, target, name)
        if (not validTarget) then return 0; end
        if (not UnitIsPlayer(target)) then
                if (UnitHealth(target) <= 0) then return; end
        end
        local creatureType = UnitCreatureType(target);
        if (not creatureType) then creatureType = GB_TEXT.Humanoid; end
        if (name == GB_TEXT.ManaBurn or name == GB_TEXT.ViperSting or name == GB_TEXT.Silence or name == GB_TEXT.Counterspell) then
                if (UnitPowerType(target) ~= 0 or UnitManaMax(target) == 0) then
                        return -1;
                end
        elseif (name == GB_TEXT.CurseOfDoom) then
                if (UnitIsPlayer(target)) then
                        return -1;
                end
        elseif (name == GB_MINLVL_SPELLS.PWShield) then
                if (not UnitInParty(target)) then
                        if (not GB_UnitInRaid(target)) then
                                return -1;
                        end
                end
                if (GB_Get_DebuffMatch(GB_TEXT.WeakenedSoul, target)) then return -1; end
        elseif (not GB_TARGET_SPELLS[name]) then
                return 0;
        elseif (not GB_TARGET_SPELLS[name][creatureType]) then
                return -1;
        end
        return 0;
end

function GB_ActionButton_OnClick(unitBar, button, clickcasttoggle, unitoverride)
        if (unitBar == "target") then
                unitBar = GB_Get_UnitBar(unitBar);
        end
        if (not unitBar) then return; end
        unitBar = getglobal(unitBar);
        
        local retarget = false;
        local hadTarget, targetName;

        local idType = GB_Settings[GB_INDEX][unitBar.index].Button[button].idType;
        local name = GB_Settings[GB_INDEX][unitBar.index].Button[button].name;
        local rank = GB_Settings[GB_INDEX][unitBar.index].Button[button].rank;
        local target = unitBar.unit;
        if (unitBar:GetName() == "GB_LowestHealthBar") then
                if (GB_SPELLS[name][rank].type == "cure") then
                        target = GB_Get_CureTarget(name);
                elseif (GB_SPELLS[name][rank].type == "buff" and name ~= GB_MINLVL_SPELLS.PWShield) then
                        target = GB_Get_BuffTarget(name);
                else
                        target = unitBar.unit();
                end
                if (not target) then
                        local text = string.gsub(GB_TEXT.TargetNotFound, '$n', name);
                        GB_Feedback(text);
                        return;
                end
        end
        if (unitoverride) then
                target = unitoverride;
        end
        GB_LAST_UNIT = target;

        local overridePO;
        if (UnitName("target")) then
                hadTarget = true;
                if (not UnitCanAttack("player", "target")) then
                        if (UnitIsPlayer("target")) then
                                targetName = UnitName("target");
                        else
                                targetName = "NPC";
                        end
                        TargetUnit(target);
                        retarget = true;
                elseif (UnitFactionGroup("target") == UnitFactionGroup("player") and UnitIsPlayer("target")) then
                        targetName = UnitName("target");
                        TargetUnit(target);
                        retarget = true;
                end
        end

        if (not clickcasttoggle) then
                if (IsShiftKeyDown() and (not GB_Get("dontTargetPet")) and target ~= "target") then
                        local unitnum;
                        if (target == "player") then
                                target = "pet";
                        elseif (string.find(target, "party")) then
                                _,_,unitnum = string.find(target, "party(%d*)");
                                target = "partypet"..unitnum;
                        elseif (string.find(target, "raid")) then
                                _,_,unitnum = string.find(target, "raid(%d*)");
                                target = "raidpet"..unitnum;
                        end
                        TargetUnit(target);
                        target = "target";
                        retarget = true;
                end
                if (IsControlKeyDown()) then
                        if (not GB_Settings[GB_INDEX].applyPOonCtrl) then
                                overridePO = true;
                        end
                elseif (GB_Settings[GB_INDEX].applyPOonCtrl) then
                        overridePO = true;
                end
        end
        if (idtype == "macro") then
                TargetUnit(target);
                retarget = true;
        end
        if (name == GB_TEXT.DispelMagic and UnitCanAttack("player", "target")) then
                TargetUnit(target);
                retarget = true;
        end
        if (GB_Settings[GB_INDEX].changeTarget) then
                TargetUnit(target);
                retarget = false;
        end
        if (target == "target") then
                retarget = false;
        end
        if (GB_Settings[GB_INDEX][unitBar.index].Button[button].assist) then
                retarget = false;
                AssistUnit(target);
                target = "target";
        end

        if (name ~= GB_TEXT.Attack) then
                GB_AttackTarget();              
        end

        GB_LAST_SPELL = nil;
        GB_LAST_SPELLNUM = GB_LAST_SPELLNUM + 1;
        GB_ANNOUNCEFAILURE = nil;
        GB_ANNOUNCEINTERRUPTED = nil;
        GB_ISCASTING = nil;
        GB_INSTANTCASTING = nil;
        if (idType == "spell") then
                local spellName, spellRank = GB_Get_CorrectSpell(unitBar.index, button, target, overridePO);
                if (spellName) then
                        if (GB_Get_ActionUsuable(spellName, spellRank, getglobal(unitBar:GetName().."_Button_"..button))) then
                                local castit = true;
                                if (GB_Settings[GB_INDEX][unitBar.index].Button[button].cancelHeal) then
                                        if (not GB_Get_PastThreshold("cancelHealThreshold", target, threshold)) then
                                                castit = false;
                                        end
                                end
                                if (castit) then
                                        if (GB_Settings[GB_INDEX].autoleaveform and GB_SPELLS[spellName][spellRank].type == "heal") then
                                                if (GB_PLAYER_CLASS == "PRIEST" and GB_SHADOWFORM_INDEX) then
                                                        CancelPlayerBuff(GB_SHADOWFORM_INDEX);
                                                elseif (GB_PLAYER_CLASS == "DRUID") then
                                                        local f = GB_Get_CurrentForm()
                                                        if (f > 0) then
                                                                CastShapeshiftForm(f)
                                                        end
                                                end
                                        end
                                        CastSpell( GB_SPELLS[spellName][spellRank].id, "BOOKTYPE_SPELL" );
                                        if (GB_Settings[GB_INDEX][unitBar.index].Button[button].announce) then
                                                GB_ANNOUNCEFAILURE = nil;
                                                GB_ANNOUNCEINTERRUPTED = nil;
                                                GB_ISCASTING = true;
                                                GB_INSTANTCASTING = nil;
                                                GB_ANNOUNCETEXT = GB_Get_AnnounceText(spellName, spellRank, target, GB_Settings[GB_INDEX][unitBar.index].Button[button].announceText);
                                                GB_WHISPERTARGET = UnitName(target);
                                                if (GB_SPELLS[spellName][spellRank].castingTime == 0) then
                                                        GB_INSTANTCASTING = true;
                                                end
                                        end
                                elseif (not GB_Settings[GB_INDEX][unitBar.index].Button[button].preventOverhealing) then
                                        GB_Feedback(GB_TEXT.NotPastCancelHeal);
                                end
                                if (GB_Settings[GB_INDEX][unitBar.index].Button[button].cancelHeal and castit) then
                                        GB_CURRENT_HEAL = {spellName, spellRank, target};
                                end
                        end
                end
        elseif (idType == "item") then
                UseContainerItem(GB_ITEMS[name].bag, GB_ITEMS[name].slot);
        elseif (idType == "inv") then
                UseInventoryItem(GB_INVENTORY[name].id);
        elseif (idType == "macro") then
                GB_RunMacro(name);
        end

        if (SpellIsTargeting()) then
                if ( unitBar.index == "hostiletarget") then
                        SpellTargetUnit("player");
                else
                        SpellTargetUnit(target);
                end
        end

        if (retarget) then
                if (not hadTarget) then
                        ClearTarget();
                elseif (targetName) then
                        if (targetName == "NPC") then
                                TargetLastTarget();
                        else
                                TargetByName(targetName);
                        end
                else
                        TargetLastEnemy();
                end
        end
        GB_LAST_UNIT = nil;
end

function GB_ActionButton_OnEvent(event)
        if (not GB_INITIALIZED) then return; end

        if (event == "UNIT_AURA" and arg1 == "target" and (not GroupButtonsFrame.targetauras)) then return; end

        if (event == "ACTIONBAR_UPDATE_COOLDOWN") then
                GB_ActionButton_UpdateCooldown();
                return;
        end
        if (GB_Options:IsVisible()) then
                this:Show();
                return;
        end
        if (event == "PARTY_MEMBERS_CHANGED" or event == "RAID_ROSTER_UPDATE") then
                GB_ActionButton_CheckAllContexts(this);
                return;
        elseif (event == "PLAYER_TARGET_CHANGED") then
                if (UnitCanAttack("player", "target") and this:GetParent():GetName() == "GB_HostileTargetBar") then
                        GB_ActionButton_CheckAllContexts(this);
                        return;
                end
                if ((not UnitCanAttack("player", "target")) and this:GetParent():GetName() == "GB_FriendlyTargetBar") then
                        GB_ActionButton_CheckAllContexts(this);
                        return;
                end
        end

        local origContext = GB_Get_InContext(this);
        local target = this:GetParent().unit;
        local lhbar;
        if (this:GetParent().index == "lowesthealth") then
                lhbar = true;
                if (GB_SPELLS[GB_Settings[GB_INDEX]["lowesthealth"].Button[this:GetID()].name] and GB_SPELLS[GB_Settings[GB_INDEX]["lowesthealth"].Button[this:GetID()].name][GB_Settings[GB_INDEX]["lowesthealth"].Button[this:GetID()].rank].type == "cure") then
                        target = GB_Get_CureTarget(GB_Settings[GB_INDEX]["lowesthealth"].Button[this:GetID()].name);
                elseif (GB_SPELLS[GB_Settings[GB_INDEX]["lowesthealth"].Button[this:GetID()].name] and GB_SPELLS[GB_Settings[GB_INDEX]["lowesthealth"].Button[this:GetID()].name][GB_Settings[GB_INDEX]["lowesthealth"].Button[this:GetID()].rank].type == "buff" and GB_Settings[GB_INDEX]["lowesthealth"].Button[this:GetID()].name ~= GB_MINLVL_SPELLS.PWShield) then
                        target = GB_Get_BuffTarget(GB_Settings[GB_INDEX]["lowesthealth"].Button[this:GetID()].name);
                else
                        target = this:GetParent().unit();
                end
                if (target) then
                        getglobal(this:GetName().."TextFrame_Name"):SetText(UnitName(target));
                else
                        getglobal(this:GetName().."TextFrame_Name"):SetText("");
                        target = "player";
                end
        end
        if (GB_Settings[GB_INDEX][this:GetParent().index].Button[this:GetID()].assist) then
                target = target.."target";
        end
        if (not UnitExists(target)) then return; end
        local bar = this:GetParent().index;
        local buttNum = this:GetID();

        if (event == "UPDATE_BONUS_ACTIONBAR") then
                this.InContext.form = GB_ActionButton_CheckFormContext(GB_Settings[GB_INDEX][bar].Button[buttNum].form);
        elseif (event == "PLAYER_ENTER_COMBAT" or event == "PLAYER_LEAVE_COMBAT" or event == "PLAYER_REGEN_DISABLED" or event == "PLAYER_REGEN_ENABLED") then
                this.InContext.combat = GB_ActionButton_CheckCombatContext(
                        GB_Settings[GB_INDEX][bar].Button[buttNum].inCombat,
                        GB_Settings[GB_INDEX][bar].Button[buttNum].notInCombat);
        elseif (event == "UNIT_AURA") then
                if (arg1 == target or lhbar) then
                        this.InContext.main = GB_ActionButton_CheckBuffContexts(GB_Settings[GB_INDEX][bar].Button[buttNum].context, target, GB_Settings[GB_INDEX][bar].Button[buttNum].name);
                        if (GB_Settings[GB_INDEX][bar].Button[buttNum].name == GB_MINLVL_SPELLS.PWShield and GB_Settings[GB_INDEX][bar].Button[buttNum].validTarget) then
                                this.InContext.validTarget = GB_ActionButton_CheckValidTargetContext(
                                        GB_Settings[GB_INDEX][bar].Button[buttNum].validTarget,
                                        target,
                                        GB_Settings[GB_INDEX][bar].Button[buttNum].name);
                        end
                end
        elseif (event == "UNIT_HEALTH" or event == "UNIT_MAXHEALTH" ) then
                if (arg1 == target or lhbar or GB_Settings[GB_INDEX][bar].Button[buttNum].context == "Area") then
                        this.InContext.main = GB_ActionButton_CheckHealthContexts( GB_Settings[GB_INDEX][bar].Button[buttNum].context, target, GB_Settings[GB_INDEX][bar].Button[buttNum].name, GB_Settings[GB_INDEX][bar].Button[buttNum].rank);
                end
        elseif (event == "UNIT_MANA" or event == "UNIT_MAXMANA") then
                if (arg1 == target) then
                        this.InContext.main = GB_ActionButton_CheckManaContexts(GB_Settings[GB_INDEX][bar].Button[buttNum].context, target);
                end
--      elseif (event == "ZONE_CHANGED" or event == "ZONE_CHANGED_INDOORS") then
--              this.InContext.outdoors = GB_ActionButton_CheckOutdoorsContext(settings.outdoors);
        end

        GB_ActionButton_ShowInContext(this, origContext, GB_Settings[GB_INDEX][bar].Button[buttNum].OOCoption, GB_Settings[GB_INDEX][bar].Button[buttNum].flashInContext);
end

function GB_ActionButton_OnUpdate(elapsed)
        if (not GB_INITIALIZED) then return; end

        if (this.timer) then
                this.timer = this.timer - elapsed;
                if (this.timer > 0) then
                        return;
                else
                        this.timer = TOOLTIP_UPDATE_TIME;
                end
        end

        if (this.flashing) then
                this.flashtimer = this.flashtimer - arg1;
                if (this.flashtimer < 0) then
                        this.flashtimer = .5;
                        if (this.Direction) then
                                this.Direction = nil;
                        else
                                this.Direction = 1;
                        end
                else
                        if (this.Direction) then
                                local a = this.flashtimer * 2;
                                this:SetAlpha(a);
                        else
                                local a = 1 - this.flashtimer * 2;
                                this:SetAlpha(a);
                        end
                end
        end

        if (this.cooldowncount) then
                this.cooldowncount = this.cooldowncount - elapsed;
                if (this.cooldowncount <= 0) then
                        this.cooldowncount = nil;
                        getglobal(this:GetName().."TextFrame_CooldownCount"):SetText("");
                else
                        local count = math.ceil(this.cooldowncount);
                        if (count < 60) then
                                getglobal(this:GetName().."TextFrame_CooldownCount"):SetText(count.."s");
                        else
                                count = math.ceil(count / 60);
                                getglobal(this:GetName().."TextFrame_CooldownCount"):SetText(count.."m");
                        end
                end
        end

        local idType = GB_Settings[GB_INDEX][this:GetParent().index].Button[this:GetID()].idType;
        local name = GB_Settings[GB_INDEX][this:GetParent().index].Button[this:GetID()].name;
        local rank = GB_Settings[GB_INDEX][this:GetParent().index].Button[this:GetID()].rank;

        local textscale = getglobal(this:GetName().."TextFrame").textscale;
        if (textscale) then
                if (getglobal(this:GetName().."TextFrame"):GetScale() ~= textscale) then
                        getglobal(this:GetName().."TextFrame"):SetScale(textscale);
                end
        end

        if (idType == "spell") then
                local inRange, enoughMana = true, true;
                local texture = getglobal(this:GetName().."_Icon");
                local range = GB_SPELLS[name][rank].range;
                local unit = this:GetParent().unit;
                if (this:GetParent().index == "lowesthealth") then
                        unit = this:GetParent().unit();
                end
                if (unit ~= "target") then
                        range = tonumber(GB_SPELLS[name][rank].rangeinyds);
                end
                local mana = GB_SPELLS[name][rank].mana;
                if (range) then
                        if (unit == "target") then
                                if (IsActionInRange(range) == 0) then
                                        inRange = false;
                                elseif ((not UnitIsVisible("target")) and UnitExists("target")) then
                                        inRange = false;
                                end
--                      elseif (unit == "player") then
--                      elseif (MapLibrary_Updater and (not GB_Settings[GB_INDEX].disablePartyRange)) then
--                              local inInstance = MapLibrary.InInstance();
--                              if (MapLibrary.Ready and (not inInstance)) then
--                                      local dist = MapLibrary.UnitDistance(unit, "player", 1);
--                                      if (dist and dist > range) then inRange = false; end
--                              end
                        end
                end
                if (mana) then
                        if (UnitMana("player") < mana and (not GB_Get_BuffMatch(GB_TEXT.InnerFocus, "player"))) then
                                enoughMana = false;
                        end
                end
                if (not inRange) then
                        texture:SetVertexColor(GB_Settings[GB_INDEX].OORcolor.r, GB_Settings[GB_INDEX].OORcolor.g, GB_Settings[GB_INDEX].OORcolor.b);
                elseif (not enoughMana) then
                        texture:SetVertexColor(GB_Settings[GB_INDEX].OOMcolor.r, GB_Settings[GB_INDEX].OOMcolor.g, GB_Settings[GB_INDEX].OOMcolor.b);
                elseif (this.grey) then
                        texture:SetVertexColor(GB_Settings[GB_INDEX].greycolor.r, GB_Settings[GB_INDEX].greycolor.g, GB_Settings[GB_INDEX].greycolor.b);
                else
                        texture:SetVertexColor(1, 1, 1);
                end
        end
end

function GB_ActionButton_SetCount(bar, button)
        if (not GB_INITIALIZED) then return; end
        if (bar == "raid" or bar == "partypet") then return; end
        local name = GB_Settings[GB_INDEX][bar].Button[button].name;
        local idType = GB_Settings[GB_INDEX][bar].Button[button].idType;
        local count;
        if (not name) then
                GB_ActionButton_Initialize(bar, button);
                GB_Set_Appearance(bar);
                return;
        end
        if (idType == "item") then
                count = GB_Get_ItemCount(name);
        elseif (idType == "inv") then
                count = GB_INVENTORY[name].count;
        else
                for _, unitBar in GB_UNITS_ARRAY[bar].frames do
                        getglobal(unitBar.."_Button_"..button.."TextFrame_Count"):SetText("");
                end
                return;
        end
        for _, unitBar in GB_UNITS_ARRAY[bar].frames do
                if (count > 1) then
                        getglobal(unitBar.."_Button_"..button.."TextFrame_Count"):SetText(count);
                else
                        getglobal(unitBar.."_Button_"..button.."TextFrame_Count"):SetText("");
                end
        end
        if (count == 0) then
                GB_ActionButton_Initialize(bar, button);
                GB_Set_Appearance(bar);
        end
end

function GB_ActionButton_ShowInContext(button, origContext, OOCoption, FlashInContext)
        local currentContext = GB_Get_InContext(button);
        if (currentContext) then
                button:Show();
                if (FlashInContext) then
                        button.flashtimer = .5;
                        button.flashing = true;
                else
                        button.flashing = nil;
                        button.flashtimer = nil;
                end
                button.grey = nil;
                getglobal(button:GetName().."_Icon"):SetVertexColor(1, 1, 1);
                button:SetAlpha(GB_Settings[GB_INDEX][button:GetParent().index].alpha);
        else
                if (OOCoption == "hide") then
                        button:Hide();
                elseif (OOCoption == "grey") then
                        button.grey = true;
                        getglobal(button:GetName().."_Icon"):SetVertexColor(.4, .4, .4);
                        button.flashing = nil;
                        button.flashtimer = nil;
                        button:SetAlpha(GB_Settings[GB_INDEX][button:GetParent().index].alpha);
                elseif (OOCoption == "flash") then
                        button.flashtimer = .5;
                        button.flashing = true;
                end
        end
        if (currentContext ~= origContext) then
                local unitBar;
                if (button:GetParent().index == "party" or button:GetParent().index == "pet" or button:GetParent().index == "partypet" or button:GetParent().index == "raid") then
                        unitBar = GB_Get_UnitBar(button:GetParent().unit);
                else
                        unitBar = GB_Get_UnitBar(button:GetParent().index);
                end
                GB_Set_Layout(button:GetParent().index, unitBar);
        end
end

function GB_ActionButton_UpdateCooldown()
        if (not GB_INITIALIZED) then return; end
        local start, duration, enable;
        local idType = GB_Settings[GB_INDEX][this:GetParent().index].Button[this:GetID()].idType;
        local name = GB_Settings[GB_INDEX][this:GetParent().index].Button[this:GetID()].name;
        local rank = GB_Settings[GB_INDEX][this:GetParent().index].Button[this:GetID()].rank;

        if (idType == "spell") then
                start, duration, enable = GetSpellCooldown(GB_SPELLS[name][rank].id, BOOKTYPE_SPELL);
        elseif (idType == "item") then
                start, duration, enable = GetContainerItemCooldown(GB_ITEMS[name].bag, GB_ITEMS[name].slot);
        elseif (idType == "inv") then
                start, duration, enable = GetInventoryItemCooldown("player", GB_INVENTORY[name].id);
        end
        if (start and start > 0) then
                if (GB_Settings[GB_INDEX].showCooldown) then
                        if (this.cooldowncount) then
                                this.cooldowncount = duration - (GetTime() - start);
                        else
                                this.cooldowncount = duration;
                        end
                end
                CooldownFrame_SetTimer(getglobal(this:GetName().."_Cooldown"), start, duration, enable);        
        else
                if (GB_Settings[GB_INDEX].showCooldown) then
                        this.cooldowncount = 0;
                end
        end
end

Generated by GNU Enscript 1.6.5.90.