• You've discovered RedGuides, an EverQuest multi-boxing and scripting community 🧙‍♀️⚙️. We want you to play several EQ characters at once, come join us and say hello! 👋

  • A TLP without truebox has thawed (Very Vanilla ready)
    Frostreaver

KissAssist Release KissAssist.mac v3.9 Updated 07/20/2011

Maskoi

old and salty
Joined
Sep 28, 2005
RedCents
82,796¢
kissassist_logo_web.png
KissAssist.mac v3.9 Updated 07/20/2011


Instructions/Settings Info Click Here

Current Features
  • Supports all classes for DPS Melee, Caster and Bards
  • Supports any level character
  • Set up characters to Tank or Assist others.
  • Select Player, Mercenary or Pet as Main Assist
  • Toons can follow Main Assist, remain stationary or return to anchor spot after mob dies.
  • Pets supported
  • Keep all buffs up Auras, Group, Self, Pet and Clickys
  • Creates an ini file for each toon
  • Separate Melee and Casting DPS settings.
  • Single Buff section for ease of use supports Spells/AA's/Items
  • Single DPS section for ease of use Spells/AA's/Items/Discs
  • Auto Mana/Endurance med detection depending on class.
  • Med settings to turn ON/Off and percentages to Start/Stop
  • Separate Bard twist setting for combat and non combat
  • Single Heal section for ease of use. Heal with any class
  • Loot mobs and set up what items to keep. sell, or destroy via ninjadvloot and separate loot.ini file
  • Auto accept rez if turned on via MQ2Rez
  • Auto accept Party Invites
  • Auto accept trades from other players/toons
  • Mount support AA or Item.
  • Basic Mez Feature - Currently under testing.
  • Auto detect progression servers and set variables accordingly for features not yet available. i.e. Extended Target Window.
  • Commands to turn on/off major features i.e. healing, mezzing, melee etc.
  • Basic mercenary control - Define when merc attacks.

K.I.S.S. Assist is the base macro for a new macro system we are developing at RedGuides/NotAddicted.com. The idea is develop a macro that is well documented and easy to use. We will be adding features to the macro after each phase is well tested.

KissAssist is designed as a stand alone multi class macro. Its main purpose is to get your toon assisting and DPSing mobs in as little time as possible. The macro tries to utilize the features common to all or most classes while ditching the micro managing settings and class specific features that make such macros confusing and complicated. The idea is utilize the full potential of plugins to keep code and settings lite and friendly. This is a work in progress and will grow and evolve over the next few months.

Requires plugins* MQ2Cast, MQ2Exchange, MQ2Melee, MQ2MoveUtils, Mq2Rez, & MQ2Twist (Bards) , Extended Target Window and ninjadvloot.inc file.

* All plugins are included in both our NA Very Vanilla & Official Compile.

Examples of the KissAsisst 3.4 ini file
[/SIZE]

Feel free to test it and post suggestions for improvements or features.

To Do List

Fix looting while mounted
Add pet heals
Add Autofire/Range attacks
Add GoM feature

Rich (BB code):
| - kissassist.mac v3.9 by Maskoi 07/20/2011
| - KISS Asisst - A simple multi class assist macro
| Requires MQ2Cast, MQ2Exchange. MQ2Melee, MQ2MoveUtils, MQ2Rez ninjadvloot inc file and Extended target window
| Usage - /mac kissassist TankName 95 
| or target Main Tank and /mac kissassist
| This macro was written exclusively for subscribers of Redguides/NotAddicted.com
|
| Casters should turn off melee in ini file. MeleeOn=0 
|
|-------------------------------------------------------------------------------------   
#turbo 40

#include ninjadvloot.inc

#define DEBUG  "/squelch /echo"
#define DEBUG1 "/squelch /echo"
#define DEBUG2 "/squelch /echo"

#Event  ToggleVariable  "[MQ2] Toggle #1#"
#Event  ToggleVariable  "[MQ2] Toggle #1# #2#"
|-------------------------------------------------------------------------------------
| Sub Main 
|------------------------------------------------------------------------------------- 
Sub Main 
    /declare MacroName              string      outer       KissAssist
    /declare MacroVer               string      outer       3.9
    /declare IniFileName            string      outer       ${MacroName}_${Me.CleanName}.ini 
    | Edit settings in your KissAssist_ToonName.ini file
    /call LoadIni General KissAssistVer         string      ${MacroVer}
    /call LoadIni General Role                  string      Assist
    /call LoadIni General XTSlot                int         1
    /call LoadIni General CampRadius            int         30
    /call LoadIni General CampRadiusExceed      int         400
    /call LoadIni General ReturnToCamp          int         0
    /call LoadIni General ChaseAssist           int         0
    /call LoadIni General ChaseDistance         int         25
    /call LoadIni General MedOn                 int         0
    /call LoadIni General MedStart              int         20
    /call LoadIni General MedCombat             int         0
    /call LoadIni General LootOn                int         0    
    /call LoadIni General RezAcceptOn           int         0
    /call LoadIni General AcceptInvitesOn       int         1
    /call LoadIni Melee AssistAt                int         95
    /call LoadIni Melee MeleeOn                 int         0
    /call LoadIni Melee FaceMobOn               int         1
    /call LoadIni Melee MeleeDistance           int         75
    /call LoadIni Melee StickHow                string      snaproll rear
    /call LoadIni Buffs BuffsOn                 int         0
    /declare Buffs[15]                          string      outer
    /call LoadIni Buffs Buffs                   string      NULL        Buffs
    /call LoadIni DPS DPSOn                     int         0
    /call LoadIni DPS DPSSkip                   int         20
    /call LoadIni DPS DPSInterval               int         2
    /if (${Me.Class.Name.Equal[Bard]}) {
        /call LoadIni General TwistOn           int         0  
        /call LoadIni General TwistWhat         string      "Twist order here"  
        /call LoadIni Melee MeleeTwistOn        int         0
        /call LoadIni Melee MeleeTwistWhat      string      "DPS twist order here"
    }
    | Pull variables for future use not implemented yet.
    | /call LoadIni Pull MaxRadius                int         350
    | /call LoadIni Pull MaxZRange                int         50
    | /call LoadIni Pull FailMax                  int         3    
    /declare DPS[8]                             string      outer
    /call LoadIni DPS DPS                       string      NULL        DPS
    /call LoadIni Heals Help                    string      "Format Spell|% to heal at i.e. Devout Light Rk. II|50"
    /call LoadIni Heals HealsOn                 int         0
    /declare Heals[8]                           string      outer
    /call LoadIni Heals Heals                   string      NULL        Heals   
    /if (${Select[${Me.Class.ShortName},SHM,BST,ENC,MAG,NEC,SHD,WIZ]}) {
        /call LoadIni Pet PetOn                 int         0
        /call LoadIni Pet PetSpell              string      "YourPetSpell"
        /call LoadIni Pet PetShrinkOn           int         0
        /call LoadIni Pet PetShrinkSpell        string      "Tiny Companion"
        /call LoadIni Pet PetBuffsOn            int         0
        /declare PetBuffs[8]                    string      outer
        /call LoadIni Pet PetBuffs              string      NULL        PetBuffs
    }
    /if (${Select[${Me.Class.ShortName},BRD,ENC]}) {
        /declare MezMob[5] int outer
        /call LoadIni Mez MezOn                 int         0
        /call LoadIni Mez MezRadius             int         50
        /call LoadIni Mez MezMinLevel           int         65
        /call LoadIni Mez MezMaxLevel           int         85
        /call LoadIni Mez MezStopHPs            int         80
        /call LoadIni Mez MezSpell              string      "Your Mez Spell"
    }
    |  Do Not Edit These
    /declare MainAssist             string      outer  
    /declare CampZone               int         outer       ${Zone.ID}
    /declare CampXLoc               int         outer       ${Me.X} 
    /declare CampYLoc               int         outer       ${Me.Y}
    /declare LookForward            int         outer       ${Me.Heading.DegreesCCW}
    /declare Attacking              int         outer       0
    /declare PetAttack              int         outer       0
    /declare MedStat                string      outer       
    /declare PetShrunk              int         outer       0
    /declare MiscGem                string      outer       8
    /declare Twisting               int         outer       0
    /declare DPSTwisting            int         outer       0
    /declare AddsInCamp             int         outer       0 
    /declare OldAssistAt            int         outer       0 
    /declare MyTargetID             int         outer       0 
    /declare MyTargetName           string      outer       0 
    /declare ValidTarget            int         outer       0 
    /declare MountOn                int         outer       1
    /declare WasTwisting            int         outer       0    
    /declare CastResult             string      outer       
    /declare TanksMob               int         outer       0  
    /declare AggroCheck             string      outer 
    /declare AggroTargetID          string      outer 
    /declare FailCounter            int         outer       0
    /declare BuffQue[60]            int         outer       0 
    | Compensate for Progression servers not having Extended Target Window
    /if (${Select[${MacroQuest.Server},fippy,vulak]}) {
        /noparse /varset AggroCheck ${SpawnCount[npc radius ${MeleeDistance}]}
        /noparse /varset AggroTargetID ${NearestSpawn[1,npc radius 20].ID}
    } else {
        /noparse /varset AggroCheck ${Me.XTarget[${XTSlot}].ID}
        /noparse /varset AggroTargetID ${Me.XTarget[${XTSlot}].ID}
        /call LoadIni Merc Help                     string      "To use: Turn off Auto Assist in Manage Mercenary Window" 
        /call LoadIni Merc MercOn                   int         0
        /call LoadIni Merc MercAssistAt             int         92
    }
    /if (${Select[${Me.Class.ShortName},BST,BRD,CLR,DRU,ENC,MAG,NEC,PAL,RNG,SHM,SHD,WIZ]}) /varset MedStat Mana
    /if (${Select[${Me.Class.ShortName},BER,MNK,ROG,WAR]}) /varset MedStat Endurance 
    /declare i int local
    | Declare timers for DPS duration spells 
    /for i 1 to ${DPS.Size}
        /declare DPSTimer${i}       timer         outer     5
    /next i 
    | Declare timers for Heal duration spells
    /declare j int local
    /declare k int local
    | Declare timers for Heal duration spells
    /for j 1 to ${Heals.Size}
        /declare SpellGH${j}    timer   outer   0
        /for k 0 to 5
            /declare Spell${j}GM${k}     timer   outer   0
            DEBUG Spell${j}GM${k} ${Spell${j}GM${k}}
        /next k
    /next j
    | Declare timers for mezzing
    /declare l int local
    /for l 1 to 5
        /declare MezTimer${l} timer outer 0
    /next l
    /if (${KissAssistVer.NotEqual[${MacroVer}]}) {
        /echo Version Mismatch Detected, Loading Aliases this can take up to 1 min
        /squelch /alias /looton         /echo toggle LootOn 
        /squelch /alias /buffson        /echo toggle BuffsOn
        /squelch /alias /dpson          /echo toggle DPSOn
        /squelch /alias /meleeon        /echo toggle MeleeOn
        /squelch /alias /healson        /echo toggle HealsOn
        /squelch /alias /peton          /echo toggle PetOn
        /squelch /alias /mezon          /echo toggle MezOn
        /squelch /alias /chase          /echo toggle ChaseAssist
        /squelch /alias /camphere       /echo toggle ReturnToCamp
        /ini "${IniFileName}" "General" "KissAssistVer" "${MacroVer}"
    }
|-------------------------------------------------------------------------------------
| Check if required plugins are loaded and settings
|-------------------------------------------------------------------------------------    
    /call CheckPlugin MQ2Cast
    /call CheckPlugin MQ2Exchange     
    /call CheckPlugin MQ2Melee
    /call CheckPlugin MQ2Moveutils
    /call CheckPlugin MQ2Rez
    |  Turn aggro mode off and turn on melee mode in MQ2Melee
    /if (${MeleeOn}) {
        /squelch /melee aggro=0
        /squelch /melee melee=1
        /squelch /melee stickbreak=1
    }
    |  Set MQ2moveutils variables
    /stick set verbflags 0
    /stick set breakonkb on
    /stick set breakonmouse on
    /stick set breakdist ${CampRadiusExceed}
    /stick set breakonwarp on
    | Set up MQ2rez if RezAcceptOn=1
    /if (${RezAcceptOn}) {
        /squelch /rez accept on
        /squelch /rez loot off
    } else /squelch /rez accept off
    | Initialize variables for ninjadvloot.inc include file
    /call SetupAdvLootVars
