#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

