MMOBugs MQ2 For EQMac PC Client - Beta Release

Thanks for the updates. BTW, stuff I'm looking forward to is mq2melee, docrack, and I don't know if it's against the philosophy here, but piggyzone plugin would be awesome. Warp is one thing I agree should be kept out, but I really hate travel times due to no warp. I kind of agree zone shouldn't be available... but damn I hate pushing around 6 toons and if zone never comes out I probably won't be boxing on Al'Kabor. That's one I would be willing to learn how to make plugins just to get and keep it to myself. lol =(

Also, on macros: same thing as before... when running this shaman macro, it starts to mem a spell and the mem timer goes down about 2 slivers, then client freezes. No mq2 crash message, just client freeze and I have to alt-f4. Holding off boxing til I can get a working shaman macro. They all seem to crash for some reason, but this is the only one that crashes without popping the mq2 crash window.

Edit to add: they all include Spell_Routines.inc... think that could be it?

Code:
| Rikgauk Sham mod 1.0 
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| 
| Moded this to 6 box with my shm 
| Borrowed scripts from many others. 
| 
| 
| Usage: 
| 1. Target player you like to assist (main tank is good) 
| 2. Start the script with: /mac <scriptname> [main assist] [chat channel] 
[controller] 
| 3. Parameters are optional defaults are built in 
| 
| 
| Features: commands work in tell or group 
| 
| The following commands will target the sender and cast the spells 
| requested on the sender: [Avatar] [Sta] [Forti] [Sos] [Agi] [Dex] [Str] [Cha] 
[Sow] [lev] 
| [haste] [regen] [see] [pe] [pr] [grow] [shrink] [hot] [heal] [Wunshi] 
| 
| The following commands will assist the sender and cast the spells 
| requested on the target: [Slow] [add] [root] [dot] [nuke] 
| 
| The following commands: [buff] [buff me] will rebuff a person 
| 
| The following commands: [Buff them] will rebuff another group 
| 
| The following commands: [Follow me] [end follow] [stop] are for moving shaman 
| 
| The [add] or [slow] command are good in combat when there are adds 
| Target the add and it will be malo and slowed 
| 
| During combat he will only do requests for heals and detrimentals 
| 
| [buff pet] Targets sender pet and buffs 
| 
| [gate now] will memorize the gate spell and gate to bind, must be a tell 
| 
| Added a chat channel to echo all non command word tells to controller 
| added a vtell to controller on incomming tells 
| 
| Use "help" for more help ( !help is incomplete! ) 
|_______________________________________________________________| 
| 
| -!- Basis of this script is Version: v0.5c by Hubba 
| Some other mods and my own changes 
| 
|_______________________________________________________________| 
| -!- This Script Uses spell_routines.inc by Rusty 
| -!- Exptrack snippet from exptracker.mac by Raebis, with tweaks from Phoenix 
(not tested) 
| -!- Wait4Rez snippet from wait4rez.mac by fantum409 
| 
|_______________________________________________________________| 

#chat group 
#chat tell 

#Event ToggleVariable "[MQ2] Toggle #1#" 
#Event ToggleVariable "[MQ2] Toggle #1# #2#" 
#Event OutDoor "#*#outdoors#*#" 
#Event OutDoor "You can not summon a mount here." 
#Event Zoning "You have entered#*#" 
#Event Hungry "#*#are hungry#*#" 
| #Event Enrageon "#*#ENRAGED#*#" 
| #Event Enrageoff "#*#no longer enraged#*#" 
#Event Thirsty "#*#are thirsty#*#" 
#Event ImDead "You have been slain by#*#" 
#Event Invited "#*#To join the group, click on the 'FOLLOW' option, 
or 'DISBAND' to 

cancel#*#" 

#include Spell_Routines.inc 

Sub Main 

| The spell will be memmed in the listed order. 
| Gem1 = Canni 
| Gem2 = Slow 
| Gem3 = Malo 
| Gem4 = Avatar, Cripple 
| Gem5 = Pet and buffs 
| Gem6 = Heal 
| Gem7 = HoT 
| Gem8 = DoT 
| Gem9 = root, Nuke, gate 

| ########### Make changes in spells as you need. 
| ########### Obs! This is mainly for a 65+ shaman with Cannibalization ability 
| ########### Set Cannibalization to False if you don't have the ability 
| ########### 

| ########### Default Channel, Controller 

/declare CChannel outer "channel_name" 
/declare ChatController outer "person_name" 

| ########### Your Spell List - update as needed 

/declare SpellSlow outer "Turgur's Insects" 
| /declare SpellSlow outer "Balance if Nihil" 
/declare SpellDoT outer "Blood of Saryrn" 
| /declare SpellDot outer "Blood of Yoppa" 
/declare SpellCripple "Cripple"
/declare SpellDrDot outer "Breath of Ultor" 
/declare SpellMrDot outer "Bane" 
/declare SpellPet outer "True Spirit" 
/declare SpellDeBuff outer "Malos" 
/declare SpellCanni outer "Cannibalize IV" 
| /declare SpellCanni outer "Pained Memory" 

/declare SpellHoT outer "Quiescence" 
| /declare SpellHoT outer "Spiritual Serenity" 
/declare SpellHeal outer "Inner Fire" 
| /declare SpellHeal outer "Yoppa's Mending" 
/declare SpellRoot outer "Petrifying Earth" 
/declare SpellNuke outer "Velium Strike" 

/declare SpellATK outer "Ferine Avatar" 
/declare SpellHASTE outer "Swift like the Wind" 
/declare SpellFOCUS outer "Inner Fire" 
/declare SpellWunshi outer "Wunshi's Focusing" 
/declare SpellCHA outer "Unfailing Reverence" 
/declare SpellDEX outer "Dextorous Aura" 
/declare SpellMight outer "Spirit of Might" 
/declare SpellSTR outer "Agility of the Wrulan" 
/declare SpellSos outer "Spirit of Sense" 
/declare SpellAGI outer "Agility of the Wrulan" 
/declare SpellSTA outer "Endurance of the Boar" 
/declare SpellREGEN outer "Replenishment" 
| /declare SpellREGEN outer "Spirit of Perseverance" 
/declare SpellForti outer "Spirit of Fortitude" 
/declare SpellPE outer "Primal Essence" 
/declare SpellPR outer "Talisman of the Tribunal" 

/declare SpellSOW outer "Spirit of Bih`Li" 
/declare SpellLEV outer "Levitation" 
/declare SpellINV outer "Invisibility" 
| /declare SpellINV outer "Spirit Veil" 
/declare SpellSHRINK outer "Tiny Terror" 
/declare SpellGROW outer "Grow" 
/declare SpellSEE outer "Acumen of Dar Khura" 

/declare SpellGATE outer "Gate" 
/declare SpellFOOD outer "Summon Food" 
/declare SpellDRINK outer "Summon Drink" 

| ########### Mount Type 



| ########### My Pet Buff Spell List 

/declare SpellPetBuff[4] string outer 
/varset SpellPetBuff[1] "Swift like the Wind" 
/varset SpellPetBuff[2] "Agility of the Wrulan" 
/varset SpellPetBuff[3] "Ferine Avatar" 
/varset SpellPetBuff[4] "Focus of Soul" 
| /varset SpellPetBuff[2] "Spirit of Sense" 

| ########### Other Pet Buff Spell List 

/declare SpellPetBuffo[3] string outer 
/varset SpellPetBuffo[1] "Swift like the Wind" 
/varset SpellPetBuffo[2] "Primal Essence" 
/varset SpellPetBuffo[3] "Focus of Soul" 

| ############ Group Buff List. Remove the | in front of Buffs when you get the spells to use them. 
| ############ MAKE SURE TO CHANGE /DECLARE sPELLGRPBUFF[#] AND CHANGE THE /VARSET sPELLGRPBUFF[#] 
| ############ SO THEY GO IN ORDER 1-7 SO ALL WILL BE USED PROPERLY!! 

