All pastes #935219 Raw Edit

Untitled

public text v1 · immutable
·published 2008-03-09 13:13 UTC
rendered paste body
;-----------------------------------------------|
;	Shaman Routine by Swolbyn v0.5				|
;-----------------------------------------------/
;
;	- Added Swimming checks in buff pulse, if your toon is swimming it will jump and try to
;		move towards the current target to melee range. To Prevent drowning.
;	- Various tweaks to combat and pull logic
;
;	- Removed flee, when I turned it on it was bugging stuff up big time.
;	-	Many combat tweaks
;	-	Added Shamanistic Focus Support
;			- Under Spells tab you can choose "Save Shocks For Shamanistic Focus"
;				When this is selected you will not use shocks regularly unless you have the focused effect after a crit attack
;	-	Immunities and Running Mobs Redesign
;			-	Now Mob Immunities and fleeing creatures are stored in MobData.xml in the routines folder
;
;	- Reinarcation code reworked some. Still a little flaky there is a rare occurance when you reincarnate and then die quickly after that it doesn't detect you are dead again thus sitting at graveyard. It's rare. but happens. Due to this I have implemented a checkbox on main class configuration tab you can turn it off or on as you like.
;	- Further adjustments to the attacking routines. FINALLY if a caster is shooting at you from afar, you'll shoot at him from afar. until he runs too close for your ranged spells, then you run to melee range as well. Works quite nicely.
;	- Immunities should finally work. Took a bit of work this was a bitch :)
;
;	-	Reincarnation logic modifications
;	-	Further tweaks to combat / pull logic
;
;	-	Completely overhauled the Pull routine. Much smoother now.
;	-	Added in Disease Cleansing Totem logic to Mimic Poison Totem Logic
;	-	Added in the ressurection logic. (needs testing, not sure if it works)
;	-	Fixed some typos i found in the shielding logic
;	-	Fixed the Water Walking logic
;
;	Thanks to all the many shaman routine writers out there in the openbot forums!
;	This bot is a giant merged hybrid of shamany goodness. It includes some modified
;	functions from all the many different bots that I have come across; as well as some
;	custom stuff that I wrote in (and continue to do so) as I botted my shaman
;	and notice changes that I wish to see.
;
;	GUI kept from APOC's shaman routine, just took out some checkboxes that I found
; useless, i've integrated the logic into the system so there was no need for checkboxes.
;
; Overall my goal with this bot was to make it smarter. Less configuration is needed
;	for certain aspects of it.
;
;	You milage may vary. But I basically set it to use random shocks. I put my primary
;	totem for combat set. leave the other totem boxes blank. (I used magma totem).
;	Bot will automatically throw down stoneclaw totems on adds and uses the primary
;	totem (magma for me) if the danger lvl is high enough or there's adds. This results
; in easier fights not wasting mana on totems.
;
;	Curing poison and disease has been reworked. Will attempt to throw down a cure
;	Totem if poisoned too soon after the first cure poison (20 seconds).
;
;	I will continue updating the bot as I level and gain access to higher lvl spells.
;	My shaman is currently in the 30's so if you are trying to bot higher lvl stuff
;	You *may* find the luxury items not working. (Ex. I don't have dual wield or
;	elementals to test yet.) I will get to them as I level and discover them. :)
;

