Moderator: MacroQuest Developers


I am guessing here but I assume you named the macro chant.mac instead of diamond.mac since the 1st and 2nd numbers are your Y and X coordinates I think it should be 150.00 so based on your syntax above:Zeit wrote:/mac chant 150 150 90 90 90 90 1234 10
isnt working for me just ends there used the same syntax as previous versions it just ends like I didnt put it in right back to debuging !~
There is a macro designed for circle chanting that worked well for me before the last parm change but it is currently busted. There are two threads on it so it is somewhat confusing on which to use but when it is fixed I plan on trying it outXondar wrote:Was hoping someone might be able to change the diamond pattern to a perfect circle, avoids a lot of initial damage and looks better from a distance

Code: Select all
#turbo
#chat tell
#event Zoned "You have entered"
#event StatusReport "status report"
#event GainExp "You gain"
Sub Main
/zapvars
| These variables are related to movement and AI control.
/declare RubberX global
/declare RubberY global
/declare StopMe global
/declare StopTimer timer
/declare ProximityTimer timer
/varset RubberX @Param1
/varset RubberY @Param0
/varset CircleNE @Param9
/varset CircleNW @Param10
/varset CircleSE @Param11
/varset CircleSW @Param12
/varset StopMe 0
/varset ProximityTimer 1m
| These variables are related to song-twisting.
/declare SongTimer timer
/declare Songs array
/declare CurSong global
/declare PrevSong global
/declare nSongs global
/declare EachSong local
| Experience & Time Variables
/declare CurrentExp global
/declare CurrentAAXP global
/declare CurrentTime global
/varset CurrentExp ${Me.PctExp}
/varset CurrentAAXP ${Me.PctAAExp}
/varset CurrentTime ${Math.Calc[${Macro.RunTime}/60]}
| This block of code checks for proper arguments and echos error or initialization messages.
/if (!${Defined[Param7]}) {
/echo Usage: /mac Chant <Y> <X> <North> <South> <East> <West> <Song list> <TooClose> <NE> <NS> <SE> <SW>
/echo <Y> -- Y-coordinate of the center point.
/echo <X> -- X-coordinate of the center point.
/echo <North> -- Maximum distance north of the center point to travel.
/echo <South> -- Maximum distance south of the center point to travel.
/echo <East> -- Maximum distance east of the center point to travel.
/echo <West> -- Maximum distance west of the center point to travel.
/echo <Song list> -- List of songs to be sung, include Selo's if needed.
/echo <TooClose -- Distance at which non-friendly players halt kiting.
/echo <NE> -- more of a circle shape. +20 of <North> recommended
/echo <NS> -- more of a circle shape. -20 of <North> recommended
/echo <SE> -- more of a circle shape. +20 of <South> recommended
/echo <SW> -- more of a circle shape. -20 of <South> recommended
/endmacro
}
| This block of code sorts out the list of songs to be twisted while running.
/varset nSongs ${String[@Param6].Length}
/for EachSong 1 to @nSongs
/varset Songs(@EachSong) ${String[@Param6].Mid[${Math.Calc[@EachSong]},1]}
/echo Song @EachSong: ${Me.Gem[@Songs(@EachSong)]}
/next EachSong
/varset CurSong 1
/call Event_Timer
/echo Running a diamond path with center at @RubberY, @RubberX and chant-kiting mobs.
| The main loop, this iterates unless some AI warning is reached.
/keypress autorun
:ChantLoop
| Face the correct corner of the diamond, given character's current position.
/if (${Me.X}<@RubberX && ${Me.Y}>@RubberY) /face fast loc @RubberY,${Math.Calc[@RubberX-@Param4]}
/look -90
/if (${Me.X}>@RubberX && ${Me.Y}<@RubberY) /face fast loc @RubberY,${Math.Calc[@RubberX-@Param11]}
/look -90
/if (${Me.X}<@RubberX && ${Me.Y}<@RubberY) /face fast loc ${Math.Calc[@RubberY-@Param3]},@RubberX
/look -90
/if (${Me.X}<@RubberX && ${Me.Y}<@RubberY) /face fast loc ${Math.Calc[@RubberY-@Param12]},@RubberX
/look -90
/if (${Me.X}>@RubberX && ${Me.Y}<@RubberY) /face fast loc @RubberY,${Math.Calc[@RubberX+@Param5]}
/look -90
/if (${Me.X}>@RubberX && ${Me.Y}<@RubberY) /face fast loc @RubberY,${Math.Calc[@RubberX+@Param10]}
/look -90
/if (${Me.X}>@RubberX && ${Me.Y}>@RubberY) /face fast loc ${Math.Calc[@RubberY+@Param2]},@RubberX
/look -90
/if (${Me.X}>@RubberX && ${Me.Y}>@RubberY) /face fast loc ${Math.Calc[@RubberY+@Param9]},@RubberX
/look -90
| Do stuff if not in a holding phase.
/if (@StopMe==0) {
/doevents
/if (!${Me.Casting.ID}) {
/varset CurSong @PrevSong
/call Event_Timer
}
| If a GM zones in, shut down for 30 minutes.
/if (${Spawn[gm].ID}) {
/echo GM detected in zone, going into standby at $time(h):$time(m):$time(s).
/g GM detected in zone, going into standby at $time(h):$time(m):$time(s).
/stopsong
/varset StopMe 1
/varSet StopTimer 200
}
/if (@ProximityTimer<100) {
| If an ungrouped PC comes within specified range, shut down until they leave.
/if (${Spawn[pc noalert 1 radius @Param7].ID}) {
/echo ${Spawn[pc noalert 1 radius @Param7].CleanName} is inside @Param7 ft., going into standby at ${Time.Time12}.
/g ${Spawn[pc noalert 1 radius @Param7].CleanName} is inside @Param7 ft., going into standby at ${Time.Time12}.
/stopsong
/varset StopMe 2
/varset StopTimer 200
}
/varadd ProximityTimer 1m
}
| Get a new target if the current one is no good.
/if (!${Target.ID}) /call GetTarget
/if (${Target.Name.Find[corpse]}) /call GetTarget
/if (${Target.Type.Equal[PC]}) /call GetTarget
}
| Quit the ChantLoop and go into a holding phase if criteria are met.
/if (@StopTimer<10 && @StopMe>0) /goto :StopStuff
/goto :ChantLoop
| This block of code is operations to perform before going into the standby loop.
:StopStuff
| Face the far corner, stop moving and Fade Memories.
/stopsong
/face fast heading 135
/delay 10
/keypress back
/alt activate 212
| If a GM is in zone, set a timer for 30 minutes.
/if (@StopMe==1) {
/varset StopTimer 18000
}
| If someone came within specified range, set a timer for 5 minutes.
/if (@StopMe==2) {
/varset StopTimer 1m
}
| This loop (StopLoop) waits for 30 minutes after a GM zones in to restart
| or until no ungrouped PCs are within specified range.
:StopLoop
/if (@StopMe==1) {
/if (@StopTimer==0) {
/echo It's been 30 minutes since a GM was sighted, resuming chant-kiting at ${Time.Time12}.
/g It's been 30 minutes since a GM was sighted, resuming chant-kiting at ${Time.Time12}.
/varset StopMe 0
/keypress autorun
/goto :ChantLoop
}
}
/if (@StopMe==2) {
/if (@StopTimer>0 && ${Me.CurrentMana}>1000) {
/if (!${Spawn[pc noalert 1 radius @Param7].ID}) {
/echo No PCs within @Param7 ft., resuming chant-kiting at ${Time.Time12}.
/g No PCs within @Param7 ft., resuming chant-kiting at ${Time.Time12}.
/varset StopMe 0
/keypress autorun
/goto :ChantLoop
} else {
/varset StopTimer 1m
}
}
}
/goto :StopLoop
/return
Sub Event_Chat(ChatType,Sender,ChatText)
/declare MyMob local
/varset MyMob $target(id)
/if (${String[@ChatText].Lower.Equal[group me]}) {
/target range 1 22000 @Sender
/if (${Group}<6) {
/tell @Sender I'm kiting at ${Me.Y}, ${Me.X} -- come join me.
/invite
/alert add 1 pc @Sender
} else {
/tell @Sender My group is full right now, try back later!
/alert add 1 pc @Sender
}
}
/if (${String[@ChatText].Lower.Equal[status report]}) {
/tell @Sender TARGET: ${Target.CleanName} (${Target.PctHPs}%) SELF: ${Me.Name} (${Me.PctHPs}%) EXP: ${Me.Level} (${Me.PctExp}%) AAXP: ${Me.AAPoints} (${Me.PctAAExp}%)
}
/target npc range 1 200 id @MyMob
/return
Sub Event_Timer(TimerName)
/delay 2
/stopsong
/cast @Songs(@CurSong)
/varset PrevSong @CurSong
/varset SongTimer 30
/varadd CurSong 1
/if (@CurSong>@nSongs) /varset CurSong 1
/return
Sub GetTarget
/if (${Spawn[npc radius 200].ID}) /target npc radius 200
/if (${Target.Level}<7) /keypress esc
/if (${Target.Distance}>200) /keypress esc
/return
Sub Event_Zoned
/sit
/camp desktop
/endmacro
/return
Sub Event_StatusReport
/declare LoopCounter local
/declare GroupMembers local
/varset GroupMembers ""
/for LoopCounter 0 to ${Math.Calc[${Group}-1]}
/varcat GroupMembers ${Group[@LoopCounter].Name}
/varcat GroupMembers " "
/next LoopCounter
/echo TARGET: ${Target.CleanName} (${Target.PctHPs}%)
/echo SELF: ${Me.Name} (${Me.PctHPs}%)
/echo EXP: ${Me.Level} (${Me.PctExp}%)
/echo AAXP: ${Me.AAPoints} (${Me.PctAAExp}%)
/echo GROUP: @GroupMembers
/echo RUNTIME: ${Math.Calc[${Macro.RunTime}/60]}
/return
Sub Event_GainExp
/varset CurrentExp ${Math.Calc[${Me.PctExp}-@CurrentExp]}
/varset CurrentAAXP ${Math.Calc[${Me.PctAAExp}-@CurrentAAXP]}
/varset CurrentTime ${Math.Calc[${Math.Calc[${Macro.RunTime}/60]}-@CurrentTime]}
/echo EXP: ${Me.PctExp}% (@CurrentExp%) AAXP: ${Me.PctAAExp}% (@CurrentAAXP%) TIME: ${Math.Calc[${Macro.RunTime}/60]} (@CurrentTime)
/varset CurrentExp ${Me.PctExp}
/varset CurrentAAXP ${Me.PctAAExp}
/varset CurrentTime ${Math.Calc[${Macro.RunTime}/60]}
/return