/declare SpellGrpBuff[5] string outer 
/varset SpellGrpBuff[1] "Blessing of Replenishment" 
| /varset SpellGrpBuff[2] "Talisman of Wunshi" 
/varset SpellGrpBuff[2] "Focus of the Seventh" 
/varset SpellGrpBuff[3] "Talisman of Alacrity" 
/varset SpellGrpBuff[4] "Talisman of the Wrulan" 
/varset SpellGrpBuff[5] "Talisman of the Boar" 
| /varset SpellGrpBuff[6] "Talisman of Sense" 
| /varset SpellGrpBuff[7] "Talisman of Fortitude" 

| ############ Single Buff List. 

/declare SpellSingleBuff[4] string outer 
/varset SpellSingleBuff[1] "Inner Fire" 
| /varset SpellSingleBuff[2] "Wunshi's Focusing" 
|/varset SpellSingleBuff[2] "Focus of Soul" 
|/varset SpellSingleBuff[3] "Agility of the Wrulan" 
|/varset SpellSingleBuff[4] "Endurance of the Boar" 
| /varset SpellSingleBuff[5] "Spirit of Fortitude" 
| /varset SpellSingleBuff[6] "Spirit of Sense" 

| ############ Combat Variables 

/declare AssistAt int outer 98 
/declare CombatAt int outer 97 

/declare CastDoTat int outer 80 
/declare DotMana int outer 40 

/declare Rootat int outer 40 
/declare RootMana int outer 40 

/declare NukeAt int outer 90 
/declare NukeMana int outer 50 

/declare SitAt int outer 80 
/declare BuffMana int outer 30 
/declare MinMana int outer 15 

/declare following int outer 0 
/declare follname string outer NULL 

| ############ Heal Priority. 

/declare CasterHeals int outer 40 
/declare MeleeHeals int outer 50 
/declare TankHeal int outer 65 

| ############ To Do List 

/declare DoMalo outer FALSE 
/declare DoSlow outer FALSE 
/declare FastSlow outer FALSE 
/declare DoRoot outer FALSE 

/declare SummonPet outer FALSE 
/declare BuffPet outer FALSE

/declare DoDoT outer FALSE
/declare DoBuffs outer TRUE 
/declare DoSow outer FALSE
/declare DoNuke outer FALSE 
/declare DoHeal outer TRUE
/declare Cannibalization outer FALSE 
/declare Verbose outer TRUE

| This is a delay for how long Avatar will hold. (8min) 
/declare AvatarDelay outer 5350 

| ########### ! No Changes From Here Is Needed ! 

/squelch /alias malo /echo toggle malo 
/squelch /alias slow /echo toggle slow 
/squelch /alias fastslow /echo toggle fastslow 
/squelch /alias root /echo toggle root 
/squelch /alias pet /echo toggle pet 
/squelch /alias dot /echo toggle dot 
/squelch /alias nuke /echo toggle nuke 
/squelch /alias nukeat /echo toggle nukeat 
/squelch /alias buffs /echo toggle buffs 
/squelch /alias sow /echo toggle sow 
/squelch /alias assistat /echo toggle assistat 
/squelch /alias dotat /echo toggle dotat 
/squelch /alias rootat /echo toggle rootat 
/squelch /alias combatat /echo toggle combatat 
/squelch /alias healmeleeat /echo toggle healmeleeat 
/squelch /alias healcastersat /echo toggle healcastersat 
/squelch /alias healtankat /echo toggle healtankat 
/squelch /alias assist /echo toggle assist 
/squelch /alias healat /echo toggle healat 
/squelch /alias status /echo toggle show 
/squelch /alias show /echo toggle show 
/squelch /alias help /echo toggle help 
/squelch /alias verbose /echo toggle verbose 

/declare TargetArray[4] string outer 
/declare MobMaloed outer FALSE 
/declare MobSlowed outer FALSE 
/declare PetOn outer FALSE 
/declare MobRooted outer FALSE 
/declare MobDoTed outer FALSE 
/declare CombatOn outer TRUE 
/declare Engaged outer FALSE 
/declare LowMana outer FALSE 
/declare MobCrippled outer FALSE

/declare M_Assist string outer 
/declare OutDoors outer TRUE 

/declare Exper float outer 
/declare AAExp float outer 

/varset Exper ${Me.Exp} 
/varset AAExp ${Me.AAExp} 

/declare ATKBuffed0 timer outer 0 
/declare ATKBuffed1 timer outer 0 
/declare ATKBuffed2 timer outer 0 
/declare ATKBuffed3 timer outer 0 
/declare ATKBuffed4 timer outer 0 
/declare ATKBuffed5 timer outer 0 

/call MemSpells 

| ############### Target a player as Main Assist 

/if (${Defined[Param0]}) { 
/varset M_Assist ${Param0} 
/echo Assist set to ${M_Assist} 
} else { 
/if (!${Target.ID} || ${Target.Type.NotEqual[PC]}) { 
/echo Your Do not have a main assist, make sure its a player character! 
/endmacro 
} 
/varset M_Assist ${Target.CleanName} 
/echo Assist set to ${M_Assist} 
} 

/assist off 

/if (${Defined[Param1]}) /varset CChannel ${Param1} 
/leaveall 
/join ${CChannel} 
/1 I am here! 
/echo Joined channel ${CChannel} 

/if (${Defined[Param2]}) /varset ChatController ${Param2} 
/vtell ${ChatController} 005 
/tell ${ChatController} I am here! 
/echo My master is ${ChatController} 


| ############### Shrink 

/target pc ${M_Assist} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/ECHO ${SpellSHRINK} is incomming to you 
/call cast ${SpellSHRINK} gem5 5s 
/call cast ${SpellSHRINK} gem5 5s 
} 


| ############### 
| ############### Main Loop Starts 
| ############### 

:Main_Loop 

|- Check for Standing if less than sitat then sit 
/if ( ${Me.State.Equal[Stand]} && ${Me.PctMana}<${SitAt}) /sit 

|- Check for low mana state 
/call Check_Mana 

|- Check for new events in chat etc etc... 
/doevents 

|- Do we move? 
:Hold_Main 
/if (${Me.Moving}) /goto :Hold_Main 

|- Pet 
/call PET 

|- Buff Sow 
/call SOW 

|- Check for mobs and do combat stuff 
/call GetTarget 
/if (${CombatOn}) /call Combat 

|- Group Heals 
/call Check_grpHPs 

|- Check for Standing if less than sitat then sit 
/if ( ${Me.State.Equal[Stand]} && ${Me.PctMana}<${SitAt}) /sit 

|- Canni 
/call LOM 

|- Group Buffs if more than BuffMana mana 
/if (${Me.PctMana}>=${BuffMana} && ${DoBuffs}) /call GrpBuffs 

|- Buff Avatar 
/if (${Me.SpellReady[${SpellATK}]}) /call Cast_Avatar 

|- Group Heals 
/call Check_grpHPs 

/goto :Main_Loop 
/return 

| ############### 
| ############### Main Loop Ends 
| ############### 


| ############### Mem Spells in Spell List 

Sub MemSpells 

/echo Memming spells. Hang on. 
/if ( !${Me.Gem[${SpellCanni}]} ) { 
/memspell 1 ${SpellCanni} 
/delay 25 
} 
/if ( !${Me.Gem[${SpellSlow}]} ) { 
/memspell 2 ${SpellSlow} 
/delay 20 
} 
/if ( !${Me.Gem[${SpellDeBuff}]} ) { 
/memspell 3 ${SpellDeBuff} 
/delay 20 
} 
/if ( !${Me.Gem[${SpellATK}]} ) { 
/memspell 4 ${SpellATK} 
/delay 20 
} 
/if ( !${Me.Gem[${SpellPet}]} ) { 
/memspell 5 ${SpellPet} 
/delay 20 
} 
/if ( !${Me.Gem[${SpellHeal}]} ) { 
/memspell 6 ${SpellHeal} 
/delay 20 
} 
/if ( !${Me.Gem[${SpellHoT}]} ) { 
/memspell 7 ${SpellHoT} 
/delay 20 
} 
/if ( !${Me.Gem[${SpellDoT}]} ) { 
/memspell 8 ${SpellDoT} 
/delay 30 
} 
/if ( !${Me.Gem[${SpellMrDot}]} ) { 
/memspell 9 ${SpellMrDot} 
/delay 30 
} 

