vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
dontattack = 0;


--Attack Command
function SmartPet_Attack()
        local pet = UnitName("pet");
        local target = UnitName("target");

        -- Check if Enabled
        if not (SmartPet_Config.Enabled) then
        SmartPet_AddDebugMessage("SmartPet Disabled, using default petAttack", "spew");
                Pre_SmartPet_PetAttack();
                return;
        end

        if (SmartPet_Config.DebufCheck ) then
                if (SmartPet_CheckDebuff()) then
                        UIErrorsFrame:AddMessage("Breakable DeBuff Found, not attacking", 0, 0, 1, 1.0, UIERRORS_HOLD_TIME);

                        return;
                end
        end

        --Casts Spell if Spell Attack is active
        SmartPetSpellAttack();

        if  (not (pet == nil) and not ( UnitIsDead("pet") ) )then

                -- check for PVP Ability toggle
                SmartPet_StartPVP();

                --Assist Other.  If target is assistable player then we will have pet assist them
                if  ( UnitIsPlayer("target") ) and ( UnitCanCooperate("player", "target")) and (UnitIsEnemy("player", "targettarget")) and  not (UnitIsDead("targettarget") ) then
                        player = target;
                        AssistUnit("target");
                        target = UnitName("target");

                        if (target == nil) then
                                return;
                        end

                        if not (UnitCanAttack("player", "target")) then
                                return;
                        end
                        message = SetMessage(pet, target, player, "assist_other");
                
                elseif (UnitCanAttack("player", "target")) then
                
                        -- Assist Player
                        if UnitIsTappedByPlayer("target") then
                                message = SetMessage(pet, target, "me", "assist_me");

                        -- Attack Mob
                        else
                                message = SetMessage(pet, target, "none", "attack");
                        end

                end

                if (UnitExists("target") and UnitCanAttack("player", "target") ) then
                        
                        if not ( UnitIsDead("target") ) then
                                SmartPet_AddDebugMessage("Attack", "spew");
                                SmartPet_AddDebugMessage(SmartPet_Vars.lastAttack, "spew");

                                SmartPet_AddDebugMessage(SmartPet_Config.AlertTimeout, "spew");

                        -- Check Alert
                                if (SmartPet_Config.Alert and ((GetTime() - SmartPet_Vars.lastAttack) > SmartPet_Config.AlertTimeout)  ) then
                                        SmartPet_SendChatMessage(message,string.upper(SMARTPET_CHANNELS_DROPDOWN_LIST[SmartPet_Config.AlertChannel]),SmartPet_Config.AlertChannelNumber);
                                        SmartPet_Vars.lastAttack = GetTime();
                                end

                                Pre_SmartPet_PetAttack();
                
                                --Check to see if we want to use Dash/Dive on attack start
                                SmartPetChargeCheck();
                        end
                else
                        --Turns Pet Attack command into Pet Follow if no target is selected
                        PetFollow();
                end
        end
end


--Casts a Selected Spell on attack command
function SmartPetChargeCheck()
        if ((SmartPet_Config.RushAttack) and (not SmartPet_Vars.InCombat))then
                local SkillToUse = "";
                SmartPet_AddDebugMessage("Trying to cast Dash/Dive", "spew");
                if (SmartPet_Actions["Dash"].id > 0) then
                        SkillToUse = "Dash";
                elseif (SmartPet_Actions["Dive"].id > 0) then
                        SkillToUse = "Dive";
                else
                SmartPet_AddDebugMessage("Dash/Dive Not Found", "spew");
                        --SkillToUse = "";
                        return;
                end
        
                local start, duration = GetSpellCooldown((SmartPet_Actions[SkillToUse].id), "Pet");
                if ( start == 0 and duration == 0) then
                        CastSpell((SmartPet_Actions[SkillToUse].id), "Pet"); 
                end
        end

end

-- PVP Start Handler.  Checks to see if combat is PVP and optimises settings for it
function SmartPet_StartPVP()
        if ((UnitExists("target")) and (UnitIsPlayer("target")) and (UnitCanAttack("player", "target"))) then
                   if not (SmartPet_Vars.InPVP) then
                        SmartPet_AddDebugMessage("Storing prePVP Settings", "spew");
                        SmartPet_Vars.InPVP = true;
                        SmartPet_Vars.UseTaunt = SmartPet_Config.UseTaunt;
                        SmartPet_Vars.UseDetaunt = SmartPet_Config.UseDetaunt;
                        SmartPet_Vars.AutoCower = SmartPet_Config.AutoCower;
                        if (SmartPet_Config.UseTaunt) then
                                SmartPet_ToggleUse(SmartPet_Actions["Taunt"].index);
                        end
                        if (SmartPet_Config.UseDetaunt) then
                                SmartPet_ToggleUse(SmartPet_Actions["Detaunt"].index);
                        end
                        SmartPet_Config.AutoCower = false;
                        --SmartPet_EnableAction("Burst");
                        --SmartPet_EnableAction("Sustain");
                end
        end
