All pastes #367107 Raw Edit

Unnamed

public text v1 · immutable
#367107 ·published 2007-02-22 03:24 UTC
rendered paste body
; 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} 
				call inittriggers
			} 
			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}].Buff["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&&!${Immune-Frost}
	{ 
		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]
}