|/if ( ${Window[SpellBookWnd].Open} ) /windowstate SpellBookWnd close 
/echo Spells are memmed. 

/return 

| ################### Check target and do stuff like slow, dot, pet attack etc. 

Sub Combat 
/if (${CombatOn} && !${MobMaloed} && ${DoMalo} && 
${Target.ID}==${TargetArray[4]}) /call DeBuff 
/if (${CombatOn} && !${MobSlowed} && ${DoSlow} && 
${Target.ID}==${TargetArray[4]}) /call Slow 
/if (${CombatOn} && !${PetOn} && ${Target.ID}==${TargetArray[4]}) { 
/pet attack 
/varset PetOn TRUE 
/varset Engaged TRUE 
} 

|- Check for new events in chat etc etc... 
/doevents 

/if (${CombatOn} && ${DoDoT} && !${MobDoTed} && ${Me.PctMana}>=${RootMana} && 
${Target.PctHPs}<=${CastDoTat}) { 
/call cast ${SpellDoT} gem8 
/varset MobDoTed TRUE 
} 
/if (${CombatOn} && ${DoNuke} && ${Me.PctMana}>=${NukeMana} && 
${Target.PctHPs}<=${NukeAt}) { 
/call cast ${SpellNuke} gem9 
} 
/if (${CombatOn} && ${DoRoot} && ${Me.PctMana}>=${RootMana} && 
${Target.PctHPs}<=${RootAt}) { 
/call cast ${SpellRoot} gem9 
/varset MobRooted TRUE 
} 

|- Check for new events in chat etc etc... 
/doevents 

|- EndCombat 

/target ${TargetArray[3]} 

/if (!${Target.Name.Equal[${TargetArray[3]}]} || !${Target.ID}) { 
/echo ${TargetArray[1]} is dead 
/varset MobRooted FALSE 
/varset MobMaloed FALSE 
/varset MobSlowed FALSE 
/varset PetOn FALSE 
/varset MobDoTed FALSE 
/varset CombatOn FALSE 
/varset Engaged FALSE
/varset MobCrippled FALSE

/varset TargetArray[1] NULL 
/varset TargetArray[2] NULL 
/varset TargetArray[3] NULL 
/varset TargetArray[4] NULL 

} 
/return 

| ############### Debuff 

Sub DeBuff 
:DeBuff_Loop 
/if (${Target.PctHPs}<=${CombatAt} && ${Target.ID}==${TargetArray[4]}) { 
/if (${Me.CurrentMana}<${Spell[${SpellDeBuff}].Mana}) { 
/echo *** Shid ! I don't have mana to Malo %T 
} else { 
/call cast ${SpellDeBuff} gem3 6s 
/if (${Macro.Return.Equal["CAST_INTERRUPTED"]}) /goto :DeBuff_Loop 
/varset MobMaloed TRUE 
} 
:Cripple_Loop
/if (${Me.CurrentMana}<${Spell[${SpellCripple}].Mana}) { 
/echo *** Shid ! I don't have mana to Malo %T 
} else { 
/call cast ${SpellCripple} gem4 2s 
/if (${Macro.Return.Equal["CAST_INTERRUPTED"]}) /goto :Cripple_Loop 
/varset MobCrippled TRUE 
}
} 
/return 

| ############### Slowing 

Sub Slow 
/if (${Target.PctHPs}<=${CombatAt} && ${Target.ID}==${TargetArray[4]}) { 
/if (${Me.CurrentMana}<${Spell[${SpellSlow}].Mana}) { 
/echo Shid ! I don't have mana to Malo %T 
} else { 
:Slow_Loop 
/call cast ${SpellSlow} gem2 6s 
/if (${Macro.Return.Equal["CAST_INTERRUPTED"]}) /goto :Slow_Loop 
/if (${Macro.Return.Equal["CAST_IMMUNE"]}) { 
/if (${Verbose}) /gsay *** %T is IMMUNE to my slow ! 

/varset MobSlowed TRUE 
} 
/if (${Macro.Return.Equal["CAST_RESISTED"]}) { 
/if (!${FastSlow}) { 
/if (${Verbose}) /gsay *** %T RESISTED slow ! Trying again asap 
/goto :Slow_Loop 
} 
/varset MobSlowed TRUE 
} 
/if (${Macro.Return.Equal["CAST_SUCCESS"]}) { 
/if (${Verbose}) /gsay *** %T is SLOWED 
/varset MobSlowed TRUE 
} 

} 
} 
/return 

Sub GetTarget 
/assist ${M_Assist} 
/delay 3 
/if (${Target.Type.Equal[NPC]}) /if (${Target.Distance}<=${AssistAt} && 
${Target.ID}!=${TargetArray[4]} && ${Target.PctHPs}<=${CombatAt}) { 
/varset TargetArray[1] ${Target.CleanName} 
/varset TargetArray[2] ${Target.Level} 
/varset TargetArray[3] ${Target.Name} 
/varset TargetArray[4] ${Target.ID} 
/varset CombatOn TRUE 

/varset MobRooted FALSE 
/varset MobMaloed FALSE 
/varset MobSlowed FALSE 
/varset PetOn FALSE 
/varset MobDoTed FALSE
/varest MobCrippled FLASE 

/varset AAExp ${Math.Calc[${Me.PctAAExp}-${AAExp}]} 
/varset Exper ${Math.Calc[${Me.PctExp}-${Exper}]} 

/echo EXP: ${Exper}:${Me.PctExp}% - AAXP: ${AAExp}:${Me.PctAAExp}% - 
${Math.Calc[${Macro.RunTime}/60]} minutes 
/popup EXP: ${Exper}:${Me.PctExp}% - AAXP: ${AAExp}:${Me.PctAAExp}% - 
${Math.Calc[${Macro.RunTime}/60]} minutes 
/varset Exper ${Me.PctExp} 
/varset AAExp ${Me.PctAAExp} 
} 
/return 

| ################### Buff the group with buffs from the SpellGrpBuff array 


Sub GrpBuffs 
/declare i int local 1 
/for i 1 to ${SpellGrpBuff.Size} 
/doevents 
/if (${Spell[${SpellGrpBuff[${i}]}].Mana} > ${Me.CurrentMana}) /return 
/if ( !${Me.Buff[${SpellGrpBuff[${i}]}].ID} ) { 
/target pc ${M_Assist} 
/delay 3 
/echo *** Hang on ! Rebuffing ${SpellGrpBuff[${i}]} 
/call cast ${SpellGrpBuff[${i}]} gem5 5s 
} 
/next i 
/return 

|################### Check if any group member needs heal 
Sub Check_grpHPs 
/declare i int local 1 

/for i 1 to ${Group} 

/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[Enchanter]}) /if 
(${Group[${i}].PctHPs}<=${CasterHeals}) { 
/target pc ${Group[${i}]} 
/if (${Me.CurrentMana}<${Spell[${SpellHeal}].Mana}) { 
/echo *** Shid ! I don't have mana to heal ${Group[${i}]} 
} else /if (${Target.Distance}<=100) { 
/if (${Verbose}) /gsay *** ${SpellHeal} on %T 
/call cast ${SpellHeal} gem6 4s 
} 
} 

