FelisMalum
Well-known member
- Joined
- Mar 7, 2022
- RedCents
- 439¢
- Pronouns
- She/Her
Have been using this for awhile and patching it up as necessary. Finally got around to putting some polish on it. Quick and easy macro to raise both specialization and skills. Will account for primary/secondary skills and even allows you to do quick casting, basically cutting ~20points off of max relative to level since those last few points are always the hardest. Should now account for all the specialization re-writes and various classes and levels now. Also tweaked a few of the chosen spells to be more general use but also means some of the spells wont be available till like lvl 10. Imo not an issue since training at that low a level is kinda pointless. Think it gets the job done perty well now.
[CODE title="SpellSkills.mac"]
|************************************************************************|
| - BlackOp SpellSkills *|
| - SpellSkills.mac *|
| - Originally Written By: Ladon *|
| - v.04 Original Release *|
| - v.5 by FelisMalum *|
| Fixed specilization caps due to game changes since original release *|
| - v1.0 by FelisMalum *|
| Made practice order dynamic, will now work on specilization skill *|
| first so they will max out the correct specialize in the correct *|
| order without manual intervention. Added the option to do quick *|
| practicing. Since the final few skill points relative to level take *|
| the longest you can now practice below the relative cap. *|
| *|
|************************************************************************|
#turbo
Sub Main
|Quick training: Will practice to x below cap, recommend 20 if used, last 10-20pts relative to max always take the longest. 0 to max skill.
/declare Practice int outer 20
|Camp to desktop upon completion?
/declare Camp bool local false
| /mqclear
/echo <[ ${Time.Time12} ]> BlackOp SpellSkills v1.0 <[ Lvl: ${Me.Level} ${Me.Class} ]>
/declare Priests string outer Cleric,Druid,Shaman
/declare Wizards string outer Necromancer,Wizard,Magician,Enchanter
/declare HasSpec bool outer false
/declare HasSecn bool local false
/if (${Me.Class.CanCast}) {
/if (${Wizards.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]}
/varset HasSpec true
/if (${Me.AltAbility[Secondary Forte]}) {
/declare SECFORT string outer ${Ini[SpellSkills.ini,${MacroQuest.Server}_${Me},SECFORT]}
/varset HasSecn true
}
/if (!${Select[${PRISPEC},Abjuration,Alteration,Conjuration,Evocation,Divination]}) {
/ini "SpellSkills.ini" "${MacroQuest.Server}_${Me}" "PRISPEC"
/varset INIERROR 1
}
/if ((${Defined[SECFORT]}) && (!${Select[${SECFORT},Abjuration,Alteration,Conjuration,Divination,Evocation]})) {
/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
/declare SpecSkillPractice int outer
/if (${Defined[SECFORT]}) /varset SFMSG , Secondary Forte <[ ${SECFORT} ]>
/echo <[ ${Time.Time12} ]> Primary Specialization <[ ${PRISPEC} ]> ${SFMSG}
}
} else {
/if (!${Me.Class.PureCaster}) /echo Your class doesn't have Spell Specializations.
/if (${Me.Class.PureCaster}) /echo <[ Lvl: ${Me.Level} ]> Too Young for Spell Specializations.
}
/if (${HasSpec}) {
/call PracticeSpell "${Ini[SpellSkills.ini,${Me.Class.ShortName},${PRISPEC}]}"
/if (${HasSecn}) /call PracticeSpell "${Ini[SpellSkills.ini,${Me.Class.ShortName},${SECFORT}]}"
}
/declare SpellsArray[5] string
/varset SpellsArray[1] ${Ini[SpellSkills.ini,${Me.Class.ShortName},Abjuration]}
/varset SpellsArray[2] ${Ini[SpellSkills.ini,${Me.Class.ShortName},Alteration]}
/varset SpellsArray[3] ${Ini[SpellSkills.ini,${Me.Class.ShortName},Conjuration]}
/varset SpellsArray[4] ${Ini[SpellSkills.ini,${Me.Class.ShortName},Divination]}
/varset SpellsArray[5] ${Ini[SpellSkills.ini,${Me.Class.ShortName},Evocation]}
/declare C int
/for C 1 to 5
/call PracticeSpell "${SpellsArray[${C}]}"
/next C
/echo Spell Practicing Complete.
/if (${Camp}) /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 (${Wizards.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}
}
|modified to remove clr from pure casters, showing null:null for 20-30 clr lower needs updated.
/if ((${Me.Skill[${SpellSkill}]} < ${Skill[${SpellSkill}].SkillCap}) || ((${HasSpec}) && (${Me.Skill[Specialize ${SpecSpellSkill}]} < ${SpecSkillCap}))) {
/declare SkillMsg string local Practicing ${Spell[${SpellName}].Skill} <[ ${Me.Skill[${SpellSkill}]} : ${Skill[${SpellSkill}].SkillCap} ]>
/if (${HasSpec}) /varset SkillMsg ${SkillMsg} Specialization <[ ${Me.Skill[Specialize ${SpecSpellSkill}]} : ${SpecSkillPractice} ]>
/echo <[ ${Time.Time12} ]> ${SkillMsg}
/echo Meming: "${SpellName}"
/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} - ${Practice})) || ((${Me.Class.PureCaster}) && (( ${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 (${HasSpec}) /varset MaxMsg ${MaxMsg} Specialization <[ ${Me.Skill[Specialize ${SpecSpellSkill}]} : ${SpecSkillPractice} ]>
/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 ${Math.Calc[${Skill[Specialize ${SpellSkill}].SkillCap} - ${Practice}]}
/varset SpecSkillPractice ${Math.Calc[${Skill[Specialize ${SpellSkill}].SkillCap}]}
} else /if (${SpellSkill.Equal[${SECFORT}]}) {
/varset SpecSkillCap ${Math.Calc[${Skill[Specialize ${SpellSkill}].SkillCap} - 50]}
/varset SpecSkillPractice ${Math.Calc[${Skill[Specialize ${SpellSkill}].SkillCap} - 50]}
} else {
/if (${Me.Level} >= 41) {
/varset SpecSkillCap ${Math.Calc[${Skill[Specialize ${SpellSkill}].SkillCap} - 100]}
/varset SpecSkillPractice ${Math.Calc[${Skill[Specialize ${SpellSkill}].SkillCap} - 100]}
} else {
| May need to adj for practase difference display.
/varset SpecSkillCap 50
}
}
/return
[/CODE]
[CODE title="SpellSkills.ini"][CLR]
Abjuration=Courage
Alteration=Minor Healing
Conjuration=Summon Food
Divination=True North
Evocation=Strike
[DRU]
Abjuration=Skin like Wood
Alteration=Minor Healing
Conjuration=Halo of Light
Divination=Sense Animals
Evocation=Burst of Flame
[SHM]
Abjuration=Inner Fire
Alteration=Minor Healing
Conjuration=Summon Food
Divination=True North
Evocation=Burst of Flame
[NEC]
Abjuration=Minor Shielding
Alteration=Grim Aura
Conjuration=Coldlight
Divination=True North
Evocation=Ward Undead
[WIZ]
Abjuration=Minor Shielding
Alteration=Fade
Conjuration=Halo of Light
Divination=True North
Evocation=Blast of Cold
[MAG]
Abjuration=Minor Shielding
Alteration=Renew Elements
Conjuration=Summon Food
Divination=True North
Evocation=Burst of FLame
[ENC]
Abjuration=Minor Shielding
Alteration=Shallow Breath
Conjuration=Mesmerize
Divination=True North
Evocation=Chaotic Feedback
[SHD]
Abjuration=Endure Cold
Alteration=Despair
Conjuration=Engulfing Darkness
Divination=Sense the Dead
Evocation=Word of Spirit
[PAL]
Abjuration=Courage
Alteration=Salve
Conjuration=Halo of Light
Divination=True North
Evocation=Cease
[RNG]
Abjuration=Skin like Wood
Alteration=Salve
Conjuration=Dance of the Fireflies
Divination=Glimpse
Evocation=Burst of Fire
[BST]
Abjuration=Endure Cold
Alteration=Salve
Conjuration=Sicken
Divination=Sense Animals
Evocation=Blast of Frost
[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.
|example:
|[server_Character]
|PRISPEC=Alteration
|SECFORT=Conjuration
[/CODE]
[CODE title="SpellSkills.mac"]
|************************************************************************|
| - BlackOp SpellSkills *|
| - SpellSkills.mac *|
| - Originally Written By: Ladon *|
| - v.04 Original Release *|
| - v.5 by FelisMalum *|
| Fixed specilization caps due to game changes since original release *|
| - v1.0 by FelisMalum *|
| Made practice order dynamic, will now work on specilization skill *|
| first so they will max out the correct specialize in the correct *|
| order without manual intervention. Added the option to do quick *|
| practicing. Since the final few skill points relative to level take *|
| the longest you can now practice below the relative cap. *|
| *|
|************************************************************************|
#turbo
Sub Main
|Quick training: Will practice to x below cap, recommend 20 if used, last 10-20pts relative to max always take the longest. 0 to max skill.
/declare Practice int outer 20
|Camp to desktop upon completion?
/declare Camp bool local false
| /mqclear
/echo <[ ${Time.Time12} ]> BlackOp SpellSkills v1.0 <[ Lvl: ${Me.Level} ${Me.Class} ]>
/declare Priests string outer Cleric,Druid,Shaman
/declare Wizards string outer Necromancer,Wizard,Magician,Enchanter
/declare HasSpec bool outer false
/declare HasSecn bool local false
/if (${Me.Class.CanCast}) {
/if (${Wizards.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]}
/varset HasSpec true
/if (${Me.AltAbility[Secondary Forte]}) {
/declare SECFORT string outer ${Ini[SpellSkills.ini,${MacroQuest.Server}_${Me},SECFORT]}
/varset HasSecn true
}
/if (!${Select[${PRISPEC},Abjuration,Alteration,Conjuration,Evocation,Divination]}) {
/ini "SpellSkills.ini" "${MacroQuest.Server}_${Me}" "PRISPEC"
/varset INIERROR 1
}
/if ((${Defined[SECFORT]}) && (!${Select[${SECFORT},Abjuration,Alteration,Conjuration,Divination,Evocation]})) {
/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
/declare SpecSkillPractice int outer
/if (${Defined[SECFORT]}) /varset SFMSG , Secondary Forte <[ ${SECFORT} ]>
/echo <[ ${Time.Time12} ]> Primary Specialization <[ ${PRISPEC} ]> ${SFMSG}
}
} else {
/if (!${Me.Class.PureCaster}) /echo Your class doesn't have Spell Specializations.
/if (${Me.Class.PureCaster}) /echo <[ Lvl: ${Me.Level} ]> Too Young for Spell Specializations.
}
/if (${HasSpec}) {
/call PracticeSpell "${Ini[SpellSkills.ini,${Me.Class.ShortName},${PRISPEC}]}"
/if (${HasSecn}) /call PracticeSpell "${Ini[SpellSkills.ini,${Me.Class.ShortName},${SECFORT}]}"
}
/declare SpellsArray[5] string
/varset SpellsArray[1] ${Ini[SpellSkills.ini,${Me.Class.ShortName},Abjuration]}
/varset SpellsArray[2] ${Ini[SpellSkills.ini,${Me.Class.ShortName},Alteration]}
/varset SpellsArray[3] ${Ini[SpellSkills.ini,${Me.Class.ShortName},Conjuration]}
/varset SpellsArray[4] ${Ini[SpellSkills.ini,${Me.Class.ShortName},Divination]}
/varset SpellsArray[5] ${Ini[SpellSkills.ini,${Me.Class.ShortName},Evocation]}
/declare C int
/for C 1 to 5
/call PracticeSpell "${SpellsArray[${C}]}"
/next C
/echo Spell Practicing Complete.
/if (${Camp}) /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 (${Wizards.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}
}
|modified to remove clr from pure casters, showing null:null for 20-30 clr lower needs updated.
/if ((${Me.Skill[${SpellSkill}]} < ${Skill[${SpellSkill}].SkillCap}) || ((${HasSpec}) && (${Me.Skill[Specialize ${SpecSpellSkill}]} < ${SpecSkillCap}))) {
/declare SkillMsg string local Practicing ${Spell[${SpellName}].Skill} <[ ${Me.Skill[${SpellSkill}]} : ${Skill[${SpellSkill}].SkillCap} ]>
/if (${HasSpec}) /varset SkillMsg ${SkillMsg} Specialization <[ ${Me.Skill[Specialize ${SpecSpellSkill}]} : ${SpecSkillPractice} ]>
/echo <[ ${Time.Time12} ]> ${SkillMsg}
/echo Meming: "${SpellName}"
/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} - ${Practice})) || ((${Me.Class.PureCaster}) && (( ${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 (${HasSpec}) /varset MaxMsg ${MaxMsg} Specialization <[ ${Me.Skill[Specialize ${SpecSpellSkill}]} : ${SpecSkillPractice} ]>
/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 ${Math.Calc[${Skill[Specialize ${SpellSkill}].SkillCap} - ${Practice}]}
/varset SpecSkillPractice ${Math.Calc[${Skill[Specialize ${SpellSkill}].SkillCap}]}
} else /if (${SpellSkill.Equal[${SECFORT}]}) {
/varset SpecSkillCap ${Math.Calc[${Skill[Specialize ${SpellSkill}].SkillCap} - 50]}
/varset SpecSkillPractice ${Math.Calc[${Skill[Specialize ${SpellSkill}].SkillCap} - 50]}
} else {
/if (${Me.Level} >= 41) {
/varset SpecSkillCap ${Math.Calc[${Skill[Specialize ${SpellSkill}].SkillCap} - 100]}
/varset SpecSkillPractice ${Math.Calc[${Skill[Specialize ${SpellSkill}].SkillCap} - 100]}
} else {
| May need to adj for practase difference display.
/varset SpecSkillCap 50
}
}
/return
[/CODE]
[CODE title="SpellSkills.ini"][CLR]
Abjuration=Courage
Alteration=Minor Healing
Conjuration=Summon Food
Divination=True North
Evocation=Strike
[DRU]
Abjuration=Skin like Wood
Alteration=Minor Healing
Conjuration=Halo of Light
Divination=Sense Animals
Evocation=Burst of Flame
[SHM]
Abjuration=Inner Fire
Alteration=Minor Healing
Conjuration=Summon Food
Divination=True North
Evocation=Burst of Flame
[NEC]
Abjuration=Minor Shielding
Alteration=Grim Aura
Conjuration=Coldlight
Divination=True North
Evocation=Ward Undead
[WIZ]
Abjuration=Minor Shielding
Alteration=Fade
Conjuration=Halo of Light
Divination=True North
Evocation=Blast of Cold
[MAG]
Abjuration=Minor Shielding
Alteration=Renew Elements
Conjuration=Summon Food
Divination=True North
Evocation=Burst of FLame
[ENC]
Abjuration=Minor Shielding
Alteration=Shallow Breath
Conjuration=Mesmerize
Divination=True North
Evocation=Chaotic Feedback
[SHD]
Abjuration=Endure Cold
Alteration=Despair
Conjuration=Engulfing Darkness
Divination=Sense the Dead
Evocation=Word of Spirit
[PAL]
Abjuration=Courage
Alteration=Salve
Conjuration=Halo of Light
Divination=True North
Evocation=Cease
[RNG]
Abjuration=Skin like Wood
Alteration=Salve
Conjuration=Dance of the Fireflies
Divination=Glimpse
Evocation=Burst of Fire
[BST]
Abjuration=Endure Cold
Alteration=Salve
Conjuration=Sicken
Divination=Sense Animals
Evocation=Blast of Frost
[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.
|example:
|[server_Character]
|PRISPEC=Alteration
|SECFORT=Conjuration
[/CODE]


