; Mage Routines ver 1.3 ; Routines tailored for a Mage ; compatible with WoWBot version 12a ; Change declare ColdPull to FALSE to pull with Fireball. ;Leave this define Intact. Its testing if this file is loaded or not. ;Further modifications by firoso, adding cone of cold, pyroblast pulls, optional AoE disabling, etc. ;to use Pyroblast set coldpull to false and pyropull to true ;to use Dragon's breath set UseDragon to TRUE, else you'll use cone of cold. ;Mods done by stealthy: dampen magic buff added, scorch for mana efficiency, wand for mana efficiency, fix firoso's typos, add PoM casting ;berserking, arcane power ;in progress mods by stealthy: warding when hit by fire/frost, not using frost on frost immune mobs (same for fire), etc., Arcane Power casting ;run past corpseloot bug fix #define ROUTINES #define DEBUG function Attack(string AttackGUID) { declare SavX float local ${Me.X} declare SavY float local ${Me.Y} declare SavZ float local ${Me.Z} declare BailOut int local ${Math.Calc[${LavishScript.RunningTime}+(1000*${CombatBailout})]} declare HavePulled bool local FALSE declare StuckCheck bool local FALSE declare StuckCheckTime int local declare Aggros guidlist local declare InnerIndex int local 1 declare RangedMode bool local TRUE declare ColdPull bool local FALSE declare PyroPull bool local TRUE declare AllowAoe bool local TRUE declare UseDragon bool local FALSE ; declare UseFrostWard bool local TRUE ; declare UseFireWard bool local FALSE SavedWaypointX:Set[${Me.X}] SavedWaypointY:Set[${Me.Y}] if ${Me.Sitting} { wowpress SITORSTAND } if ${AttackGUID.Equal[NULL]}||${AttackGUID.Equal[NOTARGET]} { call UpdateHudStatus "No target to attack" Return } ; add combustion check and activation here if ${Spell[Combustion](exists)} && !${Spell[Combustion].Cooldown} { call UpdateHudStatus "Casting Combustion!" call CastSpell "Combustion" } if ${Unit[${AttackGUID}].FactionGroup.Equal[Horde]} { ;add them to a blacklist or whatever here... call UpdateHudStatus "Target is an horde member, don't bother attacking them" GUIDBlacklist:Set[${AttackGUID},AVOID] TargetGUID:Set[NOTARGET] Return } if ${Unit[${AttackGUID}].Classification.Equal[Elite]} { if !${Me.InCombat} { echo ELITE! ;add them to a blacklist or whatever here... call UpdateHudStatus "Target is an elite, don't bother attacking them" GUIDBlacklist:Set[${AttackGUID},AVOID] TargetGUID:Set[NOTARGET] Return } else { ;we need to RLG call UpdateHudStatus "Aggrod an elite RUN after we sheep!!" if !${Spell[Polymorph].Cooldown}&&${Spell[Polymorph](exists)} { call CastSpell Polymorph ${AttackGUID} } RLG:Set[TRUE] GUIDBlacklist:Set[${AttackGUID},AVOID] TargetGUID:Set[NOTARGET] return } } call UpdateHudStatus "Attacking ${Object[${AttackGUID}].Name}" ; if we are close enough stop running if ${Unit[${AttackGUID}].Distance}<${PullingRange}&&!${HavePulled} { move -stop wait 3 Target ${AttackGUID} } Do { if ${Me.Sitting} { wowpress SITORSTAND } SavX:Set[${Me.X}] SavY:Set[${Me.Y}] SavZ:Set[${Me.Z}] ; Ensure we are still facing our target loc call UpdateHudStatus "Facing Target - Have Target [${AttackGUID}]" Target ${AttackGUID} Face ${Unit[${AttackGUID}].X} ${Unit[${AttackGUID}].Y} call CheckFacing call snarfpotion call usestone ; Check we still have a valid target if !${Unit[${AttackGUID}](exists)} { call UpdateHudStatus "Target lost" TargetGUID:Set[NOTARGET] Return } ; Check if the target is engaged already if ${Unit[${AttackGUID}].Tapped} { call UpdateHudStatus "Target already engaged" ` TargetGUID:Set[NOTARGET] Return } ; If we dont have our chosen unit targeted and were in range target it if (!${Target.GUID.Equal[${AttackGUID}]})&&(${Unit[${AttackGUID}].Distance}<${TargetingRange}) { call UpdateHudStatus "Targeting Unit ${Unit[${AttackGUID}].Distance} - [${AttackGUID}]" Target ${AttackGUID} wait 10 } if !${RangedMode} && ${Unit[${AttackGUID}].Distance} > ${RangedMinDist} { RangedMode:Set[TRUE] call UpdateHudStatus "Entered Ranged Mode" } ;Check if we need to switch out of Ranged Mode if ${RangedMode} && ${Unit[${AttackGUID}].Distance} < ${RangedMinDist} { RangedMode:Set[FALSE] call UpdateHudStatus "Left Ranged Mode" } if !${Me.Attacking}&&${Target(exists)}&&!${RangedMode} { WoWScript AttackTarget() } /* ; Check we havent picked up aggro Aggros:Search[-units,-nearest,-aggro,-alive,-range 0-10] if !${HavePulled}&&${Aggros.Count}>0&&${Aggros[1].GUID.NotEqual[${AttackGUID}]} { call UpdateHudStatus "${Unit[${Aggros[1].GUID}].Name} has aggroed exiting Attack routine" return } Aggros:Clear */ ; Once we get close to our target then pull it if ${Unit[${AttackGUID}].Distance}<${PullingRange}&&${Me.PctMana}>20&&!${HavePulled} { call UpdateHudStatus "Facing Target - Have Pulled" Face ${Unit[${AttackGUID}].X} ${Unit[${AttackGUID}].Y} call CheckFacing move -stop wait 5 if ${Spell[Frostbolt](exists)}&&${RangedMode}&&${ColdPull} { call UpdateHudStatus "Pulling with Frostbolt" call CastSpell "Frostbolt" ${AttackGUID} } ;Firoso: Check to see if we should use Pyroblast to pull. if ${RangedMode}&&!${ColdPull}&&${Spell[Pyroblast](exists)}&&${PyroPull} { call UpdateHudStatus "Pulling with Pyroblast" call CastSpell "Pyroblast" ${AttackGUID} } else if ${RangedMode}&&!${ColdPull} { call UpdateHudStatus "Pulling with Fireball" call CastSpell "Fireball" ${AttackGUID} } HavePulled:Set[TRUE] } if ${Unit[${AttackGUID}].Tapped} { call UpdateHudStatus "Target already engaged" TargetGUID:Set[NOTARGET] Return } call snarfpotion call usestone if (${PullBeforeContinue}&&${HavePulled})||!${PullBeforeContinue} { ; Check i have enough mana to cast if ${Me.PctMana}>10 { ; NUKES BEGIN ;ok, our base attack is fireball, but if we're in clearcast mode, use arcane missiles cause it's instant and it's free if ${Me.Buff[Clearcast](exists)} { call UpdateHudStatus "Clearcast mode detected" if ${Unit[${AttackGUID}].Distance}<30&&${Spell[Arcane Missiles](exists)} { call UpdateHudStatus "Clearcasting Arcane Missiles" call CastSpell "Arcane Missiles" ${AttackGUID} } } ;Firoso: Try cone of cold. if ${Unit[${AttackGUID}].Distance}<10&&${Spell[Cone of Cold](exists)}&&!${UseDragon}&&!${Immune-Frost} { if !${Spell[Cone of Cold].Cooldown} { call UpdateHudStatus "Casting Cone of Cold" call CastSpell "Cone of Cold" ${AttackGUID} } } ;Arcane Power check/use if ${Spell["Arcane Power"](exists)}&&!${Spell["Arcane Power"].Cooldown}&&${Me.PctMana}>40&&${Unit.[${AttackGUID}].PctHPs}>70 { call UpdateHudStatus "Pump it Up, Arcane Power" call CastSpell "Arcane Power" ${Me.GUID} } ;PoM cast checks if ${Spell[Presence of Mind](exists)}&&!${Spell[Presence of Mind].Cooldown} { call UpdateHudStatus "Casting PoM" call CastSpell "Presence of Mind" ${Me.GUID} ;use an instacast based on your spec, coldpull will assume frost spec, else fireball, else pyroblast ;if you're fire and mob is fire immune, use frost. ;likewise, if you're frost and mob is frost immune, go with fireball. if ${ColdPull}&&!{Immune-Frost} { call UpdateHudStatus "PoM Frostbolt" call CastSpell "Frostbolt" ${AttackGUID} } if !${ColdPull}&&${Spell[Pyroblast](exists)}&&!{Immune-Fire} { call UpdateHudStatus "PoM Pyroblast" call CastSpell "Pyroblast" ${AttackGUID} } if !${ColdPull}&&!{Spell[Pyroblast](exists)}&&!{Immune-Fire} { call UpdateHudStatus "PoM Fireball" call CastSpell "Fireball" ${AttackGUID} } else { call UpdateHudStatus "PoM Frostbolt" call CastSpell "Frostbolt" ${AttackGUID} } if !${ColdPull}&&${Immune-Fire} { call UpdateHudStatus "PoM Frostbolt 2" call CastSpell "Frostbolt" ${AttackGUID} } if ${ColdPull}&&${Immune-Frost} { call UpdateHudStatus "PoM Fireball 2" call CastSpell "Fireball" ${AttackGUID} } } ;Berserking Check/Use if ${Spell[Berserking](exists)}&&${Me.PctHPs}<25 { call UpdateHudStatus "HP low, popping berserk" call CastSpell "Berserking" ${Me.GUID} } ;Firoso: Dragon's Breath. if ${Spell[Dragon's Breath](exists)}&&${Unit[${AttackGUID}].Distance}<15&&!${Spell[Dragon's Breath]Cooldown}&&${AllowAoe}&&${UseDragon}&&!${Target.Name.Find["Fire"]}&&!${Target.Name.Find["Lava"]}&&!${Target.Name.Find["Magma"]} { if !${Spell[Dragon's Breath].Cooldown}&&!${Immune-Fire} { call UpdateHudStatus "Casting Dragon's Breath" call CastSpell "Dragon's Breath" ${AttackGUID} } } ;use frost nova if it's ready, and it's close enough, then drop back/blink a few paces if ${Spell[Blast Wave](exists)}&&${Unit[${AttackGUID}].Distance}<15&&!${Spell[Blast Wave]Cooldown}&&${AllowAoe}&&!${Immune-Fire} { call CastSpell "Blast Wave" ${AttackGUID} } if ${Spell[Frost Nova](exists)}&&${AllowAoe}&&!${Immune-Frost} { call FrostNovaAttackSet ${AttackGUID} } if ${Unit[${AttackGUID}].Distance}<26&&${Spell[Fire Blast](exists)} { if !${Spell[Fire Blast].Cooldown}&&!${Immune-Fire} { call UpdateHudStatus "Casting Fireblast" call CastSpell "Fire Blast" ${AttackGUID} } } call snarfpotion if ${Unit[${AttackGUID}].PctHPs}<10&&!${Immune-Fire} { call CastSpell "Scorch" ${AttackGUID} } ;Wand if it's ignited and low on HP if ${Unit[${AttackGUID}].Debuff["Ignite"](exists)}&&${Target.PctHPs}<10 { call CastSpell "Shoot" ${AttackGUID} } ;Firoso: No spells for you! if ${Unit[${AttackGUID}].Casting.ID(exists)}&&${Unit[${AttackGUID}].CurrentMana}>0 { call UpdateHudStatus "Trying Counterspell" call CastSpell "Counterspell" ${AttackGUID} } if !${Me.Buff[Fire Ward](exists)}&&${Spell[Fire Ward](exists)}&&!${Spell[Fire Ward].Cooldown}&&${UseFireWard}&&!${UseFrostWard} { if ${Me.Sitting} { wowpress SITORSTAND } call CastSpell "Fire Ward" ${Me.GUID} } if !${Me.Buff[Frost Ward](exists)}&&${Spell[Frost Ward](exists)}&&!${Spell[Frost Ward].Cooldown}&&!${UseFireWard}&&${UseFrostWard} { if ${Me.Sitting} { wowpress SITORSTAND } call CastSpell "Frost Ward" ${Me.GUID} } if (${Unit[${AttackGUID}].Distance}<41&&!${Spell[Fireball]Cooldown}) { Face ${Unit[${AttackGUID}].X} ${Unit[${AttackGUID}].Y} call CheckFacing call UpdateHudStatus "Casting Fireball" call CastSpell "Fireball" ${AttackGUID} } if !${RangedMode} && ${Unit[${AttackGUID}].Distance} > ${RangedMinDist} { RangedMode:Set[TRUE] call UpdateHudStatus "Entered Ranged Mode" } ;Check if we need to switch out of Ranged Mode if ${RangedMode} && ${Unit[${AttackGUID}].Distance} < ${RangedMinDist} { RangedMode:Set[FALSE] call UpdateHudStatus "Left Ranged Mode" } call snarfpotion call usestone if ${Unit[${AttackGUID}].Distance}<41&&${Unit[${AttackGUID}].PctHPs}<16&&!${Unit[${AttackGUID}].Dead} { if !${Me.Equip[18](exists)} { call UpdateHudStatus "No Wand - Casting Fireball" call CastSpell "Fireball" ${AttackGUID} } if ${Me.Equip[18](exists)}&&${Me.PctMana}<31 { call UpdateHudStatus "Using Wand!" call CastSpell "Shoot" ${AttackGUID} } if ${Unit[${AttackGUID}].Distance}<29&&${Unit[${AttackGUID}].PctHPs}<16&&!${Unit[${AttackGUID}].Dead}&&${Me.PctMana}>30&&!${Spell[Scorch].Cooldown} { call CastSpell "Scorch" ${AttackGUID} } } ; NUKES END } } ; Check if we wish to flee combat or not Aggros:Search[-units,-nearest,-targetingme,-alive,-range 0-10] if (${Aggros.Count}>${PanicThreshold}&&${Me.PctHPs}<50)||(${Me.PctHPs}<20&&${Unit[${AttackGUID}].PctHPs}>50) { call snarfpotion #ifdef DEBUG call Debug "I have ${Aggros.Count} Aggro mobs." #endif RLG:Set[TRUE] TargetGUID:Set[NOTARGET] DoDowntime:Set[TRUE] #ifdef DEBUG call Debug "Too many Aggros Count... setting RLG and return" #endif return } ;if aggros has an elite in it, RUN! if (${Aggros.Count}>0) { InnerIndex:Set[1] call UpdateHudStatus "Aggro Check" do { if ${Unit[${Aggros.GUID[${InnerIndex1}]}].Classification.Equal[Elite]} { if !${Spell[Polymorph].Cooldown}&&${Spell[Polymorph](exists)} { call UpdateHudStatus "Aggrod an elite RUN after we sheep!!" call CastSpell Polymorph ${Aggros.GUID[${InnerIndex1}]} } RLG:Set[TRUE] TargetGUID:Set[NOTARGET] DoDowntime:Set[TRUE] #ifdef DEBUG call Debug "Elite Aggro... setting RLG and return" #endif return } } while ${InnerIndex:Inc}<=${Aggros.Count} } call usestone if ${Me.PctMana}<10 { #ifdef DEBUG call Debug "I have no mana to fight with. Muuuummmyy" #endif RLG:Set[TRUE] TargetGUID:Set[NOTARGET] } ;pre-flee section - set up spells that will aid in running away if ${RLG} { call UpdateHudStatus "Running! Casting flee spells" if !${Spell[Frost Nova].Cooldown}&&${Spell[Frost Nova](exists)} { ;call UpdateHudStatus "Casting Frost Nova" call CastSpell "Frost Nova" ${AttackGUID} } #ifdef DEBUG call Debug "RLG - Cast Frost Nova" #endif return } ;you're a mage...why would you melee something. Worst case we'd use a wand..or just set your combatmax dist to your fireball range.... ;If too far away run forward if ${Unit[${AttackGUID}].Distance}>${RangedMaxDist} { #ifdef DEBUG call Debug "Too far closing" #endif ;press and hold the forward button move -stop move forward } ;If too close then run backward if ${Unit[${AttackGUID}].Distance}<${CombatMinDist} { #ifdef DEBUG call Debug "Too close backing up" #endif ;press and hold the backward button move -stop move backward } ;If we are close enough stop running if ${Unit[${AttackGUID}].Distance}>${CombatMinDist}&&${Unit[${AttackGUID}].Distance}<${RangedMaxDist} { move -stop StuckCheck:Set[FALSE] } ;wait for half a second to give our pc a chance to move wait 5 ; Check to make sure we have moved if not then try and avoid the ; obstacle thats in our path if ${Math.Distance[${Me.X},${Me.Y},${Me.Z},${SavX},${SavY},${SavZ}]}<1&&${Unit[${AttackGUID}].Distance}>${CombatMaxDist} { ; I think i might be stuck so save off the current time if !${StuckCheck} { #ifdef DEBUG call Debug "I might be stuck" #endif StuckCheck:Set[TRUE] StuckCheckTime:Set[${LavishScript.RunningTime}] } else { ; If I am still stuck after 8 seconds then try and avoid the obstacle. if ${Math.Calc[${LavishScript.RunningTime}-${StuckCheckTime}]}>8000 { #ifdef DEBUG call Debug "Yep I am stuck trying to free myself" #endif call Obstacle StuckCheck:Set[FALSE] } } } ; If I have moved away from my saved spot reset my stuck toggle if ${StuckCheck}&&${Math.Distance[${Me.X},${Me.Y},${Me.Z},${SavX},${SavY},${SavZ}]}>3 { #ifdef DEBUG call Debug "I am no longer stuck" #endif StuckCheck:Set[FALSE] } ; Check if we have exceeded bail out timer if ${LavishScript.RunningTime}>${BailOut} { GUIDBlacklist:Set[${TargetGUID},AVOID] call UpdateHudStatus "Combat timeout reached" #ifdef DEBUG call Debug "Combat Timeout Reached" #endif TargetGUID:Set[NOTARGET] return } } while !${Unit[${AttackGUID}].Dead}&&!${Me.Dead} ; Update stats if !${Me.Dead} { #ifdef DEBUG call Debug "Updating Stats" #endif call UpdateStats } move -stop wait 5 ;Reset flags to do combat prep and downtime #ifdef DEBUG call Debug "Resetting Combat Prep and Downtime" #endif DoDowntime:Set[TRUE] DoCombatPrep:Set[TRUE] Return } function FrostNovaAttackSet(string AttackGUID) { declare moverand int if ${Unit[${AttackGUID}].Distance}<10&&!${Target.Name.Find["Water"} { if !${Spell[Frost Nova].Cooldown} { call UpdateHudStatus "Casting Frost Nova" call CastSpell "Frost Nova" ${AttackGUID} ;blink away from the target if we can call snarfpotion ;this blink section isn't working 100% yet, change the -1 to a 0 in the next line to try it out if (${Spell[Blink](exists)}&&${Spell[Blink].Cooldown}==-1) { ;turn around 180 degrees call UpdateHudStatus "Turning around 180 degrees and blinking" ;Face -heading ${Me.Heading.DegreesCCW} call UpdateHudStatus "Facing Heading" Face -heading ${Math.Calc[${Me.Heading}-180]} call CheckFacing call CastSpell "Blink" ${Me.GUID} ;wait 5 } else { ;make sure the target wasn't killed by the frost nova if !${Unit[${AttackGUID}].Dead} { call UpdateHudStatus "Turn sideways and sidestep for a few paces..."; ;face the target so when we turn we can still fire blast him while we strafe call UpdateHudStatus "Facing Target - Strafing Target" call SmartFace ${Unit[${AttackGUID}].X} ${Unit[${AttackGUID}].Y} call CheckFacing call snarfpotion ;only turn 85 degrees so the target is still 'in front' of us while we strafe ;strafing time ;stop when ${Unit[${AttackGUID}]} doesnt have the frost nova buff on it moverand:Set[${Math.Rand[2]}] ;echo ${moverand} if (${moverand}==0) { move left } if (${moverand}==1) { move right } wait 8 call UpdateHudStatus "Facing Target - End Strafe" Face ${Unit[${AttackGUID}].X} ${Unit[${AttackGUID}].Y} call CheckFacing move -stop call snarfpotion if !${Spell[Fire Blast].Cooldown}&&${Spell[Fire Blast](exists)} { call CastSpell "Fire Blast" ${AttackGUID} } else { call CastSpell "Fireball" ${AttackGUID} } } } if !${Unit[${AttackGUID}].Dead} { ;face the target after our little maneuver if the target is alive ;face ${Unit[${AttackGUID}].X} ${Unit[${AttackGUID}].Y} Face ${Unit[${AttackGUID}].X} ${Unit[${AttackGUID}].Y} call CheckFacing } } } } function Downtime() { if ${Me.Dead}||${Me.Ghost}||${Me.InCombat} { call snarfpotion call UpdateHudStatus "Not a good time to Rest, quick exit from Downtime!" DoDowntime:Set[FALSE] return } if (${Me.PctMana}>${MinManaPct}) && (${Me.PctHPs}>${MinHealthPct}) { ; Reset downtime flag DoDowntime:Set[FALSE] return } if ${Me.Swimming} { call UpdateHudStatus "Moving to last Waypoint because we are in the water" call moveto SavedWaypointX SavedWaypointY 5 } if !${Variable[MAGICWATER_NAME](exists)}&&${Spell[Conjure Water](exists)} { call SetMageSummons } call check_for_lootable_containers ;ok, you're a mage, so you can summon food/water/mana stones, let's do that now. ;first, if we don't have a mana stone, then create one if we have the mana ;Make sure you have at least one slot available in a bag! if !${Item[${MANASTONE}](exists)}&&!${Spell[${MANASTONE_SPELLNAME}].Cooldown} { if ${Me.CurrentMana}>${Spell[${MANASTONE_SPELLNAME}].Mana} ;echo "CurrentMana ${Me.CurrentMana} and ManaStone Cost is ${Spell[${MANASTONE_SPELLNAME}].Mana}" { call CastSpell "${MANASTONE_SPELLNAME}" } } do { ; BUFFS BEGIN if (!${Me.Buff[Arcane Intellect](exists)}&&${Spell[Arcane Intellect](exists)})&&(${Me.CurrentMana}>${Spell[Arcane Intellect].Mana}) { if ${Me.Sitting} { wowpress SITORSTAND } ;call UpdateHudStatus "Casting Arcane Intellect" call CastSpell "Arcane Intellect" ${Me.GUID} } if !${Me.Buff[Ice Armor](exists)}&&${Spell[Ice Armor](exists)} { if ${Me.Sitting} { wowpress SITORSTAND } call CastSpell "Ice Armor" ${Me.GUID} } if !${Me.Buff[Frost Armor](exists)}&&!${Spell[Ice Armor](exists)} { if ${Me.Sitting} { wowpress SITORSTAND } call CastSpell "Frost Armor" ${Me.GUID} } if !${Me.Buff[Dampen Magic](exists)}&&${Spell[Dampen Magic](exists)}&&(${Me.CurrentMana}>${Spell[Dampen Magic].Mana}) { if ${Me.Sitting} { wowpress SITORSTAND } call CastSpell "Dampen Magic" ${Me.GUID} } call MakeDrink call MakeFood call MageDrink Call MageEat ;we are noob and cant cast conjure food or water... lets just sit down if (!${Spell[Conjure Food](exists)}&&!${Spell[Conjure Water](exists)}&&!${Me.Sitting}) { wowpress SITORSTAND } waitframe } while (${Me.CurrentHPs}<${Me.MaxHPs}||${Me.PctMana}<100)&&!${Me.InCombat} call UpdateHudStatus "Exit Downtime Routine" ;Make sure we are stood up. if ${Me.Sitting} { wowpress SITORSTAND move -stop wait 5 } ; Reset downtime flag DoDowntime:Set[FALSE] waitframe } function MakeFood() { if !${Item[${MAGICFOOD_NAME}](exists)}&&${Spell[Conjure Food](exists)}&&!${Me.Buff[Food](exists)}&&!${Me.Buff[Drink](exists)} { if ${Me.CurrentMana}>${Spell[Conjure Food].Mana} { if ${Me.Sitting} { wowpress SITORSTAND } call UpdateHudStatus "Making ${MAGICFOOD_NAME}" call CastSpell "Conjure Food" ${Me.GUID} wait 5 } if (${Item[${MAGICFOOD_NAME}].StackCount}<3) { call UpdateHudStatus "Making More ${MAGICFOOD_NAME}" call CastSpell "Conjure Food" ${Me.GUID} if !${Me.InCombat} { wait 5 } else { return } } } return } function MageEat() { if ${Me.CurrentHPs}<${Me.MaxHPs}&&${Item[${MAGICFOOD_NAME}](exists)}&&!${Me.Buff[Food](exists)} { call UpdateHudStatus "Eating Food Now" Item[${MAGICFOOD_NAME}]:Use wait 15 } } function MakeDrink() { if !${Item[${MAGICWATER_NAME}](exists)}&&${Spell[Conjure Water](exists)}&&!${Me.Buff[Drink](exists)} { if ${Me.CurrentMana}>${Spell[Conjure Water].Mana} { if ${Me.Sitting} { wowpress SITORSTAND } call UpdateHudStatus "Making ${MAGICWATER_NAME}" call CastSpell "Conjure Water" ${Me.GUID} if !${Me.InCombat} { wait 5 } if (${Item[${MAGICWATER_NAME}].StackCount}<3) { call UpdateHudStatus "Making More ${MAGICWATER_NAME}" call CastSpell "Conjure Water" ${Me.GUID} if !${Me.InCombat} { wait 5 } else { return } } } } return } function MageDrink() { if ${Me.CurrentMana}<${Me.MaxMana}&&${Item[${MAGICWATER_NAME}](exists)}&&!${Me.Buff[Drink](exists)} { call UpdateHudStatus "Drinking water now " Item[${MAGICWATER_NAME}]:Use wait 25 } } function snarfpotion() { if ${Item["Defiler's Talisman"](exists)}&&${Me.PctHPs}<25&&${Target.PctHPs}>45 ;&&!${Item["Defiler's Talisman"].Cooldown} { call UpdateHudStatus "Using Defiler's Talisman" Item["Defiler's Talisman"]:Use } ;call UpdateHudStatus "Checking to see if I need to use a potion" if (${Me.PctHPs}<35)&&(${Target.PctHPs}>45)&&(${Spell[Mana Shield](exists)}&&!${Spell[Mana Shield].Cooldown})&&!${Me.Buff[Mana Shield](exists)} { call UpdateHudStatus "Casting Mana Shield" call CastSpell "Mana Shield" ${Me.GUID} } call usestone if ${Item[Greater Healing Potion](exists)} { if (${Me.PctHPs}<25)&&(${Target.PctHPs}>35) { call UpdateHudStatus "Snarfing Greater Healing Potion" Item[Greater Healing Potion]:Use return } } if ${Item[Healing Potion](exists)} { if (${Me.PctHPs}<25)&&(${Target.PctHPs}>35) { call UpdateHudStatus "Snarfing Healing Potion" Item[Healing Potion]:Use return } } if ${Item[Lesser Healing Potion](exists)} { if (${Me.PctHPs}<25)&&(${Target.PctHPs}>35) { call UpdateHudStatus "Snarfing Lesser Healing Potion" Item[Lesser Healing Potion]:Use return } } if ${Item[Minor Healing Potion](exists)} { if ${Me.PctHPs}<25 && ${Target.PctHPs}>35 { call UpdateHudStatus "Snarfing Minor Healing Potion" Item[Minor Healing Potion]:Use return } } } function CombatPrep() ;this needs work.... we need to check aggros and buffup if we can { if ${Me.Dead}||${Me.Ghost}||${Me.InCombat} { call snarfpotion call UpdateHudStatus "Not a good time to Prep, quick exit from CombatPrep" DoCombatPrep:Set[FALSE] return } if !${Me.Buff[Fire Ward](exists)}&&${Spell[Fire Ward](exists)}&&!${Spell[Fire Ward].Cooldown}&&${UseFireWard}&&!${UseFrostWard} { if ${Me.Sitting} { wowpress SITORSTAND } call CastSpell "Fire Ward" ${Me.GUID} } if !${Me.Buff[Frost Ward](exists)}&&${Spell[Frost Ward](exists)}&&!${Spell[Frost Ward].Cooldown}&&!${UseFireWard}&&${UseFrostWard} { if ${Me.Sitting} { wowpress SITORSTAND } call CastSpell "Frost Ward" ${Me.GUID} } if !${Me.Buff[Arcane Intellect](exists)} { call UpdateHudStatus "Casting Arcane Intellect" call CastSpell "Arcane Intellect" ${Me.GUID} } ; Need to put in a Mage Armor option here if !${Me.Buff[Ice Armor](exists)}&&${Spell[Ice Armor](exists)} { call CastSpell "Ice Armor" ${Me.GUID} DoDowntime:Set[TRUE] return } if !${Me.Buff[Frost Armor](exists)}&&!${Spell[Ice Armor](exists)} { call CastSpell "Frost Armor" ${Me.GUID} DoDowntime:Set[TRUE] return } if !${Me.Buff[Dampen Magic](exists)}&&${Spell[Dampen Magic](exists)} switch ${Unit[${TargetList.GUID[${Index}]}].Class} { case Mage case Priest case Paladin call CastSpell "Dampen Magic" echo "Dampen Magic!" DoDowntime:Set[TRUE] ; return } if !${Me.Buff[Dampen Magic](exists)}&&${Spell[Dampen Magic](exists)} if ${Target.Name.Find[Elemental]} { call CastSpell "Dampen Magic" echo "Dampen Magic! 2" DoDowntime:Set[TRUE] ; returm } ;Reset flag DoCombatPrep:Set[FALSE] } function SetMageSummons() { declare MageFoodSummon int declare MageDrinkSummon int declare MAGICFOOD_NAME string script declare MAGICWATER_NAME string script declare MANASTONE string script declare MANASTONE_SPELLNAME string script MageFoodSummon:Set[${Spell[Conjure Food].Level}] ;echo ${Spell[Conjure Food].Level} ;echo ${MageFoodSummon} Switch ${MageFoodSummon} { case 6 MAGICFOOD_NAME:Set[Conjured Muffin] break case 12 MAGICFOOD_NAME:Set[Conjured Bread] break case 22 MAGICFOOD_NAME:Set[Conjured Rye] break case 32 MAGICFOOD_NAME:Set[Conjured Pumpernickel] break case 42 MAGICFOOD_NAME:Set[Conjured Sourdough] break case 52 MAGICFOOD_NAME:Set[Conjured Sweet Roll] break case 60 MAGICFOOD_NAME:Set[Conjured Cinnamon Roll] break } MageDrinkSummon:Set[${Spell[Conjure Water].Level}] Switch ${MageDrinkSummon} { case 4 MAGICWATER_NAME:Set[Conjured Water] break case 10 MAGICWATER_NAME:Set[Conjured Fresh Water] break case 20 MAGICWATER_NAME:Set[Conjured Purified Water] break case 30 MAGICWATER_NAME:Set[Conjured Spring Water] break case 40 MAGICWATER_NAME:Set[Conjured Mineral Water] break case 50 MAGICWATER_NAME:Set[Conjured Sparkling Water] break case 60 MAGICWATER_NAME:Set[Conjured Crystal Water] break } if ${Spell[Conjure Mana Agate](exists)}&&!${Spell[Conjure Mana Jade](exists)} { MANASTONE:Set[Mana Agate] MANASTONE_SPELLNAME:Set[Conjure Mana Agate] } if ${Spell[Conjure Mana Jade](exists)}&&!${Spell[Conjure Mana Citrine](exists)} { MANASTONE:Set[Mana Jade] MANASTONE_SPELLNAME:Set[Conjure Mana Jade] } if ${Spell[Conjure Mana Citrine](exists)}&&!${Spell[Conjure Mana Ruby](exists)} { MANASTONE:Set[Mana Citrine] MANASTONE_SPELLNAME:Set[Conjure Mana Citrine] } if ${Spell[Conjure Mana Ruby](exists)} { MANASTONE:Set[Mana Ruby] MANASTONE_SPELLNAME:Set[Conjure Mana Ruby] } call UpdateHudStatus "Setting Drink to ${MAGICWATER_NAME}" call UpdateHudStatus "Setting Food to ${MAGICFOOD_NAME}" call UpdateHudStatus "Setting Mana Stone to ${MANASTONE}" } function lootContainer(string itemName) { if !${Me.Casting} { Item["${itemName}"]:Use wait 10 ${LootWindow(exists)} lootall wait 15 !${LootWindow(exists)} } else { wait 10 } } function check_for_lootable_containers() { while ${Item["Big-mouth Clam"].Slot(exists)} && ${Item["Big-mouth Clam"].Bag.Number(exists)} { call lootContainer "Big-mouth Clam" } while ${Item["Thick-shelled Clam"].Slot(exists)} && ${Item["Thick-shelled Clam"].Bag.Number(exists)} { call lootContainer "Thick-shelled Clam" } while ${Item["Bloated Catfish"].Slot(exists)} && ${Item["Bloated Catfish"].Bag.Number(exists)} { call lootContainer "Bloated Catfish" } while ${Item["Bloated Mud Snapper"].Slot(exists)} && ${Item["Bloated Mud Snapper"].Bag.Number(exists)} { call lootContainer "Bloated Mud Snapper" } while ${Item["Bloated Redgill"].Slot(exists)} && ${Item["Bloated Redgill"].Bag.Number(exists)} { call lootContainer "Bloated Redgill" } while ${Item["Bloated Salmon"].Slot(exists)} && ${Item["Bloated Salmon"].Bag.Number(exists)} { call lootContainer "Bloated Salmon" } while ${Item["Bloated Smallfish"].Slot(exists)} && ${Item["Bloated Smallfish"].Bag.Number(exists)} { call lootContainer "Bloated Smallfish" } while ${Item["Bloated Trout"].Slot(exists)} && ${Item["Bloated Trout"].Bag.Number(exists)} { call lootContainer "Bloated Trout" } while ${Item["Dented Crate"].Slot(exists)} && ${Item["Dented Crate"].Bag.Number(exists)} { call lootContainer "Dented Crate" } while ${Item["Heavy Crate"].Slot(exists)} && ${Item["Heavy Crate"].Bag.Number(exists)} { call lootContainer "Heavy Crate" } while ${Item["Message in a Bottle"].Slot(exists)} && ${Item["Message in a Bottle"].Bag.Number(exists)} { call lootContainer "Message in a Bottle" } while ${Item["Sealed Crate"].Slot(exists)} && ${Item["Sealed Crate"].Bag.Number(exists)} { call lootContainer "Sealed Crate" } while ${Item["Small Chest"].Slot(exists)} && ${Item["Small Chest"].Bag.Number(exists)} { call lootContainer "Heavy Crate" } while ${Item["Waterlogged Crate"].Slot(exists)} && ${Item["Waterlogged Crate"].Bag.Number(exists)} { call lootContainer "Waterlogged Crate" } while ${Item["Battered Chest"].Slot(exists)} && ${Item["Battered Chest"].Bag.Number(exists)} { call lootContainer "Battered Chest" } while ${Item["Large Battered Chest"].Slot(exists)} && ${Item["Large Battered Chest"].Bag.Number(exists)} { call lootContainer "Large Battered Chest" } } function usestone() { if (${Item[${MANASTONE}](exists)}&&${Me.PctMana}<25) { call GetSpellCooldown ${MANASTONE_SPELLNAME} if ${Return(exists)}&&${Return}==0 { call UpdateHudStatus "Mana is ${Me.PctMana}, using ${MANASTONE}" Item[${MANASTONE}]:Use wait 5 } } if (${Spell[Evocation](exists)}&&${Me.PctMana}<15&&!${Spell[Evocation].Cooldown}) { call UpdateHudStatus "Emergency Evocation" call CastSpell "Evocation" ${Me} } ;else ;{ ; ;use mana potions? ;} } function inittriggers() { AddTrigger ImmuneFrost "[Event:@eventid@"CHAT_MSG_SPELL_SELF_DAMAGE](\"Your Chilled failed. @mob@ is immune.\"@*@)" AddTrigger ImmuneFrost "[Event:@eventid@"CHAT_MSG_SPELL_SELF_DAMAGE](\"Your Frostbolt failed. @mob@ is immune.\"@*@)" AddTrigger ImmuneFrost "[Event:@eventid@"CHAT_MSG_SPELL_SELF_DAMAGE](\"Your Cone of Cold failed. @mob@ is immune.\"@*@)" AddTrigger ImmuneFrost "[Event:@eventid@"CHAT_MSG_SPELL_SELF_DAMAGE](\"Your Frost Nova failed. @mob@ is immune.\"@*@)" AddTrigger ImmuneFrost "[Event:@eventid@"CHAT_MSG_SPELL_SELF_DAMAGE](\"Your Ice Lance failed. @mob@ is immune.\"@*@)" AddTrigger ImmuneFire "[Event:@eventid@"CHAT_MSG_SPELL_SELF_DAMAGE](\"Your Pyroblast failed. @mob@ is immune.\"@*@)" AddTrigger ImmuneFire "[Event:@eventid@"CHAT_MSG_SPELL_SELF_DAMAGE](\"Your Fireball failed. @mob@ is immune.\"@*@)" AddTrigger ImmuneFire "[Event:@eventid@"CHAT_MSG_SPELL_SELF_DAMAGE](\"Your Fire Blast failed. @mob@ is immune.\"@*@)" AddTrigger ImmuneFire "[Event:@eventid@"CHAT_MSG_SPELL_SELF_DAMAGE](\"Your Blast Wave failed. @mob@ is immune.\"@*@)" AddTrigger ImmuneFire "[Event:@eventid@"CHAT_MSG_SPELL_SELF_DAMAGE](\"Your Scorch failed. @mob@ is immune.\"@*@)" AddTrigger FrostDamage "[Event:@eventid@"CHAT_MSG_SPELL_CREATURE_DAMAGE](\"@mob@ hits you for @amount@ Frost damage.\"@*@)" AddTrigger FireDamage "[Event:@eventid@"CHAT_MSG_SPELL_CREATURE_DAMAGE](\"@mob@ hits you for @amount@ Fire damage.\"@*@)" } function ImmuneFrost() { Immune-Frost:set[TRUE] } function ImmuneFire() { Immune-Fire:set[TRUE] } function FireDamage() { UseFrostWard:set[FALSE] UseFireWard:set[TRUE] } function FrostDamage() { UseFireWard:set[FALSE] UseFrostWard:set[TRUE] }