/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[${M_Assist}]}) { 
/target pc ${Group[${i}]} 
/if (${Me.CurrentMana}<${Spell[${SpellHeal}].Mana}) { 
/echo *** Shid ! I don't have mana to heal ${Group[${i}]} 
} else /if (${Target.Distance}<=100) { 
/if (${Verbose}) /gsay *** ${SpellHeal} on %T 
/call cast ${SpellHeal} gem6 4s 
} 
} 

/if (${Group[${i}].Name.Equal[${M_Assist}]} && 
${Group[${i}].PctHPs}<=${TankHeal}) { 
/target pc ${Group[${i}]} 
/if (${Me.CurrentMana}<${Spell[${SpellHeal}].Mana}) { 
/echo *** Shid ! I don't have mana to heal ${Group[${i}]} 
} else /if (${Target.Distance}<=100) { 
/if (${Verbose}) /gsay *** ${SpellHeal} on %T 
/call cast ${SpellHeal} gem6 4s 
} 
} 

/next i 
/return 

| ################### Check Mana level and report it 

Sub Check_Mana 
/if (${Math.Calc[${Me.MaxMana}*${MinMana}/100]} >= ${Me.CurrentMana} && 
!${LowMana}) { 
/varset LowMana TRUE 
/gsay I am LOM... 
} else /if (${Math.Calc[${Me.MaxMana}*${BuffMana}/100]} <= ${Me.CurrentMana} 
&& ${LowMana}) { 
/gsay I am GTG... 
/varset LowMana FALSE 
} 
/return 

| ################## Canni 5 

Sub Cannibalization 
/call CheckMyHPs 
/if (${Me.CurrentHPs} < 2424) { 
/call CheckMyHPs 
} else /if (${Me.Buff[${SpellHoT}].ID}) { 
/if (${Verbose}) /gsay *** Canni V will Q myself 
/aa act Cannibalization 
/delay 3s 
} 
/return 

| ################## This will NOT check self HPs, Only check HoT or recast HoT 

Sub CheckMyHPs 
/if (${Me.CurrentMana}<${Spell[${SpellHoT}].Mana}) { 
/echo *** Shit, I don't have mana to cast ${SpellHoT} 
} else { 
/target myself 
/delay 3 
/if (!${Me.Buff[${SpellHoT}].ID}) /call cast ${SpellHoT} gem7 3s 
} 
/return 

| ################## This will Check to see if I am Low on Mana 

Sub LOM 
/if (${Me.CurrentHPs} < ${Math.Calc[${Me.MaxHPs}/2]}) /call CheckMyHPs 
/if (${Me.CurrentMana} < ${Math.Calc[${Me.MaxMana}-5]} && 
${Me.SpellReady[${SpellCanni}]}) /call cast ${SpellCanni} gem1 6s 
/if (${Cannibalization} && ${Me.AltAbilityReady[47]} && ${Me.CurrentMana} < 
${Math.Calc[${Me.MaxMana}-1200]} && ${Me.MaxHPs} > 2424) /call Cannibalization 

/return 

| ################## This will Check to see if I have SOW 