objectdef oClass inherits oBase
{
	/**************************************/
	/************ VARIABLES ***************/

	variable	bool	UsePull				= TRUE
	variable	string	PullSpell			= "None"
	variable	int		RestHP				= 50
	variable	int		RestMP				= 50
	variable	int		StandHP				= 80
	variable	int		StandMP				= 80
	variable	string	EarthTotem			= ""
	variable	string	FireTotem			= ""
	variable	string	AirTotem			= ""
	variable	string	WaterTotem			= ""
	variable	bool	UseEarthElementa	= FALSE
	variable	bool	UseFireElemental	= FALSE
	variable	bool	UseEarthShock		= FALSE
	variable	bool	UseFlameShock		= FALSE
	variable	bool	UseFrostShock		= FALSE
	variable	bool	RandomShock			= FALSE
	variable	bool	SaveShocks			= FALSE
	variable	int		ConserveMana		= 40
	variable	bool	UseLBolt			= FALSE
	variable	bool	UseChainLight		= FALSE
	variable	string	MainHand			= "None"
	variable	string	OffHand				= "None"
	variable	string	Shield				= "None"
	variable	bool	ShieldOnPull		= FALSE
	variable	bool	DW					= FALSE
	variable	int		HealWave			= 20
	variable	int		LHealWave			= 50
	variable	int		ChainHeal			= 50
	variable	int		GOTN				= 60
	variable	bool	Output				= TRUE
	variable	int		MaxCastRange		= 20
	variable	int		MaxShockRange		= 20
	variable	bool	HasEarthTotem		= FALSE
	variable	bool	HasFireTotem		= FALSE
	variable	bool	HasWaterTotem		= FALSE
	variable	bool	HasWindTotem		= FALSE
	variable	bool	UseReincarnation	= FALSE
	variable	bool	UseHPot				= FALSE
	variable	bool	UseMPot				= FALSE
	variable	bool	UseBandages			= FALSE
	variable	int		HPot				= 25
	variable	int		MPot				= 25
	variable	int		Bandage				= 25
	variable	int		restWaitTimer		= 0
	variable	int		buffWaitTimer		= 0
	variable	int		healWaitTimer		= 0
	variable	int		curePoisonTimer		= 0
	variable	int		cureDiseaseTimer	= 0
	variable	int		jumpTimer			= 0
	variable	int		PotTimer			= 0
	variable	int		DangerMedium		= 15
	variable	int		DangerHigh			= 30
	variable	int		DangerVeryHigh		= 45
	variable	int		DangerLevel			= 0
	variable	int		Dangerlvl			= 0
	variable	int		BuffNum				= 0
	variable	bool	debuffStatus		= FALSE
	variable	string	RealmChar			= "${ISXWoW.RealmName}_${Me.Name}_${Me.Class}"
	variable	bool	MeleeOnly			= FALSE
	variable	bool	RunnerDealtWith		= FALSE
	variable	bool	Revived				= FALSE
	variable	int		ReincarnateCount	= 0
	variable	int		BackupAttempts		= 0
	variable	string	MobDataStorage		= "./routines/MobData.xml"
	variable	set		MobDataImmunities
	variable	set		MobDataRunners

	variable	collection:index:string 	RandomCast
	variable	collection:int 				RandomCastCount

	/**************************************/
	/***********Init & Shutdown************/

	method Initialize()
	{
		LavishSettings:AddSet[MobData]
		LavishSettings[MobData]:Import[${MobDataStorage}]

		This:LoadConfig
		This:InitShamanGUI

		if ${Me.Action[Gift of the Naaru].Usable}
		{
			UIElement -toggle GOTN@Heals@Pages@ClassGUI
			UIElement -toggle lblGOTN@Heals@Pages@ClassGUI
		}

		This:SetDistances
		This:CreateUIErrorStrings
		This:SetTotems
		This:InitRandoms
		This:InitTriggers

		This.MobDataImmunities:Clear
		This.MobDataRunners:Clear

		This:LoadList[MobDataImmunities]
		This:LoadList[MobDataRunners]

		Bot:AddPulse["Class","Pulse",10,TRUE,TRUE]

		UIElement[ClassGUI].FindChild[Console]:Echo["^_^=================================^_^"]
		UIElement[ClassGUI].FindChild[Console]:Echo["               Swolbyn's Shaman Routine v0.5"]
		UIElement[ClassGUI].FindChild[Console]:Echo["^_^=================================^_^"]
	}

	method Shutdown()
	{
		This:SaveConfig
		This:RemoveTriggers

		This:ExportList[MobDataImmunities]
		This:ExportList[MobDataRunners]

		LavishSettings[MobData]:Export[${MobDataStorage}]
	}

	method Pulse()
	{
		ExecuteQueued
	}

	method SetDistances()
	{
		if  ${This.GetSpellRange[30, "elemental"]}
		{
			This.MaxCastRange:Set[${This.GetSpellRange[30, "elemental"]}]
			This:CustOutput["Setting New MaxRange to ${This.MaxCastRange}"]
			This.MaxShockRange:Set[${This.GetSpellRange[20, "elemental"]}]
			This:CustOutput["Setting New MaxShockRange to ${This.MaxShockRange}"]
		}
	}

	member GetSpellRange(int base, string spellTree)
	{
		if ${spellTree.Equal[elemental]}
			return ${Math.Calc[${base}*(1+(0.1*${Me.Talent[Storm Reach]}))-1].Round}

		return ${base}
	}

	/**************************************/
	/**********UI Error Strings************/

	variable collection:string UIErrorMsgStrings
	method CreateUIErrorStrings()
	{
		This.UIErrorMsgStrings:Set["You are facing the wrong way!","backward"]
		This.UIErrorMsgStrings:Set["Target too close","backward"]
		This.UIErrorMsgStrings:Set["You are too far away!","forward"]
		This.UIErrorMsgStrings:Set["Out of range.","forward"]
	}

	variable bool needUIHook = TRUE
	method UIErrorMessage(string Id, string Msg)
	{
		if ${This.UIErrorMsgStrings.Element[${Msg}](exists)} && !${Bot.PauseFlag} && ${This.crazyWaitTimer} < ${LavishScript.RunningTime}
		{
			if ${Msg.Equal["Target too close"]} || (${Target.Distance} < 5 && ${Me.InCombat}) || ${This.UIErrorMsgStrings.Element[${Msg}].Equal["forward"]} && !${Me.Casting}
			{
				This:Debug[${Msg}]
				This:CustOutput["Moving ${This.UIErrorMsgStrings.Element[${Msg}]} - UI Error: ${Msg}"]
				Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
				This.attackWaitTimer:Set[${This.InMilliseconds[25]}]
				This.pullWaitTimer:Set[${This.InMilliseconds[25]}]
				move ${This.UIErrorMsgStrings.Element[${Msg}]} 1000
				wowpress JUMP
				return
			}
		}
	}

	/**************************************/
	/*********External Mob Data************/

	method LoadList(string loadingList)
	{
		variable iterator i

		if !${LavishSettings[MobData].FindSet[${loadingList}](exists)}
			LavishSettings[MobData]:AddSet[${loadingList}]

		LavishSettings[MobData].FindSet[${loadingList}]:GetSettingIterator[i]

		i:First
		while ${i.IsValid}
		{
			${loadingList}:Add[${i.Key}]
			i:Next
		}
	}

	method ExportList(string loadingList)
	{
		variable iterator i

		LavishSettings[MobData].FindSet[${loadingList}]:Clear
		${loadingList}:GetIterator[i]
		i:First
		while ${i.IsValid}
		{
			LavishSettings[MobData].FindSet[${loadingList}]:AddSetting[${i.Key},${i.Key}]
			i:Next
		}
	}

	/**************************************/
	/**************Triggers****************/

	method InitTriggers()
	{
		AddTrigger DetectRunner "[Event:@eventid@:CHAT_MSG_MONSTER_EMOTE](\"%%s attempts to run away in fear!\",\"@Mob@\",@*@"
		AddTrigger DetectImmune "[Event:@eventid@:CHAT_MSG_SPELL_SELF_DAMAGE](\"Your @FailedSpell@ failed. @Mob*@ is immune.@*@"
	}

	method RemoveTriggers()
	{
		RemoveTrigger DetectRunner
		RemoveTrigger DetectImmune
	}

	function DetectRunner(string Line, int eventid, string Mob)
	{
		if !${This.MobDataRunners.Contains[${Mob}]}
		{
			This:CustOutput["Added ${Mob} to the runner list"]
			This.MobDataRunners:Add[${Mob}]
		}
	}

	function DetectImmune(string Line, int eventid, string FailedSpell, string Mob)
	{
		variable string MobId
		MobId:Set[${Mob}#${FailedSpell}]

		if !${This.MobDataImmunities.Contains[${MobId}]}
		{
			This:CustOutput["Added ${MobId} to the mob immune list"]
			This.MobDataImmunities:Add[${MobId}]
		}
	}

	/**************************************/
	/***********Character States***********/

	member isRunner()
	{
		if ${This.MobDataRunners.Contains[${Target.Name}]}
			return TRUE

		return FALSE
	}

	member isImmune(string SpellName)
	{
		if ${This.MobDataImmunities.Contains[${Target.Name}#${SpellName}]}
			return TRUE

		return FALSE
	}

	member isPoisoned()
	{
		BuffNum:Set[1]
		while ${BuffNum} < 16
		{
			BuffNum:Inc
			if ${Me.Buff[${BuffNum}].DispelType.Equal[Poison]}
			{
				return TRUE
			}
		}
		return FALSE
	}

	member isDiseased()
	{
		BuffNum:Set[1]
		while ${BuffNum} < 16
		{
			BuffNum:Inc
			if ${Me.Buff[${BuffNum}].DispelType.Equal[Disease]}
			{
				return TRUE
			}
		}
		return FALSE
	}

	/**************************************/
	/************Reincarnation*************/

	member NeedDead()
	{
		if !${This.Revived} && ${This.ReincarnateCount} < 10 && (${Me.Dead} || ${Me.Ghost}) && ${This.UseReincarnation}
		{
			return TRUE
		}
		else
		{
			return FALSE
		}
	}

	method DeadPulse()
	{
		This:Output["Bad Shaman! you died?!"]
		Bot.RandomPause:Set[25]

		This.ReincarnateCount:Inc
		if ${This.CanUseAnkh}
		{
			if ${WoWScript[StaticPopup1:IsVisible()]}
			{
				This:CustOutput["Reincarnation REPOPPING!"]
				This.Revived:Set[TRUE]
				This.ReincarnateCount:Set[0]
				WoWScript UseSoulstone()
				WoWScript RepopMe()
			}
		}
		return
	}

	member CanUseAnkh()
	{
		if ${Navigator.PointIsSafe[${Me.X},${Me.Y},${Me.Z}]}
		{
			if ${Item[-inventory,"Ankh"](exists)} && ${Spell[Reincarnation](exists)} && !${Spell[Reincarnation].Cooldown}
			{
				This:CustOutput["We can use Reincarnation here."]
				return TRUE
			}
			else
			{
				This:CustOutput["Can't self res!"]
			}
		}
		else
		{
			This:CustOutput["Not a safe spot to use Reincarnation"]
		}
		return FALSE
	}

	/**************************************/
	/****************Rest******************/

	member NeedRest()
	{
		if ${Me.InCombat} || ${Targeting.realAgg}
			return FALSE

		if ${This.LootFirst}
			return FALSE

		if ${Me.Buff[Resurrection Sickness](exists)}
			return TRUE

		if ${Me.PctHPs} < ${This.RestHP}
			return TRUE

		if ${Me.PctMana} < ${This.RestMP}
			return TRUE

		if ${Me.PctHPs} < ${This.StandHP} && ${Me.Sitting}
			return TRUE

		if ${Me.PctMana} < ${This.StandMP} && ${Me.Sitting}
			return TRUE

		return FALSE
	}

	method RestPulse()
	{
		if ${Me.InCombat} || ${Targeting.realAgg}
			return

		if ${Me.Casting}
			return

		if ${Movement.Speed} || ${Movement.Forward} || ${Movement.Backward}
		{
			Toon:Stop
			return
		}

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

		if !${Me.Dead} && !${Me.Ghost}
			This:Revived:Set[FALSE]

		if ${This.ShouldCallTotems}
		{
			Toon:CastSpell["Totemic Call"]
			This:CustOutput["Calling my totems back"]
			return
		}

		if ((${Me.PctMana} >= ${This.StandMP}) && (${Me.PctHPs} >= ${This.StandHP})) && ${Me.Sitting}
		{
			Toon:Standup
			This:Output["Standing."]
			return
		}

		This:debuffAll

		if ${Me.PctHPs} < ${This.RestHP} && ${Spell[Cannibalize](exists)} && !${Me.Buff[Food](exists)} && !${Me.Buff[Drink](exists)} && !${Me.Swimming} && !${Me.Sitting} && !${Me.InCombat} && !${Spell[Cannibalize].Cooldown} && (${Object[-dead,-humanoid,-range 0-5](exists)} || ${Object[-dead,-undead,-range 0-5](exists)}) && !${Me.Casting}
		{
			variable string corpseTarget
			if ${Object[-dead,-undead,-range 0-5](exists)}
			{
				corpseTarget:Set[${Object[-dead,-undead,-range 0-5].GUID}]
			}

			if ${Object[-dead,-humanoid,-range 0-5](exists)}
			{
				corpseTarget:Set[${Object[-dead,-humanoid,-range 0-5].GUID}]
			}

			if ${Object[${corpseTarget}].Distance} > 2
			{
				Navigator:MoveToMob[${corpseTarget}]
				return
			}
			else
			{
				This:Output["Cannibalizing Corpse."]
				Toon:CastSpell[Cannibalize]
				return
			}
		}

		if !${Consumable.HasFood} && ${Me.PctHPs} < ${RestHP} && !${Me.Buff[Drink](exists)} && !${Me.Casting} && ${This.buffWaitTimer} < ${LavishScript.RunningTime}
		{
			if ${Toon.canCast[Lesser Healing Wave]}
			{
				Toon:CastSpell[Lesser Healing Wave]
				This:CustOutput["Casting Lesser Healing Wave - Rest"]
				This.buffWaitTimer:Set[${This.InSeconds[20]}]
				return
			}
			elseif ${Toon.canCast[Healing Wave]}
			{
				Toon:CastSpell[Healing Wave]
				This:CustOutput["Casting Healing Wave - Rest"]
				This.buffWaitTimer:Set[${This.InSeconds[20]}]
				return
			}
		}

		if ${Me.PctHPs} < ${This.Bandage} && ${Toon.canBandage} && !${Me.Sitting} && ${This.UseBandages}
		{
			Toon:Bandage
			This:CustOutput["Bandaging...."]
			return
		}

		if ${Me.PctHPs} < ${This.RestHP} && ${Consumable.HasFood} && !${Me.Buff[Food](exists)} && !${Me.Swimming} && !${Me.InCombat} && !${Me.Casting} && !${This.isPoisoned} && !${This.isDiseased} && !${Me.Sitting}
		{
			Consumable:useFood
			This:CustOutput["Eating..."]
			return
		}

		if ${Me.PctMana} < ${This.RestMP} && ${Consumable.HasDrink} && !${Me.Buff[Drink](exists)} && !${Me.Swimming} && !${Me.InCombat} && !${Me.Casting} && !${This.isPoisoned} && !${This.isDiseased} && !${Me.Sitting}
		{
			Consumable:useDrink
			This:CustOutput["Drinking..."]
			return
		}

		if ${Me.PctMana} < ${This.RestMP} && ${Toon.canCast[Mana Spring Totem]} && !${This.OwnedTotemsCheck[Mana Spring Totem]} && ${This.HasWaterTotem} && !${Consumable.HasDrink} && !${Me.Buff[Drink](exists)} && !${Me.Swimming} && !${Me.InCombat} && !${Me.Casting}
		{
			Toon:CastSpell[Mana Spring Totem]
			This:CustOutput["Casting Mana Spring Totem"]
		}

		if ${Me.PctMana} >= ${This.StandMP} && !${Me.Casting} && !${Me.Buff[Resurrection Sickness](exists)}
		{
			Toon:Standup
			This:CustOutput["Done Resting!"]
			return
		}
	}

	/**************************************/
	/****************Buff******************/

	member NeedBuff()
	{
		if ${Me.Swimming}
			return TRUE

		if ${Me.InCombat} || ${Targeting.realAgg}
			return FALSE

		if ${Mount.IsMounted}
			return FALSE

		if ${Me.Swimming} && ${Toon.canCast[Water Walking]} && ${Item[-inventory,"Fish Oil"](exists)} && !${Me.Buff[Water Walking](exists)}
		{
			This:CustOutput["Swimming, need water walking"]
			return TRUE
		}

		if ${Me.Swimming} && !${Me.Race.Find[Undead]} && ${Toon.canCast[Water Breathing]} && ${Item[-inventory,"Shiny Fish Scales"](exists)} && !${Me.Buff[Water Breathing](exists)}
		{
			This:CustOutput["Swimming, need water breathing"]
			return TRUE
		}

		if ${Toon.canUseScroll}
		{
			This:CustOutput["Need a scroll buff"]
			return TRUE
		}

		if !${Me.Equip[mainhand].Enchantment[${This.MainHand}](exists)} && ${Toon.canCast["${This.MainHand} Weapon"]} && ${This.buffWaitTimer} < ${LavishScript.RunningTime} && !${This.MainHand.Equal[None]}
		{
			This:CustOutput["Need Mainhand Buff - ${This.MainHand}"]
			return TRUE
		}

		if !${Me.Equip[offhand].Enchantment[${This.OffHand}](exists)} && ${Toon.canCast["${This.OffHand} Weapon"]} && ${This.DW} && !${This.OffHand.Equal[None]}
		{
			This:CustOutput["Need Offhand Buff - ${This.OffHand}"]
			return TRUE
		}

		if !${Me.Buff[${Shield}](exists)} && ${This.canBuff[${This.Shield}]}
			return TRUE

		return FALSE
	}

	method BuffPulse()
	{
		if ${Me.Swimming}
		{
			if ${This.jumpTimer} < ${LavishScript.RunningTime}
			{
				wowpress JUMP
				This.jumpTimer:Set[${This.InSeconds[5]}]
			}
			if ${Target(exists)}
			{
				Toon:ToMelee
			}
			return
		}

		if ${Me.InCombat} || ${Targeting.realAgg}
			return

		if ${Me.Casting}
			return

		if ${Me.Sitting}
			Toon:Standup

		if ${Movement.Speed} || ${Movement.Forward} || ${Movement.Backward}
		{
			Move -stop
			return
		}

		if ${Me.Swimming} && ${Toon.canCast[Water Walking]} && ${Item[-inventory,"Fish Oil"](exists)} && !${Me.Buff[Water Walking](exists)}
		{
			Toon:CastSpell[Water Walking]
			This:CustOutput["Casting Water Walking"]
			return
		}

		if ${Me.Swimming} && !${Me.Race.Find[Undead]} && ${Toon.canCast[Water Breathing]} && ${Item[-inventory,"Shiny Fish Scales"](exists)} && !${Me.Buff[Water Breathing](exists)}
		{
			Toon:CastSpell[Water Breathing]
			This:CustOutput["Casting Water Breathing"]
			return
		}

		if ${Toon.canUseScroll}
		{
			Toon:UseScroll
			This:CustOutput["Using a scroll"]
			return
		}

		if !${Me.Equip[mainhand].Enchantment[${This.MainHand}](exists)} && ${Toon.canCast[${This.MainHand} Weapon]} && ${This.buffWaitTimer} < ${LavishScript.RunningTime} && !${This.MainHand.Equal[None]}
		{
			Toon:CastSpell[${This.MainHand} Weapon]
			This:CustOutput["Casting ${This.MainHand} Weapon"]
			This.buffWaitTimer:Set[${This.InSeconds[20]}]
			return
		}

		if !${Me.Equip[offhand].Enchantment[${This.OffHand}](exists)} && ${Toon.canCast[${This.OffHand} Weapon]} && ${This.DW} && !${This.OffHand.Equal[None]}
		{
			Toon:CastSpell[${This.OffHand} Weapon]
			This:CustOutput["Casting ${This.OffHand} Weapon"]
			return
		}

		if !${Me.Buff[${Shield}](exists)} && ${This.canBuff[${This.Shield}]}
		{
			Toon:CastSpell[${This.Shield}]
			return
		}
	}

	/**************************************/
	/**************Pull Buff***************/

	member NeedPullBuff()
	{
		if !${Me.Buff[${This.Shield}](exists)} && ${This.canBuff[${This.Shield}]} && !${This.isImmune[${This.Shield}]}
			return TRUE

		return FALSE
	}

	method PullBuffPulse()
	{
		if ${Me.Sitting}
			Toon:Standup

		if ${Movement.Speed} || ${Movement.Forward} || ${Movement.Backward}
		{
			Toon:Stop
			return
		}

		if !${Me.Buff[${This.Shield}](exists)} && ${This.canBuff[${This.Shield}]} && !${This.isImmune[${This.Shield}]}
		{
			Toon:CastSpell[${Shield}]
			This:CustOutput["Casting ${This.Shield}"]
			return
		}
		return
	}

	/**************************************/
	/*************Combat Buff**************/

	member NeedCombatBuff()
	{
		if ${Me.Sitting}
			Toon:Standup

		if ${Me.PctHPs} < ${This.GOTN} && ${Toon.canCast[Gift of the Naaru]}
			return TRUE

		if ${This.canBuff[${This.Shield}]} && ${Target.PctHPs} > 30 && !${This.isImmune[${This.Shield}]}
			return TRUE

		if ${Toon.canCast[Shamanistic Rage]} && ${Me.PctMana} < 30 && ${Target.PctHPs} > 85
			return TRUE

		if ${Toon.canCast[Elemental Mastery]} && ${Me.PctMana} < 30
			return TRUE

		if ${Toon.canCast[Mana Spring Totem]} && ${Me.PctMana} < 30
			return TRUE

		if ${Toon.canCast[Heroism]} && ${Me.PctHPs} < 30 && ${Target.PctHPs} > 70
			return TRUE

		if ${Toon.canCast[Bloodlust]} && ${Me.PctHPs} < 30 && ${Target.PctHPs} > 70
			return TRUE

		return FALSE
	}

	method CombatBuffPulse()
	{
		if ${Me.Sitting}
			Toon:Standup

		if ${Toon.canCast["Nature's Swiftness"]}
		{
			Toon:CastSpell["Nature's Swiftness"]
			return
		}

		if ${Me.PctHPs} < ${This.GOTN} && ${Toon.canCast[Gift of the Naaru]} && !${Me.Casting}
		{
			Toon:CastSpell[Gift of the Naaru]
			This:CustOutput["Casting Gift of the Naaru"]
			return
		}

		if ${This.canBuff[${This.Shield}, ${Me.GUID}]} && !${Me.Buff[${This.Shield}](exists)} && !${Me.Casting} && !${This.isImmune[${This.Shield}]}
		{
			Toon:CastSpell[${Shield}]
			This:CustOutput["Casting ${Shield}"]
			return
		}

		if ${Toon.canCast[Elemental Mastery]} && ${Me.PctMana} < 30
		{
			Toon:CastSpell[Elemental Mastery]
			This:CustOutput["Casting Elemental Mastery!!!"]
			return
		}

		if ${Toon.canCast[Mana Spring Totem]} && ${Me.PctMana} < 30 && !${This.OwnedTotemsCheck[Mana Spring Totem]}
		{
			Toon:CastSpell[Mana Spring Totem]
			This:CustOutput["Casting Mana Spring Totem!!!"]
			return
		}

		if ${Toon.canCast[Heroism]} && ${Me.PctHPs} < 30 && ${Target.PctHPs} > 70
		{
			Toon:CastSpell[Heroism]
			This:CustOutput["Casting Heroism!!!"]
			return
		}

		if ${Toon.canCast[Bloodlust]} && ${Me.PctHPs} < 30 && ${Target.PctHPs} > 70
		{
			Toon:CastSpell[Bloodlust]
			This:CustOutput["Casting Bloodlust!!!"]
			return
		}
	}

	/**************************************/
	/****************Pull******************/

	method PullPulse()
	{
		if ${Me.Sitting}
			Toon:Standup

		if !${Toon.ValidTarget[${Target.GUID}]} || ${Target.Dead}
		{
			Toon:NeedTarget[1]
			return
		}

		Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]

		if ${Me.Casting} || ${Me.GlobalCooldown}
			return

		if !${Me.Attacking} && ${Target.Distance} <= ${Toon.MaxMelee}
		{
			WoWScript AttackTarget()
			This:CustOutput["Turning on autoattack"]
			return
		}

		if ${Target.PctHPs} == 100
		{
			; Creature is 100% life, assuming new target resetting runner logic
			This.RunnerDealtWith:Set[FALSE]
			This.BackupAttempts:Set[0]
		}


		if ${Me.PctHPs} < ${This.HealWave} && ${Toon.canCast[Healing Wave]} && !${Me.Casting} && ${This.healWaitTimer} < ${LavishScript.RunningTime}
		{
			Toon:CastSpell[Healing Wave]
			This:CustOutput["Casting Healing Wave"]
			This.healWaitTimer:Set[${This.InSeconds[4]}]
			return
		}

		if ${Me.PctHPs} < ${This.LHealWave} && ${Toon.canCast[Lesser Healing Wave]} && !${Me.Casting} && ${This.healWaitTimer} < ${LavishScript.RunningTime}
		{
			Toon:CastSpell[Lesser Healing Wave]
			This:CustOutput["Casting Lesser Healing Wave"]
			This.healWaitTimer:Set[${This.InSeconds[4]}]
			return
		}

		if ${Me.PctHPs} < ${This.ChainHeal} && ${Toon.canCast[Chain Heal]} && !${Me.Casting} && ${This.healWaitTimer} < ${LavishScript.RunningTime}
		{
			Toon:CastSpell[Chain Heal]
			This:CustOutput["Casting Chain Heal"]
			This.healWaitTimer:Set[${This.InSeconds[4]}]
			return
		}

		if ${Target.Distance} < ${Toon.MinRanged} || ${This.isImmune[${This.PullSpell}]} && !${Me.Casting}
		{
			WoWScript AttackTarget()
			This:CustOutput["Turning on autoattack"]
			Toon:ToMelee
			return
		}

		if !${This.UsePull}
		{
			if !${Toon.withinMelee}
			{
				Toon:ToMelee
				This:CustOutput["Melee Pulling ${Target.Name}"]
				return
			}
		}

		if ${This.UsePull}
		{
			if ${Toon.withinRanged}
			{
				if ${Movement.Speed} || ${Movement.Forward} || ${Movement.Backward}
				{
					Toon:Stop
					return
				}

				if ${Target.Distance} >= ${Toon.MinRanged} && ${Me.PctMana} > ${This.ConserveMana}
				{
					if ${Toon.canCast[${This.PullSpell}]}
					{
						Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
						Toon:CastSpell[${This.PullSpell}]
						This:CustOutput["Pulling With: ${This.PullSpell}"]
						return
					}
				}
			}
			elseif !${Me.Casting}
			{
				if ${Target.Distance} > ${Toon.MaxRanged}
				{
					This:CustOutput["Target too far away. Moving closer."]
					Toon:ToRanged
				}
				elseif ${Target.Distance} < ${Toon.MinRanged}
				{
					WoWScript AttackTarget()
					This:CustOutput["Turning on autoattack"]
					This:AttackPulse
				}
			}
		}

		Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
		return
	}

	/**************************************/
	/***************Attack*****************/

	method AttackPulse()
	{
		if ${Me.Sitting}
			Toon:Standup

		if !${Toon.ValidTarget[${Target.GUID}]} || ${Target.Dead}
		{
			Toon:NeedTarget[1]
			return
		}

		if !${Toon.TargetIsBestTarget} || ${Target.IsTotem}
			Toon:BestTarget

		Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]

		if !${Me.Attacking} && ${Target.Distance} <= ${Toon.MaxMelee}
		{
			WoWScript AttackTarget()
			This:CustOutput["Turning on autoattack"]
		}

		if ${Target.Distance} >= ${Toon.MinRanged} && ${Me.PctMana} > ${This.ConserveMana}
		{
			This:PullPulse
		}

		This:SetDanger

		if ${This.HaveAdds} && ${Toon.canCast[War Stomp]} && !${Me.Casting}
		{
			Toon:CastSpell[War Stomp]
		}

		Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]

		This:debuffAll

		if ${Target.Distance} < ${Toon.MinMelee} && ${This.BackupAttempts} < 6 && !${Me.Casting}
		{
			This:Output["Backing up... wtf"]
			This.BackupAttempts:Inc
			Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
			Navigator:MoveBackward[200]
			return
		}

		if ${Target.Distance} > ${Toon.MaxMelee} && !${Me.Casting}
		{
			This:Output["Chasing down ${Target.Name}"]
			Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
			wowpress -hold moveforward
			return
		}
		else
		{
			Toon:Stop
		}

		if ${Target.Dead}
			return

		if !${This.RunnerDealtWith} && ${Target.PctHPs} < 40 && ${This.isRunner}
		{
			Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
			if ${Toon.canCast[Frost Shock]} && !${This.isImmune[Frost Shock]}
			{
				Toon:CastSpell[Frost Shock]
				This:CustOutput["Casting Frost Shock on a runner"]
				This.RunnerDealtWith:Set[TRUE]
				return
			}

			if ${Toon.canCast[Earthbind Totem]} && !${This.OwnedTotemsCheck[Earthbind Totem]} && ${This.HasEarthTotem}
			{
				Toon:CastSpell[Earthbind Totem]
				This:CustOutput["Casting Earthbind Totem to catch a runner"]
				This.RunnerDealtWith:Set[TRUE]
				return
			}
		}

		if ${Me.PctHPs} < ${This.HealWave} && ${Toon.canCast[Healing Wave]} && !${Me.Casting} && ${This.healWaitTimer} < ${LavishScript.RunningTime}
		{
			Toon:CastSpell[Healing Wave]
			This:CustOutput["Casting Healing Wave"]
			This.healWaitTimer:Set[${This.InSeconds[4]}]
			return
		}

		if ${Me.PctHPs} < ${This.LHealWave} && ${Toon.canCast[Lesser Healing Wave]} && !${Me.Casting} && ${This.healWaitTimer} < ${LavishScript.RunningTime}
		{
			Toon:CastSpell[Lesser Healing Wave]
			This:CustOutput["Casting Lesser Healing Wave"]
			This.healWaitTimer:Set[${This.InSeconds[4]}]
			return
		}

		if ${Me.PctHPs} < ${This.ChainHeal} && ${Toon.canCast[Chain Heal]} && !${Me.Casting} && ${This.healWaitTimer} < ${LavishScript.RunningTime}
		{
			Toon:CastSpell[Chain Heal]
			This:CustOutput["Casting Chain Heal"]
			This.healWaitTimer:Set[${This.InSeconds[4]}]
			return
		}

		if ${Me.PctHPs} < ${This.HPot} && ${This.UseHPot} && ${Consumable.HasHPot} && ${This.PotTimer} < ${LavishScript.RunningTime}
		{
			Consumable:useHPot
			This:CustOutput["Quaffing a health pot"]
			This.PotTimer:Set[${This.InSeconds[120]}]
			return
		}

		if ${Me.PctMana} < ${This.MPot} && ${This.UseMPot} && ${Consumable.HasMPot} && ${This.PotTimer} < ${LavishScript.RunningTime}
		{
			Consumable:useMPot
			This:CustOutput["Quaffing a mana pot"]
			This.PotTimer:Set[${This.InSeconds[120]}]
			return
		}

		if ${Target.Dead}
			return

		if ${Dangerlvl} >= 1
		{
			if ${Target.PctHPs} > 50 || ${This.HaveAdds}
			{
				Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]
				if ${This.HaveAdds} && ${Toon.canCast[Stoneclaw Totem]} && !${This.OwnedTotemsCheck[Stoneclaw Totem]}
				{
					Toon:CastSpell[Stoneclaw Totem]
					This:CustOutput["Casting Stoneclaw Totem because of Add!"]
					return
				}

				if ${This.canCastTotem[Earth]} && ${This.HasEarthTotem}
				{
					Toon:CastSpell[${This.EarthTotem}]
					This:CustOutput["Casting ${This.EarthTotem}"]
					return
				}

				if ${This.canCastTotem[Air]} && ${This.HasAirTotem}
				{
					Toon:CastSpell[${This.AirTotem}]
					This:CustOutput["Casting ${This.AirTotem}"]
					return
				}

				if ${This.canCastTotem[Fire]} && ${This.HasFireTotem}
				{
					Toon:CastSpell[${This.FireTotem}]
					This:CustOutput["Casting ${This.FireTotem}"]
					return
				}

				if ${This.canCastTotem[Water]} && ${This.HasWaterTotem}
				{
					Toon:CastSpell[${This.WaterTotem}]
					This:CustOutput["Casting ${This.WaterTotem}"]
					return
				}

				if ${This.AirTotem.Equal["Random"]} && ${Me.PctMana} > 10 && ${This.HasAirTotem}
				{
					Toon:CastRandom[AirTotems]
					This:CustOutput["Casting a random Air Totem"]
					This.AirTotemTimer:Set[${This.InSeconds[80]}]
					return
				}

				if ${This.EarthTotem.Equal["Random"]} && ${Me.PctMana} > 10 && ${This.HasEarthTotem}
				{
					Toon:CastRandom[EarthTotems]
					This:CustOutput["Casting a random Earth Totem"]
					This.EarthTotemTimer:Set[${This.InSeconds[80]}]
					return
				}

				if ${This.WaterTotem.Equal["Random"]} && ${Me.PctMana} > 10 && ${This.HasWaterTotem}
				{
					Toon:CastRandom[WaterTotems]
					This:CustOutput["Casting a random Water Totem"]
					This.WaterTotemTimer:Set[${This.InSeconds[80]}]
					return
				}

				if ${This.FireTotem.Equal["Random"]} && ${Me.PctMana} > 10 && ${This.HasFireTotem}
				{
					Toon:CastRandom[FireTotems]
					This:CustOutput["Casting a random Fire Totem"]
					This.FireTotemTimer:Set[${This.InSeconds[80]}]
					return
				}
			}
		}

		if ${Target.Dead}
			return

		if ${This.HaveAdds} && ${Toon.canCast[Shamanistic Rage]}
		{
			Toon:CastSpell[Shamanistic Rage]
			This:CustOutput["Casting Shamanistic Rage!!!"]
			return
		}

		Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]

		if ${This.HaveAdds} && ${Toon.canCast[Chain Lightning]} && ${Me.PctMana} > ${This.ConserveMana} && !${This.MeleeOnly}
		{
			Toon:CastSpell[Chain Lightning]
			This:CustOutput["Casting Chain Lightning due to an add!"]
			return
		}

		if ${Toon.canCast[Earth Shock]} && !${This.isImmune[Earth Shock]} && ${Target.Casting(exists)}
		{
			This:StopCast
			This:CustOutput["Silencing ${Target} - Attack"]
			Toon:CastSpell[Earth Shock]
		}

		if ${Toon.canCast[Stormstrike]} && !${Target.Buff[Stormstrike](exists)} && ${Target.Distance} < ${This.MaxShockRange}
		{
			Toon:CastSpell[Stormstrike]
			This:CustOutput["Casting Stormstrike"]
			return
		}

		if ${Target.Dead}
			return

		Navigator:FaceXYZ[${Target.X},${Target.Y},${Target.Z}]

		if !${This.SaveShocks} || (${This.SaveShocks} && ${Me.Buff[Focused](exists)})
		{
			if ${Toon.canCast[Earth Shock]} && !${This.isImmune[Earth Shock]} && ${Target.Buff[Stormstrike](exists)} && ${Target.Distance} < ${This.MaxShockRange}
			{
				Toon:CastSpell[Earth Shock]
				This:CustOutput["Casting Earth Shock on Stormstruck ${Target}!"]
				return
			}

			if ${This.RandomShock} && !${Target.Buff[Stormstrike](exists)} && ${Target.Distance} < ${This.MaxShockRange}
			{
				if (${Me.PctMana} > ${This.ConserveMana}) || ${This.SaveShocks}
				{
					This:CastRandom[Shocks,"Target"]
					return
				}
			}

			if ${This.canBuff[Flame Shock, ${Target.GUID}]} && !${This.isImmune[Flame Shock]} && ${This.UseFlameShock} && !${This.RandomShock} && !${Target.Buff[Stormstrike](exists)} && ((${Me.PctMana} > ${This.ConserveMana}) || ${This.SaveShocks}) && ${Target.Distance} < ${This.MaxShockRange}
			{
				Toon:CastSpell[Flame Shock]
				This:CustOutput["Casting Flame Shock"]
				return
			}

			if ${Toon.canCast[Earth Shock]} && !${This.isImmune[Earth Shock]} && ${This.UseEarthShock} && !${This.RandomShock} && ((${Me.PctMana} > ${This.ConserveMana}) || ${This.SaveShocks}) && ${Target.Distance} < ${This.MaxShockRange}
			{
				Toon:CastSpell[Earth Shock]
				This:CustOutput["Casting Earth Shock"]
				return
			}

			if ${Toon.canCast[Frost Shock]} && !${This.isImmune[Frost Shock]} && ${This.UseFrostShock} && !${This.RandomShock} && !${Target.Buff[Stormstrike](exists)} && ((${Me.PctMana} > ${This.ConserveMana}) || ${This.SaveShocks}) && ${Target.Distance} < ${This.MaxShockRange}
			{
				Toon:CastSpell[Frost Shock]
				This:CustOutput["Casting Frost Shock"]
				return
			}

			if ${Toon.canCast[Lightning Bolt]} && !${This.isImmune[Lightning Bolt]} && ${This.UseLBolt} && ${Me.PctMana} > ${This.ConserveMana} && !${This.MeleeOnly}
			{
				Toon:CastSpell[Lightning Bolt]
				This:CustOutput["Casting Lightning Bolt"]
				return
			}
		}
	}

	/**************************************/
	/***************Totems*****************/

	method SetTotems()
	{
		if ${Item[-items,-inventory,"Earth Totem"](exists)}
		{
			This.HasEarthTotem:Set[TRUE]
			This:CustOutput["We have an Earth Totem in our bags, we can use them now!"]
		}
		else
		{
			This.HasEarthTotem:Set[FALSE]
			This:CustOutput["No Earth Totem found! Not using them."]
		}

		if ${Item[-items,-inventory,"Fire Totem"](exists)}
		{
			This.HasFireTotem:Set[TRUE]
			This:CustOutput["We have an Fire Totem in our bags, we can use them now!"]
		}
		else
		{
			This.HasFireTotem:Set[FALSE]
			This:CustOutput["No Fire Totem found! Not using them."]
		}

		if ${Item[-items,-inventory,"Water Totem"](exists)}
		{
			This.HasWaterTotem:Set[TRUE]
			This:CustOutput["We have an Water Totem in our bags, we can use them now!"]
		}
		else
		{
			This.HasWaterTotem:Set[FALSE]
			This:CustOutput["No Water Totem found! Not using them."]
		}

		if ${Item[-items,-inventory,"Wind Totem"](exists)}
		{
			This.HasWindTotem:Set[TRUE]
			This:CustOutput["We have an Wind Totem in our bags, we can use them now!"]
		}
		else
		{
			This.HasWindTotem:Set[FALSE]
			This:CustOutput["No Wind Totem found! Not using them."]
		}
		return
	}

	member canCastTotem(string totemType)
	{
		if ${Toon.canCast[${This.${totemType}Totem}]} && !${This.OwnedTotemsCheck[${This.${totemType}Totem}]} && !${This.${totemType}Totem.Equal["Random"]} && !${This.${totemType}Totem.Equal["None"]}
			return TRUE

		return FALSE
	}

	member OwnedTotemsCheck(string totem)
	{
		if ${Unit[-units, -owner, -range 0-20, ${totem}](exists)}
		{
			return TRUE
			TotemList:Clear
		}
		return FALSE
	}

	member ShouldCallTotems()
	{
		if ${This.OwnedTotemsCheck[totem]} && !${This.OwnedTotemsCheck[Mana Spring Totem]} && !${This.OwnedTotemsCheck[Poison Cleansing Totem]} && !${Me.Target(exists)} && ${Toon.canCast[Totemic Call]}
			return TRUE

		return FALSE
	}

	/**************************************/
	/*************Aggro & Adds*************/

	method SetDanger()
	{
		variable guidlist Aggros
		Aggros:Search[-units,-nearest,-aggro,-alive,-targetingme,-range 0-40]

		This.DangerLevel:Set[${DangerLevel} * 0.5]
		This.DangerLevel:Set[${DangerLevel} + ${Aggros.Count}*6.5]
		This.DangerLevel:Set[${DangerLevel} + ((100 - ${Me.PctMana})*0.10)]

		if ${Target.Level} > ${Me.Level}
		{
			This.DangerLevel:Set[${DangerLevel} + ((${Target.Level} - ${Me.Level})*2)]
		}
		elseif ${Me.Level} > ${Target.Level}
		{
			This.DangerLevel:Set[${DangerLevel} + ((${Target.Level} - ${Me.Level})*1)]
		}

		if ${Target.Classification.Equal[Elite]} || ${Target.Classification.Equal[RareElite]}
			This.DangerLevel:Set[${DangerLevel} + 20]

		if ${Target.PctHPs} < 25
			This.DangerLevel:Set[${DangerLevel} - 10]

		if ${DangerLevel} < 0
			This.DangerLevel:Set[0]

		UIElement[DangerLevel@Titlebar@ClassGUI]:SetValue[${DangerLevel}]
		if ${DangerLevel} >= ${DangerVeryHigh}
		{
			This:CustOutput["Danger - Very High ${DangerLevel}"]
			This.Dangerlvl:Set[3]
			return
		}
		elseif ${DangerLevel} > ${DangerHigh}
		{
			This:CustOutput["Danger - High ${DangerLevel}"]
			This.Dangerlvl:Set[2]
			return
		}
		elseif ${DangerLevel} > ${DangerMedium}
		{
			;This:CustOutput["Danger - Medium ${DangerLevel}"]
			This.Dangerlvl:Set[1]
			return
		}
		else
		{
			;This:CustOutput["Danger - Low ${DangerLevel}"]
			This.Dangerlvl:Set[0]
			return
		}
	}

	member HaveAdds()
	{
		variable guidlist AggroList
		AggroList:Clear
		AggroList:Search[-units,-nearest,-nopets,-aggro,-alive,-range 0-30]
		if ${AggroList.Count} >= 2
		{
			return TRUE
		}
		else
		{
			return FALSE
		}
	}

	/**************************************/
	/***********Spells & Casting***********/

	method InitRandoms()
	{
		This:SetRandoms["Earth Shock","Shocks"]
		This:SetRandoms["Flame Shock","Shocks"]
		This:SetRandoms["Frost Shock","Shocks"]
		This:SetRandoms["Lightning Bolt","Attacks"]
		This:SetRandoms["Chain Lightning","Attacks"]
		This:SetRandoms["Lightning Shield","Shields"]
		This:SetRandoms["Water Shield","Shields"]
		This:SetRandoms["Earth Shield","Shields"]
		This:SetRandoms["Earthbind Totem","EarthTotems"]
		This:SetRandoms["Stoneskin Totem","EarthTotems"]
		This:SetRandoms["Stoneclaw Totem","EarthTotems"]
		This:SetRandoms["Strength of Earth Totem","EarthTotems"]
		This:SetRandoms["Tremor Totem","EarthTotems"]
		This:SetRandoms["Searing Totem","FireTotems"]
		This:SetRandoms["Fire Nova Totem","FireTotems"]
		This:SetRandoms["Magma Totem","FireTotems"]
		This:SetRandoms["Totem of Wrath","FireTotems"]
		This:SetRandoms["Windwall Totem","AirTotems"]
		This:SetRandoms["Grounding Totem","AirTotems"]
		This:SetRandoms["Grace of Air Totem","AirTotems"]
		This:SetRandoms["Wrath of Air Totem","AirTotems"]
		This:SetRandoms["Healing Stream Totem","WaterTotems"]
		This:SetRandoms["Mana Spring Totem","WaterTotems"]
	}

	method SetRandoms(string SpellName, string RandomSet)
	{
		if ${Spell[${SpellName}](exists)}
		{
			This:AddRandom[${RandomSet},${SpellName}]
		}
		else
		{
			This:CustOutput["Couldn't add ${SpellName} into ${RandomSet} because we don't have the spell!"]
		}
	}

	method AddRandom(string spellGroup, string spellName)
	{
		if !${This.RandomCast.Element[${spellGroup}](exists)} && ${Bot.Started}
		{
			This.RandomCast:Set[${spellGroup}]
			This.RandomCastCount:Set[${spellGroup},0]
		}
		This.RandomCast.Element[${spellGroup}]:Insert[${spellName}]
		This.RandomCastCount.Element[${spellGroup}]:Inc
	}

	member CastRandom(string spellGroup, string checkBuff=NULL)
	{
		variable int attempts = 0
		variable int spellNum = 1
		spellNum:Inc[${Math.Rand[${This.RandomCastCount.Element[${spellGroup}]}]}]

		do
		{
			if ${spellNum} > ${This.RandomCastCount.Element[${spellGroup}]}
			{
				spellNum:Inc
			}
			if ${Toon.canCast[${This.RandomCast.Element[${spellGroup}].Get[${spellNum}]}]} && !${This.isImmune[${This.RandomCast.Element[${spellGroup}].Get[${spellNum}]}]}
			{
				if ${checkBuff.Equal[Target]} || ${checkBuff.Equal[Me]}
				{
					if !${${checkBuff}.Buff[${This.RandomCast.Element[${spellGroup}].Get[${spellNum}]}](exists)}
					{
						Toon:CastSpell[${This.RandomCast.Element[${spellGroup}].Get[${spellNum}]}]
						This:Output["Casting Random Buff#${spellNum}:${This.RandomCast.Element[${spellGroup}].Get[${spellNum}]}"]
						return TRUE
					}
				}
				else
				{
					Toon:CastSpell[${This.RandomCast.Element[${spellGroup}].Get[${spellNum}]}]
					This:Output["Casting Random#${spellNum}:${This.RandomCast.Element[${spellGroup}].Get[${spellNum}]}"]
					return TRUE
				}
			}
			spellNum:Inc
		}
		while ${attempts:Inc} <= ${This.RandomCastCount.Element[${spellGroup}]}
		return FALSE
	}

	method CastRandom(string spellGroup, string checkBuff=NULL)
	{
		if !${This.CastRandom[${spellGroup},${checkBuff}]}
		{
			This:Debug[RandomCast ${spellGroup} failed]
		}
	}

	member canBuff(string buffName, string theGUID=NULL,  string spellName=NULL)
	{
		if ${spellName.Equal[NULL]}
			spellName:Set[${buffName}]

		if ${theGUID.Equal[NULL]}
			theGUID:Set[${Me.GUID}]

		if !${Object[${theGUID}].Buff[${buffName}](exists)} && ${Toon.canCast[${spellName}]}
			return TRUE

		return FALSE
	}

	member ShouldConserveMana()
	{
		if ${Me.PctMana} > ${This.ConserveMana}
			return TRUE

		return FALSE
	}

	method debuffAll()
	{
		if ${Me.PctMana} < 15 || ${Me.Casting}
			return

		BuffNum:Set[1]
		while ${BuffNum} < 16
		{
			BuffNum:Inc
			if ${Target.Buff.DispelType.Equal[Magic]} && !${Target.Buff.Harmful}
			{
				if ${Toon.canCast[Purge]} && !${Me.Casting}
				{
					This:CustOutput["Purging a buff on ${Target}"]
					Toon:CastSpell[Purge]
					return
				}
			}

			if ${Me.Buff[${BuffNum}].Harmful}
			{
				if ${Me.Buff[${BuffNum}].DispelType.Equal[Disease]}
				{
					if ${Toon.canCast[Cure Disease]} && ${This.cureDiseaseTimer} < ${LavishScript.RunningTime}
					{
						This:CustOutput["Curing a disease"]
						Toon:CastSpell[Cure Disease]
						This.cureDiseaseTimer:Set[${This.InSeconds[20]}]
						return
					}
					elseif ${Toon.canCast[Disease Cleansing Totem]} && !${This.OwnedTotemsCheck[Disease Cleansing Totem]} && ${This.HasWaterTotem}
					{
						Toon:CastSpell[Disease Cleansing Totem]
						This:CustOutput["Casting Disease Cleansing Totem"]
					}
				}

				if ${Me.Buff[${BuffNum}].DispelType.Equal[Poison]}
				{
					if ${Toon.canCast[Cure Poison]} && ${This.curePoisonTimer} < ${LavishScript.RunningTime}
					{
						This:CustOutput["Curing a poison"]
						Toon:CastSpell[Cure Poison]
						This.curePoisonTimer:Set[${This.InSeconds[20]}]
						return
					}
					elseif ${Toon.canCast[Poison Cleansing Totem]} && !${This.OwnedTotemsCheck[Poison Cleansing Totem]} && ${This.HasWaterTotem}
					{
						Toon:CastSpell[Poison Cleansing Totem]
						This:CustOutput["Casting Poison Cleansing Totem"]
					}
				}
			}
		}
		return
	}

	member LootFirst()
	{
		if ${Me.Sitting} || ${Me.Casting}
			return FALSE

		if ${Unit[-dead,-lootable,-range 0-10](exists)}
			return TRUE

		if ${Toon.HasSkill[Skinning]}
		{
			if ${Unit[-dead,-skinnable,-range 0-10](exists)} && ${Item[-inventory,"Skinning Knife"](exists)}
				return TRUE
		}

		if ${LavishScript.RunningTime} <= ${State.LOOTState_Loot_Wait_Until}
			return TRUE

		return FALSE
	}

	/**************************************/
	/*************Other Misc***************/

	method CustOutput(string myMessage)
	{
		if ${This.Output}
			UIElement[ClassGUI].FindChild[Console]:Echo["${Time.Time24}: ${myMessage}"]

		return
	}

	/**************************************/
	/***********GUI Load & Save************/

	method SaveConfig()
	{
			Config:SetSetting["${RealmChar}","UsePull",${This.UsePull}]
			Config:SetSetting["${RealmChar}","PullSpell",${This.PullSpell}]
			Config:SetSetting["${RealmChar}","RestMP",${This.RestMP}]
			Config:SetSetting["${RealmChar}","RestHP",${This.RestHP}]
			Config:SetSetting["${RealmChar}","StandMP",${This.StandMP}]
			Config:SetSetting["${RealmChar}","StandHP",${This.StandHP}]
			Config:SetSetting["${RealmChar}","EarthTotem",${This.EarthTotem}]
			Config:SetSetting["${RealmChar}","AirTotem",${This.AirTotem}]
			Config:SetSetting["${RealmChar}","FireTotem",${This.FireTotem}]
			Config:SetSetting["${RealmChar}","WaterTotem",${This.WaterTotem}]
			Config:SetSetting["${RealmChar}","UseEarthElemental",${This.UseEarthElemental}]
			Config:SetSetting["${RealmChar}","UseFireElemental",${This.UseFireElemental}]
			Config:SetSetting["${RealmChar}","UseEarthShock",${This.UseEarthShock}]
			Config:SetSetting["${RealmChar}","UseFlameShock",${This.UseFlameShock}]
			Config:SetSetting["${RealmChar}","UseFrostShock",${This.UseFrostShock}]
			Config:SetSetting["${RealmChar}","RandomShock",${This.RandomShock}]
			Config:SetSetting["${RealmChar}","SaveShocks",${This.SaveShocks}]
			Config:SetSetting["${RealmChar}","ConserveMana",${This.ConserveMana}]
			Config:SetSetting["${RealmChar}","UseLBolt",${This.UseLBolt}]
			Config:SetSetting["${RealmChar}","UseChainLight",${This.UseChainLight}]
			Config:SetSetting["${RealmChar}","MainHand",${This.MainHand}]
			Config:SetSetting["${RealmChar}","OffHand",${This.OffHand}]
			Config:SetSetting["${RealmChar}","DW",${This.DW}]
			Config:SetSetting["${RealmChar}","ShieldOnPull",${This.ShieldOnPull}]
			Config:SetSetting["${RealmChar}","HealWave",${This.HealWave}]
			Config:SetSetting["${RealmChar}","LHealWave",${This.LHealWave}]
			Config:SetSetting["${RealmChar}","ChainHeal",${This.ChainHeal}]
			Config:SetSetting["${RealmChar}","GOTN",${This.GOTN}]
			Config:SetSetting["${RealmChar}","Output",${This.Output}]
			Config:SetSetting["${RealmChar}","UseReincarnation",${This.UseReincarnation}]
			Config:SetSetting["${RealmChar}","UseMPot",${This.UseMPot}]
			Config:SetSetting["${RealmChar}","UseHPot",${This.UseHPot}]
			Config:SetSetting["${RealmChar}","UseBandages",${This.UseBandages}]
			Config:SetSetting["${RealmChar}","MPot",${This.MPot}]
			Config:SetSetting["${RealmChar}","HPot",${This.HPot}]
			Config:SetSetting["${RealmChar}","Bandage",${This.Bandage}]
			Config:SetSetting["${RealmChar}","Shield",${This.Shield}]
			Config:SetSetting["${RealmChar}","MeleeOnly",${This.MeleeOnly}]
	}

	method LoadConfig()
	{
		This.UsePull:Set[${Config.GetSetting["${RealmChar}","UsePull"]}]
		This.PullSpell:Set[${Config.GetSetting["${RealmChar}","PullSpell"]}]
		This.RestMP:Set[${Config.GetSetting["${RealmChar}","RestMP"]}]
		This.RestHP:Set[${Config.GetSetting["${RealmChar}","RestHP"]}]
		This.StandMP:Set[${Config.GetSetting["${RealmChar}","StandMP"]}]
		This.StandHP:Set[${Config.GetSetting["${RealmChar}","StandHP"]}]
		This.EarthTotem:Set[${Config.GetSetting["${RealmChar}","EarthTotem"]}]
		This.AirTotem:Set[${Config.GetSetting["${RealmChar}","AirTotem"]}]
		This.WaterTotem:Set[${Config.GetSetting["${RealmChar}","WaterTotem"]}]
		This.FireTotem:Set[${Config.GetSetting["${RealmChar}","FireTotem"]}]
		This.UseEarthElemental:Set[${Config.GetSetting["${RealmChar}","UseEarthElemental"]}]
		This.UseFireElemental:Set[${Config.GetSetting["${RealmChar}","UseFireElemental"]}]
		This.UseEarthShock:Set[${Config.GetSetting["${RealmChar}","UseEarthShock"]}]
		This.UseFlameShock:Set[${Config.GetSetting["${RealmChar}","UseFlameShock"]}]
		This.UseFrostShock:Set[${Config.GetSetting["${RealmChar}","UseFrostShock"]}]
		This.RandomShock:Set[${Config.GetSetting["${RealmChar}","RandomShock"]}]
		This.SaveShocks:Set[${Config.GetSetting["${RealmChar}","SaveShocks"]}]
		This.ConserveMana:Set[${Config.GetSetting["${RealmChar}","ConserveMana"]}]
		This.UseLBolt:Set[${Config.GetSetting["${RealmChar}","UseLBolt"]}]
		This.UseChainLight:Set[${Config.GetSetting["${RealmChar}","UseChainLight"]}]
		This.MainHand:Set[${Config.GetSetting["${RealmChar}","MainHand"]}]
		This.OffHand:Set[${Config.GetSetting["${RealmChar}","OffHand"]}]
		This.DW:Set[${Config.GetSetting["${RealmChar}","DW"]}]
		This.ShieldOnPull:Set[${Config.GetSetting["${RealmChar}","ShieldOnPull"]}]
		This.HealWave:Set[${Config.GetSetting["${RealmChar}","HealWave"]}]
		This.LHealWave:Set[${Config.GetSetting["${RealmChar}","LHealWave"]}]
		This.ChainHeal:Set[${Config.GetSetting["${RealmChar}","ChainHeal"]}]
		This.GOTN:Set[${Config.GetSetting["${RealmChar}","GOTN"]}]
		This.Output:Set[${Config.GetSetting["${RealmChar}","Output"]}]
		This.UseReincarnation:Set[${Config.GetSetting["${RealmChar}","UseReincarnation"]}]
		This.UseMPot:Set[${Config.GetSetting["${RealmChar}","UseMPot"]}]
		This.UseHPot:Set[${Config.GetSetting["${RealmChar}","UseHPot"]}]
		This.UseBandages:Set[${Config.GetSetting["${RealmChar}","UseBandages"]}]
		This.MPot:Set[${Config.GetSetting["${RealmChar}","MPot"]}]
		This.HPot:Set[${Config.GetSetting["${RealmChar}","HPot"]}]
		This.Bandage:Set[${Config.GetSetting["${RealmChar}","Bandage"]}]
		This.Shield:Set[${Config.GetSetting["${RealmChar}","Shield"]}]
		This.MeleeOnly:Set[${Config.GetSetting["${RealmChar}","MeleeOnly"]}]
	}

	method InitShamanGUI()
	{
		if ${This.UsePull}
			UIElement[UsePull@Main@Pages@ClassGUI]:SetChecked

		if ${This.UseReincarnation}
			UIElement[UseReincarnation@Main@Pages@ClassGUI]:SetChecked

		if ${This.UseMPot}
			UIElement[UseMPot@Main@Pages@ClassGUI]:SetChecked

		if ${This.UseHPot}
			UIElement[UseHPot@Main@Pages@ClassGUI]:SetChecked

		if ${This.UseBandages}
			UIElement[UseBandages@Main@Pages@ClassGUI]:SetChecked

		if ${This.MeleeOnly}
			UIElement[MeleeOnly@Main@Pages@ClassGUI]:SetChecked

		if ${This.UseEarthElemental}
			UIElement[EarthElemental@Totems@Pages@ClassGUI]:SetChecked

		if ${This.UseFireElemental}
			UIElement[FireElemental@Totems@Pages@ClassGUI]:SetChecked

		if ${This.UseEarthShock}
			UIElement[EarthShock@Spells@Pages@ClassGUI]:SetChecked

		if ${This.UseFlameShock}
			UIElement[FlameShock@Spells@Pages@ClassGUI]:SetChecked

		if ${This.UseFrostShock}
			UIElement[FrostShock@Spells@Pages@ClassGUI]:SetChecked

		if ${This.RandomShock}
			UIElement[RandomShock@Spells@Pages@ClassGUI]:SetChecked

		if ${This.SaveShocks}
			UIElement[SaveShocks@Spells@Pages@ClassGUI]:SetChecked

		if ${This.UseLBolt}
			UIElement[LightBolt@Spells@Pages@ClassGUI]:SetChecked

		if ${This.UseChainLight}
			UIElement[UseChainLight@Spells@Pages@ClassGUI]:SetChecked

		if ${This.DW}
			UIElement[DW@Buffs@Pages@ClassGUI]:SetChecked

		if ${This.ShieldOnPull}
			UIElement[ShieldOnPull@Buffs@Pages@ClassGUI]:SetChecked

		if ${This.Output}
			UIElement[EnableOutput@Other@Pages@ClassGUI]:SetChecked

		variable int i = 1

		for (i:Set[1] ; ${i} <= ${UIElement[PullSpell@Main@Pages@ClassGUI].Items} ; i:Inc)
		{
			if ${This.PullSpell.Equal["${UIElement[PullSpell@Main@Pages@ClassGUI].Item[${i}].Text}"]}
				UIElement[PullSpell@Main@Pages@ClassGUI]:SelectItem[${i}]
		}

		for (i:Set[1] ; ${i} <= ${UIElement[EarthTotem@Totems@Pages@ClassGUI].Items} ; i:Inc)
		{
			if ${This.EarthTotem.Equal["${UIElement[EarthTotem@Totems@Pages@ClassGUI].Item[${i}].Text}"]}
				UIElement[EarthTotem@Totems@Pages@ClassGUI]:SelectItem[${i}]
		}

		for (i:Set[1] ; ${i} <= ${UIElement[WaterTotem@Totems@Pages@ClassGUI].Items} ; i:Inc)
		{
			if ${This.WaterTotem.Equal["${UIElement[WaterTotem@Totems@Pages@ClassGUI].Item[${i}].Text}"]}
				UIElement[WaterTotem@Totems@Pages@ClassGUI]:SelectItem[${i}]
		}

		for (i:Set[1] ; ${i} <= ${UIElement[FireTotem@Totems@Pages@ClassGUI].Items} ; i:Inc)
		{
			if ${This.FireTotem.Equal["${UIElement[FireTotem@Totems@Pages@ClassGUI].Item[${i}].Text}"]}
				UIElement[FireTotem@Totems@Pages@ClassGUI]:SelectItem[${i}]
		}

		for (i:Set[1] ; ${i} <= ${UIElement[AirTotem@Totems@Pages@ClassGUI].Items} ; i:Inc)
		{
			if ${This.AirTotem.Equal["${UIElement[AirTotem@Totems@Pages@ClassGUI].Item[${i}].Text}"]}
				UIElement[AirTotem@Totems@Pages@ClassGUI]:SelectItem[${i}]
		}

		for (i:Set[1] ; ${i} <= ${UIElement[MainHand@Buffs@Pages@ClassGUI].Items} ; i:Inc)
		{
			if ${This.MainHand.Equal["${UIElement[MainHand@Buffs@Pages@ClassGUI].Item[${i}].Text}"]}
				UIElement[MainHand@Buffs@Pages@ClassGUI]:SelectItem[${i}]
		}

		for (i:Set[1] ; ${i} <= ${UIElement[OffHand@Buffs@Pages@ClassGUI].Items} ; i:Inc)
		{
			if ${This.OffHand.Equal["${UIElement[OffHand@Buffs@Pages@ClassGUI].Item[${i}].Text}"]}
				UIElement[OffHand@Buffs@Pages@ClassGUI]:SelectItem[${i}]
		}

		for (i:Set[1] ; ${i} <= ${UIElement[Shield@Buffs@Pages@ClassGUI].Items} ; i:Inc)
		{
			if ${This.Shield.Equal["${UIElement[Shield@Buffs@Pages@ClassGUI].Item[${i}].Text}"]}
				UIElement[Shield@Buffs@Pages@ClassGUI]:SelectItem[${i}]
		}

		if ${This.RestMP} != ${UIElement[RestMP@Main@Pages@ClassGUI].Value}
			UIElement[RestMP@Main@Pages@ClassGUI]:SetValue[${This.RestMP}]

		if ${This.RestHP} != ${UIElement[RestHP@Main@Pages@ClassGUI].Value}
			UIElement[RestHP@Main@Pages@ClassGUI]:SetValue[${This.RestHP}]

		if ${This.StandMP} != ${UIElement[StandMP@Main@Pages@ClassGUI].Value}
			UIElement[StandMP@Main@Pages@ClassGUI]:SetValue[${This.StandMP}]

		if ${This.StandHP} != ${UIElement[StandHP@Main@Pages@ClassGUI].Value}
			UIElement[StandHP@Main@Pages@ClassGUI]:SetValue[${This.StandHP}]

		if ${This.ConserveMana} != ${UIElement[ConserveMana@Main@Pages@ClassGUI].Value}
			UIElement[ConserveMana@Main@Pages@ClassGUI]:SetValue[${This.ConserveMana}]

		if ${This.MPot} != ${UIElement[MPot@Main@Pages@ClassGUI].Value}
			UIElement[MPot@Main@Pages@ClassGUI]:SetValue[${This.MPot}]

		if ${This.HPot} != ${UIElement[HPot@Main@Pages@ClassGUI].Value}
			UIElement[HPot@Main@Pages@ClassGUI]:SetValue[${This.HPot}]

		if ${This.Bandage} != ${UIElement[Bandage@Main@Pages@ClassGUI].Value}
			UIElement[Bandage@Main@Pages@ClassGUI]:SetValue[${This.Bandage}]

		if ${This.HealWave} != ${UIElement[HealWave@Heals@Pages@ClassGUI].Value}
			UIElement[HealWave@Heals@Pages@ClassGUI]:SetValue[${This.HealWave}]

		if ${This.LHealWave} != ${UIElement[LHealWave@Heals@Pages@ClassGUI].Value}
			UIElement[LHealWave@Heals@Pages@ClassGUI]:SetValue[${This.LHealWave}]

		if ${This.ChainHeal} != ${UIElement[ChainHeal@Heals@Pages@ClassGUI].Value}
			UIElement[ChainHeal@Heals@Pages@ClassGUI]:SetValue[${This.LHealWave}]

		if ${This.GOTN} != ${UIElement[GOTN@Heals@Pages@ClassGUI].Value}
			UIElement[GOTN@Heals@Pages@ClassGUI]:SetValue[${This.GOTN}]

	}

	method ClassGUIChange(string Action)
	{
		switch ${Action}
		{
			case PullSpell
				if ${UIElement[PullSpell@Main@Pages@ClassGUI].SelectedItem.Value(exists)}
					This.PullSpell:Set[${UIElement[PullSpell@Main@Pages@ClassGUI].SelectedItem}]
			break

			case EarthTotem
				if ${UIElement[EarthTotem@Totems@Pages@ClassGUI].SelectedItem.Value(exists)}
					This.EarthTotem:Set[${UIElement[EarthTotem@Totems@Pages@ClassGUI].SelectedItem}]
			break

			case FireTotem
				if ${UIElement[FireTotem@Totems@Pages@ClassGUI].SelectedItem.Value(exists)}
					This.FireTotem:Set[${UIElement[FireTotem@Totems@Pages@ClassGUI].SelectedItem}]
			break

			case AirTotem
				if ${UIElement[AirTotem@Totems@Pages@ClassGUI].SelectedItem.Value(exists)}
					This.AirTotem:Set[${UIElement[AirTotem@Totems@Pages@ClassGUI].SelectedItem}]
			break

			case WaterTotem
				if ${UIElement[WaterTotem@Totems@Pages@ClassGUI].SelectedItem.Value(exists)}
					This.WaterTotem:Set[${UIElement[WaterTotem@Totems@Pages@ClassGUI].SelectedItem}]
			break

			case MainHand
				if ${UIElement[MainHand@Buffs@Pages@ClassGUI].SelectedItem.Value(exists)}
					This.MainHand:Set[${UIElement[MainHand@Buffs@Pages@ClassGUI].SelectedItem}]
			break

			case OffHand
				if ${UIElement[OffHand@Buffs@Pages@ClassGUI].SelectedItem.Value(exists)}
					This.OffHand:Set[${UIElement[OffHand@Buffs@Pages@ClassGUI].SelectedItem}]
			break

			case Shield
				if ${UIElement[Shield@Buffs@Pages@ClassGUI].SelectedItem.Value(exists)}
					This.Shield:Set[${UIElement[Shield@Buffs@Pages@ClassGUI].SelectedItem}]
			break

			/*    checkboxes    */

			case UsePull
				if ${UIElement[UsePull@Main@Pages@ClassGUI].Checked}
					This.UsePull:Set[TRUE]

				if !${UIElement[UsePull@Main@Pages@ClassGUI].Checked}
					This.UsePull:Set[FALSE]
			break

			case UseReincarnation
				if ${UIElement[UseReincarnation@Main@Pages@ClassGUI].Checked}
					This.UseReincarnation:Set[TRUE]

				if !${UIElement[UseReincarnation@Main@Pages@ClassGUI].Checked}
					This.UseReincarnation:Set[FALSE]
			break

			case UseHPot
				if ${UIElement[UseHPot@Main@Pages@ClassGUI].Checked}
					This.UseHPot:Set[TRUE]

				if !${UIElement[UseHPot@Main@Pages@ClassGUI].Checked}
					This.UseHPot:Set[FALSE]
			break

			case UseMPot
				if ${UIElement[UseMPot@Main@Pages@ClassGUI].Checked}
					This.UseMPot:Set[TRUE]

				if !${UIElement[UseMPot@Main@Pages@ClassGUI].Checked}
					This.UseMPot:Set[FALSE]
			break

			case UseBandages
				if ${UIElement[UseBandages@Main@Pages@ClassGUI].Checked}
					This.UseBandages:Set[TRUE]

				if !${UIElement[UseBandages@Main@Pages@ClassGUI].Checked}
					This.UseBandages:Set[FALSE]
			break

			case MeleeOnly
				if ${UIElement[MeleeOnly@Main@Pages@ClassGUI].Checked}
					This.MeleeOnly:Set[TRUE]

				if !${UIElement[MeleeOnly@Main@Pages@ClassGUI].Checked}
					This.MeleeOnly:Set[FALSE]
			break

			case EarthElemental
				if ${UIElement[EarthElemental@Totems@Pages@ClassGUI].Checked}
					This.UseEarthElemental:Set[TRUE]

				if !${UIElement[EarthElemental@Totems@Pages@ClassGUI].Checked}
					This.UseEarthElemental:Set[FALSE]
			break

			case FireElemental
				if ${UIElement[FireElemental@Totems@Pages@ClassGUI].Checked}
					This.UseFireElemental:Set[TRUE]

				if !${UIElement[FireElemental@Totems@Pages@ClassGUI].Checked}
					This.UseFireElemental:Set[FALSE]
			break

			case FlameShock
				if ${UIElement[FlameShock@Spells@Pages@ClassGUI].Checked}
					This.UseFlameShock:Set[TRUE]

				if !${UIElement[FlameShock@Spells@Pages@ClassGUI].Checked}
					This.UseFlameShock:Set[FALSE]
			break

			case EarthShock
				if ${UIElement[EarthShock@Spells@Pages@ClassGUI].Checked}
					This.UseEarthShock:Set[TRUE]

				if !${UIElement[EarthShock@Spells@Pages@ClassGUI].Checked}
					This.UseEarthShock:Set[FALSE]
			break

			case FrostShock
				if ${UIElement[FrostShock@Spells@Pages@ClassGUI].Checked}
					This.UseFrostShock:Set[TRUE]

				if !${UIElement[FrostShock@Spells@Pages@ClassGUI].Checked}
					This.UseFrostShock:Set[FALSE]
			break

			case RandomShock
				if ${UIElement[RandomShock@Spells@Pages@ClassGUI].Checked}
					This.RandomShock:Set[TRUE]

				if !${UIElement[RandomShock@Spells@Pages@ClassGUI].Checked}
					This.RandomShock:Set[FALSE]
			break

			case SaveShocks
				if ${UIElement[SaveShocks@Spells@Pages@ClassGUI].Checked}
					This.SaveShocks:Set[TRUE]

				if !${UIElement[SaveShocks@Spells@Pages@ClassGUI].Checked}
					This.SaveShocks:Set[FALSE]
			break

			case UseLBolt
				if ${UIElement[LightBolt@Spells@Pages@ClassGUI].Checked}
					This.UseLBolt:Set[TRUE]

				if !${UIElement[LightBolt@Spells@Pages@ClassGUI].Checked}
					This.UseLBolt:Set[FALSE]
			break

			case UseChainLight
				if ${UIElement[UseChainLight@Spells@Pages@ClassGUI].Checked}
					This.UseChainLight:Set[TRUE]

				if !${UIElement[UseChainLight@Spells@Pages@ClassGUI].Checked}
					This.UseChainLight:Set[FALSE]
			break

			case DW
				if ${UIElement[DW@Buffs@Pages@ClassGUI].Checked}
					This.DW:Set[TRUE]

				if !${UIElement[DW@Buffs@Pages@ClassGUI].Checked}
					This.DW:Set[FALSE]
			break

			case ShieldOnPull
				if ${UIElement[ShieldOnPull@Buffs@Pages@ClassGUI].Checked}
					This.ShieldOnPull:Set[TRUE]

				if !${UIElement[ShieldOnPull@Buffs@Pages@ClassGUI].Checked}
					This.ShieldOnPull:Set[FALSE]
			break

			case EnableOutput
				if ${UIElement[EnableOutput@Other@Pages@ClassGUI].Checked}
					This.Output:Set[TRUE]

				if !${UIElement[EnableOutput@Other@Pages@ClassGUI].Checked}
					This.Output:Set[FALSE]
			break

			/*   sliders   */

			case RestMP
				if ${UIElement[RestMP@Main@Pages@ClassGUI].Value(exists)}
					This.RestMP:Set[${UIElement[RestMP@Main@Pages@ClassGUI].Value}]
			break

			case RestHP
				if ${UIElement[RestHP@Main@Pages@ClassGUI].Value(exists)}
					This.RestHP:Set[${UIElement[RestHP@Main@Pages@ClassGUI].Value}]
			break

			case StandHP
				if ${UIElement[StandHP@Main@Pages@ClassGUI].Value(exists)}
					This.StandHP:Set[${UIElement[StandHP@Main@Pages@ClassGUI].Value}]
			break

			case StandMP
				if ${UIElement[StandMP@Main@Pages@ClassGUI].Value(exists)}
					This.StandMP:Set[${UIElement[StandMP@Main@Pages@ClassGUI].Value}]
			break

			case ConserveMana
				if ${UIElement[ConserveMana@Main@Pages@ClassGUI].Value(exists)}
					This.ConserveMana:Set[${UIElement[ConserveMana@Main@Pages@ClassGUI].Value}]
			break

			case MPot
				if ${UIElement[MPot@Main@Pages@ClassGUI].Value(exists)}
					This.MPot:Set[${UIElement[MPot@Main@Pages@ClassGUI].Value}]
			break

			case HPot
				if ${UIElement[HPot@Main@Pages@ClassGUI].Value(exists)}
					This.HPot:Set[${UIElement[HPot@Main@Pages@ClassGUI].Value}]
			break

			case Bandage
				if ${UIElement[Bandage@Main@Pages@ClassGUI].Value(exists)}
					This.Bandage:Set[${UIElement[Bandage@Main@Pages@ClassGUI].Value}]
			break

			case HealWave
				if ${UIElement[HealWave@Heals@Pages@ClassGUI].Value(exists)}
					This.HealWave:Set[${UIElement[HealWave@Heals@Pages@ClassGUI].Value}]
			break

			case LHealWave
				if ${UIElement[LHealWave@Heals@Pages@ClassGUI].Value(exists)}
					This.LHealWave:Set[${UIElement[LHealWave@Heals@Pages@ClassGUI].Value}]
			break

			case ChainHeal
				if ${UIElement[ChainHeal@Heals@Pages@ClassGUI].Value(exists)}
					This.ChainHeal:Set[${UIElement[ChainHeal@Heals@Pages@ClassGUI].Value}]
			break

			case GOTN
				if ${UIElement[GOTN@Heals@Pages@ClassGUI].Value(exists)}
					This.GOTN:Set[${UIElement[GOTN@Heals@Pages@ClassGUI].Value}]
			break
		}
	}
}