Code: Select all
#turbo
#chat tell
#event Zoned "You have entered"
#event StatusReport "status report"
#event GainExp "You gain"
Sub Main
/zapvars
| These variables are related to movement and AI control.
/declare RubberX global
/declare RubberY global
/declare StopMe global
/declare StopTimer timer
/declare ProximityTimer timer
/varset RubberX @Param1
/varset RubberY @Param0
/varset StopMe 0
/varset ProximityTimer 1m
| These variables are related to song-twisting.
/declare SongTimer timer
/declare Songs array
/declare CurSong global
/declare PrevSong global
/declare nSongs global
/declare EachSong local
| Experience & Time Variables
/declare CurrentExp global
/declare CurrentAAXP global
/declare CurrentTime global
/varset CurrentExp ${Me.PctExp}
/varset CurrentAAXP ${Me.PctAAExp}
/varset CurrentTime ${Math.Calc[${Macro.RunTime}/60]}
| This block of code checks for proper arguments and echos error or initialization messages.
/if (!${Defined[Param7]}) {
/echo Usage: /mac Chant <Y> <X> <North> <South> <East> <West> <Song list> <TooClose>
/echo <Y> -- Y-coordinate of the center point.
/echo <X> -- X-coordinate of the center point.
/echo <North> -- Maximum distance north of the center point to travel.
/echo <South> -- Maximum distance south of the center point to travel.
/echo <East> -- Maximum distance east of the center point to travel.
/echo <West> -- Maximum distance west of the center point to travel.
/echo <Song list> -- List of songs to be sung, include Selo's if needed.
/echo <TooClose -- Distance at which non-friendly players halt kiting.
/endmacro
}
| This block of code sorts out the list of songs to be twisted while running.
/varset nSongs ${String[@Param6].Length}
/for EachSong 1 to @nSongs
/varset Songs(@EachSong) ${String[@Param6].Mid[${Math.Calc[@EachSong]},1]}
/echo Song @EachSong: ${Me.Gem[@Songs(@EachSong)]}
/next EachSong
/varset CurSong 1
/call Event_Timer
/echo Running a diamond path with center at @RubberY, @RubberX and chant-kiting mobs.
| The main loop, this iterates unless some AI warning is reached.
/keypress autorun
:ChantLoop
| Face the correct corner of the diamond, given character's current position.
/if (${Me.X}<@RubberX && ${Me.Y}>@RubberY) /face fast loc @RubberY,${Math.Calc[@RubberX-@Param4]}
/look -90
/if (${Me.X}<@RubberX && ${Me.Y}<@RubberY) /face fast loc ${Math.Calc[@RubberY-@Param3]},@RubberX
/look -90
/if (${Me.X}>@RubberX && ${Me.Y}<@RubberY) /face fast loc @RubberY,${Math.Calc[@RubberX+@Param5]}
/look -90
/if (${Me.X}>@RubberX && ${Me.Y}>@RubberY) /face fast loc ${Math.Calc[@RubberY+@Param2]},@RubberX
/look -90
| Do stuff if not in a holding phase.
/if (@StopMe==0) {
/doevents
/if (!${Me.Casting.ID}) {
/varset CurSong @PrevSong
/call Event_Timer
}
| If a GM zones in, shut down for 30 minutes.
/if (${Spawn[gm].ID}) {
/echo GM detected in zone, going into standby at $time(h):$time(m):$time(s).
/g GM detected in zone, going into standby at $time(h):$time(m):$time(s).
/stopsong
/varset StopMe 1
/varSet StopTimer 200
}
/if (@ProximityTimer<100) {
| If an ungrouped PC comes within specified range, shut down until they leave.
/if (${Spawn[pc noalert 1 radius @Param7].ID}) {
/echo ${Spawn[pc noalert 1 radius @Param7].CleanName} is inside @Param7 ft., going into standby at
${Time.Time12}.
/g ${Spawn[pc noalert 1 radius @Param7].CleanName} is inside @Param7 ft., going into standby at ${Time.Time12}.
/stopsong
/varset StopMe 2
/varset StopTimer 200
}
/varadd ProximityTimer 1m
}
| Get a new target if the current one is no good.
/if (!${Target.ID}) /call GetTarget
/if (${Target.Name.Find[corpse]}) /call GetTarget
/if (${Target.Type.Equal[PC]}) /call GetTarget
}
| Quit the ChantLoop and go into a holding phase if criteria are met.
/if (@StopTimer<10 && @StopMe>0) /goto :StopStuff
/goto :ChantLoop
| This block of code is operations to perform before going into the standby loop.
:StopStuff
| Face the far corner, stop moving and Fade Memories.
/stopsong
/face fast heading 135
/delay 10
/keypress back
/alt activate 212
| If a GM is in zone, set a timer for 30 minutes.
/if (@StopMe==1) {
/varset StopTimer 18000
}
| If someone came within specified range, set a timer for 5 minutes.
/if (@StopMe==2) {
/varset StopTimer 1m
}
| This loop (StopLoop) waits for 30 minutes after a GM zones in to restart
| or until no ungrouped PCs are within specified range.
:StopLoop
/if (@StopMe==1) {
/if (@StopTimer==0) {
/echo It's been 30 minutes since a GM was sighted, resuming chant-kiting at ${Time.Time12}.
/g It's been 30 minutes since a GM was sighted, resuming chant-kiting at ${Time.Time12}.
/varset StopMe 0
/keypress autorun
/goto :ChantLoop
}
}
/if (@StopMe==2) {
/if (@StopTimer>0 && ${Me.CurrentMana}>1000) {
/if (!${Spawn[pc noalert 1 radius @Param7].ID}) {
/echo No PCs within @Param7 ft., resuming chant-kiting at ${Time.Time12}.
/g No PCs within @Param7 ft., resuming chant-kiting at ${Time.Time12}.
/varset StopMe 0
/keypress autorun
/goto :ChantLoop
} else {
/varset StopTimer 1m
}
}
}
/goto :StopLoop
/return
Sub Event_Chat(ChatType,Sender,ChatText)
/declare MyMob local
/varset MyMob $target(id)
/if (${String[@ChatText].Lower.Equal[group me]}) {
/target range 1 22000 @Sender
/if (${Group}<6) {
/tell @Sender I'm kiting at ${Me.Y}, ${Me.X} -- come join me.
/invite
/alert add 1 pc @Sender
} else {
/tell @Sender My group is full right now, try back later!
/alert add 1 pc @Sender
}
}
/if (${String[@ChatText].Lower.Equal[status report]}) {
/tell @Sender TARGET: ${Target.CleanName} (${Target.PctHPs}%) SELF: ${Me.Name} (${Me.PctHPs}%) EXP: ${Me.Level}
(${Me.PctExp}%) AAXP: ${Me.AAPoints} (${Me.PctAAExp}%)
}
/target npc range 1 200 id @MyMob
/return
Sub Event_Timer(TimerName)
/delay 2
/stopsong
/cast @Songs(@CurSong)
/varset PrevSong @CurSong
/varset SongTimer 32
/varadd CurSong 1
/if (@CurSong>@nSongs) /varset CurSong 1
/return
Sub GetTarget
/if (${Spawn[npc radius 200].ID}) /target npc radius 200
/if (${Target.Level}<7) /keypress esc
/if (${Target.Distance}>160) /keypress esc
/return
Sub Event_Zoned
/sit
/camp desktop
/endmacro
/return
Sub Event_StatusReport
/declare LoopCounter local
/declare GroupMembers local
/varset GroupMembers ""
/for LoopCounter 0 to ${Math.Calc[${Group}-1]}
/varcat GroupMembers ${Group[@LoopCounter].Name}
/varcat GroupMembers " "
/next LoopCounter
/echo TARGET: ${Target.CleanName} (${Target.PctHPs}%)
/echo SELF: ${Me.Name} (${Me.PctHPs}%)
/echo EXP: ${Me.Level} (${Me.PctExp}%)
/echo AAXP: ${Me.AAPoints} (${Me.PctAAExp}%)
/echo GROUP: @GroupMembers
/echo RUNTIME: ${Math.Calc[${Macro.RunTime}/60]}
/return
Sub Event_GainExp
/varset CurrentExp ${Math.Calc[${Me.PctExp}-@CurrentExp]}
/popup You are now at: ${Me.PctExp}%, and have Gained: @CurrentExp%
/varset CurrentAAXP ${Math.Calc[${Me.PctAAExp}-@CurrentAAXP]}
/varset CurrentTime ${Math.Calc[${Math.Calc[${Macro.RunTime}/60]}-@CurrentTime]}
/echo EXP: ${Me.PctExp}% (@CurrentExp%) AAXP: ${Me.PctAAExp}% (@CurrentAAXP%) TIME: ${Math.Calc[${Macro.RunTime}/60]}
(@CurrentTime)
/varset CurrentExp ${Me.PctExp}
/varset CurrentAAXP ${Me.PctAAExp}
/varset CurrentTime ${Math.Calc[${Macro.RunTime}/60]}
/return
Code: Select all
[color=red]Ending Macro: Flow ran into another subroutine[/color]
[color=white]Diamond.mac@90 (Event_Timer): Sub Event_Timer(TimerName)[/color]Code: Select all
#turbo
#chat tell
#event Zoned "You have entered"
#event StatusReport "status report"
#event GainExp "You gain"
Sub Main
/zapvars
| These variables are related to movement and AI control.
/declare RubberX global
/declare RubberY global
/declare StopMe global
/declare StopTimer timer
/declare ProximityTimer timer
/varset RubberX @Param1
/varset RubberY @Param0
/varset StopMe 0
/varset ProximityTimer 1m
| These variables are related to song-twisting.
/declare SongTimer timer
/declare Songs array
/declare CurSong global
/declare PrevSong global
/declare nSongs global
/declare EachSong local
| Experience & Time Variables
/declare CurrentExp global
/declare CurrentAAXP global
/declare CurrentTime global
/varset CurrentExp ${Me.PctExp}
/varset CurrentAAXP ${Me.PctAAExp}
/varset CurrentTime ${Math.Calc[${Macro.RunTime}/60]}
| This block of code checks for proper arguments and echos error or
initialization messages.
/if (!${Defined[Param6]}) {
/echo Usage: /mac Chant <Y> <X> <North> <South> <East> <West> <Song
list> <TooClose>
/echo <Y> -- Y-coordinate of the center point.
/echo <X> -- X-coordinate of the center point.
/echo <North> -- Maximum distance north of the center point to
travel.
/echo <South> -- Maximum distance south of the center point to
travel.
/echo <East> -- Maximum distance east of the center point to
travel.
/echo <West> -- Maximum distance west of the center point to
travel.
/echo <Song list> -- List of songs to be sung, include Selo's if
needed.
/echo <TooClose -- Distance at which non-friendly players halt
kiting.
}
| This block of code sorts out the list of songs to be twisted while
running.
/varset nSongs ${String[@Param6].Length}
/for EachSong 1 to @nSongs
/varset Songs(@EachSong)
${String[@Param6].Mid[${Math.Calc[@EachSong]},1]}
/echo Song @EachSong: ${Me.Gem[@Songs(@EachSong)]}
/next EachSong
/varset CurSong 1
/call Event_Timer
/echo Running a diamond path with center at @RubberY, @RubberX and
chant-kiting mobs.
| The main loop, this iterates unless some AI warning is reached.
/keypress autorun
:ChantLoop
| Face the correct corner of the diamond, given character's current
position.
/if (${Me.X}<@RubberX && ${Me.Y}>@RubberY) /face fast loc
@RubberY,${Math.Calc[@RubberX-@Param4]}
/look -90
/if (${Me.X}<@RubberX && ${Me.Y}<@RubberY) /face fast loc
${Math.Calc[@RubberY-@Param3]},@RubberX
/look -90
/if (${Me.X}>@RubberX && ${Me.Y}<@RubberY) /face fast loc
@RubberY,${Math.Calc[@RubberX+@Param5]}
/look -90
/if (${Me.X}>@RubberX && ${Me.Y}>@RubberY) /face fast loc
${Math.Calc[@RubberY+@Param2]},@RubberX
/look -90
| Do stuff if not in a holding phase.
/doevents
/if (!${Me.Casting.ID}) {
/varset CurSong @PrevSong
/call Event_Timer
}
| Get a new target if the current one is no good.
/if (!${Target.ID}) /call GetTarget
/if (${Target.Name.Find[corpse]}) /call GetTarget
/if (${Target.Type.Equal[PC]}) /call GetTarget
}
Sub Event_Timer(TimerName)
/delay 2
/stopsong
/cast @Songs(@CurSong)
/varset PrevSong @CurSong
/varset SongTimer 32
/varadd CurSong 1
/if (@CurSong>@nSongs) /varset CurSong 1
/return
Sub GetTarget
/if (${Spawn[npc radius 200].ID}) /target npc radius 200
/if (${Target.Level}<7) /keypress esc
/if (${Target.Distance}>160) /keypress esc
/return
Sub Event_Zoned
/sit
/camp desktop
/endmacro
/return
Sub Event_StatusReport
/declare LoopCounter local
/declare GroupMembers local
/varset GroupMembers ""
/for LoopCounter 0 to ${Math.Calc[${Group}-1]}
/varcat GroupMembers ${Group[@LoopCounter].Name}
/varcat GroupMembers " "
/next LoopCounter
/echo TARGET: ${Target.CleanName} (${Target.PctHPs}%)
/echo SELF: ${Me.Name} (${Me.PctHPs}%)
/echo EXP: ${Me.Level} (${Me.PctExp}%)
/echo AAXP: ${Me.AAPoints} (${Me.PctAAExp}%)
/echo GROUP: @GroupMembers
/echo RUNTIME: ${Math.Calc[${Macro.RunTime}/60]}
/return
Sub Event_GainExp
/varset CurrentExp ${Math.Calc[${Me.PctExp}-@CurrentExp]}
/popup You are now at: ${Me.PctExp}%, and have Gained: @CurrentExp%
/varset CurrentAAXP ${Math.Calc[${Me.PctAAExp}-@CurrentAAXP]}
/varset CurrentTime
${Math.Calc[${Math.Calc[${Macro.RunTime}/60]}-@CurrentTime]}
/echo EXP: ${Me.PctExp}% (@CurrentExp%) AAXP: ${Me.PctAAExp}%
(@CurrentAAXP%) TIME: ${Math.Calc[${Macro.RunTime}/60]}
(@CurrentTime)
/varset CurrentExp ${Me.PctExp}
/varset CurrentAAXP ${Me.PctAAExp}
/varset CurrentTime ${Math.Calc[${Macro.RunTime}/60]}
/return 
Code: Select all
#turbo
#chat tell
#event Zoned "You have entered"
#event StatusReport "status report"
#event GainExp "You gain"
Sub Main
/zapvars
| These variables are related to movement and AI control.
/declare RubberX global
/declare RubberY global
/declare CirX global
/declare CirY global
/declare CirR global
/declare StopMe global
/declare StopTimer timer
/declare ProximityTimer timer
/varset RubberX @Param1
/varset RubberY @Param0
/varset CirX @Param0
/varset CirY @Param1
/varset CirR @Param2
/varset StopMe 0
/varset ProximityTimer 1m
| These variables are related to song-twisting.
/declare SongTimer timer
/declare Songs array
/declare CurSong global
/declare PrevSong global
/declare nSongs global
/declare EachSong local
| Experience & Time Variables
/declare CurrentExp global
/declare CurrentAAXP global
/declare CurrentTime global
/varset CurrentExp ${Me.PctExp}
/varset CurrentAAXP ${Me.PctAAExp}
/varset CurrentTime ${Math.Calc[${Macro.RunTime}/60]}
| This block of code checks for proper arguments and echos error or initialization messages.
/if (!${Defined[Param4]}) {
/echo Usage: /mac Chant <Y> <X> <Radius> <Song list> <TooClose>
/echo <Y> -- Y-coordinate of the center point.
/echo <X> -- X-coordinate of the center point.
/echo <Radius> -- Radius from center point to kite.
/echo <Song list> -- List of songs to be sung, include Selo's if needed.
/echo <TooClose -- Distance at which non-friendly players halt kiting.
/endmacro
}
| This block of code sorts out the list of songs to be twisted while running.
/varset nSongs ${String[@Param3].Length}
/for EachSong 1 to @nSongs
/varset Songs(@EachSong) ${String[@Param3].Mid[${Math.Calc[@EachSong]},1]}
/echo Song @EachSong: ${Me.Gem[@Songs(@EachSong)]}
/next EachSong
/varset CurSong 1
/call Event_Timer
/echo Running a Circle with center at @RubberY, @RubberX and chant-kiting mobs.
| The main loop, this iterates unless some AI warning is reached.
/keypress autorun
:ChantLoop
| Maintain distance from centerpoint, given character's current position.
/if (${Math.Distance[@CirX,@CirY]}<${Math.Calc[@CirR/2]}) {
/face heading ${Math.Calc[${Heading[@CirX,@CirY].DegreesCCW}+180]}
} else {
/face heading ${Math.Calc[${Heading[@CirX,@CirY].DegreesCCW}+${Math.Calc[90*${Math.Calc[@CirR/${Math.Distance[@CirX,@CirY]}]}]}]}
}
| Do stuff if not in a holding phase.
/if (@StopMe==0) {
/doevents
/if (!${Me.Casting.ID}) {
/varset CurSong @PrevSong
/call Event_Timer
}
| If a GM zones in, shut down for 30 minutes.
/if (${Spawn[gm].ID}) {
/echo GM detected in zone, going into standby at $time(h):$time(m):$time(s).
/g GM detected in zone, going into standby at $time(h):$time(m):$time(s).
/stopsong
/varset StopMe 1
/varSet StopTimer 200
}
/if (@ProximityTimer<100) {
| If an ungrouped PC comes within specified range, shut down until they leave.
/if (${Spawn[pc noalert 1 radius @Param4].ID}) {
/echo ${Spawn[pc noalert 1 radius @Param4].CleanName} is inside @Param4 ft., going into standby at ${Time.Time12}.
/g ${Spawn[pc noalert 1 radius @Param4].CleanName} is inside @Param4 ft., going into standby at ${Time.Time12}.
/stopsong
/varset StopMe 2
/varset StopTimer 200
}
/varadd ProximityTimer 1m
}
| Get a new target if the current one is no good.
/if (!${Target.ID}) /call GetTarget
/if (${Target.Name.Find[corpse]}) /call GetTarget
/if (${Target.Type.Equal[PC]}) /call GetTarget
}
| Quit the ChantLoop and go into a holding phase if criteria are met.
/if (@StopTimer<10 && @StopMe>0) /goto :StopStuff
/goto :ChantLoop
| This block of code is operations to perform before going into the standby loop.
:StopStuff
| Face the far corner, stop moving and Fade Memories.
/stopsong
/face fast heading 135
/delay 10
/keypress back
/alt activate 212
| If a GM is in zone, set a timer for 30 minutes.
/if (@StopMe==1) {
/varset StopTimer 18000
}
| If someone came within specified range, set a timer for 5 minutes.
/if (@StopMe==2) {
/varset StopTimer 1m
}
| This loop (StopLoop) waits for 30 minutes after a GM zones in to restart
| or until no ungrouped PCs are within specified range.
:StopLoop
/if (@StopMe==1) {
/if (@StopTimer==0) {
/echo It's been 30 minutes since a GM was sighted, resuming chant-kiting at ${Time.Time12}.
/g It's been 30 minutes since a GM was sighted, resuming chant-kiting at ${Time.Time12}.
/varset StopMe 0
/keypress autorun
/goto :ChantLoop
}
}
/if (@StopMe==2) {
/if (@StopTimer>0 && ${Me.CurrentMana}>1000) {
/if (!${Spawn[pc noalert 1 radius @Param4].ID}) {
/echo No PCs within @Param4 ft., resuming chant-kiting at ${Time.Time12}.
/g No PCs within @Param4 ft., resuming chant-kiting at ${Time.Time12}.
/varset StopMe 0
/keypress autorun
/goto :ChantLoop
} else {
/varset StopTimer 1m
}
}
}
/goto :StopLoop
/return
Sub Event_Chat(ChatType,Sender,ChatText)
/declare MyMob local
/varset MyMob $target(id)
/if (${String[@ChatText].Lower.Equal[group me]}) {
/target range 1 22000 @Sender
/if (${Group}<6) {
/tell @Sender I'm kiting at ${Me.Y}, ${Me.X} -- come join me.
/invite
/alert add 1 pc @Sender
} else {
/tell @Sender My group is full right now, try back later!
/alert add 1 pc @Sender
}
}
/if (${String[@ChatText].Lower.Equal[status report]}) {
/tell @Sender TARGET: ${Target.CleanName} (${Target.PctHPs}%) SELF: ${Me.Name} (${Me.PctHPs}%) EXP: ${Me.Level} (${Me.PctExp}%) AAXP: ${Me.AAPoints} (${Me.PctAAExp}%)
}
/target npc range 1 200 id @MyMob
/return
Sub Event_Timer(TimerName)
/delay 2
/alt activate 199
/stopsong
/cast @Songs(@CurSong)
/varset PrevSong @CurSong
/varset SongTimer 30
/varadd CurSong 1
/if (@CurSong>@nSongs) /varset CurSong 1
/return
Sub GetTarget
/if (${Spawn[npc radius 200].ID}) /keypress esc
/if (${Target.Level}<7) /keypress esc
/if (${Target.Distance}>200) /keypress esc
/return
Sub Event_Zoned
/sit
/camp desktop
/endmacro
/return
Sub Event_StatusReport
/declare LoopCounter local
/declare GroupMembers local
/varset GroupMembers ""
/for LoopCounter 0 to ${Math.Calc[${Group}-1]}
/varcat GroupMembers ${Group[@LoopCounter].Name}
/varcat GroupMembers " "
/next LoopCounter
/echo TARGET: ${Target.CleanName} (${Target.PctHPs}%)
/echo SELF: ${Me.Name} (${Me.PctHPs}%)
/echo EXP: ${Me.Level} (${Me.PctExp}%)
/echo AAXP: ${Me.AAPoints} (${Me.PctAAExp}%)
/echo GROUP: @GroupMembers
/echo RUNTIME: ${Math.Calc[${Macro.RunTime}/60]}
/return
Sub Event_GainExp
/varset CurrentExp ${Math.Calc[${Me.PctExp}-@CurrentExp]}
/varset CurrentAAXP ${Math.Calc[${Me.PctAAExp}-@CurrentAAXP]}
/varset CurrentTime ${Math.Calc[${Math.Calc[${Macro.RunTime}/60]}-@CurrentTime]}
/echo EXP: ${Me.PctExp}% (@CurrentExp%) AAXP: ${Me.PctAAExp}% (@CurrentAAXP%) TIME: ${Math.Calc[${Macro.RunTime}/60]} (@CurrentTime)
/varset CurrentExp ${Me.PctExp}
/varset CurrentAAXP ${Me.PctAAExp}
/varset CurrentTime ${Math.Calc[${Macro.RunTime}/60]}
/return 
Code: Select all
Sub GetTarget
[b]/if (${Spawn[npc radius 200].ID}) /target npc radius 200[/b]
/if (${Target.Level}<7) /keypress esc
/if (${Target.Distance}>200) /keypress esc
/return
Code: Select all
Sub GetTarget
[b]/if (${Spawn[npc radius 200].ID}) /keypress esc[/b]
/if (${Target.Level}<7) /keypress esc
/if (${Target.Distance}>200) /keypress esc
/return