Sub SOW 
/if (!${Me.Buff[Spirit of Eagle].ID} && !${Me.Buff[Flight of Eagles].ID} && 
!${Me.Buff[Spirit of Bih`Li].ID} && ${DoSow} && ${OutDoors}) { 
/target pc ${M_Assist} 
/call cast "Spirit of Bih`Li" gem5 17s 
} 
/return 

| ################## Summon pet and buff with spells from SpellPetBuff array 

Sub Pet 
/if (!${Me.Pet.ID} && ${SummonPet} && 
${Spell[${SpellPet}].Mana}<=${Me.CurrentMana}) { 
/call cast ${SpellPet} gem5 25s 
/echo Buff ${Me.Pet.ID} with ${SpellPet} 
} 
/declare i int local 
/for i 1 to ${SpellPetBuff.Size} 
/if (!${Me.PetBuff[${SpellPetBuff[${i}]}]} && 
${Spell[${SpellPetBuff[${i}]}].Mana}<=${Me.CurrentMana}) { 
/pet target 
/delay 2 
/call cast ${SpellPetBuff[${i}]} gem5 9s 
} 
/next i 
/return 


|################### Casting Avatar on all melee classes in group 

Sub Cast_Avatar 
/declare i int local 0 
/for i 0 to ${Group} 
/if (${Group[${i}].ID}) { 
/if (${ATKBuffed${i}}==0) /if (${Group[${i}].Class.Name.Equal[Beastlord]} 
|| ${Group[${i}].Class.Name.Equal[Shadow Knight]} || 
${Group[${i}].Class.Name.Equal[Bard]} || ${Group[${i}].Class.Name.Equal[Ranger]} 
|| ${Group[${i}].Class.Name.Equal[Rogue]} || 
${Group[${i}].Class.Name.Equal[Paladin]} || 
${Group[${i}].Class.Name.Equal[Monk]} || 
${Group[${i}].Class.Name.Equal[Warrior]}) { 
/target pc ${Group[${i}]} 
/if (${Me.CurrentMana}>${Spell[${SpellATK}].Mana}) { 
/tell ${Group[${i}]} ${SpellATK} is incomming to you ${Group[${i}]} , 
Stay in Range !!! 
/call cast ${SpellATK} gem4 4s 
/if (${Macro.Return.Equal["CAST_OUTOFRANGE"]}) /varset ATKBuffed${i} 
200 
/if (${Macro.Return.Equal["CAST_SUCCESS"]}) /varset ATKBuffed${i} 
${AvatarDelay} 
/return 
} 
} 
} 
/next i 
/return 
| ################## Hungry 

Sub Event_Hungry 
/if (${Engaged}) /return 
/echo I am Hungry 
/gsay I am summoning food... please hold pulls 
/declare i int local 1 
/for i 1 to 8 
/autoinventory 
/delay 1 
/call cast ${SpellFOOD} gem5 5s 
/next i 
/autoinventory 
/gsay GTG now 
/return 

| ################## Thirsty 

Sub Event_Thirsty 
/if (${Engaged}) /return 
/echo I am Thirsty 
/gsay I am summoning drink... please hold pulls 
/declare i int local 1 
/for i 1 to 8 
/autoinventory 
/delay 1 
/call cast ${SpellDRINK} gem5 5s 
/next i 
/autoinventory 
/gsay GTG now 
/return 

| ################## ENRAGE ON 

Sub Event_Enrageon 
/if (${PetOn}) { 
/echo Mob is ENRAGED! 
/pet back off 
} 
/return 

| ################## ENRAGE OFF 

Sub Event_Enrageoff 
/if (${PetOn}) { 
/echo Mob is no longer Enraged! 
/pet attack 
} 
/return 

| ################## Outdoors 

Sub Event_OutDoor 
/echo This is an indoor zone. Sorry. 
/varset OutDoors FALSE 
/return 

| ################## Zoning 

Sub Event_Zoning 
/echo I zoned, time to shrink 
/gsay Shrinks incomming Now 
/delay 10 
/call cast ${SpellSHRINK} gem5 5s 
/call cast ${SpellSHRINK} gem5 5s 

/varset TargetArray[1] ${Target.CleanName} 
/varset TargetArray[2] ${Target.Level} 
/varset TargetArray[3] ${Target.Name} 
/varset TargetArray[4] ${Target.ID} 
/varset CombatOn TRUE 

/varset MobRooted FALSE 
/varset MobMaloed FALSE 
/varset MobSlowed FALSE 
/varset PetOn FALSE 
/varset MobDoTed FALSE
/varset MobCrippled FALSE 

/return 

| ################## Group Invite 

Sub Event_Invited 
/invite 
/return 

| ################## I Died 

Sub Event_ImDead 
/echo Bummer ! 
:Zone_Loop 
/if ( ${Me.Bound.ID} != ${Zone.ID} ) /goto :Zone_Loop 
/delay 5s 
/consent group 
/delay 5 
/gsay Im ready to get rez. 
/gsay I have consented group. 
/call Wait4Rez 
/delay 20 
/call MemSpells 
/if (${Me.State.Equal[Stand]}) /sit 

| We do some short meditate before we start again. 

:Meditate 
/delay 1s 
/if (${Me.CurrentMana} < 300) /goto :Meditate 
/return 

| ################## This part is taken from wait4res. 

Sub Wait4Rez 
:waitforrez 
/if (!${Window[ConfirmationDialogBox].Open}) { 
/delay 5s ${Window[ConfirmationDialogBox].Open} 
/goto :waitforrez 
} 
/if (${Window[ConfirmationDialogBox].Open}) /notify ConfirmationDialogBox 
Yes_Button leftmouseup 
:zonein 
/delay 5 
/squelch /target mycorpse 
/delay 5 
/if (${Target.CleanName.NotEqual[${Me}'s corpse]}) /goto :zonein 
/if (${Target.CleanName.Equal[${Me}'s corpse]}) { 
/delay 3s 
/call Loot_Corpse 
} else /goto :zonein 
/return 

| ################# Looting Corpse 

Sub Loot_Corpse 
/declare LootTotal int local 0 
/declare LootSlot int local 
/squelch /target mycorpse 
/if (${Target.Type.NotEqual[CORPSE]} || !${Target.ID}) { 
/echo ** Can't target my corpse. 
/return 
} 
/corpse 
/delay 1s 
/loot 
/delay 1s 
/if (${Me.State.NotEqual[BIND]}) { 
/echo ** Massive lag right now... Aborting looting. 
/return 
} 
:LootLag 
/if (${LootTotal}!=${Corpse.Items}) { 
/varset LootTotal ${Corpse.Items} 
/delay 5 
/goto :LootLag 
} 
/for LootSlot 1 to ${LootTotal} 
:LootItem 
/itemnotify loot${LootSlot} rightmouseup 
/delay 3 
/if (${Corpse.Item[${LootSlot}].ID}) { 
/delay 2 
/goto :LootItem 
} 
/next LootSlot 
/delay 5 
/echo ** Done looting my corpse. 
/notify LootWnd DoneButton leftmouseup 
/return 

| ################# 
| ################# Tells n Hells 
| ################# 

Sub Event_Chat(string ChatType,string ChatSender,string ChatText) 

/if (!${ChatType.Equal[GROUP]} && !${ChatType.Equal[TELL]}) /return 

| ################# Heal Requests 

/if (${ChatText.Equal[heal]} || ${ChatText.Equal[heal me]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellHeal} is incomming !! 
/call cast ${SpellHeal} 
} 
/return 
} 

/if (${ChatText.Equal[hot]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellHoT} is incomming !! 
/call cast ${SpellHoT} 
} 
/return 
} 

| ################# Mob Requests 

/if (${ChatText.Equal[slow]} || ${ChatText.Equal[add]}) { 
/assist ${ChatSender} 
/if (${Target.Type.Equal[NPC]} && ${Target.Distance}<=100) { 
/call cast ${SpellDebuff} gem3 6s 
/call cast ${SpellSlow} gem2 6s 
/tell ${ChatSender} %T is ${SpellDeBuff} and slowed with ${SpellSlow} 
} 
/return 
} 

/if (${ChatText.Equal[MrDot]}) { 
/assist ${ChatSender} 
/if (${Target.Type.Equal[NPC]} && ${Target.Distance}<=100) { 
/call cast ${MrDot} gem9 5s 
} 
/return 
} 

/if (${ChatText.Equal[nuke]}) { 
/assist ${ChatSender} 
/if (${Target.Type.Equal[NPC]} && ${Target.Distance}<=100) { 
/call cast ${SpellNuke} gem9 
} 
/return 
} 

/if (${ChatText.Equal[dot]}) { 
/assist ${ChatSender} 
/if (${Target.Type.Equal[NPC]} && ${Target.Distance}<=100) { 
/call cast ${SpellDot} gem8 5s 
} 
/return 
} 

/if (${Engaged}) /return 

| ################# Buff Requests 

/if (${ChatText.Equal[avatar]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellATK} is incomming to you ${ChatSender}!!! 
/call cast ${SpellATK} gem4 4s 
} 
/return 
} 

/if (${ChatText.Equal[PR]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellPR} is incomming to you ${ChatSender}!!! 
/call cast ${SpellPR} gem4 4s 
} 
/return 
} 

/if (${ChatText.Equal[Sos]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellSos} is incomming to you ${ChatSender}!!! 
/call cast ${SpellSos} gem4 4s 
} 
/return 
} 


/if (${ChatText.Equal[haste]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellHASTE} is incomming to you ${ChatSender}!!! 
/call cast ${SpellHASTE} gem5 5s 
} 
/return 
} 

/if (${ChatText.Equal[Wunshi]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellWunshi} is incomming to you 
${ChatSender}!!! 
/call cast ${SpellWunshi} gem4 4s 
} 
/return 
} 

/if (${ChatText.Equal[focus]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellFOCUS} is incomming to you 
${ChatSender}!!! 
/call cast ${SpellFOCUS} gem5 5s 
} 
/return 
} 

/if (${ChatText.Equal[cha]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellCHA} is incomming to you ${ChatSender}!!! 
/call cast ${SpellCHA} gem5 5s 
} 
/return 
} 

/if (${ChatText.Equal[lev]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellLEV} is incomming to you ${ChatSender}!!! 
/call cast ${SpellLEV} gem5 5s 
} 
/return 
} 

/if (${ChatText.Equal[sow]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellSOW} is incomming to you ${ChatSender}!!! 
/call cast ${SpellSOW} gem5 5s 
} 
/return 
} 
/if (${ChatText.Equal[grow]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellGROW} is incomming to you 
${ChatSender}!!! 
/call cast ${SpellGROW} gem5 5s 
} 
/return 
} 

/if (${ChatText.Equal[shrink]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellSHRINK} is incomming to you 
${ChatSender}!!! 
/call cast ${SpellSHRINK} gem5 5s 
} 
/return 
} 


/if (${ChatText.Equal[see]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellSEE} is incomming to you ${ChatSender}!!! 
/call cast ${SpellSEE} gem5 5s 
} 
/return 
} 


/if (${ChatText.Equal[str]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellSTR} is incomming to you ${ChatSender}!!! 
/call cast ${SpellSTR} gem5 5s 
} 
/return 
} 

/if (${ChatText.Equal[Might]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellMight} is incomming to you ${ChatSender}!!! 
/call cast ${SpellMight} gem5 5s 
} 
/return 
} 

/if (${ChatText.Equal[dex]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellDEX} is incomming to you ${ChatSender}!!! 
/call cast ${SpellDEX} gem5 5s 
} 
/return 
} 

/if (${ChatText.Equal[Forti]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellForti} is incomming to you 
${ChatSender}!!! 
/call cast ${SpellForti} gem4 4s 
} 
/return 
} 

/if (${ChatText.Equal[sta]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellSTA} is incomming to you ${ChatSender}!!! 
/call cast ${SpellSTA} gem5 5s 
} 
/return 
} 

/if (${ChatText.Equal[agi]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellAGI} is incomming to you ${ChatSender}!!! 
/call cast ${SpellAGI} gem5 5s 
} 
/return 
} 

/if (${ChatText.Equal[regen]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellREGEN} is incomming to you 
${ChatSender}!!! 
/call cast ${SpellREGEN} gem5 5s 
} 
/return 
} 

/if (${ChatText.Equal[pe]}) { 
/target pc ${ChatSender} 
/if (${Target.Type.Equal[PC]} && ${Target.Distance}<=100) { 
/tell ${ChatSender} ${SpellPE} is incomming to you ${ChatSender}!!! 
/call cast ${SpellPE} gem5 5s 
} 
/return 
} 

