Moderator: MacroQuest Developers
Code: Select all
#turbo
#chat tell
Sub Main
/zapvars
| These variables are related to movement and AI control.
/declare RubberX global
/declare RubberY global
/varset RubberX @Param1
/varset RubberY @Param0
| 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
| This block of code checks for proper arguments and echos error or initialization messages.
/if (${defined[Param6]}==false) {
/echo Usage: /mac Diamond <Y> <X> <North> <South> <East> <West> <Song list>
/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.
/endm
}
| This block of code sorts out the list of songs to be twisted while running.
/varset nSongs (${strlen[@Param6]})
/for EachSong 1 to @nSongs
/varset Songs(@EachSong) (${mid(${calc(@EachSong-1)},1,@Param6)})
/echo Song @EachSong: (${char(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.
/sendkey down up
:ChantLoop
| Face the correct corner of the diamond, given character's current position.
/if (n ${char(x)<@RubberX} && n ${char(y)>@RubberY)} /face fast loc @RubberY,${calc(@RubberX-@Param4)}
/look -90
/if (n ${char(x)<@RubberX} && n ${char(y)<@RubberY)} /face fast loc ${calc(@RubberY-@Param3),@RubberX}
/look -90
/if (n ${char(x)>@RubberX} && n ${char(y)<@RubberY)} /face fast loc @RubberY,${calc(@RubberX+@Param5)}
/look -90
/if (n ${char(x)>@RubberX} && n ${char(y)>@RubberY)} /face fast loc $calc(@RubberY+@Param2),@RubberX}
/look -90
| Sing songs.
/doevents
/if (${char[casting]==FALSE}) {
/varset CurSong @PrevSong
/call Event_Timer
}
| Get a new target if the current one is no good.
/if (n ${target[id]}==0) /call GetTarget
/if (n ${target[name]}~~"corpse" /call GetTarget
/if (n ${target[type]}=="PC" /call GetTarget
/goto :ChantLoop
/return
Sub Event_Timer(TimerName)
/delay 2
/stopsong
/cast @Songs(@CurSong)
/varset PrevSong @CurSong
/varset SongTimer 30
/varadd CurSong 1
/if n @CurSong>@nSongs /varset CurSong 1
/return
Sub GetTarget
/if (n ${searchspawn[npc.radius:200]>0} /target npc radius 200
/if (n ${target[level]}>66) /press esc
/if (n ${target[range]}>200) /press esc
/return
[code][/code]
Code: Select all
/if (!${Defined[Parm6}) {Should be:icehouse33 wrote:Code: Select all
/if (!${Defined[Parm6}) {
Code: Select all
/if (!${Defined[Param6]}) {Code: Select all
/if (!${Defined[Param6]}) {
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 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