|-------------------------------------------------------------------------------------
| Check and set roles
|-------------------------------------------------------------------------------------     
     /if (${Role.Equal[tank]}) { 
        /echo Looks like I am Main Tank. Wish me luck.
        /varset MainAssist ${Me}
        /squelch /melee aggro=1
        /varset AssistAt 100
        /varset StickHow front
    }
|-------------------------------------------------------------------------------------
| - Assign Main Tank from command line parameter or targeted player, merc or pet
|-------------------------------------------------------------------------------------        
    /if (!${Defined[Param0]}) {
        /varset MainAssist ${Target.CleanName}
    } 
    | Check command line for tank name
    /if (${Defined[Param0]}) {
        /varset MainAssist ${Param0} 
        /delay 10
        /target id ${Spawn[${MainAssist}].ID}
    }
    | Error control no tank selected end macro
    /if (!${Spawn[${Target}].ID} || !${Select[${Target.Type},Mercenary,PC,Pet]}) {
        /echo You do not have a Mercenary, PC or Pet targeted. Please target Main Tank and restart macro.
        /end
    }
    | Targeted myself end macro
    /if (${Target.CleanName.Equal[${Me.CleanName}]} && ${Role.NotEqual[tank]}) {
        /echo You cannot assist yourself! Please target Main Tank and restart macro.
        /end
    }
    /if (${Defined[Param1]} && ${Role.NotEqual[tank]}) {
        /varset AssistAt ${Param1} 
    } 
    /echo ================================
    /echo Redguides/NotAddicted.com presents   
    /echo ${MacroName} v.${MacroVer} by Maskoi 
    /echo ================================
    /if (${Role.Equal[tank]} && ${MainAssist.Equal[${Me}]}) {
        /echo I am Main Tank and Main Assist
    } else {
        /echo KissAssisting >> ${MainAssist} << at ${AssistAt}%
    }
    /squelch /target clear
    /squelch /assist off
|-------------------------------------------------------------------------------------
| Main Loop
|-------------------------------------------------------------------------------------   
        :MainLoop
            /doevents
            /call DoMiscStuff
            /call EndMacroIf
            /call CheckForAdds
            /call DoMezStuff
            /call DoPetStuff
            /call CheckBuffs
            /call DoWeMed
            /call DoHealStuff
            /call DoBardStuff       
            /call Assist
            /call Combat
            /call LootStuff
            /call DoWeMove
        /goto :MainLoop     
/return
|-------------------------------------------------------------------------------------
| SUB: Assist - Get Main Tank's target
|-------------------------------------------------------------------------------------
    Sub Assist
        :AssistAgain
        /doevents
        /if (${AggroCheck} < 1) /return
        DEBUG Assist: Enter
            /if (${ChaseAssist}) /call DoWeMove
            /if (${Spawn[${MainAssist}].ID} && ${MainAssist.NotEqual[${Me}]} && ${Spawn[${MainAssist}].Distance}<200) {
                /assist ${MainAssist}
                /delay 3s ${Target.ID}
            } else {
                /if (!${Spawn[${MainAssist}].ID} || ${Spawn[${MainAssist}].Type.Equal[corpse]} || (${MainAssist.Equal[${Me}]} && !${Me.Hovering})) /squelch /target id ${AggroTargetID}
                /delay 3s ${Target.ID}
            } 
            /varset MyTargetID ${Target.ID}
            /varset MyTargetName ${Target.CleanName}
            /call ValidateTarget
        /if (${ValidTarget}==0) {
            /goto :AssistAgain
            /squelch /target clear
        }
        /delay 1
        DEBUG Assist: Leave 
    /return
|-------------------------------------------------------------------------------------
| SUB: Validate Target
|------------------------------------------------------------------------------------- 
    Sub ValidateTarget
        DEBUG ValidateTarget Enter
        /varset ValidTarget 0
        /if (${Select[${Target.Type},PC,Pet,CORPSE,CHEST,TRIGGER,TRAP,TIMER,ITEM,MOUNT,Mercenary]}) /return
        /if (${Target.ID}==${Me.Pet.ID} || !${Target.ID}) /return
        /varset ValidTarget 1
        DEBUG  ValidateTarget: Leave
    /return
|-------------------------------------------------------------------------------------
| SUB: Combat
|-------------------------------------------------------------------------------------
    Sub Combat
        /doevents
        /call CanIDoStuff
        /if ((!${DPSOn} && !${MeleeOn}) || !${Target.ID} || ${AggroCheck} < 1 || ${Target.Type.Equal[Corpse]}) /return
        DEBUG Combat: Enter
        | Check Target Hps and type NPC or NPC Pet
        /if (${Target.PctHPs}<=${AssistAt} && ${Target.Type.Equal[NPC]} && ${Target.Distance}<${MeleeDistance}) {
            /if (${ChaseAssist}) /call DoWeMove
            /if (!${Attacking}) /echo  ATTACKING -> ${Target.CleanName} <- 
            /if (${FaceMobOn}) /face
            /if (${MeleeOn} && !${Attacking}) {
                /moveto id ${MyTargetID} mdist 15
                /if (${StickHow.NotEqual[0]}) /stick ${StickHow}        
                /killthis
                /varset Attacking 1
            } 
            :Attack
                /doevents
                /if (${Me.Pet.ID} && !${PetAttack}) {
                    /squelch /pet attack
                    /varset PetAttack 1
                }
                /if (${HealsOn}) /call DoHealStuff
                /if (${MercOn}) /call MercsDoWhat
                /if (${Me.Class.Name.Equal[Bard]}) /call DoBardStuff
                /if (${MezOn}) /call DoMezStuff 
                /call CombatTargetCheck
                /if (${Attacking} && ${MeleeOn} && ${Target.PctHPs}<=${AssistAt} && ${Target.Distance}<${MeleeDistance}) {
                    /if (!${Me.Combat}) /killthis
                    /if (${StickHow.NotEqual[0]} && !${Stick.Active} && ${Target.Distance}>15) /stick ${StickHow}                
                }
                /if (${DPSOn}) /call CombatCast
                /delay 5
                /if (${Spawn[${MyTargetID}].Type.Equal[Corpse]}) {
                    /call CombatReset
                    /return
                }
            /if (${MyTargetID}==${Target.ID} && ${Spawn[${MyTargetID}].Type.NotEqual[Corpse]}) /goto :Attack
           }
        DEBUG Combat: Leave 
    /return
|-------------------------------------------------------------------------------------
| SUB: CombatTargetCheck
|-------------------------------------------------------------------------------------
    Sub CombatTargetCheck
        /if (${Target.ID}!=${MyTargetID} && ${Spawn[${MyTargetID}].ID}) {
            /squelch /target id ${MyTargetID}
            /delay 3s ${Target.ID}==${MyTargetID}
        }
    /return
|-------------------------------------------------------------------------------------
| SUB: Combat Cast
|-------------------------------------------------------------------------------------
    Sub CombatCast
      /if (${Target.PctHPs}<${DPSSkip}) /return
        DEBUG CombatCast: Enter
        /declare i int local 0
        /declare DPSText string local
        /declare DPSAt int local ${AssistAt}       
        /for i 1 to ${DPS.Size}
            /doevents
            /if (${MezOn}) /call DoMezStuff
            /if (${HealsOn}) /call DoHealStuff
            /call CombatTargetCheck
            /if (${Spawn[${MyTargetID}].Type.Equal[Corpse]}) {
                /call CombatReset
                /return
            }
            | - Check for 2nd value in dps for mob health
            /if (${DPS[${i}].Arg[2,|].Length}) {
                /varset DPSText ${DPS[${i}]} 
                /varset DPS[${i}] ${DPSText.Arg[1,|]}           
                /varset DPSAt ${DPSText.Arg[2,|]}
            }
            /if (${Target.PctHPs}>${DPSAt} || ${Target.PctHPs}<${DPSSkip} || ${DPS[${i}].Equal[NULL]} || ${DPSTimer${i}} || ${Target.Type.NotEqual[NPC]}) /goto :skipcast
                DEBUG1 CombatCast: "${DPS[${i}]}" Target: ${Target.ID} Timer: ${DPSTimer${i}}
                /call CastWhat "${DPS[${i}]}" ${Target.ID}
                DEBUG1 CombatCast: ${Macro.Return}
                /if (${Macro.Return.Equal[CAST_SUCCESS]}) {
                    /echo ** ${DPS[${i}]} on >> ${Target.CleanName} <<
                    /if (${Me.Book[${DPS[${i}]}]}) {
                    | - Custom timer for cleric pets
                        /if (${Me.Class.Name.Equal[Cleric]} && (${DPS[${i}].Find[Zeal]} || ${DPS[${i}].Find[Unswerving]})) {
                            /varset DPSTimer${i} 5m
                        } else /if (${Spell[${DPS[${i}]}].Duration}>0) {
                            /varcalc DPSTimer${i} ${Spell[${DPS[${i}]}].Duration}*60
                        }
                        /goto :skipcast
                    } else /if (${FindItem[=${DPS[${i}]}]}) {
                        /varcalc DPSTimer${i} ${FindItem[=${DPS[${i}]}].Spell.Duration}*60
                        /goto :skipcast
                    } else /if (${Spell[${DPS[${i}]}].Duration}>0) {
                        /varcalc DPSTimer${i} ${Spell[${DPS[${i}]}].Duration}*60
                        /goto :skipcast
                    } 
                }
            :skipcast
            DEBUG1 ${DPS[${i}]} ${Macro.Return} DPSTimer${i} ${DPSTimer${i}}
            | Reset values if 2nd value in dps for mob health exists
            /if (${DPSText.Arg[2,|].Length}) {
                /varset DPS[${i}] ${DPSText}           
                /varset DPSAt ${AssistAt}
                /varset DPSText 
            }
        /delay ${DPSInterval}s
        /next i
        DEBUG CombatCast: Leave
    /return
|-------------------------------------------------------------------------------------
| SUB: CombatReset
|-------------------------------------------------------------------------------------
    Sub CombatReset
        DEBUG CombatReset: Enter
        /echo SLAIN >> ${MyTargetName} <<
        /varset MyTargetID 0
        /varset MyTargetName
        /varset ValidTarget 0
        /squelch /target clear
        /declare i int
        /declare j int local
        /varset Attacking 0        
        /for i 1 to ${DPS.Size}
            /varset  DPSTimer${i} 0
        /next i
        /for j 1 to 5
            /varset MezTimer${j} 0
        /next j
        /squelch /alert clear 3
        /if (${Me.Class.Name.Equal[Bard]}) /call DoBardStuff
        /if (${Me.Pet.ID}) {
            /varset PetAttack 0
            /pet back off
            /if (${PetHoldOn} && ${Me.AltAbility[Pet Discipline]}) /pet hold on
        }
        /call LootStuff
        DEBUG CombatReset: Leave 
    /return
|-------------------------------------------------------------------------------------
| SUB: CastWhat
|-------------------------------------------------------------------------------------
    Sub CastWhat(string castWhat,int castTargetID)
        DEBUG CastWhat: Enter castWhat - ${castWhat} castTargetID - ${castTargetID}
        /declare OldTarget int local ${Target.ID}
        /varset CastResult CAST_FAIL
        | - Check & cast if combat ability 
        /if (${Me.CombatAbility[${castWhat}]} && !${Me.CombatAbilityTimer[${castWhat}]}) {
            /docommand /disc ${castWhat}
        }
        | - Check & cast if item
        /if (${FindItem[=${castWhat}].ID} && ${FindItem[${castWhat}].Timer}==0) {
            /casting "${castWhat}"|item -targetid|${castTargetID}
            /delay 2s
            /varset CastResult ${Cast.Result}
        }
        | - Check & cast if AA
         /if (${Me.AltAbility[${castWhat}]} && ${Me.AltAbilityReady[${castWhat}]}) {
            /casting "${castWhat}"|alt -targetid|${castTargetID}
            :WaitOnAA
            /if (${Cast.Status.NotEqual}) /goto :WaitOnAA
            /varset CastResult ${Cast.Result}
        }
        | - Check & cast if spell
        /if (${Me.Book[${castWhat}]} && ${Spell[${castWhat}].Mana}<=${Me.CurrentMana}) {
            | Mem spell if not memmed
            /if (!${Me.Gem[${castWhat}]}) {
                /memorize "${castWhat}" 8
                /delay 15s ${Cast.Ready[${castWhat}]}
 
            }
            /if (${Cast.Ready[${castWhat}]}) { 
                /casting "${castWhat}" -maxtries|2 -targetid|${castTargetID}
                /delay 10s !${Me.Casting.ID}
                /varset CastResult ${Cast.Result}
            }
        }
        /squelch /target id ${OldTarget}
        /delay 3s ${Target.ID}==${OldTarget}
        DEBUG CastWhat: Leave 
    /return ${CastResult}