| ################# Follow me 

/if (${ChatText.Equal[Follow me]} || ${ChatText.Equal[Follow]}) { 
/delay 5 
/if (!${Spawn[${ChatSender}].ID}) { 
/e ${ChatSender} is not in zone for me to follow! 
/return 
} 
/varset follname ${ChatSender} 
/varset following 1 
/tell ${ChatSender} I am following you!!! 
/if ( ${Me.Mount.ID} ) /dismount 
: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}>40) /keypress forward hold 
/if (${Target.Distance}<39) /keypress back 
/if (!${Target.ID}) /varset following 0 
/doevents 
/if ((${Target.Name.Equal[${follname}]})&&(${following}>0)) { 
/goto :Loop 
} else { 
/keypress forward 
/keypress back 
} 
} 


| ################# Stop Following me 

/if (${ChatText.Equal[End follow]} || ${ChatText.Equal[stop]}) { 
/varset following 0 
/keypress forward 
/keypress back 
/timed 50 /face pc ${follname} 
/tell ${ChatSender} I Stopped following you!!! 
/return 
} 

| ################# Single Rebuff 

/if (${ChatText.Equal[buff me]}) { 
/echo Request for Single Buff 
/declare i int local 1 
/for i 1 to ${SpellSingleBuff.Size} 
/if (${Spell[${SpellSingleBuff[${i}]}].Mana} > ${Me.CurrentMana}) { 
/tell ${ChatSender} ${ChatSender} Sorry I am getting LOM 
/echo DAMN.. LOM... Cannibalizing to rebuff 
:Hold_Single_Rebuff 
/Call LOM 
/if (${Spell[${SpellSingleBuff[${i}]}].Mana} > ${Me.CurrentMana}) { 
/goto :Hold_Single_Rebuff 
} 
} 
/target pc ${ChatSender} 
/delay 3 
/echo *** Hang on ! Buffing ${SpellSingleBuff[${i}]} 
/tell ${ChatSender} Buffing ${SpellSingleBuff[${i}]} now... 
/call cast ${SpellSingleBuff[${i}]} gem5 5s 
/next i 
/return 
} 

| ################# Single Rebuff other 

/if (${ChatText.Equal[buff]}) { 
/echo Request for Single Buff other 
/assist ${ChatSender} 
/declare i int local 1 
/for i 1 to ${SpellSingleBuff.Size} 
/if (${Spell[${SpellSingleBuff[${i}]}].Mana} > ${Me.CurrentMana}) { 
/tell ${ChatSender} ${ChatSender} Sorry I am getting LOM 
/echo DAMN.. LOM... Cannibalizing to rebuff 
:Hold_Single_Rebuff 
/Call LOM 
/if (${Spell[${SpellSingleBuff[${i}]}].Mana} > ${Me.CurrentMana}) { 
/goto :Hold_Single_Rebuff 
} 
} 
/delay 3 
/echo *** Hang on ! Rebuffing ${SpellSingleBuff[${i}]} 
/tell ${ChatSender} Buffing ${SpellSingleBuff[${i}]} now... 
/call cast ${SpellSingleBuff[${i}]} gem5 7s 
/next i 
/return 
} 

| ################# Group Rebuff other group 

/if (${ChatText.Equal[buff them]}) { 
/assist ${ChatSender} 
/declare i int local 1 
/for i 1 to ${SpellGrpBuff.Size} 
/if (${Spell[${SpellGrpBuff[${i}]}].Mana} > ${Me.CurrentMana}) { 
/tell ${ChatSender} ${ChatSender}, Sorry I am getting LOM 
/echo DAMN.. LOM... Cannibalizing to rebuff 
:Hold_Group_Rebuff 
/Call LOM 
/if (${Spell[${SpellGrpBuff[${i}]}].Mana} > ${Me.CurrentMana}) { 
/goto :Hold_Group_Rebuff 
} 
} 
/delay 3 
/echo *** Hang on ! Rebuffing ${SpellGrpBuff[${i}]} 
/tell ${ChatSender} Buffing ${SpellGrpBuff[${i}]} now... 
/call cast ${SpellGrpBuff[${i}]} gem5 7s 
/next i 
/return 
} 


| ################# Other Pet Buffing 

/if (${ChatText.Equal[buff pet]}) { 
/echo Request for Pet Buffs 
/target id ${Spawn[pc ${ChatSender}].Pet.ID} 
/delay 3 
/tell ${ChatSender} Targetting your pet, %T for buffs... 
/declare i int local 1 
/for i 1 to ${SpellPetBuffo.Size} 
/if (${Spell[${SpellPetBuffo[${i}]}].Mana} > ${Me.CurrentMana}) { 
/tell ${ChatSender} ${ChatSender} Sorry I am getting LOM 
/echo DAMN.. LOM... Cannibalizing to rebuff 
:Hold_Pet_Rebuff 
/Call LOM 
/if (${Spell[${SpellPetBuffo[${i}]}].Mana} > ${Me.CurrentMana}) { 
/goto :Hold_Pet_Rebuff 
} 
} 
/delay 3 
/echo *** Hang on ! Rebuffing ${SpellPetBuffo[${i}]} 
/tell ${ChatSender} buffing ${SpellPetBuffo[${i}]} now... 
/call cast ${SpellPetBuffo[${i}]} gem5 5s 
/next i 
/return 
} 

| ################### Go Home 

/if (${ChatText.Equal[gate now]} && ${ChatType.Equal[TELL]}) { 
/call cast ${SpellGATE} gem9 
/return 
} 

/if (${ChatType.Equal[TELL]}) { 
/1 [${ChatSender}]:${ChatText} 
/vtell ${ChatController} 001 
/return 
} 


/return 



| ################### This will check whenever the player is changing any 
variable via /echo 

Sub Event_ToggleVariable(string Line, string Command, string Command2) 

/if (${Command.Equal[malo]} && ${DoMalo}==0) { 
/varset DoMalo TRUE 
/echo Do Malo: ${DoMalo} 
} else /if (${Command.Equal[malo]}) { 
/varset DoMalo FALSE 
/echo Do Malo: ${DoMalo} 
} 

/if (${Command.Equal[slow]} && ${DoSlow}==0) { 
/varset DoSlow TRUE 
/echo Do Slow: ${DoSlow} 
} else /if (${Command.Equal[slow]}) { 
/varset DoSlow FALSE 
/echo Do Slow: ${DoSlow} 
} 

/if (${Command.Equal[fastslow]} && ${FastSlow}==0) { 
/varset FastSlow TRUE 
/echo Do Fast Slow: ${FastSlow} 
} else /if (${Command.Equal[fastslow]}) { 
/varset FastSlow FALSE 
/echo Do Fast Slow: ${FastSlow} 
} 

/if (${Command.Equal[root]} && ${DoRoot}==0) { 
/varset DoRoot TRUE 
/echo Do Root: ${DoRoot} 
} else /if (${Command.Equal[root]}) { 
/varset DoRoot FALSE 
/echo Do Root: ${DoRoot} 
} 

/if (${Command.Equal[pet]} && ${SummonPet}==0) { 
/varset SummonPet TRUE 
/echo Summon Pet: ${SummonPet} 
} else /if (${Command.Equal[pet]}) { 
/varset SummonPet FALSE 
/echo Summon Pet: ${SummonPet} 
} 

/if (${Command.Equal[dot]} && ${DoDoT}==0) { 
/varset DoDoT TRUE 
/echo Do DoT: ${DoDoT} 
} else /if (${Command.Equal[dot]}) { 
/varset DoDoT FALSE 
/echo Do DoT: ${DoDoT} 
} 

