spellcast.inc --- This will cast a spell reliably for you.

A forum for macro code snippets to be used in writing other macros. Post routines or .inc files here only, completed macros go to the Macro Depot.

Moderator: MacroQuest Developers

ml2517
a grimling bloodguard
a grimling bloodguard
Posts: 1216
Joined: Wed Nov 12, 2003 1:12 am

Post by ml2517 » Sat Apr 17, 2004 2:41 am

Update:
Threw in the CAST_SUCCESS bugfix.

see below
Last edited by ml2517 on Sat Apr 17, 2004 1:35 pm, edited 1 time in total.

wassup
Official Guardian and Writer of TFM
Official Guardian and Writer of TFM
Posts: 1487
Joined: Sat Oct 26, 2002 5:15 pm

Post by wassup » Sat Apr 17, 2004 12:22 pm

Few suggestions for this to simplify it a bit:

Change:

Code: Select all

/newif ${String["${Me.Casting}"].NotEqual["NULL"]} {
to

Code: Select all

/newif ${Me.Casting.ID} {

Change:

Code: Select all

/newif ${String["${Macro.Return}"].Equal["CAST_RESTART"]} /goto :StartCast 
   /newif ${String["${Macro.Return}"].NotEqual["NULL"]} /return ${Macro.Return}

to

Code: Select all

/docommand ${If[${Macro.Return.Equal[CAST_RESTART]},/goto :StartCast,/return ${Macro.Return}]}
in Macro, Return is a string type so you don't need to change it to a String

Change:

Code: Select all

/newif ${String["${Me.Gem["@SpellName"]}"].Equal["NULL"]} /return CAST_UNKNOWNSPELL
to

Code: Select all

/newif !${Me.Gem[@SpellName]} /return CAST_UNKNOWNSPELL

ml2517
a grimling bloodguard
a grimling bloodguard
Posts: 1216
Joined: Wed Nov 12, 2003 1:12 am

Post by ml2517 » Sat Apr 17, 2004 1:31 pm

Updated:
Threw in the changes that Wassup suggested except this one:


/newif ${String["${Macro.Return}"].Equal["CAST_RESTART"]} /goto :StartCast
/newif ${String["${Macro.Return}"].NotEqual["NULL"]} /return ${Macro.Return}

to

/docommand ${If[${Macro.Return.Equal[CAST_RESTART]},/goto :StartCast,/return ${Macro.Return}]}

This would never return CAST_SUCCESS, so changed it keeping in mind Macro.Return was a string.


See below.
Last edited by ml2517 on Tue Apr 20, 2004 7:35 pm, edited 2 times in total.

wassup
Official Guardian and Writer of TFM
Official Guardian and Writer of TFM
Posts: 1487
Joined: Sat Oct 26, 2002 5:15 pm

Post by wassup » Sat Apr 17, 2004 2:09 pm

Woops... Sorry about the /docommand one... didn't catch that other return.

There is one more you can simplify... Not trying to hijack anything here, just suggesting improvements.

Code: Select all

/newif ${String["${Me.Gem["@SpellName"]}"].Equal["NULL"]} { 
      /memspell 5 "@SpellName" 
      /delay 5s 
      }
to

Code: Select all

/newif (!${Me.Gem["@SpellName"]}) { 
      /memspell 5 "@SpellName" 
      /delay 5s 
      }
I'm not sure the ( ) is needed.

ml2517
a grimling bloodguard
a grimling bloodguard
Posts: 1216
Joined: Wed Nov 12, 2003 1:12 am

Post by ml2517 » Sat Apr 17, 2004 2:24 pm

I think now that Lax fixed the ! it probably isn't but doesn't really hurt. Changed your suggestion above.

ml2517
a grimling bloodguard
a grimling bloodguard
Posts: 1216
Joined: Wed Nov 12, 2003 1:12 am

Post by ml2517 » Tue Apr 20, 2004 7:36 pm

Updated:
Fixed all /newif's to have parenthesis.

Code: Select all

| SpellCast.inc 
| This will cast a spell reliably for you... 
|
| Usage: 
|       /call Cast "spellname|itemname|AA#" [item|activate]
|
| This would essentially: /cast "Death Peace"
| example: /call Cast "Death Peace" 
|
| This would essentially: /cast item "White Rope Bridle"
| example: /call Cast "White Rope Bridle" item 
|
| This would essentially: /alt activate 169
| example: /call Cast "169" activate
|
| It will return the following values: 
| CAST_SUCCESS 
| CAST_UNKNOWNSPELL 
| CAST_OUTOFMANA 
| CAST_OUTOFRANGE 
| CAST_CANNOTSEE 
| CAST_STUNNED 
| CAST_RESISTED 
| CAST_TOOK2LONG 
| CAST_ABILITYNOTREADY
|
| New Vars Modification 
| Plazmic's no globals needed version 
| 
| Oct 09, 2003 - Updated to work with new vars and $char(casting) -gf 
| Oct 11, 2003 - switched some logic, removed defines -gf 
| Oct 15, 2003 - Item support added by -EqMule 
| XXX xx, xxxx - Modified to add automeming of spells. -Goofmester1 
| Dec 26, 2003 - fd fail 1 added -m0nk 
| Jan 01, 2004 - timeout(5s) added to stop "dead-time" -m0nk 
| Jan 01, 2004 - switchd fdfail to a standing check. -m0nk 
| Jan 01, 2004 - added silence checking as a stun check -m0nk 
| Feb 17, 2004 - added AA activate capabilities -ml2517
| Apr 11, 2004 - Updated for new Parm system -ml2517
| Apr 12, 2004 - Will spit out a different message on immune to slows. -ml2517
| Apr 16, 2004 - Removed /sendkeys and replaced with /keypress. -ml2517
| Apr 17, 2004 - Various code enhancements. -Wassup
| Apr 20, 2004 - Updated all of the /if's to have parenthesis. -ml2517
|

#event Fizzle "Your spell fizzles" 
#event Interrupt "Your casting has been interrupted" 
#event Interrupt "Your spell is interrupted." 
#event Recover "You haven't recovered yet..." 
#event Recover "Spell recovery time not yet met." 
#event Resisted "Your target resisted the " 
#event OutOfMana "Insufficient Mana to cast this spell!" 
#event OutOfRange "Your target is out of range, get closer!" 
#event NoLOS "You cannot see your target." 
#event Stunned "You cannot cast while stunned" 
#event Stunned "You *CANNOT* cast spells, you have been silenced!" 
#event Standing "You must be standing to cast a spell" 
#event Standing "has fallen to the ground." 
#event Collapse "Your gate is too unstable, and collapses." 
#event Ability "You can use the ability "
#event ImmuneSlow "Your target is immune to changes in its attack speed."


Sub Cast(SpellName,Item) 
   /if (!${Defined[CastGiveUpTime]}) /declare CastGiveUpTime timer 
   /if (!${Defined[Item]}) /declare Item local
   /if (${Me.Speed}>0) {
       /keypress forward 
       /keypress back 
       /delay 8 
   } else {
       /delay 4
   }
   /if ((${String["@Item"].Equal["Item"]})||(${String["@Item"].Equal["Activate"]})) /goto :StartCast 

   /if (!${Me.Gem["@SpellName"]}) { 
      /memspell 5 "@SpellName" 
      /delay 5s 
   } 
   :StartCast 
      /varset CastGiveUpTime 5s 
   :CastNow 
      /if (${String["@Item"].Equal["Item"]}) { 
         /call ClearReturnValue 
         /cast item "@SpellName" 

      } else /if (${String["@Item"].Equal["Activate"]}) { 
         /call ClearReturnValue 
         /alt activate "@SpellName" 
      } else { 
         /if (!${Me.Gem["@SpellName"]}) /return CAST_UNKNOWNSPELL
         /call ClearReturnValue 
         /if (!${Me.SpellReady["@SpellName"]}) { 
            /if (@CastGiveUpTime==0) /return CAST_TOOK2LONG
            /delay 1 
            /goto :CastNow 
            } 
         /cast "@SpellName" 
         } 
   :WaitCast 
      /if (${Me.Casting.ID}) { 
      /delay 1 
      /goto :WaitCast 
      } 
   /delay 1 
   /doevents Fizzle 
   /doevents Interrupt 
   /doevents Interrupt 
   /doevents Recover 
   /doevents Standing 
   /doevents OutOfRange 
   /doevents OutOfMana 
   /doevents NoLOS 
   /doevents Resisted
   /doevents ImmuneSlow
   /doevents Stunned
   /doevents Collapse
   /doevents Ability
   /if (${Macro.Return.Equal["CAST_RESTART"]}) /goto :StartCast 
   /if (${Macro.Return.NotEqual["NULL"]}) /return ${Macro.Return}
/return CAST_SUCCESS

Sub ClearReturnValue 
/return NULL

Sub Event_Fizzle 
/return CAST_RESTART

Sub Event_Interrupt 
/return CAST_RESTART

Sub Event_Recover 
   /delay 5 
/return CAST_RESTART

Sub Event_Standing 
   /stand 
/return CAST_RESTART

Sub Event_Collapse 
/return CAST_RESTART

Sub Event_OutOfMana 
/return CAST_OUTOFMANA

Sub Event_OutOfRange 
/return CAST_OUTOFRANGE

Sub Event_NoLOS 
/return CAST_CANNOTSEE

Sub Event_Stunned 
   /delay 1s 
/return CAST_RESTART

Sub Event_Resisted 
/return CAST_RESISTED

Sub Event_ImmuneSlow
/return CAST_IMMUNESLOW

Sub Event_Ability
/return CAST_ABILITYNOTREADY

desnts
RTFM, then ask again
Posts: 58
Joined: Wed Apr 30, 2003 4:40 pm

Post by desnts » Sun Apr 25, 2004 11:24 am

what would be a easy way to take this inc and make it into its own macro so that u can just start the macro to chain cast, complete healing or any other spell.

usefull for boxing a healer on a raid situation wher ehe is chain casting, or skill gain.

User avatar
Pax
a lesser mummy
a lesser mummy
Posts: 52
Joined: Fri Dec 19, 2003 11:04 am
Location: Denmark

Post by Pax » Sun Apr 25, 2004 11:35 am

i really wouldnt make this into a macro for chaincasting, you should rather go to the macrodepot and find a macro there to rebuilt or take it as it is.

Article22
decaying skeleton
decaying skeleton
Posts: 6
Joined: Fri Feb 27, 2004 4:21 am

Post by Article22 » Thu Apr 29, 2004 12:26 pm

Just being picky on what must be one of the most used macros around! :D

Couple of minor points...

Code: Select all

   /doevents Fizzle 
   /doevents Interrupt 
   /doevents Interrupt 
   /doevents Recover 
Do you need both Interrupt events?

Plus the comment text should be updated to include the CAST_IMMUNESLOW return.

Trying to get my head around the new params atm, good to see other people are up to speed.

Take it easy.
Article22

ml2517
a grimling bloodguard
a grimling bloodguard
Posts: 1216
Joined: Wed Nov 12, 2003 1:12 am

Post by ml2517 » Thu Apr 29, 2004 2:03 pm

I think there was a reason they had the /doevents doubled up like that. I'm guessing it was because it processes one /doevent for that category at a time and they wanted to make sure there weren't any old ones queued up. Not sure though. I forgot to update the spellcast.inc I have posted in the advbot thread, its been updated for the new var system. I'll post it here now.

ml2517
a grimling bloodguard
a grimling bloodguard
Posts: 1216
Joined: Wed Nov 12, 2003 1:12 am

Post by ml2517 » Thu Apr 29, 2004 2:06 pm

Posted the new version in the new snippets forum.

oddball
orc pawn
orc pawn
Posts: 14
Joined: Sat May 29, 2004 6:21 pm

Post by oddball » Sat May 29, 2004 6:46 pm

I added the code and a return value for mobs that are immune to root/snare.
CAST_IMMUNEROOT is the new return value.

Here's the whole thing. It's based on the code in the first post

Code: Select all

| 
| SpellCast.inc 
| 
| Last Modified: 5/14/2004 9:30pm 
| Modified by oddball: 5/29/2004 to detect root immunity
| This will cast a spell reliably for you... 
| 
| Usage: 
|       /call Cast "spellname|itemname|AA#|AAskillname" [item|activate|gem#] [nocheck|dismount|nodismount] 
| 
| If no dismount or nodismount is provided it defaults to nodismount. 
| 
| This would essentially: /cast "Death Peace" 
| example: /call Cast "Death Peace" 
| 
| This would essentially: Check for the spell in your spell slots, if not there mem it to spell 
|                         gem slot 7 and then /cast "Death Peace" 
| example: /call Cast "Death Peace" gem7 
| 
| This would essentially: /cast item "White Rope Bridle" 
| example: /call Cast "White Rope Bridle" item 
| 
| This would essentially: /alt activate 169 
| example: /call Cast "169" activate 
|  or... 
| example: /call Cast "Divine Arbitration" activate 
| 
| This would dismount if your target was lost or dies mid-cast, cast Burn and mem it to spell 
| slot 3 if it wasn't already memmed: 
| example: /call Cast "Burn" gem3 dismount 
| 
| This would not dismount but would move you back and forth if your target was lost or dies mid-cast, cast Burn and mem 
| it to spell slot 3 if it wasn't already memmed: 
| example: /call Cast "Burn" gem3 nodismount 
| 
| 'nocheck' is the default for the "loss of target/target dying" value.  If nocheck is specified (Or nothing was specified) 
| no target checking will be performed and spellcast.inc should act like the spellcast.inc of the past. 
| 
| It will return the following values: 
| CAST_SUCCESS 
| CAST_UNKNOWNSPELL 
| CAST_OUTOFMANA 
| CAST_OUTOFRANGE 
| CAST_CANNOTSEE 
| CAST_STUNNED 
| CAST_RESISTED 
| CAST_TOOK2LONG 
| CAST_ABILITYNOTREADY 
| CAST_IMMUNESLOW 
| CAST_LOSTTARGET 
| CAST_IMMUNEROOT 
| 
| New Vars Modification 
| Plazmic's no globals needed version 
| 
| Oct 09, 2003 - Updated to work with new vars and $char(casting) -gf 
| Oct 11, 2003 - switched some logic, removed defines -gf 
| Oct 15, 2003 - Item support added by -EqMule 
| XXX xx, xxxx - Modified to add automeming of spells. -Goofmester1 
| Dec 26, 2003 - fd fail 1 added -m0nk 
| Jan 01, 2004 - timeout(5s) added to stop "dead-time" -m0nk 
| Jan 01, 2004 - switchd fdfail to a standing check. -m0nk 
| Jan 01, 2004 - added silence checking as a stun check -m0nk 
| Feb 17, 2004 - added AA activate capabilities -ml2517 
| Apr 11, 2004 - Updated for new Parm system -ml2517 
| Apr 12, 2004 - Will spit out a different message on immune to slows. -ml2517 
| Apr 16, 2004 - Removed /sendkeys and replaced with /keypress. -ml2517 
| Apr 17, 2004 - Various code enhancements. -Wassup 
| Apr 20, 2004 - Updated all of the /if's to have parenthesis. -ml2517 
| Apr 25, 2004 - Updated to new variable system. -ml2517 
| Apr 29, 2004 - Fixed Item problem -ml2517 
| Apr 29, 2004 - Changed the alt ability to use AltAbilityReady instead of an event. -ml2517 
| May 02, 2004 - Added the ability to specify a gem slot to mem spells to. -ml2517 
| May 10, 2004 - Updated for new event system. 
| May 12, 2004 - Added suggestions for loss of target and stun handling change. -ml2517 
| May 13, 2004 - Activate now accepts AA skill by name or number. -ml2517 
| May 14, 2004 - Added the nocheck value, it is the default. This bypasses the target checking code. -ml2517 
| 

#event Fizzle "#*#Your spell fizzles#*#" 
#event Interrupt "#*#Your casting has been interrupted#*#" 
#event Interrupt "#*#Your spell is interrupted.#*#" 
#event Recover "#*#You haven't recovered yet...#*#" 
#event Recover "#*#Spell recovery time not yet met.#*#" 
#event Resisted "#*#Your target resisted the #*#" 
#event OutOfMana "#*#Insufficient Mana to cast this spell!#*#" 
#event OutOfRange "#*#Your target is out of range, get closer!#*#" 
#event NoLOS "#*#You cannot see your target.#*#" 
#event Stunned "#*#You cannot cast while stunned#*#" 
#event Stunned "#*#You *CANNOT* cast spells, you have been silenced!#*#" 
#event Standing "#*#You must be standing to cast a spell#*#" 
#event Standing "#*#has fallen to the ground.#*#" 
#event Collapse "#*#Your gate is too unstable, and collapses.#*#" 
#event ImmuneSlow "#*#Your target is immune to changes in its attack speed.#*#" 
#event ImmuneRoot "#*#Your target is immune to changes in its run speed.#*#"


Sub Cast(SpellName,ItemFlag,DismountFlag) 
   /declare HaveTarget int local 0 
   /declare CastBarTime timer local 
   /declare CastCurrLocY float local 0 
   /declare CastCurrLocX float local 0 
   /varset CastCurrLocY ${Me.Y} 
   /varset CastCurrLocX ${Me.X} 
   /if (${Target.ID}>0) /varset HaveTarget 1 
   /if (!${Defined[CastGiveUpTime]}) /declare CastGiveUpTime timer local 
   /if (!${Defined[ItemFlag]}) /declare ItemFlag string local 
   /if (!${Defined[DismountFlag]}) { 
       /declare DismountFlag string local nocheck 
       /if (${ItemFlag.Find["dismount"]}) /varset DismountFlag ${ItemFlag} 
   } 
   /if (!${Me.Standing} && !${Me.Mount.ID}>0) /stand 
   /if (${Me.Moving}) { 
       /keypress forward 
       /keypress back 
       /delay 8 
   } else { 
       /delay 4 
   } 
   /if (${ItemFlag.Equal["Item"]} || ${ItemFlag.Equal["Activate"]}) /goto :StartCast 

   /if (!${Me.Gem["${SpellName}"]}) { 
       /if (${ItemFlag.Find[gem]}) { 
           /if (${Int[${ItemFlag.Right[1]}]}>0 && ${Int[${ItemFlag.Right[1]}]}<9) { 
               /memspell ${ItemFlag.Right[1]} "${SpellName}" 
               /delay 5s 
           } else { 
               /goto :GenericMem 
           } 
       } else {        
           :GenericMem 
           /memspell 1 "${SpellName}" 
           /delay 5s 
       } 

   } 
   :StartCast 
      /varset CastGiveUpTime 5s 
   :CastNow 
      /if (${ItemFlag.Equal["Item"]}) { 
         /call ClearReturnValue 
         /cast item "${SpellName}" 
      } else /if (${ItemFlag.Equal["Activate"]}) { 
         /call ClearReturnValue 
         /if (!${Me.AltAbilityReady[${SpellName}]}) /return CAST_ABILITYNOTREADY 
         /alt activate ${AltAbility[${SpellName}].ID} 
         /varset CastBarTime ${Me.Casting.CastTime} 
      } else { 
         /if (!${Me.Gem["${SpellName}"]}) /return CAST_UNKNOWNSPELL 
         /call ClearReturnValue 
         /if (!${Me.SpellReady["${SpellName}"]}) { 
            /if (${CastGiveUpTime}==0) /return CAST_TOOK2LONG 
            /delay 1 
            /goto :CastNow 
         } 
         /cast "${SpellName}" 
         /varset CastBarTime ${Math.Calc[${Me.Casting.CastTime}*10]} 
      } 
   :WaitCast 
      /if (${Me.Casting.ID}) { 
         /if ((!${Target.ID}>0 || ${Target.Type.Equal[CORPSE]}) && !${DismountFlag.Find[nocheck]} && ${HaveTarget}==1) { 
             /if (${Me.Mount.ID}>0) { 
                 /if (${DismountFlag.Equal[dismount]}) { 
                     /dismount 
                 } else { 
                     /if (!${ItemFlag.Equal["Item"]}) { 
                         /if (${CastBarTime}<7) { 
                             :Interrupt 
                             /keypress FORWARD hold 
                             /delay 6 
                             /keypress FORWARD 
                             /keypress BACK hold 
                             /delay 8 
                             /keypress BACK 
                         } else { 
                             :HoldForSpell 
                             /delay 1 
                             /if (${CastBarTime}<7) /goto :Interrupt 
                             /goto :HoldForSpell 
                         } 
                     } else { 
                         /keypress FORWARD hold 
                         :Forward 
                         /delay 1 
                         /if (${Math.Distance[${CastCurrLocY},${CastCurrLocX}]}<6) /goto :Forward 
                         /keypress FORWARD 
                         /keypress BACK hold 
                         :Backward 
                         /delay 1 
                         /if (${Math.Distance[${CastCurrLocY},${CastCurrLocX}]}>4) /goto :Backward 
                         /keypress BACK 
                         /if (!${Me.Casting.ID}>0) /goto :DuckTime 
                     } 
                 } 
             } 
             :DuckTime 
             /keypress FORWARD 
             /keypress BACK 
             /if (!${Me.Ducking}) /keypress DUCK 
             /delay 1 
             /if (${Me.Ducking}) /keypress DUCK 
             /return CAST_LOSTTARGET 
         } 
         /delay 1 
         /goto :WaitCast 
      } 
   /delay 1 
   /doevents Fizzle 
   /doevents Interrupt 
   /doevents Interrupt 
   /doevents Recover 
   /doevents Standing 
   /doevents OutOfRange 
   /doevents OutOfMana 
   /doevents NoLOS 
   /doevents Resisted 
   /doevents ImmuneSlow 
   /doevents ImmuneRoot 
   /doevents Stunned 
   /doevents Collapse 
   /if (${Macro.Return.Equal["CAST_RESTART"]}) /goto :StartCast 
   /if (!${Macro.Return.Equal["NULL"]}) /return ${Macro.Return} 
/return CAST_SUCCESS 

Sub ClearReturnValue 
/return NULL 

Sub Event_Fizzle 
/return CAST_RESTART 

Sub Event_Interrupt 
/return CAST_RESTART 

Sub Event_Recover 
   /delay 5 
/return CAST_RESTART 

Sub Event_Standing 
   /stand 
/return CAST_RESTART 

Sub Event_Collapse 
/return CAST_RESTART 

Sub Event_OutOfMana 
/return CAST_OUTOFMANA 

Sub Event_OutOfRange 
/return CAST_OUTOFRANGE 

Sub Event_NoLOS 
/return CAST_CANNOTSEE 

Sub Event_Stunned 
   /delay 2s !${Me.Stunned} 
/return CAST_RESTART 

Sub Event_Resisted 
/return CAST_RESISTED 

Sub Event_ImmuneSlow 
/return CAST_IMMUNESLOW 

Sub Event_ImmuneRoot 
/return CAST_IMMUNEROOT 

Drumstix42
a grimling bloodguard
a grimling bloodguard
Posts: 808
Joined: Mon May 03, 2004 4:25 pm

Post by Drumstix42 » Sat May 29, 2004 7:55 pm

You may wanna post in the newer Forum :)

Guest

Post by Guest » Sun May 30, 2004 5:07 pm

Drumstix42 wrote:You may wanna post in the newer Forum :)
Yeah, you're right...