Code: Select all
#turbo
#chat tell
#event Zoned "You have entered"
#event StatusReport "status report"
#event GainExp "You gain"
Sub Main
/zapvars
| These variables are related to movement and AI control.
/declare RubberX global
/declare RubberY global
/declare StopMe global
/declare StopTimer timer
/declare ProximityTimer timer
/varset RubberX @Param1
/varset RubberY @Param0
/varset StopMe 0
/varset ProximityTimer 1m
| These variables are related to song-twisting.
/declare SongTimer timer
/declare Songs array
/declare CurSong global
/declare PrevSong global
/declare nSongs global
/declare EachSong local
| Experience & Time Variables
/declare CurrentExp global
/declare CurrentAAXP global
/declare CurrentTime global
/varset CurrentExp ${Me.PctExp}
/varset CurrentAAXP ${Me.PctAAExp}
/varset CurrentTime ${Math.Calc[${Macro.RunTime}/60]}
| This block of code checks for proper arguments and echos error or initialization messages.
/if (!${Defined[Param7]}) {
/echo Usage: /mac Chant <Y> <X> <North> <South> <East> <West> <Song list> <TooClose>
/echo <Y> -- Y-coordinate of the center point.
/echo <X> -- X-coordinate of the center point.
/echo <North> -- Maximum distance north of the center point to travel.
/echo <South> -- Maximum distance south of the center point to travel.
/echo <East> -- Maximum distance east of the center point to travel.
/echo <West> -- Maximum distance west of the center point to travel.
/echo <Song list> -- List of songs to be sung, include Selo's if needed.
/echo <TooClose -- Distance at which non-friendly players halt kiting.
/endmacro
}
| This block of code sorts out the list of songs to be twisted while running.
/varset nSongs ${String[@Param6].Length}
/for EachSong 1 to @nSongs
/varset Songs(@EachSong) ${String[@Param6].Mid[${Math.Calc[@EachSong]},1]}
/echo Song @EachSong: ${Me.Gem[@Songs(@EachSong)]}
/next EachSong
/varset CurSong 1
/call Event_Timer
/echo Running a diamond path with center at @RubberY, @RubberX and chant-kiting mobs.
| The main loop, this iterates unless some AI warning is reached.
/keypress autorun
:ChantLoop
| Face the correct corner of the diamond, given character's current position.
/if (${Me.X}<@RubberX && ${Me.Y}>@RubberY) /face fast loc @RubberY,${Math.Calc[@RubberX-@Param4]}
/look -90
/if (${Me.X}<@RubberX && ${Me.Y}<@RubberY) /face fast loc ${Math.Calc[@RubberY-@Param3]},@RubberX
/look -90
/if (${Me.X}>@RubberX && ${Me.Y}<@RubberY) /face fast loc @RubberY,${Math.Calc[@RubberX+@Param5]}
/look -90
/if (${Me.X}>@RubberX && ${Me.Y}>@RubberY) /face fast loc ${Math.Calc[@RubberY+@Param2]},@RubberX
/look -90
/if (${Target.Distance}>200) /keypress esc
| Do stuff if not in a holding phase.
/if (@StopMe==0) {
/doevents
/if (!${Me.Casting.ID}) {
/varset CurSong @PrevSong
/call Event_Timer
}
| If a GM zones in, shut down for 30 minutes.
/if (${Spawn[gm].ID}) {
/echo GM detected in zone, going into standby at $time(h):$time(m):$time(s).
/g GM detected in zone, going into standby at $time(h):$time(m):$time(s).
/stopsong
/varset StopMe 1
/varSet StopTimer 200
}
/if (@ProximityTimer<100) {
| If an ungrouped PC comes within specified range, shut down until they leave.
/if (${Spawn[pc noalert 1 radius @Param7].ID}) {
/echo ${Spawn[pc noalert 1 radius @Param7].CleanName} is inside @Param7 ft., going into standby at ${Time.Time12}.
/g ${Spawn[pc noalert 1 radius @Param7].CleanName} is inside @Param7 ft., going into standby at ${Time.Time12}.
/stopsong
/varset StopMe 2
/varset StopTimer 200
}
/varadd ProximityTimer 1m
}
| Get a new target if the current one is no good.
/if (!${Target.ID}) /call GetTarget
/if (${Target.Name.Find[corpse]}) /call GetTarget
/if (${Target.Type.Equal[PC]}) /call GetTarget
}
| Quit the ChantLoop and go into a holding phase if criteria are met.
/if (@StopTimer<10 && @StopMe>0) /goto :StopStuff
/goto :ChantLoop
| This block of code is operations to perform before going into the standby loop.
:StopStuff
| Face the far corner, stop moving and Fade Memories.
/stopsong
/face fast heading 135
/delay 10
/keypress back
/alt activate 212
| If a GM is in zone, set a timer for 30 minutes.
/if (@StopMe==1) {
/varset StopTimer 18000
}
| If someone came within specified range, set a timer for 5 minutes.
/if (@StopMe==2) {
/varset StopTimer 1m
}
| This loop (StopLoop) waits for 30 minutes after a GM zones in to restart
| or until no ungrouped PCs are within specified range.
:StopLoop
/if (@StopMe==1) {
/if (@StopTimer==0) {
/echo It's been 30 minutes since a GM was sighted, resuming chant-kiting at ${Time.Time12}.
/g It's been 30 minutes since a GM was sighted, resuming chant-kiting at ${Time.Time12}.
/varset StopMe 0
/keypress autorun
/goto :ChantLoop
}
}
/if (@StopMe==2) {
/if (@StopTimer>0 && ${Me.CurrentMana}>1000) {
/if (!${Spawn[pc noalert 1 radius @Param7].ID}) {
/echo No PCs within @Param7 ft., resuming chant-kiting at ${Time.Time12}.
/g No PCs within @Param7 ft., resuming chant-kiting at ${Time.Time12}.
/varset StopMe 0
/keypress autorun
/goto :ChantLoop
} else {
/varset StopTimer 1m
}
}
}
/goto :StopLoop
/return
Sub Event_Chat(ChatType,Sender,ChatText)
/declare MyMob local
/varset MyMob $target(id)
/if (${String[@ChatText].Lower.Equal[group me]}) {
/target range 1 22000 @Sender
/if (${Group}<6) {
/tell @Sender I'm kiting at ${Me.Y}, ${Me.X} -- come join me.
/invite
/alert add 1 pc @Sender
} else {
/tell @Sender My group is full right now, try back later!
/alert add 1 pc @Sender
}
}
/if (${String[@ChatText].Lower.Equal[status report]}) {
/tell @Sender TARGET: ${Target.CleanName} (${Target.PctHPs}%) SELF: ${Me.Name} (${Me.PctHPs}%) EXP: ${Me.Level} (${Me.PctExp}%) AAXP: ${Me.AAPoints} (${Me.PctAAExp}%)
}
/target npc range 1 200 id @MyMob
/return
Sub Event_Timer(TimerName)
/delay 2
/stopsong
/cast @Songs(@CurSong)
/varset PrevSong @CurSong
/varset SongTimer 31
/varadd CurSong 1
/if (@CurSong>@nSongs) /varset CurSong 1
/return
Sub GetTarget
/if (${Spawn[npc radius 200].ID}) /target npc radius 200
/if (${Target.Level}<7) /keypress esc
/if (${Target.Distance}>200) /keypress esc
/return
Sub Event_Zoned
/sit
/camp desktop
/endmacro
/return
Sub Event_StatusReport
/declare LoopCounter local
/declare GroupMembers local
/varset GroupMembers ""
/for LoopCounter 0 to ${Math.Calc[${Group}-1]}
/varcat GroupMembers ${Group[@LoopCounter].Name}
/varcat GroupMembers " "
/next LoopCounter
/echo TARGET: ${Target.CleanName} (${Target.PctHPs}%)
/echo SELF: ${Me.Name} (${Me.PctHPs}%)
/echo EXP: ${Me.Level} (${Me.PctExp}%)
/echo AAXP: ${Me.AAPoints} (${Me.PctAAExp}%)
/echo GROUP: @GroupMembers
/echo RUNTIME: ${Math.Calc[${Macro.RunTime}/60]}
/return
Sub Event_GainExp
/varset CurrentExp ${Math.Calc[${Me.PctExp}-@CurrentExp]}
/varset CurrentAAXP ${Math.Calc[${Me.PctAAExp}-@CurrentAAXP]}
/varset CurrentTime ${Math.Calc[${Math.Calc[${Macro.RunTime}/60]}-@CurrentTime]}
/echo EXP: ${Me.PctExp}% (@CurrentExp%) AAXP: ${Me.PctAAExp}% (@CurrentAAXP%) TIME: ${Math.Calc[${Macro.RunTime}/60]} (@CurrentTime)
/varset CurrentExp ${Me.PctExp}
/varset CurrentAAXP ${Me.PctAAExp}
/varset CurrentTime ${Math.Calc[${Macro.RunTime}/60]}
/Popup I am at : ${Me.PctExp} You Gained : @CurrentExp
/return
Code: Select all
#turbo
#chat tell
#event Zoned "You have entered"
#event StatusReport "status report"
#event GainExp "You gain"
Sub Main
/zapvars
| These variables are related to movement and AI control.
/declare RubberX global
/declare RubberY global
/declare CirX global
/declare CirY global
/declare CirR global
/declare StopMe global
/declare StopTimer timer
/declare ProximityTimer timer
/varset RubberX @Param1
/varset RubberY @Param0
/varset CirX @Param0
/varset CirY @Param1
/varset CirR @Param2
/varset StopMe 0
/varset ProximityTimer 1m
| These variables are related to song-twisting.
/declare SongTimer timer
/declare Songs array
/declare CurSong global
/declare PrevSong global
/declare nSongs global
/declare EachSong local
| Experience & Time Variables
/declare CurrentExp global
/declare CurrentAAXP global
/declare CurrentTime global
/varset CurrentExp ${Me.PctExp}
/varset CurrentAAXP ${Me.PctAAExp}
/varset CurrentTime ${Math.Calc[${Macro.RunTime}/60]}
| This block of code checks for proper arguments and echos error or initialization messages.
/if (!${Defined[Param4]}) {
/echo Usage: /mac circle <Y> <X> <Radius> <Song list> <TooClose>
/echo <Y> -- Y-coordinate of the center point.
/echo <X> -- X-coordinate of the center point.
/echo <Radius> -- Radius from center point to kite.
/echo <Song list> -- List of songs to be sung, include Selo's if needed.
/echo <TooClose -- Distance at which non-friendly players halt kiting.
/endmacro
}
| This block of code sorts out the list of songs to be twisted while running.
/varset nSongs ${String[@Param3].Length}
/for EachSong 1 to @nSongs
/varset Songs(@EachSong) ${String[@Param3].Mid[${Math.Calc[@EachSong]},1]}
/echo Song @EachSong: ${Me.Gem[@Songs(@EachSong)]}
/next EachSong
/varset CurSong 1
/call Event_Timer
/echo Running a Circle with center at @RubberY, @RubberX and chant-kiting mobs.
| The main loop, this iterates unless some AI warning is reached.
/keypress autorun
:ChantLoop
| Maintain distance from centerpoint, given character's current position.
/if (${Math.Distance[@CirX,@CirY]}<${Math.Calc[@CirR/2]}) {
/face heading ${Math.Calc[${Heading[@CirX,@CirY].DegreesCCW}+180]}
} else {
/face heading
${Math.Calc[${Heading[@CirX,@CirY].DegreesCCW}+${Math.Calc[90*${Math.Calc[@CirR/${Math.Distance[@
CirX,@CirY]}]}]}]}
}
| Do stuff if not in a holding phase.
/if (@StopMe==0) {
/doevents
/if (!${Me.Casting.ID}) {
/varset CurSong @PrevSong
/call Event_Timer
}
| If a GM zones in, shut down for 30 minutes.
/if (${Spawn[gm].ID}) {
/echo GM detected in zone, going into standby at $time(h):$time(m):$time(s).
/g GM detected in zone, going into standby at $time(h):$time(m):$time(s).
/stopsong
/varset StopMe 1
/varSet StopTimer 200
}
/if (@ProximityTimer<100) {
| If an ungrouped PC comes within specified range, shut down until they leave.
/if (${Spawn[pc noalert 1 radius @Param4].ID}) {
/echo ${Spawn[pc noalert 1 radius @Param4].CleanName} is inside @Param4 ft., going
into standby at ${Time.Time12}.
/g ${Spawn[pc noalert 1 radius @Param4].CleanName} is inside @Param4 ft., going into
standby at ${Time.Time12}.
/stopsong
/varset StopMe 2
/varset StopTimer 200
}
/varadd ProximityTimer 1m
}
| Get a new target if the current one is no good.
/if (!${Target.ID}) /call GetTarget
/if (${Target.Name.Find[corpse]}) /call GetTarget
/if (${Target.Type.Equal[PC]}) /call GetTarget
}
| Quit the ChantLoop and go into a holding phase if criteria are met.
/if (@StopTimer<10 && @StopMe>0) /goto :StopStuff
/goto :ChantLoop
| This block of code is operations to perform before going into the standby loop.
:StopStuff
| Face the far corner, stop moving and Fade Memories.
/stopsong
/face fast heading 135
/delay 10
/keypress back
/alt activate 212
| If a GM is in zone, set a timer for 30 minutes.
/if (@StopMe==1) {
/varset StopTimer 18000
}
| If someone came within specified range, set a timer for 5 minutes.
/if (@StopMe==2) {
/varset StopTimer 1m
}
| This loop (StopLoop) waits for 30 minutes after a GM zones in to restart
| or until no ungrouped PCs are within specified range.
:StopLoop
/if (@StopMe==1) {
/if (@StopTimer==0) {
/echo It's been 30 minutes since a GM was sighted, resuming chant-kiting at
${Time.Time12}.
/g It's been 30 minutes since a GM was sighted, resuming chant-kiting at ${Time.Time12}.
/varset StopMe 0
/keypress autorun
/goto :ChantLoop
}
}
/if (@StopMe==2) {
/if (@StopTimer>0 && ${Me.CurrentMana}>1000) {
/if (!${Spawn[pc noalert 1 radius @Param4].ID}) {
/echo No PCs within @Param4 ft., resuming chant-kiting at ${Time.Time12}.
/g No PCs within @Param4 ft., resuming chant-kiting at ${Time.Time12}.
/varset StopMe 0
/keypress autorun
/goto :ChantLoop
} else {
/varset StopTimer 1m
}
}
}
/goto :StopLoop
/return
Sub Event_Chat(ChatType,Sender,ChatText)
/declare MyMob local
/varset MyMob $target(id)
/if (${String[@ChatText].Lower.Equal[group me]}) {
/target range 1 22000 @Sender
/if (${Group}<6) {
/tell @Sender I'm kiting at ${Me.Y}, ${Me.X} -- come join me.
/invite
/alert add 1 pc @Sender
} else {
/tell @Sender My group is full right now, try back later!
/alert add 1 pc @Sender
}
}
/if (${String[@ChatText].Lower.Equal[status report]}) {
/tell @Sender TARGET: ${Target.CleanName} (${Target.PctHPs}%) SELF: ${Me.Name}
(${Me.PctHPs}%) EXP: ${Me.Level} (${Me.PctExp}%) AAXP: ${Me.AAPoints} (${Me.PctAAExp}%)
}
/target npc range 1 200 id @MyMob
/return
Sub Event_Timer(TimerName)
/delay 2
/alt activate 199
/stopsong
/cast @Songs(@CurSong)
/varset PrevSong @CurSong
/varset SongTimer 31
/varadd CurSong 1
/if (@CurSong>@nSongs) /varset CurSong 1
/return
Sub GetTarget
/if (${Spawn[npc radius 200].ID}) /target npc radius 200
/if (${Target.Level}<7) /keypress esc
/if (${Target.Distance}>200) /keypress esc
/return
Sub Event_Zoned
/sit
/camp desktop
/endmacro
/return
Sub Event_StatusReport
/declare LoopCounter local
/declare GroupMembers local
/varset GroupMembers ""
/for LoopCounter 0 to ${Math.Calc[${Group}-1]}
/varcat GroupMembers ${Group[@LoopCounter].Name}
/varcat GroupMembers " "
/next LoopCounter
/echo TARGET: ${Target.CleanName} (${Target.PctHPs}%)
/echo SELF: ${Me.Name} (${Me.PctHPs}%)
/echo EXP: ${Me.Level} (${Me.PctExp}%)
/echo AAXP: ${Me.AAPoints} (${Me.PctAAExp}%)
/echo GROUP: @GroupMembers
/echo RUNTIME: ${Math.Calc[${Macro.RunTime}/60]}
/return
Sub Event_GainExp
/varset CurrentExp ${Math.Calc[${Me.PctExp}-@CurrentExp]}
/varset CurrentAAXP ${Math.Calc[${Me.PctAAExp}-@CurrentAAXP]}
/varset CurrentTime ${Math.Calc[${Math.Calc[${Macro.RunTime}/60]}-@CurrentTime]}
/echo EXP: ${Me.PctExp}% (@CurrentExp%) AAXP: ${Me.PctAAExp}% (@CurrentAAXP%) TIME:
${Math.Calc[${Macro.RunTime}/60]} (@CurrentTime)
/varset CurrentExp ${Me.PctExp}
/varset CurrentAAXP ${Me.PctAAExp}
/varset CurrentTime ${Math.Calc[${Macro.RunTime}/60]}
/popup I am at : ${Me.PctExp} You Gained : @CurrentExp
/return