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