/if (${Command.Equal[buffs]} && ${DoBuffs}==0) { 
/varset DoBuffs TRUE 
/echo Do Buffs: ${DoBuffs} 
} else /if (${Command.Equal[buffs]}) { 
/varset DoBuffs FALSE 
/echo Do Buffs: ${DoBuffs} 
} 

/if (${Command.Equal[sow]} && ${DoSow}==0) { 
/varset DoSow TRUE 
/echo Do Sow: ${DoSow} 
} else /if (${Command.Equal[sow]}) { 
/varset DoSow FALSE 
/echo Do Sow: ${DoSow} 
} 

/if (${Command.Equal[nuke]} && ${DoNuke}==0) { 
/varset DoNuke TRUE 
/echo Do Nuke: ${DoNuke} 
} else /if (${Command.Equal[nuke]}) { 
/varset DoNuke FALSE 
/echo Do Nuke: ${DoNuke} 
} 

/if (${Command.Equal[heal]} && ${DoHeal}==0) { 
/varset DoHeal TRUE 
/echo Do Heal: ${DoNuke} 
} else /if (${Command.Equal[heal]}) { 
/varset DoHeal FALSE 
/echo Do Heal: ${DoNuke} 
} 

/if (${Command.Equal[verbose]} && ${Verbose}==0) { 
/varset Verbose TRUE 
/echo Verbose: ${Verbose} 
} else /if (${Command.Equal[verbose]}) { 
/varset Verbose FALSE 
/echo Verbose: ${Verbose} 
} 

/if (${Command.Equal[buffpet]} && ${BuffPet}==0) { 
/varset BuffPet TRUE 
/echo Buff Pet: ${BuffPet} 
} else /if (${Command.Equal[buffpet]}) { 
/varset BuffPet FALSE 
/echo Buff Pet: ${BuffPet} 
} 

/if (${Command.Equal[assistat]}) { 
/varset AssistAt ${Command2} 
/echo Assisting at range: ${AssistAt} _ (Longer range then 100 is futile) 
} 

/if (${Command.Equal[dotat]}) { 
/varset CastDoTat ${Command2} 
/echo Casting ${SpellDoT} at ${CastDoTat}% 
} 

/if (${Command.Equal[rootat]}) { 
/varset Rootat ${Command2} 
/echo Rooting Mobs at ${Rootat}% 
} 

/if (${Command.Equal[nukeat]}) { 
/varset NukeAt ${Command2} 
/echo Starting to Nuke Mobs at ${NukeAt}% 
} 

/if (${Command.Equal[combatat]}) { 
/varset CombatAt ${Command2} 
/echo Initiate Combat at ${CombatAt}% (Malo / Slow) 
} 

/if (${Command.Equal[healtankat]}) { 
/varset TankHeal ${Command2} 
/echo Healing ${M_Assist} at ${TankHeal}% 
} 

/if (${Command.Equal[healmeleeat]}) { 
/varset MeleeHeals ${Command2} 
/echo Healing all Melee classes at ${MeleeHeals}% 
} 

/if (${Command.Equal[healcastersat]}) { 
/varset CasterHeals ${Command2} 
/echo Healing all Caster classes at ${CasterHeals}% 
} 

/if (${Command.Equal[assist]}) { 
/varset M_Assist ${Command2} 

/sq /target pc ${M_Assist} 
/if (!${Target.ID}) { 
/echo ${M_Assist} is not here dude ! 
/return 
} 

/echo I will assist: ${M_Assist} 
} 

/if (${Command.Equal[healat]}) { 
/varset HealGRPat ${Command2} 
/echo Healing any group member below ${HealGRPat}% HPs 
} 

/if (${Command.Equal[Show]}) { 

/echo --------------------------- 
/echo Do Malo:..............${DoMalo} - Casting at: ${CombatAt}% (Initiate Combat*, higher then 99 is no good) 
/echo Do Slow:..............${DoSlow} - Casting at: ${CombatAt}% (Initiate Combat*, higher then 99 is no good) 
/echo Do Fastslow:......${FastSlow} - (Will only try to slow once!) 
/echo Do Nuke:.............${DoNuke} - Casting at: ${NukeAt}% (Will chain nuke mob to death) 
/echo Do Dot:................${DoDoT} - Casting at: ${CastDoTat}% 
/echo Do Pet:................${SummonPet} 
/echo Do Buffs:.............${DoBuffs} 
/echo Do Root:..............${DoRoot} - Casting at: ${Rootat}% 
/echo Do Sow:...............${DoSow} 
/echo Do Heal:..............${DoHeal} 
/echo Buff Pet:.............${BuffPet} 
/echo --------------------------- 
/echo Assist range: ${AssistAt} 
/echo Assisting: ${M_Assist} 
/echo Healing Casters: ${CasterHeals}% Melees: ${MeleeHeals}% 
/echo ${M_Assist} get heals at ${TankHeal} 
/echo Initiate Combat: ${CombatAt}% 
/echo Verbose: ${Verbose} 
/echo 
/echo help - Will show help to set variables. 

} 

/if (${Command.Equal[help]}) { 
/echo ___ Shaman Do Stuff Script ___ 
/echo 
/echo Commands that will turn ON or OFF 
/echo malo, slow, fastslow, root, pet, dot, buffs, sow, nuke, heal, buffpet 
/echo 
/echo fastslow will NOT check if the slow is landed or not. Good to have on 
when you skip maloing. 
/echo Commands to change values, ie: assistat 50 (Will start the combat 
routine when mob is in range 50) 
/echo assisat <range> - Most spells don't go longer then 100 
/echo combatat <% hps> - Initiate Combat when mob is at % HPs 
/echo healtankat <% hps> 
/echo healmeeleat <% hps> 
/echo healcastersat <% hps> 
/echo assist <PC Name> 
} 

/return
 
Last edited:
it's all relative, you have to think of how much of a difference mq2 already does when playing on al'kabor versus playing there without it.
I can tell you that I will never release any detrimental hacks for this version of mq2 and if someone else does ill withdraw my support altogether from the project.
So forget piggy zone.
Docrack is a little different though and I am willing to introduce a couple hacks and here is my reasoning for that, noweight for example, this is already how it works on live servers also in some zones like Pok I would not object to no fall damage.
But absolutely no crap like super speed and ghostkill and the likes...
Lets try to not ruin this server but just make it behave more like the live servers.

And finally about that macro, I'm working on spell mem stuff I'll post something that works this week most likely.
 
Last edited:
After a good nights sleep I think I might have come off a tad harsh in the post above, look, I value everyone's opinion about hacks and stuff, I just think we need to be extra careful with Al'kabor, it's a special server...
I am for implementing features that makes it more fun to play on it, and I'm for implementing features that exist on the other servers.
That would mean that I could probably, with good conscience, put a new stone/door in Pok that would zone you to bazaar for example, since such a door exist on live.
So ok, a very limited version of piggy zone that only does what can be done on live is not out of the question.
Another example of a game enhancing feature I would consider adding would be a bazaar anywhere plugin cause having to go there to just see if an item is up is just retarded.
 
Last edited:
I don't think you came off harsh. It really is a tough line to walk in releasing any of this, imo. People come along and build off your work and release something like ghostkill which ruins it for the people who just wanted it for convenience.

Leads me to this question... are there plenty of groups available at 65 if I decide not to box?
 
Leads me to this question... are there plenty of groups available at 65 if I decide not to box?

I tend to box as no one seems to go to BoT much mainly just PoV pugs so if you can box go for it.
 
I just commited a fix for forward stand up, any key mapped to forward (normal or alternative) will now stand the char up (as intended) also strafe (left/right) are now working try /keypress strafe_left hold for an example... this should make macros that uses that command work.

htw will release it at his conviniance.

Today im gonna try to fix breakstick on keyboard for mq2moveutils, ill be back with updates on this later.
 