end

-- PVP End Handler. Resets taunt variables to orginal config that was changed on entering PVP
function SmartPet_EndPVP()
        SmartPet_AddDebugMessage("Restoring to PrePVP conditions", "spew");
        SmartPet_Vars.InPVP = false;
                if (SmartPet_Vars.UseTaunt) then
                        SmartPet_ToggleUse(SmartPet_Actions["Taunt"].index);
                end
                if (SmartPet_Vars.UseDetaunt) then 
                        SmartPet_ToggleUse(SmartPet_Actions["Detaunt"].index);
                end
                if (SmartPet_Vars.AutoCower) then
                        SmartPet_Config.AutoCower = true;
                end
end



function SmartPetAttack_OnEvent()


        if ( event == "PLAYER_REGEN_DISABLED") then
                SmartPet_CheckDebuff();
        end

        if ( event == "CHAT_MSG_SPELL_SELF_DAMAGE" or event == "CHAT_MSG_COMBAT_SELF_MISSES" or event == "CHAT_MSG_COMBAT_SELF_HITS") then
                SmartPet_CheckDebuff();
        elseif( event == "PLAYER_ENTER_COMBAT") then
                SmartPet_CheckDebuff();
        elseif( event == "PLAYER_LEAVE_COMBAT" ) then
                SmartPet_CheckDebuff();
        elseif( event == "PLAYER_REGEN_ENABLED") then
                SmartPet_CheckDebuff();
        elseif( event == "PLAYER_REGEN_DISABLED") then
                SmartPet_CheckDebuff();
        elseif( event == "SPELLCAST_START") then
                SmartPet_CheckDebuff();
        elseif( event == "SPELLCAST_STOP") then
                SmartPet_CheckDebuff();
        elseif( event == "PLAYER_TARGET_CHANGED") then
                SmartPet_CheckDebuff();
        elseif( event == "START_AUTOREPEAT_SPELL") then
                SmartPet_CheckDebuff();
        elseif( event == "STOP_AUTOREPEAT_SPELL") then
                SmartPet_CheckDebuff();
        elseif( event == "PLAYER_CONTROL_LOST") then
                SmartPet_CheckDebuff();
        elseif( event == "PLAYER_CONTRL_GAINED") then
                SmartPet_CheckDebuff();
        elseif( event == "UI_ERROR_MESSAGE") then
                SmartPet_CheckDebuff();
        end

end

function SmartPetAttack_OnLoad()
        this:RegisterEvent("PLAYER_ENTER_COMBAT");
        this:RegisterEvent("PLAYER_LEAVE_COMBAT");
        this:RegisterEvent("PLAYER_TARGET_CHANGED");
        this:RegisterEvent("START_AUTOREPEAT_SPELL");
        this:RegisterEvent("STOP_AUTOREPEAT_SPELL");
        this:RegisterEvent("PLAYER_CONTROL_LOST");
        this:RegisterEvent("UI_ERROR_MESSAGE");
        this:RegisterEvent("SPELLCAST_START");
        this:RegisterEvent("SPELLCAST_STOP");
        this:RegisterEvent("PLAYER_REGEN_DISABLED");
        this:RegisterEvent("PLAYER_REGEN_ENABLED");
        this:RegisterEvent("CHAT_MSG_MONSTER_EMOTE");
        this:RegisterEvent("PET_ATTACK_START");
        this:RegisterEvent("PET_ATTACK_STOP");
        this:RegisterEvent("VARIABLES_LOADED");
end

-- Checks for debufs on the target
function SmartPet_CheckDebuff()
        unit = "target";
        SmartPetTip:ClearLines();

                for j = 1, 10 do
                local msg = ""; 

                        if (UnitDebuff(unit,j)) then
                        SmartPetTip:SetUnitDebuff(unit, j);
                        msg = SmartPetTipTextLeft1:GetText();
                        --UIErrorsFrame:AddMessage(msg, 0, 0, 1, 1.0, 2);       
                                for i = 1, getn(SMARTPET_NOATTACK), 1 do                        
                                        if (msg == SMARTPET_NOATTACK[i]) then
                                                --UIErrorsFrame:AddMessage("Debuf found", 0, 0, 1, 1.0, 1);
                                                return "true";
                                        end
                                end
                        elseif (not UnitDebuff(unit,j)) then
                                pop = 0;
                                break;
                        end

                end
end