Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
| necro666.mac v2.1, Zornecro 05-Dec-2004
| (Load mq2extras before starting the macro)
| Author : Zornecro, borrowed from wolf5
| (Wolf5 v1.1.9 - 2004-07-11)
| Useage : /macro necrocap
| Description : This macro will root dot mobs of
| The Forgotten Halls. It assumes you have an instance
| and are inside already.
| 10-Dec-04: Attempt to make it 69+ compatible with root rot. (Should work starting 53 changing the spells)..now set on 69 necro with no clickys)
| Mandrack edition
|------------------------------------------------------------------------------
#turbo 40
#define MY_PARTNER Mandrack
#define MIN_MOB_LVL 53
#define MAX_MOB_LVL 65
#define CAST_SUCCESS 0
#define CAST_OUTOFRANGE 1
#define CAST_CANNOTSEE 2
#define CAST_RETRY 3
#define CAST_IN_PROGRESS 4
#define CAST_ABORT -1
#define DELAY "/noparse /call Delay"
#define ROOT_SPELL "Paralyzing Earth"
#define SPLURT_SPELL "Splurt"
#define HEAT_DOT "Ignite Blood"
#define DISEASE_DOT "Cessation of Cor"
#define POISON_DOT "Envenomed Bolt"
#define SNARE_SPELL "Dooming Darkness"
#event Exp "#*#party experience!!"
#event Exp2 "You gain experience!!"
#event Invited "#1# invites you to join a group."
#event Blocked "The way is blocked to you. Perhaps you would be able to enter if there was a reason to come here."
#event NoMount "You can not summon a mount#*#"
#event NoLich "You can not change into this form while on a mount."
#event OOR "You are too far away to loot that corpse."
#event Retry "Your spell fizzles!"
#event Retry "Your spell is interrupted."
#event Retry "You haven't recovered yet..."
#event Retry "Spell recovery time not yet met."
#event Retry "Your target resisted the #*#"
#event Abort "Insufficient Mana to cast this spell!"
#event OutOfRange "Your target is out of range, get closer!"
#event NoLOS "You cannot see your target."
#event Stunned "You can't cast spells while stunned!"
#event Stunned "You are stunned!"
#event Standing "You must be standing to cast a spell."
#event Standing "|${Me.CleanName}| has fallen to the ground."
#event Retry "Your gate is too unstable, and collapses."
#event Abort "Your target is immune to changes in its attack speed."
#event Retry "You are too distracted to cast a spell now!"
#event Zoned "You have entered #*#"
#event PetAggro "Your pet is the focus of something's attention."
#event RootGone "Your Paralyzing Earth spell has worn off."
#event DOT1Gone "Your Splurt spell has worn off."
#event DOT2Gone "Your Ignite Blood spell has worn off."
#event DOT3Gone "Your Cessation of Cor spell has worn off."
#event DOT4Gone "Your Envenomed Bolt spell has worn off."
#event Skullcapgone "Your Fang of Death has worn off."
#event fear "Your fear spell has worn off."
#event ImHit "|${Target.CleanName}|#*#YOU for#*#"
#event Skinhit "A squeaking rat tries to bite YOU, but YOUR magical skin absorbs the blow!"
#event Skinhit1 "A squeaking rat tries to kick YOU, but YOUR magical skin absorbs the blow!"
#event Miss1 "A squeaking rat tries to bite YOU, but misses!"
#event Miss2 "A squeaking rat tries to kick YOU, but misses!"
#event InDanger "Your target is too high of a level for your fear spell."
|Events for counting the money we loot.
#event CashLoot "You receive #1#"
|-- The normal debug - for normal play.
| Enable: "/echo", Disable: "/squelch /echo"
#define DEBUG_1 /echo
|-- Deeper debugging - enable when trying to find bugs.
#define DEBUG_2 "/echo"
|-- The Deepest debugging - will spam a lot.
#define DEBUG_3 "/echo"
|-- Destroys Silver if you have more than the given amount! 0=disable
#define DESTROY_SILVER_IF_ABOVE 1
|-- Destroys Copper if you have more than the given amount! 0=disable
#define DESTROY_COPPER_IF_ABOVE 1
|-- At what range do we snare/send in pet?
#define INITIALIZE_ATTACK_RANGE 100
|-- What pet do we want?
#define PET_SPELL "Lost Soul"
|-- Favorite gem spot for the pet (1-8)
#define PET_GEM 6
|-- How far off should the pet be before we summon it?
#define MAX_PET_RANGE_BEFORE_SUMMON 800
#define SUMMON_SPELL "Summon companion"
#define SUMMON_GEM 7
| Change SPLURT_GEM to 0 if you lack it.
#define SPLURT_GEM 1
|-- What snare spell
|-- Favorite gem spot for the snare (1-8)
#define SNARE_GEM 2
#define HEAT_DOT_GEM 3
#define DISEASE_DOT_GEM 5
#define POISON_DOT_GEM 7
#define ROOT_GEM 8
|-- Name of fear spell
#define FEAR_SPELL "Trepidation"
|-- Favorite gem spot for the fear (1-8)
#define FEAR_GEM 3
|-- How low on health should the pet be before we heal it (noncombat)
#define HEAL_PET_BELOW_PCT 70
|-- Name of pet healing spell
#define HEAL_PET_SPELL "shadowbond"
|-- Favorite gem spot for the petheal (1-8)
#define HEAL_PET_GEM 7
#define PET_HASTE "Augmentation of Death"
#define PET_HASTE_GEM 9
#define LICH_SPELL "demi lich"
#define LICH_GEM 8
#define LIFE_DOT "Demi Lich Skullcap"
#define LIFE_DOT_GEM item
#define ROD_NAME "Summoned: Modulating Rod"
|-- If your health gets below this lvl start /beep'ing and FD
#define ALARM_HEALTH_BELOW_PCT 40
|What is our feign death spell of choice? (Requires it be already mem'd, memorizing before feigning = death)
#define FEIGN_SPELL "Death Peace"
#define FEIGN_GEM 4
|-- What is the minimum mana I should have, wait if below
#define MIN_MANA_BEFORE_MEDITATE 90
|--How many waypoints exist on the kiting path.
#define WP_SIZE 37
#define Y_COORD 1
#define X_COORD 2
#define Z_COORD 3
|----------------------------------------------------------------------------
|SUB: Main - Declarations and Initialization
|----------------------------------------------------------------------------
Sub Main
/declare Exper float outer
/declare AAExp float outer
/declare LDRExp float outer
/varset Exper ${Me.PctExp}
/varset AAExp ${Me.PctAAExp}
/varset LDRExp ${Me.PctGroupLeaderExp}
/declare reroot bool outer TRUE
/declare redot1 bool outer TRUE
/declare redot2 bool outer TRUE
/declare redot3 bool outer TRUE
/declare reskull bool outer TRUE
/declare dangerFlag bool outer
/declare spellName string outer
/declare Initialized bool outer FALSE
/declare weZoned bool outer FALSE
/declare wayBlocked bool outer FALSE
/declare mountFlag bool outer TRUE
/declare result int outer
/declare startingPP int outer ${Me.Platinum}
/declare startingXP int outer ${Me.Exp}
/declare wpY float outer
/declare wpX float outer
/declare wpZ float outer
/declare waypoint[WP_SIZE,3] int outer
/varset waypoint[1,Y_COORD] -598
/varset waypoint[1,X_COORD] 101
/varset waypoint[1,Z_COORD] 4
/varset waypoint[2,Y_COORD] -596
/varset waypoint[2,X_COORD] 108
/varset waypoint[2,Z_COORD] 4
/varset waypoint[3,Y_COORD] -597
/varset waypoint[3,X_COORD] -40
/varset waypoint[3,Z_COORD] 4
/varset waypoint[4,Y_COORD] -556
/varset waypoint[4,X_COORD] -50
/varset waypoint[4,Z_COORD] 4
/varset waypoint[5,Y_COORD] -556
/varset waypoint[5,X_COORD] -160
/varset waypoint[5,Z_COORD] 4
/varset waypoint[6,Y_COORD] -473
/varset waypoint[6,X_COORD] -41
/varset waypoint[6,Z_COORD] 4
/varset waypoint[7,Y_COORD] -398
/varset waypoint[7,X_COORD] -45
/varset waypoint[7,Z_COORD] 4
/varset waypoint[8,Y_COORD] -402
/varset waypoint[8,X_COORD] 1
/varset waypoint[8,Z_COORD] 4
/varset waypoint[9,Y_COORD] -329
/varset waypoint[9,X_COORD] 0
/varset waypoint[9,Z_COORD] 13
/varset waypoint[10,Y_COORD] -596
/varset waypoint[10,X_COORD] 157
/varset waypoint[10,Z_COORD] 2
/varset waypoint[11,Y_COORD] -600
/varset waypoint[11,X_COORD] 198
/varset waypoint[11,Z_COORD] 4
/varset waypoint[12,Y_COORD] -721
/varset waypoint[12,X_COORD] 45
/varset waypoint[12,Z_COORD] -10
/varset waypoint[13,Y_COORD] -664
/varset waypoint[13,X_COORD] 45
/varset waypoint[13,Z_COORD] -4
/varset waypoint[14,Y_COORD] -635
/varset waypoint[14,X_COORD] 45
/varset waypoint[14,Z_COORD] 4
/varset waypoint[15,Y_COORD] -814
/varset waypoint[15,X_COORD] 45
/varset waypoint[15,Z_COORD] -10
/varset waypoint[16,Y_COORD] -814
/varset waypoint[16,X_COORD] 190
/varset waypoint[16,Z_COORD] -11
/varset waypoint[17,Y_COORD] -814
/varset waypoint[17,X_COORD] 335
/varset waypoint[17,Z_COORD] -10
/varset waypoint[18,Y_COORD] -814
/varset waypoint[18,X_COORD] 488
/varset waypoint[18,Z_COORD] -35
/varset waypoint[19,Y_COORD] -473
/varset waypoint[19,X_COORD] -6
/varset waypoint[19,Z_COORD] 4
/varset waypoint[20,Y_COORD] -473
/varset waypoint[20,X_COORD] 20
/varset waypoint[20,Z_COORD] -2
/varset waypoint[21,Y_COORD] -473
/varset waypoint[21,X_COORD] 56
/varset waypoint[21,Z_COORD] -10
/varset waypoint[22,Y_COORD] -473
/varset waypoint[22,X_COORD] 135
/varset waypoint[22,Z_COORD] -11
/varset waypoint[23,Y_COORD] -405
/varset waypoint[23,X_COORD] 135
/varset waypoint[23,Z_COORD] -11
/varset waypoint[24,Y_COORD] -405
/varset waypoint[24,X_COORD] 93
/varset waypoint[24,Z_COORD] -11
/varset waypoint[25,Y_COORD] -290
/varset waypoint[25,X_COORD] 93
/varset waypoint[25,Z_COORD] -11
/varset waypoint[26,Y_COORD] -290
/varset waypoint[26,X_COORD] 183
/varset waypoint[26,Z_COORD] -11
/varset waypoint[27,Y_COORD] -290
/varset waypoint[27,X_COORD] 275
/varset waypoint[27,Z_COORD] -11
/varset waypoint[28,Y_COORD] -409
/varset waypoint[28,X_COORD] 275
/varset waypoint[28,Z_COORD] -11
/varset waypoint[29,Y_COORD] -397
/varset waypoint[29,X_COORD] -40
/varset waypoint[29,Z_COORD] 4
/varset waypoint[30,Y_COORD] -397
/varset waypoint[30,X_COORD] 0
/varset waypoint[30,Z_COORD] 4
/varset waypoint[31,Y_COORD] -337
/varset waypoint[31,X_COORD] 1
/varset waypoint[31,Z_COORD] 12
/varset waypoint[32,Y_COORD] -235
/varset waypoint[32,X_COORD] 0
/varset waypoint[32,Z_COORD] 20
/varset waypoint[33,Y_COORD] -167
/varset waypoint[33,X_COORD] 0
/varset waypoint[33,Z_COORD] 20
/varset waypoint[34,Y_COORD] -127
/varset waypoint[34,X_COORD] 0
/varset waypoint[34,Z_COORD] 14
/varset waypoint[35,Y_COORD] -86
/varset waypoint[35,X_COORD] 0
/varset waypoint[35,Z_COORD] 4
/varset waypoint[36,Y_COORD] 4
/varset waypoint[36,X_COORD] 0
/varset waypoint[36,Z_COORD] -6
/varset waypoint[37,Y_COORD] 53
/varset waypoint[37,X_COORD] 0
/varset waypoint[37,Z_COORD] 4
|Buffs to be kept up on self (max 15) - "Buff" or "Buff|GemSlot"
/declare MyBuffs[2] string outer
/varset MyBuffs[1] "Shield of the magi|7"
/varset MyBuffs[2] "manaskin|4"
|Buffs to be kept up on pet (max 15) - "Buff" or "Buff|GemSlot"
/declare PetBuffs[1] string outer
/varset PetBuffs[1] "Spirit Armor|8"
| /varset PetBuffs[2] "PET_HASTE|PET_HASTE_GEM"
DEBUG_1 Starting macro
|Group of locked target data
/declare TargetName string outer
/declare TargetID int outer
/declare fightTimer timer outer
/call MainSub
DEBUG_1 Exited normally!
/return
|----------------------------------------------------------------------------
|SUB: MainSub - The main sub
|----------------------------------------------------------------------------
Sub MainSub
|The main loop. After an attack we go here to acquire a new target
/cleanup
/if (${Zone.Name.Find[knowledge]}!=0) {
/zone everfrost
DELAY 3m ${weZoned}
/target npc magus
/warp target
DELAY 10
/varset weZoned FALSE
/say nedaria
DELAY 3m ${weZoned}
}
/if (${Zone.Name.Left[9].NotEqual[Forgotten]}) /varset weZoned TRUE
/varset Initialized TRUE
:NewTarget
/varset TargetID
/if (${Corpse.Open}) {
/notify LootWnd DoneButton leftmouseup
/cleanup
}
/call AlwaysCheck
/if (${Macro.Return}) /return
/call DowntimeWork
/if (${Macro.Return}==0) /goto :NewTarget
/call AcquireTarget
/if (${Macro.Return}) /goto :NewTarget
/if (!${dangerFlag}) {
/call BackOffFromTarget 60
/if (${Target.Distance}>INITIALIZE_ATTACK_RANGE) /goto :NewTarget
/if (${Me.Pet.Distance}>MAX_PET_RANGE_BEFORE_SUMMON) /call SummonPet TRUE
/call MyCast "SNARE_SPELL" SNARE_GEM
/pet attack
/call DoTheFear
/if (${Int[SPLURT_GEM]}>0) /call MyCast "SPLURT_SPELL" SPLURT_GEM
/call MyCast "LIFE_DOT" LIFE_DOT_GEM
/call MainAttack
/if (${Me.Pet.ID}) {
/if (${Me.Pet.Distance}>20) /warp loc ${Me.Pet.X} ${Me.Pet.Y} ${Me.Pet.Z}
} else {
/warp safe
}
/goto :NewTarget
} else {
||| This is new code for Root Rot with Warp |||
/call BackOffFromTarget 60
/if (${Target.Distance}>INITIALIZE_ATTACK_RANGE) /goto :NewTarget
/if (${Me.Pet.Distance}>MAX_PET_RANGE_BEFORE_SUMMON) /call SummonPet TRUE
/if (${Spell[HEAT_DOT_GEM].Name.NotEqual[HEAT_DOT]}) {
/memspellset dots
/delay 1m ${Window[SpellBookWnd]}==FALSE
}
/doevents flush
/varset reroot TRUE
/varset redot1 TRUE
/varset redot2 TRUE
/varset redot3 TRUE
/varset reskull TRUE
/call BackOffFromTarget 60
:fartAround
DELAY 1s ${Target.ID}!=0&&${Target.Type.Equal[NPC]}
/doevents
/if (${reroot} && ${Target.PctHPs}>1) {
|/call MyCast "LICH_SPELL" LICH_GEM
/call MyCast "ROOT_SPELL" ROOT_GEM
|/if (${Me.PctHPs}<90 && ${Target.PctHPs}>1) /call MyCast "LIFE_DOT" LIFE_DOT_GEM
/varset reroot
/goto :fartAround
} else /if (${redot1} && ${Target.PctHPs}>1) {
|!mqpaus/call MyCast "LIFE_DOT" LIFE_DOT_GEM
/if (${Target.PctHPs}>16) /call MyCast "SPLURT_SPELL" SPLURT_GEM
/if (${Me.PctMana}>60) /call MyCast "SNARE_SPELL" SNARE_GEM
/call SwapItem "Demi Lich Skullcap" Head
/if (${Me.PctHPs}<99 && ${Target.PctHPs}>1) /call MyCast "LIFE_DOT" LIFE_DOT_GEM
/call SwapItem "Deathcaller's Skullcap" head
/varset redot1
} else /if (${redot2} && ${Target.PctHPs}>4) {
/call MyCast "HEAT_DOT" HEAT_DOT_GEM
/varset redot2
} else /if (${redot3} && ${Target.PctHPs}>25) {
/call MyCast "DISEASE_DOT" DISEASE_DOT_GEM
/varset redot3
} else /if (${reskull} && ${Target.PctHPs}>1) {
/call MyCast "ROOT_SPELL" ROOT_GEM
|/if (${Me.PctMana}<90 && ${Me.Buff[LICH_SPELL].ID}==NULL && ${Me.PctHPs}>50) /call MyCast "LICH_SPELL" LICH_GEM
/varset reskull
} else /if (${Target.ID} && ${reroot}) {
/call BackOffFromTarget 60
/call SummonPet
/pet attack
}
/if (${Target.ID} && ${Target.Type.Equal[NPC]}) {
/call Mount
/goto :fartAround
}
/call AlwaysCheck
/if (${Zone.Name.Find[forgotten]}!=NULL && ${Macro.Return}==0) /call DoTheLooting
/varset TargetID
/goto :NewTarget
}
/return
| AlwaysCheck - health, aggro, zone, etc. ALSO CALLED FROM EVENTS.
| "/call AlwaysCheck nocast" to never perform casting (eg event calls)
| 0=no problem; 1=panic
Sub AlwaysCheck(string casting)
/doevents Zoned
/if (${Cursor.ID}) /autoinventory
/if (${Me.PctHPs}<ALARM_HEALTH_BELOW_PCT) {
|/call NoLich
/if (${Me.PctHPs}<=20) {
/instacamp
/endmacro
}
/if (${Spawn[${TargetID}].Type.Equal[NPC]} && ${Zone.Name.Find[forgotten]}!=0) {
/call BailOut
/return 1
}
}
/if (${Me.PctMana}>90 || ${Me.PctHPs}<50) /call NoLich
/if (${casting.Equal[nocast]}==FALSE) {
/if (!${dangerFlag} && ${Me.Pet.ID}!=0 && ${Me.PetBuff[PET_HASTE]}==0) /call MyCast "PET_HASTE" PET_HASTE_GEM
/if (${Me.PctMana}<90 && ${Me.Buff[LICH_SPELL].ID}==NULL && ${Me.PctHPs}>50) /call MyCast "LICH_SPELL" LICH_GEM
/if (${FindItem[ROD_NAME].ID}!=0) /cast item "ROD_NAME"
}
/if (${Initialized} && ${weZoned}) {
/declare zoneDelay timer 3m
/varset weZoned FALSE
/varset wayBlocked FALSE
/doevents flush
/if (${Zone.Name.Find[forgotten]}==NULL) {
/if (${Zone.Name.Find[nedaria]}==NULL) {
/if (${Zone.Name.Find[knowledge]}!=0) /goto :quit
:quit
/dismount
/camp desktop
/endmacro
}
:zoneIn
/warp loc -670 1543 96
/keypress back
/keypress forward
/delay 1
/sit
/if (${Me.PctHPs}<=50) {
/popup Waiting for health>99%...
/delay 5m ${Me.PctHPs}>99
}
/face fast loc 1543,-670
:zoning
/delay 1s
/click left 400 300
/delay 5
/click left 500 400
/delay 5
/click left 600 500
/doevents Zoned
/doevents Blocked
/delay 1s ${weZoned}||${wayBlocked}
/if (${wayBlocked}) /goto :quit
/if (${weZoned}==FALSE && ${zoneDelay.Value}>0) /goto :zoning
/if (${Zone.Name.Find[forgotten]}==NULL) /goto :quit
/if (${Zone.Name.Find[knowledge]}!=0) /goto :quit
/varset Initialized TRUE
}
}
/return 0
Sub NoLich
/declare slot int local
/varcalc slot ${Me.Buff[LICH_SPELL].ID}-1
/if (${slot}>=0) /notify BuffWindow Buff${slot} leftmouseup
/return
Sub BailOut
/dismount
/attack off
/warp safe
/delay 1
/target npc a_harindi_guide
|/warp loc -30 -827 -11
/warp target
/delay 2
/face fast nolook
/varset fightTimer 15s
:panic
/say I am ready to leave!
/delay 1
/doevents Zoned
/delay 5 ${weZoned}
/if (${Me.PctHPs}<=20) {
/instacamp
/return
}
/if (${Zone.Name.Find[forgotten]}) {
/keypress left
/delay 1
/keypress right
/if (${Target.ID}) {
/face fast nolook
} else {
/return
}
/if (${fightTimer.Value}>0) /goto :panic
/instacamp
}
/return
|----------------------------------------------------------------------------
|SUB: MainAttack - Handles the kiting/killing
|----------------------------------------------------------------------------
Sub MainAttack
:attackAgain
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/doevents
/target id ${TargetID}
DELAY 1
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /goto :looties
/call AlwaysCheck
/if (${Macro.Return}) /return
/if (${Target.ID}==${Me.Pet.ID}) {
/assist
DELAY 3 ${Target.ID}!=${Me.Pet.ID}
}
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /goto :looties
/if (${Me.PctHPs}>ALARM_HEALTH_BELOW_PCT && ${Me.Buff[LICH_SPELL].ID}==NULL) {
DEBUG_3 Me.Buff[LICH_SPELL].ID==${Me.Buff[LICH_SPELL].ID}
/call MyCast "LICH_SPELL" LICH_GEM
}
/call HealPet
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /goto :looties
/face
/if (${Target.Distance}>INITIALIZE_ATTACK_RANGE) /call WarpCloser
/if (${Me.Sitting}==FALSE && ${Me.Mount.ID}==0) /call Mount
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /goto :looties
/if (${fightTimer.Value}==0 && ${Target.PctHPs}>20) {
/call DoTheFear
/call MyCast "LIFE_DOT" LIFE_DOT_GEM
}
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /goto :looties
/if (${Target.PctHPs}>1 && ${Target.Speed}>0) {
/warp target
DELAY 1
/call MyCast "SNARE_SPELL" SNARE_GEM
}
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Target.ID}>0 && ${Target.Type.NotEqual[Corpse]}) /goto :attackAgain
:looties
/call AlwaysCheck
/if (${Zone.Name.Find[forgotten]}==NULL || ${Macro.Return}) /return
/call DoTheLooting
/varset TargetID
/return
|----------------------------------------------------------------------------
|SUB: DowntimeWork - Between fight rebuffs, etc.
|----------------------------------------------------------------------------
Sub DowntimeWork
| Check if we are low on mana or health. Heal or sit down if low
/call CheckMana
/if ( ${Macro.Return}==0 ) /return 0
DEBUG_2 1. Mana Checked
| Make sure all buffs on self are up
/call MaintainSelfBuffs
/if ( ${Macro.Return}==0 ) /return 0
DEBUG_2 4. Buffs Checked
/call AlwaysCheck
/if (${Macro.Return}) /return 0
/if (!${dangerFlag}) {
/memspellset dots
} else {
/memspellset dots
}
/delay 1m ${Window[SpellBookWnd]}==FALSE
/return 1
Sub instaClicky
/if (${FindItem[=Journeyman's Boots].ID}) /cast item "Journeyman's Boots"
/if (${FindItem[=Shrunken Goblin Skull Earring].ID}) /cast item "Shrunken Goblin Skull Earring"
/return
|----------------------------------------------------------------------------
|SUB: AcquireTarget - Finding a target 0=success; 1=n/a
|----------------------------------------------------------------------------
Sub AcquireTarget
/declare s int local
/declare lvl int local
/declare spn int local
/squelch /target clear
/varset TargetID
/varset TargetName
:scan
/varcalc s ${s}+1
/varset spn ${LastSpawn[${s}].ID}
/if (${spn}==0) /goto :acquired
/if ((${Spawn[${spn}].CleanName.Find[squeaking]} || ${Spawn[${spn}].CleanName.Find[squeaking]} || ${Spawn[${spn}].CleanName.Find[reject]}) && ${Spawn[${spn}].Type.Equal[Corpse]}==FALSE && ${Spawn[${spn}].Level}>=MIN_MOB_LVL && ${Spawn[${spn}].Level}<=MAX_MOB_LVL && ${Spawn[${spn}].Level}>${lvl}) {
/if (${Spawn[${spn}].Y}<=-265 && ${Spawn[${spn}].Y}>=-429 && ${Spawn[${spn}].X}>=74 && ${Spawn[${spn}].X}<=298 && ${Spawn[${spn}].Level}>=47) {
DEBUG_1 Ignoring mob in add area: ${Spawn[${spn}].CleanName}(L${Spawn[${spn}].Level})
} else {
/varset lvl ${Spawn[${spn}].Level}
/varset TargetID ${Spawn[${spn}].ID}
}
}
/goto :scan
:acquired
/if (${TargetID}) {
/target id ${TargetID}
DELAY 2 ${Target.ID}!=0
/if (${Target.CleanName.Find[${Me.CleanName}]}) {
DEBUG_1 WTF? I got targeted!
/return 1
}
/varset TargetID ${Target.ID}
/varset TargetName ${Target.CleanName}
/popup ${TargetName} (L${Target.Level})
DEBUG_1 ${TargetName} (L${Target.Level})
/if (${Target.Level}>=47) /varset dangerFlag TRUE
/return 0
}
DEBUG_3 AcquireTarget FAILED!
/popup Waiting for mobs in range MIN_MOB_LVL-MAX_MOB_LVL...
/call Mount
/delay 5s
/return 1
| Find the closest WP in line-of-sight to our target
Sub FindWP
/declare wp int local
/declare Y int local
/declare X int local
/declare Z int local
/declare dist float local 10000
/varset wpY
/varset wpX
/varset wpZ
/for wp 1 to WP_SIZE
/varset Y ${waypoint[${wp},Y_COORD]}
/varset X ${waypoint[${wp},X_COORD]}
/varset Z ${waypoint[${wp},Z_COORD]}
/if (${LineOfSight[${Y},${X},${Z}:${Target.Y},${Target.X},${Target.Z}]} &&
${Math.Distance[${Y},${X},${Z}:${Target.Y},${Target.X},${Target.Z}]}<${dist}) {
/varset wpY ${Y}
/varset wpX ${X}
/varset wpZ ${Z}
/varset dist ${Math.Distance[${Y},${X},${Z}:${Target.Y},${Target.X},${Target.Z}]}
}
/next wp
/return
|warp closer to target, via WP if mob, or direct otherwise.
Sub WarpCloser
/call AlwaysCheck nocast
/if (${Macro.Return}) /return
/if (${Target.ID}==0 || ${Target.ID}==${Me.ID}) {
/target id ${TargetID}
DELAY 2 ${Target.ID}>0
}
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /return
/if (${Target.Type.Equal[Pet]}) {
/warp target
} else {
/if (${Me.Pet.ID}) /warp loc ${Me.Pet.X} ${Me.Pet.Y} ${Me.Pet.Z}
}
}
DELAY 1
/if (${Target.ID}) /face fast
/return
|warp away from target, via most distant WP
Sub WarpDistant
/call AlwaysCheck nocast
/if (${Macro.Return}) /return
/if (${Target.ID}==0 || ${Target.ID}==${Me.ID}) {
/target id ${TargetID}
DELAY 2 ${Target.ID}>0
}
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /return
/declare wp int
/declare Y float
/declare X float
/declare Z float
/declare dist float
/for wp 1 to WP_SIZE
/varset Y ${waypoint[${wp},Y_COORD]}
/varset X ${waypoint[${wp},X_COORD]}
/varset Z ${waypoint[${wp},Z_COORD]}
/if (${Math.Distance[${Y},${X},${Z}:${Target.Y},${Target.X},${Target.Z}]}>${dist}) {
/varset wpY ${Y}
/varset wpX ${X}
/varset wpZ ${Z}
/varset dist ${Math.Distance[${Y},${X},${Z}:${Target.Y},${Target.X},${Target.Z}]}
}
/next wp
/if (${wpY}!=0||${wpX}!=0||${wpZ}!=0) {
/warp loc ${wpX} ${wpY} ${wpZ}
}
DELAY 1
/if (${Target.ID}) /face fast
/return
| DO NOT CALL DELAY FROM EVENTS!
| Parameters: delay timer setting + early exit condition
Sub Delay(string delayTime, string exitCond)
/declare tmr timer local ${delayTime}
:moreDelay
/call AlwaysCheck nocast
/if (${tmr.Value}==0) /return
/if (${exitCond}) {
|DEBUG_3 Early exit on condition: ${exitCond.Right[-1]}
/return
}
/if (${Me.PctHPs}<ALARM_HEALTH_BELOW_PCT) {
DEBUG_1 Delay abort, ${tmr.Value} ticks left, LOW HEALTH!
/return
}
/delay 1 ${exitCond}
|/if (${Math.Calc[${tmr.Value}%10].Int}==0) DEBUG_3 /delay ${tmr.Value} ${exitCond.Right[-1]}:${exitCond}
/doevents InDanger
/doevents Skinhit
/doevents Skinhit1
/doevents Miss1
/doevents Miss2
/doevents ImHit
/doevents Retry
/doevents Abort
/doevents OutOfRange
/doevents NoLOS
/doevents Standing
/doevents OOR
/doevents CashLoot
/doevents Zoned
/doevents PetAggro
/doevents NoMount
/doevents NoLich
/doevents Stunned
/doevents RootGone
/doevents DOT1Gone
/doevents DOT2Gone
/doevents DOT3Gone
/doevents Skullcapgone
/if (${Target.Type.Equal[NPC]}) /face
/goto :moreDelay
/return
Sub MyCast(string spname, string gname)
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Corpse.Open}) /notify LootWnd DoneButton leftmouseup
/varset spellName ${spname}
/call DoCast ${gname}
/doevents
/if (${Target.ID}!=${TargetID} && ${TargetID}!=0) {
/target id ${TargetID}
DELAY 3 ${Target.ID}==${TargetID}
}
/if (${Target.Type.Equal[NPC]}) /face fast
/return
| Cast something with status return and event processing
| assumes outer variable spellName and TargetID
Sub DoCast(string gem)
/declare castX float local ${Me.X}
/declare castY float local ${Me.Y}
/declare castZ float local ${Me.Z}
/declare castTime int
/declare tartype string local ${Spell[${spellName}].TargetType}
/if (${gem.Equal[item]}) /varset tartype ${FindItem[=${spellName}].Spell.TargetType}
:recast
/if (${tartype.Equal[Pet]} && ${Target.ID}!=${Me.Pet.ID}) {
/if (${Me.Pet.ID}==0) /return
/target id ${Me.Pet.ID}
/delay 1
} else /if (${tartype.Equal[Self]} && ${Target.ID}!=${Me.ID}) {
/target myself
/delay 1
} else /if (${Target.Type.Equal[NPC]} && ${Target.ID}!=${TargetID}) {
/target id ${TargetID}
/delay 1
}
/if (${Target.Type.Equal[NPC]} && ${Target.PctHPs}<8) {
DEBUG_3 Confusing/low health target (${Target.PctHPs}%)
/return
}
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) {
DEBUG_3 Target${Target.CleanName}(${Target.ID}) Dead?
/return
}
/if (${Target.ID}!=${Me.ID}) {
/face fast
/if (!${LineOfSight[${Me.Y},${Me.X},${Me.Z}:${Target.Y},${Target.X},${Target.Z}]}) {
/if (${dangerFlag} && ${reroot}) {
/call BackOffFromTarget 60
/delay 1
} else {
/call WarpCloser
/delay 1
}
}
}
/if (${gem.Equal[item]}) {
DEBUG_2 Casting ${spellName}:${gem}>${Target.CleanName}
/cast item "${spellName}"
} else {
/if (${Me.Gem[${spellName}]}==NULL) {
/memspell ${gem} "${spellName}"
DEBUG_3 book:${Window[SpellBookWnd]}; ${spellName}:${Me.SpellReady[${spellName}]}
/delay 10s ${Window[SpellBookWnd]}==FALSE
DELAY 15s ${Me.SpellReady[${spellName}]}
} else {
DEBUG_3 ${spellName}:${Me.SpellReady[${spellName}]}
/if (!${Me.SpellReady[${spellName}]}) {
DELAY 15s ${Me.SpellReady[${spellName}]}
}
}
DEBUG_2 Casting ${spellName}:${gem}>${Target.CleanName}
/cast "${spellName}"
}
/varset result CAST_IN_PROGRESS
DELAY 2
/doevents
/if (${result}==CAST_IN_PROGRESS && ${Me.Casting.ID}==0) /goto :recast
/if (!${dangerFlag}) {
DELAY 30s ${Me.Casting.ID}==NULL
/delay 1
/doevents
} else {
/delay 1
/varset castX ${Me.X}
/varset castY ${Me.Y}
/varset castZ ${Me.Z}
/if (${reroot} && ${Target.Type.Equal[NPC]}) {
/delay 4
/call WarpDistant
}
/varcalc castTime ${Math.Calc[${Me.Casting.MyCastTime}*10].Int}-19
| Hard code 9s delay for item, assume it is skullcap.
/if (${gem.Equal[item]}) /varcalc castTime 35
/delay ${castTime} ${Me.Casting.ID}==0
/warp loc ${castX} ${castY} ${castZ}
/face fast nolook
/delay 3s ${Me.Casting.ID}==0
/delay 1
/doevents
/if (${reroot} && ${Target.Type.Equal[NPC]}) {
/call WarpDistant
} else {
/call BackOffFromTarget 60
}
}
/if (${result}==CAST_IN_PROGRESS) /varset result CAST_SUCCESS
DEBUG_3 Casting of ${spellName} complete, result=${result}
/if (${result}==CAST_OUTOFRANGE || ${result}==CAST_CANNOTSEE) {
/if (!${dangerFlag} || !${reroot}) /call WarpCloser
/goto :recast
} else /if (${result}==CAST_RETRY) {
/if (!${Me.SpellReady[${spellName}]}) {
/call instaClicky
/varcalc result ${Spell[${spellName}].RecoveryTime}*10
DELAY ${result} ${Me.SpellReady[${spellName}]}
}
/goto :recast
}
/return
|----------------------------------------------------------------------------
|SUB: SummonPet - Summon pet if farther away than the defined range
|----------------------------------------------------------------------------
Sub SummonPet(bool force)
/return
|----------------------------------------------------------------------------
|SUB: HealPet - Heal pet if needed 0=just healed; 1=no problem
|----------------------------------------------------------------------------
Sub HealPet
/return 1
Sub Mount
/if (${mountFlag}) {
/if (${InvSlot[ammo].Item.Name.Find[Drum]}!=NULL && ${Me.Buff[Summon Drogmor].ID}==0) {
/cast item "${InvSlot[ammo].Item.Name}"
} else /if (${InvSlot[ammo].Item.Name.Find[Bridle]}!=NULL && ${Me.Buff[Summon Horse].ID}==0) {
/cast item "${InvSlot[ammo].Item.Name}"
} else {
/if (!${Me.Sitting}) /sit
}
} else {
/if (!${Me.Sitting}) /sit
}
/return
|----------------------------------------------------------------------------
|SUB: CheckMana 0= need more med; 1=mana ok
| Now with histeresis - exit condition is above entry condition.
|----------------------------------------------------------------------------
Sub CheckMana
/declare exitMana int local
/declare exitHealth int local
/varcalc exitMana MIN_MANA_BEFORE_MEDITATE+80
/varcalc exitHealth ALARM_HEALTH_BELOW_PCT+70
|Meditate?
/if (${Me.PctMana}<MIN_MANA_BEFORE_MEDITATE || ${Me.PctHPs}<ALARM_HEALTH_BELOW_PCT) {
DEBUG_1 Meditating.
/popup Meditating...
/call Mount
/declare i int local
/if ( ${Target.ID} ) /squelch /target clear
/for i 1 to 10
DELAY 1s
/if ( ${Target.ID} ) /return 1
/next i
/if ( ${Me.PctMana}<${exitMana} || ${Me.PctHPs}<${exitHealth} ) /return 0
DEBUG_2 Mana/health OK now.
}
/return 1
|----------------------------------------------------------------------------
|SUB: MaintainPetBuffs - Heal pet and keep its buffs up
| 0= still busy; 1=all done
|----------------------------------------------------------------------------
Sub MaintainPetBuffs
/return 1
|----------------------------------------------------------------------------
|SUB: MaintainSelfBuffs - Keep buffs up
| 0=still buffing; 1=all done
|----------------------------------------------------------------------------
Sub MaintainSelfBuffs
/declare iCount int local
/declare t string local
/for iCount 1 to ${MyBuffs.Size}
/call SplitString tmp_tmp ${MyBuffs[${iCount}]} "|"
/varset t ${Me.Buff[${tmp_tmp[1]}]}
/if ( ${t.Equal[NULL]} ) {
/if ( !${Target.ID}!=${Me.ID} ) {
/echo buffing
}
|Cast with gemselection or default
/if ( ${tmp_tmp.Size}>1 ) {
DEBUG_3 Attempting to cast "${tmp_tmp[1]}" ${tmp_tmp[2]}
/call MyCast "${tmp_tmp[1]}" ${tmp_tmp[2]}
} else {
DEBUG_3 Attempting to cast "${tmp_tmp[1]}"
/call MyCast "${tmp_tmp[1]}" 8
}
|Return to top - so we dont keep buffing if being attacked
/return 0
}
/next iCount
/return 1
| Back off from current target so many units.
| Finds first line of sight on a horizontal, vertical, or
| diagonals that are at least as distant as desired.
Sub BackOffFromTarget(float dist)
/declare by float local ${Target.Y}
/declare bx float local ${Target.X}
/varcalc by ${by}-${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/varset by ${Target.Y}
/varcalc bx ${bx}-${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/varcalc by ${by}+${dist}
/varset bx ${Target.X}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/varset by ${Target.Y}
/varcalc bx ${bx}+${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/varcalc by ${by}+${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/varcalc by ${Target.Y}-${dist}
/varcalc bx ${Target.X}-${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/varcalc by ${Target.Y}+${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/varcalc by ${Target.Y}-${dist}
/varcalc bx ${Target.X}+${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/face fast
/keypress forward
/delay 3s ${Target.Distance}>=${dist}
/keypress forward
/face fast
/return
:backoff
/warp loc ${bx} ${by} ${Target.Z}
/delay 1
/if (${Target.ID}) /face fast
/return
|----------------------------------------------------------------------------
|SUB: DoTheLooting
|----------------------------------------------------------------------------
Sub DoTheLooting
/if (!${Defined[looted]}) /declare looted bool outer
/target id ${TargetID}
DELAY 1
DEBUG_1 Going to loot
DEBUG_3 DoTheLooting Target: ${Target.CleanName}, ID:${Target.ID}
/warp target
DELAY 1
/loot
/varset looted FALSE
DELAY 6s (${Corpse.Open}&&${looted})
/call LootMob
/notify LootWnd DoneButton leftmouseup
DELAY 1
/doevents
/declare xp int local
/declare pp int local
/declare level float local ${Me.Level}
/varcalc level ${level}+${Math.Calc[${Me.Exp}/330.0].Milli}
/varcalc xp ${Me.Exp}-${startingXP}
/if (${xp}<0) /varcalc xp ${xp}+330
/varcalc pp ${Me.Platinum}-${startingPP}
/popup L${level.Milli}, XP up ${Math.Calc[${xp}/3.3]}% - PP up ${pp}
DEBUG_1 L${level.Milli}, XP up ${Math.Calc[${xp}/3.3]}% - PP up ${pp}
DELAY 5s
/return
|----------------------------------------------------------------------------
|SUB: LootMob
|----------------------------------------------------------------------------
Sub LootMob
/declare LootSlot int local
/if (!${Target.ID}) {
/target npc corpse
DELAY 1s ${Target.ID}>0
}
/loot
DELAY 1s ${Corpse.Open}
/if (${Corpse.Items}) {
/for LootSlot 1 to ${Corpse.Items}
/itemnotify loot${LootSlot} leftmouseup
DELAY 1s ${Cursor.ID}>0
/destroy
/next LootSlot
}
/cleanup
/return
|----------------------------------------------------------------------------
|SUB: SplitString - A generic string splitter.
|----------------------------------------------------------------------------
Sub SplitString(string varname, string inputstring, string splitter)
|/echo varname: "${varname}", inputstring: "${inputstring}", splitter: "${splitter}"
/declare i int local
/declare stringcnt int local
|The normal splitter. Splitter string is just 1 in length.
/if (${splitter.Length}==1) {
/varcalc stringcnt ${inputstring.Count["${splitter}"]} + 1
/if (!${Defined[${varname}]}) {
/declare ${varname}[${stringcnt}] string outer
} else {
/deletevar ${varname}
/declare ${varname}[${stringcnt}] string outer
}
/for i 1 to ${stringcnt}
/varset ${varname}[${i}] ${inputstring.Token[${i},"${splitter}"]}
/next i
}
/return
|----------------------------------------------------------------------------
|SUB: DestroyCopper - Destroy all the copper
|----------------------------------------------------------------------------
Sub DestroyCopper
/squelch /windowstate InventoryWindow open
/shift /notify InventoryWindow IW_Money3 leftmouseup
/delay 1s ${Cursor.ID}>0
/destroy
/cleanup
/return
|----------------------------------------------------------------------------
|SUB: DestroySilver - Destroy all the silver
|----------------------------------------------------------------------------
Sub DestroySilver
/squelch /windowstate InventoryWindow open
/shift /notify InventoryWindow IW_Money2 leftmouseup
/delay 1s ${Cursor.ID}>0
/destroy
/cleanup
/return
|----------------------------------------------------------------------------
|SUB: DoTheFear - Fear target
|----------------------------------------------------------------------------
Sub DoTheFear
/if ( ${Me.PctMana}>10 && ${Target.Type.Equal[NPC]} && ${Target.PctHPs}>24) {
/call MyCast "FEAR_SPELL" FEAR_GEM
/varset fightTimer 31s
}
/return
|----------------------------------------------------------------------------
|SUB: Event_CashLoot - Will count the loot so far running the macro
|----------------------------------------------------------------------------
Sub Event_CashLoot(string Line, string cash)
/return
Sub Event_fear
DEBUG_2 Fear me!
/call DoTheFear
/return
Sub Event_Miss1
/echo misses
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/if (${Me.Casting.ID}!=0) /return
/call BackOffFromTarget 90
/return
Sub Event_Miss2
/echo Miss2
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/if (${Me.Casting.ID}!=0) /return
/call BackOffFromTarget 90
/return
Sub Event_Skinhit
/echo skinhit
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/if (${Me.Casting.ID}!=0) /return
/call BackOffFromTarget 90
/return
Sub Event_Skinhit1
/echo skinhit
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/if (${Me.Casting.ID}!=0) /return
/call BackOffFromTarget 90
/return
Sub Event_ImHit
/Echo i m hit
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/if (${Me.Casting.ID}!=0) /return
/call BackOffFromTarget 80
/return
Sub Event_Retry
/delay 2
/varset result CAST_RETRY
/return
Sub Event_Abort
/varset result CAST_ABORT
/return
Sub Event_OutOfRange
/varset result CAST_OUTOFRANGE
/return
Sub Event_NoLOS
/varset result CAST_CANNOTSEE
/return
Sub Event_Standing
/stand
/varset result CAST_RETRY
/return
Sub Event_OOR
/warp target
/delay 2
/loot
/delay 3
/delay 3s ${Corpse.Open}
/doevents OOR
/return
Sub Event_Blocked
/varset wayBlocked TRUE
/return
Sub Event_Zoned
/varset weZoned TRUE
/return
Sub Event_PetAggro
/target id ${Me.Pet.ID}
/warp target
/delay 1
/assist
/delay 1
/return
Sub Event_NoMount
/varset mountFlag FALSE
/return
Sub Event_NoLich
/varset mountFlag FALSE
/dismount
/return
Sub Event_Stunned
:gdStunned
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/delay 1
/if (${Me.Stunned}) /goto :gdStunned
/varset result CAST_RETRY
/return
Sub Event_Invited(heard,string who)
/if (${who.Equal[MY_PARTNER]}) {
/invite
} else {
/disband
}
/return
|----------------------------------------------------------------------------
|SUB: Root Gone
|----------------------------------------------------------------------------
Sub Event_RootGone
DEBUG_2 Root gone.
/varset reroot TRUE
/return
|----------------------------------------------------------------------------
|SUB: DOT1Gone
|----------------------------------------------------------------------------
Sub Event_DOT1Gone
DEBUG_2 SPLURT_DOT gone.
/varset redot1 TRUE
/return
|----------------------------------------------------------------------------
|SUB: DOT2Gone
|----------------------------------------------------------------------------
Sub Event_DOT2Gone
DEBUG_2 HEAT_DOT gone.
/varset redot2 TRUE
/return
|----------------------------------------------------------------------------
|SUB: DOT3Gone
|----------------------------------------------------------------------------
Sub Event_DOT3Gone
DEBUG_2 DISEASE_DOT gone.
/varset redot3 TRUE
/return
|----------------------------------------------------------------------------
|SUB: SKULLCAPGONE
|----------------------------------------------------------------------------
Sub Event_Skullcapgone
DEBUG_2 LIFE_DOT gone.
/varset reskull TRUE
/return
Sub Event_InDanger
/varset dangerFlag TRUE
/varset result CAST_ABORT
/return
Sub Event_Exp
/varset AAExp ${Math.Calc[${Me.PctAAExp}-${AAExp}]}
/varset Exper ${Math.Calc[${Me.PctExp}-${Exper}]}
/varset LDRExp ${Math.Calc[${Me.PctGroupLeaderExp}-${LDRExp}]}
/echo EXP: ${Exper} (${Me.PctExp}%) - AAXP: ${AAExp} (${Me.PctAAExp}%) - LDRXP: ${LDRExp} (${Me.PctGroupLeaderExp})
/popup ${Exper} (${Me.PctExp}%) - AAXP: ${AAExp} (${Me.PctAAExp}%) - LDRXP: ${LDRExp} (${Me.PctGroupLeaderExp})
/varset Exper ${Me.PctExp}
/varset AAExp ${Me.PctAAExp}
/varset LDRExp ${Me.PctGroupLeaderExp}
/return
Sub Event_Exp2
/varset AAExp ${Math.Calc[${Me.PctAAExp}-${AAExp}]}
/varset Exper ${Math.Calc[${Me.PctExp}-${Exper}]}
/varset LDRExp ${Math.Calc[${Me.PctGroupLeaderExp}-${LDRExp}]}
/echo EXP: ${Exper} (${Me.PctExp}%) - AAXP: ${AAExp} (${Me.PctAAExp}%)
/popup ${Exper} (${Me.PctExp}%) - AAXP: ${AAExp} (${Me.PctAAExp}%)
/varset Exper ${Me.PctExp}
/varset AAExp ${Me.PctAAExp}
/varset LDRExp ${Me.PctGroupLeaderExp}
/return
Sub SwapItem(string itemName,string slotName)
/if ( ${InvSlot[${slotName}].Item.Name.Equal[${itemName}]} ) /return
/declare slotID int local
/declare oldSlotID int local
/declare oldItem string local
/declare i int local
/varset slotID ${InvSlot[${slotName}].ID} | slotID = slot you're swapping item to
/varset oldSlotID ${FindItem[${itemName}].InvSlot.ID} | oldSlotID = slot the item was originally in
/varset oldItem ${InvSlot[${slotName}].Item.Name} | oldItem = name of item in the slot you're swapping WITH
/if ( !${slotID} ) {
/echo Invalid slot name: ${slotName}
/return
}
/if ( !${oldSlotID} ) {
/echo Could not find item ${itemName}
/return
}
:auto_inv
/if ( ${Cursor.ID} && !${Cursor.Name.Equal[${itemName}]} ) {
/if ( ${Cursor.Container} ) {
/for i 1 to 8
/if ( !${InvSlot[pack${i}].Item.Container} ) {
/nomodkey /itemnotify pack${i} leftmouseup
}
/next i
} else {
/autoinventory
}
/goto :auto_inv
}
:pick_up_item
| if the item is in a bag and it's not open, then open it!
/if ( ${InvSlot[${oldSlotID}].Pack} && !${Window[${InvSlot[${oldSlotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${oldSlotID}].Pack} rightmouseup
| if the slot you're putting it in is inside a bag and it's not open, then open it!
/if ( ${InvSlot[${slotID}].Pack} && !${Window[${InvSlot[${slotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${slotID}].Pack} rightmouseup
| ok.. pick up the item now!
/squelch /nomodkey /shiftkey /itemnotify ${InvSlot[${oldSlotID}]} leftmouseup
| if item isn't on your cursor, try again!
/if ( !${Cursor.Name.Equal[${itemName}]} ) {
/if ( ${Cursor.ID} && !${Cursor.Container} ) /autoinventory
/goto :pick_up_item
}
:exchange_items
/if ( ${InvSlot[${oldSlotID}].Pack} && !${Window[${InvSlot[${oldSlotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${oldSlotID}].Pack} rightmouseup
/if ( ${InvSlot[${slotID}].Pack} && !${Window[${InvSlot[${slotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${slotID}].Pack} rightmouseup
| put the item in the new slot, and pick up whatever item was there
/squelch /nomodkey /shiftkey /itemnotify ${slotID} leftmouseup
| if it didnt get exchanged, try again!
/if ( ${Cursor.ID} && !${Cursor.Name.Equal[${oldItem}]} && !${Cursor.Name.Equal[${itemName}]} && !${Cursor.Container} ) /autoinventory
/if ( !${InvSlot[${slotID}].Item.Name.Equal[${itemName}]} ) /goto :exchange_items
:drop_item
/if ( !${Cursor.Container} || ( ${InvSlot[${oldSlotID}]}<30 && ${InvSlot[${oldSlotID}]}>=22 ) ) {
/if ( ${InvSlot[${oldSlotID}].Pack} && !${Window[${InvSlot[${oldSlotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${oldSlotID}].Pack} rightmouseup
/if ( ${InvSlot[${slotID}].Pack} && !${Window[${InvSlot[${slotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${slotID}].Pack} rightmouseup
/squelch /nomodkey /itemnotify ${oldSlotID} leftmouseup
/if ( ${Cursor.ID} ) {
/if ( !${Cursor.Name.Equal[${oldItem}]} ) /autoinventory
/goto :drop_item
}
}
:close_pack
/if ( ${InvSlot[${oldSlotID}].Pack} && ${Window[${InvSlot[${oldSlotID}].Pack.Name}].Open} && ( ${Cursor.Name.Equal[${itemName}]} || ${FindItem[${itemName}].ID} ) ) {
/squelch /nomodkey /itemnotify ${InvSlot[${oldSlotID}].Pack} rightmouseup
/goto :close_pack
}
/if ( ${InvSlot[${slotID}].Pack} && ${Window[${InvSlot[${slotID}].Pack.Name}].Open} && ( ${Cursor.Name.Equal[${itemName}]} || ${FindItem[${itemName}].ID} ) ) {
/squelch /nomodkey /itemnotify ${InvSlot[${slotID}].Pack} rightmouseup
/goto :close_pack
}
/return
| necro666.mac v2.1, Zornecro 05-Dec-2004
| (Load mq2extras before starting the macro)
| Author : Zornecro, borrowed from wolf5
| (Wolf5 v1.1.9 - 2004-07-11)
| Useage : /macro necrocap
| Description : This macro will root dot mobs of
| The Forgotten Halls. It assumes you have an instance
| and are inside already.
| 10-Dec-04: Attempt to make it 69+ compatible with root rot. (Should work starting 53 changing the spells)..now set on 69 necro with no clickys)
| Mandrack edition
|------------------------------------------------------------------------------
#turbo 40
#define MY_PARTNER Mandrack
#define MIN_MOB_LVL 53
#define MAX_MOB_LVL 65
#define CAST_SUCCESS 0
#define CAST_OUTOFRANGE 1
#define CAST_CANNOTSEE 2
#define CAST_RETRY 3
#define CAST_IN_PROGRESS 4
#define CAST_ABORT -1
#define DELAY "/noparse /call Delay"
#define ROOT_SPELL "Paralyzing Earth"
#define SPLURT_SPELL "Splurt"
#define HEAT_DOT "Ignite Blood"
#define DISEASE_DOT "Cessation of Cor"
#define POISON_DOT "Envenomed Bolt"
#define SNARE_SPELL "Dooming Darkness"
#event Exp "#*#party experience!!"
#event Exp2 "You gain experience!!"
#event Invited "#1# invites you to join a group."
#event Blocked "The way is blocked to you. Perhaps you would be able to enter if there was a reason to come here."
#event NoMount "You can not summon a mount#*#"
#event NoLich "You can not change into this form while on a mount."
#event OOR "You are too far away to loot that corpse."
#event Retry "Your spell fizzles!"
#event Retry "Your spell is interrupted."
#event Retry "You haven't recovered yet..."
#event Retry "Spell recovery time not yet met."
#event Retry "Your target resisted the #*#"
#event Abort "Insufficient Mana to cast this spell!"
#event OutOfRange "Your target is out of range, get closer!"
#event NoLOS "You cannot see your target."
#event Stunned "You can't cast spells while stunned!"
#event Stunned "You are stunned!"
#event Standing "You must be standing to cast a spell."
#event Standing "|${Me.CleanName}| has fallen to the ground."
#event Retry "Your gate is too unstable, and collapses."
#event Abort "Your target is immune to changes in its attack speed."
#event Retry "You are too distracted to cast a spell now!"
#event Zoned "You have entered #*#"
#event PetAggro "Your pet is the focus of something's attention."
#event RootGone "Your Paralyzing Earth spell has worn off."
#event DOT1Gone "Your Splurt spell has worn off."
#event DOT2Gone "Your Ignite Blood spell has worn off."
#event DOT3Gone "Your Cessation of Cor spell has worn off."
#event DOT4Gone "Your Envenomed Bolt spell has worn off."
#event Skullcapgone "Your Fang of Death has worn off."
#event fear "Your fear spell has worn off."
#event ImHit "|${Target.CleanName}|#*#YOU for#*#"
#event Skinhit "A squeaking rat tries to bite YOU, but YOUR magical skin absorbs the blow!"
#event Skinhit1 "A squeaking rat tries to kick YOU, but YOUR magical skin absorbs the blow!"
#event Miss1 "A squeaking rat tries to bite YOU, but misses!"
#event Miss2 "A squeaking rat tries to kick YOU, but misses!"
#event InDanger "Your target is too high of a level for your fear spell."
|Events for counting the money we loot.
#event CashLoot "You receive #1#"
|-- The normal debug - for normal play.
| Enable: "/echo", Disable: "/squelch /echo"
#define DEBUG_1 /echo
|-- Deeper debugging - enable when trying to find bugs.
#define DEBUG_2 "/echo"
|-- The Deepest debugging - will spam a lot.
#define DEBUG_3 "/echo"
|-- Destroys Silver if you have more than the given amount! 0=disable
#define DESTROY_SILVER_IF_ABOVE 1
|-- Destroys Copper if you have more than the given amount! 0=disable
#define DESTROY_COPPER_IF_ABOVE 1
|-- At what range do we snare/send in pet?
#define INITIALIZE_ATTACK_RANGE 100
|-- What pet do we want?
#define PET_SPELL "Lost Soul"
|-- Favorite gem spot for the pet (1-8)
#define PET_GEM 6
|-- How far off should the pet be before we summon it?
#define MAX_PET_RANGE_BEFORE_SUMMON 800
#define SUMMON_SPELL "Summon companion"
#define SUMMON_GEM 7
| Change SPLURT_GEM to 0 if you lack it.
#define SPLURT_GEM 1
|-- What snare spell
|-- Favorite gem spot for the snare (1-8)
#define SNARE_GEM 2
#define HEAT_DOT_GEM 3
#define DISEASE_DOT_GEM 5
#define POISON_DOT_GEM 7
#define ROOT_GEM 8
|-- Name of fear spell
#define FEAR_SPELL "Trepidation"
|-- Favorite gem spot for the fear (1-8)
#define FEAR_GEM 3
|-- How low on health should the pet be before we heal it (noncombat)
#define HEAL_PET_BELOW_PCT 70
|-- Name of pet healing spell
#define HEAL_PET_SPELL "shadowbond"
|-- Favorite gem spot for the petheal (1-8)
#define HEAL_PET_GEM 7
#define PET_HASTE "Augmentation of Death"
#define PET_HASTE_GEM 9
#define LICH_SPELL "demi lich"
#define LICH_GEM 8
#define LIFE_DOT "Demi Lich Skullcap"
#define LIFE_DOT_GEM item
#define ROD_NAME "Summoned: Modulating Rod"
|-- If your health gets below this lvl start /beep'ing and FD
#define ALARM_HEALTH_BELOW_PCT 40
|What is our feign death spell of choice? (Requires it be already mem'd, memorizing before feigning = death)
#define FEIGN_SPELL "Death Peace"
#define FEIGN_GEM 4
|-- What is the minimum mana I should have, wait if below
#define MIN_MANA_BEFORE_MEDITATE 90
|--How many waypoints exist on the kiting path.
#define WP_SIZE 37
#define Y_COORD 1
#define X_COORD 2
#define Z_COORD 3
|----------------------------------------------------------------------------
|SUB: Main - Declarations and Initialization
|----------------------------------------------------------------------------
Sub Main
/declare Exper float outer
/declare AAExp float outer
/declare LDRExp float outer
/varset Exper ${Me.PctExp}
/varset AAExp ${Me.PctAAExp}
/varset LDRExp ${Me.PctGroupLeaderExp}
/declare reroot bool outer TRUE
/declare redot1 bool outer TRUE
/declare redot2 bool outer TRUE
/declare redot3 bool outer TRUE
/declare reskull bool outer TRUE
/declare dangerFlag bool outer
/declare spellName string outer
/declare Initialized bool outer FALSE
/declare weZoned bool outer FALSE
/declare wayBlocked bool outer FALSE
/declare mountFlag bool outer TRUE
/declare result int outer
/declare startingPP int outer ${Me.Platinum}
/declare startingXP int outer ${Me.Exp}
/declare wpY float outer
/declare wpX float outer
/declare wpZ float outer
/declare waypoint[WP_SIZE,3] int outer
/varset waypoint[1,Y_COORD] -598
/varset waypoint[1,X_COORD] 101
/varset waypoint[1,Z_COORD] 4
/varset waypoint[2,Y_COORD] -596
/varset waypoint[2,X_COORD] 108
/varset waypoint[2,Z_COORD] 4
/varset waypoint[3,Y_COORD] -597
/varset waypoint[3,X_COORD] -40
/varset waypoint[3,Z_COORD] 4
/varset waypoint[4,Y_COORD] -556
/varset waypoint[4,X_COORD] -50
/varset waypoint[4,Z_COORD] 4
/varset waypoint[5,Y_COORD] -556
/varset waypoint[5,X_COORD] -160
/varset waypoint[5,Z_COORD] 4
/varset waypoint[6,Y_COORD] -473
/varset waypoint[6,X_COORD] -41
/varset waypoint[6,Z_COORD] 4
/varset waypoint[7,Y_COORD] -398
/varset waypoint[7,X_COORD] -45
/varset waypoint[7,Z_COORD] 4
/varset waypoint[8,Y_COORD] -402
/varset waypoint[8,X_COORD] 1
/varset waypoint[8,Z_COORD] 4
/varset waypoint[9,Y_COORD] -329
/varset waypoint[9,X_COORD] 0
/varset waypoint[9,Z_COORD] 13
/varset waypoint[10,Y_COORD] -596
/varset waypoint[10,X_COORD] 157
/varset waypoint[10,Z_COORD] 2
/varset waypoint[11,Y_COORD] -600
/varset waypoint[11,X_COORD] 198
/varset waypoint[11,Z_COORD] 4
/varset waypoint[12,Y_COORD] -721
/varset waypoint[12,X_COORD] 45
/varset waypoint[12,Z_COORD] -10
/varset waypoint[13,Y_COORD] -664
/varset waypoint[13,X_COORD] 45
/varset waypoint[13,Z_COORD] -4
/varset waypoint[14,Y_COORD] -635
/varset waypoint[14,X_COORD] 45
/varset waypoint[14,Z_COORD] 4
/varset waypoint[15,Y_COORD] -814
/varset waypoint[15,X_COORD] 45
/varset waypoint[15,Z_COORD] -10
/varset waypoint[16,Y_COORD] -814
/varset waypoint[16,X_COORD] 190
/varset waypoint[16,Z_COORD] -11
/varset waypoint[17,Y_COORD] -814
/varset waypoint[17,X_COORD] 335
/varset waypoint[17,Z_COORD] -10
/varset waypoint[18,Y_COORD] -814
/varset waypoint[18,X_COORD] 488
/varset waypoint[18,Z_COORD] -35
/varset waypoint[19,Y_COORD] -473
/varset waypoint[19,X_COORD] -6
/varset waypoint[19,Z_COORD] 4
/varset waypoint[20,Y_COORD] -473
/varset waypoint[20,X_COORD] 20
/varset waypoint[20,Z_COORD] -2
/varset waypoint[21,Y_COORD] -473
/varset waypoint[21,X_COORD] 56
/varset waypoint[21,Z_COORD] -10
/varset waypoint[22,Y_COORD] -473
/varset waypoint[22,X_COORD] 135
/varset waypoint[22,Z_COORD] -11
/varset waypoint[23,Y_COORD] -405
/varset waypoint[23,X_COORD] 135
/varset waypoint[23,Z_COORD] -11
/varset waypoint[24,Y_COORD] -405
/varset waypoint[24,X_COORD] 93
/varset waypoint[24,Z_COORD] -11
/varset waypoint[25,Y_COORD] -290
/varset waypoint[25,X_COORD] 93
/varset waypoint[25,Z_COORD] -11
/varset waypoint[26,Y_COORD] -290
/varset waypoint[26,X_COORD] 183
/varset waypoint[26,Z_COORD] -11
/varset waypoint[27,Y_COORD] -290
/varset waypoint[27,X_COORD] 275
/varset waypoint[27,Z_COORD] -11
/varset waypoint[28,Y_COORD] -409
/varset waypoint[28,X_COORD] 275
/varset waypoint[28,Z_COORD] -11
/varset waypoint[29,Y_COORD] -397
/varset waypoint[29,X_COORD] -40
/varset waypoint[29,Z_COORD] 4
/varset waypoint[30,Y_COORD] -397
/varset waypoint[30,X_COORD] 0
/varset waypoint[30,Z_COORD] 4
/varset waypoint[31,Y_COORD] -337
/varset waypoint[31,X_COORD] 1
/varset waypoint[31,Z_COORD] 12
/varset waypoint[32,Y_COORD] -235
/varset waypoint[32,X_COORD] 0
/varset waypoint[32,Z_COORD] 20
/varset waypoint[33,Y_COORD] -167
/varset waypoint[33,X_COORD] 0
/varset waypoint[33,Z_COORD] 20
/varset waypoint[34,Y_COORD] -127
/varset waypoint[34,X_COORD] 0
/varset waypoint[34,Z_COORD] 14
/varset waypoint[35,Y_COORD] -86
/varset waypoint[35,X_COORD] 0
/varset waypoint[35,Z_COORD] 4
/varset waypoint[36,Y_COORD] 4
/varset waypoint[36,X_COORD] 0
/varset waypoint[36,Z_COORD] -6
/varset waypoint[37,Y_COORD] 53
/varset waypoint[37,X_COORD] 0
/varset waypoint[37,Z_COORD] 4
|Buffs to be kept up on self (max 15) - "Buff" or "Buff|GemSlot"
/declare MyBuffs[2] string outer
/varset MyBuffs[1] "Shield of the magi|7"
/varset MyBuffs[2] "manaskin|4"
|Buffs to be kept up on pet (max 15) - "Buff" or "Buff|GemSlot"
/declare PetBuffs[1] string outer
/varset PetBuffs[1] "Spirit Armor|8"
| /varset PetBuffs[2] "PET_HASTE|PET_HASTE_GEM"
DEBUG_1 Starting macro
|Group of locked target data
/declare TargetName string outer
/declare TargetID int outer
/declare fightTimer timer outer
/call MainSub
DEBUG_1 Exited normally!
/return
|----------------------------------------------------------------------------
|SUB: MainSub - The main sub
|----------------------------------------------------------------------------
Sub MainSub
|The main loop. After an attack we go here to acquire a new target
/cleanup
/if (${Zone.Name.Find[knowledge]}!=0) {
/zone everfrost
DELAY 3m ${weZoned}
/target npc magus
/warp target
DELAY 10
/varset weZoned FALSE
/say nedaria
DELAY 3m ${weZoned}
}
/if (${Zone.Name.Left[9].NotEqual[Forgotten]}) /varset weZoned TRUE
/varset Initialized TRUE
:NewTarget
/varset TargetID
/if (${Corpse.Open}) {
/notify LootWnd DoneButton leftmouseup
/cleanup
}
/call AlwaysCheck
/if (${Macro.Return}) /return
/call DowntimeWork
/if (${Macro.Return}==0) /goto :NewTarget
/call AcquireTarget
/if (${Macro.Return}) /goto :NewTarget
/if (!${dangerFlag}) {
/call BackOffFromTarget 60
/if (${Target.Distance}>INITIALIZE_ATTACK_RANGE) /goto :NewTarget
/if (${Me.Pet.Distance}>MAX_PET_RANGE_BEFORE_SUMMON) /call SummonPet TRUE
/call MyCast "SNARE_SPELL" SNARE_GEM
/pet attack
/call DoTheFear
/if (${Int[SPLURT_GEM]}>0) /call MyCast "SPLURT_SPELL" SPLURT_GEM
/call MyCast "LIFE_DOT" LIFE_DOT_GEM
/call MainAttack
/if (${Me.Pet.ID}) {
/if (${Me.Pet.Distance}>20) /warp loc ${Me.Pet.Y} ${Me.Pet.X} ${Me.Pet.Z}
} else {
/warp succor
}
/goto :NewTarget
} else {
||| This is new code for Root Rot with Warp |||
/call BackOffFromTarget 60
/if (${Target.Distance}>INITIALIZE_ATTACK_RANGE) /goto :NewTarget
/if (${Me.Pet.Distance}>MAX_PET_RANGE_BEFORE_SUMMON) /call SummonPet TRUE
/if (${Spell[HEAT_DOT_GEM].Name.NotEqual[HEAT_DOT]}) {
/memspellset dots
/delay 1m ${Window[SpellBookWnd]}==FALSE
}
/doevents flush
/varset reroot TRUE
/varset redot1 TRUE
/varset redot2 TRUE
/varset redot3 TRUE
/varset reskull TRUE
/call BackOffFromTarget 60
:fartAround
DELAY 1s ${Target.ID}!=0&&${Target.Type.Equal[NPC]}
/doevents
/if (${reroot} && ${Target.PctHPs}>1) {
|/call MyCast "LICH_SPELL" LICH_GEM
/call MyCast "ROOT_SPELL" ROOT_GEM
|/if (${Me.PctHPs}<90 && ${Target.PctHPs}>1) /call MyCast "LIFE_DOT" LIFE_DOT_GEM
/varset reroot
/goto :fartAround
} else /if (${redot1} && ${Target.PctHPs}>1) {
|!mqpaus/call MyCast "LIFE_DOT" LIFE_DOT_GEM
/if (${Target.PctHPs}>16) /call MyCast "SPLURT_SPELL" SPLURT_GEM
/if (${Me.PctMana}>60) /call MyCast "SNARE_SPELL" SNARE_GEM
/call SwapItem "Demi Lich Skullcap" Head
/if (${Me.PctHPs}<99 && ${Target.PctHPs}>1) /call MyCast "LIFE_DOT" LIFE_DOT_GEM
/call SwapItem "Deathcaller's Skullcap" head
/varset redot1
} else /if (${redot2} && ${Target.PctHPs}>4) {
/call MyCast "HEAT_DOT" HEAT_DOT_GEM
/varset redot2
} else /if (${redot3} && ${Target.PctHPs}>25) {
/call MyCast "DISEASE_DOT" DISEASE_DOT_GEM
/varset redot3
} else /if (${reskull} && ${Target.PctHPs}>1) {
/call MyCast "ROOT_SPELL" ROOT_GEM
|/if (${Me.PctMana}<90 && ${Me.Buff[LICH_SPELL].ID}==NULL && ${Me.PctHPs}>50) /call MyCast "LICH_SPELL" LICH_GEM
/varset reskull
} else /if (${Target.ID} && ${reroot}) {
/call BackOffFromTarget 60
/call SummonPet
/pet attack
}
/if (${Target.ID} && ${Target.Type.Equal[NPC]}) {
/call Mount
/goto :fartAround
}
/call AlwaysCheck
/if (${Zone.Name.Find[forgotten]}!=NULL && ${Macro.Return}==0) /call DoTheLooting
/varset TargetID
/goto :NewTarget
}
/return
| AlwaysCheck - health, aggro, zone, etc. ALSO CALLED FROM EVENTS.
| "/call AlwaysCheck nocast" to never perform casting (eg event calls)
| 0=no problem; 1=panic
Sub AlwaysCheck(string casting)
/doevents Zoned
/if (${Cursor.ID}) /autoinventory
/if (${Me.PctHPs}<ALARM_HEALTH_BELOW_PCT) {
|/call NoLich
/if (${Me.PctHPs}<=20) {
/instacamp
/endmacro
}
/if (${Spawn[${TargetID}].Type.Equal[NPC]} && ${Zone.Name.Find[forgotten]}!=0) {
/call BailOut
/return 1
}
}
/if (${Me.PctMana}>90 || ${Me.PctHPs}<50) /call NoLich
/if (${casting.Equal[nocast]}==FALSE) {
/if (!${dangerFlag} && ${Me.Pet.ID}!=0 && ${Me.PetBuff[PET_HASTE]}==0) /call MyCast "PET_HASTE" PET_HASTE_GEM
/if (${Me.PctMana}<90 && ${Me.Buff[LICH_SPELL].ID}==NULL && ${Me.PctHPs}>50) /call MyCast "LICH_SPELL" LICH_GEM
/if (${FindItem[ROD_NAME].ID}!=0) /cast item "ROD_NAME"
}
/if (${Initialized} && ${weZoned}) {
/declare zoneDelay timer 3m
/varset weZoned FALSE
/varset wayBlocked FALSE
/doevents flush
/if (${Zone.Name.Find[forgotten]}==NULL) {
/if (${Zone.Name.Find[nedaria]}==NULL) {
/if (${Zone.Name.Find[knowledge]}!=0) /goto :quit
:quit
/dismount
/camp desktop
/endmacro
}
:zoneIn
/warp loc -670 1543 96
/keypress back
/keypress forward
/delay 1
/sit
/if (${Me.PctHPs}<=50) {
/popup Waiting for health>99%...
/delay 5m ${Me.PctHPs}>99
}
/face fast loc 1543,-670
:zoning
/delay 1s
/click left 400 300
/delay 5
/click left 500 400
/delay 5
/click left 600 500
/doevents Zoned
/doevents Blocked
/delay 1s ${weZoned}||${wayBlocked}
/if (${wayBlocked}) /goto :quit
/if (${weZoned}==FALSE && ${zoneDelay.Value}>0) /goto :zoning
/if (${Zone.Name.Find[forgotten]}==NULL) /goto :quit
/if (${Zone.Name.Find[knowledge]}!=0) /goto :quit
/varset Initialized TRUE
}
}
/return 0
Sub NoLich
/declare slot int local
/varcalc slot ${Me.Buff[LICH_SPELL].ID}-1
/if (${slot}>=0) /notify BuffWindow Buff${slot} leftmouseup
/return
Sub BailOut
/dismount
/attack off
/warp succor
/delay 1
/target npc a_harindi_guide
|/warp loc -30 -827 -11
/warp target
/delay 2
/face fast nolook
/varset fightTimer 15s
:panic
/say I am ready to leave!
/delay 1
/doevents Zoned
/delay 5 ${weZoned}
/if (${Me.PctHPs}<=20) {
/instacamp
/return
}
/if (${Zone.Name.Find[forgotten]}) {
/keypress left
/delay 1
/keypress right
/if (${Target.ID}) {
/face fast nolook
} else {
/return
}
/if (${fightTimer.Value}>0) /goto :panic
/instacamp
}
/return
|----------------------------------------------------------------------------
|SUB: MainAttack - Handles the kiting/killing
|----------------------------------------------------------------------------
Sub MainAttack
:attackAgain
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/doevents
/target id ${TargetID}
DELAY 1
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /goto :looties
/call AlwaysCheck
/if (${Macro.Return}) /return
/if (${Target.ID}==${Me.Pet.ID}) {
/assist
DELAY 3 ${Target.ID}!=${Me.Pet.ID}
}
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /goto :looties
/if (${Me.PctHPs}>ALARM_HEALTH_BELOW_PCT && ${Me.Buff[LICH_SPELL].ID}==NULL) {
DEBUG_3 Me.Buff[LICH_SPELL].ID==${Me.Buff[LICH_SPELL].ID}
/call MyCast "LICH_SPELL" LICH_GEM
}
/call HealPet
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /goto :looties
/face
/if (${Target.Distance}>INITIALIZE_ATTACK_RANGE) /call WarpCloser
/if (${Me.Sitting}==FALSE && ${Me.Mount.ID}==0) /call Mount
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /goto :looties
/if (${fightTimer.Value}==0 && ${Target.PctHPs}>20) {
/call DoTheFear
/call MyCast "LIFE_DOT" LIFE_DOT_GEM
}
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /goto :looties
/if (${Target.PctHPs}>1 && ${Target.Speed}>0) {
/warp target
DELAY 1
/call MyCast "SNARE_SPELL" SNARE_GEM
}
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Target.ID}>0 && ${Target.Type.NotEqual[Corpse]}) /goto :attackAgain
:looties
/call AlwaysCheck
/if (${Zone.Name.Find[forgotten]}==NULL || ${Macro.Return}) /return
/call DoTheLooting
/varset TargetID
/return
|----------------------------------------------------------------------------
|SUB: DowntimeWork - Between fight rebuffs, etc.
|----------------------------------------------------------------------------
Sub DowntimeWork
| Check if we are low on mana or health. Heal or sit down if low
/call CheckMana
/if ( ${Macro.Return}==0 ) /return 0
DEBUG_2 1. Mana Checked
| Make sure all buffs on self are up
/call MaintainSelfBuffs
/if ( ${Macro.Return}==0 ) /return 0
DEBUG_2 4. Buffs Checked
/call AlwaysCheck
/if (${Macro.Return}) /return 0
/if (!${dangerFlag}) {
/memspellset dots
} else {
/memspellset dots
}
/delay 1m ${Window[SpellBookWnd]}==FALSE
/return 1
Sub instaClicky
/if (${FindItem[=Journeyman's Boots].ID}) /cast item "Journeyman's Boots"
/if (${FindItem[=Shrunken Goblin Skull Earring].ID}) /cast item "Shrunken Goblin Skull Earring"
/return
|----------------------------------------------------------------------------
|SUB: AcquireTarget - Finding a target 0=success; 1=n/a
|----------------------------------------------------------------------------
Sub AcquireTarget
/declare s int local
/declare lvl int local
/declare spn int local
/squelch /target clear
/varset TargetID
/varset TargetName
:scan
/varcalc s ${s}+1
/varset spn ${LastSpawn[${s}].ID}
/if (${spn}==0) /goto :acquired
/if ((${Spawn[${spn}].CleanName.Find[squeaking]} || ${Spawn[${spn}].CleanName.Find[squeaking]} || ${Spawn[${spn}].CleanName.Find[reject]}) && ${Spawn[${spn}].Type.Equal[Corpse]}==FALSE && ${Spawn[${spn}].Level}>=MIN_MOB_LVL && ${Spawn[${spn}].Level}<=MAX_MOB_LVL && ${Spawn[${spn}].Level}>${lvl}) {
/if (${Spawn[${spn}].Y}<=-265 && ${Spawn[${spn}].Y}>=-429 && ${Spawn[${spn}].X}>=74 && ${Spawn[${spn}].X}<=298 && ${Spawn[${spn}].Level}>=47) {
DEBUG_1 Ignoring mob in add area: ${Spawn[${spn}].CleanName}(L${Spawn[${spn}].Level})
} else {
/varset lvl ${Spawn[${spn}].Level}
/varset TargetID ${Spawn[${spn}].ID}
}
}
/goto :scan
:acquired
/if (${TargetID}) {
/target id ${TargetID}
DELAY 2 ${Target.ID}!=0
/if (${Target.CleanName.Find[${Me.CleanName}]}) {
DEBUG_1 WTF? I got targeted!
/return 1
}
/varset TargetID ${Target.ID}
/varset TargetName ${Target.CleanName}
/popup ${TargetName} (L${Target.Level})
DEBUG_1 ${TargetName} (L${Target.Level})
/if (${Target.Level}>=47) /varset dangerFlag TRUE
/return 0
}
DEBUG_3 AcquireTarget FAILED!
/popup Waiting for mobs in range MIN_MOB_LVL-MAX_MOB_LVL...
/call Mount
/delay 5s
/return 1
| Find the closest WP in line-of-sight to our target
Sub FindWP
/declare wp int local
/declare Y int local
/declare X int local
/declare Z int local
/declare dist float local 10000
/varset wpY
/varset wpX
/varset wpZ
/for wp 1 to WP_SIZE
/varset Y ${waypoint[${wp},Y_COORD]}
/varset X ${waypoint[${wp},X_COORD]}
/varset Z ${waypoint[${wp},Z_COORD]}
/if (${LineOfSight[${Y},${X},${Z}:${Target.Y},${Target.X},${Target.Z}]} &&
${Math.Distance[${Y},${X},${Z}:${Target.Y},${Target.X},${Target.Z}]}<${dist}) {
/varset wpY ${Y}
/varset wpX ${X}
/varset wpZ ${Z}
/varset dist ${Math.Distance[${Y},${X},${Z}:${Target.Y},${Target.X},${Target.Z}]}
}
/next wp
/return
|warp closer to target, via WP if mob, or direct otherwise.
Sub WarpCloser
/call AlwaysCheck nocast
/if (${Macro.Return}) /return
/if (${Target.ID}==0 || ${Target.ID}==${Me.ID}) {
/target id ${TargetID}
DELAY 2 ${Target.ID}>0
}
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /return
/if (${Target.Type.Equal[Pet]}) {
/warp target
} else {
/if (${Me.Pet.ID}) /warp loc ${Me.Pet.Y} ${Me.Pet.X} ${Me.Pet.Z}
}
}
DELAY 1
/if (${Target.ID}) /face fast
/return
|warp away from target, via most distant WP
Sub WarpDistant
/call AlwaysCheck nocast
/if (${Macro.Return}) /return
/if (${Target.ID}==0 || ${Target.ID}==${Me.ID}) {
/target id ${TargetID}
DELAY 2 ${Target.ID}>0
}
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /return
/declare wp int
/declare Y float
/declare X float
/declare Z float
/declare dist float
/for wp 1 to WP_SIZE
/varset Y ${waypoint[${wp},Y_COORD]}
/varset X ${waypoint[${wp},X_COORD]}
/varset Z ${waypoint[${wp},Z_COORD]}
/if (${Math.Distance[${Y},${X},${Z}:${Target.Y},${Target.X},${Target.Z}]}>${dist}) {
/varset wpY ${Y}
/varset wpX ${X}
/varset wpZ ${Z}
/varset dist ${Math.Distance[${Y},${X},${Z}:${Target.Y},${Target.X},${Target.Z}]}
}
/next wp
/if (${wpY}!=0||${wpX}!=0||${wpZ}!=0) {
/warp loc ${wpY} ${wpX} ${wpZ}
}
DELAY 1
/if (${Target.ID}) /face fast
/return
| DO NOT CALL DELAY FROM EVENTS!
| Parameters: delay timer setting + early exit condition
Sub Delay(string delayTime, string exitCond)
/declare tmr timer local ${delayTime}
:moreDelay
/call AlwaysCheck nocast
/if (${tmr.Value}==0) /return
/if (${exitCond}) {
|DEBUG_3 Early exit on condition: ${exitCond.Right[-1]}
/return
}
/if (${Me.PctHPs}<ALARM_HEALTH_BELOW_PCT) {
DEBUG_1 Delay abort, ${tmr.Value} ticks left, LOW HEALTH!
/return
}
/delay 1 ${exitCond}
|/if (${Math.Calc[${tmr.Value}%10].Int}==0) DEBUG_3 /delay ${tmr.Value} ${exitCond.Right[-1]}:${exitCond}
/doevents InDanger
/doevents Skinhit
/doevents Skinhit1
/doevents Miss1
/doevents Miss2
/doevents ImHit
/doevents Retry
/doevents Abort
/doevents OutOfRange
/doevents NoLOS
/doevents Standing
/doevents OOR
/doevents CashLoot
/doevents Zoned
/doevents PetAggro
/doevents NoMount
/doevents NoLich
/doevents Stunned
/doevents RootGone
/doevents DOT1Gone
/doevents DOT2Gone
/doevents DOT3Gone
/doevents Skullcapgone
/if (${Target.Type.Equal[NPC]}) /face
/goto :moreDelay
/return
Sub MyCast(string spname, string gname)
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Corpse.Open}) /notify LootWnd DoneButton leftmouseup
/varset spellName ${spname}
/call DoCast ${gname}
/doevents
/if (${Target.ID}!=${TargetID} && ${TargetID}!=0) {
/target id ${TargetID}
DELAY 3 ${Target.ID}==${TargetID}
}
/if (${Target.Type.Equal[NPC]}) /face fast
/return
| Cast something with status return and event processing
| assumes outer variable spellName and TargetID
Sub DoCast(string gem)
/declare castX float local ${Me.X}
/declare castY float local ${Me.Y}
/declare castZ float local ${Me.Z}
/declare castTime int
/declare tartype string local ${Spell[${spellName}].TargetType}
/if (${gem.Equal[item]}) /varset tartype ${FindItem[=${spellName}].Spell.TargetType}
:recast
/if (${tartype.Equal[Pet]} && ${Target.ID}!=${Me.Pet.ID}) {
/if (${Me.Pet.ID}==0) /return
/target id ${Me.Pet.ID}
/delay 1
} else /if (${tartype.Equal[Self]} && ${Target.ID}!=${Me.ID}) {
/target myself
/delay 1
} else /if (${Target.Type.Equal[NPC]} && ${Target.ID}!=${TargetID}) {
/target id ${TargetID}
/delay 1
}
/if (${Target.Type.Equal[NPC]} && ${Target.PctHPs}<8) {
DEBUG_3 Confusing/low health target (${Target.PctHPs}%)
/return
}
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) {
DEBUG_3 Target${Target.CleanName}(${Target.ID}) Dead?
/return
}
/if (${Target.ID}!=${Me.ID}) {
/face fast
/if (!${LineOfSight[${Me.Y},${Me.X},${Me.Z}:${Target.Y},${Target.X},${Target.Z}]}) {
/if (${dangerFlag} && ${reroot}) {
/call BackOffFromTarget 60
/delay 1
} else {
/call WarpCloser
/delay 1
}
}
}
/if (${gem.Equal[item]}) {
DEBUG_2 Casting ${spellName}:${gem}>${Target.CleanName}
/cast item "${spellName}"
} else {
/if (${Me.Gem[${spellName}]}==NULL) {
/memspell ${gem} "${spellName}"
DEBUG_3 book:${Window[SpellBookWnd]}; ${spellName}:${Me.SpellReady[${spellName}]}
/delay 10s ${Window[SpellBookWnd]}==FALSE
DELAY 15s ${Me.SpellReady[${spellName}]}
} else {
DEBUG_3 ${spellName}:${Me.SpellReady[${spellName}]}
/if (!${Me.SpellReady[${spellName}]}) {
DELAY 15s ${Me.SpellReady[${spellName}]}
}
}
DEBUG_2 Casting ${spellName}:${gem}>${Target.CleanName}
/cast "${spellName}"
}
/varset result CAST_IN_PROGRESS
DELAY 2
/doevents
/if (${result}==CAST_IN_PROGRESS && ${Me.Casting.ID}==0) /goto :recast
/if (!${dangerFlag}) {
DELAY 30s ${Me.Casting.ID}==NULL
/delay 1
/doevents
} else {
/delay 1
/varset castX ${Me.X}
/varset castY ${Me.Y}
/varset castZ ${Me.Z}
/if (${reroot} && ${Target.Type.Equal[NPC]}) {
/delay 4
/call WarpDistant
}
/varcalc castTime ${Math.Calc[${Me.Casting.MyCastTime}*10].Int}-19
| Hard code 9s delay for item, assume it is skullcap.
/if (${gem.Equal[item]}) /varcalc castTime 35
/delay ${castTime} ${Me.Casting.ID}==0
/warp loc ${castX} ${castY} ${castZ}
/face fast nolook
/delay 3s ${Me.Casting.ID}==0
/delay 1
/doevents
/if (${reroot} && ${Target.Type.Equal[NPC]}) {
/call WarpDistant
} else {
/call BackOffFromTarget 60
}
}
/if (${result}==CAST_IN_PROGRESS) /varset result CAST_SUCCESS
DEBUG_3 Casting of ${spellName} complete, result=${result}
/if (${result}==CAST_OUTOFRANGE || ${result}==CAST_CANNOTSEE) {
/if (!${dangerFlag} || !${reroot}) /call WarpCloser
/goto :recast
} else /if (${result}==CAST_RETRY) {
/if (!${Me.SpellReady[${spellName}]}) {
/call instaClicky
/varcalc result ${Spell[${spellName}].RecoveryTime}*10
DELAY ${result} ${Me.SpellReady[${spellName}]}
}
/goto :recast
}
/return
|----------------------------------------------------------------------------
|SUB: SummonPet - Summon pet if farther away than the defined range
|----------------------------------------------------------------------------
Sub SummonPet(bool force)
/return
|----------------------------------------------------------------------------
|SUB: HealPet - Heal pet if needed 0=just healed; 1=no problem
|----------------------------------------------------------------------------
Sub HealPet
/return 1
Sub Mount
/if (${mountFlag}) {
/if (${InvSlot[ammo].Item.Name.Find[Drum]}!=NULL && ${Me.Buff[Summon Drogmor].ID}==0) {
/cast item "${InvSlot[ammo].Item.Name}"
} else /if (${InvSlot[ammo].Item.Name.Find[Bridle]}!=NULL && ${Me.Buff[Summon Horse].ID}==0) {
/cast item "${InvSlot[ammo].Item.Name}"
} else {
/if (!${Me.Sitting}) /sit
}
} else {
/if (!${Me.Sitting}) /sit
}
/return
|----------------------------------------------------------------------------
|SUB: CheckMana 0= need more med; 1=mana ok
| Now with histeresis - exit condition is above entry condition.
|----------------------------------------------------------------------------
Sub CheckMana
/declare exitMana int local
/declare exitHealth int local
/varcalc exitMana MIN_MANA_BEFORE_MEDITATE+80
/varcalc exitHealth ALARM_HEALTH_BELOW_PCT+70
|Meditate?
/if (${Me.PctMana}<MIN_MANA_BEFORE_MEDITATE || ${Me.PctHPs}<ALARM_HEALTH_BELOW_PCT) {
DEBUG_1 Meditating.
/popup Meditating...
/call Mount
/declare i int local
/if ( ${Target.ID} ) /squelch /target clear
/for i 1 to 10
DELAY 1s
/if ( ${Target.ID} ) /return 1
/next i
/if ( ${Me.PctMana}<${exitMana} || ${Me.PctHPs}<${exitHealth} ) /return 0
DEBUG_2 Mana/health OK now.
}
/return 1
|----------------------------------------------------------------------------
|SUB: MaintainPetBuffs - Heal pet and keep its buffs up
| 0= still busy; 1=all done
|----------------------------------------------------------------------------
Sub MaintainPetBuffs
/return 1
|----------------------------------------------------------------------------
|SUB: MaintainSelfBuffs - Keep buffs up
| 0=still buffing; 1=all done
|----------------------------------------------------------------------------
Sub MaintainSelfBuffs
/declare iCount int local
/declare t string local
/for iCount 1 to ${MyBuffs.Size}
/call SplitString tmp_tmp ${MyBuffs[${iCount}]} "|"
/varset t ${Me.Buff[${tmp_tmp[1]}]}
/if ( ${t.Equal[NULL]} ) {
/if ( !${Target.ID}!=${Me.ID} ) {
/echo buffing
}
|Cast with gemselection or default
/if ( ${tmp_tmp.Size}>1 ) {
DEBUG_3 Attempting to cast "${tmp_tmp[1]}" ${tmp_tmp[2]}
/call MyCast "${tmp_tmp[1]}" ${tmp_tmp[2]}
} else {
DEBUG_3 Attempting to cast "${tmp_tmp[1]}"
/call MyCast "${tmp_tmp[1]}" 8
}
|Return to top - so we dont keep buffing if being attacked
/return 0
}
/next iCount
/return 1
| Back off from current target so many units.
| Finds first line of sight on a horizontal, vertical, or
| diagonals that are at least as distant as desired.
Sub BackOffFromTarget(float dist)
/declare by float local ${Target.Y}
/declare bx float local ${Target.X}
/varcalc by ${by}-${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/varset by ${Target.Y}
/varcalc bx ${bx}-${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/varcalc by ${by}+${dist}
/varset bx ${Target.X}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/varset by ${Target.Y}
/varcalc bx ${bx}+${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/varcalc by ${by}+${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/varcalc by ${Target.Y}-${dist}
/varcalc bx ${Target.X}-${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/varcalc by ${Target.Y}+${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/varcalc by ${Target.Y}-${dist}
/varcalc bx ${Target.X}+${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${Target.Z}]}) /goto :backoff
/face fast
/keypress forward
/delay 3s ${Target.Distance}>=${dist}
/keypress forward
/face fast
/return
:backoff
/warp loc ${bx} ${by} ${Target.Z}
/delay 1
/if (${Target.ID}) /face fast
/return
|----------------------------------------------------------------------------
|SUB: DoTheLooting
|----------------------------------------------------------------------------
Sub DoTheLooting
/if (!${Defined[looted]}) /declare looted bool outer
/target id ${TargetID}
DELAY 1
DEBUG_1 Going to loot
DEBUG_3 DoTheLooting Target: ${Target.CleanName}, ID:${Target.ID}
/warp target
DELAY 1
/loot
/varset looted FALSE
DELAY 6s (${Corpse.Open}&&${looted})
/call LootMob
/notify LootWnd DoneButton leftmouseup
DELAY 1
/doevents
/declare xp int local
/declare pp int local
/declare level float local ${Me.Level}
/varcalc level ${level}+${Math.Calc[${Me.Exp}/330.0].Milli}
/varcalc xp ${Me.Exp}-${startingXP}
/if (${xp}<0) /varcalc xp ${xp}+330
/varcalc pp ${Me.Platinum}-${startingPP}
/popup L${level.Milli}, XP up ${Math.Calc[${xp}/3.3]}% - PP up ${pp}
DEBUG_1 L${level.Milli}, XP up ${Math.Calc[${xp}/3.3]}% - PP up ${pp}
DELAY 5s
/return
|----------------------------------------------------------------------------
|SUB: LootMob
|----------------------------------------------------------------------------
Sub LootMob
/declare LootSlot int local
/if (!${Target.ID}) {
/target npc corpse
DELAY 1s ${Target.ID}>0
}
/loot
DELAY 1s ${Corpse.Open}
/if (${Corpse.Items}) {
/for LootSlot 1 to ${Corpse.Items}
/itemnotify loot${LootSlot} leftmouseup
DELAY 1s ${Cursor.ID}>0
/destroy
/next LootSlot
}
/cleanup
/return
|----------------------------------------------------------------------------
|SUB: SplitString - A generic string splitter.
|----------------------------------------------------------------------------
Sub SplitString(string varname, string inputstring, string splitter)
|/echo varname: "${varname}", inputstring: "${inputstring}", splitter: "${splitter}"
/declare i int local
/declare stringcnt int local
|The normal splitter. Splitter string is just 1 in length.
/if (${splitter.Length}==1) {
/varcalc stringcnt ${inputstring.Count["${splitter}"]} + 1
/if (!${Defined[${varname}]}) {
/declare ${varname}[${stringcnt}] string outer
} else {
/deletevar ${varname}
/declare ${varname}[${stringcnt}] string outer
}
/for i 1 to ${stringcnt}
/varset ${varname}[${i}] ${inputstring.Token[${i},"${splitter}"]}
/next i
}
/return
|----------------------------------------------------------------------------
|SUB: DestroyCopper - Destroy all the copper
|----------------------------------------------------------------------------
Sub DestroyCopper
/squelch /windowstate InventoryWindow open
/shift /notify InventoryWindow IW_Money3 leftmouseup
/delay 1s ${Cursor.ID}>0
/destroy
/cleanup
/return
|----------------------------------------------------------------------------
|SUB: DestroySilver - Destroy all the silver
|----------------------------------------------------------------------------
Sub DestroySilver
/squelch /windowstate InventoryWindow open
/shift /notify InventoryWindow IW_Money2 leftmouseup
/delay 1s ${Cursor.ID}>0
/destroy
/cleanup
/return
|----------------------------------------------------------------------------
|SUB: DoTheFear - Fear target
|----------------------------------------------------------------------------
Sub DoTheFear
/if ( ${Me.PctMana}>10 && ${Target.Type.Equal[NPC]} && ${Target.PctHPs}>24) {
/call MyCast "FEAR_SPELL" FEAR_GEM
/varset fightTimer 31s
}
/return
|----------------------------------------------------------------------------
|SUB: Event_CashLoot - Will count the loot so far running the macro
|----------------------------------------------------------------------------
Sub Event_CashLoot(string Line, string cash)
/return
Sub Event_fear
DEBUG_2 Fear me!
/call DoTheFear
/return
Sub Event_Miss1
/echo misses
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/if (${Me.Casting.ID}!=0) /return
/call BackOffFromTarget 90
/return
Sub Event_Miss2
/echo Miss2
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/if (${Me.Casting.ID}!=0) /return
/call BackOffFromTarget 90
/return
Sub Event_Skinhit
/echo skinhit
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/if (${Me.Casting.ID}!=0) /return
/call BackOffFromTarget 90
/return
Sub Event_Skinhit1
/echo skinhit
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/if (${Me.Casting.ID}!=0) /return
/call BackOffFromTarget 90
/return
Sub Event_ImHit
/Echo i m hit
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/if (${Me.Casting.ID}!=0) /return
/call BackOffFromTarget 80
/return
Sub Event_Retry
/delay 2
/varset result CAST_RETRY
/return
Sub Event_Abort
/varset result CAST_ABORT
/return
Sub Event_OutOfRange
/varset result CAST_OUTOFRANGE
/return
Sub Event_NoLOS
/varset result CAST_CANNOTSEE
/return
Sub Event_Standing
/stand
/varset result CAST_RETRY
/return
Sub Event_OOR
/warp target
/delay 2
/loot
/delay 3
/delay 3s ${Corpse.Open}
/doevents OOR
/return
Sub Event_Blocked
/varset wayBlocked TRUE
/return
Sub Event_Zoned
/varset weZoned TRUE
/return
Sub Event_PetAggro
/target id ${Me.Pet.ID}
/warp target
/delay 1
/assist
/delay 1
/return
Sub Event_NoMount
/varset mountFlag FALSE
/return
Sub Event_NoLich
/varset mountFlag FALSE
/dismount
/return
Sub Event_Stunned
:gdStunned
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/delay 1
/if (${Me.Stunned}) /goto :gdStunned
/varset result CAST_RETRY
/return
Sub Event_Invited(heard,string who)
/if (${who.Equal[MY_PARTNER]}) {
/invite
} else {
/disband
}
/return
|----------------------------------------------------------------------------
|SUB: Root Gone
|----------------------------------------------------------------------------
Sub Event_RootGone
DEBUG_2 Root gone.
/varset reroot TRUE
/return
|----------------------------------------------------------------------------
|SUB: DOT1Gone
|----------------------------------------------------------------------------
Sub Event_DOT1Gone
DEBUG_2 SPLURT_DOT gone.
/varset redot1 TRUE
/return
|----------------------------------------------------------------------------
|SUB: DOT2Gone
|----------------------------------------------------------------------------
Sub Event_DOT2Gone
DEBUG_2 HEAT_DOT gone.
/varset redot2 TRUE
/return
|----------------------------------------------------------------------------
|SUB: DOT3Gone
|----------------------------------------------------------------------------
Sub Event_DOT3Gone
DEBUG_2 DISEASE_DOT gone.
/varset redot3 TRUE
/return
|----------------------------------------------------------------------------
|SUB: SKULLCAPGONE
|----------------------------------------------------------------------------
Sub Event_Skullcapgone
DEBUG_2 LIFE_DOT gone.
/varset reskull TRUE
/return
Sub Event_InDanger
/varset dangerFlag TRUE
/varset result CAST_ABORT
/return
Sub Event_Exp
/varset AAExp ${Math.Calc[${Me.PctAAExp}-${AAExp}]}
/varset Exper ${Math.Calc[${Me.PctExp}-${Exper}]}
/varset LDRExp ${Math.Calc[${Me.PctGroupLeaderExp}-${LDRExp}]}
/echo EXP: ${Exper} (${Me.PctExp}%) - AAXP: ${AAExp} (${Me.PctAAExp}%) - LDRXP: ${LDRExp} (${Me.PctGroupLeaderExp})
/popup ${Exper} (${Me.PctExp}%) - AAXP: ${AAExp} (${Me.PctAAExp}%) - LDRXP: ${LDRExp} (${Me.PctGroupLeaderExp})
/varset Exper ${Me.PctExp}
/varset AAExp ${Me.PctAAExp}
/varset LDRExp ${Me.PctGroupLeaderExp}
/return
Sub Event_Exp2
/varset AAExp ${Math.Calc[${Me.PctAAExp}-${AAExp}]}
/varset Exper ${Math.Calc[${Me.PctExp}-${Exper}]}
/varset LDRExp ${Math.Calc[${Me.PctGroupLeaderExp}-${LDRExp}]}
/echo EXP: ${Exper} (${Me.PctExp}%) - AAXP: ${AAExp} (${Me.PctAAExp}%)
/popup ${Exper} (${Me.PctExp}%) - AAXP: ${AAExp} (${Me.PctAAExp}%)
/varset Exper ${Me.PctExp}
/varset AAExp ${Me.PctAAExp}
/varset LDRExp ${Me.PctGroupLeaderExp}
/return
Sub SwapItem(string itemName,string slotName)
/if ( ${InvSlot[${slotName}].Item.Name.Equal[${itemName}]} ) /return
/declare slotID int local
/declare oldSlotID int local
/declare oldItem string local
/declare i int local
/varset slotID ${InvSlot[${slotName}].ID} | slotID = slot you're swapping item to
/varset oldSlotID ${FindItem[${itemName}].InvSlot.ID} | oldSlotID = slot the item was originally in
/varset oldItem ${InvSlot[${slotName}].Item.Name} | oldItem = name of item in the slot you're swapping WITH
/if ( !${slotID} ) {
/echo Invalid slot name: ${slotName}
/return
}
/if ( !${oldSlotID} ) {
/echo Could not find item ${itemName}
/return
}
:auto_inv
/if ( ${Cursor.ID} && !${Cursor.Name.Equal[${itemName}]} ) {
/if ( ${Cursor.Container} ) {
/for i 1 to 8
/if ( !${InvSlot[pack${i}].Item.Container} ) {
/nomodkey /itemnotify pack${i} leftmouseup
}
/next i
} else {
/autoinventory
}
/goto :auto_inv
}
:pick_up_item
| if the item is in a bag and it's not open, then open it!
/if ( ${InvSlot[${oldSlotID}].Pack} && !${Window[${InvSlot[${oldSlotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${oldSlotID}].Pack} rightmouseup
| if the slot you're putting it in is inside a bag and it's not open, then open it!
/if ( ${InvSlot[${slotID}].Pack} && !${Window[${InvSlot[${slotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${slotID}].Pack} rightmouseup
| ok.. pick up the item now!
/squelch /nomodkey /shiftkey /itemnotify ${InvSlot[${oldSlotID}]} leftmouseup
| if item isn't on your cursor, try again!
/if ( !${Cursor.Name.Equal[${itemName}]} ) {
/if ( ${Cursor.ID} && !${Cursor.Container} ) /autoinventory
/goto :pick_up_item
}
:exchange_items
/if ( ${InvSlot[${oldSlotID}].Pack} && !${Window[${InvSlot[${oldSlotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${oldSlotID}].Pack} rightmouseup
/if ( ${InvSlot[${slotID}].Pack} && !${Window[${InvSlot[${slotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${slotID}].Pack} rightmouseup
| put the item in the new slot, and pick up whatever item was there
/squelch /nomodkey /shiftkey /itemnotify ${slotID} leftmouseup
| if it didnt get exchanged, try again!
/if ( ${Cursor.ID} && !${Cursor.Name.Equal[${oldItem}]} && !${Cursor.Name.Equal[${itemName}]} && !${Cursor.Container} ) /autoinventory
/if ( !${InvSlot[${slotID}].Item.Name.Equal[${itemName}]} ) /goto :exchange_items
:drop_item
/if ( !${Cursor.Container} || ( ${InvSlot[${oldSlotID}]}<30 && ${InvSlot[${oldSlotID}]}>=22 ) ) {
/if ( ${InvSlot[${oldSlotID}].Pack} && !${Window[${InvSlot[${oldSlotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${oldSlotID}].Pack} rightmouseup
/if ( ${InvSlot[${slotID}].Pack} && !${Window[${InvSlot[${slotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${slotID}].Pack} rightmouseup
/squelch /nomodkey /itemnotify ${oldSlotID} leftmouseup
/if ( ${Cursor.ID} ) {
/if ( !${Cursor.Name.Equal[${oldItem}]} ) /autoinventory
/goto :drop_item
}
}
:close_pack
/if ( ${InvSlot[${oldSlotID}].Pack} && ${Window[${InvSlot[${oldSlotID}].Pack.Name}].Open} && ( ${Cursor.Name.Equal[${itemName}]} || ${FindItem[${itemName}].ID} ) ) {
/squelch /nomodkey /itemnotify ${InvSlot[${oldSlotID}].Pack} rightmouseup
/goto :close_pack
}
/if ( ${InvSlot[${slotID}].Pack} && ${Window[${InvSlot[${slotID}].Pack.Name}].Open} && ( ${Cursor.Name.Equal[${itemName}]} || ${FindItem[${itemName}].ID} ) ) {
/squelch /nomodkey /itemnotify ${InvSlot[${slotID}].Pack} rightmouseup
/goto :close_pack
}
/return
| necrokite.mac
|Load warp by typing /plugin mq2warp before running the macro
| Useage : /macro necrokite
| Description : This macro will root dot mobs of
| The Forgotten Halls. It assumes you have an instance
| and are inside already..also Don't make a pet before lauching the macro...
| just DONT MAKE PETS
| | mandrack February 05 re-optimization, works flawlessly so far.
| Changes by Anon 456
| 042705--Changed all /t to /target
| Inserted /loc for all warp statements
| Changed code so epic 1 isn't needed for snares (uses Desecrating Darkness, change to whatever snare you are useing)
|------------------------------------------------------------------------------
#turbo 40
#define MY_PARTNER GAMEGUIDEONLINE
#define MIN_MOB_LVL 50
#define MAX_MOB_LVL 65
#define CAST_SUCCESS 0
#define CAST_OUTOFRANGE 1
#define CAST_CANNOTSEE 2
#define CAST_RETRY 3
#define CAST_IN_PROGRESS 4
#define CAST_ABORT -1
#define DELAY "/noparse /call Delay"
#define ROOT_SPELL "Petrifying Earth"
#define SPLURT_SPELL "Splurt"
#define HEAT_DOT "Funeral Pyre of Kelador"
#define DISEASE_DOT "Chaos Plague"
#define POISON_DOT "Blood of Thule"
#event Exp "#*#party experience!!"
#event Exp2 "You gain experience!!"
#event Invited "#1# invites you to join a group."
#event Blocked "The wa!n not summon a mount#*#"
#event NoLich "You can not change into this form while on a mount."
#event OOR "You are too far away to loot that corpse."
#event Retry "Your spell fizzles!"
#event Retry "Your spell is interrupted."
#event Retry "You haven't recovered yet..."
#event Retry "Spell recovery time not yet met."
#event Retry "Your target resisted the #*#"
#event Abort "Insufficient Mana to cast this spell!"
#event OutOfRange "Your target is out of range, get closer!"
#event NoLOS "You cannot see your target."
|#event Stunned "You can't cast spells while stunned!"
|#event Stunned "You are stunned!"
#event Standing "You must be standing to cast a spell."
#event Standing "|${Me.CleanName}| has fallen to the ground."
#event Retry "Your gate is too unstable, and collapses."
#event Abort "Your target is immune to changes in its attack speed."
#event Retry "You are too distracted to cast a spell now!"
#event Zoned "You have entered #*#"
#event PetAggro "Your pet is the focus of something's attention."
#event RootGone "Your Petrifying Earth spell has worn off."
#event DOT1Gone "Your Splurt spell has worn off."
#event DOT2Gone "Your Funeral Pyre of Kelador spell has worn off."
#event DOT3Gone "Your Chaos Plague spell has worn off."
#event DOT4Gone "Your Blood of Thule spell has worn off."
|#event Skullcapgone "Your Morternum spell has worn off."
#event fear "Your fear spell has worn off."
#event Snaregone "The bubbling shadows fade."
#event ImHit "|${Target.CleanName}|#*# YOU for#*#"
#event Skinhit "|${Target.CleanName}|#*# YOU, but YOUR magical skin absorbs the blow!"
#event Miss1 "|${Target.CleanName}|#*# YOU, but misses!"
|-- The normal debug - for normal play.
| Enable: "/echo", Disable: "/squelch /echo"
#define DEBUG_1 /echo
|-- Deeper debugging - enable when trying to find bugs.
#define DEBUG_2 "/echo"
|-- The Deepest debugging - will spam a lot.
#define DEBUG_3 "/echo"
|-- Destroys Silver if you have more than the given amount! 0=disable
#define DESTROY_SILVER_IF_ABOVE 1
|-- Destroys Copper if you have more than the given amount! 0=disable
#define DESTROY_COPPER_IF_ABOVE 1
|-- At what range do we send in pet?
#define INITIALIZE_ATTACK_RANGE 100
|-- What pet do we want?
#define PET_SPELL "Lost Soul"
|-- Favorite gem spot for the pet (1-8)
#define PET_GEM 6
|-- How far off should the pet be before we summon it?
#define MAX_PET_RANGE_BEFORE_SUMMON 800
#define SUMMON_SPELL "Ribbon of Empathy"
#define SUMMON_GEM item
| Change SPLURT_GEM to 0 if you lack it.
#define SPLURT_GEM 6
#define HEAT_DOT_GEM 5
#define DISEASE_DOT_GEM 7
#define POISON_DOT_GEM 2
#define ROOT_GEM 3
|-- Name of fear spell
#define FEAR_SPELL "Trepidation"
|-- Favorite gem spot for the fear (1-8)
|#define FEAR_GEM 3
|-- How low on health should the pet be before we heal it (noncombat)
#define HEAL_PET_BELOW_PCT 70
|-- Name of pet healing spell
#define HEAL_PET_SPELL "Shadowbond"
|-- Favorite gem spot for the petheal (1-8)
#define HEAL_PET_GEM 7
#define PET_HASTE "Glyph of Darkness"
#define PET_HASTE_GEM 6
#define LICH_SPELL "Seduction of Saryrn"
#define LICH_GEM 1
#define LIFE_DOT "Fang of Death"
#define LIFE_DOT_GEM 8
|#define ROD_NAME "Summoned: Modulating Rod"
#define SNARE_DOT "Desecrating Darkness"
#define SNARE_DOT_GEM 1
|-- If your health gets below this lvl start /beep'ing and FD
#define ALARM_HEALTH_BELOW_PCT 70
|What is our feign death spell of choice? (Requires it be already mem'd, memorizing before feigning = death)
#define FEIGN_SPELL "Death Peace"
#define FEIGN_GEM 9
|-- What is the minimum mana I should have, wait if below
#define MIN_MANA_BEFORE_MEDITATE 90
|--How many waypoints exist on the kiting path.
#define WP_SIZE 37
#define Y_COORD 1
#define X_COORD 2
#define Z_COORD 3
|----------------------------------------------------------------------------
|SUB: Main - Declarations and Initialization
|----------------------------------------------------------------------------
Sub Main
/declare Exper float outer
/declare AAExp float outer
/declare LDRExp float outer
/varset Exper ${Me.PctExp}
/varset AAExp ${Me.PctAAExp}
/varset LDRExp ${Me.PctGroupLeaderExp}
/declare reroot bool outer TRUE
/declare redot1 bool outer TRUE
/declare redot2 bool outer TRUE
/declare redot3 bool outer TRUE
/declare reskull bool outer TRUE
/declare dangerFlag bool outer
/declare spellName string outer
/declare Initialized bool outer FALSE
/declare weZoned bool outer FALSE
/declare wayBlocked bool outer FALSE
/declare mountFlag bool outer TRUE
/declare result int outer
/declare startingPP int outer ${Me.Platinum}
/declare startingXP int outer ${Me.Exp}
/declare wpY float outer
/declare wpX float outer
/declare wpZ float outer
/declare waypoint[WP_SIZE,3] int outer
/varset waypoint[1,Y_COORD] -598
/varset waypoint[1,X_COORD] 101
/varset waypoint[1,Z_COORD] 4
/varset waypoint[2,Y_COORD] -596
/varset waypoint[2,X_COORD] 108
/varset waypoint[2,Z_COORD] 4
/varset waypoint[3,Y_COORD] -597
/varset waypoint[3,X_COORD] -40
/varset waypoint[3,Z_COORD] 4
/varset waypoint[4,Y_COORD] -556
/varset waypoint[4,X_COORD] -50
/varset waypoint[4,Z_COORD] 4
/varset waypoint[5,Y_COORD] -556
/varset waypoint[5,X_COORD] -160
/varset waypoint[5,Z_COORD] 4
/varset waypoint[6,Y_COORD] -473
/varset waypoint[6,X_COORD] -41
/varset waypoint[6,Z_COORD] 4
/varset waypoint[7,Y_COORD] -398
/varset waypoint[7,X_COORD] -45
/varset waypoint[7,Z_COORD] 4
/varset waypoint[8,Y_COORD] -402
/varset waypoint[8,X_COORD] 1
/varset waypoint[8,Z_COORD] 4
/varset waypoint[9,Y_COORD] -329
/varset waypoint[9,X_COORD] 0
/varset waypoint[9,Z_COORD] 13
/varset waypoint[10,Y_COORD] -596
/varset waypoint[10,X_COORD] 157
/varset waypoint[10,Z_COORD] 2
/varset waypoint[11,Y_COORD] -600
/varset waypoint[11,X_COORD] 198
/varset waypoint[11,Z_COORD] 4
/varset waypoint[12,Y_COORD] -721
/varset waypoint[12,X_COORD] 45
/varset waypoint[12,Z_COORD] -10
/varset waypoint[13,Y_COORD] -664
/varset waypoint[13,X_COORD] 45
/varset waypoint[13,Z_COORD] -4
/varset waypoint[14,Y_COORD] -635
/varset waypoint[14,X_COORD] 45
/varset waypoint[14,Z_COORD] 4
/varset waypoint[15,Y_COORD] -814
/varset waypoint[15,X_COORD] 45
/varset waypoint[15,Z_COORD] -10
/varset waypoint[16,Y_COORD] -814
/varset waypoint[16,X_COORD] 190
/varset waypoint[16,Z_COORD] -11
/varset waypoint[17,Y_COORD] -814
/varset waypoint[17,X_COORD] 335
/varset waypoint[17,Z_COORD] -10
/varset waypoint[18,Y_COORD] -814
/varset waypoint[18,X_COORD] 488
/varset waypoint[18,Z_COORD] -35
/varset waypoint[19,Y_COORD] -473
/varset waypoint[19,X_COORD] -6
/varset waypoint[19,Z_COORD] 4
/varset waypoint[20,Y_COORD] -473
/varset waypoint[20,X_COORD] 20
/varset waypoint[20,Z_COORD] -2
/varset waypoint[21,Y_COORD] -473
/varset waypoint[21,X_COORD] 56
/varset waypoint[21,Z_COORD] -10
/varset waypoint[22,Y_COORD] -473
/varset waypoint[22,X_COORD] 135
/varset waypoint[22,Z_COORD] -11
/varset waypoint[23,Y_COORD] -405
/varset waypoint[23,X_COORD] 135
/varset waypoint[23,Z_COORD] -11
/varset waypoint[24,Y_COORD] -405
/varset waypoint[24,X_COORD] 93
/varset waypoint[24,Z_COORD] -11
/varset waypoint[25,Y_COORD] -290
/varset waypoint[25,X_COORD] 93
/varset waypoint[25,Z_COORD] -11
/varset waypoint[26,Y_COORD] -290
/varset waypoint[26,X_COORD] 183
/varset waypoint[26,Z_COORD] -11
/varset waypoint[27,Y_COORD] -290
/varset waypoint[27,X_COORD] 275
/varset waypoint[27,Z_COORD] -11
/varset waypoint[28,Y_COORD] -409
/varset waypoint[28,X_COORD] 275
/varset waypoint[28,Z_COORD] -11
/varset waypoint[29,Y_COORD] -397
/varset waypoint[29,X_COORD] -40
/varset waypoint[29,Z_COORD] 4
/varset waypoint[30,Y_COORD] -397
/varset waypoint[30,X_COORD] 0
/varset waypoint[30,Z_COORD] 4
/varset waypoint[31,Y_COORD] -337
/varset waypoint[31,X_COORD] 1
/varset waypoint[31,Z_COORD] 12
/varset waypoint[32,Y_COORD] -235
/varset waypoint[32,X_COORD] 0
/varset waypoint[32,Z_COORD] 20
/varset waypoint[33,Y_COORD] -167
/varset waypoint[33,X_COORD] 0
/varset waypoint[33,Z_COORD] 20
/varset waypoint[34,Y_COORD] -127
/varset waypoint[34,X_COORD] 0
/varset waypoint[34,Z_COORD] 14
/varset waypoint[35,Y_COORD] -86
/varset waypoint[35,X_COORD] 0
/varset waypoint[35,Z_COORD] 4
/varset waypoint[36,Y_COORD] 4
/varset waypoint[36,X_COORD] 0
/varset waypoint[36,Z_COORD] -6
/varset waypoint[37,Y_COORD] 53
/varset waypoint[37,X_COORD] 0
/varset waypoint[37,Z_COORD] 4
|Buffs to be kept up on self (max 15) - "Buff" or "Buff|GemSlot"
/declare MyBuffs[2] string outer
/varset MyBuffs[1] "Shadow Guard|7"
/varset MyBuffs[2] "Force Shield|4"
DEBUG_1 Starting macro
|Group of locked target data
/declare TargetName string outer
/declare TargetID int outer
/declare fightTimer timer outer
/call MainSub
DEBUG_1 Exited normally!
/return
|----------------------------------------------------------------------------
|SUB: MainSub - The main sub
|----------------------------------------------------------------------------
Sub MainSub
|The main loop. After an attack we go here to acquire a new target
/cleanup
/if (${Zone.Name.Left[9].NotEqual[Forgotten]}) /varset weZoned TRUE
/varset Initialized TRUE
:NewTarget
/varset TargetID
/if (${Corpse.Open}) {
/notify LootWnd DoneButton leftmouseup
/cleanup
}
/call AlwaysCheck
/if (${Macro.Return}) /return
/call DowntimeWork
/if (${Macro.Return}==0) /goto :NewTarget
/call AcquireTarget
/if (${Macro.Return}) /goto :NewTarget
||| This is new code for Root Rot with Warp |||
/call BackOffFromTarget 60
/if (${Target.Distance}>INITIALIZE_ATTACK_RANGE) /goto :NewTarget
/if (${Spell[HEAT_DOT_GEM].Name.NotEqual[HEAT_DOT]}) {
/memspellset dots
/delay 1m ${Window[SpellBookWnd]}==FALSE
}
/doevents flush
/varset reroot TRUE
/varset redot1 TRUE
/varset redot2 TRUE
/varset redot3 TRUE
/varset reskull TRUE
/call BackOffFromTarget 60
:fartAround
DELAY 1 ${Target.ID}!=0&&${Target.Type.Equal[NPC]}
/doevents
/call AlwaysCheck
/if (${Macro.Return}) /goto :NewTarget
/if (${reroot} && ${Target.PctHPs}>1) {
/call BackOffFromTarget 60
/call MyCast "ROOT_SPELL" ROOT_GEM
/call BackOffFromTarget 60
/varset reroot
/varset dangerFlag
/goto :fartAround
} else /if (${redot1} && ${Target.PctHPs}>1) {
/call BackOffFromTarget 60
/call MyCast "SNARE_DOT" SNARE_DOT_GEM
/if (${Target.PctHPs}>16) /call MyCast "SPLURT_SPELL" SPLURT_GEM
/varset redot1
} else /if (${redot2} && ${Target.PctHPs}>1) {
/call BackOffFromTarget 60
/call MyCast "HEAT_DOT" HEAT_DOT_GEM
/call BackOffFromTarget 60
/call MyCast "ROOT_SPELL" ROOT_GEM
/varset redot2
} else /if (${redot3} && ${Target.PctHPs}>25) {
/call BackOffFromTarget 60
/call MyCast "DISEASE_DOT" DISEASE_DOT_GEM
/varset redot3
} else /if (${reskull} && ${Target.PctHPs}>1) {
/call MyCast "ROOT_SPELL" ROOT_GEM
|/call SwapItem "Demi Lich Skullcap" Head
/call BackOffFromTarget 60
/call MyCast "LIFE_DOT" LIFE_DOT_GEM
|/call SwapItem "Deathcaller's Skullcap" head
/varset reskull
} else /if (${Target.ID} && ${reroot}) {
/call BackOffFromTarget 60
/pet attack
}
/call AlwaysCheck
/if (${Macro.Return}) /goto :NewTarget
/if (${Target.ID} && ${Target.Type.Equal[NPC]}) {
/call Mount
/goto :fartAround
}
/call AlwaysCheck
/if (${Zone.Name.Find[forgotten]}!=NULL && ${Macro.Return}==0) /call DoTheLooting
/varset TargetID
/goto :NewTarget
/return
| AlwaysCheck - health, aggro, zone, etc. ALSO CALLED FROM EVENTS.
| "/call AlwaysCheck nocast" to never perform casting (eg event calls)
| 0=no problem; 1=panic
Sub AlwaysCheck(string casting)
/doevents Zoned
/if (${Cursor.ID}) /autoinventory
/if (${Me.PctHPs}<ALARM_HEALTH_BELOW_PCT) {
/call NoLich
/if (${Me.PctHPs}<=20) {
/keypress instant_camp
/endmacro
}
/if (${Spawn[${TargetID}].Type.Equal[NPC]} && ${Zone.Name.Find[forgotten]}!=0) {
/call BailOut
/return 1
}
}
/if (${Me.PctMana}>90 || ${Me.PctHPs}<50) /call NoLich
/if (${casting.Equal[nocast]}==FALSE) {
/if (!${dangerFlag} && ${Me.Pet.ID}!=0 && ${Me.PetBuff[PET_HASTE]}==0) /call MyCast "PET_HASTE" PET_HASTE_GEM
/if (${Me.PctMana}<90 && ${Me.Buff[LICH_SPELL].ID}==NULL && ${Me.PctHPs}>50) /call MyCast "LICH_SPELL" LICH_GEM
/if (${FindItem[ROD_NAME].ID}!=0) /cast item "ROD_NAME"
}
/if (${Initialized} && ${weZoned}) {
/declare zoneDelay timer 3m
/varset weZoned FALSE
/varset wayBlocked FALSE
/doevents flush
/if (${Zone.Name.Find[forgotten]}==NULL) {
/if (${Zone.Name.Find[nedaria]}==NULL) {
:quit
/dismount
/camp desktop
/endmacro
}
:zoneIn
/warp loc -670 1543 96
/keypress back
/keypress forward
/delay 1
/sit
/if (${Me.PctHPs}<=50) {
/popup Waiting for health>99%...
/delay 5m ${Me.PctHPs}>99
}
/face fast loc 1543,-670
:zoning
/delay 1s
/click left 400 300
/delay 5
/click left 500 400
/delay 5
/click left 600 500
/doevents Zoned
/doevents Blocked
/delay 1s ${weZoned}||${wayBlocked}
/if (${wayBlocked}) /goto :quit
/if (${weZoned}==FALSE && ${zoneDelay.Value}>0) /goto :zoning
/if (${Zone.Name.Find[forgotten]}==NULL) /goto :quit
/if (${Zone.Name.Find[knowledge]}!=0) /goto :quit
/varset Initialized TRUE
/return 1
}
}
/return 0
Sub NoLich
/declare slot int local
/varcalc slot ${Me.Buff[LICH_SPELL].ID}-1
/if (${slot}>=0) /notify BuffWindow Buff${slot} leftmouseup
/return
Sub BailOut
/dismount
/attack off
/warp succor
/delay 1
/target npc a_harindi_guide
|/warp -30 -827 -11
/warp target
/delay 2
/face fast nolook
/varset fightTimer 15s
:panic
/say I am ready to leave!
/delay 1
/doevents Zoned
/delay 5 ${weZoned}
/if (${Me.PctHPs}<=20) {
/keypress instant_camp
/return
}
/if (${Zone.Name.Find[forgotten]}) {
/keypress left
/delay 1
/keypress right
/if (${Target.ID}) {
/face fast nolook
} else {
/return
}
/if (${fightTimer.Value}>0) /goto :panic
/keypress instant_camp
}
/return
|----------------------------------------------------------------------------
|SUB: MainAttack - Handles the kiting/killing
|----------------------------------------------------------------------------
Sub MainAttack
:attackAgain
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/doevents
/target id ${TargetID}
DELAY 1
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /goto :looties
/call AlwaysCheck
/if (${Macro.Return}) /return
/if (${Target.ID}==${Me.Pet.ID}) {
/assist
DELAY 3 ${Target.ID}!=${Me.Pet.ID}
}
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /goto :looties
/if (${Me.PctHPs}>ALARM_HEALTH_BELOW_PCT && ${Me.Buff[LICH_SPELL].ID}==NULL) {
DEBUG_3 Me.Buff[LICH_SPELL].ID==${Me.Buff[LICH_SPELL].ID}
/call MyCast "LICH_SPELL" LICH_GEM
}
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /goto :looties
/face
/if (${Target.Distance}>INITIALIZE_ATTACK_RANGE) /call WarpCloser
/if (${Me.Sitting}==FALSE && ${Me.Mount.ID}==0) /call Mount
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /goto :looties
/if (${fightTimer.Value}==0 && ${Target.PctHPs}>20) {
/call DoTheFear
/call MyCast "LIFE_DOT" LIFE_DOT_GEM
}
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /goto :looties
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Target.ID}>0 && ${Target.Type.NotEqual[Corpse]}) /goto :attackAgain
:looties
/call AlwaysCheck
/if (${Zone.Name.Find[forgotten]}==NULL || ${Macro.Return}) /return
/call DoTheLooting
/varset TargetID
/return
|----------------------------------------------------------------------------
|SUB: DowntimeWork - Between fight rebuffs, etc.
|----------------------------------------------------------------------------
Sub DowntimeWork
| Check if we are low on mana or health. Heal or sit down if low
/call CheckMana
/if ( ${Macro.Return}==0 ) /return 0
DEBUG_2 1. Mana Checked
| Make sure all buffs on self are up
/call MaintainSelfBuffs
/if ( ${Macro.Return}==0 ) /return 0
DEBUG_2 4. Buffs Checked
/call AlwaysCheck
/if (${Macro.Return}) /return 0
/memspellset dots
/delay 1m ${Window[SpellBookWnd]}==FALSE
/return 1
|----------------------------------------------------------------------------
|SUB: AcquireTarget - Finding a target 0=success; 1=n/a
|----------------------------------------------------------------------------
Sub AcquireTarget
/declare s int local
/declare lvl int local
/declare spn int local
/squelch /target clear
/varset TargetID
/varset TargetName
:scan
/varcalc s ${s}+1
/varset spn ${LastSpawn[${s}].ID}
/if (${spn}==0) /goto :acquired
/if ((${Spawn[${spn}].CleanName.Find[squeaking]} || ${Spawn[${spn}].CleanName.Find[squeaking]} || ${Spawn[${spn}].CleanName.Find[reject]}) && ${Spawn[${spn}].Type.Equal[Corpse]}==FALSE && ${Spawn[${spn}].Level}>=MIN_MOB_LVL && ${Spawn[${spn}].Level}<=MAX_MOB_LVL && ${Spawn[${spn}].Level}>${lvl}) {
/if (${Spawn[${spn}].Y}<=-265 && ${Spawn[${spn}].Y}>=-429 && ${Spawn[${spn}].X}>=74 && ${Spawn[${spn}].X}<=298 && ${Spawn[${spn}].Level}>=47) {
DEBUG_1 Ignoring mob in add area: ${Spawn[${spn}].CleanName}(L${Spawn[${spn}].Level})
} else {
/varset lvl ${Spawn[${spn}].Level}
/varset TargetID ${Spawn[${spn}].ID}
}
}
/goto :scan
:acquired
/if (${TargetID}) {
/target id ${TargetID}
DELAY 2 ${Target.ID}!=0
/if (${Target.CleanName.Find[${Me.CleanName}]}) {
DEBUG_1 WTF? I got targeted!
/return 1
}
/varset TargetID ${Target.ID}
/varset TargetName ${Target.CleanName}
/popup ${TargetName} (L${Target.Level})
DEBUG_1 ${TargetName} (L${Target.Level})
/return 0
}
DEBUG_3 AcquireTarget FAILED!
/popup Waiting for mobs in range MIN_MOB_LVL-MAX_MOB_LVL...
/call Mount
/delay 5s
/return 1
| Find the closest WP in line-of-sight to our target
Sub FindWP
/declare wp int local
/declare Y int local
/declare X int local
/declare Z int local
/declare dist float local 10000
/varset wpY
/varset wpX
/varset wpZ
/for wp 1 to WP_SIZE
/varset Y ${waypoint[${wp},Y_COORD]}
/varset X ${waypoint[${wp},X_COORD]}
/varset Z ${waypoint[${wp},Z_COORD]}
/if (${LineOfSight[${Y},${X},${Z}:${Target.Y},${Target.X},${Target.Z} ]} && ${Math.Distance[${Y},${X},${Z}:${Target.Y},${Target.X},${Target.Z} ]}<${dist}) {
/varset wpY ${Y}
/varset wpX ${X}
/varset wpZ ${Z}
/varset dist ${Math.Distance[${Y},${X},${Z}:${Target.Y},${Target.X},${Target.Z} ]}
}
/next wp
/return
|warp closer to target, via WP if mob, or direct otherwise.
Sub WarpCloser
/call AlwaysCheck nocast
/if (${Macro.Return}) /return
/if (${Target.ID}==0 || ${Target.ID}==${Me.ID}) {
/target id ${TargetID}
DELAY 2 ${Target.ID}>0
}
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /return
/if (${Target.Type.Equal[Pet]}) {
/warp target
} else {
/if (${Me.Pet.ID}) /warp loc ${Me.Pet.Y} ${Me.Pet.X} ${Me.Pet.Z}
}
DELAY 1
/if (${Target.ID}) /face fast nolook
/return
|warp away from target, via most distant WP
Sub WarpDistant
/call AlwaysCheck nocast
/if (${Macro.Return}) /return
/if (${Target.ID}==0 || ${Target.ID}==${Me.ID}) {
/target id ${TargetID}
DELAY 2 ${Target.ID}>0
}
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) /return
/declare wp int
/declare Y float
/declare X float
/declare Z float
/declare dist float
/for wp 1 to WP_SIZE
/varset Y ${waypoint[${wp},Y_COORD]}
/varset X ${waypoint[${wp},X_COORD]}
/varset Z ${waypoint[${wp},Z_COORD]}
/if (${Math.Distance[${Y},${X},${Z}:${Target.Y},${Target.X},${Target.Z} ]}>${dist}) {
/varset wpY ${Y}
/varset wpX ${X}
/varset wpZ ${Z}
/varset dist ${Math.Distance[${Y},${X},${Z}:${Target.Y},${Target.X},${Target.Z} ]}
}
/next wp
/if (${wpY}!=0||${wpX}!=0||${wpZ}!=0) /warp loc ${wpY} ${wpX} ${wpZ}
DELAY 1
/if (${Target.ID}) /face fast nolook
/return
| DO NOT CALL DELAY FROM EVENTS!
| Parameters: delay timer setting + early exit condition
Sub Delay(string delayTime, string exitCond)
/declare tmr timer local ${delayTime}
:moreDelay
/call AlwaysCheck nocast
/if (${tmr.Value}==0) /return
/if (${exitCond}) {
|DEBUG_3 Early exit on condition: ${exitCond.Right[-1]}
/return
}
/if (${Me.PctHPs}<ALARM_HEALTH_BELOW_PCT) {
DEBUG_1 Delay abort, ${tmr.Value} ticks left, LOW HEALTH!
/return
}
/delay 1 ${exitCond}
|/if (${Math.Calc[${tmr.Value}%10].Int}==0) DEBUG_3 /delay ${tmr.Value} ${exitCond.Right[-1]}:${exitCond}
/doevents Skinhit
/doevents Miss1
/doevents ImHit
/doevents Retry
/doevents Abort
/doevents OutOfRange
/doevents NoLOS
/doevents Standing
/doevents OOR
/doevents Zoned
/doevents PetAggro
/doevents NoMount
/doevents NoLich
| /doevents Stunned
/doevents RootGone
/doevents DOT1Gone
/doevents DOT2Gone
/doevents DOT3Gone
/doevents Snaregone
/doevents Skullcapgone
/if (${Target.Type.Equal[NPC]}) /face
/goto :moreDelay
/return
Sub MyCast(string spname, string gname)
/if (${Zone.Name.Find[forgotten]}==NULL) /return
/if (${Corpse.Open}) /notify LootWnd DoneButton leftmouseup
/varset spellName ${spname}
/call DoCast ${gname}
/doevents
/if (${Target.ID}!=${TargetID} && ${TargetID}!=0) {
/target id ${TargetID}
DELAY 3 ${Target.ID}==${TargetID}
}
/if (${Target.Type.Equal[NPC]}) /face fast
/return
| Cast something with status return and event processing
| assumes outer variable spellName and TargetID
Sub DoCast(string gem)
/declare castX float local ${Me.X}
/declare castY float local ${Me.Y}
/declare castZ float local ${Me.Z}
/declare castTime int
/declare tartype string local ${Spell[${spellName}].TargetType}
/if (${gem.Equal[item]}) /varset tartype ${FindItem[=${spellName}].Spell.TargetType}
:recast
/if (${tartype.Equal[Pet]} && ${Target.ID}!=${Me.Pet.ID}) {
/if (${Me.Pet.ID}==0) /return
/target id ${Me.Pet.ID}
/delay 1
} else /if (${tartype.Equal[Self]} && ${Target.ID}!=${Me.ID}) {
/target myself
/delay 1
} else /if (${Target.Type.Equal[NPC]} && ${Target.ID}!=${TargetID}) {
/target id ${TargetID}
/delay 1
}
/if (${Target.Type.Equal[NPC]} && ${Target.PctHPs}<8) {
DEBUG_3 Confusing/low health target (${Target.PctHPs}%)
/return
}
/if (${Target.ID}==0 || ${Target.Type.Equal[Corpse]}) {
DEBUG_3 Target${Target.CleanName}(${Target.ID}) Dead?
/return
}
/if (${Target.ID}!=${Me.ID}) {
/face fast
/if (!${LineOfSight[${Me.Y},${Me.X},${Me.Z}:${Target.Y},${Target.X},${ Target.Z}]}) {
/if (${dangerFlag} && ${reroot}) {
/call BackOffFromTarget 60
/delay 1
} else {
/call WarpCloser
/delay 1
}
}
}
/if (${gem.Equal[item]}) {
DEBUG_2 Casting ${spellName}:${gem}>${Target.CleanName}
/cast item "${spellName}"
} else {
/if (${Me.Gem[${spellName}]}==NULL) {
/memspell ${gem} "${spellName}"
DEBUG_3 book:${Window[SpellBookWnd]}; ${spellName}:${Me.SpellReady[${spellName}]}
/delay 10s ${Window[SpellBookWnd]}==FALSE
DELAY 15s ${Me.SpellReady[${spellName}]}
} else {
DEBUG_3 ${spellName}:${Me.SpellReady[${spellName}]}
/if (!${Me.SpellReady[${spellName}]}) {
DELAY 15s ${Me.SpellReady[${spellName}]}
}
}
DEBUG_2 Casting ${spellName}:${gem}>${Target.CleanName}
/cast "${spellName}"
}
/varset result CAST_IN_PROGRESS
DELAY 2
/doevents
/if (${result}==CAST_IN_PROGRESS && ${Me.Casting.ID}==0) /goto :recast
/if (!${dangerFlag}) {
DELAY 30s ${Me.Casting.ID}==NULL
/delay 1
/doevents
} else {
/delay 1
/varset castX ${Me.X}
/varset castY ${Me.Y}
/varset castZ ${Me.Z}
/if (${reroot} && ${Target.Type.Equal[NPC]}) {
/delay 4
/call WarpDistant
}
/varcalc castTime ${Math.Calc[${Me.Casting.MyCastTime}*10].Int}-19
| Hard code 9s delay for item, assume it is skullcap.
/if (${gem.Equal[item]}) /varset castTime 100
/delay ${castTime} ${Me.Casting.ID}==0
/warp loc ${castY} ${castX} ${castZ}
/face fast nolook
/delay 3s ${Me.Casting.ID}==0
/delay 1
/doevents
/if (${reroot} && ${Target.Type.Equal[NPC]}) {
/call WarpDistant
} else {
/call BackOffFromTarget 60
}
}
/if (${result}==CAST_IN_PROGRESS) /varset result CAST_SUCCESS
DEBUG_3 Casting of ${spellName} complete, result=${result}
/if (${result}==CAST_OUTOFRANGE || ${result}==CAST_CANNOTSEE) {
/if (!${dangerFlag} || !${reroot}) /call WarpCloser
/goto :recast
} else /if (${result}==CAST_RETRY) {
/if (!${Me.SpellReady[${spellName}]}) {
/varcalc result ${Spell[${spellName}].RecoveryTime}*10
DELAY ${result} ${Me.SpellReady[${spellName}]}
}
/goto :recast
}
/return
Sub Mount
/if (${mountFlag}) {
/if (${InvSlot[ammo].Item.Name.Find[Drum]}!=NULL && ${Me.Buff[Summon Drogmor].ID}==0) {
/cast item "${InvSlot[ammo].Item.Name}"
} else /if (${InvSlot[ammo].Item.Name.Find[Bridle]}!=NULL && ${Me.Buff[Summon Horse].ID}==0) {
/cast item "${InvSlot[ammo].Item.Name}"
} else {
/if (!${Me.Sitting}) /sit
}
} else {
/if (!${Me.Sitting}) /sit
}
/return
|----------------------------------------------------------------------------
|SUB: CheckMana 0= need more med; 1=mana ok
| Now with histeresis - exit condition is above entry condition.
|----------------------------------------------------------------------------
Sub CheckMana
/declare exitMana int local
/declare exitHealth int local
/varcalc exitMana MIN_MANA_BEFORE_MEDITATE+80
/varcalc exitHealth ALARM_HEALTH_BELOW_PCT+70
|Meditate?
/if (${Me.PctMana}<MIN_MANA_BEFORE_MEDITATE || ${Me.PctHPs}<ALARM_HEALTH_BELOW_PCT) {
DEBUG_1 Meditating.
/popup Meditating...
/call Mount
/declare i int local
/if ( ${Target.ID} ) /squelch /target clear
/for i 1 to 10
DELAY 1s
/if ( ${Target.ID} ) /return 1
/next i
/if ( ${Me.PctMana}<${exitMana} || ${Me.PctHPs}<${exitHealth} ) /return 0
DEBUG_2 Mana/health OK now.
}
/return 1
|----------------------------------------------------------------------------
|SUB: MaintainSelfBuffs - Keep buffs up
| 0=still buffing; 1=all done
|----------------------------------------------------------------------------
Sub MaintainSelfBuffs
/declare iCount int local
/declare t string local
/for iCount 1 to ${MyBuffs.Size}
/call SplitString tmp_tmp ${MyBuffs[${iCount}]} "|"
/varset t ${Me.Buff[${tmp_tmp[1]}]}
/if ( ${t.Equal[NULL]} ) {
/if ( !${Target.ID}!=${Me.ID} ) {
/echo buffing
/target myself
DELAY 1
}
|Cast with gemselection or default
/if ( ${tmp_tmp.Size}>1 ) {
DEBUG_3 Attempting to cast "${tmp_tmp[1]}" ${tmp_tmp[2]}
/call MyCast "${tmp_tmp[1]}" ${tmp_tmp[2]}
} else {
DEBUG_3 Attempting to cast "${tmp_tmp[1]}"
/call MyCast "${tmp_tmp[1]}" 8
}
|Return to top - so we dont keep buffing if being attacked
/return 0
}
/next iCount
/return 1
| Back off from current target so many units.
| Finds first line of sight on a horizontal, vertical, or
| diagonals that are at least as distant as desired.
Sub BackOffFromTarget(float dist)
/declare by float local ${Target.Y}
/declare bx float local ${Target.X}
/varcalc by ${by}-${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${ Target.Z}]}) /goto :backoff
/varset by ${Target.Y}
/varcalc bx ${bx}-${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${ Target.Z}]}) /goto :backoff
/varcalc by ${by}+${dist}
/varset bx ${Target.X}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${ Target.Z}]}) /goto :backoff
/varset by ${Target.Y}
/varcalc bx ${bx}+${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${ Target.Z}]}) /goto :backoff
/varcalc by ${by}+${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${ Target.Z}]}) /goto :backoff
/varcalc by ${Target.Y}-${dist}
/varcalc bx ${Target.X}-${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${ Target.Z}]}) /goto :backoff
/varcalc by ${Target.Y}+${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${ Target.Z}]}) /goto :backoff
/varcalc by ${Target.Y}-${dist}
/varcalc bx ${Target.X}+${dist}
/if (${LineOfSight[${by},${bx},${Target.Z}:${Target.Y},${Target.X},${ Target.Z}]}) /goto :backoff
/face fast
/keypress forward
/delay 3s ${Target.Distance}>=${dist}
/keypress forward
/face fast
/return
:backoff
/warp loc ${by} ${bx} ${Target.Z}
/delay 1
/if (${Target.ID}) /face fast nolook
/return
|----------------------------------------------------------------------------
|SUB: DoTheLooting
|----------------------------------------------------------------------------
Sub DoTheLooting
/if (!${Defined[looted]}) /declare looted bool outer
/target id ${TargetID}
DELAY 1
DEBUG_1 Going to loot
DEBUG_3 DoTheLooting Target: ${Target.CleanName}, ID:${Target.ID}
/warp target
DELAY 1
/loot
/varset looted FALSE
DELAY 6s (${Corpse.Open}&&${looted})
/call LootMob
/notify LootWnd DoneButton leftmouseup
DELAY 1
/doevents
/declare xp int local
/declare pp int local
/declare level float local ${Me.Level}
/varcalc level ${level}+${Math.Calc[${Me.Exp}/330.0].Milli}
/varcalc xp ${Me.Exp}-${startingXP}
/if (${xp}<0) /varcalc xp ${xp}+330
/varcalc pp ${Me.Platinum}-${startingPP}
/popup L${level.Milli}, XP up ${Math.Calc[${xp}/3.3]}% - PP up ${pp}
DEBUG_1 L${level.Milli}, XP up ${Math.Calc[${xp}/3.3]}% - PP up ${pp}
DELAY 5s
/return
|----------------------------------------------------------------------------
|SUB: LootMob
|----------------------------------------------------------------------------
Sub LootMob
/if (!${Target.ID}) {
/target npc corpse
DELAY 1s ${Target.ID}>0
}
/loot
DELAY 1s ${Corpse.Open}
/cleanup
/return
|----------------------------------------------------------------------------
|SUB: SplitString - A generic string splitter.
|----------------------------------------------------------------------------
Sub SplitString(string varname, string inputstring, string splitter)
/declare i int local
/declare stringcnt int local
|The normal splitter. Splitter string is just 1 in length.
/if (${splitter.Length}==1) {
/varcalc stringcnt ${inputstring.Count["${splitter}"]} + 1
/if (!${Defined[${varname}]}) {
/declare ${varname}[${stringcnt}] string outer
} else {
/deletevar ${varname}
/declare ${varname}[${stringcnt}] string outer
}
/for i 1 to ${stringcnt}
/varset ${varname}[${i}] ${inputstring.Token[${i},"${splitter}"]}
/next i
}
/return
|----------------------------------------------------------------------------
|SUB: DestroyCopper - Destroy all the copper
|----------------------------------------------------------------------------
Sub DestroyCopper
/squelch /windowstate InventoryWindow open
/shift /notify InventoryWindow IW_Money3 leftmouseup
/delay 1s ${Cursor.ID}>0
/destroy
/cleanup
/return
|----------------------------------------------------------------------------
|SUB: DestroySilver - Destroy all the silver
|----------------------------------------------------------------------------
Sub DestroySilver
/squelch /windowstate InventoryWindow open
/shift /notify InventoryWindow IW_Money2 leftmouseup
/delay 1s ${Cursor.ID}>0
/destroy
/cleanup
/return
|----------------------------------------------------------------------------
|SUB: DoTheFear - Fear target
|----------------------------------------------------------------------------
Sub DoTheFear
/if ( ${Me.PctMana}>10 && ${Target.Type.Equal[NPC]} && ${Target.PctHPs}>24) {
/call MyCast "FEAR_SPELL" FEAR_GEM
/varset fightTimer 31s
}
/return
Sub Event_fear
DEBUG_2 Fear me!
/call DoTheFear
/return
Sub Event_Miss1
/echo misses
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/if (${Me.Casting.ID}!=0) /return
/delay 1
/call BackOffFromTarget 90
/return
Sub Event_Skinhit
/echo skinhit
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/if (${Me.Casting.ID}!=0) /return
/delay 1
/call BackOffFromTarget 90
/return
Sub Event_ImHit
/Echo i m hit
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/if (${Me.Casting.ID}!=0) /return
/delay 1
/call BackOffFromTarget 80
/return
Sub Event_Retry
/delay 2
/varset result CAST_RETRY
/return
Sub Event_Abort
/varset result CAST_ABORT
/return
Sub Event_OutOfRange
/varset result CAST_OUTOFRANGE
/return
Sub Event_NoLOS
/varset result CAST_CANNOTSEE
/return
Sub Event_Standing
/stand
/varset result CAST_RETRY
/return
Sub Event_OOR
/warp target
/delay 2
/loot
/delay 3
/delay 3s ${Corpse.Open}
/doevents OOR
/return
Sub Event_Blocked
/varset wayBlocked TRUE
/return
Sub Event_Zoned
/varset weZoned TRUE
/call BackOffFromTarget 60
/return
Sub Event_PetAggro
/target id ${Me.Pet.ID}
/warp target
/delay 1
/assist
/delay 1
/return
Sub Event_NoMount
/varset mountFlag FALSE
/return
Sub Event_NoLich
/varset mountFlag FALSE
/dismount
/return
Sub Event_Stunned
:gdStunned
/call AlwaysCheck nocast
/if (${Macro.Return}) {
/varset result CAST_ABORT
/return
}
/delay 1
/if (${Me.Stunned}) /goto :gdStunned
/varset result CAST_RETRY
/return
Sub Event_Invited(heard,string who)
/if (${who.Equal[MY_PARTNER]}) {
/invite
} else {
/disband
}
/return
|----------------------------------------------------------------------------
|SUB: Root Gone
|----------------------------------------------------------------------------
Sub Event_RootGone
DEBUG_2 Root gone.
/varset reroot TRUE
/varset dangerFlag TRUE
/return
|----------------------------------------------------------------------------
|SUB: DOT1Gone
|----------------------------------------------------------------------------
Sub Event_DOT1Gone
DEBUG_2 SPLURT_DOT gone.
/varset redot1 TRUE
/return
|----------------------------------------------------------------------------
|SUB: DOT2Gone
|----------------------------------------------------------------------------
Sub Event_DOT2Gone
DEBUG_2 HEAT_DOT gone.
/varset redot2 TRUE
/return
|----------------------------------------------------------------------------
|SUB: DOT3Gone
|----------------------------------------------------------------------------
Sub Event_DOT3Gone
DEBUG_2 DISEASE_DOT gone.
/varset redot3 TRUE
/return
|----------------------------------------------------------------------------
|SUB: SKULLCAPGONE
|----------------------------------------------------------------------------
Sub Event_Skullcapgone
DEBUG_2 LIFE_DOT gone.
/varset reskull TRUE
/return
Sub Event_Snaregone
DEBUG_2 Root gone.
/varset reroot TRUE
/varset dangerFlag TRUE
/return
Sub Event_Exp
/varset AAExp ${Math.Calc[${Me.PctAAExp}-${AAExp}]}
/varset Exper ${Math.Calc[${Me.PctExp}-${Exper}]}
/varset LDRExp ${Math.Calc[${Me.PctGroupLeaderExp}-${LDRExp}]}
/echo EXP: ${Exper} (${Me.PctExp}%) - AAXP: ${AAExp} (${Me.PctAAExp}%) - LDRXP: ${LDRExp} (${Me.PctGroupLeaderExp})
/popup ${Exper} (${Me.PctExp}%) - AAXP: ${AAExp} (${Me.PctAAExp}%) - LDRXP: ${LDRExp} (${Me.PctGroupLeaderExp})
/varset Exper ${Me.PctExp}
/varset AAExp ${Me.PctAAExp}
/varset LDRExp ${Me.PctGroupLeaderExp}
/return
Sub Event_Exp2
/varset AAExp ${Math.Calc[${Me.PctAAExp}-${AAExp}]}
/varset Exper ${Math.Calc[${Me.PctExp}-${Exper}]}
/varset LDRExp ${Math.Calc[${Me.PctGroupLeaderExp}-${LDRExp}]}
/echo EXP: ${Exper} (${Me.PctExp}%) - AAXP: ${AAExp} (${Me.PctAAExp}%)
/popup ${Exper} (${Me.PctExp}%) - AAXP: ${AAExp} (${Me.PctAAExp}%)
/varset Exper ${Me.PctExp}
/varset AAExp ${Me.PctAAExp}
/varset LDRExp ${Me.PctGroupLeaderExp}
/return
Sub SwapItem(string itemName,string slotName)
/if ( ${InvSlot[${slotName}].Item.Name.Equal[${itemName}]} ) /return
/declare slotID int local
/declare oldSlotID int local
/declare oldItem string local
/declare i int local
/varset slotID ${InvSlot[${slotName}].ID} | slotID = slot you're swapping item to
/varset oldSlotID ${FindItem[${itemName}].InvSlot.ID} | oldSlotID = slot the item was originally in
/varset oldItem ${InvSlot[${slotName}].Item.Name} | oldItem = name of item in the slot you're swapping WITH
/if ( !${slotID} ) {
/echo Invalid slot name: ${slotName}
/return
}
/if ( !${oldSlotID} ) {
/echo Could not find item ${itemName}
/return
}
:auto_inv
/if ( ${Cursor.ID} && !${Cursor.Name.Equal[${itemName}]} ) {
/if ( ${Cursor.Container} ) {
/for i 1 to 8
/if ( !${InvSlot[pack${i}].Item.Container} ) {
/nomodkey /itemnotify pack${i} leftmouseup
}
/next i
} else {
/autoinventory
}
/goto :auto_inv
}
:pick_up_item
| if the item is in a bag and it's not open, then open it!
/if ( ${InvSlot[${oldSlotID}].Pack} && !${Window[${InvSlot[${oldSlotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${oldSlotID}].Pack} rightmouseup
| if the slot you're putting it in is inside a bag and it's not open, then open it!
/if ( ${InvSlot[${slotID}].Pack} && !${Window[${InvSlot[${slotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${slotID}].Pack} rightmouseup
| ok.. pick up the item now!
/squelch /nomodkey /shiftkey /itemnotify ${InvSlot[${oldSlotID}]} leftmouseup
| if item isn't on your cursor, try again!
/if ( !${Cursor.Name.Equal[${itemName}]} ) {
/if ( ${Cursor.ID} && !${Cursor.Container} ) /autoinventory
/goto :pick_up_item
}
:exchange_items
/if ( ${InvSlot[${oldSlotID}].Pack} && !${Window[${InvSlot[${oldSlotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${oldSlotID}].Pack} rightmouseup
/if ( ${InvSlot[${slotID}].Pack} && !${Window[${InvSlot[${slotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${slotID}].Pack} rightmouseup
| put the item in the new slot, and pick up whatever item was there
/squelch /nomodkey /shiftkey /itemnotify ${slotID} leftmouseup
| if it didnt get exchanged, try again!
/if ( ${Cursor.ID} && !${Cursor.Name.Equal[${oldItem}]} && !${Cursor.Name.Equal[${itemName}]} && !${Cursor.Container} ) /autoinventory
/if ( !${InvSlot[${slotID}].Item.Name.Equal[${itemName}]} ) /goto :exchange_items
:drop_item
/if ( !${Cursor.Container} || ( ${InvSlot[${oldSlotID}]}<30 && ${InvSlot[${oldSlotID}]}>=22 ) ) {
/if ( ${InvSlot[${oldSlotID}].Pack} && !${Window[${InvSlot[${oldSlotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${oldSlotID}].Pack} rightmouseup
/if ( ${InvSlot[${slotID}].Pack} && !${Window[${InvSlot[${slotID}].Pack.Name}].Open} ) /nomodkey /itemnotify ${InvSlot[${slotID}].Pack} rightmouseup
/squelch /nomodkey /itemnotify ${oldSlotID} leftmouseup
/if ( ${Cursor.ID} ) {
/if ( !${Cursor.Name.Equal[${oldItem}]} ) /autoinventory
/goto :drop_item
}
}
:close_pack
/if ( ${InvSlot[${oldSlotID}].Pack} && ${Window[${InvSlot[${oldSlotID}].Pack.Name}].Open} && ( ${Cursor.Name.Equal[${itemName}]} || ${FindItem[${itemName}].ID} ) ) {
/squelch /nomodkey /itemnotify ${InvSlot[${oldSlotID}].Pack} rightmouseup
/goto :close_pack
}
/if ( ${InvSlot[${slotID}].Pack} && ${Window[${InvSlot[${slotID}].Pack.Name}].Open} && ( ${Cursor.Name.Equal[${itemName}]} || ${FindItem[${itemName}].ID} ) ) {
/squelch /nomodkey /itemnotify ${InvSlot[${slotID}].Pack} rightmouseup
/goto :close_pack
}
/return