Last edited:
That would mean that I could probably, with good conscience, put a new stone/door in Pok that would zone you to bazaar for example, since such a door exist on live.
I don't think you came off harsh. I greatly respect your stance. That being said I think this idea is a mistake. While it might be convenient for some I think it would be noticed and I think its a very slippery slope.

/Baz from anywhere would limit the useless trips through the Nexus however. Running through the Nexus isn't that harsh. Its one extra zone and a short distance at that.

This is old school EQ. There's a lot of stuff on Live that isn't here. That's why we're here and not on Live. Its one thing to enhance the UI, improve multiboxing, or macro tradeskills. Maybe even change my weight or my vision. But I think anything that can be witnessed by another player as a nothing other than a blatant hack does more harm than good: to EQMac, to the nonMQ2 PC players and the MQ2 community as a whole. They're already scared to death of us. Why paint a target on our backs?

Fry said:
We will not be publishing active hacks for this server. We would like to keep MQ2 usage low key and have as minimal impact on the player base as possible.
Please keep this promise.
 
Last edited:
That would mean that I could probably, with good conscience, put a new stone/door in Pok that would zone you to bazaar for example, since such a door exist on live.
I don't think you came off harsh. I greatly respect your stance. That being said I think this idea is a mistake. While it might be convenient for some I think it would be noticed and I think its a very slippery slope.

/Baz from anywhere would limit the useless trips through the Nexus however. Running through the Nexus isn't that harsh. Its one extra zone and a short distance at that.

This is old school EQ. There's a lot of stuff on Live that isn't here. That's why we're here and not on Live. Its one thing to enhance the UI, improve multiboxing, or macro tradeskills. Maybe even change my weight or my vision. But I think anything that can be witnessed by another player as a nothing other than a blatant hack does more harm than good: to EQMac, to the nonMQ2 PC players and the MQ2 community as a whole. They're already scared to death of us. Why paint a target on our backs?

I agree.
 
good points there, its a balance act for us what to implement and what not, im of the opinion, that the players on al'kabor don't get the full experience of everquest, since soe refuses to patch/continue development on the server and bring some nice features like bazaar anywhere/spellmenu/map to it... now I realize the mac users cant run mq2 but at least this gives them an alternative and a chance to experience what eq is for players on live without having to start over on another server...

Anyway we will try our best to keep bad hacks out, and will absolutely take our members wishes as well as logic into account before making any rash decicions.

In any case, new features are at the very bottom of our list and a long time into the future if ever, Right now we are just focused on getting normal mq2 features/plugins and macroing working so people can do those things.

Doing a minipoll here how do you guys feel about introducing mercenaries?
 
Last edited:
Stupid question: is there a version number I can refer to when reporting issues?
I updated last night to get the new plugins and lost map functionality completely. I confirmed that the MQ2Map and MQ2MapWnd were still loaded but neither backspace nor M would bring up a map. I just rolled back to the prior version because I was in a hurry and didn't test further.

Thoughts?
 
I lost map functionality also, but i made a hotkey that fixed it..
/keypress Mq2Map and bound backspace and m to that key.

Hope this helps till someone can fix it :)
 
That one is fixed, will push an update tonight probably, along with mrwizeman's other stuff.

As far as version numbering, in game just do: /mmoversion

htw
 
Also, on macros: same thing as before... when running this shaman macro, it starts to mem a spell and the mem timer goes down about 2 slivers, then client freezes. No mq2 crash message, just client freeze and I have to alt-f4. Holding off boxing til I can get a working shaman macro. They all seem to crash for some reason, but this is the only one that crashes without popping the mq2 crash window.

Edit to add: they all include Spell_Routines.inc... think that could be it?

The memspell command isn't part of the spell_routines.inc. I believe the issue is the /delay after the memspell command is used. Spell memming takes significantly longer on AK. The delay will need to be increased.

To go further, if spell_routines.mac is required for a macro (as it is in your example) and you don't have it in the Macros folder then that will break it. Even if you copy it over from your Live MQ there's no guarantee. Every macro, every include will have to be tested/audited to make sure that the necessary requirements are present in either this version of EQ or MQ. Many of the more advanced macros (like simulated AI bots) will have many dependencies including plugins we don't even have. Even my relatively simple spell trainer had to be modified to work around differences.

On a high note this is a great opportunity for you to learn how macro programming really works by befriending debug messaging and working backward through the macros to find out where it breaks and why. Aren't you excited?!

Which reminds me.... MQ2Log please?
 
Thanks HTW for your work on MQ2Twist. I am away on conference this week, so have not had a chance to test any of the updates out yet. My bard will love you for this however!

mrwizeman - you did not come off harsh at all. I 100% support your stance. Active plugins like ghostkill, heck even warp would be so detrimental to this server. There is such a small community (I would put it at LESS then 1,000 active players in total) that these sort of things do not go un-noticed. Add to this, there is no instances on this server so one cannot "hide" out of eyesight of others.
 
Which reminds me.... MQ2Log please?

Yeah, that's the thing... with it crashing the client, I don't really get a chance to debug the macro. I'm decent with macros and the ones I'm looking at I've used for 3-4 years, just know next to nothing about the plugin side. Will mq2log log macro messages even if client crashes? I mean I'm not confident there even IS a macro message if it crashes the client.

I guess what I'm going to do is try out the troubleshooting he mentioned and if it still fails, just step through it one command at a time as fast as possible and see if I can find the failure. I'm fairly confident the failure lies with spell_routines.inc somewhere.
 
I had planned to do some polls in the future about thoughts on some hacks but here are my thoughts.

GhostKill - we all agree this is never going to happen. It would wreak the server.

Warp - There is another program out there that does this in a limited capability, but truthfully I am very against it at this stage.

Zone - This is where I am torn. Zone is very handy, not that noticeable if used responsibly, but in hands of wrong person can create a lot of heat for MQ2. If I played on this server, I would kill for this plugin as it would save me a lot of time without negatively impacting other players. I would not totally rule this out of question under right circumstances, but I'd need full agreement from the developers here and I'd personally want to wait a few months to see how current MQ2 usages affects the server before making my judgement on it.
 
Yeah, that's the thing... with it crashing the client, I don't really get a chance to debug the macro. I'm decent with macros and the ones I'm looking at I've used for 3-4 years, just know next to nothing about the plugin side. Will mq2log log macro messages even if client crashes? I mean I'm not confident there even IS a macro message if it crashes the client.

Well, that depends on when the crash occurs. MQ2Log logs what appears in the MQ2 Chat Window. A macro writes to the chat window if its told to (/echo). (MQ2 itself may also report a macro error to the chat window but then you usually get a line number anyway.) So if you have echo commands for debugging and you are using MQ2Log and the crash occurs in the execution stage and not the pre-execution stage then yes, it will record any messages that execute prior to the crash.

One of the fun parts of this EQMac project for me (but then I'm a bit of a masochist) has been going back to basics in the wikis here and at mq2.com. Its amazing to me how many things I have forgotten over the years as more and more great plugins have done the heavy lifting (and sometimes the thinking) for me.

Today's (re)discovery was /mqlog. Its not that much more work to add an /mqlog along with your /echo. It won't record every single thing from your chat window but used efficiently its a great start.
 
Last edited:
Just checked in what I hope is the last addition to keybinds.
Hopefully they are 100% now, and this fix also takes care of breakonkb for moveutils.
 
Could we get someone to take a look at /memspell please? Currently, the following scenarios working on live, but not on the mac build:

1.) If a specific spell is already memmed in a different gem number, /memspell 'new gem' "spell" doesn't work. The client returns "You cannot memorize a spell you already have memorized."

2.) If a specific gem already has a spell loaded into it, trying to memorize a new spell into that gem with /memspell doesn't work.
 
the spellmem system is being worked on already by me, I intend to add the rightcick spellset functionality from live, and while doing that im sure I can fix demem as well.

Having said that, isn't there a way to check if you already have spell memmed, and just not mem it if it already is?
 
Last edited: