I am using this Pull.mac and it works great. What I would like to do is add a snare at say 30%.
I tried a few ways like add keypress 1 at 30 but at 30 it keeps pressing 1. didn't work.
I don't know how to write mac or code so I am lost really.
Any suggestions?
| Pull Macro
| Pull.mac
| Author : 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
#Event Slain "#*# slain#*#"
#Event Zoned "LOADING, PLEASE WAIT..."
#Event ItemSet "[MQ2] ItemSet#*#"
#Event ItemBounce "[MQ2] ItemBounce#*#"
#Event ItemCast "[MQ2] ItemCast#*#"
Sub Main
/declare CurrentZ int outer
|------------------------------------------------------------
|How far would you like to target a mob?
|------------------------------------------------------------
/declare RV_MaxRadius int outer 500
|------------------------------------------------------------
|How far is the fast movement range?
|------------------------------------------------------------
/declare RV_FastRange int outer 35
|------------------------------------------------------------
|How far is the maximum combat range?
|------------------------------------------------------------
/declare RV_RangeMax int outer 50
|------------------------------------------------------------
|How far is the minimum combat range?
|------------------------------------------------------------
/declare RV_RangeMin int outer 10
|------------------------------------------------------------
|What is the minimum Z Value of mobs I should target?
|------------------------------------------------------------
/declare RV_MinZRange int outer ${Math.Calc[${CurrentZ}-200]}
|------------------------------------------------------------
|What is the maximum Z Value of mobs I should target?
|------------------------------------------------------------
/declare RV_MaxZRange int outer ${Math.Calc[${CurrentZ}+200]}
|------------------------------------------------------------
|Loot Array Information.
|------------------------------------------------------------
/call ReadINI PullLoot.ini "${Zone.Name}" Loot
/if (!${Defined[RV_LootArray]}) {
/echo No Loot Array Created...
}
|------------------------------------------------------------
|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
:Start
/doevents
/call GMCheck
/if (${Me.PctHPs}<=50) /potionbelt activate 1
/call GetTarget
/if (${RV_HasTarget}) /call Pull
/if (${RV_HasTarget}) /call CombatSub
/call ResetSub
/call MoveToLoc ${RT_MyyLOC} ${RT_MyXLOC}
/goto :Start
/return
|--------------------------------------------------------------------------------
|SUB: Reading from an INI File
|--------------------------------------------------------------------------------
Sub ReadINI(FileName,Loot,ArrayType)
/echo Attempting to Read Information from ${FileName}...
/declare nValues int local 1
/declare nArray int local 0
/declare KeySet string local ${Ini[${FileName}]}
/if (${Ini[${FileName},Loot,-1,NO].Equal[NO]}) {
/echo "${SectionName}" is not a Valid Section for FILE:${FileName}, ending macro...
/delay 1s
/return
}
:CounterLoop
/if (${String[${Ini[${FileName},Loot,${ArrayType}${nValues}]}].Equal[null]}) {
/varcalc nValues ${nValues}-1
/goto :MakeArray
}
/varcalc nValues ${nValues}+1
/goto :CounterLoop
:MakeArray
/if (!${nValues}) /return
/if (${FileName.Equal["PullLoot.ini"]}&&${nValues}>0) {
/echo Declaring Loot Array...
/declare RV_LootArray[${nValues}] string outer
/declare RV_LootStats[${nValues}] string outer
}
/for nArray 1 to ${nValues}
/if (${FileName.Equal["PullLoot.ini"]}) {
/varset RV_LootArray[${nArray}] ${Ini[${FileName},Loot,${ArrayType}${nArray}]}
/varset RV_LootStats[${nArray}] 0
}
/next nArray
/echo Information Read Successfully from ${FileName}...
/delay 1s
/return
|--------------------------------------------------------------------------------
|SUB: GM Check
|--------------------------------------------------------------------------------
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
|--------------------------------------------------------------------------------
|SUB: Aquire Target
|--------------------------------------------------------------------------------
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
}
/varset RV_HasTarget 1
/varset RV_MyTargetName ${Target.Name}
/echo Acquired ${Target.Name} at range ${Int[${Target.Distance}]}
/return
}
/if (${CheckBuffs}>0) {
/echo Checking Buffs
/call ItemCast
/varset CheckBuffs 0
/echo Aquiring Long Range Mobs
}
/next RV_CurrentRadius
/goto :Acquire
/return
|--------------------------------------------------------------------------------
|SUB: Pull
|--------------------------------------------------------------------------------
Sub Pull
/doevents
/echo Pulling Mob
/declare TargDist float local
:PullLoop
/doevents
/if (!${Me.Combat}) /attack on
/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}
/if (!${Target.ID}) /return
/face fast
:Engage
/varset TargDist ${Math.Distance[${Target.Y},${Target.X},0:${Me.Y},${Me.X},0]}
/if ( ${TargDist}<30 ) /return
/delay 1s
/goto :Engage
/return
|--------------------------------------------------------------------------------
|SUB: Move to Mob
|--------------------------------------------------------------------------------
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
|--------------------------------------------------------------------------------
|SUB: Move To Location
|--------------------------------------------------------------------------------
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
|--------------------------------------------------------------------------------
|SUB: Obstacle Check
|--------------------------------------------------------------------------------
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
|--------------------------------------------------------------------------------
|SUB: Obstacle Avoidance
|--------------------------------------------------------------------------------
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
|--------------------------------------------------------------------------------
|SUB: Combat
|--------------------------------------------------------------------------------
Sub CombatSub
/doevents
/varset RV_Fighting 1
/varset RV_TargetDead 0
/echo Attacking Mob NOW!
:CombatLoop
/if (${Target.Type.NotEqual[NPC]}) /squelch /target clear
/if (!${Me.Combat}) /attack on
/if (!${Target.ID}) /return
/call MoveToMob
/if (!${RV_TargetDead}) /goto :CombatLoop
/doevents
/return
|--------------------------------------------------------------------------------
|SUB: Item Buffs
|--------------------------------------------------------------------------------
Sub ItemCast
/doevents
/declare ItemDelay int inner 0
/varset ItemDelay 1
/varset i 1
:ItemCheckLoop
/doevents
/varset ialias ${Ini[PullItems.ini].Arg[${i},|]}
/if (${ialias.NotEqual[NULL]}) {
/if (${Ini[PullItems.ini,${ialias},KeepUp].Equal[FALSE]}) /goto :NextItem
/varset bouncenum 1
/varset doIclick TRUE
:BounceCheckLoop
/varset ibounce ${Ini[PullItems.ini,${ialias},BounceOff${bouncenum}]}
/if (${ibounce.NotEqual[NULL]}) {
/if (${ibounce.Equal[${Me.Buff[${ibounce}]}]}) /varset doIclick FALSE
} else /goto :DoneBounceChecks
/varcalc bouncenum ${bouncenum}+1
/goto :BounceCheckLoop
:DoneBounceChecks
/varset itemspellname ${FindItem[${Ini[PullItems.ini,${ialias},FullName]}].Spell}
/if (${itemspellname.Equal[${Me.Buff[${itemspellname}]}]}) /varset doIclick FALSE
/squelch /target myself
/if (${doIclick}) {
/if (${ItemDelay}==1) {
/delay 1s
/varset ItemDelay 0
}
}
/if (${doIclick}) /docommand /iclick ${ialias}
/if (${clicktimer}) /goto :DoneItemChecks
:NextItem
/varcalc i ${i}+1
} else /goto :DoneItemChecks
/goto :ItemCheckLoop
:DoneItemChecks
/doevents
/squelch /target clear
/return
Sub Event_ItemSet(string Line)
/varset lastevent Event_ItemSet
/if (!${Line.Arg[5].Length} || ${Line.Arg[6].Length}) {
/if (${verbosity}>=0) /${channel} ** Improper use of /iset
/if (${verbosity}>=0) /${channel} -- /iset <itemalias> keepup|nokeepup <"Item Name">
/if (${verbosity}>=0) /${channel} -- For example:
/if (${verbosity}>=0) /${channel} -- /iset gobby keepup "Shrunken Goblin Skull Earring"
/return
}
/ini "PullItems.ini" "${Line.Arg[3]}" "FullName" "${Line.Arg[5]}"
/ini "PullItems.ini" "${Line.Arg[3]}" "KeepUp" "${If[${Line.Arg[4].Equal[keepup]},TRUE,FALSE]}"
/if (${verbosity}>=0) /${channel} ** ${Line.Arg[5]} (KeepUp=${If[${Line.Arg[4].Equal[keepup]},TRUE,FALSE]}) updated in INI!
/return
Sub Event_ItemBounce(string Line)
/varset lastevent Event_ItemBounce
/if (!${Line.Arg[4].Length}) {
/if (${verbosity}>=0) /${channel} ** Improper use of /ibounce
/if (${verbosity}>=0) /${channel} -- /ibounce <itemalias> "Some Spell Name"
/if (${verbosity}>=0) /${channel} -- For example:
/if (${verbosity}>=0) /${channel} -- /ibounce gobby "Strength of Tunare"
/return
}
/if (!${Ini[PullItems.ini,${Line.Arg[3]}].Length}) {
/if (${verbosity}>=0) /${channel} ** [${Line.Arg[3]}] not in INI file!
/return
}
/declare bindex int local 1
:CheckNextKey
/if (${Ini[PullItems.ini,${Line.Arg[3]},BounceOff${bindex}].Length}) {
/varcalc bindex ${bindex}+1
/goto :CheckNextKey
} else {
/ini "PullItems.ini" "${Line.Arg[3]}" "BounceOff${bindex}" "${Line.Arg[4]}"
/if (${verbosity}>=0) /${channel} ** Added "${Line.Arg[4]}" to [${Line.Arg[3]}]'s bounce list
}
/return
Sub Event_ItemCast(string Line)
/varset lastevent Event_ItemCast
/if (!${Line.Arg[3].Length}) {
/if (${verbosity}>=0) /${channel} ** Improper use of /icast
/if (${verbosity}>=0) /${channel} -- /icast <itemalias>
/if (${verbosity}>=0) /${channel} -- For example:
/if (${verbosity}>=0) /${channel} -- /icast gobby
/return
}
/if (!${Ini[PullItems.ini,${Line.Arg[3]}].Length}) {
/if (${verbosity}>=0) /${channel} ** [${Line.Arg[3]}] not in INI file!
/return
}
/declare fullname string local ${Ini[PullItems.ini,${Line.Arg[3]},FullName]}
/if (${verbosity}>=1) /${channel} ** Attempting to use: ${fullname}
/if (${FindItem[${fullname}].InvSlot.Pack}) {
:OpenPack
/if (!${Window[${FindItem[${fullname}].InvSlot.Pack.Name}].Open}) {
/itemnotify ${FindItem[${fullname}].InvSlot.Pack.Name} rightmouseup
/delay 2
/goto :OpenPack
}
/declare camefrom ${FindItem[${fullname}].InvSlot}
:GrabItem
/if (!${Cursor.ID}) {
/itemnotify ${InvSlot[${camefrom}]} leftmouseup
/delay 2
/goto :GrabItem
}
/declare clickyID int local ${Cursor.ID}
/declare wornat int local ${Cursor.WornSlot[1]}
:SwapFirst
/if (${Cursor.ID}==${clickyID}) {
/itemnotify ${InvSlot[${wornat}]} leftmouseup
/delay 2
/goto :SwapFirst
}
/delay 2
/if (${verbosity}>=1) /${channel} ** Clicking: ${fullname}
/declare previousID ${Cursor.ID}
/itemnotify ${InvSlot[${wornat}]} rightmouseup
:SwapAgain
/if (${Cursor.ID}==${previousID}) {
/itemnotify ${InvSlot[${wornat}]} leftmouseup
/delay 2
/goto :SwapAgain
}
:PutItBack
/if (${Cursor.ID}==${clickyID}) {
/itemnotify ${InvSlot[${camefrom}]} leftmouseup
/delay 2
/goto :PutItBack
}
:SummonedCheck
/if (${Cursor.ID}) {
/autoinv
/delay 2
/goto :SummonedCheck
}
:ClosePack
/if (${Window[${InvSlot[${camefrom}].Pack.Name}].Open}) {
/itemnotify ${InvSlot[${camefrom}].Pack.Name} rightmouseup
/delay 2
/goto :ClosePack
}
} else {
/if (${FindItem[${fullname}].InvSlot}) {
/if (${verbosity}>=1) /${channel} ** Clicking: ${fullname}
/itemnotify ${FindItem[${fullname}].InvSlot} rightmouseup
/delay 2
} else {
/if (${verbosity}>=0) /${channel} ** "${fullname}" not found!
}
}
:CastLoop
/delay 1
/squelch /target radius 100 npc
/if (${Target.ID}) {
/if (${Target.CleanName.Equal[${Me.Name}]}) {
/squelch /target clear
/goto :CloseMobCheck
}
/keypress duck
/delay 1
/keypress duck
/delay 1
/return
}
:CloseMobCheck
/if (${Me.Casting.ID}) /goto :CastLoop
/return
|--------------------------------------------------------------------------------
|SUB: Slain
|--------------------------------------------------------------------------------
Sub Event_Slain
/varset RV_TargetDead 1
/varset RV_Fighting 0
/attack off
/target clear
/keypress forward
/keypress back
/squelch /target radius 30 corpse
/face fast
/if (${RV_HasTarget} && (${Defined[RV_LootArray]} || ${RV_LootAllItems})) /call LootMob
/return
|--------------------------------------------------------------------------------
|SUB: Zoned
|--------------------------------------------------------------------------------
Sub Event_Zoned
/echo Zoned
/delay 60s
/quit
/endmacro
|--------------------------------------------------------------------------------
|SUB: Looting
|--------------------------------------------------------------------------------
Sub LootMob
/doevents
/declare LootSlot int inner 0
/declare LootCheck int inner 0
/declare LootTotal int inner 0
/keypress forward
/keypress back
/fastdrop on
/lootn never
/Echo Looting
/loot
/varset CheckBuffs 1
/delay 1s
/if (!${Corpse.Items}) {
/echo NO LOOT! Cheap Bastard!
/notify LootWnd DoneButton leftmouseup
/return
} else {
/varset LootTotal ${Corpse.Items}
/for LootSlot 1 to ${LootTotal}
/shift /itemnotify loot${LootSlot} leftmouseup
/delay 1s
/if (${RV_LootAllItems}) {
/echo Keeping a ${Cursor.Name}... WOOT!
/autoinventory
/delay 1s
} else {
/for LootCheck 1 to ${RV_LootArray.Size}
/if (${Cursor.Name.Find[${RV_LootArray[${LootCheck}]}]}) {
/echo Keeping a ${Cursor.Name}... WOOT!
/varcalc RV_LootStats[${LootCheck}] ${RV_LootStats[${LootCheck}]}+1
/autoinventory
/delay 1s
}
/next LootCheck
}
/if (${Cursor.ID}) {
/echo Destroying a ${Cursor.Name}...
/destroy
/delay 1s
}
/next LootSlot
/notify LootWnd DoneButton leftmouseup
}
/return
|--------------------------------------------------------------------------------
|SUB: Reset
|--------------------------------------------------------------------------------
Sub ResetSub
/doevents
/varset RV_HasTarget 0
/varset RV_TargetDead 0
/varset RV_Fighting 0
/return
| Pull Macro
| Pull.mac
| Author : 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
#Event Slain "#*# slain#*#"
#Event Zoned "LOADING, PLEASE WAIT..."
#Event ItemSet "[MQ2] ItemSet#*#"
#Event ItemBounce "[MQ2] ItemBounce#*#"
#Event ItemCast "[MQ2] ItemCast#*#"
Sub Main
/declare CurrentZ int outer
|------------------------------------------------------------
|How far would you like to target a mob?
|------------------------------------------------------------
/declare RV_MaxRadius int outer 500
|------------------------------------------------------------
|How far is the fast movement range?
|------------------------------------------------------------
/declare RV_FastRange int outer 35
|------------------------------------------------------------
|How far is the maximum combat range?
|------------------------------------------------------------
/declare RV_RangeMax int outer 50
|------------------------------------------------------------
|How far is the minimum combat range?
|------------------------------------------------------------
/declare RV_RangeMin int outer 10
|------------------------------------------------------------
|What is the minimum Z Value of mobs I should target?
|------------------------------------------------------------
/declare RV_MinZRange int outer ${Math.Calc[${CurrentZ}-200]}
|------------------------------------------------------------
|What is the maximum Z Value of mobs I should target?
|------------------------------------------------------------
/declare RV_MaxZRange int outer ${Math.Calc[${CurrentZ}+200]}
|------------------------------------------------------------
|Loot Array Information.
|------------------------------------------------------------
/call ReadINI PullLoot.ini "${Zone.Name}" Loot
/if (!${Defined[RV_LootArray]}) {
/echo No Loot Array Created...
}
|------------------------------------------------------------
|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 Snared outer FALSE
/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
:Start
/doevents
/call GMCheck
/if (${Me.PctHPs}<=50) /potionbelt activate 1
/call GetTarget
/if (${RV_HasTarget}) /call Pull
/if (${RV_HasTarget}) /call CombatSub
/call ResetSub
/call MoveToLoc ${RT_MyyLOC} ${RT_MyXLOC}
/goto :Start
/return
|--------------------------------------------------------------------------------
|SUB: Reading from an INI File
|--------------------------------------------------------------------------------
Sub ReadINI(FileName,Loot,ArrayType)
/echo Attempting to Read Information from ${FileName}...
/declare nValues int local 1
/declare nArray int local 0
/declare KeySet string local ${Ini[${FileName}]}
/if (${Ini[${FileName},Loot,-1,NO].Equal[NO]}) {
/echo "${SectionName}" is not a Valid Section for FILE:${FileName}, ending macro...
/delay 1s
/return
}
:CounterLoop
/if (${String[${Ini[${FileName},Loot,${ArrayType}${nValues}]}].Equal[null]}) {
/varcalc nValues ${nValues}-1
/goto :MakeArray
}
/varcalc nValues ${nValues}+1
/goto :CounterLoop
:MakeArray
/if (!${nValues}) /return
/if (${FileName.Equal["PullLoot.ini"]}&&${nValues}>0) {
/echo Declaring Loot Array...
/declare RV_LootArray[${nValues}] string outer
/declare RV_LootStats[${nValues}] string outer
}
/for nArray 1 to ${nValues}
/if (${FileName.Equal["PullLoot.ini"]}) {
/varset RV_LootArray[${nArray}] ${Ini[${FileName},Loot,${ArrayType}${nArray}]}
/varset RV_LootStats[${nArray}] 0
}
/next nArray
/echo Information Read Successfully from ${FileName}...
/delay 1s
/return
|--------------------------------------------------------------------------------
|SUB: GM Check
|--------------------------------------------------------------------------------
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
|--------------------------------------------------------------------------------
|SUB: Aquire Target
|--------------------------------------------------------------------------------
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
}
/varset RV_HasTarget 1
/varset RV_MyTargetName ${Target.Name}
/echo Acquired ${Target.Name} at range ${Int[${Target.Distance}]}
/return
}
/if (${CheckBuffs}>0) {
/echo Checking Buffs
/call ItemCast
/varset CheckBuffs 0
/echo Aquiring Long Range Mobs
}
/next RV_CurrentRadius
/goto :Acquire
/return
|--------------------------------------------------------------------------------
|SUB: Pull
|--------------------------------------------------------------------------------
Sub Pull
/doevents
/echo Pulling Mob
/declare TargDist float local
:PullLoop
/doevents
/if (!${Me.Combat}) /attack on
/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}
/if (!${Target.ID}) /return
/face fast
:Engage
/varset TargDist ${Math.Distance[${Target.Y},${Target.X},0:${Me.Y},${Me.X},0]}
/if ( ${TargDist}<30 ) /return
/delay 1s
/goto :Engage
/return
|--------------------------------------------------------------------------------
|SUB: Move to Mob
|--------------------------------------------------------------------------------
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
|--------------------------------------------------------------------------------
|SUB: Move To Location
|--------------------------------------------------------------------------------
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
|--------------------------------------------------------------------------------
|SUB: Obstacle Check
|--------------------------------------------------------------------------------
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
|--------------------------------------------------------------------------------
|SUB: Obstacle Avoidance
|--------------------------------------------------------------------------------
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
|--------------------------------------------------------------------------------
|SUB: Combat
|--------------------------------------------------------------------------------
Sub CombatSub
/doevents
/varset RV_Fighting 1
/varset RV_TargetDead 0
/echo Attacking Mob NOW!
:CombatLoop
/if (${Target.Type.NotEqual[NPC]}) /squelch /target clear
/if (!${Me.Combat}) /attack on
/if (!${Target.ID}) /return
/call MoveToMob
/if (${Target.Type.Equal[NPC]} && ${Target.PctHPs} < 30 && ${Target.Fleeing} && !${Snared}) {
/keypress 1
/varset Snared TRUE
}
/if (!${RV_TargetDead}) /goto :CombatLoop
/if (${Snared}) {
/varset Snared FALSE
}
/doevents
/return
|--------------------------------------------------------------------------------
|SUB: Item Buffs
|--------------------------------------------------------------------------------
Sub ItemCast
/doevents
/declare ItemDelay int inner 0
/varset ItemDelay 1
/varset i 1
:ItemCheckLoop
/doevents
/varset ialias ${Ini[PullItems.ini].Arg[${i},|]}
/if (${ialias.NotEqual[NULL]}) {
/if (${Ini[PullItems.ini,${ialias},KeepUp].Equal[FALSE]}) /goto :NextItem
/varset bouncenum 1
/varset doIclick TRUE
:BounceCheckLoop
/varset ibounce ${Ini[PullItems.ini,${ialias},BounceOff${bouncenum}]}
/if (${ibounce.NotEqual[NULL]}) {
/if (${ibounce.Equal[${Me.Buff[${ibounce}]}]}) /varset doIclick FALSE
} else /goto :DoneBounceChecks
/varcalc bouncenum ${bouncenum}+1
/goto :BounceCheckLoop
:DoneBounceChecks
/varset itemspellname ${FindItem[${Ini[PullItems.ini,${ialias},FullName]}].Spell}
/if (${itemspellname.Equal[${Me.Buff[${itemspellname}]}]}) /varset doIclick FALSE
/squelch /target myself
/if (${doIclick}) {
/if (${ItemDelay}==1) {
/delay 1s
/varset ItemDelay 0
}
}
/if (${doIclick}) /docommand /iclick ${ialias}
/if (${clicktimer}) /goto :DoneItemChecks
:NextItem
/varcalc i ${i}+1
} else /goto :DoneItemChecks
/goto :ItemCheckLoop
:DoneItemChecks
/doevents
/squelch /target clear
/return
Sub Event_ItemSet(string Line)
/varset lastevent Event_ItemSet
/if (!${Line.Arg[5].Length} || ${Line.Arg[6].Length}) {
/if (${verbosity}>=0) /${channel} ** Improper use of /iset
/if (${verbosity}>=0) /${channel} -- /iset <itemalias> keepup|nokeepup <"Item Name">
/if (${verbosity}>=0) /${channel} -- For example:
/if (${verbosity}>=0) /${channel} -- /iset gobby keepup "Shrunken Goblin Skull Earring"
/return
}
/ini "PullItems.ini" "${Line.Arg[3]}" "FullName" "${Line.Arg[5]}"
/ini "PullItems.ini" "${Line.Arg[3]}" "KeepUp" "${If[${Line.Arg[4].Equal[keepup]},TRUE,FALSE]}"
/if (${verbosity}>=0) /${channel} ** ${Line.Arg[5]} (KeepUp=${If[${Line.Arg[4].Equal[keepup]},TRUE,FALSE]}) updated in INI!
/return
Sub Event_ItemBounce(string Line)
/varset lastevent Event_ItemBounce
/if (!${Line.Arg[4].Length}) {
/if (${verbosity}>=0) /${channel} ** Improper use of /ibounce
/if (${verbosity}>=0) /${channel} -- /ibounce <itemalias> "Some Spell Name"
/if (${verbosity}>=0) /${channel} -- For example:
/if (${verbosity}>=0) /${channel} -- /ibounce gobby "Strength of Tunare"
/return
}
/if (!${Ini[PullItems.ini,${Line.Arg[3]}].Length}) {
/if (${verbosity}>=0) /${channel} ** [${Line.Arg[3]}] not in INI file!
/return
}
/declare bindex int local 1
:CheckNextKey
/if (${Ini[PullItems.ini,${Line.Arg[3]},BounceOff${bindex}].Length}) {
/varcalc bindex ${bindex}+1
/goto :CheckNextKey
} else {
/ini "PullItems.ini" "${Line.Arg[3]}" "BounceOff${bindex}" "${Line.Arg[4]}"
/if (${verbosity}>=0) /${channel} ** Added "${Line.Arg[4]}" to [${Line.Arg[3]}]'s bounce list
}
/return
Sub Event_ItemCast(string Line)
/varset lastevent Event_ItemCast
/if (!${Line.Arg[3].Length}) {
/if (${verbosity}>=0) /${channel} ** Improper use of /icast
/if (${verbosity}>=0) /${channel} -- /icast <itemalias>
/if (${verbosity}>=0) /${channel} -- For example:
/if (${verbosity}>=0) /${channel} -- /icast gobby
/return
}
/if (!${Ini[PullItems.ini,${Line.Arg[3]}].Length}) {
/if (${verbosity}>=0) /${channel} ** [${Line.Arg[3]}] not in INI file!
/return
}
/declare fullname string local ${Ini[PullItems.ini,${Line.Arg[3]},FullName]}
/if (${verbosity}>=1) /${channel} ** Attempting to use: ${fullname}
/if (${FindItem[${fullname}].InvSlot.Pack}) {
:OpenPack
/if (!${Window[${FindItem[${fullname}].InvSlot.Pack.Name}].Open}) {
/itemnotify ${FindItem[${fullname}].InvSlot.Pack.Name} rightmouseup
/delay 2
/goto :OpenPack
}
/declare camefrom ${FindItem[${fullname}].InvSlot}
:GrabItem
/if (!${Cursor.ID}) {
/itemnotify ${InvSlot[${camefrom}]} leftmouseup
/delay 2
/goto :GrabItem
}
/declare clickyID int local ${Cursor.ID}
/declare wornat int local ${Cursor.WornSlot[1]}
:SwapFirst
/if (${Cursor.ID}==${clickyID}) {
/itemnotify ${InvSlot[${wornat}]} leftmouseup
/delay 2
/goto :SwapFirst
}
/delay 2
/if (${verbosity}>=1) /${channel} ** Clicking: ${fullname}
/declare previousID ${Cursor.ID}
/itemnotify ${InvSlot[${wornat}]} rightmouseup
:SwapAgain
/if (${Cursor.ID}==${previousID}) {
/itemnotify ${InvSlot[${wornat}]} leftmouseup
/delay 2
/goto :SwapAgain
}
:PutItBack
/if (${Cursor.ID}==${clickyID}) {
/itemnotify ${InvSlot[${camefrom}]} leftmouseup
/delay 2
/goto :PutItBack
}
:SummonedCheck
/if (${Cursor.ID}) {
/autoinv
/delay 2
/goto :SummonedCheck
}
:ClosePack
/if (${Window[${InvSlot[${camefrom}].Pack.Name}].Open}) {
/itemnotify ${InvSlot[${camefrom}].Pack.Name} rightmouseup
/delay 2
/goto :ClosePack
}
} else {
/if (${FindItem[${fullname}].InvSlot}) {
/if (${verbosity}>=1) /${channel} ** Clicking: ${fullname}
/itemnotify ${FindItem[${fullname}].InvSlot} rightmouseup
/delay 2
} else {
/if (${verbosity}>=0) /${channel} ** "${fullname}" not found!
}
}
:CastLoop
/delay 1
/squelch /target radius 100 npc
/if (${Target.ID}) {
/if (${Target.CleanName.Equal[${Me.Name}]}) {
/squelch /target clear
/goto :CloseMobCheck
}
/keypress duck
/delay 1
/keypress duck
/delay 1
/return
}
:CloseMobCheck
/if (${Me.Casting.ID}) /goto :CastLoop
/return
|--------------------------------------------------------------------------------
|SUB: Slain
|--------------------------------------------------------------------------------
Sub Event_Slain
/varset RV_TargetDead 1
/varset RV_Fighting 0
/attack off
/target clear
/keypress forward
/keypress back
/squelch /target radius 30 corpse
/face fast
/if (${RV_HasTarget} && (${Defined[RV_LootArray]} || ${RV_LootAllItems})) /call LootMob
/return
|--------------------------------------------------------------------------------
|SUB: Zoned
|--------------------------------------------------------------------------------
Sub Event_Zoned
/echo Zoned
/delay 60s
/quit
/endmacro
|--------------------------------------------------------------------------------
|SUB: Looting
|--------------------------------------------------------------------------------
Sub LootMob
/doevents
/declare LootSlot int inner 0
/declare LootCheck int inner 0
/declare LootTotal int inner 0
/keypress forward
/keypress back
/fastdrop on
/lootn never
/Echo Looting
/loot
/varset CheckBuffs 1
/delay 1s
/if (!${Corpse.Items}) {
/echo NO LOOT! Cheap Bastard!
/notify LootWnd DoneButton leftmouseup
/return
} else {
/varset LootTotal ${Corpse.Items}
/for LootSlot 1 to ${LootTotal}
/shift /itemnotify loot${LootSlot} leftmouseup
/delay 1s
/if (${RV_LootAllItems}) {
/echo Keeping a ${Cursor.Name}... WOOT!
/autoinventory
/delay 1s
} else {
/for LootCheck 1 to ${RV_LootArray.Size}
/if (${Cursor.Name.Find[${RV_LootArray[${LootCheck}]}]}) {
/echo Keeping a ${Cursor.Name}... WOOT!
/varcalc RV_LootStats[${LootCheck}] ${RV_LootStats[${LootCheck}]}+1
/autoinventory
/delay 1s
}
/next LootCheck
}
/if (${Cursor.ID}) {
/echo Destroying a ${Cursor.Name}...
/destroy
/delay 1s
}
/next LootSlot
/notify LootWnd DoneButton leftmouseup
}
/return
|--------------------------------------------------------------------------------
|SUB: Reset
|--------------------------------------------------------------------------------
Sub ResetSub
/doevents
/varset RV_HasTarget 0
/varset RV_TargetDead 0
/varset RV_Fighting 0
/return