|-------------------------------------------------------------------------------------
| SUB: Check for adds
|-------------------------------------------------------------------------------------
    Sub CheckForAdds
        /doevents
        /if (${AggroCheck} < 1) /return
        DEBUG CheckForAdds: Enter
        /varset AddsInCamp 1 
        /varset OldAssistAt ${AssistAt}
        :moreadds
            /call Assist
            /call Combat
        /if (${AggroCheck} > 0) /goto :moreadds
        /varset AssistAt ${OldAssistAt}
        /varset AddsInCamp 0
        DEBUG CheckForAdds: Leave 
    /return
|-------------------------------------------------------------------------------------
| SUB: Do We Move
|-------------------------------------------------------------------------------------
    Sub DoWeMove
        /if ((!${ReturnToCamp} && !${ChaseAssist})) /return
        /call EndMacroIf
        /declare CloseEnuf int local ${Math.Calc[${ChaseDistance}/1.5]}
        DEBUG DoWeMove: Enter
        | - Shuts off ReturnToCamp if a toon moves a big distance defined by CampRadiusExceed ie CoH
        /if (${ReturnToCamp}) {
            /if (${Math.Distance[${CampYLoc}, ${CampXLoc}]} > ${CampRadiusExceed}) {
                /varset ReturnToCamp 0
                /echo Leashing exceeded distance of ${CampRadiusExceed} turning off ReturnToCamp
                /return
            }
            /if (${Math.Distance[${CampYLoc}, ${CampXLoc}]} > ${CampRadius} && !${AddsInCamp}) {
                /moveto loc ${CampYLoc} ${CampXLoc} mdist 10
                :InCampYet
                /delay 10
                /if (${Math.Distance[${CampYLoc},${CampXLoc}]} > ${CampRadius}) /goto :InCampYet
                /face heading ${LookForward}
            }
        }
        /if (${ChaseAssist}) {
            DEBUG ChaseAssist
            /if (!${Spawn[${MainAssist}].ID}  || ${Spawn[${MainAssist}].Distance} > ${CampRadiusExceed} || ${Math.Calc[${Spawn[${MainAssist}].Z}-${Me.Z}]}>100) {
                DEBUG ChaseAssist exceed camp check
                /varset ChaseAssist 0
                /echo ChaseAssist distance exceeded: Turning off ChaseAssist
            }
            /if (${Spawn[${MainAssist}].Distance} > ${ChaseDistance} && ${Spawn[${MainAssist}].Distance} < ${CampRadiusExceed}) {
            DEBUG ChaseAssist MA distance check
                /stick ${ChaseDistance} id ${Spawn[${MainAssist}].ID} loose
            :AreWeThere
                /delay 10
            /if (${Me.Moving}) /goto :AreWeThere
            }
        }
        DEBUG DoWeMove: Leave 
    /return
|-------------------------------------------------------------------------------------
| SUB: DoWeMed
|-------------------------------------------------------------------------------------
    Sub DoWeMed
        /if (!${MedOn}) /return
        DEBUG DoWeMed enter
        /if (!${Me.Moving}) {
            /if (${Me.Pct${MedStat}}<${MedStart}) {
                /squelch target clear
                /echo MEDDING-> ${MedStart}% ${MedStat} time to med. 
            :wait_for_resume
                    /doevents
                    /if (!${Me.Sitting}) /sit
                    /delay 5
                    /if (!${MedCombat}) {
                        /call CheckForAdds
                        /if (${AggroCheck} > 0) /return
                    }
                /if (${Me.PctMana}<100 ) /goto :wait_for_resume
            :done_medding    
                /if (${Me.Sitting}) /stand
            }
        }
        DEBUG DoWeMed leave 
    /return
|-------------------------------------------------------------------------------------
| SUB: CheckBuffs #define Time_Seconds "${Int[${Math.Calc[ ( 86400 * ${Time.Day} ) + ${Time.SecondsSinceMidnight} ]}]}"
|-------------------------------------------------------------------------------------
     Sub CheckBuffs
        /doevents
        /call CanIDoStuff
        /if (!${BuffsOn} || ${AggroCheck} > 0) /return
        DEBUG CheckBuffs: enter
        /if (${ChaseAssist}) /call DoWeMove
        /declare i int local
        /declare j int local
        /declare FullText string local 0
        /declare 1stPart string local 0
        /declare 2ndPart string local 0
        /declare 3rdPart string local 0
        /declare 4thPart string local 0
        | Group Buffs            
        /for i 1 to ${Buffs.Size}
            /delay 1
            | If Buffs=NULL skip to next buff
            /if (${Buffs[${i}].Equal[Null]}) /goto :SkipBuff
            DEBUG2 ${i} ${Buffs[${i}]}
            | Check for spells with 2 parts such as Exigent Focusing Rk. II,Talisman of Soul's Unity Rk. II - Set Buffs to the buff   
            /if (${Buffs[${i}].Arg[2,|].Length}) {
                /varset FullText ${Buffs[${i}]} 
                /varset 1stPart ${Buffs[${i}].Arg[1,|]}           
                /varset 2ndPart ${Buffs[${i}].Arg[2,|]}
                /varset 3rdPart ${Buffs[${i}].Arg[3,|]}           
                /varset 4thPart ${Buffs[${i}].Arg[4,|]}
                /varset Buffs[${i}] ${Buffs[${i}].Arg[1,|]}
                /if (${FullText.Arg[2,|].Find[Mana]})   /varset 2ndPart Mana
                /if (${FullText.Arg[2,|].Find[Aura]})   /varset 2ndPart Aura
                /if (${FullText.Arg[2,|].Find[Mount]})  /varset 2ndPart Mount
                /if (${FullText.Arg[2,|].Find[Dual]})   /varset 2ndPart Dual
            }
            DEBUG2 -- 1st assigned: ${2ndPart} ${Buffs[${i}]} 
            | Check if aura is up and if it stacks with existing buffs 
            /if (${2ndPart.Equal[Aura]}) {
                /if (!${Me.Song[${3rdPart}].ID} && ${Spell[${3rdPart}].Stacks[0]}) {
                    /echo Casting Aura >> ${1stPart} <<
                    | - Mutant Bards do this
                    /if (${Me.Class.ShortName.Equal[BRD]}) {
                        /if (!${Me.Gem[${1stPart}]}) {
                            /memorize "${1stPart}"|8
                            /delay 30
                        }    
                        /squelch /twist once ${Me.Gem[${1stPart}]}
                        /delay 5s
                        /goto :SkipBuff
                    }
                    | - Normal casting
                    /if (${Select[${Me.Class.ShortName},BER,MNK,ROG,WAR]}) {
                        /disc ${1stPart}
                    } else {
                        /casting "${1stPart}"|${MiscGem}
                    }
                    /delay 5s
                }
            /goto :SkipBuff 
            }
            | Cast mount 
            /if (${2ndPart.Equal[Mount]} && ${3rdPart.Length} && !${Me.Mount.ID} && !${Attacking} && ${MountOn}) {
                /call CastWhat "${1stPart}" ${Me.ID}
                /if (${Macro.Return.NotEqual[CAST_SUCCESS]}) /varset MountOn 0
                /goto :SkipBuff
            }
            | Check and Cast mana type spells/aas/items - Canni/Paragon/Harvest
              /if (${2ndPart.Equal[Mana]} && ${Me.PctMana}<${Int[${3rdPart}]} && ${Me.PctHPs}>${Int[${4thPart}]} && !${Attacking}) {
                /call CastWhat "${1stPart}" ${Me.ID}
                /if (${Macro.Return.Equal[CAST_SUCCESS]}) /echo Casting >> ${1stPart} << for mana
                /goto :SkipBuff
            }          
            | Check if buff is up and if it stacks with existing buffs 
            /if ((!${Me.Buff[${Buffs[${i}]}].ID} || !${Me.Song[${Buffs[${i}]}].ID}) && ${Spell[${Buffs[${i}]}].Stacks[0]} && ${Select[${2ndPart},Aura,Mount,Mana]}<1) {
                | Check for spells with 2 parts such as Exigent Focusing Rk. II,Talisman of Soul's Unity Rk. II - Set Buffs to actual spell
                /if (${FullText.Arg[2,|].Equal[Dual]})  /varset Buffs[${i}] ${3rdPart} 
                DEBUG2 -- 2nd asssigned: ${Buffs[${i}]}
                | If Target.Type=Group then buff self with group buff
                /if (${Spell[${Buffs[${i}]}].TargetType.Find[group]}>=1) {
                    /call CastWhat "${Buffs[${i}]}" ${Me.ID}
                    /if (${Macro.Return.Equal[CAST_SUCCESS]}) /echo Buffing >> ${Buffs[${i}]} <<
                    /delay 20
                }
                | If Target.Type=Single then buff each party member with single buff 
                /if (${Spell[${Buffs[${i}]}].TargetType.Find[single]}) {
                    /if (${Group}) {
                       /for j 0 to ${Group}
                            | Varset single buff array to keep track if group member was buffed or not.
                            | /varset BuffCounter${j}${i} 
                            | Check if party member is in zone and within spell range
                            /if (!${Group.Member[${j}].ID} || ${Spawn[${Group.Member[${j}]}].Distance}>=${Spell[${Buffs[${i}]}].Range}) /goto :nextmember
                            /call CastWhat "${Buffs[${i}]}" ${Group.Member[${j}].ID}
                            /if (${Macro.Return.Equal[CAST_SUCCESS]}) {
                                /echo Buffing ${Buffs[${i}]} on ${Group.Member[${j}].CleanName}
                                /delay 60 ${Me.SpellReady[${Buffs[${i}]}]}
                            }
                            /delay 20
                            :nextmember
                        /next j
                    } else {
                        /call CastWhat "${Buffs[${i}]}" ${Me.ID} 
                        /delay 20
                    }
                }
                | If Target.Type=self then buff self 
                /if (${Spell[${Buffs[${i}]}].TargetType.Find[self]}) {
                    /call CastWhat "${Buffs[${i}]}" ${Me.ID} 
                    /delay 20
                }
            }
            | If buff is an item click it
            /if (${FindItem[${Buffs[${i}]}].Spell.Stacks[0]} && (!${Me.Buff[${FindItem[${Buffs[${i}]}].Spell}].ID} || !${Me.Buff[${FindItem[${Buffs[${i}]}].Spell}].ID}) && ${FindItem[${Buffs[${i}]}].Timer}==0)  {
                /if (${Twist}) /multiline ; /squelch /twist off ; /varset Twisting 0
                /echo Clicking > ${Buffs[${i}]} < 
                /call CastWhat "${Buffs[${i}]}" ${Me.ID}
                /delay 15s !${Me.Casting.ID} 
            }
        :SkipBuff
            | Reset spell vars
            /if (${FullText.Arg[2,|].Length}) {
                /varset Buffs[${i}] ${FullText}
                /varset FullText 0
                /varset 1stPart 0           
                /varset 2ndPart 0
                /varset 3rdPart 0         
                /varset 4thPart 0
            }
        /next i
        DEBUG CheckBuffs leave
    /return
