Uses hotkey slot #1 as your attack key in the absence of mq2melee. Once mq2melee is working, I can post the normal macro.
Notes:
-In normal zones without a big Z-axis change, the only number you need to ever worry about editing is the RV_MaxRadius, which says the distance within which you want to pull. Default is 100. Extend or decrease for your needs.
-The top variables are the only ones you need to mess with in case of distances for XYZ.
-keypress 1 was substituded for /attack on because mq2melee isn't available yet
Edit:
-Forgot to add the include files, adding below the mac
Place in macro folder as file:
Exp_tracking.inc
Place in macro folder as file:
Autolooter.inc
Notes:
-In normal zones without a big Z-axis change, the only number you need to ever worry about editing is the RV_MaxRadius, which says the distance within which you want to pull. Default is 100. Extend or decrease for your needs.
-The top variables are the only ones you need to mess with in case of distances for XYZ.
-keypress 1 was substituded for /attack on because mq2melee isn't available yet
Edit:
-Forgot to add the include files, adding below the mac
Code:
| Puller Macro
| Puller.mac
| Author : Alatyami: Ripped by robdawg :Ripped by Jdelpheki :Ripped Again By hakcenter
| Version : v3 2004-12-16 5:50pm PST
| Useage : /macro pull
| Description : This macro will run your character around Pulling any mobs.
| This is definitely a work in progress and I am sure
| someone can think of plenty of upgrades for this.
| : Ripped section Jdelpheki
| Modified for pull to area where Macro is started. I have been using this
| 2 level 45's Cleric Running genbot and Warrior running Pull2. Ran for 4 hours
| Max with one cleric death. Needs Throwing weapon or arch support too
| Needs Genbot to announce its getting hit or get a new cleric script
| : Ripped section hakcenter
| Pulls Any Mobs within radius (regardless of level)
| No Mob Array Required
| Looting Added
| *Looting -stuck on corpse bug fixed-
| Loot Table Array Support
| *Puller runs to pull spot after mob looting is finished
| *Removed Target Fail Counters
| *Checks for mobs every 30seconds, 1second 50radius checks
| *Reformated
| *On zoning(death whatever), quits everquest
| *Added more checks
|
| 2004-12-11
|
| Added some squelching, always looking for mobs within range, 5 distance intervals
| Jacked Item Coding from Rogue Helper
| Fixed UI locking up
| Fixed Long Buff Casts
| Added Disarm to the Special Combat abilities
|
| 2004-12-16
| Revamped Close mob checking to 0.1second 100radius squelched
| Revamped Item casting to check for local mobs during.. and interupt if mob is near 100radius
| Removed mass escaping.. cause its retarded
| Fixed cool errors when accidently pushing esc while on a mob
| Fixed cool errors when accidently pushing esc while pulling a mob
| Added 1second before first item cast, incase item is worn... you get interupted cause its too fast
|
|------------------------------------------------------------------------------------
#turbo 10
#include Exp_Tracking.inc
#include AutoLooter.inc
#Event Slain "#*# slain#*#"
#Event Zoned "LOADING, PLEASE WAIT..."
#Event ItemSet "[MQ2] ItemSet#*#"
#Event ItemBounce "[MQ2] ItemBounce#*#"
#Event ItemCast "[MQ2] ItemCast#*#"
Sub Main
|------------------------------------------------------------
|How far would you like to target a mob?
|------------------------------------------------------------
/declare RV_MaxRadius int outer 100
|------------------------------------------------------------
|How far is the fast movement range?
|------------------------------------------------------------
/declare RV_FastRange int outer 10
|------------------------------------------------------------
|How far is the maximum combat range?
|------------------------------------------------------------
/declare RV_RangeMax int outer 7
|------------------------------------------------------------
|How far is the minimum combat range?
|------------------------------------------------------------
/declare RV_RangeMin int outer 8
|------------------------------------------------------------
|What is the minimum Z Value of mobs I should target?
|------------------------------------------------------------
/declare RV_MinZRange int outer -1000
|------------------------------------------------------------
|What is the maximum Z Value of mobs I should target?
|------------------------------------------------------------
/declare RV_MaxZRange int outer 100
|------------------------------------------------------------
|Variables that you don't need to worry about.
|------------------------------------------------------------
/declare RV_MyTargetID int outer 0
/declare RV_MyTargetName string outer
/declare RV_MyTargetDead int outer 0
/declare RV_InvalidTargetID int outer 0
/declare RV_HasTarget int outer 0
/declare RV_RandomWait int outer 0
/declare RV_LootSlot int outer 0
/declare RV_CheckLook int outer 0
/declare RV_Fighting int outer 0
/declare RV_TargetDead int outer 0
/declare RV_MyXLOC int outer 0
/declare RV_MyYLOC int outer 0
/declare RV_ObstacleCount int outer 0
/declare RV_hitcount int outer 0
/declare RV_healcheck int outer 0
/declare RT_MyXLOC int outer ${Me.X}
/declare RT_MyyLOC int outer ${Me.Y}
/declare lastevent string outer None
/declare CheckBuffs int outer 0
/declare i int outer
/declare ialias string outer None
/declare doIclick bool outer FALSE
/declare bouncenum int outer 1
/declare ibounce string outer None
/declare itemspellname string outer None
/declare clicktimer timer outer 0
/squelch /alias /iset /echo ItemSet
/squelch /alias /ibounce /echo ItemBounce
/squelch /alias /iclick /echo ItemCast
/varset CheckBuffs 1
/call ExpPrep
:Start
/doevents
/call GMCheck
/call GetTarget
/if (${RV_HasTarget}) /call Pull
/if (${RV_HasTarget}) /call CombatSub
/call ResetSub
/call MoveToLoc ${RT_MyyLOC} ${RT_MyXLOC}
/goto :Start
/return
/doevents
/return
|--------------------------------------------------------------------------------
|SUB: GMCheck
|--------------------------------------------------------------------------------
Sub GMCheck
/if (${Spawn[gm].ID}) {
/beep
/beep
/beep
/echo GM has entered the zone!
/echo FUCK HIM but ending the macro...
/keypress forward
/keypress back
/quit
/endmacro
}
/return
/doevents
/return
|--------------------------------------------------------------------------------
|SUB: AquireTarget
|--------------------------------------------------------------------------------
Sub GetTarget
/doevents
/declare SpawnTimer int local
/declare RV_CurrentRadius int local
/declare RV_TargetSub int local
/echo Looking for Close Range Mobs
:Acquire
/doevents
/for RV_CurrentRadius 100 to ${RV_MaxRadius} step 5
/squelch /target radius ${RV_CurrentRadius} npc
/varset RV_MyTargetID ${Target.ID}
/varset RV_MyTargetDead 0
/if (${Target.ID}) {
/if (${Int[${Target.Z}]}<${RV_MinZRange}) {
/echo Mob is BELOW Min Z Range, picking another...
/varset RV_InvalidTargetID ${Target.ID}
/call ResetSub
/goto :Acquire
}
/if (${Int[${Target.Z}]}>${RV_MaxZRange}) {
/echo Mob is ABOVE Max Z Range, picking another...
/varset RV_InvalidTargetID ${Target.ID}
/call ResetSub
/goto :Acquire
}
/varset RV_HasTarget 1
/varset RV_MyTargetName ${Target.Name}
/echo Acquired ${Target.Name} at range ${Int[${Target.Distance}]}
/return
}
/next RV_CurrentRadius
/goto :Acquire
/return
/doevents
/return
|--------------------------------------------------------------------------------
|SUB: Pull
|--------------------------------------------------------------------------------
Sub Pull
/doevents
/echo Pulling Mob
/hidecorpse all
/delay 1s
/declare TargDist float local
:PullLoop
/doevents
/if (!${Me.Combat}) /keypress 1
/call MoveToMob
/if (!${Target.ID}) /return
/face fast
/if (${Target.PctHPs}==100) /goto :PullLoop
/if (${Target.PctHPs}<21) /return
/call MoveToLoc ${RT_MyyLOC} ${RT_MyXLOC} /return
/if (!${Target.ID}) /return
/face fast
:Engage
/varset TargDist ${Math.Distance[${Target.Y},${Target.X},0:${Me.Y},${Me.X},0]}
/if ( ${TargDist}<100 ) /return
/delay 1s
/goto :Engage
/return
/doevents
/return
|--------------------------------------------------------------------------------
|SUB: MovetoMob
|--------------------------------------------------------------------------------
Sub MoveToMob
/doevents
/varset RV_MyXLOC ${Int[${Me.X}]}
/varset RV_MyYLOC ${Int[${Me.Y}]}
/varset RV_ObstacleCount 0
:MovementLoop
/doevents
/if (!${Target.ID}) /return
/face fast
/varcalc RV_ObstacleCount ${RV_ObstacleCount}+1
/if (${Int[${Target.Distance}]}>${RV_FastRange}) /keypress forward hold
/if (${Int[${Target.Distance}]}<${RV_FastRange}&&${Int[${Target.Distance}]}>${RV_RangeMax}) /keypress
forward
/if (${Int[${Target.Distance}]}<${RV_RangeMin}) /keypress back
/if (${RV_ObstacleCount}>=15) {
/call CheckObstacle
/goto :Movementloop
}
/if (${Int[${Target.Distance}]}>${RV_FastRange}) /goto :MovementLoop
/return
/doevents
/return
|--------------------------------------------------------------------------------
|SUB: MoveToLocation
|--------------------------------------------------------------------------------
Sub MoveToLoc(MoveToY, MoveToX)
/doevents
/declare running int local
/declare distanceNow float local
/declare distanceBefore float local
/declare distanceModifier int local
/declare distanceTimer timer 15
/varset running 0
/varset distanceBefore ${Math.Distance[${Me.Y},${Me.X}:${MoveToY},${MoveToX}]}
/varset distanceModifier 1
/echo Moving to Location: ${MoveToY}, ${MoveToX}.
/echo Distance: ${distanceBefore}
:moveToLocation
/doevents
/face fast nolook loc ${MoveToY},${MoveToX}
/if (${Math.Distance[${Me.Y},${Me.X}:${MoveToY},${MoveToX}]}<10) {
/keypress forward
/return
}
/if (${distanceTimer}==0) {
/if (${Me.Sneaking}) {
/varset distanceModifier 2
} else {
/varset distanceModifier 1
}
/varset distanceNow ${Math.Distance[${Me.Y},${Me.X}:${MoveToY},${MoveToX}]}
/if (${Math.Calc[${distanceBefore}-${distanceNow}]}<${Math.Calc[10/${distanceModifier}]}) {
/call HitObstacle
}
/varset distanceBefore ${Math.Distance[${Me.Y},${Me.X}:${MoveToY},${MoveToX}]}
/varset distanceTimer 15
}
/if (${running}==0) {
/keypress forward
/if (${Math.Distance[${Me.Y},${Me.X}:${MoveToY},${MoveToX}]}>10) {
/varset running 1
/keypress forward hold
}
} else {
/if (${Math.Distance[${Me.Y},${Me.X}:${MoveToY},${MoveToX}]}<11) {
/varset running 0
/keypress forward
}
}
/goto :moveToLocation
/return
/doevents
/return
|--------------------------------------------------------------------------------
|SUB: ObstacleCheck
|--------------------------------------------------------------------------------
Sub CheckObstacle
/doevents
/if ((${RV_MyXLOC}==${Int[${Me.X}]})&&(${RV_MyYLOC}==${Int[${Me.Y}]})) /call HitObstacle
/varset RV_MyXLOC ${Int[${Me.X}]}
/varset RV_MyYLOC ${Int[${Me.Y}]}
/varset RV_ObstacleCount 0
/return
/doevents
/return
|--------------------------------------------------------------------------------
|SUB: ObstacleAvoidance
|--------------------------------------------------------------------------------
Sub HitObstacle
/echo Obstacle hit, moving around it...
/keypress forward
/keypress back hold
/delay 3
/keypress back
/if (${Math.Rand[2]}) {
/keypress strafe_right hold
} else {
/keypress strafe_left hold
}
/delay 5
/keypress strafe_right
/keypress strafe_left
/keypress forward hold
/return
/doevents
/return
|--------------------------------------------------------------------------------
|SUB: Combat
|--------------------------------------------------------------------------------
Sub CombatSub
/doevents
/varset RV_Fighting 1
/varset RV_TargetDead 0
/echo Attacking Mob NOW!
:CombatLoop
/if (!${Me.Combat}) /keypress 1
/if (!${Target.ID}) /return
/call MoveToMob
/call SpecialIT
/if (!${RV_TargetDead}) /goto :CombatLoop
/if (!${RV_TargetDead}) /hidecorpse all
/return
/doevents
/return
|--------------------------------------------------------------------------------
|SUB: SpecialCombat
|--------------------------------------------------------------------------------
Sub SpecialIt
/doevents
/declare TempID int inner 0
/if (${Target.Distance}<=17 && ${Me.AbilityReady[Kick]}) {
/doability "Kick"
}
/if (${Target.Distance}<=17 && ${Me.AbilityReady[Disarm]}) {
/doability "Disarm"
}
/if (${Target.Distance}<=17 && ${Me.AbilityReady[Taunt]}) {
/doability "Taunt"
}
/if (${Target.Distance}<=17 && ${Me.AbilityReady[Bash]}) {
/doability "Bash"
}
/return
/doevents
/return
|--------------------------------------------------------------------------------
|SUB: Slain
|--------------------------------------------------------------------------------
Sub Event_Slain
/varset RV_TargetDead 1
/varset RV_Fighting 0
/call ExpTrack
/target clear
/keypress forward
/keypress back
| /squelch /target radius 30 corpse
/face fast
/return
/doevents
/return
|--------------------------------------------------------------------------------
|SUB: Zoned
|--------------------------------------------------------------------------------
Sub Event_Zoned
/echo Zoned
/delay 60s
/quit
/endmacro
/return
/doevents
/return
|--------------------------------------------------------------------------------
|SUB: Reset
|--------------------------------------------------------------------------------
Sub ResetSub
/doevents
/varset RV_HasTarget 0
/varset RV_TargetDead 0
/varset RV_Fighting 0
/return
/doevents
/return
Place in macro folder as file:
Exp_tracking.inc
Code:
|~
|~ Exp_Tracking.inc
|~ Version 2.0
|~
|~ This include will track your exp in various forms.
|~ You can track Total Exp Gained, Total AA Exp Gained, Total Run Time, Exp Gained Per Minute,
|~ AA Exp Gained Per Minute, Aproximate Time Till Ding, and Aproximate Time Till AA Ding.
|~ Some of this came from the current "perfect xptracker" macro however I wanted to display
|~ more usefull information.
|~
|~ To use simply /call ExpPrep during a part of your macro that is only called once.
|~ Then /call ExpTrack at any moment you wish to check your exp stats.
|~
Sub ExpPrep
/declare Exper float outer ${Me.PctExp}
/declare AAExp float outer ${Me.PctAAExp}
/declare TotalAAExp float outer 0.00
/declare TotalExp float outer 0.00
|*********************************************************************
Edit these values as you see fit. If you set to 1 the information will
show each call. Set to 0 and it will not show.
**********************************************************************|
||Show Total Exp Gained?||
/declare ShowTEG bool outer TRUE
||Show Total AA Exp Gained?||
/declare ShowTAAEG bool outer TRUE
||Show Total Run Time?||
/declare ShowTRT bool outer TRUE
||Show Exp Gained Per Minute?||
/declare ShowEGPM bool outer TRUE
||Show AA Exp Gained Per Minute?||
/declare ShowAAEGPM bool outer TRUE
||Show Aproximate Time Till Ding?||
/declare ShowATTD bool outer TRUE
||Show Aproximate Time Till AA Ding?||
/declare ShowATTAAD bool outer TRUE
/return
Sub ExpTrack
/if (${Me.PctAAExp}>=${AAExp}) {
/varset AAExp ${Math.Calc[${Me.PctAAExp}-${AAExp}]}
} else {
/varset AAExp ${Math.Calc[${Me.PctAAExp}-${AAExp}+100]}
}
/if (${Me.PctExp}>=${Exper}) {
/varset Exper ${Math.Calc[${Me.PctExp}-${Exper}]}
} else {
/varset Exper ${Math.Calc[${Me.PctExp}-${Exper}+100]}
}
/varcalc TotalAAExp ${TotalAAExp}+${AAExp}
/varcalc TotalExp ${TotalExp}+${Exper}
/echo ***************************************
/if (${ShowTEG}) /echo Total Gained: ${Exper}% / ${AAExp}%
/if (${ShowTEG}) /echo Total Exp Gained: ${TotalExp}% / ${TotalAAExp}%
/if (${ShowTRT}) /echo Total Running Time: ${Math.Calc[${Macro.RunTime}/60]} minutes
/if (${ShowEGPM}) /echo Exp Gained Per Minute: ${Math.Calc[${TotalExp}/${Math.Calc[${Macro.RunTime}/60]}]} / ${Math.Calc[${TotalAAExp}/${Math.Calc[${Macro.RunTime}/60]}]}
/if (${ShowATTD}) {
/if (${TotalExp}==0) {
/echo Aprox Time till Ding: Forever!!
} else {
/echo Aprox Time till Ding: ${Math.Calc[${Math.Calc[${Math.Calc[${Macro.RunTime}/60]}/${TotalExp}]}*${Math.Calc[100-${Me.PctExp}]}]} minutes
}
}
/if (${ShowATTAAD}) {
/if (${TotalAAExp}==0) {
/echo Aprox Time till AA Ding: Forever!!
} else {
/echo Aprox Time till AA Ding: ${Math.Calc[${Math.Calc[${Math.Calc[${Macro.RunTime}/60]}/${TotalAAExp}]}*${Math.Calc[100-${Me.PctAAExp}]}]} minutes
}
}
/echo ***************************************
/varset Exper ${Me.PctExp}
/varset AAExp ${Me.PctAAExp}
/return
Place in macro folder as file:
Autolooter.inc
Code:
|AutoLooter.inc
Sub AutoLoot
/declare slot int local 1
/declare NumberItems int local 0
/declare CorpseCut int local 0
/echo Looting corpse
/target corpse
/loot
/delay 2s
/varset NumberItems ${Corpse.Items}
/if (${NumberItems}>0) {
/varcalc CorpseCut ${Target.CleanName.Find['s corpse]}-1
/for slot 1 to ${NumberItems}
/nomodkey /itemnotify loot${slot} leftmouseup
/delay 3s
:LagFix
/call HandleItem
/autoinventory
/delay 3s
/if (${Cursor.ID}) /goto :LagFix
/next slot
}
/nomodkey /notify LootWnd DoneButton leftmouseup
/delay 2s
/if (${Target.ID}) /target clear
/delay 2s
/return
sub HandleItem
/echo Found ${Cursor.Name}
/declare ItemSetting int local
/declare NotFound int local
/varset NotFound -1
| Look up this item in the INI file
/varset ItemSetting ${Ini[PullLoot.ini,KeepList,${Cursor.Name},${NotFound}]}
/delay 1s
| If the item isn't in the .ini file then add it.
/if (${ItemSetting}==${NotFound}) {
/ini "PullLoot.ini" "KeepList" "${Cursor.Name}" "1"
/varset ItemSetting 1
}
| If we're keeping this item then stash it in our bags.
| Otherwise, just destroy it.
/if (${ItemSetting}==1) {
:LootIt
/autoinventory
/delay 2s
/if (${Cursor.ID}) /goto :LootIt
} else {
/destroy
}
/return
Last edited: