SMARTPET_VERSION = "2.3"; -- KeyBinding Info BINDING_HEADER_SMARTPET = "SmartPet"; BINDING_NAME_TOGGLETAUNT = SMARTPET_BINDING_NAME_TOGGLETAUNT; BINDING_NAME_CHASETOGGLE = SMARTPET_BINDING_NAME_CHASETOGGLE; -- Config Options SmartPet_Config = {}; -- General Variables SmartPet_Vars = {}; SmartPet_Vars.Class = nil; --What is the player's class SmartPet_Vars.MainAction = ""; --Main Action for pet to use (Growl/Cower) SmartPet_Vars.InCombat = false; --Is pet in combat SmartPet_Vars.InPVP = false; --Is combat PVP SmartPet_Vars.UseTaunt = false; --Useing Growl SmartPet_Vars.Detaunt = false; --Useing Cower SmartPet_Vars.AutoCower = false; --Useing Autocower SmartPet_Vars.LastHealthWarning = 0; SmartPet_Vars.LastHealthPercent = 0; SmartPet_Vars.CombatStartTime = 0; SmartPet_Vars.Party = {}; --Storage for party info SmartPet_Vars.PetSkills = {}; --Storage for pet skill info SmartPet_Vars.PickedUp_Spell = ""; --Index of spell picked up from spell book SmartPet_Vars.PickedUp_SpellBook = ""; --Name of spell book that spell was picked up from SmartPet_Vars.TheButton = ""; --What should "The Button" do when pressed -- Debug Variables SmartPet_Vars.FirstAttackTime = 0; SmartPet_Vars.LastAttackTime = 0; SmartPet_Vars.SpellDamage = 0; SmartPet_Vars.SimSpellDamage = 0; -- Local Variables local Pre_SmartPet_PetAttack; local Pre_SmartPet_CastPetAction; local Pre_SmartPet_ShowUIPanel; local Pre_SmartPet_PickupSpell; -- Pet Abilities SmartPet_Actions = {}; SmartPet_Actions["Attack"] = { name = "PET_ACTION_ATTACK", id = 0}; SmartPet_Actions["Taunt"] = { name = SMARTPET_ACTIONS_GROWL, id = 0, index = 0, cost = 15, lastTime = 0} ; SmartPet_Actions["Detaunt"] = { name = SMARTPET_ACTIONS_COWER, id = 0, index = 0, cost = 15, lastTime = 0 }; SmartPet_Actions["Burst"] = { name = SMARTPET_ACTIONS_CLAW, id = 0, index = 0, cost = 25, lastTime = 0 }; SmartPet_Actions["Sustain"] = { name = SMARTPET_ACTIONS_BITE, id = 0, index = 0, cost = 35, lastTime = 0 }; SmartPet_Actions["Nochase"] = { name = SMARTPET_ACTION_NOCHASE, id = 0, index = 0, cost = 0, lastTime = 0 }; SmartPet_Actions["Dash"] = { name = SMARTPET_ACTION_DASH, id = 0, index = 0, cost = 20, lastTime = 15 }; SmartPet_Actions["Dive"] = { name = SMARTPET_ACTION_DIVE, id = 0, index = 0, cost = 20, lastTime = 15 }; SmartPet_Abilities ={}; -- Slash Commands are in Localization file -- Misc SMARTPET_FOCUSREGEN = 5; COLOR_RED = "|cffff0000"; COLOR_YELLOW = "|cffffff00"; COLOR_GREEN = "|cff00ff00"; COLOR_GREY = "|caaaaaaaa"; COLOR_WHITE = "|cffffffff"; COLOR_BLUE = "|cff3366ff"; COLOR_CLOSE = "|r"; -- ==[Function Hooks]== --Modified to catch casting attack from the PetAction Bar and use modifed pet attack function SmartPet_CastPetAction(id) SmartPet_AddDebugMessage(id, "spew"); if (id == SmartPet_Actions["Attack"].id ) then PetAttack(); else Pre_SmartPet_CastPetAction(id); end end --Modified to record Spell id and Spell book Type when picking up a spell from the spell book function SP_PickupSpell(id, bookType) Pre_SmartPet_PickupSpell(id, bookType); SmartPet_Vars.PickedUp_Spell = id; SmartPet_Vars.PickedUp_SpellBook = bookType; end -- Modifies UI To display checkboxes on pet spell book function SmartPet_ShowUIPanel(frame, force) Pre_SmartPet_ShowUIPanel(frame, force); SmartPet_PetSkillsLoad(); end --Pet Attack Hook. Modifies the default PetAttack() function for added functionality --function SmartPet_PetAttack() --SmartPet_Attack(); --Pre_SmartPet_PetAttack(); --end function UUIToggleSmartPet() if( SmartPetOptionsFrame:IsVisible() ) then SmartPetOptionsFrame:Hide(); else SmartPetOptionsFrame:Show(); end end --==[Handlers]== -- Load Handler function SmartPet_OnLoad() this:RegisterEvent("UNIT_FOCUS"); this:RegisterEvent("UNIT_HEALTH"); this:RegisterEvent("CHAT_MSG_SPELL_PET_DAMAGE"); this:RegisterEvent("CHAT_MSG_MONSTER_EMOTE"); this:RegisterEvent("PET_ATTACK_START"); this:RegisterEvent("PET_ATTACK_STOP"); this:RegisterEvent("VARIABLES_LOADED"); this:RegisterEvent("PET_BAR_UPDATE"); this:RegisterEvent("UNIT_NAME_UPDATE"); this:RegisterEvent("PET_UI_UPDATE"); this:RegisterEvent("CHAT_MSG_SPELL_SELF_DAMAGE"); this:RegisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE"); this:RegisterEvent("CHAT_MSG_COMBAT_CREATURE_VS_SELF_HITS"); this:RegisterEvent("PLAYER_DEAD"); this:RegisterEvent("UNIT_COMBAT"); SmartPet_ResetConfig(); Pre_SmartPet_PetAttack = PetAttack; PetAttack = SmartPet_Attack; Pre_SmartPet_CastPetAction = CastPetAction; CastPetAction = SmartPet_CastPetAction; Pre_SmartPet_PickupSpell = PickupSpell; PickupSpell = SP_PickupSpell; Pre_SmartPet_ShowUIPanel = ShowUIPanel; ShowUIPanel = SmartPet_ShowUIPanel; SLASH_SMARTPET1 = "/smartpet"; SLASH_SMARTPET2 = "/sp"; SlashCmdList["SMARTPET"] = function(msg) SmartPet_OnSlashCommand(msg); end -- SmartPet_AddInfoMessage(string.gsub(SMARTPET_VERSION_RUNNING, '%%v', SMARTPET_VERSION)); -- DEFAULT_CHAT_FRAME:AddMessage(SmartPet_Vars.Class); if(UltimateUI_RegisterButton) then UltimateUI_RegisterButton ( "SmartPet", "Options", "|cFF00CC00SmartPet|r\nVarious options for pet users to make life a lot easier", "Interface\\Icons\\Spell_Magic_PolymorphChicken", UUIToggleSmartPet ); end end -- Slash Command Handler function SmartPet_OnSlashCommand(msg) if (not msg) then return; end if ( SmartPet_Config.AcceptedClass == false ) then SmartPet_AddInfoMessage(SMARTPET_ONLY_FOR_HUNTER); return; end local command = string.lower(msg); if ((SmartPet_Vars.Class == "HUNTER") or (SmartPet_Vars.Class == "WARLOCK")) then -- Enable/Disable the SmartPet AddOn if (command == SMARTPET_ENABLE or command == SMARTPET_ON) then SmartPet_Config.Enabled = true; SmartPet_AddInfoMessage(SMARTPET_COMMANDS_SMARTPET_ENABLED); elseif (command == SMARTPET_DISABLE or command == SMARTPET_OFF ) then SmartPet_Config.Enabled = false; SmartPet_AddInfoMessage(SMARTPET_COMMANDS_SMARTPET_DISABLED); -- Enable/Disable Mouse Over Tooltips elseif (strsub(command, 1, strlen(SMARTPET_TOOLTIPS)) == SMARTPET_TOOLTIPS) then if (SmartPet_Config.ToolTips) then SmartPet_Config.ToolTips = false; SmartPet_AddInfoMessage(SMARTPET_COMMANDS_TOOLTIPS_DISABLED); else SmartPet_Config.ToolTips = true; SmartPet_AddInfoMessage(SMARTPET_COMMANDS_TOOLTIPS_ENABLED); end -- Health Warning elseif (strsub(command, 1, strlen(SMARTPET_AUTOWARN )) == SMARTPET_AUTOWARN ) then if (SmartPet_ToggleOption(command, SmartPet_Config.AutoWarn)) then SmartPet_Config.AutoWarn = true; SmartPet_AddInfoMessage(SMARTPET_COMMANDS_AUTOWARN_ENABLED); else SmartPet_Config.AutoWarn = false; SmartPet_AddInfoMessage(SMARTPET_COMMANDS_AUTOWARN_DISABLED); end -- Health Warning Channel elseif (strsub(command, 1, strlen(SMARTPET_CHANNEL)) == SMARTPET_CHANNEL ) then if (strfind(command, "party")) then SmartPet_Config.Channel = "party"; elseif (strfind(command, "say")) then SmartPet_Config.Channel = "say"; elseif (strfind(command, "guild")) then SmartPet_Config.Channel = "guild"; else firsti, lasti, value = strfind(command, "(%d+)"); if (value) then SmartPet_Config.ChannelNumber = tonumber(value); SmartPet_Config.Channel = "channel"; else SmartPet_Config.Channel = "say"; end end SmartPet_AddInfoMessage(string.gsub(SMARTPET_COMMANDS_CHANNEL, '%%c', SmartPet_Config.Channel)); -- Health Warning Threshold elseif (strsub(command, 1, strlen(SMARTPET_WARNHEALTH)) == SMARTPET_WARNHEALTH ) then firsti, lasti, value = strfind(command, "(%d+)"); if (value) then SmartPet_Config.WarnHealth = tonumber(value); else SmartPet_Config.WarnHealth = 30; end SmartPet_AddInfoMessage(string.gsub(SMARTPET_COMMANDS_WARNHEALTH, '%%h', SmartPet_Config.WarnHealth)); -- No Chase elseif (strsub(command, 1, strlen(SMARTPET_NOCHASE)) == SMARTPET_NOCHASE ) then if (SmartPet_Config.NoChase) then SmartPet_Config.NoChase = false; SmartPet_AddInfoMessage(SMARTPET_COMMANDS_NOCHASE_DISABLED); else PetFollow(); SmartPet_Config.NoChase = true; SmartPet_AddInfoMessage(SMARTPET_COMMANDS_NOCHASE_ENABLED); end elseif ((SmartPet_Vars.Class == "HUNTER") and (SmartPet_Vars.Class ~= "WARLOCK")) then -- Focus Management if (strsub(command, 1, strlen(SMARTPET_TAUNTMAN )) == SMARTPET_TAUNTMAN ) then --SmartPet_AddInfoMessage("SmartPet: Use the check buttons above Growl and Cower on your pet action bar to enable Taunt Management"); -- if (SmartPet_ToggleOption(command, SmartPet_Config.TauntMan)) then -- SmartPet_Config.TauntMan = true; -- SmartPet_AddInfoMessage("SmartPet: Taunt management enabled"); -- else -- SmartPet_Config.TauntMan = false; -- SmartPet_AddInfoMessage("SmartPet: Taunt management disabled"); -- end -- Focus Management elseif (strsub(command, 1, strlen(SMARTPET_SMARTFOCUS )) == SMARTPET_SMARTFOCUS ) then if (SmartPet_ToggleOption(command, SmartPet_Config.SmartFocus)) then SmartPet_Config.SmartFocus = true; SmartPet_AddInfoMessage(SMARTPET_COMMANDS_SMARTFOCUS_ENABLED); else SmartPet_Config.SmartFocus = false; SmartPet_AddInfoMessage(SMARTPET_COMMANDS_SMARTFOCUS_DISABLED); end -- Cower Mode elseif (strsub(command, 1, strlen(SMARTPET_AUTOCOWER)) == SMARTPET_AUTOCOWER ) then if (SmartPet_Config.AutoCower) then SmartPet_Config.AutoCower = false; SmartPet_AddInfoMessage(SMARTPET_COMMANDS_AUTOCOWER_DISABLED); else SmartPet_Config.AutoCower = true; SmartPet_AddInfoMessage(SMARTPET_COMMANDS_AUTOCOWER_ENABLED); end --Auto Cower Threshold elseif (strsub(command, 1, strlen(SMARTPET_COWERHEALTH)) == SMARTPET_COWERHEALTH ) then firsti, lasti, value = strfind(command, "(%d+)"); if (value) then SmartPet_Config.CowerHealth = tonumber(value); else SmartPet_Config.CowerHealth = 30; end SmartPet_AddInfoMessage(string.gsub(SMARTPET_COMMANDS_COWERHEALTH, '%%h', SmartPet_Config.CowerHealth)); --Options gui elseif (command == "options") then SmartPetOptions_Toggle(); --Options gui elseif (command == "show") then SmartPetDefendOptionsFrame:Show(); --resets config to deal with not huntter error elseif (command == "reset") then SmartPet_ResetConfig(); -- Debug Text elseif (strsub(command, 1, 9) == SMARTPET_SHOWDEBUG) then if (command == SMARTPET_SHOWDEBUG) then SmartPet_Config.ShowDebug = false; SmartPet_AddInfoMessage(SMARTPET_COMMANDS_SHOWDEBUG_DISABLED); else SmartPet_Config.ShowDebug = true; SmartPet_Config.ShowDebugString = command; SmartPet_AddInfoMessage(SMARTPET_COMMANDS_SHOWDEBUG_ENABLED); end -- Help Text elseif (command == SMARTPET_HELP) then SmartPet_AddInfoMessage(SMARTPET_HELP_TITLE); SmartPet_AddHelpMessage(SMARTPET_HELP_TAUNTMAN1,SMARTPET_HELP_TAUNTMAN2); SmartPet_AddHelpMessage(SMARTPET_HELP_SMARTFOCUS1,SMARTPET_HELP_SMARTFOCUS2); SmartPet_AddHelpMessage(SMARTPET_HELP_AUTOHEALTH1,SMARTPET_HELP_AUTOHEALTH2); SmartPet_AddHelpMessage(SMARTPET_HELP_AUTOCOWER1,SMARTPET_HELP_AUTOCOWER2); -- Typos and Default elseif (command == "show") then DEFAULT_CHAT_FRAME:AddMessage(" "); SmartPet_AddInfoMessage("SmartPet Status:"); DEFAULT_CHAT_FRAME:AddMessage(COLOR_GREEN.."Use "..COLOR_CLOSE..COLOR_WHITE.."/smartpet "..COLOR_CLOSE..COLOR_GREEN.."or "..COLOR_CLOSE..COLOR_WHITE.."/sp "..COLOR_CLOSE..COLOR_GREEN.."to perform the following commands:"..COLOR_CLOSE); SmartPet_AddHelpMessage(SMARTPET_ENABLE.."|"..SMARTPET_DISABLE, SMARTPET_USAGE_SMARTPET, nil, SmartPet_Config.Enabled); --SmartPet_AddHelpMessage(SMARTPET_TAUNTMAN, SMARTPET_USAGE_TAUNTMAN, nil, SmartPet_Config.TauntMan); SmartPet_AddHelpMessage(SMARTPET_SMARTFOCUS, SMARTPET_USAGE_SMARTFOCUS, nil, SmartPet_Config.SmartFocus); SmartPet_AddHelpMessage(SMARTPET_AUTOWARN, SMARTPET_USAGE_AUTOWARN, nil, SmartPet_Config.AutoWarn); SmartPet_AddHelpMessage(SMARTPET_WARNHEALTH .. " " .. SMARTPET_USAGE_PERCENT, SMARTPET_USAGE_WARNHEALTH, "("..SmartPet_Config.WarnHealth.."%)", SmartPet_Config.AutoWarn); SmartPet_AddHelpMessage(SMARTPET_CHANNEL.." ", SMARTPET_USAGE_CHANNEL, "("..SmartPet_Config.Channel..")", SmartPet_Config.AutoWarn); SmartPet_AddHelpMessage(SMARTPET_AUTOCOWER, SMARTPET_USAGE_AUTOCOWER, nil, SmartPet_Config.AutoCower); SmartPet_AddHelpMessage(SMARTPET_COWERHEALTH .. " " .. SMARTPET_USAGE_PERCENT, SMARTPET_USAGE_COWERHEALTH, "("..SmartPet_Config.CowerHealth.."%)", SmartPet_Config.AutoCower); SmartPet_AddHelpMessage(SMARTPET_NOCHASE, SMARTPET_USAGE_NOCHASE, nil, SmartPet_Config.NoChase); SmartPet_AddHelpMessage(SMARTPET_HELP, SMARTPET_USEAGE_HELP, nil, nil); SmartPet_AddHelpMessage(SMARTPET_TOOLTIPS, SMARTPET_USAGE_TOOLTIPS, nil, SmartPet_Config.Tooltips); DEFAULT_CHAT_FRAME:AddMessage(" "); DEFAULT_CHAT_FRAME:AddMessage(COLOR_GREEN.."For example: "..COLOR_CLOSE..COLOR_WHITE.."/smartpet warnhealth 40 "..COLOR_CLOSE..COLOR_GREEN.."will make your pet warn the party when it's health is below 40%."..COLOR_CLOSE); else SmartPetOptionsFrame:Show(); end else --[[ DEFAULT_CHAT_FRAME:AddMessage(" "); SmartPet_AddInfoMessage(SMARTPET_WARLOCK_MEMO); SmartPet_AddInfoMessage("SmartPet Status:"); DEFAULT_CHAT_FRAME:AddMessage(COLOR_GREEN.."Use "..COLOR_CLOSE..COLOR_WHITE.."/smartpet "..COLOR_CLOSE..COLOR_GREEN.."or "..COLOR_CLOSE..COLOR_WHITE.."/sp "..COLOR_CLOSE..COLOR_GREEN.."to perform the following commands:"..COLOR_CLOSE); SmartPet_AddHelpMessage(SMARTPET_ENABLE.."|"..SMARTPET_DISABLE, SMARTPET_USAGE_SMARTPET, nil, SmartPet_Config.Enabled); SmartPet_AddHelpMessage(SMARTPET_AUTOWARN, SMARTPET_USAGE_AUTOWARN, nil, SmartPet_Config.AutoWarn); SmartPet_AddHelpMessage(SMARTPET_WARNHEALTH .. " " .. SMARTPET_USAGE_PERCENT, SMARTPET_USAGE_WARNHEALTH, "("..SmartPet_Config.WarnHealth.."%)", SmartPet_Config.AutoWarn); SmartPet_AddHelpMessage(SMARTPET_CHANNEL.." ", SMARTPET_USAGE_CHANNEL, "("..SmartPet_Config.Channel..")", SmartPet_Config.AutoWarn); SmartPet_AddHelpMessage(SMARTPET_NOCHASE, SMARTPET_USAGE_NOCHASE, nil, SmartPet_Config.NoChase); SmartPet_AddHelpMessage(SMARTPET_TOOLTIPS, SMARTPET_USAGE_TOOLTIPS, nil, SmartPet_Config.Tooltips); DEFAULT_CHAT_FRAME:AddMessage(" "); DEFAULT_CHAT_FRAME:AddMessage(COLOR_GREEN.."For example: "..COLOR_CLOSE..COLOR_WHITE.."/smartpet warnhealth 40 "..COLOR_CLOSE..COLOR_GREEN.."will make your pet warn the party when it's health is below 40%."..COLOR_CLOSE); ]] end end SmartPet_UpdateActionIcons(true); end -- Main Event Handler function SmartPet_OnEvent() if (event == "VARIABLES_LOADED") then -- Add SmartPet to myAddOns addons list if(myAddOnsFrame) then myAddOnsList.SmartPet = { name = "SmartPet", description = "Addon to make you pet more useful", version = SMARTPET_VERSION, category = MYADDONS_CATEGORY_CLASS, frame = "SmartPetFrame", optionsframe = "SmartPetOptionsFrame" }; myAddOnsList.SmartPetDefend = { name = "SmartPet Defend", description = "Have your pet defend party members", version = SMARTPET_VERSION, category = MYADDONS_CATEGORY_CLASS, frame = "SmartPetFrame", optionsframe = "SmartPetDefendOptionsFrame" }; end --Version Check if (not SmartPet_Config.Version or SmartPet_Config.Version ~= SMARTPET_VERSION) then SmartPet_AddInfoMessage(SMARTPET_VERSION_CHANGED); SmartPet_ResetConfig(); end --RegisterForSave("SmartPet_Config"); SmartPet_UpdateActionIcons(false); if (not SmartPet_Config.Enabled) then return; end if (SmartPet_Config.Icon == true) then SmartPetOptionButton:Show(); else SmartPetOptionButton:Hide(); end if (not SmartPet_Vars.Class) then if ((UnitName("player")) and (UnitName("player") ~= "") and (UnitName("player") ~= UNKNOWNOBJECT) and (UnitName("player") ~= UKNOWNBEING)) then local localizedClass, englishClass = UnitClass("player"); if ((localizedClass) and (englishClass)) then if (englishClass ~= "") then SmartPet_Vars.Class = englishClass; end end end end if (not SmartPet_Vars.Class) then return; end -- Below we can be sure our unit is loaded and we have a class set! --Checks to see if player is a class that can use SmartPet. SmartPet_AddDebugMessage("Class is " .. SmartPet_Vars.Class, "spew"); if (SmartPet_Vars.Class == "HUNTER") then SmartPet_Config.AcceptedClass = true; elseif (SmartPet_Vars.Class == "WARLOCK") then SmartPet_Config.AcceptedClass = true; else SmartPet_Config.AcceptedClass = false; end if (SmartPet_Vars.Class == "WARLOCK") then SmartPet_Config.ToolTips = false; SmartPet_Config.TauntMan = false; SmartPet_Config.SmartFocus = false; SmartPet_Config.AutoWarn = false; SmartPet_Config.AutoCower = false; SmartPet_Config.ShowDebug = false; SmartPet_Config.NoChase = false; SmartPet_Config.UseTaunt = false; SmartPet_Config.UseDetaunt = false; SmartPet_Config.UseBurst = false; SmartPet_Config.UseSustain = false; SmartPet_AddInfoMessage(SMARTPET_WARLOCK_MEMO); end --Unregister events if our class is not a hunter so we don't generate any overhead. if (SmartPet_Config.AcceptedClass == false) then this:UnregisterEvent("UNIT_FOCUS"); this:UnregisterEvent("UNIT_HEALTH"); this:UnregisterEvent("CHAT_MSG_SPELL_PET_DAMAGE"); this:UnregisterEvent("CHAT_MSG_MONSTER_EMOTE"); this:UnregisterEvent("PET_ATTACK_START"); this:UnregisterEvent("PET_ATTACK_STOP"); this:UnregisterEvent("VARIABLES_LOADED"); this:UnregisterEvent("PET_BAR_UPDATE"); this:UnregisterEvent("UNIT_NAME_UPDATE"); this:UnregisterEvent("PET_UI_UPDATE"); this:UnregisterEvent("CHAT_MSG_SPELL_SELF_DAMAGE"); this:UnregisterEvent("CHAT_MSG_SPELL_PERIODIC_SELF_DAMAGE"); this:UnregisterEvent("CHAT_MSG_COMBAT_CREATURE_VS_SELF_HITS"); this:UnregisterEvent("PLAYER_DEAD"); return; end end if (event == "PET_UI_UPDATE") then SmartPet_PetSkillsLoad(); end if (event == "PET_BAR_UPDATE") then SmartPet_UpdateActionIcons(false); SmartPet_PetSkillsLoad(); end if (event == "PET_ATTACK_START") then SmartPet_InitActions(); SmartPet_Vars.inCombat = true; SmartPet_Vars.CombatStartTime = GetTime(); SmartPet_Vars.LastHealthPercent = (100 * UnitHealth("pet") / UnitHealthMax("pet")); SmartPet_Vars.TheButton = ""; -- Debug Variables SmartPet_Vars.FirstAttackTime = 0; SmartPet_Vars.LastAttackTime = 0; SmartPet_Vars.SpellDamage = 0; SmartPet_Vars.SimSpellDamage = 0; end if ((event == "PET_ATTACK_STOP") or (event == "PLAYER_DEAD"))then SmartPet_Vars.inCombat = false; if (SmartPet_Vars.InPVP) then SmartPet_EndPVP(); end SmartPet_Vars.TheButton = ""; SmartPet_SetActionByUse("Taunt", SmartPet_Config.UseTaunt); SmartPet_SetActionByUse("Detaunt", SmartPet_Config.UseDetaunt); SmartPet_SetActionByUse("Burst", SmartPet_Config.UseBurst); SmartPet_SetActionByUse("Sustain", SmartPet_Config.UseSustain); SmartPet_AddDebugMessage("Combat Time: "..(SmartPet_Vars.LastAttackTime - SmartPet_Vars.FirstAttackTime), "dps"); SmartPet_AddDebugMessage("Spell DPS: "..SmartPet_Vars.SpellDamage / (SmartPet_Vars.LastAttackTime - SmartPet_Vars.FirstAttackTime), "dps"); SmartPet_AddDebugMessage("Sim Spell DPS: "..SmartPet_Vars.SimSpellDamage / (SmartPet_Vars.LastAttackTime - SmartPet_Vars.FirstAttackTime), "dps"); end if (event == "CHAT_MSG_SPELL_PET_DAMAGE") then SmartPet_OnPetSpellEvent(arg1); end if (event == "CHAT_MSG_MONSTER_EMOTE") then SmartPet_OnMonsterEmote(arg1, arg2); end if (event == "UNIT_FOCUS" and arg1 == "pet" and (SmartPet_Config.TauntMan or SmartPet_Config.SmartFocus)) then SmartPet_OnFocusEvent(arg1, arg2); end if ((event == "UNIT_HEALTH") and (arg1 == "pet") and (SmartPet_Config.AutoWarn or SmartPet_Config.AutoCower)) then SmartPet_OnHealthEvent(arg1, arg2); end --Causes Pet to Stop Attack when using Scatter Shot if ( event == "CHAT_MSG_SPELL_SELF_DAMAGE") then if (strfind (arg1, "Your Scatter Shot")) then if (keym) then keym.whack.add(TRUE, SmartPetScatterShot); end end end if ( event == "UNIT_COMBAT" ) then --SmartPetDefendTest(arg1, arg2); end end --Checks monster's emote to see if it is fleeing function SmartPet_OnMonsterEmote(arg1, arg2) local target = "target"; local petTarget = "pettarget"; if (not SmartPet_Config.NoChase) then return end if (arg2 == UnitName("pettarget") and strfind (arg1, SMARTPET_SEARCH_RUNAWAY)) then --SmartPet_AddInfoMessage(string.gsub(SMARTPET_PET_BREAKS_COMBAT, '%%n', UnitName("pet"))); --SmartPet_AddInfoMessage(UnitAffectingCombat("target")); --SmartPet_AddInfoMessage(UnitAffectingCombat("pettarget")); --if (UnitHealth("target") > UnitHealth("pettarget")) or not (UnitExists("target"))then --PetFollow(); if (keym) then keym.whack.add(TRUE, PetFollow); end if (SmartPet_Config.RecallWarn) then UIErrorsFrame:AddMessage("Recall Pet", 0, 0, 1, 1.0, UIERRORS_HOLD_TIME); end SmartPet_Vars.TheButton = "recall"; end end -- Spell Damage Event Handler function SmartPet_OnPetSpellEvent(arg1) if (strfind (arg1, SmartPet_Actions["Taunt"].name)) then SmartPet_ProcessSpellEvent("Taunt"); end if (strfind (arg1, SmartPet_Actions["Sustain"].name)) then SmartPet_ProcessSpellEvent("Sustain"); end if (strfind (arg1, SmartPet_Actions["Burst"].name)) then SmartPet_ProcessSpellEvent("Burst"); end if (strfind (arg1, SmartPet_Actions["Detaunt"].name)) then SmartPet_ProcessSpellEvent("Detaunt"); end end --?? function SmartPet_ProcessSpellEvent(action) SmartPet_AddDebugMessage(SmartPet_Actions[action].name..": Time Since Last: "..GetTime() - SmartPet_Actions[action].lastTime, "usage"); if (SmartPet_Vars.FirstAttackTime == 0) then SmartPet_Vars.FirstAttackTime = GetTime(); end SmartPet_Actions[action].lastTime = GetTime(); SmartPet_Vars.LastAttackTime = SmartPet_Actions[action].lastTime; firsti, lasti, value = strfind(arg1, "(%d+)"); if (value) then SmartPet_Vars.SpellDamage = SmartPet_Vars.SpellDamage + tonumber(value); if (action == "Burst") then SmartPet_Vars.SimSpellDamage = SmartPet_Vars.SimSpellDamage + 31; elseif (action == "Sustain") then SmartPet_Vars.SimSpellDamage = SmartPet_Vars.SimSpellDamage + 54; end end end -- Focus Event Handler function SmartPet_OnFocusEvent(arg1, arg2) if (not SmartPet_Vars.inCombat) then return; end if (SmartPet_Vars.InPVP) then SmartPet_SetActionByFocus("Burst"); SmartPet_AddDebugMessage("pvp fous ", "spew"); return end if (SmartPet_Config.SmartFocus and SmartPet_Config.UseSustain and SmartPet_Config.UseBurst) then if (GetTime() - SmartPet_Vars.CombatStartTime > 12.0) then SmartPet_DisableAction("Burst"); SmartPet_SetActionByFocus("Sustain"); else SmartPet_DisableAction("Sustain"); SmartPet_SetActionByFocus("Burst"); end elseif (SmartPet_Config.TauntMan) then if (SmartPet_Config.UseSustain) then SmartPet_SetActionByFocus("Sustain"); end if (SmartPet_Config.UseBurst) then SmartPet_SetActionByFocus("Burst"); end end end -- Health Event Handler function SmartPet_OnHealthEvent(arg1, arg2) if (not SmartPet_Vars.inCombat) then SmartPet_AddDebugMessage("Not checking health because we're not in combat", "spew"); return; end healthPercent = (100 * UnitHealth("pet") / UnitHealthMax("pet")); if (SmartPet_Config.AutoCower and SmartPet_Actions["Detaunt"].index > 0) then if (healthPercent < SmartPet_Config.CowerHealth) then SmartPet_AddDebugMessage("AutoCower Health Check Failed, switching to cower", "spew"); SmartPet_DisableAction("Taunt"); SmartPet_EnableAction("Detaunt"); SmartPet_Vars.MainAction = "Detaunt"; else SmartPet_SetActionByUse("Taunt", SmartPet_Config.UseTaunt); SmartPet_SetActionByUse("Detaunt", SmartPet_Config.UseDetaunt); end end if (SmartPet_Config.AutoWarn) then if (healthPercent >= 60) then warnTime = 10; elseif (healthPercent >= 50) then warnTime = 8; elseif (healthPercent >= 30) then warnTime = 6; else warnTime = 4; end if (healthPercent < SmartPet_Config.WarnHealth and ((GetTime() - SmartPet_Vars.LastHealthWarning) > warnTime) and SmartPet_Vars.LastHealthPercent > healthPercent ) then local m = SMARTPET_PET_NEEDS_HEALING; m = string.gsub(m, '%%n', UnitName("pet")); m = string.gsub(m, '%%h', string.format("%d", healthPercent)); SmartPet_SendChatMessage(m); SmartPet_Vars.LastHealthWarning = GetTime(); end end SmartPet_Vars.LastHealthPercent = healthPercent; 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 --Note To Self Go Over Closely and see if SmartPet_Vars.PetSkills[index] is needed -- Stores pet skills from spell book and puts checkboxes next to them on the spellbook pet tab function SmartPet_PetSkillsLoad() if (SpellBookFrame.bookType == BOOKTYPE_PET) then SmartPetFrame2:Show(); else SmartPetFrame2:Hide(); end SmartPet_Actions["Taunt"].id = -1; SmartPet_Actions["Detaunt"].id = -1; SmartPet_Actions["Burst"].id = -1; SmartPet_Actions["Sustain"].id = -1; SmartPet_Actions["Nochase"].id = -1; SmartPet_Actions["Dash"].id = -1; SmartPet_Actions["Dive"].id = -1; for index=1, 10, 1 do local spellName, spellRank = GetSpellName(index, BOOKTYPE_PET) local l_petActionButton = getglobal("PetSkillButton"..index); local texture = GetSpellTexture(index, BOOKTYPE_PET); if (spellName == SMARTPET_ACTIONS_GROWL) then l_petActionButton:Show(); SmartPet_Actions["Taunt"].id = index; SmartPet_Vars.PetSkills[index] = SmartPet_Actions["Taunt"].index; l_petActionButton:SetChecked(SmartPet_Config.UseTaunt); elseif (SMARTPET_ACTIONS_COWER == spellName) then l_petActionButton:Show(); SmartPet_Actions["Detaunt"].id = index; SmartPet_Vars.PetSkills[index] = SmartPet_Actions["Detaunt"].index; l_petActionButton:SetChecked(SmartPet_Config.UseDetaunt); elseif (SMARTPET_ACTIONS_CLAW == spellName) then SmartPet_Actions["Burst"].id = index; if (SmartPet_Config.TauntMan or SmartPet_Config.SmartFocus) then l_petActionButton:Show(); else l_petActionButton:Hide(); end SmartPet_Vars.PetSkills[index] = SmartPet_Actions["Burst"].index; l_petActionButton:SetChecked(SmartPet_Config.UseBurst); elseif (SMARTPET_ACTIONS_BITE == spellName) then SmartPet_Actions["Sustain"].id = index; if (SmartPet_Config.TauntMan or SmartPet_Config.SmartFocus) then l_petActionButton:Show(); else l_petActionButton:Hide(); end SmartPet_Vars.PetSkills[index] = SmartPet_Actions["Sustain"].index; l_petActionButton:SetChecked(SmartPet_Config.UseSustain); elseif (SMARTPET_ACTIONS_DASH == spellName) then SmartPet_Actions["Dash"].id = index; l_petActionButton:Hide(); elseif (SMARTPET_ACTIONS_DIVE == spellName) then SmartPet_Actions["Dive"].id = index; l_petActionButton:Hide(); else l_petActionButton:Hide(); end end end -- -- General Functions -- -- --Note To Self Clean up and verify Attack Command --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 --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"); -- Check Alert if (SmartPet_Config.Alert) then SendChatMessage(message, "SAY"); 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 = ""; end local start, duration = GetSpellCooldown((SmartPet_Actions[SkillToUse].id), "Pet"); if ( start == 0 and duration == 0 and SkillToUse ~="") then CastSpell((SmartPet_Actions[SkillToUse].id), "Pet"); end end end function SmartPetScatterShot() --Causes Pet to Stop Attack when using Scatter Shot if (SmartPet_Config.Scatter) then SmartPet_AddDebugMessage("Scatter Shot Cast, new variables being set","spew"); if (SmartPet_Config.ScatterOrder ~= "") then SmartPet_Config.ScatterOrder(); end if (SmartPet_Config.ScatterMood ~= "") then SmartPet_Config.ScatterMood(); end end CastSpellByName(SMARTPET_SCATTERSHOT); end --Casts a Selected Spell on attack command function SmartPetSpellAttack() if (SmartPet_Config.SpellAttack == false) or (SmartPet_Config.Spell == "") then return; end CastSpell(SmartPet_Config.Spell, SmartPet_Config.SpellBook); end -- Toggles Taunt Management between Growl & Cower function SmartPet_TauntToggle() if (SmartPet_Config.UseTaunt and not (SmartPet_Actions["Detaunt"].index < 1)) then SmartPet_ToggleUse(SmartPet_Actions["Detaunt"].index); return; end if (SmartPet_Config.UseDetaunt and not (SmartPet_Actions["Taunt"].index < 1)) then SmartPet_ToggleUse(SmartPet_Actions["Taunt"].index); end end -- Enables the specified pet ability based on available focus function SmartPet_SetActionByFocus(action) if (SmartPet_Vars.MainAction == "") then if (SmartPet_Vars.InPVP) then if (action == "Burst") then if ((UnitMana("pet") + SmartPet_FocusRegen("Sustain")) - SmartPet_Actions[action].cost < SmartPet_Actions["Sustain"].cost) then SmartPet_DisableAction(action); else SmartPet_EnableAction(action); end end else SmartPet_EnableAction(action); end return; end if ((UnitMana("pet") + SmartPet_FocusRegen(SmartPet_Vars.MainAction)) - SmartPet_Actions[action].cost < SmartPet_Actions[SmartPet_Vars.MainAction].cost) then SmartPet_DisableAction(action); else SmartPet_EnableAction(action); end end -- Enables the specified pet ability function SmartPet_EnableAction(action) if (SmartPet_Actions[action].index < 1) then return; end name, subtext, texture, isToken, isActive, autoCastAllowed, autoCastEnabled = GetPetActionInfo(SmartPet_Actions[action].index); if (not autoCastEnabled) then SmartPet_AddDebugMessage("Enabling Action: "..SmartPet_Actions[action].name, "spew"); TogglePetAutocast(SmartPet_Actions[action].index); end end -- Disables the specified pet ability function SmartPet_DisableAction(action) name, subtext, texture, isToken, isActive, autoCastAllowed, autoCastEnabled = GetPetActionInfo(SmartPet_Actions[action].index); if (autoCastEnabled) then SmartPet_AddDebugMessage("Disabling Action: "..SmartPet_Actions[action].name, "spew"); TogglePetAutocast(SmartPet_Actions[action].index); end end -- Returns the estimated amount of focus that will be regen'd during this actions cooldown function SmartPet_FocusRegen(action) startTime, duration, enable = GetActionCooldown(SmartPet_Actions[action].index); if (startTime == 0) then return 0; else return SMARTPET_FOCUSREGEN * (duration); end end -- Initialize the pet actions for combat function SmartPet_InitActions() SmartPet_UpdateActionIcons(true); SmartPet_SetActionByUse("Taunt", SmartPet_Config.UseTaunt); SmartPet_SetActionByUse("Detaunt", SmartPet_Config.UseDetaunt); if (SmartPet_Config.UseTaunt) then SmartPet_Vars.MainAction = "Taunt"; elseif (SmartPet_Config.UseDetaunt) then SmartPet_Vars.MainAction = "Detaunt"; else SmartPet_Vars.MainAction = ""; end if (SmartPet_Config.SmartFocus and SmartPet_Config.UseBurst and SmartPet_Config.UseSustain) then SmartPet_DisableAction("Sustain"); SmartPet_EnableAction("Burst"); end end -- Determine if an action is to be used during this combat session -- Enables/Disables the specified pet ability based on it's .use setting function SmartPet_SetActionByUse(action, enabled) if (enabled) then SmartPet_EnableAction(action); else SmartPet_DisableAction(action); end end -- Decide to toggle a variable based on its current state, or the command string function SmartPet_ToggleOption(command, enabled) if (strfind(command, SMARTPET_ON) or strfind(command, SMARTPET_ENABLE)) then return true; elseif (strfind(command, SMARTPET_OFF) or strfind(command, SMARTPET_DISABLE)) then return false; else if (enabled) then return false; else return true; end end end -- Sends a message to the specified channel function SmartPet_SendChatMessage(message, channel) channelNumber = SmartPet_Config.ChannelNumber; channel = string.upper(SmartPet_Config.Channel); -- add additional invalid channel error checking if ((channelNumber > 0) and (channel == "CHANNEL")) then SendChatMessage(message, channel, nil, channelNumber); else if (channel == 'PARTY') then if ((UnitInParty('player')) and (UnitInParty('party1'))) then SendChatMessage(message, channel); else SmartPet_AddDebugMessage("Not In A Party", "spew"); SendChatMessage(message, "SAY"); end elseif (channel == 'RAID') then if ((UnitInRaid('player'))) then SendChatMessage(message, channel); else SmartPet_AddDebugMessage("Not In A RAID", "spew"); SendChatMessage(message, "SAY"); end elseif (channel == 'GUILD') then if (IsInGuild()) then SendChatMessage(message, channel); else SendChatMessage(message, "SAY"); end else SendChatMessage(message, "SAY"); end end end -- Toggles Settings function SmartPet_ToggleUse(id) if (id == SmartPet_Actions["Taunt"].index) then if (SmartPet_Config.UseTaunt or SmartPet_Config.UseDetaunt) then if (SmartPet_Config.UseTaunt) then SmartPet_Config.TauntMan = false; -- disable tauntman SmartPet_Config.UseTaunt = false; -- disable taunt else SmartPet_Config.TauntMan = true; -- enable tauntman SmartPet_Config.UseTaunt = true; -- enable taunt SmartPet_Config.UseDetaunt = false;-- disable detaunt end else SmartPet_Config.TauntMan = true; -- enable tauntman SmartPet_Config.UseTaunt = true;-- set tauntman to taunt SmartPet_Config.UseDetaunt = false; end SmartPet_SetActionByUse("Taunt", SmartPet_Config.UseTaunt); SmartPet_SetActionByUse("Detaunt", SmartPet_Config.UseDetaunt); elseif (id == SmartPet_Actions["Detaunt"].index) then if (SmartPet_Config.UseTaunt or SmartPet_Config.UseDetaunt) then if (SmartPet_Config.UseDetaunt) then SmartPet_Config.TauntMan = false; -- disable tauntman SmartPet_Config.UseDetaunt = false; -- disable taunt else SmartPet_Config.TauntMan = true; -- enable tauntman SmartPet_Config.UseDetaunt = true; -- enable taunt SmartPet_Config.UseTaunt = false;-- disable detaunt end else SmartPet_Config.TauntMan = true; -- enable tauntman SmartPet_Config.UseDetaunt = true;-- set tauntman to taunt SmartPet_Config.UseTaunt = false; end SmartPet_SetActionByUse("Taunt", SmartPet_Config.UseTaunt); SmartPet_SetActionByUse("Detaunt", SmartPet_Config.UseDetaunt); elseif (id == SmartPet_Actions["Burst"].index) then if (SmartPet_Config.UseBurst) then SmartPet_Config.UseBurst = false; else SmartPet_Config.UseBurst = true; end SmartPet_SetActionByUse("Burst", SmartPet_Config.UseBurst); elseif (id == SmartPet_Actions["Sustain"].index) then if (SmartPet_Config.UseSustain) then SmartPet_Config.UseSustain = false; else SmartPet_Config.UseSustain = true; end SmartPet_SetActionByUse("Sustain", SmartPet_Config.UseSustain); elseif (id == SmartPet_Actions["Nochase"].index) then if (SmartPet_Config.NoChase) then SmartPet_Config.NoChase = false; else SmartPet_Config.NoChase = true; PetFollow(); end end SmartPet_UpdateActionIcons(true); end function SmartPet_SetupAction(name, index, enabled) local l_smartPetActionButton = getglobal("SmartPetActionButton"..index); if (enabled) then l_smartPetActionButton:SetChecked(1); else l_smartPetActionButton:SetChecked(nil); end SmartPet_Actions[name].index = index; end --Looks at icons on the pet action bar and places the check boxes above appropriate skills function SmartPet_UpdateActionIcons(resetIDs) if (resetIDs) then SmartPet_Actions["Attack"].id = 0; SmartPet_Actions["Taunt"].index = -1; SmartPet_Actions["Detaunt"].index = -1; SmartPet_Actions["Burst"].index = -1; SmartPet_Actions["Sustain"].index = -1; SmartPet_Actions["Nochase"].index = -1; SmartPet_Actions["Dash"].index = -1; SmartPet_Actions["Dive"].index = -1; end for index=1, NUM_PET_ACTION_SLOTS, 1 do local name, subtext, texture, isToken, isActive, autoCastAllowed, autoCastEnabled = GetPetActionInfo(index); local l_petActionButton = getglobal("SmartPetActionButton"..index); if (not SmartPet_Config.Enabled) then l_petActionButton:Hide(); elseif (name == SmartPet_Actions["Taunt"].name) then l_petActionButton:Show(); SmartPet_SetupAction("Taunt", index, SmartPet_Config.UseTaunt); elseif (name == SmartPet_Actions["Detaunt"].name) then l_petActionButton:Show(); SmartPet_SetupAction("Detaunt", index, SmartPet_Config.UseDetaunt); elseif (name == SmartPet_Actions["Burst"].name) then if (SmartPet_Config.TauntMan or SmartPet_Config.SmartFocus) then l_petActionButton:Show(); else l_petActionButton:Hide(); end SmartPet_SetupAction("Burst", index, SmartPet_Config.UseBurst); elseif (name == SmartPet_Actions["Sustain"].name) then if (SmartPet_Config.TauntMan or SmartPet_Config.SmartFocus) then l_petActionButton:Show(); else l_petActionButton:Hide(); end SmartPet_SetupAction("Sustain", index, SmartPet_Config.UseSustain); elseif (name == SmartPet_Actions["Nochase"].name) then l_petActionButton:Show(); SmartPet_SetupAction("Nochase", index, SmartPet_Config.NoChase); elseif (name == SmartPet_Actions["Attack"].name) then --DEFAULT_CHAT_FRAME:AddMessage("attack Found"); SmartPet_Actions["Attack"].id = index; else l_petActionButton:Hide(); end end if (resetIDs) then if (SmartPet_Actions["Taunt"].index < 1) then SmartPet_Config.UseTaunt = false; end if (SmartPet_Actions["Detaunt"].index < 1) then SmartPet_Config.UseDetaunt = false; end if (SmartPet_Actions["Burst"].index < 1) then SmartPet_Config.UseBurst = false; end if (SmartPet_Actions["Sustain"].index < 1) then SmartPet_Config.UseSustain = false; end if (not SmartPet_Config.UseTaunt and not SmartPet_Config.UseDetaunt) then SmartPet_Config.TauntMan = false; end end end --Resets values to factory defaults function SmartPet_ResetConfig() SmartPet_Config.Enabled = true; --SmartPet On/Off SmartPet_Config.Version = SMARTPET_VERSION; --Version of SmartPet Running SmartPet_Config.AcceptedClass = false; --Is Player a class that can use SmartPet SmartPet_Config.ToolTips = true; --ToolTip On/Off SmartPet_Config.Icon = true; --Icon on pet bar On/Off SmartPet_Config.TauntMan = true; --Use Taunt Management ON/Off SmartPet_Config.SmartFocus = true; --Use SmartFocus SmartPet_Config.WarnHealth = 30; --% of pets health to start warning SmartPet_Config.AutoWarn = false; --Give Warning if pet is hurt SmartPet_Config.CowerHealth = 30; --% of pets health to start cowering at SmartPet_Config.AutoCower = false; --Autocower On/Off SmartPet_Config.ShowDebug = false; --Display Debug Info SmartPet_Config.Channel = "say"; --Type of channel to give warning on SmartPet_Config.ChannelNumber = 0; --Specific numeric channel to use SmartPet_Config.NoChase = true; --NoChase On/Off SmartPet_Config.RecallWarn = true; --Displays Recall Warnings SmartPet_Config.UseTaunt = false; --Always use Pets Taunt Skill SmartPet_Config.UseDetaunt = false; --Always use Pets Detaunt Skill SmartPet_Config.UseBurst = false; --Ulse Pets Burst Damge Skill SmartPet_Config.UseSustain = false; --Use Pets Sustained Damage Skill SmartPet_Config.ShowDebugString = ""; --Type of Debug message being shown SmartPet_Config.RushAttack = true; --Use Dash/Dive on attacking SmartPet_Config.Alert = false; --Say an allert on attacking SmartPet_Config.Scatter = true; --Have pet break off combat on use of Scatter Shot\ SmartPet_Config.ScatterMood = PetPassiveMode; --Mood to set on Scatter Shot [Passive/Defensive] SmartPet_Config.ScatterOrder = PetFollow; --Command to set on Scatter Shot [Stay/Follow] SmartPet_Config.SpellAttack = false; --Cast a spell when atcking SmartPet_Config.Spell = ""; --Id of Spell to cast SmartPet_Config.SpellBook = ""; --Id of Spellbook to be cast end function SmartPetTheButton() if (SmartPet_Vars.TheButton == "recall" ) then PetFollow(); SmartPet_Vars.TheButton = ""; else PetAttack(); end end --function SmartPetHeal(); Mend={}; Mend[7]={mana=480; health = 245}; Mend[6]={mana=385; health = 189}; Mend[5]={mana=300; health = 142}; Mend[4]={mana=225; health = 245}; Mend[3]={mana=155; health = 68}; Mend[2]={mana=90; health = 38}; Mend[1]={mana=50; health = 20};