My Druid Mac

Post your completed (working) macros here. Only for macros using MQ2Data syntax!

Moderator: MacroQuest Developers

SirCheese
orc pawn
orc pawn
Posts: 13
Joined: Tue Sep 28, 2004 8:02 pm
Location: Washington DC

My Druid Mac

Post by SirCheese » Thu Nov 11, 2004 1:35 pm

This is my 1st Macro im hoping for some constrctive critisizm.

It assumes the druid has 9 spell slots.

Druid will heal Group MA and hiself. Will nuke or dot , Keep regen ds and hp buffs on grp and self. Will port to all ports if asked.

Has a built in help

o well here goes.. try it tell me what u think even if it sucks

Code: Select all

|SirCheese
|Druid Bot 1.1 - Nov 10 2004 -
|----[												]----
|Usage: Target the MA
|	/Mac Druid (% to assist) (Number of Dots or Nukes)
|----[												]----
|Description: Set Your Spells, Look over Variable Changes.  Decide if you want Nukes, Dots, Type of Heals, When to heal Etc.
|	      Druid will do up to 2 Dots and continously refresh as they ware off.  Will Nuke whatever amout desired.
|	      Will Heal the entire group.
|	      Druid Will keep grp buffs always on grp once they are on.  
|	      Druid will always keep himself or herself Self Buffed
|	      Druid Will Sit to med Automaticly.  When Mob is near it will stand or when its mana is good.
|	      For Chat activated Commands /tell *Druid* Druid Help
|	      For Chat Activated Druid Ports /tell *Druid* Druid Port Help
|
|----[												]----
| Add This: ( ) Auto Spells, ( ) Announce when Below 10 Mana, 
|----[												]----
| Things To Fix: ( ) Stop Nuking When Lom, 
|----[												]----
| Things I would like to add: ( ) Snare, ( ) Auto Group Cure When Neg Effect, ( ) Loot Mobs, ( ) Wait 4 Rez, ( ) Auto Trade
|-----------------------------------------------------------------------------------------------------------------------------

|----------
| Includes
|----------
#include spell_routines.inc 

|----------
| Chats
|----------
#chat group
#chat chat
#chat tell

|----------
| Events
|----------
#Event MagicDotOff "#*#Swarming Death spell has worn off#*#"
#Event FireDotOff "#*#Vengeance of Tunare spell has worn off#*#"
#Event Invited "#*#To join the group, click on the 'FOLLOW' option, or 'DISBAND' to cancel#*#"

|----------
| Main Sub
|----------
Sub Main

|-----------------------------------------------------------------------------------------------------------------------------
|							--- Make Your Changes Here ---
|-----------------------------------------------------------------------------------------------------------------------------

|---------------
| Declare Spells
|---------------

|-- Fast Heal --
/declare SpellFastHeal string outer Nature's Infusion
/declare SpellFastHealRange int outer 200

|-- Complete Heal --
/declare SpellCompHeal string outer Karana's Renewal
/declare SpellCompHealRange int outer 100

|-- Cold DD --
/declare SpellColdDD string outer Winter's Frost
/declare SpellColdDDRange int outer 200

|-- Fire DD --
/declare SpellFireDD string outer Sylvan Fire
/declare SpellFireDDRange int outer 200

|-- Fire DOT --
/declare SpellFireDOT string outer Vengeance of Tunare
/declare SpellFireDOTange int outer 200

|-- Magic DOT --
/declare SpellMagicDOT string outer Orb of Clinging Death
/declare SpellMagicDOTRange int outer 250

|-- Snare Spell --
/declare SpellSnare string outer Ensnare
/declare SpellSnareRange int outer 2000

|-- Group HP Buff --
/declare SpellGroupHPBuff string outer Blessing of the Nine
/declare SpellGroupHPBuffRange int outer 100

|-- Single HP Buff --
/declare SpellSingleHPBuff string outer Steeloak Skin
/declare SpellSingleHPBuffRange int outer 100

|-- Self Mana Regen --
/declare SpellSelfManaRegen string outer Mask of the Forest

|-- Single HP Regen Buff --
/declare SpellSingleHPRegenBuff string outer Replenishment
/declare SpellSingleHPRegenBuffRange int outer 100

|-- Group HP Regen Buff --
/declare SpellGroupHPRegenBuff string outer Blessing of Oak
/declare SpellGroupHPRegenBuffRange int outer 60

|-- Single DS Buff --
/declare SpellSingleDSBuff string outer Shield of Bracken
/declare SpellSingleDSBuffRange int outer 100

|-- Group DS Buff --
/declare SpellGroupDSBuff string outer Circle of Nettles
/declare SpellGroupDSBuffRange int outer 100

|-- Single Outdoors Run Buff --
/declare SpellSingleORunBuff string outer Spirit of Eagle
/declare SpellSingleORunBuffRange int outer 100

|-- Group Outdoors Run Buff --
/declare SpellGroupORunBuff string outer Flight of Eagles 
/declare SpellGroupORunBuffRange int outer 100

|-- Mount Item --
/declare Mount string outer White Ornate Chain Bridle

|-----------------------
| Variables Changeable
|-----------------------

|--- Use CH or Fast Heal (1= Complete Heal) (0= Fast Heal) (Adjust TankHeal Appropriatly)  ---
/declare TankHealType int outer 0

|--- What Percent to heal the MA ---
/declare TankHeal int outer 57

|--- Use Dots or Nukes (1= Dots) (0= DD)   ---
/declare DOTSorDD int outer 0

|--- Use Fire od Cold Nukes? (1= Fire) (0= Cold)  ---
/declare NukeType int outer 1

|--- What Percent to heal Casters ---
/declare HealCasterAT int outer 70

|--- What Percet to heal Mele Class ---
/declare MeleeHeals int outer 60

|--- What Percent to heal the Myself ---
/declare SelfHeal int outer 70

|--- At what % Mana to stop Nuking / Doting  ---
/declare StopNukeMana int outer 30

|--- Auto Sit or Not (1=Sit) (0=No)  ---
/declare autosit int outer 1 

|-----------------------
| Declare Chat Channels
|-----------------------
/declare mychannel string outer mychannel:password

|-----------------------------------------------------------------------------------------------------------------------------
|							--- Do Not Edit Past this Line ---
|-----------------------------------------------------------------------------------------------------------------------------

|------------------------
| Set Character to Start
|------------------------
/tgb on
/assist off
/join ${mychannel} 

|---------------------------------------
| Events Not Looped but done on start
|---------------------------------------
/call DefaultSpells

|------------------------
| Variable Sets
|------------------------
/declare MainAssist string outer ${Target}
/declare AssistAt int outer ${Param0}
/declare NukeAmount int outer ${Param1}
/declare TimesNuked outer
/varset TimesNuked 0 
/declare GotTarget outer
/varset GotTarget 0 
/declare CurrentMobID int local 
/declare UseThisNuke outer
/declare ADot outer
/varset ADot 0
/declare BDot outer
/varset BDot 0
/declare Snared outer
/varset Snared 0
/declare distancetosit int outer 40 
/declare following int outer 0
/declare follname string outer NULL 

/if (${NukeType}==1) {
	/varset UseThisNuke ${SpellFireDD}
}

/if (${NukeType}==0) {
	/varset UseThisNuke ${SpellColdDD}
}

/if (${DOTSorDD}==1) {
	/if (${NukeAmount}>2) {
		/varset NukeAmount 2
	}
}

