| -------------------------------------------------------------------------------------
| SUB: CastWhat
| -------------------------------------------------------------------------------------
Sub CastWhat(string castWhat,int castTargetID,string sentFrom)
/if (${Debug}) /echo DEBUG CastWhat: Enter castWhat - ${castWhat} castTargetID - ${castTargetID}
/declare WasTwisting bool local ${Twist}
/varset CastResult CAST_NO_RESULT
| - Check & cast if Combat ability/disc
/if (${Me.CombatAbility[${castWhat}]} && !${Me.CombatAbilityTimer[${castWhat}]}) {
/if (${WasTwisting}) {
/squelch /twist off
/delay 20 !${Twist}
}
/if (${Spell[castWhat].EnduranceCost}>${Me.Endurance}) /return CAST_OUTOFENDURANCE
/if (${Target.ID}!=${castTargetID}) {
/target id ${castTargetID}
/delay 10 ${Target.ID}==${castTargetID}
}
/docommand /disc ${castWhat}
/varset CastResult CAST_SUCCESS
/delay 10s !${Me.Casting.ID}
/return ${CastResult}
}
| - Check & cast if item
/if (${FindItem[=${castWhat}].ID} && ${FindItem[${castWhat}].Timer}==0) {
| Prevent casting of Prestige items on silver and F2P accounts
/if (${Me.Subscription.NotEqual[gold]} && ${FindItem[${castWhat}].Prestige}) /return
/if (${WasTwisting}) {
/squelch /twist off
/delay 50 !${Twist} && !${Me.Casting.ID}
}
/if (${Target.ID}!=${castTargetID}) {
/target id ${castTargetID}
/delay 10 ${Target.ID}==${castTargetID}
}
/call MQ2Cast "${castWhat}" item
/if (${Debug}) /echo DEBUG CastWhat cast item result: ${Macro.Return}
/varset CastResult ${Macro.Return}
/if (${WasTwisting} && !${Twist}) {
/delay 30
/squelch /twist
}
/if (${Debug}) /echo DEBUG CastWhat Leave item cast ${CastResult}
/return ${CastResult}
}
| - Check & cast if AA
/if ((${Me.AltAbility[${castWhat}]} || (${castWhat.Find[Banestrike]} && !${Banestrike.Find[|${Target.Race}|]} && ${Spawn[${MyTargetID}].Distance3D}<70 && ${CombatStart})) && ${Me.AltAbilityReady[${castWhat}]}) {
/if (${Target.ID}!=${castTargetID}) {
/target id ${castTargetID}
/delay 10 ${Target.ID}==${castTargetID}
}
/if (!${IAmABard}) {
/call MQ2Cast "${castWhat}" alt 5s
/if (${Debug}) /echo DEBUG CastWhat cast AA result: ${Macro.Return}
/varset CastResult ${Macro.Return}
/call CheckCasting 30
/return ${CastResult}
}
/if (${IAmABard}) {
/alt act ${Me.AltAbility[${castWhat}].ID}
/if (${Me.AltAbilityReady[${castWhat}]}) {
/varset CastResult CAST_RECOVER
} else {
/varset CastResult CAST_SUCCESS
}
/return ${CastResult}
}
}
| Always use AA if it exists for Voice of Thule}
/if (${castWhat.Equal[Voice of Thule]} && ${Me.AltAbility[Voice of Thule]}) /return
| - Check & cast if spell
/if (${Me.Book[${castWhat}]} && ${Spell[${castWhat}].Mana}<=${Me.CurrentMana}) {
| Avoid confusion between spells and items of the same name. e.g. mage Wand of Phantasmal Modulation
/if (${FindItem[=${castWhat}].ID}) /return
| Mem spell if not memmed
/if (!${Me.Gem[${castWhat}]}) {
| Prevent tanks and heals trying to mem spells during combat.
/if (${Attacking} && ${MainAssist.Equal[${Me}]} || ${HealsOn} && ${AggroTargetID} && ${sentFrom.NotEqual[Heal]}) /return
/memspell ${MiscGem} "${castWhat}"
/delay 350 ${Me.SpellReady[${castWhat}]}
}
/if (${Target.ID}!=${castTargetID} && ${Spell[${Me.Book[${Me.Book[${castWhat}]}].ID}].TargetType.NotEqual[Self]}) {
/target id ${castTargetID}
/delay 10 ${Target.ID}==${castTargetID}
}
| Wait for global cooldown active
:Waitforcooldown
/if (!${IAmABard} && !${Me.SpellReady[${castWhat}]} && !${Me.SpellReady[${Me.Gem[1].Name}]} && !${Me.SpellReady[${Me.Gem[3].Name}]} && !${Me.SpellReady[${Me.Gem[5].Name}]} && !${Me.SpellReady[${Me.Gem[7].Name}]}) {
/delay 5
/goto :Waitforcooldown
}
/if (${Me.SpellReady[${castWhat}]} && !${IAmABard}) {
/call MQ2Cast "${castWhat}" gem8 3s
/if (${Debug}) /echo DEBUG CastWhat cast Spell result: ${Macro.Return}
/varset CastResult ${Macro.Return}
/doevents
/call CheckCasting 50
}
/if (${IAmABard}) {
/squelch /twist once ${castWhat}
/varset CastResult CAST_SUCCESS
}
}
/if (${WasTwisting} && !${Twist}) /squelch /twist
/if (${Debug}) /echo DEBUG CastWhat Leave ${CastResult}
/return ${CastResult}