Macro Spell Skiller Macro

Ladon

Lifetime Member
Joined
May 12, 2007
Messages
158
Reaction score
0
Points
16
So that this doesn't get lost to time I figured I would post it here. I've used this on multiple characters that I've powerleveled to get their spell skills and specialization up. Upon first run it will notify you to update the spellskills.ini with your [server_name] primary and secondary specializations.

SpellSkills.mac
Code:
#turbo

Sub Main
   /mqclear
   /echo ${Time.Time12} ]> Ladon edit v0.170310 of BlackOp SpellSkills v0.04 <[ Lvl: ${Me.Level} ${Me.Class} ]>
   /delay 3
   /declare Casters string outer Necromancer,Wizard,Mage,Enchanter
   /declare Priests string outer Cleric,Druid,Shaman
   /if (${Me.Class.CanCast}) {
        /if ((${Casters.Find[${Me.Class}]} && ${Me.Level} >= 20) || (${Priests.Find[${Me.Class}]} && ${Me.Level} >=30)) {
         /declare INIERROR bool 0
         /declare SFMSG string
         /declare PRISPEC string outer ${Ini[SpellSkills.ini,${MacroQuest.Server}_${Me},PRISPEC]}
         /if (${Me.AltAbility[Secondary Forte]}) {
            /declare SECFORT string outer ${Ini[SpellSkills.ini,${MacroQuest.Server}_${Me},SECFORT]}
         }
         /if (!${Select[${PRISPEC},Abjure,Alteration,Conjuration,Evocation,Divination]}) {
           | /ini "SpellSkills.ini" "${MacroQuest.Server}_${Me}" "PRISPEC"
            /varset INIERROR 1
         }
         /if ((${Defined[SECFORT]}) && (!${Select[${SECFORT},Abjure,Alteration,Conjuration,Evocation,Divination]})) {
            /ini "SpellSkills.ini" "${MacroQuest.Server}_${Me}" "SECFORT"
            /varset INIERROR 1
         }
         /if (${INIERROR}) {
            /echo Error reading Primary Specialization/Secondary Forte data.
            /echo Please fill in SpellSkills.ini entries for ${MacroQuest.Server}_${Me}.
            /end
         } else {
            /declare SpecSkillCap int outer
            /if (${Defined[SECFORT]}) /varset SFMSG Secondary Forte <[ ${SECFORT} ]>
            /echo ${Time.Time12} ]> Primary Specialization <[ ${PRISPEC} ]> ${SFMSG}
         }
      } else {
         /echo <[ Lvl: ${Me.Level} ]> Too Young for Spell Specializations.
      }
      /declare SpellsArray[5] string
      /declare C int
	  /varset SpellsArray[1] ${Ini[SpellSkills.ini,${Me.Class.ShortName},ALT]}
	  /varset SpellsArray[2] ${Ini[SpellSkills.ini,${Me.Class.ShortName},EVO]}
	  /varset SpellsArray[3] ${Ini[SpellSkills.ini,${Me.Class.ShortName},CON]}
	  /varset SpellsArray[4] ${Ini[SpellSkills.ini,${Me.Class.ShortName},ABJ]}
      /varset SpellsArray[5] ${Ini[SpellSkills.ini,${Me.Class.ShortName},DIV]}
      /for C 1 to 5
         /call PracticeSpell "${SpellsArray[${C}]}"
      /next C
      /echo Spell Practicing Complete.
      /camp desktop
   } else {
      /echo Silly ${Me.Class}!!! You have no spells to practice!!!
   }
/return

Sub PracticeSpell(string SpellName)
   /declare SpellSkill string local ${Spell[${SpellName}].Skill}
   /if ((${Casters.Find[${Me.Class}]} && ${Me.Level} >= 20) || (${Priests.Find[${Me.Class}]} && ${Me.Level} >=30)) {
      /declare SpecSpellSkill string local ${SpellSkill}
      /if (${SpecSpellSkill.Equal[Abjuration]}) /varset SpecSpellSkill Abjure
      /call SetSpecSkillCap ${Spell[${SpellName}].Skill}
   }
   /if ((${Me.Skill[${SpellSkill}]} < ${Skill[${SpellSkill}].SkillCap}) || (((${Casters.Find[${Me.Class}]} && ${Me.Level} >= 20) || (${Priests.Find[${Me.Class}]} && ${Me.Level} >=30)) && (${Me.Skill[Specialize ${SpecSpellSkill}]} < ${SpecSkillCap}))) {
      /declare SkillMsg string local ]> Practicing ${Spell[${SpellName}].Skill} <[ ${Me.Skill[${SpellSkill}]} : ${Skill[${SpellSkill}].SkillCap} ]>
      /if ((${Casters.Find[${Me.Class}]} && ${Me.Level} >= 20) || (${Priests.Find[${Me.Class}]} && ${Me.Level} >=30)) /varset SkillMsg ${SkillMsg} Specialization <[ ${Me.Skill[Specialize ${SpecSpellSkill}]} : ${SpecSkillCap} ]>
      /echo ${Time.Time12} ${SkillMsg}
      /memspell 5 "${SpellName}"
      /if (${Me.Pet.ID}) {
         /target ${Me.Pet}
      } else {
         /target ${Me}
      }
    :PracticeLoop
      /doevents
      /delay 10s (${Me.SpellReady[${SpellName}]})
      /delay 1s
      /cast "${SpellName}"
      /delay 1s
      /delay 6s (!${Me.Casting.ID})
      /delay 1s
      /if (${Select[${Cursor.Name}, Summoned: Coldlight, Summoned: Light Globe, Summoned: Black Bread, Summoned: Halo of Light]}) /destroy
      /if ((${Me.CurrentMana} < ${Spell[${SpellName}].Mana}) || (${Me.PctHPs} < 20)) /call MedTime "${SpellName}"
      /if ((${Me.Skill[${SpellSkill}]} < ${Skill[${SpellSkill}].SkillCap}) || (((${Casters.Find[${Me.Class}]} && ${Me.Level} >= 20) || (${Priests.Find[${Me.Class}]} && ${Me.Level} >=30)) && (( ${Me.Level} > 19) && (${Me.Skill[Specialize ${SpecSpellSkill}]} < ${SpecSkillCap})))) /goto :PracticeLoop
   }
   /declare MaxMsg string local ]> ${Spell[${SpellName}].Skill} MAXXED! <[ ${Me.Skill[${SpellSkill}]} : ${Skill[${SpellSkill}].SkillCap} ]>
   /if ((${Casters.Find[${Me.Class}]} && ${Me.Level} >= 20) || (${Priests.Find[${Me.Class}]} && ${Me.Level} >=30)) /varset MaxMsg ${MaxMsg} Specialization <[ ${Me.Skill[Specialize ${SpecSpellSkill}]} : ${SpecSkillCap} ]>
   /echo ${Time.Time12} ${MaxMsg}
   /delay 2s