|------------------------
| Announce Start
|------------------------
/if (${DOTSorDD}==0 && ${TankHealType}==0) {
	/echo Druid Bot Started! Healing ${MainAssist} with ${SpellFastHeal} at ${TankHeal}%.  Casting ${UseThisNuke} ${NukeAmount} times at ${AssistAt}%.
}
/if (${DOTSorDD}==0 && ${TankHealType}==1) {
	/echo Druid Bot Started! Healing ${MainAssist} with ${SpellCompHeal} at ${TankHeal}%.  Casting ${UseThisNuke} ${NukeAmount} times at ${AssistAt}%.
}
/if (${DOTSorDD}==1 && ${NukeAmount}==1 && ${TankHealType}==0) {
	/echo Druid Bot Started! Healing ${MainAssist} with ${SpellFastHeal} at ${TankHeal}%.  Casting ${SpellMagicDOT} at ${AssistAt}%.
} 
/if (${DOTSorDD}==1 && ${NukeAmount}==1 && ${TankHealType}==1) {
	/echo Druid Bot Started! Healing ${MainAssist} with ${SpellCompHeal} at ${TankHeal}%.  Casting ${SpellMagicDOT} at ${AssistAt}%.
}
/if (${DOTSorDD}==1 && ${NukeAmount}==2 && ${TankHealType}==0) {
	/echo Druid Bot Started! Healing ${MainAssist} with ${SpellFastHeal} at ${TankHeal}%.  Casting ${SpellMagicDOT} and ${SpellFireDOT} at ${AssistAt}%.
}
/if (${DOTSorDD}==1 && ${NukeAmount}==2 && ${TankHealType}==1) {
	/echo Druid Bot Started! Healing ${MainAssist} with ${SpellCompHeal} at ${TankHeal}%.  Casting ${SpellMagicDOT} and ${SpellFireDOT} at ${AssistAt}%.
}

|-----------------------------------------------------------------------------------------------------------------------------
|							Main Loop
|-----------------------------------------------------------------------------------------------------------------------------
:MainLoop
/delay 1s
/doevents
/call KeepHeal
/call GetTarget
/call CheckBuffs 

|------------------
| Auto Sit
|------------------
/if ((${autosit}==1)&&(${Me.PctMana}<=90)&&(!${Me.Casting.ID})) { 
	/if ((${Bool[${Me.Standing}]})&&(${NearestSpawn[NPC].Distance}>=${Math.Calc[${NearestSpawn[NPC].MaxRange}+${distancetosit}]})&&(${Me.PctHPs}>90)) /sit 
	/if ((${Bool[${Me.Sitting}]})&&(!${Window[SpellBookWnd].Open})&&(${NearestSpawn[NPC].Distance}<=${Math.Calc[${NearestSpawn[NPC].MaxRange}+${Math.Calc[${distancetosit}/3]}]})) /stand 
} 
/if ((${autosit}==1)&&(${Me.PctMana}>90)) { 
	/if ((${Bool[${Me.Sitting}]})&&(!${Window[SpellBookWnd].Open})) /stand 	
}

|------------------
| Wait To Attack
|------------------
/if (${Target.PctHPs}<=${AssistAt} && ${Target.Type.Equal["NPC"]} && ${Target.Distance}<175 && !${Me.Moving} && !${Me.Casting.ID} && !${String[${Target}].Find["NULL"]}>0) { 
/if (${GotTarget}==0) { 
	/doevents
	/delay 5
	/varset CurrentMobID ${Target.ID} 
	/popup Target Aquired >> ${Target.CleanName} << 
	/echo Target Aquired >> ${Target.CleanName} <<
	/varset GotTarget 1
	/goto :StartCombat
   }

} else { 
	/goto :MainLoop

|------------------
| Start Combat
|------------------
:StartCombat
/doevents
/call KeepHeal
/goto :WaitDead

|---------------------
| Wait for mod to die
|---------------------
:waitDead
/doevents
/if (${Spawn[${CurrentMobID}].Type.Equal[NPC]}) {
	/call KeepHeal

/if (${DOTSorDD}==0) {
	/call NukeCycle
}

/if (${DOTSorDD}==1) {
	/call DoDamageOT
}
/goto :WaitDead

} Else {
   /doevents
   /echo Mob has Died, We Win EQ! 
   /varset GotTarget 0
   /varset TimesNuked 0
   /varset ADot 0
   /varset BDot 0
   /varset Snared 0
   /goto :MainLoop
}

/goto :MainLoop
/return
|-----------------------------------------------------------------------------------------------------------------------------
|							--- END MAIN LOOP ---
|-----------------------------------------------------------------------------------------------------------------------------

|------------------
| Heal MA
|------------------
Sub KeepHeal
/call HealGroup
/call HealMyself
/return

|------------------
| Heal Group
|------------------
Sub HealGroup
/declare i int local 1 
/for i 1 to ${Group} 

/if (${Group[${i}].Name.Equal[${MainAssist}]} && ${Group[${i}].PctHPs}<=${TankHeal}) { 
	/target pc ${Group[${i}]} 
		/if (${TankHealType}==0) {
				/if (${Me.CurrentMana}<${Spell[${SpellFastHeal}].Mana}) { 
					/echo Not Enuf Mana to Heal ${Group[${i}]} 
				} else 	/if (${Target.Distance}<=100) { 
						/gsay ${SpellFastHeal} on >> %T <<
						/call cast "${SpellFastHeal}" gem2 4s 
					}
		}
		/if (${TankHealType}==1) {
				/if (${Me.CurrentMana}<${Spell[${SpellCompHeal}].Mana}) { 
					/echo Not Enuf Mana to Heal ${Group[${i}]} 
				} else 	/if (${Target.Distance}<=100) { 
						/gsay ${SpellCompHeal} on >> %T <<
						/call cast "${SpellCompHeal}" gem2 4s 
					}
		}
}

/if (${Group[${i}].Class.Name.Equal[Cleric]} || ${Group[${i}].Class.Name.Equal[Druid]} || ${Group[${i}].Class.Name.Equal[Wizard]} || ${Group[${i}].Class.Name.Equal[Magician]} || ${Group[${i}].Class.Name.Equal[Necromancer]} || ${Group[${i}].Class.Name.Equal[Shaman]} || ${Group[${i}].Class.Name.Equal[Enchanter]}) /if (${Group[${i}].PctHPs}<=${HealCasterAT}) { 
	/target pc ${Group[${i}]} 
		/if (${Me.CurrentMana}<${Spell[${SpellFastHeal}].Mana}) { 
			/echo Not Enuf Mana to Heal ${Group[${i}]} 
		} else /if (${Target.Distance}<=100) { 
			/gsay ${SpellFastHeal} on >> %T <<
			/call cast "${SpellFastHeal}"
			} 
} 

/if (${Group[${i}].Class.Name.Equal[Warrior]} || ${Group[${i}].Class.Name.Equal[Monk]} || ${Group[${i}].Class.Name.Equal[Rouge]} || ${Group[${i}].Class.Name.Equal[Ranger]} || ${Group[${i}].Class.Name.Equal[Beast]} || ${Group[${i}].Class.Name.Equal[Shadow Knight]} || ${Group[${i}].Class.Name.Equal[Paladin]}) /if (${Group[${i}].PctHPs}<=${MeleeHeals} && ${Group[${i}].Name.NotEqual[${MainAssist}]}) { 
	/target pc ${Group[${i}]} 
		/if (${Me.CurrentMana}<${Spell[${SpellCompHeal}].Mana}) { 
			/echo Not Enuf Mana to Heal ${Group[${i}]} 
		} else /if (${Target.Distance}<=100) { 
			/gsay ${SpellCompHeal} on >> %T <<
			/call cast "${SpellCompHeal}"
			} 
} 

/next i 
/return 

|------------------
| Heal Myself
|------------------
Sub HealMyself
/if (${Me.PctHPs}>${SelfHeal}) /return 
/if (${Me.PctHPs}<=${SelfHeal}) {
	/target Myself
	/gsay ${SpellFastHeal} on >> %T <<
	/call cast "${SpellFastHeal}" gem2
}
/return

|------------------
| Get A Target
|------------------
Sub GetTarget 
:Target 
/if (${Me.Casting.ID}) /return 
/if (${Me.Moving}) /return 
/if (${Spawn[${MainAssist}].ID}) { 
   /assist ${MainAssist} 
} else { 
   /echo ${MainAssist} Is not in the Zone!
   /delay 20s 
} 
/delay 1 
/return

|------------------
| Nuke Cycle
|------------------
Sub NukeCycle
:NukeCycleLoop
|/if (${Me.PctMana}<=90) {
	/if (${TimesNuked}<${NukeAmount}) {
		/call KeepHeal
		/assist ${MainAssist}
		/delay 1
		/call cast "${UseThisNuke}"
		/varcalc TimesNuked ${TimesNuked} + 1 
		/delay 1s
		/call KeepHeal
		/delay 1s
		/call KeepHeal
		/delay 1s
		/call KeepHeal
		/delay 1s
		/call KeepHeal
		/delay 1s
		/call KeepHeal
		/goto :NukeCycleLoop
	}
|}
/return

|--------------------
| Do Dots
|--------------------
Sub DoDamageOT
/call KeepHeal
/if (${NukeAmount}==1) { 
/call OneDot
}
/if (${NukeAmount}==2) { 
/call TwoDot
}
/return

|--------------------
| One Dot
|--------------------
Sub OneDot
/if (${ADot}==0) {
		:DOT1Loop
		/call KeepHeal
		/assist ${MainAssist}
/if (${SpellMagicDOT}==Swarming Death) {
	/if (${FindItem[Orb of Clinging Death].ID}) /call Cast "Orb of Clinging Death" item 
	/if (!${FindItem[Orb of Clinging Death].ID}) /call Cast "${SpellMagicDOT}"
		/if (${Macro.Return.Equal["CAST_INTERRUPTED"]}) /goto :DOT1Loop
		/if (${Macro.Return.Equal["CAST_RESISTED"]}) { 
			/gsay >> %t << Resisted ${SpellMagicDOT} Trying Again!
			/delay 1s
			/goto :DOT1Loop
		}
		/if (${Macro.Return.Equal["CAST_SUCCESS"]}) { 
			/varset ADot 1
		}

} Else {
	/call Cast "${SpellMagicDOT}"
		/if (${Macro.Return.Equal["CAST_INTERRUPTED"]}) /goto :DOT1Loop
		/if (${Macro.Return.Equal["CAST_RESISTED"]}) { 
			/gsay >> %t << Resisted ${SpellMagicDOT} Trying Again!
			/delay 1s
			/goto :DOT1Loop
		}
		/if (${Macro.Return.Equal["CAST_SUCCESS"]}) { 
			/varset ADot 1
		}
}
/return

|--------------------
| Two Dots
|--------------------
Sub TwoDot
/if (${ADot}==0) {
		:DOT2aLoop
		/call KeepHeal
		/assist ${MainAssist}
		/call cast "${SpellMagicDOT}" item
		         /if (${Macro.Return.Equal["CAST_INTERRUPTED"]}) /goto :DOT2aLoop
		         /if (${Macro.Return.Equal["CAST_RESISTED"]}) { 
				/gsay >> %t << Resisted ${SpellMagicDOT} Trying Again!
				/delay 4s
				/goto :DOT2aLoop
			}

			/if (${Macro.Return.Equal["CAST_SUCCESS"]}) { 
				/varset ADot 1
			}

	}
			/delay 7s

/if (${BDot}==0) {
		:DOT2bLoop
		/call KeepHeal
		/assist ${MainAssist}
		/call cast "${SpellFireDOT}"
		         /if (${Macro.Return.Equal["CAST_INTERRUPTED"]}) /goto :DOT2bLoop
		         /if (${Macro.Return.Equal["CAST_RESISTED"]}) { 
				/gsay >> %t << Resisted ${SpellFireDOT} Trying Again!
				/delay 4s
				/goto :DOT2bLoop
			}

			/if (${Macro.Return.Equal["CAST_SUCCESS"]}) { 
				/varset BDot 1
			}

	}

/return

|------------------
| Check Buffs
|------------------
Sub CheckBuffs 

|-- Self Regen buff on at All Times --
/if (!${Me.Buff[${SpellSelfManaRegen}].ID}) { 
	/if ( !${Me.Gem["${SpellSelfManaRegen}"]} ) { 
		/memspell 9 "${SpellSelfManaRegen}"
		/delay 22
	}
	/delay 10
	/call cast "${SpellSelfManaRegen}"
} 

|-- DS on at all times --
/if (!${Me.Buff[Circle of Fireskin].ID} && !${Me.Buff[Fireskin].ID} && !${Me.Buff[${SpellSingleDSBuff}].ID} && !${Me.Buff[${SpellGroupDSBuff}].ID}) { 
	/if ( !${Me.Gem["${SpellGroupDSBuff}"]} ) { 
		/memspell 9 "${SpellGroupDSBuff}"
		/delay 28
	}
	/target myself
	/delay 22
	/call cast "${SpellGroupDSBuff}"
}

|-- Keep a HP Buff On --
/if (!${Me.Buff[Hand of Conviction].ID} && !${Me.Buff[Conviction].ID} && !${Me.Buff[Hand of Virtue].ID} && !${Me.Buff[Virtue].ID} && !${Me.Buff[${SpellGroupHPBuff}].ID} && !${Me.Buff[${SpellSingleHPBuff}].ID}) { 
	/if ( !${Me.Gem["${SpellSingleHPBuff}"]} ) { 
		/memspell 9 "${SpellSingleHPBuff}"
		/delay 28
	}
	/target myself
	/delay 22
	/call cast "${SpellSingleHPBuff}"
}

|-- Keep a Regen on --
/if (!${Me.Buff[Talisman of Perseverance].ID} && !${Me.Buff[Spirit of Perseverance].ID} && !${Me.Buff[${SpellSingleHPRegenBuff}].ID} && !${Me.Buff[${SpellGroupHPRegenBuff}].ID}) { 
	/if ( !${Me.Gem["${SpellGroupHPRegenBuff}}"]} ) { 
		/memspell 9 "${SpellGroupHPRegenBuff}"
		/delay 28
	}
	/target myself
	/delay 22
	/call cast "${SpellGroupHPRegenBuff}"
}

|-- Refresh Mask --
/if (${Me.Buff[${SpellSelfManaRegen}].ID}) {
	/if (${Me.Buff[${SpellSelfManaRegen}].Duration}<20) {
		/if ( !${Me.Gem["${SpellSelfManaRegen}"]} ) { 
			/memspell 9 "${SpellSelfManaRegen}"
			/delay 22
		}
		/delay 10
		/call cast "${SpellSelfManaRegen}"
	}
}

|-- Refresh Group 9 --

/if (${Me.Buff[${SpellGroupHPBuff}].ID}) {
	/if (${Me.Buff[${SpellGroupHPBuff}].Duration}<20) {
		/if ( !${Me.Gem["${SpellGroupHPBuff}"]} ) { 
			/memspell 9 "${SpellGroupHPBuff}"
			/delay 28
		}
	/target myself
	/delay 22
	/call cast "${SpellGroupHPBuff}"
	}
}

|-- Refresh Single HP Buff --
/if (${Me.Buff[${SpellSingleHPBuff}].ID}) {
	/if (${Me.Buff[${SpellSingleHPBuff}].Duration}<20) {
	/if ( !${Me.Gem["${SpellSingleHPBuff}"]}) { 
		/memspell 9 "${SpellSingleHPBuff}"
		/delay 28
	}
	/target myself
	/delay 22
	/call cast "${SpellSingleHPBuff}"
	}
}

|-- Refresh Single Regen --
/if (${Me.Buff[${SpellSingleHPRegenBuff}].ID}) {
	/if (${Me.Buff[${SpellSingleHPRegenBuff}].Duration}<20) {
	/if ( !${Me.Gem["${SpellSingleHPRegenBuff}}"]}) { 
		/memspell 9 "${SpellSingleHPRegenBuff}"
		/delay 28
	}
	/target myself
	/delay 22
	/call cast "${SpellSingleHPRegenBuff}"
	}
}

|-- Refresh Group Regen --
/if (${Me.Buff[${SpellGroupHPRegenBuff}].ID}) {
	/if (${Me.Buff[${SpellGroupHPRegenBuff}].Duration}<20) {
	/if ( !${Me.Gem["${SpellGroupHPRegenBuff}"]}) { 
		/memspell 9 "${SpellGroupHPRegenBuff}"
		/delay 28
	}
	/delay 22
	/target myself
		/call cast "${SpellGroupHPRegenBuff}"
	}
}


|-- Refresh Single DS --
/if (${Me.Buff[${SpellSingleDSBuff}].ID}) {
	/if (${Me.Buff[${SpellSingleDSBuff}].Duration}<20) {
		/if ( !${Me.Gem["${SpellSingleDSBuff}) { 
			/memspell 9 "${SpellSingleDSBuff}"
			/delay 28
		}
	/target myself
	/delay 22
	/call cast "${SpellSingleDSBuff}"
	}
}

|-- Refresh Group DS --
/if (${Me.Buff[${SpellGroupDSBuff}].ID}) {
	/if (${Me.Buff[${SpellGroupDSBuff}].Duration}<20) {
	/if ( !${Me.Gem["${SpellGroupDSBuff}"]}) { 
		/memspell 9 "${SpellGroupDSBuff}"
		/delay 28
	}
	/target myself
	/delay 22
	/call cast "${SpellGroupDSBuff}"
	}
}


|-- Refres SOE --
/if (${Me.Buff[${SpellSingleORunBuff}].ID}) {
	/if (${Me.Buff[${SpellSingleORunBuff}].Duration}<20) {
	/if ( !${Me.Gem["${SpellSingleORunBuff}"]}) { 
		/memspell 9 "${SpellSingleORunBuff}"
		/delay 28
	}
	/target myself
	/delay 22
	/call cast "${SpellSingleORunBuff}"
	}
}


|-- Refres FOE -- 
/if (${Me.Buff[${SpellGroupORunBuff}].ID}) {
	/if (${Me.Buff[${SpellGroupORunBuff}].Duration}<20) {
	/if ( !${Me.Gem["${SpellGroupORunBuff}"]}) { 
		/memspell 9 "${SpellGroupORunBuff}"
		/delay 28
	}
	/target myself
	/delay 22
	/call cast "${SpellGroupORunBuff}"
	}
}
/return

|------------------
| Dots Wore off
|------------------
Sub Event_MagicDotOff
/varset ADot 0 
/return

Sub Event_FireDotOff
/varset BDot 0 
/return

|------------------
| Invited To Group
|------------------
Sub Event_Invited 
/invite 
/return

|------------------
| Check Events
|------------------
Sub CheckEvents 
   /delay 1 
   /doevents Chat 
   /doevents flush 
/return 

|------------------
| Find Exact PC
|------------------
Sub FindExactPC(string name) 
   /declare nameid int local 
   /declare counter int local 1 
   :FindNext 
   /if (!${NearestSpawn[${counter}, pc ${name}].ID}) /return NOT_FOUND 
   /varset nameid ${NearestSpawn[${counter}, pc ${name}].ID} 
   /if (${Spawn[${nameid}].CleanName.Equal[${name}]}) { 
      /target id ${nameid} 
      /delay 1s ${Target.ID}==${nameid} 
      /if (${Target.ID}==${nameid}) /return TARGET_SUCCESS 
   } 
   /varcalc counter ${counter}+1 
   /if (${NearestSpawn[${counter}, pc ${name}].ID}) /goto :FindNext 
/return NOT_FOUND 

|------------------
| Default Spells
|------------------
Sub DefaultSpells
/echo Memming spells. Hang on. 

|-- Fire DD --
/if (${DOTSorDD}==0 && ${NukeType}==1) {
/if ( !${Me.Gem["${SpellCompHeal}"]} ) { 
/memspell 1 "${SpellCompHeal}"
/delay 23 
} 
/if ( !${Me.Gem["${SpellFastHeal}"]} ) { 
/memspell 2 "${SpellFastHeal}"
/delay 26
} 
/if ( !${Me.Gem["${SpellSnare}"]} ) { 
/memspell 3 "${SpellSnare}"
/delay 20 
} 
/if ( !${Me.Gem["${SpellFireDD}"]} ) { 
/memspell 4 "${SpellFireDD}"
/delay 20 
}
/if ( !${Me.Gem["${SpellSingleHPBuff}"]} ) { 
/memspell 5 "${SpellSingleHPBuff}"
/delay 20 
} 
/if ( !${Me.Gem["${SpellGroupDSBuff}"]} ) { 
/memspell 6 "${SpellGroupDSBuff}"
/delay 20 
} 
/if ( !${Me.Gem["${SpellGroupHPRegenBuff}"]} ) { 
/memspell 7 "${SpellGroupHPRegenBuff}"
/delay 20 
} 
/if ( !${Me.Gem["${SpellGroupORunBuff}"]} ) { 
/memspell 8 "${SpellGroupORunBuff}"
/delay 20 
} 
/memspell 9 "${SpellSelfManaRegen}"
/delay 20 
/echo Spells are memmed for Fire Nukes!
/stand
}

|-- Cold DD --
/if (${DOTSorDD}==0 && ${NukeType}==0) {
/if ( !${Me.Gem["${SpellCompHeal}"]} ) { 
/memspell 1 "${SpellCompHeal}"
/delay 23 
} 
/if ( !${Me.Gem["${SpellFastHeal}"]} ) { 
/memspell 2 "${SpellFastHeal}"
/delay 26
} 
/if ( !${Me.Gem["${SpellSnare}"]} ) { 
/memspell 3 "${SpellSnare}"
/delay 20 
} 
/if ( !${Me.Gem["${SpellColdDD}"]} ) { 
/memspell 4 "${SpellFireDD}"
/delay 20 
}
/if ( !${Me.Gem["${SpellSingleHPBuff}"]} ) { 
/memspell 5 "${SpellSingleHPBuff}"
/delay 20 
} 
/if ( !${Me.Gem["${SpellGroupDSBuff}"]} ) { 
/memspell 6 "${SpellGroupDSBuff}"
/delay 20 
} 
/if ( !${Me.Gem["${SpellGroupHPRegenBuff}"]} ) { 
/memspell 7 "${SpellGroupHPRegenBuff}"
/delay 20 
} 
/if ( !${Me.Gem["${SpellGroupORunBuff}"]} ) { 
/memspell 8 "${SpellGroupORunBuff}"
/delay 20 
} 
/memspell 9 "${SpellSelfManaRegen}"
/delay 20 
/echo Spells are memmed for Cold Nukes!
/stand
}

|-- DOT'S --
/if (${DOTSorDD}==1 && ${NukeType}==0) {
/if ( !${Me.Gem["${SpellCompHeal}"]} ) { 
/memspell 1 "${SpellCompHeal}"
/delay 23 
} 
/if ( !${Me.Gem["${SpellFastHeal}"]} ) { 
/memspell 2 "${SpellFastHeal}"
/delay 26
} 
/if ( !${Me.Gem["${SpellSnare}"]} ) { 
/memspell 3 "${SpellSnare}"
/delay 20 
} 
/if ( !${Me.Gem["${SpellFireDOT}"]} ) { 
/memspell 4 "${SpellFireDOT}"
/delay 20 
}
/if ( !${Me.Gem["${SpellSingleHPBuff}"]} ) { 
/memspell 5 "${SpellSingleHPBuff}"
/delay 20 
} 
/if ( !${Me.Gem["${SpellGroupDSBuff}"]} ) { 
/memspell 6 "${SpellGroupDSBuff}"
/delay 20 
} 
/if ( !${Me.Gem["${SpellGroupHPRegenBuff}"]} ) { 
/memspell 7 "${SpellGroupHPRegenBuff}"
/delay 20 
} 
/if ( !${Me.Gem["${SpellGroupORunBuff}"]} ) { 
/memspell 8 "${SpellGroupORunBuff}"
/delay 20 
} 
/memspell 9 "${SpellSelfManaRegen}"
/delay 20 
/echo Spells are memmed for Cold Nukes!
/stand
}




/return




|-----------------------------------------------------------------------------------------------------------------------------
|							Chat Activated Events
|-----------------------------------------------------------------------------------------------------------------------------
Sub Event_Chat(string ChatType,string Sender,string ChatText,Sender,ChatText)

|----------------------
| Heal
|----------------------
/if ((${ChatText.Equal[Heal]})||(${ChatText.Equal[Heal Me]})||(${ChatText.Equal[Heal Plz]})) {
	/if (${String[${Macro.Return}].NotEqual[TARGET_SUCCESS]}) /return 
	/if (${Target.Distance}<=${SpellFastHealRange}) { 
	/target ${Sender}
	/delay 1
	/call cast "${SpellFastHeal}"
	} else /tell ${Sender} Your Out of Range for ${SpellFastHeal}, Come Closer!
}

|-----------------------
|Natures Boon
|-----------------------
/if ((${ChatText.Equal[Natures Boon]})||(${ChatText.Equal[Druid Ward]})||(${ChatText.Equal[Druid Boon]})) { 
	/alt activate 257
}

|-----------------------
|Spirit of the Wood
|-----------------------
/if ((${ChatText.Equal[Wood]})||(${ChatText.Equal[SoTW]})) { 
	/alt activate 185
	/g Dont look now you got Wood!  ** Spirit of The Wood **
}

|-----------------------
|Radiant Cure
|-----------------------
/if ((${ChatText.Equal[Rad Cure]})||(${ChatText.Equal[Group Cure]})||(${ChatText.Equal[Grp Cure]})) { 
	/alt activate 153
}

|-----------------------
|MGB
|-----------------------
/if ((${ChatText.Equal[Druid MGB]})) { 
	/alt activate 35
	/chat 1 The next GROUP spell will be MGB!
}

|-----------------------
| Mana Check
|-----------------------
/if ((${ChatText.Equal[Druid Mana]})||(${ChatText.Equal[Mana Check]})) { 
/g Druid Mana = ${Me.PctMana}% 
}

|-----------------------
|Exodus
|-----------------------
/if ((${ChatText.Equal[Exodus]})||(${ChatText.Equal[Evac]})||(${ChatText.Equal[Evac NOW]})) { 
	/doevents flush
	/alt activate 43
}

|----------------------
| Group FOE
|----------------------
/if ((${ChatText.Equal[FOE]})||(${ChatText.Equal[FOE Plz]})||(${ChatText.Equal[FOE Please]})) {
	/if (${String[${Macro.Return}].NotEqual[TARGET_SUCCESS]}) /return 
	/if (${Target.Distance}<=${SpellGroupORunBuffRange}) { 
	/target ${Sender}
	/delay 1
	/g ${SpellGroupORunBuff} to >> %t's << Group!
	/call cast "${SpellGroupORunBuff}"
	} else /tell ${Sender} Your Out of Range for ${SpellGroupORunBuff}, Come Closer!
}

|----------------------
| Single SOE
|----------------------
/if ((${ChatText.Equal[SOE]})||(${ChatText.Equal[SOE Plz]})||(${ChatText.Equal[SOE Please]})) {
	/if (${String[${Macro.Return}].NotEqual[TARGET_SUCCESS]}) /return 
	/if (${Target.Distance}<=${SpellSingleORunBuffRange}) { 
	/target ${Sender}
	/delay 1
	/g ${SpellSingleORunBuff} to >> %t << 
	/call cast "${SpellSingleORunBuff}" gem9
	} else /tell ${Sender} Your Out of Range for ${SpellSingleORunBuff}, Come Closer!
}

|----------------------
| Group DS
|----------------------
/if ((${ChatText.Equal[Group DS]})||(${ChatText.Equal[Grp Druid DS]})||(${ChatText.Equal[Group Thorns]})) {
	/if (${String[${Macro.Return}].NotEqual[TARGET_SUCCESS]}) /return 
	/if (${Target.Distance}<=${SpellGroupDSBuffRange}) { 
	/target ${Sender}
	/delay 1
	/g ${SpellGroupDSBuffRange} to >> %t's << Group!
	/call cast "${SpellGroupDSBuffRange}" gem9
	} else /tell ${Sender} Your Out of Range for ${SpellGroupDSBuffRange}, Come Closer!
}

|----------------------
| Single DS
|----------------------
/if ((${ChatText.Equal[Druid DS]})||(${ChatText.Equal[Thorns]})||(${ChatText.Equal[Druid DS Plz]})) {
	/if (${String[${Macro.Return}].NotEqual[TARGET_SUCCESS]}) /return 
	/if (${Target.Distance}<=${SpellSingleDSBuffRange}) { 
	/target ${Sender}
	/delay 1
	/g ${SpellSingleDSBuff} to >> %t << 
	/call cast "${SpellSingleDSBuff}" gem9
	} else /tell ${Sender} Your Out of Range for ${SpellSingleDSBuff}, Come Closer!
}

|----------------------
| Group HP Regen Buff
|----------------------
/if ((${ChatText.Equal[Group Regen]})||(${ChatText.Equal[Grp Regen]})||(${ChatText.Equal[Grp Regen Plz]})) {
	/if (${String[${Macro.Return}].NotEqual[TARGET_SUCCESS]}) /return 
	/if (${Target.Distance}<=${SpellGroupHPRegenBuffRange}) { 
	/target ${Sender}
	/delay 1
	/g ${SpellGroupHPRegenBuff} to >> %t's << Group!
	/call cast "${SpellGroupHPRegenBuff}" gem9
	} else /tell ${Sender} Your Out of Range for ${SpellGroupHPRegenBuff}, Come Closer!
}

|----------------------
| Single HP Regen Buff
|----------------------
/if ((${ChatText.Equal[Regen]})||(${ChatText.Equal[Regen Plz]})||(${ChatText.Equal[Regen please]})) {
	/if (${String[${Macro.Return}].NotEqual[TARGET_SUCCESS]}) /return 
	/if (${Target.Distance}<=${SpellSingleHPRegenBuffRange}) { 
	/target ${Sender}
	/delay 1
	/g ${SpellSingleHPRegenBuff} to >> %t << 
	/call cast "${SpellSingleHPRegenBuff}" gem9
	} else /tell ${Sender} Your Out of Range for ${SpellSingleHPRegenBuff}, Come Closer!
}

|----------------------
| Group HP Buff
|----------------------
/if ((${ChatText.Equal[Group 9]})||(${ChatText.Equal[bot9]})||(${ChatText.Equal[G9]})) {
	/if (${String[${Macro.Return}].NotEqual[TARGET_SUCCESS]}) /return 
	/if (${Target.Distance}<=${SpellGroupHPBuffRange}) { 
	/target ${Sender}
	/delay 1
	/g ${SpellGroupHPBuff} to >> %t's << Group!
	/call cast "${SpellGroupHPBuff}" gem9
	} else /tell ${Sender} Your Out of Range for ${SpellGroupHPBuff}, Come Closer!
}

|----------------------
| Single HP Buff
|----------------------
/if ((${ChatText.Equal[p9]})||(${ChatText.Equal[p10]})||(${ChatText.Equal[Oak Skin]})) {
	/if (${String[${Macro.Return}].NotEqual[TARGET_SUCCESS]}) /return 
	/if ( !${Me.Gem["${SpellSingleHPBuff}"]} ) { 
		/memspell 9 "${SpellSingleHPBuff}"
		/delay 17 
	} 
	/if (${Target.Distance}<=${SpellSingleHPBuffRange}) { 
	/target ${Sender}
	/delay 1
	/g ${SpellSingleHPBuff} to >> %t << 
	/call cast "${SpellSingleHPBuff}"
	} else /tell ${Sender} Your Out of Range for ${SpellSingleHPBuff}, Come Closer!
}

|-----------------------
| Nuke on Command
|-----------------------
/if ((${ChatText.Equal[Druid Nuke]})||(${ChatText.Equal[All Nuke]})) { 
  /if (${Me.PctMana}<=30) {
	/1 My Mana is at ${Me.PctMana}%, holding nukes for now.
  } Else {
	/assist ${Sender}
	/delay 1s
	/call cast "${UseThisNuke}"
  }
}

|-----------------------
| Invis
|-----------------------
/if ((${ChatText.Equal[Druid Invis]})||(${ChatText.Equal[All Invis]})||(${ChatText.Equal[Invis Up]})) { 
	/chat 1 Castng Invis on myself!
	/alt activate 80
}

|-----------------------
| Gate
|-----------------------
/if ((${ChatText.Equal[Druid Gate]})||(${ChatText.Equal[All Gate]})) { 
	/if ( !${Me.Gem["Gate"]} ) { 
		/memspell 9 "Gate"
		/delay 17 
	} 
	/delay 112
	/1  Druid is going to Gate Now!
	/call Cast "Gate" 
}

|-----------------------
| Camp
|-----------------------
/if ((${ChatText.Equal[Druid Camp]})||(${ChatText.Equal[All Camp]})) { 
/dismount
/camp desktop
/endmacro
}

|-----------------------
| Mount
|-----------------------
/if ((${ChatText.Equal[Druid Mount]})||(${ChatText.Equal[All Mount]})) { 
	/if (!${Me.Mount.ID}) /call cast "${Mount}" item 4s 
}

|-----------------------
| Dismount
|-----------------------
/if ((${ChatText.Equal[Druid DisMount]})||(${ChatText.Equal[All DisMount]})) { 
	/Dismount
}

|----------------------
| Buff Me
|----------------------
/if ((${ChatText.Equal[Buff Me]})||(${ChatText.Equal[Buffs]})) {
	/if (${String[${Macro.Return}].NotEqual[TARGET_SUCCESS]}) /return 
	/if (${Target.Distance}<=${SpellSingleHPBuffRange}) { 
	/if ( !${Me.Gem["${SpellSingleHPBuff}"]} ) { 
		/memspell 9 "${SpellGroupHPBuff}"
		/delay 17 
	} 
	/call KeepHeal
	/if ( !${Me.Gem["${SpellGroupHPRegenBuff}"]} ) { 
		/memspell 8 "${SpellGroupHPRegenBuff}"
		/delay 17 
	} 
	/call KeepHeal
	/if ( !${Me.Gem["${SpellGroupDSBuff}"]} ) { 
		/memspell 7 "${SpellGroupDSBuff}"
		/delay 17 
	} 
	/call KeepHeal

	/target ${Sender}
	/delay 1
	/g Buffing >> %t << 
	/call cast "${SpellSingleHPBuff}"
	/delay 6

	/call KeepHeal

	/target ${Sender}
	/delay 1
	/call cast "${SpellGroupHPRegenBuff}"
	/delay 6

	/call KeepHeal

	/target ${Sender}
	/delay 1
	/call cast "${SpellGroupDSBuff}"
	/delay 5
	} else /tell ${Sender} Your Out of Range, Come Closer!
}

|----------------------
| Group Buff
|----------------------
/if ((${ChatText.Equal[Group Buffs]})||(${ChatText.Equal[Group Buff]})) {
	/if (${String[${Macro.Return}].NotEqual[TARGET_SUCCESS]}) /return 
	/if (${Target.Distance}<=${SpellSingleHPBuffRange}) { 
	/call KeepHeal
	/if ( !${Me.Gem["${SpellGroupHPBuff}"]} ) { 
		/memspell 9 "${SpellGroupHPBuff}"
		/delay 17 
	} 
	/call KeepHeal
	/if ( !${Me.Gem["${SpellGroupHPRegenBuff}"]} ) { 
		/memspell 8 "${SpellGroupHPRegenBuff}"
		/delay 17 
	} 
	/call KeepHeal
	/if ( !${Me.Gem["${SpellGroupDSBuff}"]} ) { 
		/memspell 7 "${SpellGroupDSBuff}"
		/delay 17 
	} 
	/call KeepHeal
	/delay 190
	/target ${Sender}
	/delay 1
	/g Buffing >> %t's << Group
	/call cast "${SpellGroupHPBuff}"
	/delay 6
	/call KeepHeal
	/target ${Sender}
	/delay 1
	/call cast "${SpellGroupHPRegenBuff}"
	/delay 6
	/call KeepHeal
	/target ${Sender}
	/delay 1
	/call cast "${SpellGroupDSBuff}"
	/delay 5
	/call DefaultSpells
	} else /tell ${Sender} Your Out of Range, Come Closer!
}

|-----------------------
| Follow Me
|-----------------------
/if ((${ChatText.Equal[Follow me]})||(${ChatText.Equal[Druid Follow Me]})||(${ChatText.Equal[Druid Follow]})) { 
/delay 5 
	/if (!${Spawn[${Sender}].ID}) { 
	/1 ${Sender} is not in zone for me to follow! 
	/return 
	} 
	/varset follname ${Sender} 
	/varset following 1 
		:targetfoll 
		/target pc ${follname} 
		/delay 1s ${Target.Name.Equal[${follname}]} 
		/if (${Target.Name.Equal[${follname}]}) { 
		/goto :Loop 
		} else /goto :targetfoll 
			:Loop 
			/face fast 
			/if (${Target.Distance}>10) /keypress forward hold 
			/if (${Target.Distance}<9) /keypress back 
			/if (!${Target.ID}) /varset following 0 
			/call CheckEvents 
			/if ((${Target.Name.Equal[${follname}]})&&(${following}>0)) { 
			/goto :Loop 
			} else { 
				/keypress forward 
				/keypress back 
			} 
} 

|-----------------------
| Wait Here
|-----------------------
/if ((${ChatText.Equal[Wait Here]})||(${ChatText.Equal[Mage Wait]})||(${ChatText.Equal[Mage Wait Here]})||(${ChatText.Equal[Stay Here]})||(${ChatText.Equal[Mage Stay Here]})||(${ChatText.Equal[Mage Stay]})) { 
/varset following 0 
/keypress forward 
/keypress back 
/timed 50 /face pc ${follname} 
} 

|-----------------------
| Help
|-----------------------
/if (${ChatText.Equal[Druid Help]}) { 
	/chat 1 Druid Help: | Buff Me | Group Buff | Folloq Me (All Bots) | Druid Follow | All Mount (All Bots) | Druid Mount | All Dismount (All Bots) | Druid Dismount | All Camp (All Bots)  | Druid Camp | All Gate (All Bots) | Druid Gate | All Invis (All Bots) | Druid Invis | All Nuke (All Bots) | Druid Nuke | P9 | Regen | Grp Regen | Thorns | Group Thorns | SOE | FOE | Evac | Mana Check (All Bots) | Druid Mana | Druid MGB | Grp Cure | Wood | Heal |
}


|-----------------------
| Port Help
|-----------------------
/if (${ChatText.Equal[Druid Port Help]}) { 
	/chat 1 Druid Teleport Help: | Port WOS | Port Bloodfields | Port Barindu | Port Natimbi | Port CS | Port WL | Port POK | Port DSP | Port EJ | Port Skyfire | Port GD | Port EK | Port SRO | Port Lava | Port TS | Port DL | Port IC | Port BB | Port Steam | Port Feerrott | Port SB | Port Nexus | Port Grimling | Port SFG | Port Tox | Port WC | Port NK |
}

|-----------------------
| WOS
|-----------------------
/if ((${ChatText.Equal[Port WOS]})) { 
	/if ( !${Me.Gem["Circle of Slaughter"]} ) { 
		/memspell 9 "Circle of Slaughter"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Slaughter"
	/g Walls of Slaughter INC [Loc 13,-943,130]
}

|-----------------------
| Circle of Bloodfields
|-----------------------
/if ((${ChatText.Equal[Port Bloodfield]})) { 
	/if ( !${Me.Gem["Circle of Bloodfields"]} ) { 
		/memspell 9 "Circle of Bloodfields"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Bloodfields"
	/g Bloodfields INC [Loc 524,-183,-565]
}

|-----------------------
| Circle of Barindu
|-----------------------
/if ((${ChatText.Equal[Port Barindu]})) { 
	/if ( !${Me.Gem["Circle of Barindu"]} ) { 
		/memspell 9 "Circle of Barindu"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Barindu"
	/g Barindu INC [Loc -515,209,-119]
}

|-----------------------
| Circle of Natimbi
|-----------------------
/if ((${ChatText.Equal[Port Natimbi]})) { 
	/if ( !${Me.Gem["Circle of Natimbi"]} ) { 
		/memspell 9 "Circle of Natimbi"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Natimbi"
	/g Walls of Slaughter INC [Loc -853,-1557,237]
}

|-----------------------
| Circle of Cobalt Scar
|-----------------------
/if ((${ChatText.Equal[Port CS]})) { 
	/if ( !${Me.Gem["Circle of Cobalt Scar"]} ) { 
		/memspell 9 "Circle of Cobalt Scar"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Cobalt Scar"
	/g Cobalt Scar INC [-1065,-1634,299 ]
}

|-----------------------
| Circle of Wakening Lands
|-----------------------
/if ((${ChatText.Equal[Port WL]})) { 
	/if ( !${Me.Gem["Circle of Wakening Lands"]} ) { 
		/memspell 9 "Circle of Wakening Lands"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Wakening Lands"
	/g Wakening Lands INC [Loc -3040,-3032,28]
}

|-----------------------
| Circle of Knowledge
|-----------------------
/if ((${ChatText.Equal[Port POK]})) { 
	/if ( !${Me.Gem["Circle of Knowledge"]} ) { 
		/memspell 9 "Circle of Knowledge"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Knowledge"
	/g Plane of Knowledge INC [Loc -368,1335,-125]
}

|-----------------------
| Circle of Dawnshroud
|-----------------------
/if ((${ChatText.Equal[Port DSP]})) { 
	/if ( !${Me.Gem["Circle of Dawnshroud"]} ) { 
		/memspell 9 "Circle of Dawnshroud"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Dawnshroud"
	/g Dawnshroud Peek INC [Loc 325,-996,121]
}

|-----------------------
| Wind of the South
|-----------------------
/if ((${ChatText.Equal[Port EJ]})) { 
	/if ( !${Me.Gem["Wind of the South"]} ) { 
		/memspell 9 "Wind of the South"
		/delay 17 
	} 
	/delay 112
	/call cast "Wind of the South"
	/g Emerald Jungle INC [Loc -3100,3500,-340]
}

|-----------------------
| Wind of the North
|-----------------------
/if ((${ChatText.Equal[Port Skyfire]})) { 
	/if ( !${Me.Gem["Wind of the North"]} ) { 
		/memspell 9 "Wind of the North"
		/delay 17 
	} 
	/delay 112
	/call cast "Wind of the North"
	/g Skyfire INC [Loc -3186,2732,-161]
}

|-----------------------
| Circle of Great Divide
|-----------------------
/if ((${ChatText.Equal[Port GD]})) { 
	/if ( !${Me.Gem["Circle of Great Divide"]} ) { 
		/memspell 9 "Circle of Great Divide"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Great Divide"
	/g Great Divine INC [Loc -3766,3651,-237]
}

|-----------------------
| Succor East
|-----------------------
/if ((${ChatText.Equal[Port EK]})) { 
	/if ( !${Me.Gem["Succor: East"]} ) { 
		/memspell 9 "Succor: East"
		/delay 17 
	} 
	/delay 30
	/call cast "Succor: East"
	/g East Karana INC [Loc 1359,375,4]
}

|-----------------------
| Succor Ro
|-----------------------
/if ((${ChatText.Equal[Port SRO]})) { 
	/if ( !${Me.Gem["Succor: Ro"]} ) { 
		/memspell 9 "Succor: Ro"
		/delay 17 
	} 
	/delay 30
	/call cast "Succor: Ro"
	/g Southern Ro INC [Loc -2034,317,-19]
}

|-----------------------
| Succor
|-----------------------
/if ((${ChatText.Equal[Succor]})) { 
	/if ( !${Me.Gem["Succor"]} ) { 
		/memspell 9 "Succor"
		/delay 17 
	} 
	/delay 30
	/call cast "Succor"
	/g Zone Safe Spot INC!
}

|-----------------------
| Succor Lavastorm
|-----------------------
/if ((${ChatText.Equal[Port Lava]})) { 
	/if ( !${Me.Gem["Succor: Lavastorm"]} ) { 
		/memspell 9 "Succor: Lavastorm"
		/delay 17 
	} 
	/delay 30
	/call cast "Succor: Lavastorm"
	/g Lavastorm INC [Loc 1014,1389,131]
}

|-----------------------
| Circle of Twilight
|-----------------------
/if ((${ChatText.Equal[Port TS]})) { 
	/if ( !${Me.Gem["Circle of Twilight"]} ) { 
		/memspell 9 "Circle of Twilight"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Twilight"
	/g Twilight Sea INC [Loc -656,-125,-22]
}

|-----------------------
| Circle of the Combines
|-----------------------
/if ((${ChatText.Equal[Port DL]})) { 
	/if ( !${Me.Gem["Circle of the Combines"]} ) { 
		/memspell 9 "Circle of the Combines"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of the Combines"
	/g Dreadlands INC [Loc 2484,7717,1051]
}

|-----------------------
| Circle of Iceclad
|-----------------------
/if ((${ChatText.Equal[Port IC]})) { 
	/if ( !${Me.Gem["Circle of Iceclad"]} ) { 
		/memspell 9 "Circle of Iceclad"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Iceclad"
	/g Iceclad INC [Loc -630,4925,113]
}

|-----------------------
| Succor Butcher
|-----------------------
/if ((${ChatText.Equal[Port BB]})) { 
	/if ( !${Me.Gem["Succor Butcher"]} ) { 
		/memspell 9 "Succor Butcher"
		/delay 17 
	} 
	/delay 30
	/call cast "Succor Butcher"
	/g Butcherblock INC [Loc -2135,1984,3]
}

|-----------------------
| Circle of Steamfont
|-----------------------
/if ((${ChatText.Equal[Port Steam]})) { 
	/if ( !${Me.Gem["Circle of Steamfont"]} ) { 
		/memspell 9 "Circle of Steamfont"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Steamfont"
	/g Steamfont INC [Loc -1779,1668,-104]
}

|-----------------------
| Circle of Feerrott
|-----------------------
/if ((${ChatText.Equal[Port Feerrott]})) { 
	/if ( !${Me.Gem["Circle of Feerrott"]} ) { 
		/memspell 9 "Circle of Feerrott"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Feerrott"
	/g Feerrott INC [Loc 367,-1885,16]
}

|-----------------------
| Circle of Stonebrunt
|-----------------------
/if ((${ChatText.Equal[Port SB]})) { 
	/if ( !${Me.Gem["Circle of Stonebrunt"]} ) { 
		/memspell 9 "Circle of Stonebrunt"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Stonebrunt"
	/g Stonebrunt INC [Loc -4531,673,0]
}

|-----------------------
| Circle of the Nexus
|-----------------------
/if ((${ChatText.Equal[Port Nexus]})) { 
	/if ( !${Me.Gem["Circle of the Nexus"]} ) { 
		/memspell 9 "Circle of the Nexus"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of the Nexus"
	/g Nexus INC [Loc 0,0,-28]
}

|-----------------------
| Circle of Grimling
|-----------------------
/if ((${ChatText.Equal[Port Grimling]})) { 
	/if ( !${Me.Gem["Circle of Grimling"]} ) { 
		/memspell 9 "Circle of Grimling"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Grimling"
	/g Grimling Forest INC [Loc 690,-1170,13]
}

|-----------------------
| Circle of Surefall Glade
|-----------------------
/if ((${ChatText.Equal[Port SFG]})) { 
	/if ( !${Me.Gem["Circle of Surefall Glade"]} ) { 
		/memspell 9 "Circle of Surefall Glade"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Surefall Glade"
	/g Surefall Glade INC [Loc -209,-391,9]
}

|-----------------------
| Circle of Toxxulia
|-----------------------
/if ((${ChatText.Equal[Port Tox]})) { 
	/if ( !${Me.Gem["Circle of Toxxulia"]} ) { 
		/memspell 9 "Circle of Toxxulia"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Toxxulia"
	/g Toxxulia Forest INC [Loc ^^^^^]
}

|-----------------------
| Circle of Commons
|-----------------------
/if ((${ChatText.Equal[Port WC]})) { 
	/if ( !${Me.Gem["Circle of Commons"]} ) { 
		/memspell 9 "Circle of Commons"
		/delay 17 
	} 
	/delay 112
	/call cast "Circle of Commons"
	/g West Commonlands INC [Loc 478,1427,-48]
}

|-----------------------
| Succor North
|-----------------------
/if ((${ChatText.Equal[Port NK]})) { 
	/if ( !${Me.Gem["Succor: North"]} ) { 
		/memspell 9 "Succor: North"
		/delay 17 
	} 
	/delay 30
	/call cast "Succor: North"
	/g North Karana INC [Loc -2706,-1494,-4]
}
/return

A_Druid_00
Macro Maker Extraordinaire
Posts: 2378
Joined: Tue Jul 13, 2004 12:45 pm
Location: Rolling on the Lawn Farting

Post by A_Druid_00 » Thu Nov 11, 2004 1:54 pm

Not bad for a first mac. I think it could use some cleaning up, but it's not terrible by any means. It's just sort of redundant to add a |Comment Snare Spell, when the /declare variable is named well enough. If it was like:

Code: Select all

|Snare Spell
/declare SS  blahblahblah
I could see a need for it. But you did a good enough job naming your declares so that they're easy to understand, rendering the commenting unnecessary. That's just my preference though, I'm guessing you originally had the comments in there so that you could easily find your way around while building this mac.

You should probably /declare your tanks and casters also. It would clean up your heal logic a lot. Take a look at Neolesh's RaidHealer macro for an easy way to designate Tanks vs. casters with a declare.

Also, I'm not seeing where you define whether or not you're outdoors vs. indoors. Maybe I'm missing it, but if you don't have something like that you're going to loop endlessly if your SoE happens to wear off indoors. Look at my Raid Druid macro for a simple event setup that will set a flag when you get a spell will not hold message, and reset that flag every time you zone.
[quote]<DigitalMocking> man, A_Druid_00 really does love those long ass if statements
<dont_know_at_all> i don't use his macro because i'm frightened of it[/quote]
[quote][12:45] <dont_know_at_all> never use a macro when you can really fuck up things with a plugin[/quote]

SirCheese
orc pawn
orc pawn
Posts: 13
Joined: Tue Sep 28, 2004 8:02 pm
Location: Washington DC

Post by SirCheese » Fri Nov 12, 2004 8:48 am

Thank you for your post A_Druid... I did get carried away with the comments. It was to make it easier to troubleshoot things that did not work. I tested each sub or loop etc before moving on. I would put the comment there when it was complete so i knew it was working and if i needed to find it later i could do it fast.

The outdoors.. correct i overlooked it. I will add it tonight. Thats why i posted code here for good peeps like yourself to add input. Input like you gave will let me or other people take code and keep bettering it. Thanks.

If i declare the tank vs caster.. it will clean up logic u say. What will this do for me? Make the macro faster in choosing when to heal? Just woundering. Still learning a lot so any input is welcomed.

Thanks again

A_Druid_00
Macro Maker Extraordinaire
Posts: 2378
Joined: Tue Jul 13, 2004 12:45 pm
Location: Rolling on the Lawn Farting

Post by A_Druid_00 » Fri Nov 12, 2004 9:15 am

Other than making it look a lot less convoluted, it won't do too much for you. But, it will make it easier for people who come along behind you shuffle classes from tank to healer without having to delve into your sub to do it. Example: I only like to have SK, Pal, and War in my tank list, and I treat all others as casters. Integrating that into your macro would be a lot more difficult than modifying a /declare.

Plus, which looks less busy?

This:

Code: Select all

    /if (${CasterList.Find[|${Target.Class}|]}) { 
       /call HealcheckCaster 
       /return 
    } 
    
    /if (${TankList.Find[|${Target.Class}|]}) { 
       /call HealcheckTank 
       /return 
    } 
Or this:

Code: Select all

/if (${Group[${i}].Class.Name.Equal[Cleric]} || ${Group[${i}].Class.Name.Equal[Druid]} || ${Group[${i}].Class.Name.Equal[Wizard]} || ${Group[${i}].Class.Name.Equal[Magician]} || ${Group[${i}].Class.Name.Equal[Necromancer]} || ${Group[${i}].Class.Name.Equal[Shaman]} || ${Group[${i}].Class.Name.Equal[Enchanter]}) /if (${Group[${i}].PctHPs}<=${HealCasterAT}) { 
   /target pc ${Group[${i}]} 
      /if (${Me.CurrentMana}<${Spell[${SpellFastHeal}].Mana}) { 
         /echo Not Enuf Mana to Heal ${Group[${i}]} 
      } else /if (${Target.Distance}<=100) { 
         /gsay ${SpellFastHeal} on >> %T << 
         /call cast "${SpellFastHeal}" 
         } 
} 

/if (${Group[${i}].Class.Name.Equal[Warrior]} || ${Group[${i}].Class.Name.Equal[Monk]} || ${Group[${i}].Class.Name.Equal[Rouge]} || ${Group[${i}].Class.Name.Equal[Ranger]} || ${Group[${i}].Class.Name.Equal[Beast]} || ${Group[${i}].Class.Name.Equal[Shadow Knight]} || ${Group[${i}].Class.Name.Equal[Paladin]}) /if (${Group[${i}].PctHPs}<=${MeleeHeals} && ${Group[${i}].Name.NotEqual[${MainAssist}]}) { 
   /target pc ${Group[${i}]} 
      /if (${Me.CurrentMana}<${Spell[${SpellCompHeal}].Mana}) { 
         /echo Not Enuf Mana to Heal ${Group[${i}]} 
      } else /if (${Target.Distance}<=100) { 
         /gsay ${SpellCompHeal} on >> %T << 
         /call cast "${SpellCompHeal}" 
         } 
} 
[quote]<DigitalMocking> man, A_Druid_00 really does love those long ass if statements
<dont_know_at_all> i don't use his macro because i'm frightened of it[/quote]
[quote][12:45] <dont_know_at_all> never use a macro when you can really fuck up things with a plugin[/quote]

A_Druid_00
Macro Maker Extraordinaire
Posts: 2378
Joined: Tue Jul 13, 2004 12:45 pm
Location: Rolling on the Lawn Farting

Post by A_Druid_00 » Fri Nov 12, 2004 9:45 am

Oh, I added a !${Me.Moving} check to my autosit logic for my macros, so that I'm not constantly trying to sit while traversing a zone and LOM. It can't hurt to have it in yours either.
[quote]<DigitalMocking> man, A_Druid_00 really does love those long ass if statements
<dont_know_at_all> i don't use his macro because i'm frightened of it[/quote]
[quote][12:45] <dont_know_at_all> never use a macro when you can really fuck up things with a plugin[/quote]

User avatar
Cr4zyb4rd
Plugins Czar
Posts: 1449
Joined: Tue Jul 20, 2004 11:46 am

Post by Cr4zyb4rd » Fri Nov 12, 2004 11:57 pm

LOTS of redundant code. Any time you find yourself doing the exact same thing 3+ times with just a different spell/item/wtf it's time to write a subroutine or /for loop.

Otherwise it looks really good, can't add much to what A_D said.

captainhollywooddave
orc pawn
orc pawn
Posts: 10
Joined: Sun Nov 21, 2004 7:24 am

heal pets?

Post by captainhollywooddave » Sat Nov 27, 2004 12:16 pm

what would you have to do to make this heal pets also, i got this working and when i put my pet as main tank it wont heal. The pets name has a 00 after it ie. goner00 . Wondering if there is something easy that I could do to add this feature.

Thanks

Birdbrain
a lesser mummy
a lesser mummy
Posts: 45
Joined: Sat Oct 23, 2004 1:40 pm

Post by Birdbrain » Sat Dec 04, 2004 9:22 pm

great macro.

pandera13
orc pawn
orc pawn
Posts: 15
Joined: Sat Mar 05, 2005 11:07 pm

Post by pandera13 » Tue Mar 08, 2005 12:35 pm

Ok I have a really stupid question. In the following code it says in group then trys to cast. What I noticed is that if you are stunned or interrupted it spams the heck out of the group with so and so being healed.

Code: Select all

   /gsay ${SpellFastHeal} on >> %T << 
   /call cast "${SpellFastHeal}" gem2 
I found the casterbot.mac http://www.macroquest2.com/phpBB2/viewtopic.php?t=1329 in the outdated section which I think will put me in the right direction. What it looks like is I will have to do this for each individual spell cast, due to the complete heal/ fast heal messages. I did a quick edit on what I think will accomplish a groupday once at 1st cast then again at the 6th/variable set cast.

Code: Select all

#define CAST_STUNNED 6
:StartCasting 
/if (${TankHealType}==1) { 
	/if (${Me.CurrentMana}<${Spell[${SpellCompHeal}].Mana}) { 
	/echo Not Enuf Mana to Heal ${Group[${i}]} 
	} else /if (${Target.Distance}<=100) { 
	/call cast "${SpellCompHeal}" gem2 4s 
      
      |Deal with any error 
      /if n $return==CAST_STUNNED /goto :CastStunned 
      /goto :CastFinished 
 
      :CastStunned 
         /varadd StunCount 1 
         /if n($StunCount=$StunMax | | $StunCount=1) /gsay ${SpellFastHeal} to %T 
         /if n $StunCount<$StunMax /goto :StartCasting        
         /varset StunCount 0 
         /goto :CastFinished 

:CastFinished 
 
Not sure if that makes any sense or not. I am fairly new to coding so forgive the basic questions/screw ups.