|-------------------------------------------------------------------------------------
| SUB: DoPetStuff 
|-------------------------------------------------------------------------------------
    Sub DoPetStuff
        /doevents
        /call CanIDoStuff
        /if (!${PetOn}) /return
        /call EndMacroIf
        DEBUG DoPetStuff: enter
        /declare i int local
        /if (${Me.Pet.CleanName.Equal[${Me.Name}`s familiar]}) /pet get lost
        /if (!${Me.Pet.ID} && ${Spell[${PetSpell}].Mana}<=${Me.CurrentMana}) {
            /delay 3
            /casting "${PetSpell}"|8 -maxtries|2
            /delay 350 ${Cast.Ready[${PetSpell}]}
            /echo My pet is now: ${Me.Pet.CleanName} from ${PetSpell}
        }
        /if (${Me.Pet.ID}) {
            /if (${PetShrinkOn} && !${PetShrunk}) {
                /call CastWhat "${PetShrinkSpell}" ${Me.Pet.ID}
                /varset PetShrunk 1
                /delay 20
                /squelch /target clear
            }
            | Pet Buffs
            /if (${PetBuffsOn}) {
                /for i 1 to ${PetBuffs.Size}
                /if (${PetBuffs[${i}].Equal[Null]}) /goto :SkipPetBuff
                DEBUG ${i} ${Me.PetBuff[${PetBuffs[${i}]}]} ${PetBuffs[${i}]}
                /if (!${Me.PetBuff[${PetBuffs[${i}]}]})  {
                    /call CastWhat "${PetBuffs[${i}]}" ${Me.Pet.ID}
                    /delay 20
                } 
                /if (${FindItem[=${PetBuffs[${i}]}].ID} && !${Me.PetBuff[${FindItem[${PetBuffs[${i}]}].Spell}]}) {
                    /call CastWhat "${PetBuffs[${i}]}" ${Me.Pet.ID}
                } 
                :SkipPetBuff
                /next i
            }
        }
    DEBUG DoPetStuff: leave
    /return
|----------------------------------------------------------------------------
| SUB: Check Plugin
|----------------------------------------------------------------------------
    Sub CheckPlugin(string pluginname)
        DEBUG CheckPlugin: enter
        /if (!${Bool[${Plugin[${pluginname}]}]}) {
            /squelch /plugin ${pluginname}
            /echo ${pluginname} not detected! This macro requires it! Loading ...
        }
        DEBUG CheckPlugin: leave
    /return
|----------------------------------------------------------------------------
| SUB: Load Ini
|----------------------------------------------------------------------------
    Sub LoadIni(string sectionName, string varName, string varType, string varValue, string varArray)
        DEBUG Sub Loadini ${sectionName} ${varName} ${varType} ${varValue} ${varArray}
        /if (${${varArray}.Size}>0) {
            /declare i int local
                /for i 1 to ${${varArray}.Size}
                    /if (!${Ini[${IniFileName},${sectionName},${varArray}${i}].Length}) /ini "${IniFileName}" "${sectionName}" "${varArray}${i}" "${varValue}"
                    /if (${Ini[${IniFileName},${sectionName},${varArray}${i}].Length}) /varset ${varArray}[${i}]  ${Ini[${IniFileName},${sectionName},${varArray}${i}]}
                /next i
            /return
        } else {
            /if (!${Defined[${varName}]} && ${Defined[varType]}) /declare ${varName} ${varType} outer
            /if (!${Ini[${IniFileName},${sectionName},${varName}].Length}) {
                /if (${varValue.Length}) {
                    /ini "${IniFileName}" "${sectionName}" "${varName}" "${varValue}"
                    /varset ${varName} ${varValue}
                    DEBUG Sub Loadini /varset ${varName} ${varValue}
                }
            } else {
                /varset ${varName} ${Ini[${IniFileName},${sectionName},${varName}]} 
            }
        }
        DEBUG LoadIni: leave
    /return
|----------------------------------------------------------------------------
| SUB: End Mac If
|----------------------------------------------------------------------------   
    Sub EndMacroIf 
        /doevents
        DEBUG EndMacroIf: Enter
        | I died wait for rez loop
        :WaitOnRez
        /if ((${Me.Hovering} || ${CampZone} != ${Zone.ID}) && ${RezAcceptOn}) {
            /if (${Attacking}) /call CombatReset
            /delay 10
            /goto :WaitOnRez
        }
        /if (${GameState.Equal[CHARSELECT]}) /endmac
        /if (!${RezAcceptOn} && ${CampZone} != ${Zone.ID}) /endmac
        DEBUG EndMacroIf: leave
    /return
|----------------------------------------------------------------------------
| SUB: Do Bard Stuff
|----------------------------------------------------------------------------   
    Sub DoBardStuff 
        /if (${Me.Class.Name.NotEqual[Bard]}) /return
        DEBUG DoBardStuff: Enter
        /if (${MeleeTwistOn} && ${Attacking} && !${DPSTwisting}) { 
            /varset DPSTwisting 1
            /varset Twisting 0
            /squelch /twist ${MeleeTwistWhat}
            /echo == Starting melee twist
        }
        /if (${TwistOn} && !${Attacking} && !${Twisting}) {
            /varset DPSTwisting 0
            /varset Twisting 1
            /squelch /twist ${TwistWhat}
            /echo == Starting normal twist
        }
        /if (!${TwistOn} && !${Attacking} && ${Twist}) /squelch /twist off
        | - Mutant Bards do this
        DEBUG DoBardStuff: leave
    /return
|----------------------------------------------------------------------------
| SUB: Do Heal Stuff
|----------------------------------------------------------------------------         
    Sub DoHealStuff
        /if (!${HealsOn} || ${Target.Type.Equal[corpse]} || ${Me.Moving}) /return
        DEBUG DoHealStuff: Enter
        /declare i int local
        /declare j int local
        /declare HealSpell      string  local
        /declare HealPct        string  local
        /declare HealFirst      int     local   0
        /declare DurationMod    float   local   1
        /declare GroupHealth    string  local   1
        /declare NotDead        int     local   0  
        /if (${AltAbility[Spell Casting Reinforcement]}>3) /varset DurationMod 1.7
        /for j 1 to ${Heals.Size}
            /if (${Heals[${j}].Equal[NULL]} || ${Heals[${j}].Arg[2,|].Equal[0]}) /goto :NextHeal
            /varset HealSpell   ${Heals[${j}].Arg[1,|]} 
            /varset HealPct     ${Heals[${j}].Arg[2,|]}
            /varset HealFirst   0
            /if (${Heals[${j}].Arg[3,|].Find[MA]}) /varset HealFirst ${Spawn[${MainAssist}].ID}
            /for i 0 to ${Group}
                | Check for Main Assist heal priority
                /if (${HealFirst} && ${Group.Member[${i}].ID}!=${HealFirst}) /goto :nextmember
                | Check for player hovering or corpse and skip heal if true
                /if (${Group.Member[${i}].Type.NotEqual[Mercenary]} && (${Group.Member[${i}].Hovering} || ${Spawn[${Group.Member[${i}]}].Type.Equal[Corpse]})) /goto :nextmember
                DEBUG (${Spell${j}GM${i}}>=1) ${i} ${Group.Member[${i}]} ${j} ${HealSpell} ${HealPct} Spell${j}GM${i} ${Spell${j}GM${i}}            
                | Check conditons for heals
                /if ((${Select[${Spell[${HealSpell}].TargetType},Single,Self]} || ${Spell[${FindItem[${HealSpell}].Spell}].TargetType.Find[self]}) && ${Group.Member[${i}].PctHPs}<=${HealPct} && ${Group.Member[${i}].ID} && ${Group.Member[${i}].Distance}<=${Spell[${HealSpell}].MyRange} && ${Spell${j}GM${i}}==0 && ${HealPct}>=1) {
                    /attack off
                    /delay 3s !${Me.Combat}
                    /call CastWhat "${HealSpell}" ${Group.Member[${i}].ID}
                    /delay 10s !${Me.Casting.ID}
                    /if (${Macro.Return.Equal[CAST_SUCCESS]}) {
                        /echo -- ${HealSpell} on  >> ${Group.Member[${i}].CleanName} << 
                        /varcalc Spell${j}GM${i} (${Spell[${HealSpell}].Duration}*${DurationMod})*60
                        DEBUG Spell${j}GM${i} (${Spell[${HealSpell}].Duration}*${DurationMod})*60 ${Spell${j}GM${i}}
                    }
                }
                :nextmember
                | Check if my pet needs healing
                
                /if (${Heals[${j}].Arg[3,|].Find[PET]} && ${Group.Member[${i}].ID}==${Me.ID} && ${Me.Pet.PctHPs}<=${HealPct} && ${Me.Pet.ID} && ${Me.Pet.Distance}<${Spell[${HealSpell}].MyRange}) {
                   DEBUG PET (${Heals[${j}].Arg[3,|].Find[PET]} && ${Group.Member[${i}].ID}==${Me.ID} && ${Me.Pet.PctHPs}<=${HealPct} && ${Me.Pet.ID} && ${Me.Pet.Distance}<${Spell[${HealSpell}].MyRange}) 
                   /call CastWhat "${PetHealSpell}" ${Me.Pet.ID}
                    /if (${Macro.Return.Equal[CAST_SUCCESS]}) {
                        /echo -- ${HealSpell} on  >> ${Me.Pet.CleanName} << 
                        /varcalc Spell${j}GM${i} (${Spell[${HealSpell}].Duration}*${DurationMod})*60
                    }
                }
                | Calculate total group health for group heal spells
                /if (${Group.Member[${i}].ID} && ${Group.Member[${i}].Type.NotEqual[corpse]} && ${Group.Member[${i}].Distance}<100) { 
                    DEBUG ${i} ${Group.Member[${i}].PctHPs}
                    /varcalc GroupHealth ${GroupHealth}+${Group.Member[${i}].PctHPs}
                    /varcalc NotDead ${NotDead}+1
                }
            /delay 1
            /next i
            | Use Group Heals if total group health % below assigned group heal %
            /if (!${Group}) /varset NotDead 100
            DEBUG (${Spell[${HealSpell}].TargetType.Find[group]} || ${Spell[${FindItem[${HealSpell}].Spell}].TargetType.Find[group]}) && ${Math.Calc[${GroupHealth}/${NotDead}]}<=${HealPct} && ${Spell${j}GM${i}}==0 && ${HealPct}>=1) 
            /if (${Group} && (${Spell[${HealSpell}].TargetType.Find[group]} || ${Spell[${FindItem[${HealSpell}].Spell}].TargetType.Find[group]}) && ${Math.Calc[${GroupHealth}/${NotDead}]}<=${HealPct} && ${Spell${j}GM${i}}==0 && ${HealPct}>=1) {
                        /call CastWhat "${HealSpell}" ${Me.ID}
                        /delay 10s !${Me.Casting.ID}
                        /if (${Macro.Return.Equal[CAST_SUCCESS]}) {
                            /echo -- ${HealSpell} on  >> Group << 
                            /varcalc SpellGH${i} (${Spell[${HealSpell}].Duration}*${DurationMod})*60
                            DEBUG SpellGH${i} (${Spell[${HealSpell}].Duration}*${DurationMod})*60 ${SpellGH${i}}
                        }                
                    }
        :NextHeal
        /delay 1
        /next j
        DEBUG DoHealStuff: Leave
    /return
|-------------------------------------------------------------------------------------
| SUB: Loot Stuff
|-------------------------------------------------------------------------------------
    Sub LootStuff
        /if (!${LootOn}) /return 
        DEBUG LootStuff: Enter
        /if (${Me.FreeInventory}==0) {
            /echo Inventory is full. Looting OFF
            /varset LootOn 0
        }
        /doevents
        | Reset mdist for ninjadvloot
        /squelch /moveto mdist 5
        /call LootMobs
        /if (${Debug}) /echo leave LootStuff
        DEBUG LootStuff: Leave
    /return
|-------------------------------------------------------------------------------------
| SUB: Do Mez Stuff
|-------------------------------------------------------------------------------------
    Sub DoMezStuff
        /if (!${MezOn}) /return
        DEBUG DoMezStuff: Enter
        /declare i int local
        /declare AddCount int local 
        /declare NextMob int local
        :top
        /varset AddCount ${SpawnCount[npc radius ${MezRadius} range ${MezMinLevel} ${MezMaxLevel} zradius 50]}
        /if (${AddCount}>1) {
            | Grab Main Assist's target and ignore it for mez purposes
            /if (${Spawn[${MainAssist}].ID}) /squelch /alert add 3 id ${MyTargetID}
            | /echo I am not mezzing MA's mob ${MyTargetName}
            /for i 1 to ${SpawnCount[npc radius ${MezRadius} range ${MezMinLevel} ${MezMaxLevel} zradius 50 noalert 3]}
                /varset NextMob ${NearestSpawn[${i},npc radius ${MezRadius} range ${MezMinLevel} ${MezMaxLevel} zradius 50 noalert 3].ID}
                /if (${Spawn[${MezMob[${i}]}].ID}!=${NextMob}) {
                    /varset MezMob[${i}] ${NextMob}
                    DEBUG MezMob[${i}]=${Spawn[${MezMob[${i}]}].CleanName}
                }
                /if (${MezTimer${i}}==0 && ${Spawn[${MezMob[${i}]}].ID} && ${Spawn[${MezMob[${i}]}].PctHPs}>${MezStopHPs}) /call MezMobs ${MezMob[${i}]} ${i}
            /next i
        }
        DEBUG DoMezStuff: Leave
    /return
|-------------------------------------------------------------------------------------
| SUB: Mez Mobs
|-------------------------------------------------------------------------------------
    Sub MezMobs(int MobID, int TimerNum)
        DEBUG ${MobID} ${TimerNum}
        /declare MezFail int local 0
        /target id ${MobID}
        /delay 3s ${Target.ID}==${MobID}
        /if (${Target.ID}) {
            /echo Mezzing ${Spawn[${MobID}].CleanName}
            | Chanter mez code
            /if (${Me.Class.Name.Equal[Enchanter]}) { 
                :retrymez
                    /delay 1
                    /call CastWhat "${MezSpell}" ${MobID}
                    /delay 30
                    /varcalc MezFail ${MezFail}+1
                /if (${Macro.Return.Equal[CAST_RESIST]} && ${MezFail}<3) /goto :retrymez
                /if (${Select[${Cast.Result},CAST_TAKEHOLD,CAST_IMMUNE]}) /squelch /alert add 3 id ${Target.ID}
                /if (${Macro.Return.Equal[CAST_SUCCESS]}) /varset MezTimer${TimerNum} ${Math.Calc[(${Spell[${MezSpell}].Duration}*60)*.9]}
            }
            | Bard mez code
            /if (${Me.Class.Name.Equal[Bard]}) { 
                /delay 1
                /squelch /twist once ${Me.Gem[${MezSpell}]}
                /delay 35 
                /varset MezTimer${TimerNum} 120
            }
        }
    /return
|-------------------------------------------------------------------------------------
| SUB: GetTarget
|-------------------------------------------------------------------------------------
    Sub GetTarget
        /if (${Role.NotEqual[Puller]}) /return
        DEBUG GetTarget enter
        /doevents
        /declare CurrentRadius  int local
        /echo Looking for Close Range Mobs
        :Acquire
            /doevents
            /call CheckForAdds
            | Auto add any untargetable npc, aura etc to ignore alert list
            /squelch /alert add 1 untargetable
            /for CurrentRadius 0 to ${MaxRadius} step 10
            /squelch /target npc radius ${CurrentRadius} zradius ${MaxZRange} noalert 1 
            /if (${Target.ID}) {
                /call  ValidateTarget
                /if (${Debug}) /echo ${Target.CleanName} ${ValidTarget} 
                /if (${ValidTarget}==0) {
                    /squelch /alert add 1 id ${Target.ID}
                    /goto :Acquire
                }
                /echo Got target  >> ${Target.CleanName} << at range ${Int[${Target.Distance}]}
                /return
            }
            /next CurrentRadius
            /if (!${Target.ID}) {
                /delay 5
                /varcalc FailCounter ${FailCounter}+1
                /echo Failed to Acquire Target in Range ${MaxRadius} ${FailCounter} Time(s)
                /call AlertClear
                /if (${FailCounter}>=${FailMax}) {
                    /echo Waiting for Respawns, Resetting Failure Counter...
                    /moveto loc ${CampYLoc} ${CampXLoc} mdist 10
                    /varset FailCounter 0
                }
                /goto :Acquire
            }
        DEBUG GetTarget leave 
    /return
|-------------------------------------------------------------------------------------
| SUB: DoMiscStuff 
|-------------------------------------------------------------------------------------    
    Sub DoMiscStuff
        | Accept trades
        /if (${Window[TradeWnd].Open} && ${Window[TradeWnd].HisTradeReady}) /notify TradeWnd TRDW_Trade_Button leftmouseup
        /if (${Window[GroupWindow].Child[GW_FollowButton]} && ${AcceptInvitesOn}) /invite
    /return
|-------------------------------------------------------------------------------------
| SUB: Event_ToggleVariable  Check whenever the player is changing any variable via /echo
|-------------------------------------------------------------------------------------    
    Sub Event_ToggleVariable(string Line, string Command, string Command2)
        /declare i int local
        | Toggle Variables & Set Variables
        /if (${Defined[${Command}]}) {
            /declare OnOff local
            /if (${Command2.NotEqual[NULL]}) {
                /varset ${Command} ${Command2}
            } else /if (${${Command}}) {
                /varset ${Command} 0
                /varset OnOff Off
            } else {
                /varset ${Command} 1
                /varset OnOff On
                /if (${Command.Equal[ChaseAssist]}) {
                    /if (${ReturnToCamp}) /varset ReturnToCamp 0
                }
                | Turn on return to camp & set new y,x coord
                /if (${Command.Equal[ReturnToCamp]}) {
                    /varset CampXLoc ${Me.X} 
                    /varset CampYLoc ${Me.Y}
                    /varset LookForward ${Me.Heading.DegreesCCW}
                    | Turn off ChaseAssit if on
                    /if (${ChaseAssist}) {
                        /varset ChaseAssist 0
                        /echo >> ChaseAssist Off
                    }
                    /echo >> New camp set ${Me.Y}, ${Me.X}
                }
            }
           | /ini "${IniFileName}" "${sectionName}" "${varName}" "${varValue}"
            /echo >> Set ${Command}: ${OnOff}
            
            /return
        }
    /return
|-------------------------------------------------------------------------------------
| SUB: Can I do Stuff  - Check if invis moving ducked etc
|-------------------------------------------------------------------------------------  
    Sub CanIDoStuff
        :IAmBusy
        /call EndMacroIf 
        /delay 2
        /if (${Me.Moving} || (!${ChaseAssist} && !${AggroCheck} && ${Me.Invis}) || ${Me.Stunned} || ${Me.Ducking} ||  ${Cast.Status.NotEqual} || ${Me.State.Equal[BIND]} ) /goto :IAmBusy
        /if (${Window[MerchantWnd]} || ${Window[TradeWnd]} || ${Window[GiveWnd]} || ${Window[LootWnd]} || ${Window[SpellBookWnd]} || ${Window[BigBankWnd]} || ${Window[LootWnd]} || ${Window[BankWnd]} || ${Window[TributeMasterWnd]} || ${Window[GuildTributeMasterWnd]}) /goto :IAmBusy
    /return  
|-------------------------------------------------------------------------------------
| SUB: Mercs Do What
|-------------------------------------------------------------------------------------  
    Sub MercsDoWhat
        /if (${MercAssistAt}>${Spawn[${MyTargetID}].PctHPs} && ${Me.Mercenary.Equal[Active]}) { 
            /mercassist
        }
    /return  
|-------------------------------------------------------------------------------------
| SUB: EquipRanged
|-------------------------------------------------------------------------------------
    Sub EquipRanged
        DEBUG /echo EquipRanged
        /if (${String[${Me.Inventory[ranged]}].NotEqual[${PullRangedItem}]}) {
            /exchange "${PullRangedItem}" ranged
            /varset Exchanged 1
        }
        /delay 5s 
        /if (${Exchanged}) /exchange "${EquippedRangedItem}" ranged
        DEBUG /echo leave EquipRanged
    /return


If you like KissAssist and would like to help keep my interest in adding/updating features to it
please consider donating to Maskoi via PayPal [email protected]. Thanks

Ninjadvloot.ini is included with NA Official Compile or get it here
 
Last edited:
Re: KissAssist.mac v34 04/10/2011

Version 3.9 Updated 07/17/2011
Fixed aura casting for pure melee classes
Fixed toons chasing after mobs when outside of defined melee range
Fixed an issue with invis check stalling macro.
Fixed a group heal check
NEW TANKING FEATURE ADDED. - The new tanking feature has 2 modes, assist and stand alone.
Assist Mode will target the puller's/MA's mob and attack when mob comes into defined melee range.
  • Usage: Set Role=Tank and select MA normally
Stand Alone will target and attack any aggressive mob that comes into defined melee range.
  • Usage: Set Role=Tank and select yourself as MA

Version 3.8 Updated 07/17/2011
Targeting revamped to fix various errors people were reporting
Some minor tweaks to improve performance
Added Mercenary /callassist feature. Merc will not attack until mob reaches defined health.
Rich (BB code):
[Merc]
Help=To use: Turn off Auto Assist in Manage Mercenary Window
MercOn=0
MercAssistAt=85
Version 3.7 Updated 05/30/2011
Added DPS syntax to cast spells at different mob health percentages: Spell Name|% mob health to cast at as seen below.
-- DPS2=Ikaav Blood|65
Removed MedStop. Characters will now start/stop medding when below/above the MedStart percentage.
Added a switch to turn off interrupt medding during combat.
-- MedCombat=1
Added a switch to accept all group/party invites.
-- AcceptInvitesOn=1
Added a switch to turn off/on facing a mob right before combat. Mainly for casters not to turn on every mob
-- FaceMobOn=0
KissAssist will automatically accept trades now when the Trade ready button is pressed by the person trading.
Fixed melee assist feature so toons stop running up to attack mobs before they are suppose to.
Fixed some errors in group heal code.
Put a check in to prevent trying to buff while moving.
Fixed a bug that toon wouldn't buff self if out of group on single target spells.
Added Commands to toggle major features on/off
  • /looton - Toggle looting on/off
  • /buffson - Toggle buffing on/off
  • /dpson - Toggle DPS casting on/off
  • /meleeon - Toggle melee attacks on/off
  • /healson - Toggle healing on/off
  • /peton - Toggle pets on/off
  • /mezon - Toggle mezzing on/off
  • /chase - Toggle chase/follow Main Tank on/off
  • /camphere - Toggle return to camp on/off

Version 3.6
MAJOR FIX - TLP/LIVE SERVER DETECTION FIXED It was completely broken in 3.5
Group buffing using single target spell tweaked
Melee/DPS no target spam fixed

Version 3.5
Added support for progression servers. Automatically replaces Extended Target functions with old school detect mobs in a radius if on either progression server.
Mez feature - single target released - Still in testing so don't grab 5 level 90 mobs and expect to live. AEMez coming soon.
Tweaked heal checks
Ranger mana check fixed

Version 3.4
Group Heal routine rewritten because it was experiencing errors.

Version 3.3
Support for Mounts Item or AAs added under Buffs section following syntax: Mount Name|Mount
Aura syntax changed for consistency i.e Aura of the Pious|Aura|Aura of the Pious Effect
Support added for Mana regen AA/Spells like Canni and Paragon of Spirit following syntax: Spell Name|Mana|% mana to cast at|% Health to to prevent casting.
2 part spell syntax changed for consistency i.e. Unity of Spirit now uses the Dual tag. Exigent Focusing Rk. II|Dual|Talisman of Soul's Unity Rk. II
Heal spells can now be designated for the Main Assist only as follows: Promised Recuperation|85|MA
Fixed an issue with ChaseAssist settings.
Dedicated Extended Target Slot setting added for people with custom setups (Default 1)

Version 3.2
Added Aura Feature goes in [Buffs] - Syntax: Spell Name|Song Window Buff|Aura i.e. Buffs7=Aura of the Poet Rk.II|Aura of the Poet Effect Rk.II|Aura
Rewrote the heal routines. It was lacking
Fixed some targeting issues with healing.
Tweaked waiting for rez loop.
Added a heal check between DPS spells.

Version 3.1
Added auto accept rez feature via MQ2Rez.
Fixed Adds detection. Was failing if main assist was dead or more than 200 ft away.
Adds will now break med if detected.
Tweaked combat sub.
Fixed toons targeting corpses with adds when assist mercs.
Fixed cleric hammer pet casting loop

Version 3.0
Heal feature added. Watches group and heals lowest health according to your settings. (Pets heals not supported yet)
- Automatic detection of group or single heals.
- Supports cleric epic 1.5/2.0 and Divine Arbitration
Loot feature added via ninjadvloot
New healing casting spam/echo adding
Fixed some weirdness with twisting interfering with bards using their clickies

Version 2.7
Adjusted buffs delays for smother operation
Added DPS casting /echo on successful cast

Version 2.6
Added Bard Support with settings to turn on/off twisting during combat or non combat.
MQ2Twist song list can be set for both combat and non combat

Version 2.5
Added Buff Feature - Recognizes single, self and group buffs whether its AA/Spell/Item.
Added Pet Buff Feature - Keep up pet buffs whether its AA/Spell/Item.
Macro now ends after zoning or camping
Fixed some ChaseAssist and Return to Camp issues
Fixed items in DPS not casting
Fixed pet shrink casting loop
Fixed caster pet not attacking
Fixed DPS Discs not firing
Updated settings info page

Version 2.0
Now supports Melee or Caster classes
Kiss DPS Casting Feature added - Assign DPS/debuffs/nukes/dots in the form of Spells, AAs, Discs or Items
Pet support added
Medding feature added
Automatic detection of Mana or Endurance medding by class

Version 1.3
Added ini file support
Fixed follow main assist feature

Version 1.2
Added follow main assist feature
Added definable stick feature

Version 1.1
Improvements to combat features
 
Last edited:
KissAssist.mac v3.7

KissAssist Instructions & Settings Info
All settings can now be edited in your KissAssist_ToonName.ini file.


Requires plugins* MQ2Cast, MQ2Exchange, MQ2Melee, MQ2MoveUtils, Mq2Rez, & MQ2Twist (Bards) , Extended Target Window and ninjadvloot.inc file.
* All plugins and files are included in our NA Official MQ2 Compile.

Usage - /mac kissassist TankName 95 or just target Main Tank and /mac kissassist.


General Settings
Role=Tank - Sets up tanking feature which has 2 modes, assist and stand alone.
Assist Mode will target the puller's/MA's mob and attack when mob comes into defined melee range.
  • Usage: Set Role=Tank and select MA normally
Stand Alone will target and attack any aggressive mob that comes into defined melee range.
  • Usage: Set Role=Tank and select yourself as MA
XTSlot Stands for Extended Target Slot. KissAssist uses the extended target to determine aggro. XTSlot (Default 1) allows people that have custom extended target to assign a custom slot #. The extended target slot you use should be set to auto.
CampRadius - the distance ReturnToCamp uses to determine how far you are from your intial camp spot.
CampRadiusExceed - Turns off ReturnToCamp if you move a large distance from camp. IE warp so toon doesn't try and run back.
ReturnToCamp - If ReturnToCamp=1 and you move out of the CampRadius it will move you back to that spot after fight. (Note: Set ChaseAssist to 0 if using).
ChaseAssist - If set to 1 macro will follow main assist around instead of returning to camp (Note: Set ReturnToCamp to 0 if using)
ChaseDistance - How close you want toon to follow main assist
MedOn - Turn medding feature on off. Auto detect mana or endurance depending on class
MedStart - What mana/endurance percentage to start medding at default is 20%
MedCombat=1 Turn off interrupt medding if mobs detected within camp radius. (Default 0)
TwistOn =1 Bard will twist during non combat. TwistOn=0 Bard will NOT twist during non combat thus preventing song aggro.
TwistWhat Song order to twist during non combat for MQ2Twist only valid i TwistOn=1 i.e. TwistWhat=7 10 4 6 5
RezAcceptOn =1 Turns on auto accept rez
AcceptInvitesOn =1 Accept ALL party invites
Back to Top

Melee Settings
AssistAt - Mob health to assist/attack at
MeleeOn - Turns physical melee on/off. (Note: Should be set to 0 for casters)
MeleeDistance - Mob needs to be within this distance or toon won't attack.
FaceMobOn=0/1 Turn off/on facing mob right before combat starts.
StickHow - Tell toon how to stick to mob when fighting. Any mq2moveutils /stick command should be valid. i.e !front, behindonce, snaproll etc
MeleeTwistOn =1 Bard can twist a different song list during combat. MeleeTwistOn=0 Bard will twist regular or not change order if TwistOn=1
MeleeTwistWhat - Song order to twist during combat for MQ2Twist only valid if MeleeTwistOn=1 i.e. MeleeTwistWhat==9 8 4 5 10
Back to Top

DPS Settings
DPSOn - Use spell/item/AA/disc casting feature. Requires MQ2cast
DPSSkip - Stop casting when mob reaches this health percentage default 20
DPSInterval - Amount of time in seconds between DPS casting
If you are nuking/doting too much or too fast you can slow down by increasing time between casts. (Default 5 seconds)
DPS1-8 List your spells in order of casting.

DPS Spells can use the following syntax to cast spells at different mob health percentages: Spell Name|% health to cast at as seen below.
Rich (BB code):
DPS2=Ikaav Blood|65
Beastlord example below
Rich (BB code):
[DPS]
DPSOn=1
DPSSkip=20
DPSInterval=5
DPS1=Sha's Legacy
DPS2=Ikaav Blood|65
DPS3=Bite of the Vitrik
DPS4=Frigid Lance Rk. II|25
DPS5=NULL
DPS6=NULL
DPS7=NULL
DPS8=NULL
Back to Top

Buffs Settings
BuffsOn - Turn buff feature on
Buffs1-15 - Buffs you want to keep up on yourself and group. Recognizes single, self and group buffs whether its AA/Spell/Item.

Unity & 2 part buffs like Unity of the Spirits must use the following syntax:
Buff Name|Dual|Spell Name. See shaman example below
Rich (BB code):
Buffs1=Exigent Focusing Rk. II|Dual|Talisman of Soul's Unity Rk. II
Mana Spells/AAs such as Paragon of Spirit/Canni are set in the following manner. Spell Name|Mana|% mana to cast at|% Health to to prevent casting.
The health setting is only needed for spells that might kill the cast such as Canni/Death Blossom. It can be left off other spells.
See example below:
Rich (BB code):
Buffs1=Paragon of Spirit|Mana|50
Buffs2=Focused Paragon of Spirits|Mana|80
Buffs1=Ancestral Covenant|Mana|90|20
Auras have 3 parts. The spell name|Aura|The buff name as it appears in your song window.
Auras Syntax: Spell Name|Aura|Song Window Buff See bard example below.
Rich (BB code):
Buffs7=Aura of the Poet Rk.II|Aura|Aura of the Poet Effect Rk.II
Mounts can also be used under the Buffs section as follows
Syntax: Mount Name|Mount see example below.
Rich (BB code):
Buffs1=Verdant Hedgerow Leaf|Mount
Back to Top

Heal Settings
HealsOn =1 Turns healing feature on.
Heals1-8 - Heals you want you use and percent health to heal at using spell/item/AA
  • KissAssist automatically detects single or group spells. Currently the feature also supports cleric epic 1.5/2.0 and Divine Arbitration AA
  • KissAssist heal feature works by watching each group members health and heals the the member at lowest health.
Heal Spells must use the following syntax: Spell Name|% health to heal at as seen below.
Rich (BB code):
Heals1=Devout Light Rk. II|50
Group Heal Spells percentage represents an Average Group Heath. ie 3 toons at 50 70 100 health = 220/3 = 73% averaged group health.
So if you set your spell to heal the group at 75 it will cast it as 73<75.
Rich (BB code):
Heals1=Devout Elixir Rk. II|75
You can specify a heal spell for the Main Assist Only with the MA tag after the heal percentage.
Rich (BB code):
Heals3=Promised Recuperation|85|MA
You can keep your heal spells listed and Turned Off with a 0 value as seen below
Rich (BB code):
Heals1=Devout Elixir Rk. II|0
Here is an example of the Heals section for an 85 cleric
Rich (BB code):
[Heals]
HealsOn=1
Heals1=Twelfth Night|35
Heals2=Devout Light Rk. II|50
Heals3=Promised Recuperation|85|MA
Heals4=Devout Elixir Rk. II|0
Heals5=Aegis of Superior Divinity|20
Heals6=Divine Arbitration|20
Heals7=Elixir of Expiation Rk. II|60
Heals8=NULL
Back to Top

Pet Settings
PetOn =1 Turns pet feature on. This includes all features below. If PetOn=0 will not summon,shrink or buff pet
PetSpell - Spell to summon no/dead pet
PetShrinkOn - Use pet shrink
PetShrinkSpell - Pet shrink spell default is Tiny Companion
PetHoldOn - use /pet hold on if you have the AA.
PetBuffs1-8 - Buffs you want to keep up on your pet AA/Spell/Item
Back to Top

Mez Settings
MezOn =1 Turn Mez on. =0 turns Mez feature off. (Default 0)
MezRadius - Radius to detect mobs surrounding enchanter/bard (Default 50)
MezMinLevel - Minimum level of mobs to mez within MezRadius
MezMaxLevel - Maximum level of mobs to mez within MezRadius
MezStopHPs - Mob HPs to stop mezzing at. (Default 80)
MezSpell - Your mez spell or song

Here is an example of the Mez section for a 65 Enchanter
Rich (BB code):
[Mez]
MezOn=1
MezRadius=50
MezMinLevel=55
MezMaxLevel=68
MezStopHPs=80
MezSpell=Bliss
Back to Top

In Game /Commands
/looton - Toggle looting on/off
/buffson - Toggle buffing on/off
/dpson - Toggle DPS casting on/off
/meleeon - Toggle melee attacks on/off
/healson - Toggle healing on/off
/peton - Toggle pets on/off
/mezon - Toggle mezzing on/off
/chase - Toggle chase/follow Main Tank on/off
/camphere - Toggle return to camp on/off
/autofireon - Toggle AutoFireOn to turn on/off ranged attacks.
/autorezon - Toggle AutoRezOn to turn on/off auto/battle rez feature.
Back to Top

Mecernary /callassist Settings
This feature will keep your mercenary from attacking until mobs health hits a defined percentage.
Requires you to turn off Auto Assist in Manage Mercenary Window.
MercOn=0 - Turns /callassist feature on/off
MercAssistAt=85 - Target health percentage for mercenary to assist at.
Auto Revive - Now auto detects if your merc is in group when the macro is started and will auto revive if merc dies. Beta
Back to Top

New Commands for next release just getting a head start.

KissAssist now creates a new additional file for zone information that keeps track of mob to pull and mez immuze mobs.

Sample KissAssist_Info.ini file
Rich (BB code):
[Valdeholm]
MobsToPull=tiger,lakeskater,ooze,void,ironbelly,mad
MezImmune=List up to 10 mobs. Use full names i.e. a green snake,a blue tiger,a wide eye ooze or NULL
[Blackfeather Roost]
MobsToPull=bear
MezImmune=Lucian,Adrian,a tame griifon,Fenith
[Old Bloodfields]
MobsToPull=kyv,ikaav,noc,ukun
MezImmune=Noddri,Kyris

General
EQBCOn=1 - Turn on/off eqbc messages for Mez, Heals, Pulls and Tanking in MQ2EQBC. A feature requested from KissAssist testers that use MQ2EQBC. Inspired by eqbc messages from Zbot. Each section has its own color.

Puller Roles.
These roles are designed to replicate all the features and more of the original Puller and Hunter macros that most people have used at one time or another. Puller and PullerTank bring the mobs back the camp and Hunter will actively run after and hunt mobs with in a predefined radius.

A new section [Pull], see below, will appear in your ini file. New zone sections will also appear in the zones you pull in so you can predefine mobs you want to pull or hunt. If left on default it will go after any mob with in the pull radius.

Role=Puller Coming Soon KissAssist 4.0
This role basically duplicates the oldie but goldie puller.mac. It will pull mobs within a certain radius back to camp for your party to kill. Target Main Assist for this role.

Role=PullerTank Coming Soon KissAssist 4.0
This role combines pulling and tanking. The character will pull mobs back to camp then engage them when within defined melee distance. Target your self for Main Assist with this role.

Role=Hunter Coming Soon KissAssist 4.0
This role duplicates the old hunter mac. It will run your character around a zone and hunt any or predefined mobs with the pull radius. Target yourself for Main Assist with this role.

Pull Settings Coming Soon KissAssist 4.0
[Pull]
PullWith=Melee/AA/Spell/Disc Declare what you want to pull mobs with. Melee will attack the mob to pull. AA/Spell/Disc will run up to about 65% range and cast on the mob to pull.
MaxRadius=400 Radius you want pull mobs with in
MaxZRange=50 Z Axis Radius you want pull mobs with in. Default =50 for hilly zones try 100-200
LosFailOn=0 - Pulling by default is based on line of sight mobs. If the macro is unable to find a line of sight mob to pull within 3 tries it pauses for 30s waiting for spawns, roamers etc. If LosFailOn=1 the macro will attempt to pull the closest mob not in line of sight on the 3rd attempt. Best out side where some mobs are behind tres, rocks, hills etc. If turned on inside you most likely will try to run through walls and other obstacles. Default is off.

KissAssisy_Info.Ini
[Zone Name]
MobsToPull="List up to 25 mobs. Can be partial names Example: rat,snake,bear" or ALL for all mobs

Rich (BB code):
[Pull]
PullWith=Melee
MaxRadius=400
MaxZRange=200
Back to Top

Attack Buffs Coming Soon KissAssist 4.0
A new feature in the DPS section is the addition of attack buffs. This supports short duration spells frequently cast during combat that targets group members. Spell like panther, yaulp, short term damage shields, etc

Attack buffs must use the following syntax:
Spell Name|Mob health to cast at|Target Yourself or Main Assist i.e Me or MA

90 lvl Shammy example
Rich (BB code):
DPS3=Talisman of the Tiger Rk. II|90|Me 
DPS4=Untamed Growth Rk. II|90|MA
DPS5=Lethargy Rk. II|90|MA

Buffs Self Only Coming Soon KissAssist 4.0
You can now select to cast single type buffs just on yourself. If you are pulling and don't want to cast SoW on the entire group use the following
syntax: Spell Name|Me

Example:
Rich (BB code):
Buffs6=Spirit of Wolf|Me
Coming Soon KissAssist 4.0
Back to Top

Heals
AutoRezOn=1 - Turns on auto Rez feature. Will rez any toon with in a radius of 100 of the Rezzer. Healspn=1 must be on for this feature to work.
AutoRezWith
=Blessing of Resurrection - Rez toon with AA/Item/Spell. This is a BATTLE REZ feature. The toon will try and rez anyone in the group that is dead during their heal rotation. Needs fine tuning.

Burn Settings Coming Soon KissAssist 4.0

A new feature is the Burn section. This feature was added at the the specific request of ALL my testers. I hadn't thought of it due my level 90s testing in the Moors :).
It can be used as a DPS boost, send your tank into a crazy defensive frenzy or healers to pop all group heals etc. When the definable burn event is invoked the character will give all priority to cast everything in the list.

BurnText=Decepticons Attack - The text to invoke the burn event. KissAssist should read this event text from any window BUT it is highly recommend to keep this command in the MQ2 or EQBC window. Default text "Decepticons Attack"
Usage: create a hot key /echo Decepticons Attack or /bc Decepticons Attack for the EQBC users out there.​
Burn1-6=spell/item/AA/disc to use in the burn event.
Default number of slots is 6 but can be increased by changing the number in macro to suit your needs. KissAssist will automatically add the new slots to the ini file.​

Change the 6 to how many slots you need
Rich (BB code):
 /declare Burn[6]                            string      outer
Beastlord example
Rich (BB code):
[Burn]
BurnText=Decepticons Attack
Burn1=Tuzil's Feralgia Rk. II
Burn2=Fundament: Third Spire of the Savage Lord
Burn3=Frenzy of Spirit
Burn4=Empathic Fury
Burn5=Bestial Alignment
Burn6=Nature's Fury Rk. II
Back to Top

AFKTools Settings Coming Soon KissAssist 4.0

This was inspired as a mini version of AnonymousHero's AHtools. Mainly for semi afk playing to let you know if anyone is near while you are eating or doing the laundry. Its a small feature that will beep if PCs come into defined ranged and will pause all macro actions other than killing adds in camp. It also has a zone wide GM not in invis mode detection that fires off the defined command /quit is the default. This will probably be expanded on in future version.

AFKToolsOn=1 - Turn on/off AFKTools feature
AFKGMAction=/quit - What to do if GM is detected in the zone. /quit default.
AFKPCRadius=150 - Radius to detect PC's. Will alert you and pause all macro activity.
Back to Top
 
Last edited:
Re: KissAssist.mac v1.0 Phase 1 02/28/2011

Example of the KissAsisst 3.4 ini file for my level 85 cleric
Rich (BB code):
[General]
XTSlot=1
CampRadius=30
CampRadiusExceed=400
ReturnToCamp=0
ChaseAssist=0
ChaseDistance=35
MedOn=1
MedStart=20
MedStop=90
DoLoot=0
RezAcceptOn=1
LootOn=0
[Melee] 
AssistAt=95
MeleeOn=0
MeleeDistance=75
StickHow=snaproll
[Buffs]
BuffsOn=1
Buffs1=Verdant Hedgerow Leaf|Mount
Buffs2=Spelunker's Belt of Many Pouches
Buffs3=Ancient Underfoot Lightstone
Buffs4=Hollowed Bone Section
Buffs5=Hand of Gallantry Rk. II
Buffs6=Armor of the Devout Rk. II
Buffs7=Rallied Palladium of Vie Rk. II
Buffs8=Aura of Loyalty Rk. II
Buffs9=Aura of the Pious|Aura|Aura of the Pious Effect
Buffs10=Reggund's Blessed Throatguard
Buffs11=NULL
Buffs12=NULL
Buffs13=NULL
Buffs14=NULL
Buffs15=NULL
[DPS]
DPSOn=1
DPSSkip=30
DPSInterval=15
DPS1=Mark of the Unsullied Rk. II
DPS2=Unwavering Hammer of Zeal Rk. II
DPS3=Chromassail
DPS4=NULL
DPS5=NULL
DPS6=NULL
DPS7=NULL
DPS8=NULL
[Heals]
Help=Format Spell|% to heal at i.e. Devout Light Rk. II|50
HealsOn=1
Heals1=Twelfth Night|35
Heals2=Devout Light Rk. II|65
Heals3=Promised Recuperation|85|MA
Heals4=Devout Elixir Rk. II|0
Heals5=Aegis of Superior Divinity|75
Heals6=Divine Arbitration|25
Heals7=Elixir of Expiation Rk. II|65
Heals8=NULL
Example of the KissAsisst 3.4 ini file for my level 85 bard
Rich (BB code):
[General]
XTSlot=1
CampRadius=30
CampRadiusExceed=300
ReturnToCamp=0
ChaseAssist=0
ChaseDistance=25
MedOn=1
MedStart=20
MedStop=90
TwistOn=1
TwistWhat=7 10 4 6 5 7
DoLoot=1
RezAcceptOn=1
[Melee]
AssistAt=95
MeleeOn=1
MeleeDistance=75
StickHow=snaproll
MeleeTwistOn=1
MeleeTwistWhat=9 8 4 5 10
[Buffs]
BuffsOn=1
Buffs=Phosphorescent Rapier of Dazzling Light
Buffs1=Cloak of Moss
Buffs2=Intruderbane Hook
Buffs3=Scorched Silk Belt
Buffs4=Lute of the Howler
Buffs5=Forgeflame Earring
Buffs6=Vermilionite Underbead
Buffs7=Aura of the Poet Rk.II|Aura|Aura of the Poet Effect Rk.II
Buffs8=NULL
Buffs9=NULL
Buffs10=NULL
Buffs11=NULL
Buffs12=NULL
Buffs13=NULL
Buffs14=NULL
Buffs15=NULL
[DPS]
DPSOn=1
DPSSkip=20
DPSInterval=5
DPS1=Boastful Bellow
DPS2=Lyrical Prankster
DPS3=NULL
DPS4=NULL
DPS5=NULL
DPS6=NULL
DPS7=NULL
DPS8=NULL
[Heals]
HealsOn=0
Help=Format Spell|% to heal at i.e. Devout Light Rk. II|50
Heals1=NULL
Heals2=NULL
Heals3=NULL
Heals4=NULL
Heals5=NULL
Heals6=NULL
Heals7=NULL
Heals8=NULL
 
Last edited:
Re: KissAssist.mac v1.0 Phase 1 02/28/2011

Version 1.2
Added follow main assist feature
Added definable stick feature

New version uploaded/posted
 
Re: KissAssist.mac v1.0 Phase 1 02/28/2011

can you make this put you behind the mob?

Change StickHow to your favorite /stick opiton. snaproll rear, !front or behindonce should send your toon somewhere behind the mob
 
Re: KissAssist.mac v1.3 Phase 1 03/19/2011

Version 1.3
Added ini file support
Fixed follow main assist feature

Macro updated 3/19/2011

KissAssist now creates an ini file.
All settings can now be editedin your KissAssist_ToonName.ini file
 
Last edited:
Re: KissAssist.mac v2.0 Phase 1 03/23/2011

Version 2.0
Now supports Melee or Caster classes
Kiss DPS Casting Feature added - Assign DPS/debuffs/nukes/dots in the form of Spells, AAs, Discs or Items
Pet support added
Medding feature added
Automatic detection of Mana or Endurance medding by class
 
Re: KissAssist.mac v2.5 Phase 1 03/27/2011

Version 2.5
Added Buff Feature - Recognizes single, self and group buffs whether its AA/Spell/Item.
Added Pet Buff Feature - Added Pet Buff Feature - Keep up pet buffs whether its AA/Spell/Item.
Macro now ends after zoning or camping
Fixed some ChaseAssist and Return to Camp issues
Fixed items in DPS not casting
Fixed DPS Discs not firing
Fixed pet shrink casting loop
Fixed caster pet not attacking
Updated settings info page
 
Last edited:
Re: KissAssist.mac v2.6 Updated 03/29/2011

Version 2.6
Added Bard Support with settings to turn on/off twisting during combat or non combat.
MQ2Twist song list can be set for both combat and non combat
 
Re: KissAssist.mac v2.6 Updated 03/29/2011

Great macro, I love it. Works alot better than mines thats for sure. Thanks alot
 
Re: KissAssist.mac v2.6 Updated 03/29/2011

One issue, I have noticed is that when your pet class is out of mana. It will not send pet in unless you are back at full mana.

Anyway you could fix this?
 
Re: KissAssist.mac v2.6 Updated 03/29/2011

One issue, I have noticed is that when your pet class is out of mana. It will not send pet in unless you are back at full mana.

Anyway you could fix this?

What class specifically did you notice it on?
Do you have medding on or off?
Are you Chasing the assist or returning to camp?
 
Re: KissAssist.mac v2.6 Updated 03/29/2011

Great macro, I love it. Works alot better than mines thats for sure. Thanks alot

Thanks its still a work in progress and needs testing but shaping up fast.
 
Re: KissAssist.mac v2.6 Updated 03/29/2011

What class specifically did you notice it on?
Do you have medding on or off?
Are you Chasing the assist or returning to camp?

I am using it with a mage, yep I have medding on and I have "Chase the assist" off, and "returning to camp" on. Those where default, just left em as is.
 
Last edited by a moderator:
Re: KissAssist.mac v2.6 Updated 03/29/2011

Nice job with the macro Maskoi. I been using it on my bard to twist when in combat. Stupid song aggro! They really need to do away with aggro on clarity song.
 
Re: KissAssist.mac v2.6 Updated 03/29/2011

Nice job with the macro Maskoi. I been using it on my bard to twist when in combat. Stupid song aggro! They really need to do away with aggro on clarity song.

Thanks I was having the same problem on my bard. Kept getting smacked on inc before warrior grabbed mob. I should add an xtarget check too so he can twist out of combat until aggro then stop. Get a few extra mana song tick in.
 
Re: KissAssist.mac v2.6 Updated 03/29/2011

I am using it with a mage, yep I have medding on and I have "Chase the assist" off, and "returning to camp" on. Those where default, just left em as is.

It stays inside the med loop until it reaches MedStop in settings default 90. If it sent the pet in before that it would put your toon in combat and negate the fast out of combat rmana regen. Is that what you are talking about?
 
Last edited:
Re: KissAssist.mac v2.7 Updated 03/29/2011

Version 2.7
Adjusted buffs delays for smoother operation. Macro was cycling too fast looking for buffs and messing up order.
Added DPS casting /echo on successful cast
 
Re: KissAssist.mac v2.6 Updated 03/29/2011

It stays inside the med loop until it reaches MedStop in settings default 90. If it sent the pet in before that it would put your toon in combat and negate the fast out of combat rmana regen. Is that what you are talking about?

Yep. Is there a way within the settings I can send in my pet regardless of my what my mana is at a certain %?

I know you can set med to 0, but I will eventually want to med.
 
Re: KissAssist.mac v2.7 Updated 03/29/2011

EDIT NVM mind I lied super easy fix /if (${Me.XTarget} > 0) /return will jump you out of the med loop if party has aggro. so will only med when no mobs in xtarget.

Rich (BB code):
|-------------------------------------------------------------------------------------
| SUB: DoWeMed
|-------------------------------------------------------------------------------------
    Sub DoWeMed
        /if (!${MedOn}) /return
        DEBUG DoWeMed enter
        /if (${Me.Pct${MedStat}}<${MedStart}) {
            /echo Please wait. Medding to ${MedStart}% ${MedStat}.
            /if (!${Me.Sitting}) /sit
            :wait_for_resume
            /delay 10
            /if (${Me.XTarget} > 0)  /return
            /if (${Me.Pct${MedStat}}<${MedStop}) /goto :wait_for_resume
            /echo I am now above ${MedStop}% ${MedStat} resuming activity.
            /if (${Me.Sitting}) /stand
        }
        DEBUG DoWeMed leave 
    /return

Also download 2.7 couple of fixes since i posted 2.6 earlier today.
 
Re: KissAssist.mac v2.7 Updated 03/29/2011

Sweet thanks for the fix!
 
Re: KissAssist.mac v3.0 Updated 03/31/2011

Version 3.0
Heal feature added. Watches group and heals lowest health according to your settings. (Pets heals not supported yet)
- Automatic detection of group or single heals.
- Supports cleric epic 1.5/2.0 and Divine Arbitration
Loot feature added via ninjadvloot
New healing casting spam/echo adding
Fixed some weirdness with twisting interfering with bards using their clickies
 
Re: KissAssist.mac v3.1 Updated 03/31/2011

Version 3.1
Added auto accept rez feature via MQ2Rez.
Fixed Adds detection. Was failing if main assist was dead or more than 200 ft away.
Adds will now break med if detected.
Tweaked combat sub.
Fixed toons targeting corpses with adds when assisting mercs.
Fixed cleric hammer pet for ever casting loop
 
Last edited:
Re: KissAssist.mac v3.2 Updated 04/03/2011

Version 3.2
Added Aura Feature goes in [Buffs] - Syntax Spell Name|Song Window Buff|Aura i.e. Buffs7=Aura of the Poet Rk.II|Aura of the Poet Effect Rk.II|Aura
Rewrote the heal routines. It was lacking
Fixed some targeting issues with healing.
Tweaked waiting for rez loop.
Added a heal check between DPS spells.
 
Last edited:
Re: KissAssist.mac v3.3 Updated 04/09/2011

Version 3.3
Support for Mounts Item or AAs added under Buffs section following syntax: Mount Name|Mount
Aura syntax changed for consistency i.e Aura of the Pious|Aura|Aura of the Pious Effect
Support added for Mana regen AA/Spells like Canni and Paragon of Spirit following syntax: Spell Name|Mana|% mana to cast at|% Health to to prevent casting.
2 part spell syntax changed for consistency i.e. Unity of Spirit now uses the Dual tag. Exigent Focusing Rk. II|Dual|Talisman of Soul's Unity Rk. II
Heal spells can now be designated for the Main Assist only as follows: Promised Recuperation|85|MA
Fixed an issue with Chaseassist settings.
Dedicated Extended Target Slot setting added for people with custom setups (Default 1)

Please take note of the new Buffs section syntax changes
 
Re: KissAssist.mac v3.4 Updated 04/10/2011

Version 3.4
Group Heal routine rewritten because it was experiencing errors.
 
Re: KissAssist.mac v3.4 Updated 04/10/2011

So far this macro is really good when it comes to DPS classes, thanks alot! However there are still some annoying issues with casters.

I play on the progression server, I assume this might be made for the standard servers?

For instance, if I am running kissassist with my enchanter, on progression we don't have any group buffs really. So if I want to buff using kissassist I have to buff the entire party including non dps with single cast spells such as haste. Which is impossible to keep on the party due to the time length of the spell, and of course my 1300 mana pool.

Is there a way, we can have it cast single spells on certain group members only?

Also the "standing" any dps spell class, will never sit and med until it reaches 20%. Then it won't do any dps/healing until it reaches the targeted % of mana. This sucks balls when you have a cleric that doesn't heal because it needs to med 40% more. Maybe putting in something like sitting after a experience kill would HELP alot. Atleast to help on downtime.

By putting aside those issues I have, this macro is awesome.
 
Re: KissAssist.mac v3.4 Updated 04/10/2011

So far this macro is really good when it comes to DPS classes, thanks alot! However there are still some annoying issues with casters.

I play on the progression server, I assume this might be made for the standard servers?

For instance, if I am running kissassist with my enchanter, on progression we don't have any group buffs really. So if I want to buff using kissassist I have to buff the entire party including non dps with single cast spells such as haste. Which is impossible to keep on the party due to the time length of the spell, and of course my 1300 mana pool.

Is there a way, we can have it cast single spells on certain group members only?

Also the "standing" any dps spell class, will never sit and med until it reaches 20%. Then it won't do any dps/healing until it reaches the targeted % of mana. This sucks balls when you have a cleric that doesn't heal because it needs to med 40% more. Maybe putting in something like sitting after a experience kill would HELP alot. Atleast to help on downtime.

By putting aside those issues I have, this macro is awesome.

If extended target is available on progression server it should work fine. I have tried to keep it non-expansion dependent other than extended target window.

The buff thing is group or everyone on single for now KISS (Keep it simple stupid) dictates that. When this macro evolves into the next Phase after several months of testing it might support that. Right now though I tried to gear it to the whats common in every class.

Get your free HoT mount that you can claim on all your toons lol. Not sure if available on progression or if mounts even exist
Rich (BB code):
BuffsOn=1
Buffs1=Verdant Hedgerow Leaf|Mount

or change
Rich (BB code):
MedOn=1
MedStart=90
MedStop=95

and toon will med at 90% mana. Aggro now should automatically bring any medding toon out of med mode
 
Re: KissAssist.mac v3.5 Updated 04/12/2011

Version 3.5
Added support for progression servers. Automatically replaces Extended Target functions with old school detect mobs in a radius if on either progression server.
Mez feature - single target released - Still in testing so don't grab 5 level 90 mobs and expect to live. AEMez coming soon.
Tweaked heal checks
 
Re: KissAssist.mac v3.5 Updated 04/12/2011

The issues I'm having is using more than one toon at a time and some weird code errors with this macro. I don't know if it's not supposed to work with more than one at once. If I start the mage first he'll work fine, if I start the ranger first, the mage does nothing. Also, I'm looking forward to a GoM function where he will cast his swarm pet or whatever other spell when GoM procs. I know this is a continuous project so I'm just adding my imput. I am loving it so far I have been botting my ranger friend while he's in Iraq. So far I didn't have anything to run him with so I'm grateful for him being able to assist me and buff and everything all by himself. The only issue I noticed with him is when I first started it it has some error code only on the ranger that says;
"No Such 'Character' member 'pct'
Kissassist.mac@457 (DoWeMed): /if(${me.pct${MedStat}}<${MedStop}) /goto:wait_for_resume
kissassist.mac@196 (main)" /call DoWeMed"

The mage starts up fine and doesn't say any of that junk. Also can you tell me how to fix the "DoCommand - Couldn't parse 'waypoint Morellscastle' I tried to do what you outlined in a post about fixing piggyzone to make it drop you at the door to MC and I see that message every time I zone now. I also haven't made it drop me at the door it still leaves me at the zone in at thulehouse2. I'm using /zone thulehouse2 morellscastle that's the correct function to make it drop you at that waypoint right? I must have done something wrong. When I set the waypoint to MC I was standing where I wanted it to be in thule upper. Do I need to be in MC while setting the waypoint? I am probably doing it all wrong, I am fairly new to the MQ scene and I'm not a programmer so I need simplicity, lol.

Thanks again for the great stuff you guys do.
 
Re: KissAssist.mac v3.5 Updated 04/12/2011

The issues I'm having is using more than one toon at a time and some weird code errors with this macro. I don't know if it's not supposed to work with more than one at once. If I start the mage first he'll work fine, if I start the ranger first, the mage does nothing. Also, I'm looking forward to a GoM function where he will cast his swarm pet or whatever other spell when GoM procs. I know this is a continuous project so I'm just adding my imput. I am loving it so far I have been botting my ranger friend while he's in Iraq. So far I didn't have anything to run him with so I'm grateful for him being able to assist me and buff and everything all by himself. The only issue I noticed with him is when I first started it it has some error code only on the ranger that says;
"No Such 'Character' member 'pct'
Kissassist.mac@457 (DoWeMed): /if(${me.pct${MedStat}}<${MedStop}) /goto:wait_for_resume
kissassist.mac@196 (main)" /call DoWeMed"

The mage starts up fine and doesn't say any of that junk. Also can you tell me how to fix the "DoCommand - Couldn't parse 'waypoint Morellscastle' I tried to do what you outlined in a post about fixing piggyzone to make it drop you at the door to MC and I see that message every time I zone now. I also haven't made it drop me at the door it still leaves me at the zone in at thulehouse2. I'm using /zone thulehouse2 morellscastle that's the correct function to make it drop you at that waypoint right? I must have done something wrong. When I set the waypoint to MC I was standing where I wanted it to be in thule upper. Do I need to be in MC while setting the waypoint? I am probably doing it all wrong, I am fairly new to the MQ scene and I'm not a programmer so I need simplicity, lol.

Thanks again for the great stuff you guys do.
You should be able to run this on as many toons as you can box.

Rich (BB code):
"No Such 'Character' member 'pct' 
Kissassist.mac@457 (DoWeMed): /if(${me.pct${MedStat}}<${MedStop}) /goto:wait_for_resume
kissassist.mac@196 (main)" /call DoWeMed"
I will look at this and make sure rangers are correctly coded for mana detection.

I will add some GOM code soon. I had forgot about it and it should be fairly easy .

open up your mq2piggyzone.ini file in your release folder and paste this at the bottom. If you have another morells entry delete it first.
Rich (BB code):
[thulehouse2]
morells=872.43 -1120.83 131 381
So it look some thing like
Rich (BB code):
714=phinterior3a1 "House Interior"
715=phinterior1a1 "House Interior"
716=phinterior3a2 "House Interior"
717=phinterior3a3 "House Interior"
718=phinterior1a3 "House Interior"
719=phinterior1a3 "House Interior"
720=phinterior1b1 "Dragon House Interior"
723=phinterior1d1 "Dragon House Interior"

[thulehouse2]
morells=872.43 -1120.83 131 381

2. /plugin mq2piggyzone unload

3. /plugin mq2piggyzone 4. /zone thulehouse2 morells

4. /zone thulehouse2 morells

Thanks for the input I am anxious to shake out all the bugs now since the macro is 90% complete
 
Re: KissAssist.mac v3.5 Updated 04/12/2011

Rich (BB code):
"No Such 'Character' member 'pct' 
Kissassist.mac@457 (DoWeMed): /if(${me.pct${MedStat}}<${MedStop}) /goto:wait_for_resume
kissassist.mac@196 (main)" /call DoWeMed"

Fixed Ranger mana check same version new file uploaded.

Redcented for finding a bug
 
Re: KissAssist.mac v3.5 Updated 04/12/2011

Version 3.5
Added support for progression servers. Automatically replaces Extended Target functions with old school detect mobs in a radius if on either progression server.
Mez feature - single target released - Still in testing so don't grab 5 level 90 mobs and expect to live. AEMez coming soon.
Tweaked heal checks
Ranger mana check fixed

Same version new file uploaded
 
Re: KissAssist.mac v3.5 Updated 04/12/2011

Just started using it today (3.5)

For some reason none of the toons will med, all ini are configured proper:

MedOn=1
MedStart=90
MedStop=100

They wont sit at all, any idea?
 
Re: KissAssist.mac v3.5 Updated 04/12/2011

What leveL class and sever?
 
Re: KissAssist.mac v3.5 Updated 04/12/2011

Vulak progression server

class, cleric & necro lvl 26
 
Re: KissAssist.mac v3.5 Updated 04/12/2011

K I need to test stuff on tlp servers anyways I will look into this tonight after I get home from work.
 
Re: KissAssist.mac v3.5 Updated 04/12/2011

Just started using it today (3.5)

For some reason none of the toons will med, all ini are configured proper:

MedOn=1
MedStart=90
MedStop=100

They wont sit at all, any idea?

Medding seems to be working fine on TLP servers . These settings are to high and are too close together try like 50 90

Rich (BB code):
MedOn=1
MedStart=50
MedStop=90
 
KissAssist Release KissAssist.mac v3.9 Updated 07/20/2011

Users who are viewing this thread

Back
Top
Cart