All pastes #951465 Raw Edit

Someone

public text v1 · immutable
·published 2008-03-21 12:18 UTC
rendered paste body
objectdef oClass inherits oBase
{
  ;******************************************************************************** /
  ;** Variables                                                                   * /
  ;******************************************************************************** /

	;--- Rest
	variable int RestMana = 35
	variable int StandMana = 85
	variable int RestHP = 70
	variable int StandHP = 80
	
	;--- Range and checks
	variable int AttackRange = 35
	variable int FollowRange = 35
	variable int MaxHeightDif = 5
	variable int Friends = 1
	
	;--- Pull ----------------------------------------------------------------------- /
	variable bool UsePullDot1 = TRUE
	variable string PullDot1 = "Moonfire"
	variable bool UsePullDot2 = TRUE
	variable string PullDot2 = "Insect Swarm"
	
	;--- Rest ----------------------------------------------------------------------- /
	variable int 	RestMyHealthTouch = 70
	
	;--- Buff ----------------------------------------------------------------------- /
	variable bool BuffMark = TRUE
	variable bool BuffThorns = TRUE
	
	;--- CombatBuff ----------------------------------------------------------------- /
	variable bool CombatBuffRacial = TRUE
	variable bool CombatBuffTrinket = TRUE
	variable bool CombatBuffSwiftness = TRUE
	variable bool CombatBuffBarkskin = TRUE
	variable bool CombatBuffStone = TRUE
	variable int  CombatBuffMyHealthStone = 25
	variable bool CombatBuffInnervate = TRUE
	
	;--- Prebuff -------------------------------------------------------------------- /
	variable bool PrebuffTable = TRUE
	variable int PrebuffTableStacks = 10
	variable bool PrebuffSoulwell = TRUE
	variable bool PrebuffMark = TRUE
	variable bool PrebuffThorns	= TRUE
	
	;--- Guard ---------------------------------------------------------------------- /
	variable bool GuardBloom = TRUE
	variable int  GuardTargetHealthBloom = 70
	variable int  GuardMyManaBloom = 50
	
	;--- Healer --------------------------------------------------------------------- /
	variable bool HealerRejuvenation = TRUE
	variable int  HealerTargetHealthRejuvenation = 80
	variable int  HealerMyManaRejuvenation = 20
	variable bool HealerRegrowth = TRUE
	variable int  HealerTargetHealthRegrowth = 40
	variable int  HealerMyManaRegrowth = 20
	variable bool HealerBloom = TRUE
	variable int  HealerTargetHealthBloom = 60
	variable int  HealerMyManaBloom	= 20
	variable bool HealerTouch = TRUE	
	variable int  HealerTargetHealthTouch = 20
	variable int  HealerMyManaTouch = 10
	
	;--- Trinkets
	variable string TrinketName1 = "Battlemaster's Perseverance"
	variable int TrinketMyHealth1 = 30 /* 100 for always use */
	variable int TrinketMyMana1 = 100 /* 100 for always use */
	variable int TrinketPvP1 = FALSE /* Only PvP Trinket   */
	
	variable string TrinketName2 = "Insignia of the Horde"
	variable int TrinketMyHealth2 = 100 /* 100 for always use*/
	variable int TrinketMyMana2 = 100 /* 100 for always use*/
	variable int TrinketPvP2 = TRUE	/* Only PvP Trinket   */
	
  ;******************************************************************************** /
  ;** Pull & Attack Functions                                                     * /
  ;******************************************************************************** /
	;** - Pull Setup - ************************************************************** /
	;** - Attack Setup - ************************************************************ /
  ;******************************************************************************** /

	;** - Pull Setup - ************************************************************** /
	variable int PullBailOut = ${LavishScript.RunningTime}
	variable int RandomPull = 99

	method PullPulse()
	{
		This:BGChk
		
		if ${Me.Casting}
		{
			return
		}		
		
		if ${Toon.TargetIsNew}
		{
			This.PullBailOut:Set[${This.InMilliseconds[${Config:GetSlider["sldPullBailOutTimer"]}]
		}

		if !${Toon.ValidTarget[${Target.GUID}]} && ${This.FriendsChk}
		{
			This:Output["DRUID Routine: Need a target"]
			Toon:NeedTarget[1]
			return
		}
		
		if !${Target.LineOfSight}
		{
			This:Output["DRUID Routine: Target is out of sight, skipping! ${Target.LineOfSight}."]
			;WoWScript ClearTarget()
			Toon:Stop
			if ${This.FriendsChk}
			{
      	Toon:NextBestTarget
      }
			return
		}
		
		if (!${Toon.TargetIsBestTarget} || ${Target.Dead} || !${Target.LineOfSight}) || (${Target.Distance} > ${This.FollowRange})
    {
    	This:Output["DRUID Routine: Target is no longer best target."]
    	;WoWScript ClearTarget()
      if ${This.FriendsChk}
      {
      	Toon:BestTarget
      }
      return
    }
		
		if (${Target.Distance} > ${This.AttackRange}) && (${Target.Distance} < ${This.FollowRange}) && (${Math.Abs[${Target.Z} - ${Me.Z}]} < ${This.MaxHeightDif})
		{
			This:Output["Target is too far away but within follow range, moving closer."]
			Toon:ToRanged
			return
		}
		elseif !${Target.LineOfSight}
		{
			This:Output["DRUID Routine: Target is out of sight, skipping! ${Target.LineOfSight}."]
			;WoWScript ClearTarget()
			Toon:Stop
			if ${This.FriendsChk}
			{
      	Toon:NextBestTarget
      }
			return
		}
		elseif ${Movement.Speed} && ${Target.Distance} < ${This.AttackRange} - 2
		{
			Toon:Stop
		}
		
		if ${This.NeedFaceForSpell}
		{
			This:FaceForSpellPulse
			return
		}
		
		if ${This.UsePullDot1} && !${This.NeedHealer}
		{
			if ${Toon.canCast[${This.PullDot1}]} && ${Toon.canBuff[${Target.GUID}, ${This.PullDot1}]} && !${Movement.Speed}
			{
				Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
				Toon:CastSpellGUID[${Target.GUID}, ${This.PullDot1}]
				return
			}
		}
		
		if ${This.UsePullDot2} && !${This.NeedHealer}
		{
			if ${Toon.canCast[${This.PullDot2}]} && ${Toon.canBuff[${Target.GUID}, ${This.PullDot2}]} && !${Movement.Speed}
			{
				Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
				Toon:CastSpellGUID[${Target.GUID}, ${This.PullDot2}]
				return
			}
		}
	}
	
	;** - Attack Setup - ************************************************************ /
	method AttackPulse()
	{		
		;if ${Me.Casting}
		;{
		;	return
		;}
		;important
		
		This:BGChk
		
		if ${This.NeedCombatHealing}
		{
			This:CombatHealingPulse
			return
		}
		
		if ${This.NeedHealer} && ${This.FriendsChk}
		{
			This:HealerPulse
			return
		}
		
		if !${Toon.ValidTarget[${Target.GUID}]} || ${Target.Dead} || !${Me.Target(exists)} || ${Target.Distance} > ${This.AttackRange}
		{
			Toon:Stop
			Toon:NeedTarget[1]
			return
		}
		
		if !${Toon.TargetIsBestTarget} && ${Object[${Toon.BestTarget}](exists)} && ${Toon.BestTarget.NotEqual[NULL]}
    {
    	This:Output["Target is no longer best target. Getting new target."]
      Toon:BestTarget
      return
    }
    
    if ${Target.Distance} > ${This.FollowRange}
		{
			This:Output["Target is to far away! ${Target.Distance}"]
			;WoWScript ClearTarget()
			Toon:Stop
			Toon:NextBestTarget
			return
		}
		
		if (${Target.Distance} > ${This.AttackRange}) && (${Target.Distance} < ${This.FollowRange}) && (${Math.Abs[${Target.Z} - ${Me.Z}]} < ${This.MaxHeightDif})
		{
			This:Output["Target is too far away but within follow range, moving closer."]
			Toon:ToRanged
			return
		}
		elseif ${Movement.Speed} && ${Target.Distance} < ${This.AttackRange} - 2
		{
			Toon:Stop
		}
		
		if ${This.NeedFaceForSpell}
		{
			This:FaceForSpellPulse
			return
		}

		if ${This.NeedNoMoreSpell}
		{
			This:NoMoreSpellPulse
			return
		}
		
		if ${This.NeedClassAttack} && ${Target.Type.Equal["player"]} && ${Target.FactionGroup.NotEqual[${Me.FactionGroup}]}
		{
			This:ClassAttackPulse
			return
		}

		if ${This.NeedCombatSpell} && !${This.NeedHealer} && !${This.FriendsChk}
			{
				This:CombatSpellPulse
				return
			}
		
		return
		
	}

  ;******************************************************************************** /
  ;** Need & Pulse Functions                                                      * /
  ;******************************************************************************** /
 
	;** - Rest - ******************************************************************** /
	member NeedRest()
	{
		if ${Me.InCombat}
		{
			return FALSE
		}
		
		if ${Me.Buff[Resurrection Sickness](exists)}
		{
			return TRUE
		}
		
		if ${Me.PctHPs} < ${This.RestHP} && ${Item["Conjured Manna Biscuit"](exists)}
		{
			return TRUE
		}
		
		if ${Me.PctMana} < ${This.RestMana} && ${Item["Conjured Manna Biscuit"](exists)}
		{
			return TRUE
		}
		
		if ${Me.PctMana} < ${This.StandMana} && ${Me.Sitting}
		{
			return TRUE
		}
		
		return FALSE
	}
	method RestPulse()
	{
		if ${Me.Casting}
		{
			return
		}
			
		if ${Movement.Speed} || ${Movement.Forward} || ${Movement.Backward}
		{
			Toon:Stop
		}
		
		if ${Me.PctHPs} < ${This.RestHP} && !${Me.Sitting} && !${Me.Casting}
		{

			if ${Toon.canCast[Healing Touch]} && ${Me.PctHPs} < ${This.RestMyHealthTouch} 
			{
				Toon:CastSpellGUID[${Me.GUID}, Healing Touch]
				return
			}
			
		}

		if ${Item["Conjured Manna Biscuit"](exists)} && ${Me.PctHPs} < ${This.RestHP} && !${Me.Buff[Food](exists)}
		{
			Item["Conjured Manna Biscuit"]:Use
			return
		}

		if ${Item["Conjured Manna Biscuit"](exists)} && ${Me.PctMana} < ${This.RestMana} && !${Me.Buff[Drink](exists)}
		{
			Item["Conjured Manna Biscuit"]:Use
			return
		}

		if ${Me.Buff[Resurrection Sickness](exists)}
		{
			Toon:Sitdown
			return
		}

		if ${Me.PctHPs} >= ${This.StandHP} && ${Me.Sitting} && ${Me.PctMana} >= ${This.StandMana}
		{
			Toon:Standup
			return
		}
		
	}
	
	;** - Buff Setup - ************************************************************** /
	member NeedBuff()
	{
		
		if ${This.BuffMark} && ${Toon.canBuff[${Me.GUID}, Mark of the Wild]} && !${Me.Buff[Gift of the Wild](exists)}
		{
			return TRUE
		}
		
		if ${This.BuffThorns} && ${Toon.canBuff[${Me.GUID}, Thorns]}
		{
			return TRUE
		}
		
		return FALSE
	}
	method BuffPulse()
	{

		if ${This.BuffMark} && ${Toon.canBuff[${Me.GUID}, Mark of the Wild]} && !${Me.Buff[Gift of the Wild](exists)}
		{
			Toon:CastSpellGUID[${Me.GUID}, Mark of the Wild]
			return
		}
		
		if ${This.BuffThorns} && ${Toon.canBuff[${Me.GUID}, Thorns]}
		{
			Toon:CastSpellGUID[${Me.GUID}, Thorns]
			return
		}
		
	}
	
method BGChk()
{
	if ${WoWScript[GetBattlefieldWinner()](exists)} || ${BG.ShouldLeaveBG}       
	{
		This:Output["Battle Ground Has a Winner, leaving."]
		move -stop
		BG:LeaveBG
	}
	
	return
}
	
	;** - CombatBuff Setup - ******************************************************** /
	member NeedCombatBuff()
	{
		
		if ${This.CombatBuffRacial} && ${This.NeedRacial}
		{
			return TRUE
		}

		if ${This.CombatBuffTrinket} && ${This.NeedTrinket}
		{	
			return TRUE
		}
		
		if ${This.CombatBuffSwiftness} && ${Toon.canCast[Nature's Swiftness]} && ${Me.PctHPs} < 40
		{
			return TRUE
		}
		
		if ${This.CombatBuffBarkskin} && ${Toon.canCast[Barkskin]} && ${Me.PctHPs} < 50 && ${This.PvPAggroWithin[8,TRUE]} > 0
		{
			return TRUE
		}
		
		if ${This.CombatBuffStone} && ${Item[Master Healthstone](exists)} && ${Me.PctHPs} < ${This.CombatBuffMyHealthStone}
		{
			return TRUE
		}
		
		if ${This.CombatBuffInnervate} && ${Toon.canCast[Innervate]} && ${Me.PctMana} < 40
		{
			return TRUE
		}
		
		return FALSE
	}
	
	method CombatBuffPulse()
	{
		
		if ${This.CombatBuffRacial} && ${This.NeedRacial}
		{
			This:RacialPulse
			return
		}

		if ${This.CombatBuffTrinket} && ${This.NeedTrinket}
		{	
			This:TrinketPulse
			return
		}
		
    if ${This.CombatBuffSwiftness} && ${Toon.canCast[Nature's Swiftness]} && ${Me.PctHPs} < 40
		{
			This:Output["DRUID Routine: Using Nature's Swiftness!"]
			Toon:CastSpell[Nature's Swiftness]
			return
		}
		
    if ${This.CombatBuffBarkskin} && ${Toon.canCast[Barkskin]} && ${Me.PctHPs} < 50 && ${This.PvPAggroWithin[5,TRUE]} > 0
		{
			Toon:CastSpellGUID[${Me.GUID}, Barkskin]
			return
		}
		
		if ${This.CombatBuffStone} && ${Item[Master Healthstone](exists)} && ${Me.PctHPs} < ${This.CombatBuffMyHealthStone}
		{
			This:Output["DRUID Routine: Using Master Healthstone!"]
			Item[Master Healthstone]:Use
			return
		}

    if ${This.CombatBuffInnervate} && ${Toon.canCast[Innervate]} && ${Me.PctMana} < 40
		{
			Toon:CastSpellGUID[${Me.GUID}, Innervate]
			return
		}
		
		return
	}
	
	;** - Combat Healing - ********************************************************** /
	member NeedCombatHealing()
	{
		
		if ${Me.Buff[Nature's Swiftness](exists)} && ${Toon.canCast[Healing Touch]} && ${Me.PctHPs} < 70
		{
			return TRUE
		}
		
		if ${Me.PctHPs} < 50 && ${Toon.canBuff[${Me.GUID}, Swiftmend]} && ( ${Me.Buff[Rejuvenation](exists)} || ${Me.Buff[Regrowth](exists)} )
		{
			return TRUE
		}
		
		if ${Me.PctHPs} < 80 && ${Toon.canBuff[${Me.GUID}, Rejuvenation]} && !${Me.Buff[Rejuvenation](exists)}
		{
			return TRUE
		}
		
		if ${Me.PctHPs} < 90 && (${Toon.canBuff[${Me.GUID}, Lifebloom]} || !${Me.Buff[Lifebloom](exists)}) 
		{
			return TRUE
		}
		
		if ${Me.PctHPs} < 80 && (${Toon.canBuff[${Me.GUID}, Lifebloom]} || ${Me.Buff[Lifebloom].Application} < 2) 
		{
			return TRUE
		}
		
		if ${Me.PctHPs} < 70 && (${Toon.canBuff[${Me.GUID}, Lifebloom]} || ${Me.Buff[Lifebloom].Application} < 3) 
		{
			return TRUE
		}
		
		if ${Me.PctHPs} < 60 && ${Toon.canBuff[${Me.GUID}, Regrowth]}
		{
			return TRUE
		}
		
		if ${Me.PctHPs} < 20 && ${Toon.canCast[Healing Touch]}
		{
			return TRUE
		}
		
		return FALSE
	}
	
	method CombatHealingPulse()
	{
		
		if ${Movement.Speed} || ${Movement.Forward} || ${Movement.Backward}
		{
			Toon:Stop
		}
		
		if ${Me.Buff[Nature's Swiftness](exists)} && ${Toon.canCast[Healing Touch]} && ${Me.PctHPs} < 50
		{
			This:Output["DRUID Routine: Casting Healing Touch with Nature's Swiftness."]
			Toon:CastSpellGUID[${Me.GUID}, Healing Touch]
			return
		}
		
		if ${Me.PctHPs} < 50 && ${Toon.canBuff[${Me.GUID}, Swiftmend]} && ( ${Me.Buff[Rejuvenation](exists)} || ${Me.Buff[Regrowth](exists)} )
		{
			Toon:CastSpellGUID[${Me.GUID}, Swiftmend]
			return
		}
		
		if ${Me.PctHPs} < 80 && ${Toon.canBuff[${Me.GUID}, Rejuvenation]} && !${Me.Buff[Rejuvenation](exists)}
		{
			Toon:CastSpellGUID[${Me.GUID}, Rejuvenation]
			return
		}
		
		if ${Me.PctHPs} < 90 && ( ${Toon.canBuff[${Me.GUID}, Lifebloom]} || !${Me.Buff[Lifebloom](exists)} ) 
		{
			Toon:CastSpellGUID[${Me.GUID}, Lifebloom]
			return
		}
		
		if ${Me.PctHPs} < 80 && ( ${Toon.canBuff[${Me.GUID}, Lifebloom]} || ${Me.Buff[Lifebloom].Application} < 2 ) 
		{
			Toon:CastSpellGUID[${Me.GUID}, Lifebloom]
			return
		}
		
		if ${Me.PctHPs} < 70 && ( ${Toon.canBuff[${Me.GUID}, Lifebloom]} || ${Me.Buff[Lifebloom].Application} < 3 ) 
		{
			Toon:CastSpellGUID[${Me.GUID}, Lifebloom]
			return
		}

		if ${Me.PctHPs} < 60 && ${Toon.canBuff[${Me.GUID}, Regrowth]}
		{
			Toon:CastSpellGUID[${Me.GUID}, Regrowth]
			return
		}
		
		if ${Me.PctHPs} < 20 && ${Toon.canCast[Healing Touch]}
		{
			Toon:CastSpellGUID[${Me.GUID}, Healing Touch]
			return
		}
		
		return
	}
	
	;** - Combat Spell - ************************************************************ /
	member NeedCombatSpell()
	{
		
		if ${Target.IsTotem} || ${Me.PctMana} < 20 || ${Me.Casting}
		{
			return FALSE
		}
		
		if ${Toon.canBuff[${Target.GUID}, Moonfire]} && ${Toon.canCast[Moonfire]}
		{
			return TRUE
		}

		if ${Toon.canCast[Wrath]}
		{
			return TRUE
		}
		
		return FALSE
	}
	method CombatSpellPulse()
	{
		
		if ${Toon.canBuff[${Target.GUID}, Moonfire]} && ${Toon.canCast[Moonfire]}
		{
			Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
			Toon:CastSpellGUID[${Target.GUID}, Moonfire]
			return
		}

		if ${Toon.canCast[Wrath]}
		{
			Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
			Toon:CastSpellGUID[${Target.GUID}, Wrath]
			return
		}
		
		return
	}
	
	;** - Racial - ****************************************************************** /
	member NeedRacial()
	{
		if ${Toon.canCast[War Stomp]} && ${This.PvPAggroWithin[5,TRUE]} > 0 && ${Me.PctHPs} < 50
		{
			return TRUE
		}
		
		return FALSE
	}
	method RacialPulse()
	{		
		if ${Toon.canCast[War Stomp]} && ${This.PvPAggroWithin[5,TRUE]} > 0 && ${Me.PctHPs} < 50
		{
			This:Output["DRUID Routine: Using War Stomp!"]
			Toon:CastSpell[War Stomp]
		}
		
		return
	}
	
	;** - Prebuff All - ************************************************************* /
	variable bool HookBGPrebuff = TRUE
	member NeedBGPrebuff()
	{
		
		if ${This.PrebuffTable} && ${This.NeedBGObjects["Refreshment Table","Conjured Manna Biscuit", ${This.PrebuffTableStacks}]}
		{
			return TRUE
		}
		
		if ${This.PrebuffSoulwell} && ${This.NeedBGObjects["Soulwell","Master Healthstone", 1]}
		{
			return TRUE
		}
		
		if ${This.PrebuffMark} && ${This.NeedSpellOn[friendly, Mark of the Wild, Gift of the Wild]} && !${Movement.Speed}
		{
			return TRUE
		}
		
		if ${This.PrebuffThorns} && ${This.NeedSpellOn[friendly, Thorns]} && !${Movement.Speed}
		{
			return TRUE
		}
		
		return FALSE
	}
	method BGPrebuffPulse()
	{
		
		if ${This.PrebuffTable} && ${This.NeedBGObjects["Refreshment Table","Conjured Manna Biscuit", ${This.PrebuffTableStacks}]}
		{
			This:BGObjectsPulse["Refreshment Table","Conjured Manna Biscuit", ${This.PrebuffTableStacks}]
			return
		}
		
		if ${This.PrebuffSoulwell} && ${This.NeedBGObjects["Soulwell","Master Healthstone", 1]}
		{
			This:BGObjectsPulse["Soulwell","Master Healthstone", 1]
			return
		}
		
		if ${This.PrebuffMark} && ${This.NeedSpellOn[friendly, Mark of the Wild, Gift of the Wild]} && !${Movement.Speed}
		{
			This:SpellOnPulse[friendly, Mark of the Wild, Gift of the Wild]
			return
		}
		
		if ${This.PrebuffThorns} && ${This.NeedSpellOn[friendly, Thorns]} && !${Movement.Speed}
		{
			This:SpellOnPulse[friendly, Thorns]
			return
		}

		return
	}
	
	;** - Guarding All - ************************************************************ /
	variable bool HookBGGuard = TRUE
	member NeedBGGuard()
  {
  
   	if ${This.GuardBloom} && ${This.NeedSpellOn[friendly, Lifebloom, none, ${This.GuardTargetHealthBloom}]} && ${Me.PctMana} > ${This.GuardMyManaBloom}
		{
			return TRUE
		}
		
		return FALSE
	}
	method BGGuardPulse()
	{
		
		if ${This.GuardBloom} && ${This.NeedSpellOn[friendly, Lifebloom, none, ${This.GuardTargetHealthBloom}]} && ${Me.PctMana} > ${This.GuardMyManaBloom}
		{
			This:SpellOnPulse[friendly, Lifebloom, none, ${This.GuardTargetHealthBloom}]
			return
		}
		
		return
	}
	
	;** - Healer - ****************************************************************** /
	member NeedHealer()
	{

		if ${This.HealerRejuvenation} && ${This.NeedSpellOn[friendly, Rejuvenation, none, ${This.HealerTargetHealthRejuvenation}, 0, 35]} && ${Me.PctMana} > ${This.HealerMyManaRejuvenation}
		{
			return TRUE
		}
		
		if ${This.HealerRegrowth} && ${This.NeedSpellOn[friendly, Regrowth, none, ${This.HealerTargetHealthRegrowth}]} && ${Me.PctMana} > ${This.HealerMyManaRegrowth}
		{
			return TRUE
		}
		
		if ${This.HealerBloom} && ${This.NeedSpellOn[friendly, Lifebloom, none, ${This.HealerTargetHealthBloom}, 0, 35, 3]} && ${Me.PctMana} > ${This.HealerMyManaBloom}
		{
			return TRUE
		}
		
		if ${This.HealerTouch} && ${This.NeedSpellOn[friendly, Healing Touch, none, ${This.HealerTargetHealthTouch}]} && ${Me.PctMana} > ${This.HealerMyManaTouch}
		{
			return TRUE
		}
				
		return FALSE
	}
	
	method HealerPulse()
	{
		
		if ${This.HealerRejuvenation} && ${This.NeedSpellOn[friendly, Rejuvenation, none, ${This.HealerTargetHealthRejuvenation}, 0, 35]} && ${Me.PctMana} > ${This.HealerMyManaRejuvenation}
		{
			This:SpellOnPulse[friendly, Rejuvenation, none, ${This.HealerTargetHealthRejuvenation}, 0, 35]
			return
		}

		if ${This.HealerRegrowth} && ${This.NeedSpellOn[friendly, Regrowth, none, ${This.HealerTargetHealthRegrowth}]} && ${Me.PctMana} > ${This.HealerMyManaRegrowth}
		{
			This:SpellOnPulse[friendly, Regrowth, none, ${This.HealerTargetHealthRegrowth}]
			return
		}
		
		if ${This.HealerBloom} && ${This.NeedSpellOn[friendly, Lifebloom, none, ${This.HealerTargetHealthBloom}, 0, 35, 3]} && ${Me.PctMana} > ${This.HealerMyManaBloom}
		{
			This:SpellOnPulse[friendly, Lifebloom, none, ${This.HealerTargetHealthBloom}, 0, 35, 3]
			return
		}

		if ${This.HealerTouch} && ${This.NeedSpellOn[friendly, Healing Touch, none, ${This.HealerTargetHealthTouch}]} && ${Me.PctMana} > ${This.HealerMyManaTouch}
		{
			This:SpellOnPulse[friendly, Healing Touch, none, ${This.HealerTargetHealthTouch}]
			return
		}
		
		return
	}
	
	;** - Dead Setup - ************************************************************** /
	member NeedDead()
	{
		return FALSE
	}
	method DeadPulse()
	{
		return
	}
	
	;** - Trinket - ***************************************************************** /
	member NeedTrinket()
	{
		if ${Item[${TrinketName1}](exists)} && ${Me.Action[${TrinketName1}].Usable} && ${Me.PctHPs} < ${This.TrinketMyHealth1} && ${Me.PctMana} < ${This.TrinketMyMana1} && ( !${This.TrinketPvP1} || ${This.TrinketPvPDebuff} )
		{
			return TRUE
		}
		
		if ${Item[${TrinketName2}](exists)} && ${Me.Action[${TrinketName2}].Usable} && ${Me.PctHPs} < ${This.TrinketMyHealth2} && ${Me.PctMana} < ${This.TrinketMyMana2} && ( !${This.TrinketPvP2} || ${This.TrinketPvPDebuff} )
		{
			return TRUE
		}
		
		return FALSE
	}
	
	method TrinketPulse()
	{
		if ${Item[${TrinketName1}](exists)} && ${Me.Action[${TrinketName1}].Usable} && ${Me.PctHPs} < ${This.TrinketMyHealth1} && ${Me.PctMana} < ${This.TrinketMyMana1} && ( !${This.TrinketPvP1} || ${This.TrinketPvPDebuff} )
		{
			This:Output["DRUID Routine: Using Trinket ${TrinketName1}"]
			Item[${TrinketName1}]:Use
			return
		}
		
		if ${Item[${TrinketName2}](exists)} && ${Me.Action[${TrinketName2}].Usable} && ${Me.PctHPs} < ${This.TrinketMyHealth2} && ${Me.PctMana} < ${This.TrinketMyMana2} && ( !${This.TrinketPvP2} || ${This.TrinketPvPDebuff} )
		{
			This:Output["DRUID Routine: Using Trinket ${TrinketName2}"]
			Item[${TrinketName2}]:Use
			return
		}
		
		return
	}

;** - SpellOn - ***************************************************************** /
	variable objectref kPlayer
	member NeedSpellOn(string unityp="all", string name1="none", string name2="none", int value1=0, int value2=0, int kMinRange=0, int kMaxRange=25)
	{
		variable int i = 1
		variable guidlist kPlayerList

		kPlayerList:Search[-players, -${unityp}, -noself, -alive, -lineofsight, -range ${kMinRange}-${kMaxRange}]
    
		i:Set[1]
		if ${kPlayerList.Count}
		{
			do
			{
				kPlayer:Set[${kPlayerList.Object[${i}].GUID}]

				if !${kPlayer.Buff[${name1}](exists)}&& ${Toon.canCast[${name1}]} && (!${kPlayer.Buff[${name2}](exists)} || ${name2.Equal["none"]}) && (${kPlayer.PctHPs} < ${value1} || !${value1}) && (${kPlayer.PctHPs} > ${value2} || !${value2})
				{
					return TRUE
				}
			}
			while ${i:Inc} <= ${kPlayerList.Count}
		}
		kPlayerList:Clear

		return FALSE
	}
	method SpellOnPulse(string unityp, string name1="none", string name2="none", int value1=0, int value2=0, int kRange=25, int kApply=0)
	{
		variable int i = 1
		variable guidlist kPlayerList
		variable objectref kPlayer

		kPlayerList:Search[-players, -${unityp}, -noself, -alive, -lineofsight, -range ${kMinRange}-${kMaxRange}]

		i:Set[1]
		if ${kPlayerList.Count}
		{
			do
			{
				kPlayer:Set[${kPlayerList.Object[${i}].GUID}]
				
				if (!${kPlayer.Buff[${name1}](exists)} || ${kPlayer.Buff[${name1}](exists)} && ${kPlayer.Buff[${name1}].Application} < ${kApply}) && ${Toon.canCast[${name1}]} && (!${kPlayer.Buff[${name2}](exists)} || ${name2.Equal["none"]}) && (${kPlayer.PctHPs} < ${value1} || !${value1}) && (${kPlayer.PctHPs} > ${value2} || !${value2})
				{
					Toon:CastSpellGUID[${kPlayer}, ${name1}]
					if ${WoWScript[SpellIsTargeting()]}
					{
						WoWScript SpellStopTargeting()
					}
					
					return
				}
			}
			while ${i:Inc} <= ${kPlayerList.Count}
		}
		kPlayerList:Clear

		return
	}
	;** - NeedClassAttack - ********************************************************* /
	member NeedClassAttack()
	{
		;--- All Class -----------------------------------------------------------
		
		;--- Druid ---------------------------------------------------------------
		if ${Target.Class.Equal["Druid"]}
		{
		}
		;--- Hunter --------------------------------------------------------------
		if ${Target.Class.Equal["Hunter"]}
		{
		}
		;--- Mage ----------------------------------------------------------------
		if ${Target.Class.Equal["Mage"]}
		{
		}
		
		;--- Paladin -------------------------------------------------------------
		if ${Target.Class.Equal["Paladin"]}
		{
		}
		
		;--- Priest --------------------------------------------------------------
		if ${Target.Class.Equal["Priest"]}
		{
		}
		
		;--- Rogue ---------------------------------------------------------------
		if ${Target.Class.Equal["Rogue"]}
		{
			if !${Target.Buff[Faerie Fire](exists)} && ${Toon.canBuff[${Target.GUID}, Faerie Fire]}
			{
				return TRUE
			}
			if !${Target.Buff[Entangling Roots](exists)} && ${Toon.canCast[Entangling Roots]} && !${Movement.Speed} && !${Me.Casting} && ${Target.Target.GUID.NotEqual[${Me.GUID}]}
			{
				return TRUE
			}
		}
		
		;--- Shaman --------------------------------------------------------------
		if ${Target.Class.Equal["Shaman"]}
		{
		}
		
		;--- Warlock -------------------------------------------------------------
		if ${Target.Class.Equal["Warlock"]}
		{
		}
		
		;--- Warrior -------------------------------------------------------------
		if ${Target.Class.Equal["Warrior"]}
		{
			if !${Target.Buff[Entangling Roots](exists)} && ${Toon.canCast[Entangling Roots]} && !${Movement.Speed} && !${Me.Casting} && ${Target.Target.GUID.NotEqual[${Me.GUID}]}
			{
				return TRUE
			}
		}
		
		return FALSE
	}
	method ClassAttackPulse()
	{	
		;--- All Class -----------------------------------------------------------

		;--- Druid ---------------------------------------------------------------
		if ${Target.Class.Equal["Druid"]}
		{
			return
		}
		;--- Hunter --------------------------------------------------------------
		if ${Target.Class.Equal["Hunter"]}
		{
			return
		}
		;--- Mage ----------------------------------------------------------------
		if ${Target.Class.Equal["Mage"]}
		{
			return
		}
		;--- Paladin -------------------------------------------------------------
		if ${Target.Class.Equal["Paladin"]}
		{
			return
		}
		
		;--- Priest --------------------------------------------------------------
		if ${Target.Class.Equal["Priest"]}
		{
			return
		}
		
		;--- Rogue ---------------------------------------------------------------
		if ${Target.Class.Equal["Rogue"]}
		{
			if !${Target.Buff[Faerie Fire](exists)} && ${Toon.canBuff[${Target.GUID}, Faerie Fire]}
			{
				Toon:CastSpellGUID[${Target.GUID},  Faerie Fire]
				return
			}
			if !${Target.Buff[Entangling Roots](exists)} && ${Toon.canCast[Entangling Roots]} && !${Movement.Speed} && !${Me.Casting} && ${Target.Target.GUID.NotEqual[${Me.GUID}]}
			{
				Toon:CastSpellGUID[${Target.GUID},  Entangling Roots]
				return
			}
		}
		
		;--- Shaman --------------------------------------------------------------
		if ${Target.Class.Equal["Shaman"]}
		{
			return
		}
		
		;--- Warlock -------------------------------------------------------------
		if ${Target.Class.Equal["Warlock"]}
		{
			return
		}
		
		;--- Warrior -------------------------------------------------------------
		if ${Target.Class.Equal["Warrior"]}
		{
			if !${Target.Buff[Entangling Roots](exists)} && ${Toon.canCast[Entangling Roots]} && !${Movement.Speed} && !${Me.Casting} && ${Target.Target.GUID.NotEqual[${Me.GUID}]}
			{
				Toon:CastSpellGUID[${Target.GUID},  Entangling Roots]
				return
			}
		}
	
		return
	}
	
	;** - BGObjects Get - *********************************************************** /
	member NeedBGObjects(string objectName, string objectItem, int objectValue)
	{
		variable int i = 1
		variable guidlist UsableObjs
		variable objectref UseableObject
		
		UsableObjs:Search[-gameobjects, -usable, -range 0-40]
		i:Set[1]
		if ${UsableObjs.Count}
		{
			do
			{
				UseableObject:Set[${UsableObjs.Object[${i}].GUID}]
				if ${UseableObject.Name.Equal[${objectName}]} && ${Consumable.ItemX[${objectItem}]} < ${objectValue}
				{
					return TRUE
				}

			}
			while ${i:Inc} <= ${objectref.Count}
		}
		UsableObjs:Clear

		return FALSE
	}
	method BGObjectsPulse(string objectName, string objectItem, int objectValue)
	{

		variable int i = 1
		variable guidlist UsableObjs
		variable objectref UseableObject

		UsableObjs:Search[-gameobjects, -usable, -range 0-40]

		i:Set[1]
		if ${UsableObjs.Count}
		{
			do
			{
				UseableObject:Set[${UsableObjs.Object[${i}].GUID}]
	
				if ${UseableObject.Name.Equal[${objectName}]} && ${Consumable.ItemX[${objectItem}]} < ${objectValue}
				{
					if ${UseableObject.Distance} > 4 && !${Navigator.MovingToPoint[${UseableObject.X},${UseableObject.Y},${UseableObject.Z}]}
					{
						This:Output["DRUID Routine: Moving towards ${UseableObject.Name} at distance ${UseableObject.Distance}!"]
						Navigator:MoveToLoc[${UseableObject.X},${UseableObject.Y},${UseableObject.Z}]
					}
					
					if ${UseableObject.Distance} < 4
					{
						Toon:Stop
						This:Output["DRUID Routine: Inventory ${Consumable.ItemX[${objectItem}]} ${objectItem} of Stacks!"]
						This:Output["DRUID Routine: Using ${UseableObject.Name} at distance ${UseableObject.Distance}!"]
						UseableObject:Use
						Bot.RandomPause:Set[16]
					}
					
					return
				}

			}
			while ${i:Inc} <= ${objectref.Count}
		}
		UsableObjs:Clear

		return
	}
	
	;** - FaceForSpell - ************************************************************ /
	member NeedFaceForSpell()
	{
		variable string currentSpell
		
		currentSpell:Set[${WoWScript[UnitCastingInfo("player")]}]
		
    if ${currentSpell.Equal[Wrath]}
    {
        return TRUE
    }
    
    return FALSE
	}
	method FaceForSpellPulse()
	{
		if ${Movement.Speed}
		{
			return
		}
		Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
		return
	}
	
	;** - NoMoreSpell - ************************************************************* /
	member NeedNoMoreSpell()
	{
		variable string currentSpell
		
		currentSpell:Set[${WoWScript[UnitCastingInfo("player")]}]
		
    if ${Object[${Target.GUID}].Buff[${currentSpell}](exists)}
    {
        return TRUE
    }
    
    if ${currentSpell.Equal[Wrath]} && ( ${This.NeedCombatHealing} || ${This.NeedHealer} )
    {
        return TRUE
    }
    
    return FALSE
	}
	method NoMoreSpellPulse()
	{
		WoWScript SpellStopCasting()
		return
	}
	
	;Friends check
	variable objectref kFriendsList
	member FriendsChk()
	{    
	  variable guidlist kFriendsList
    kFriendsList:Search[-players, -friendly, -noself, -alive, -range 0-40]
    
    if ${kFriendsList.Count} <= ${This.Friends}
    {
      This:Output["No friends to heal, moving on. ${kFriendsList.Count}"]
      return FALSE
    }
    return TRUE
	}
	
	;******************************************************************************** /
  ;** Functions, no code                                                          * /
  ;******************************************************************************** /
	;** - Assist Mode - ************************************************************* /
	;** - Flee Setup - ************************************************************** /
	;** - Idle Setup - ************************************************************** /
	;** - Event Hooking - *********************************************************** /
  ;** - CombatEvent - ************************************************************* /
  ;******************************************************************************** /

	;** - Assist Mode - ************************************************************* /
	member IsAssistMode()
	{
		; returns a check that determines if the bot is in party mode
		if ${UIElement[chkAssistMode@Overview@Pages@openbot].Checked}
			return TRUE

		return FALSE
	}

	;** - Flee Setup - ************************************************************** /
	variable bool HookFlee = FALSE
	method FleePulse()
	{
		
	}

	;** - Idle Setup - ************************************************************** /
	variable bool NeedCombatIdle = FALSE
	method CombatIdle()
	{

		return
	}

	;** - Event Hooking - *********************************************************** /
	variable bool needUIHook = TRUE
	method UIErrorMessage(string Id, string Msg)
	{
		
	}

  ;** - CombatEvent - ************************************************************* /
	variable bool needCombatHook = TRUE
	method CombatEvent(string unitID, string unitAction, string isCrit, string amtDamage, string damageType)
	{
		
	}
  
  ;******************************************************************************** /
  ;** Special Functions                                                           * /
  ;******************************************************************************** /
	;** - Inventory Counter Items - ************************************************* /
	;** - CustOutput - ************************************************************** /
	;** - PvPAggroWithin - ********************************************************** /
	;** - myWait - ****************************************************************** /
	;** - debuffAll - *************************************************************** /
	;** - canBuff - ***************************************************************** /
  ;******************************************************************************** /

	;** - PvP Trinket Debuffed - **************************************************** /
	member TrinketPvPDebuff()
	{
		if ${Me.Buff[Fear](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Psychic Scream](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Howl of Terror](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Intimidating Shout](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Polymorph](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Freezing Trap Effect](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Wyvern Sting](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Charge Stun](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Hammer Stun](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Intercept Stun](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Mace Stun Effect](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Shield Charge Stun](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Stun](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Blast Wave](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Dragon's Breath](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Repentance](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Hammer of Justice](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Bash](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Scatter Shot](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Blackout](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Cheap Shot](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Concussion Blow](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Intimidation](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Improved Concussive Shot](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Kidney Shot](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Blind](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Cyclone](exists)}
		{
			return TRUE
		}
		
		if ${Me.Buff[Gouge](exists)}
		{
			return TRUE
		}
		
		return FALSE
	}
	
	;** - DispelBuff - ************************************************************** /
	/* 
		TODO: Add all Debuffs & Buffs
	*/
	member DispelBuff(string theGUID)
	{

		
		return FALSE
	}
	
	;** - CustOutput - ************************************************************** /
	method CustOutput(string Txt)
	{
		UIElement[ClassGUI].FindChild[Pages].FindChild[Output].FindChild[Console]:Echo["${Txt}"]
		return
	}
	
	;** - PvPAggroWithin - ********************************************************** /
	member PvPAggroWithin(int Range, bool TargetingMe = FALSE)
	{
		variable guidlist Aggros
		if ${TargetingMe}
		{
			Aggros:Search[-players,-pvp,-targetingme,-alive,-notflying,-lineofsight,-notmounted,-attackable,-range 0-${Range}]
		}
		else
		{
			Aggros:Search[-players,-pvp,-alive,-notflying,-lineofsight,-notmounted,-attackable,-range 0-${Range}]
		}
		
		return ${Aggros.Count}
	}
	
	;** - myWait - ****************************************************************** /
	variable int myTimer = 0
	member myWait()
	{
		if ${This.myTimer} < ${LavishScript.RunningTime}
		{
			This.myTimer:Set[${This.InSeconds[3]}]
			return TRUE
		}
		
		return FALSE
	}

	;******************************************************************************** /
  ;** Gui Functions                                                               * /
  ;******************************************************************************** /
	;** - Initialize - ************************************************************** /
	;** - Shutdown - **************************************************************** /
	;** - GUI Setup - *************************************************************** /
	;** - SaveGUI - ***************************************************************** /
  ;******************************************************************************** /

	;** - Initialize - ************************************************************** /
	method Initialize()
	{
		This:Output["Darkfriend's DRUID Routine STARTED - Modified by Moi!"]
	}
	;** - Init Druid GUI - ********************************************************* /
	method InitDruidGUI()
	{
	}

	;** - Class GUI Change - ******************************************************** /
	method ClassGUIChange(string Action)
	{
	}
	;** - Shutdown - **************************************************************** /
	method Shutdown()
	{
	}

	;** - GUI Setup - *************************************************************** /
	method SetGUI()
	{
	}

	;** - SaveGUI - ***************************************************************** /
	method SaveGUI()
	{
	}
	
}