/return

Sub MedTime(string SpellName)
   /echo ${Time.Time12} ]> ${Spell[${SpellName}].Skill} <[ ${Me.Skill[${Spell[${SpellName}].Skill}]} ]> Medding/Regenerating
 :MedLoop
   /if (${Me.Standing}) /sit
   /delay 10s ((${Me.PctMana} == 100) && (${Me.PctHPs} == 100))
   /if ((${Me.PctMana} < 100) || (${Me.PctHPs} < 100)) /goto :MedLoop
   /echo ${Time.Time12} ]> ${Spell[${SpellName}].Skill} <[ ${Me.Skill[${Spell[${SpellName}].Skill}]} ]> Resuming Spell Practice
/return

sub SetSpecSkillCap(string SpellSkill)
   /if (${SpellSkill.Equal[Abjuration]}) /varset SpellSkill Abjure
   /if (${SpellSkill.Equal[${PRISPEC}]}) {
      /varset SpecSkillCap ${Skill[Specialize ${SpellSkill}].SkillCap}
   } else /if (${SpellSkill.Equal[${SECFORT}]}) {
      /if (${Me.Level} > 70) {
         /varset SpecSkillCap ${Math.Calc[((${Me.Level} - 70) * 5) + 100]}
      } else {
         /varset SpecSkillCap 100
      }
   } else {
      /if (${Me.Level} > 70) {
         /varset SpecSkillCap ${Math.Calc[((${Me.Level} - 70) * 5) + 50]}
      } else {
         /varset SpecSkillCap 50
      }
   }
/return

SpellSkills.ini
Code:
[CLR]
ABJ=Courage
ALT=Minor Healing
CON=Abundant Food
DIV=True North
EVO=Strike

[DRU]
ABJ=Shield of Thistles
ALT=Minor Healing
CON=Summon Food
DIV=Invisibility versus Animals
EVO=Burst of Flame

[SHM]
ABJ=Inner Fire
ALT=Minor Healing
CON=Summon Food
DIV=True North
EVO=Burst of Flame

[NEC]
ABJ=Minor Shielding
ALT=Siphon Strength
CON=Coldlight
DIV=True North
EVO=Ward Undead

[WIZ]
ABJ=O`Keil's Embers
ALT=Root
CON=Eye of Zomm
DIV=Invisibility
EVO=Blast of Cold

[MAG]
ABJ=Shield of Fire
ALT=Renew Elements
CON=Summon Food
DIV=Invisibility
EVO=Burst of Flame

[ENC]
ABJ=Minor Shielding
ALT=Root
CON=Mesmerize
DIV=True North
EVO=Chaotic Feedback

[SHD]
ABJ=Endure Cold
ALT=Cure Disease
CON=Disease Cloud
DIV=Invisibility versus Undead
EVO=Ward Undead

[PAL]
ABJ=Courage
ALT=Salve
CON=Halo of Light
DIV=True North
EVO=Cease

[RNG]
ABJ=Skin like Wood
ALT=Salve
CON=Dance of the Fireflies
DIV=Glimpse
EVO=Flame Lick

[BST]
ABJ=Endure Cold
ALT=Salve
CON=Sicken
DIV=Sense Animals
EVO=Spirit Strike


[Primary/Secondary Specializations]
*** This portion only applies to PureCasters with Spell Specialization skills. (CLR/DRU/SHM/NEC/WIZ/MAG/ENC)
*** Hybrid classes DO NOT need to be listed here. (PAL/SHD/RNG/BST)

PRISPEC is your personally chosen PRImary SPECialization.
SECFORT is your personally chosen SECondary FORTe (After AA Purchase.)

Null entries will be created automatically upon first run and an error generated.

Simply edit this file and type in the PRISPEC and SECFORT entries as you choose and rerun.

Works with multiple characters on multiple servers, including same-name characters on different servers.

**** SPECIAL NOTE ****
Sony fucked up Specialize Abjuration and called it Specialize Abjure for some reason.
If you've chosen Abjuration as a Specialization/Secondary Forte, list it here as Abjure.

example:
[server_Character]
PRISPEC=Alteration
SECFORT=Evocation


edit 1: Changed the variable PureCaster to declaring the four classes that can specialize at 20. Decided to use the declares through the macro because of errors I was experiencing.
 
Last edited: