What's new
  • Visit Rebornbuddy
  • Visit Panda Profiles
  • Visit LLamamMagic
  • Visit Resources
  • Visit Downloads
  • Visit Portal

[Plugin] [Example] Autofollower/Healer Base

2face

New Member
Joined
Feb 1, 2014
Messages
27
Reaction score
3
Hi,

wanted to share this very basic plugin which was requested by traderjoe in this thread: Linkl
I wrote it straight from head just browsing through the API for the needed functions. I did not test this at all.(Need second account for this) But it compiles fine. It's very basic and it will follow the party leader around and tries to stay in heal/follow range and heals the lowest partymember if it has low hp. It is really just an example and not tested with a second account/party.
Feel free to improve it and post your results here !

Adjust those values on top to make it work for your healing skills:
Code:
  private Double _followRange = 10.0;
  private Double _healRange = 15.0;
  private String _healSkill1 = "ABC";
  private String _healSkill2 = "ABC2";
  private Double _healPercentage = 80.0;
Code:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using ArcheBuddy.Bot.Classes;

namespace Follower{
    public class Follower : Core
    {
        public static string GetPluginAuthor()
        {
            return "2face";
        }

        public static string GetPluginVersion()
        {
            return "1.0.0.0";
        }

        public static string GetPluginDescription()
        {
            return "Follower Plugin";
        } 
        
        private Double _followRange = 10.0;
        private Creature _leader = null;
        private Double _healRange = 15.0;
        private String _healSkill1 = "ABC";
        private String _healSkill2 = "ABC2";
        private Double _healPercentage = 80.0;
        //Call on plugin start
        public void PluginRun()
        {    
            _leader = getPartyLeaderObj();
            if(_leader == null || _leader == me){
                Log("Please set leader");
            }else{
                Start();
            }
            
        }  
        
        public void Start(){
            while(true){
                Thread.Sleep(50);
                if(_leader != null){
                    if(_leader.inFight && me.dist(_leader) < _healRange){
                        healRoutine();
                    }else{
                        moveToPlayer(_leader);  
                    }
                    
                }
                
            }
        }
        
        public Creature getLowestHPMember(){
            Creature obj = null;
            Double lowestHp = 99999999; 
            Double pCurHP = 100;
            foreach(var member in getPartyMembers()){
                pCurHP = member.maxhp * (member.curhp / 100); 
                if(pCurHP < lowestHp){
                    lowestHp = pCurHP;
                    obj = member.obj;
                }
            }
            return obj;
        }
        
        public bool hasLowHP(Creature target){
            return (target.maxHp * (target.hp * 100) <= _healPercentage);
        }
        
        public void healRoutine(){
            Creature healTarget = getLowestHPMember();
            if(healTarget != null){
                if(me.dist(healTarget) < _healRange){
                    if(me.target != healTarget){
                        SetTarget(healTarget);
                        if(hasLowHP(healTarget)){
                            if(healTarget == me){
                                UseSkillAndWait(_healSkill1, true);
                                UseSkillAndWait(_healSkill2, true);
                            }else{
                                UseSkillAndWait(_healSkill1, false);
                                UseSkillAndWait(_healSkill1, false);
                            }
                            
                        }
                    }
                }else{
                    moveToPlayer(healTarget);
                }
            }
        }
        
        public void UseSkillAndWait(string skillName, bool selfTarget = false)
        {
            //wait cooldowns first, before we try to cast skill
            while (me.isCasting || me.isGlobalCooldown)
                Thread.Sleep(50);
            if (!UseSkill(skillName, true, selfTarget))
            {
                if (me.target != null && GetLastError() == LastError.NoLineOfSight)
                {
                    //No line of sight, try come to target.
                    if (dist(me.target) <= 5)
                        ComeTo(me.target, 2);
                    else if (dist(me.target) <= 10)
                        ComeTo(me.target, 3);
                    else if (dist(me.target) < 20)
                        ComeTo(me.target, 8);
                    else
                        ComeTo(me.target, 8);
                }
            }      
            //wait cooldown again, after we start cast skill
            while (me.isCasting || me.isGlobalCooldown)
                Thread.Sleep(50);
        }
        
        
        public void moveToPlayer(Creature obj){
            ComeTo(obj, _followRange);
        }

        //Call on plugin stop
        public void PluginStop()
        {
        }
    }
}
 
Проверял кто-нибудь, работает?
Somebody checked, works?
 
I'd be willing to donate.

I just want my second account on my second computer to auto-follow my main.
When main starts combat, it will assist and go through attack rotation.
Set a combo of small heal or big heal. When a member of the group is down like 80% it does that combo, if it detects 50% or below does big heal combo, while paying attention to lowest health member of the group.
If healths are fine, return to assisting main with attack rotation.
If combat is finished, return to auto follow.

I'd straight up pay for it if it was stable and had the ability to react to mob scripts. Like for example if I ran Burnt Castle dungeon, it would move away from the lighting balls of the second boss, or ran to the safe spot of the third boss.
 
The script is bugged. The Char will follow and search the partyleader, but he dont heal anything at all and dont use skills or switch targets.
Any help here?
 
Code:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using ArcheBuddy.Bot.Classes;

namespace Follower
{
    public class Follower : Core
    {
        public static string GetPluginAuthor()
        {
            return "2face/Mod by Zagreb";
        }

        public static string GetPluginVersion()
        {
            return "1.0.0.0";
        }

        public static string GetPluginDescription()
        {
            return "Follower Plugin";
        }

        private Double _followRange = 15.0;
        private Creature _leader = null;
        private Double _healRange = 15.0;
        private String _healSkill1 = "Antithesis";
        private String _healSkill2 = "Mirror Light";
        private String _healSkill3 = "Resurgence";
        private String _healSkill4 = "Fervent Healing";
        private String _healSkill5 = "Mend";

        private List<Creature> DeadPpl = new List<Creature>();

        public void PluginRun()
        {
            _leader = getPartyLeaderObj();
            if (_leader == null || _leader == me)
            {
                Log("Please set leader");
            }
            else
            {
                Start();
            }
        }

        public void Start()
        {
            while (true)
            {
                Thread.Sleep(50);
                if (_leader != null)
                {
                    if (_leader.inFight && me.dist(_leader) < _healRange)
                    {
                        CheckBuffs();
                        healRoutine();
                    }
                    else
                    {
                        moveToPlayer(_leader);
                        CheckBuffs();
                    }

                }

            }
        }

        public void CheckBuffs()
        {
            foreach (PartyMember member in getPartyMembers())
            {
                SetTarget(member.obj);
                Buff();
                Thread.Sleep(2150); //Set to 5150 if you're lvl55 and learned Whirlwind's Blessing :D
            }
        }

        public void Buff()
        {
            if (isSkillLearned("Aranzeb's Boon") == true)
            {
                if (!me.target.getBuffs().Exists(b => b.id == 2955) &&
                    !me.target.getBuffs().Exists(b => b.id == 2956) &&
                    !me.target.getBuffs().Exists(b => b.id == 26903))
                {
                    UseSkill("Aranzeb's Boon");
                    Thread.Sleep(2150);
                }
            }

            if (isSkillLearned("Whirlwind's Blessing") == true)
            {
                if (!me.target.getBuffs().Exists(b => b.id == 6851))
                {
                    UseSkill("Whirlwind's Blessing");
                }
            }
        }

        public Creature getLowestHPMember()
        {
            Creature obj = null;
            Double lowestHp = 99999999;
            Double pCurHP = 100;

            foreach (var member in getPartyMembers())
            {
                pCurHP = member.curhp * 100 / member.maxhp;

                if (pCurHP < lowestHp && !DeadPpl.Contains(member.obj))
                {
                    lowestHp = pCurHP;
                    obj = member.obj;
                }
            }
            return obj;
        }


        public int hasLowHP(Creature target)
        {
            return target.hp * 100 / target.maxHp;
        }

        public void healRoutine()
        {
            Creature healTarget = getLowestHPMember();
            
            if (healTarget != null)
            {
                if (me.dist(healTarget) < _healRange)
                {
                    if (me.target != healTarget)
                    {
                        SetTarget(healTarget);

                        if (hasLowHP(healTarget) < 90 && hasLowHP(healTarget) > 85)
                        {
                            if (healTarget == me)
                            {
                                UseSkillAndWait(_healSkill3, true);
                            }
                            else
                            {
                                UseSkillAndWait(_healSkill3, false);
                            }

                        }
                        if (hasLowHP(healTarget) < 80 && hasLowHP(healTarget) > 70)
                        {
                            if (healTarget == me)
                            {
                                UseSkillAndWait(_healSkill4, true);
                            }
                            else
                            {
                                UseSkillAndWait(_healSkill4, false);
                            }

                        }
                        if (hasLowHP(healTarget) < 70 && hasLowHP(healTarget) > 60)
                        {
                            if (healTarget == me)
                            {
                                UseSkillAndWait(_healSkill2, true);
                                UseSkillAndWait(_healSkill3, true);
                                UseSkillAndWait(_healSkill4, true);
                                UseSkillAndWait(_healSkill4, true);
                            }
                            else
                            {
                                UseSkillAndWait(_healSkill2, false);
                                UseSkillAndWait(_healSkill3, false);
                                UseSkillAndWait(_healSkill4, false);
                                UseSkillAndWait(_healSkill4, false);
                            }

                        }
                        if (hasLowHP(healTarget) <= 50 && hasLowHP(healTarget) > 45)
                        {
                            if (healTarget == me)
                            {
                                UseSkillAndWait(_healSkill2, true);
                                UseSkillAndWait(_healSkill3, true);
                                UseSkillAndWait(_healSkill4, true);
                                UseSkillAndWait(_healSkill4, true);
                                UseSkillAndWait(_healSkill5, true);
                                UseSkillAndWait(_healSkill1, true);
                            }
                            else
                            {
                                UseSkillAndWait(_healSkill2, false);
                                UseSkillAndWait(_healSkill3, false);
                                UseSkillAndWait(_healSkill4, false);
                                UseSkillAndWait(_healSkill4, false);
                                UseSkillAndWait(_healSkill5, false);
                                UseSkillAndWait(_healSkill1, false);
                            }

                        }
                        if (hasLowHP(healTarget) <= 45)
                        {
                            if (healTarget == me)
                            {
                                UseSkillAndWait(_healSkill2, true);
                                UseSkillAndWait(_healSkill3, true);
                                UseSkillAndWait(_healSkill4, true);
                                UseSkillAndWait(_healSkill4, true);
                                UseSkillAndWait(_healSkill5, true);
                                UseSkillAndWait(_healSkill1, true);
                                UseSkillAndWait(_healSkill1, true);
                                UseSkillAndWait(_healSkill1, true);
                            }
                            else
                            {
                                UseSkillAndWait(_healSkill2, false);
                                UseSkillAndWait(_healSkill3, false);
                                UseSkillAndWait(_healSkill4, false);
                                UseSkillAndWait(_healSkill4, false);
                                UseSkillAndWait(_healSkill5, false);
                                UseSkillAndWait(_healSkill1, false);
                                UseSkillAndWait(_healSkill1, false);
                                UseSkillAndWait(_healSkill1, false);
                            }

                        }
                        if (hasLowHP(healTarget) <= 0)
                        {
                            if (isSkillLearned("Revive") == true)
                            {
                                if (me.dist(healTarget) > 25 && !(me.dist(healTarget) > 100))
                                {
                                    moveToPlayer(healTarget);
                                    UseSkillAndWait("Revive");
                                }
                                else
                                {
                                    UseSkillAndWait("Revive");
                                }
                            }
                            else
                            {
                                DeadPpl.Add(healTarget);
                            }

                        }
                    }
                }
                else
                {
                    moveToPlayer(healTarget);
                }
            }
        }

        public void UseSkillAndWait(string skillName, bool selfTarget = false)
        {
            //wait cooldowns first, before we try to cast skill
            while (me.isCasting || me.isGlobalCooldown)
            {
                Thread.Sleep(50);
            }

            if (!UseSkill(skillName, true, selfTarget))
            {
                if (me.target != null && GetLastError() == LastError.NoLineOfSight)
                {
                    //No line of sight, try come to target.
                    if (dist(me.target) <= 5)
                        ComeTo(me.target, 2);
                    else if (dist(me.target) <= 10)
                        ComeTo(me.target, 3);
                    else if (dist(me.target) < 20)
                        ComeTo(me.target, 8);
                    else
                        ComeTo(me.target, 8);
                }
            }
            //wait cooldown again, after we start cast skill
            while (me.isCasting || me.isGlobalCooldown)
            {
                Thread.Sleep(50);
            }
        }


        public void moveToPlayer(Creature obj)
        {
            ComeTo(obj, _followRange);
        }

        //Call on plugin stop
        public void PluginStop()
        {
        }
    }
}

Mod. P.s. not tested =)
 
Last edited:
I'd be willing to donate.

I just want my second account on my second computer to auto-follow my main.
When main starts combat, it will assist and go through attack rotation.
Set a combo of small heal or big heal. When a member of the group is down like 80% it does that combo, if it detects 50% or below does big heal combo, while paying attention to lowest health member of the group.
If healths are fine, return to assisting main with attack rotation.
If combat is finished, return to auto follow.

I'd straight up pay for it if it was stable and had the ability to react to mob scripts. Like for example if I ran Burnt Castle dungeon, it would move away from the lighting balls of the second boss, or ran to the safe spot of the third boss.

I am looking for this plugin too.. did you find ?
 
Если я правильно понял, я дожен находиться с ботом в пати, а бот или бить мобов или лечить, так? Но бот ничего не делает, просто стоит на месте и поочередно берет в таргет меня, себя и моба которого я бью. Подскажите пожалуйста, может я что-то делаю не так*
 
Code:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Collections.Generic;
using System.Linq;
using ArcheBuddy.Bot.Classes;

namespace Follower
{
    public class Follower : Core
    {
        public static string GetPluginAuthor()
        {
            return "2face/Mod by Zagreb";
        }

        public static string GetPluginVersion()
        {
            return "1.0.0.0";
        }

        public static string GetPluginDescription()
        {
            return "Follower Plugin";
        }

        private Double _followRange = 15.0;
        private Creature _leader = null;
        private Double _healRange = 15.0;
        private String _healSkill1 = "Antithesis";
        private String _healSkill2 = "Mirror Light";
        private String _healSkill3 = "Resurgence";
        private String _healSkill4 = "Fervent Healing";
        private String _healSkill5 = "Mend";

        private List<Creature> DeadPpl = new List<Creature>();

        public void PluginRun()
        {
            _leader = getPartyLeaderObj();
            if (_leader == null || _leader == me)
            {
                Log("Please set leader");
            }
            else
            {
                Start();
            }
        }

        public void Start()
        {
            while (true)
            {
                Thread.Sleep(50);
                if (_leader != null)
                {
                    if (_leader.inFight && me.dist(_leader) < _healRange)
                    {
                        CheckBuffs();
                        healRoutine();
                    }
                    else
                    {
                        moveToPlayer(_leader);
                        CheckBuffs();
                    }

                }

            }
        }

        public void CheckBuffs()
        {
            foreach (PartyMember member in getPartyMembers())
            {
                SetTarget(member.obj);
                Buff();
                Thread.Sleep(2150); //Set to 5150 if you're lvl55 and learned Whirlwind's Blessing :D
            }
        }

        public void Buff()
        {
            if (isSkillLearned("Aranzeb's Boon") == true)
            {
                if (!me.target.getBuffs().Exists(b => b.id == 2955) &&
                    !me.target.getBuffs().Exists(b => b.id == 2956) &&
                    !me.target.getBuffs().Exists(b => b.id == 26903))
                {
                    UseSkill("Aranzeb's Boon");
                    Thread.Sleep(2150);
                }
            }

            if (isSkillLearned("Whirlwind's Blessing") == true)
            {
                if (!me.target.getBuffs().Exists(b => b.id == 6851))
                {
                    UseSkill("Whirlwind's Blessing");
                }
            }
        }

        public Creature getLowestHPMember()
        {
            Creature obj = null;
            Double lowestHp = 99999999;
            Double pCurHP = 100;

            foreach (var member in getPartyMembers())
            {
                pCurHP = member.curhp * 100 / member.maxhp;

                if (pCurHP < lowestHp && !DeadPpl.Contains(member.obj))
                {
                    lowestHp = pCurHP;
                    obj = member.obj;
                }
            }
            return obj;
        }


        public int hasLowHP(Creature target)
        {
            return target.hp * 100 / target.maxHp;
        }

        public void healRoutine()
        {
            Creature healTarget = getLowestHPMember();
            
            if (healTarget != null)
            {
                if (me.dist(healTarget) < _healRange)
                {
                    if (me.target != healTarget)
                    {
                        SetTarget(healTarget);

                        if (hasLowHP(healTarget) < 90 && hasLowHP(healTarget) > 85)
                        {
                            if (healTarget == me)
                            {
                                UseSkillAndWait(_healSkill3, true);
                            }
                            else
                            {
                                UseSkillAndWait(_healSkill3, false);
                            }

                        }
                        if (hasLowHP(healTarget) < 80 && hasLowHP(healTarget) > 70)
                        {
                            if (healTarget == me)
                            {
                                UseSkillAndWait(_healSkill4, true);
                            }
                            else
                            {
                                UseSkillAndWait(_healSkill4, false);
                            }

                        }
                        if (hasLowHP(healTarget) < 70 && hasLowHP(healTarget) > 60)
                        {
                            if (healTarget == me)
                            {
                                UseSkillAndWait(_healSkill2, true);
                                UseSkillAndWait(_healSkill3, true);
                                UseSkillAndWait(_healSkill4, true);
                                UseSkillAndWait(_healSkill4, true);
                            }
                            else
                            {
                                UseSkillAndWait(_healSkill2, false);
                                UseSkillAndWait(_healSkill3, false);
                                UseSkillAndWait(_healSkill4, false);
                                UseSkillAndWait(_healSkill4, false);
                            }

                        }
                        if (hasLowHP(healTarget) <= 50 && hasLowHP(healTarget) > 45)
                        {
                            if (healTarget == me)
                            {
                                UseSkillAndWait(_healSkill2, true);
                                UseSkillAndWait(_healSkill3, true);
                                UseSkillAndWait(_healSkill4, true);
                                UseSkillAndWait(_healSkill4, true);
                                UseSkillAndWait(_healSkill5, true);
                                UseSkillAndWait(_healSkill1, true);
                            }
                            else
                            {
                                UseSkillAndWait(_healSkill2, false);
                                UseSkillAndWait(_healSkill3, false);
                                UseSkillAndWait(_healSkill4, false);
                                UseSkillAndWait(_healSkill4, false);
                                UseSkillAndWait(_healSkill5, false);
                                UseSkillAndWait(_healSkill1, false);
                            }

                        }
                        if (hasLowHP(healTarget) <= 45)
                        {
                            if (healTarget == me)
                            {
                                UseSkillAndWait(_healSkill2, true);
                                UseSkillAndWait(_healSkill3, true);
                                UseSkillAndWait(_healSkill4, true);
                                UseSkillAndWait(_healSkill4, true);
                                UseSkillAndWait(_healSkill5, true);
                                UseSkillAndWait(_healSkill1, true);
                                UseSkillAndWait(_healSkill1, true);
                                UseSkillAndWait(_healSkill1, true);
                            }
                            else
                            {
                                UseSkillAndWait(_healSkill2, false);
                                UseSkillAndWait(_healSkill3, false);
                                UseSkillAndWait(_healSkill4, false);
                                UseSkillAndWait(_healSkill4, false);
                                UseSkillAndWait(_healSkill5, false);
                                UseSkillAndWait(_healSkill1, false);
                                UseSkillAndWait(_healSkill1, false);
                                UseSkillAndWait(_healSkill1, false);
                            }

                        }
                        if (hasLowHP(healTarget) <= 0)
                        {
                            if (isSkillLearned("Revive") == true)
                            {
                                if (me.dist(healTarget) > 25 && !(me.dist(healTarget) > 100))
                                {
                                    moveToPlayer(healTarget);
                                    UseSkillAndWait("Revive");
                                }
                                else
                                {
                                    UseSkillAndWait("Revive");
                                }
                            }
                            else
                            {
                                DeadPpl.Add(healTarget);
                            }

                        }
                    }
                }
                else
                {
                    moveToPlayer(healTarget);
                }
            }
        }

        public void UseSkillAndWait(string skillName, bool selfTarget = false)
        {
            //wait cooldowns first, before we try to cast skill
            while (me.isCasting || me.isGlobalCooldown)
            {
                Thread.Sleep(50);
            }

            if (!UseSkill(skillName, true, selfTarget))
            {
                if (me.target != null && GetLastError() == LastError.NoLineOfSight)
                {
                    //No line of sight, try come to target.
                    if (dist(me.target) <= 5)
                        ComeTo(me.target, 2);
                    else if (dist(me.target) <= 10)
                        ComeTo(me.target, 3);
                    else if (dist(me.target) < 20)
                        ComeTo(me.target, 8);
                    else
                        ComeTo(me.target, 8);
                }
            }
            //wait cooldown again, after we start cast skill
            while (me.isCasting || me.isGlobalCooldown)
            {
                Thread.Sleep(50);
            }
        }


        public void moveToPlayer(Creature obj)
        {
            ComeTo(obj, _followRange);
        }

        //Call on plugin stop
        public void PluginStop()
        {
        }
    }
}

Mod. P.s. not tested =)

Tested this out. It compiled fine and while it did cast some heals on injured party members, it wasn't highly effective. It also keeps them at a long distance, not a normal auto follow distance, nor is there any kind of attacking or assisting involved. It looks like a good start though. But it couldn't keep a level 46 from dying to a group of lvl 19 mobs that i tested it out on. So not quite ready for dungeon crawls.
 
Tested this out. It compiled fine and while it did cast some heals on injured party members, it wasn't highly effective. It also keeps them at a long distance, not a normal auto follow distance, nor is there any kind of attacking or assisting involved. It looks like a good start though. But it couldn't keep a level 46 from dying to a group of lvl 19 mobs that i tested it out on. So not quite ready for dungeon crawls.

Well, I never played a healer in this game, so I'm bad at heal spells rotation =) Change it to a better one.
About attacking/assisting - it only heals party members and folows party leader, no attacking. Although it should buff party members in my mod version.

A bit modified and more intuitive naming.

Code:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;
using ArcheBuddy.Bot.Classes;

namespace Follower
{
    public class Follower : Core
    {
        public static string GetPluginAuthor()
        {
            return "2face/Mod by Zagreb";
        }

        public static string GetPluginVersion()
        {
            return "1.0.0.0";
        }

        public static string GetPluginDescription()
        {
            return "Follower Plugin";
        }

        private Creature _leader = null;    // Don't change this.
        private Double _followRange = 5.0;  // Well, it will keap folowing party leader at this range.
        private Double _healRange = 20.0;   // Within this distance it will cast heal at party members.
        private String Antithesis = "Antithesis";            //           
        private String MirrorLight = "Mirror Light";         //             
        private String Resurgence = "Resurgence";            // <-- Skill names. Find them in code and change rotation.        
        private String FerventHealing = "Fervent Healing";   //
        private String Mend = "Mend";                        //  

        private List<Creature> DeadPpl = new List<Creature>();
        private bool Loop;

        public void PluginRun()
        {
            Loop = true;

            _leader = getPartyLeaderObj();
            if (_leader == null || _leader == me)
            {
                Log("Please set leader");
            }
            else
            {
                Start();
            }
        }

        public void Start()
        {
            while (Loop == true)
            {
                Thread.Sleep(200);

                if (_leader != null)
                {
                    if (_leader.inFight && me.dist(_leader) < _healRange)
                    {
                        CheckBuffs();
                        healRoutine();
                    }
                    else
                    {
                        CheckBuffs();
                        moveToPlayer(_leader);
                    }
                }
            }
        }

        public void CheckBuffs()
        {
            while (me.isCasting)
            {
                Thread.Sleep(500);
            }

            foreach (PartyMember member in getPartyMembers())
            {
                if (isSkillLearned("Aranzeb's Boon") == true)
                {
                    if (!member.obj.getBuffs().Exists(b => b.id == 2955) &&
                        !member.obj.getBuffs().Exists(b => b.id == 2956) &&
                        !member.obj.getBuffs().Exists(b => b.id == 26903))
                    {
                        if (member.obj == me)
                        {
                            UseSkillAndWait("Aranzeb's Boon", true);
                        }
                        if (me.dist(member.obj) > _healRange && !(me.dist(member.obj) > 20))
                        {
                            ComeTo(member.obj, _healRange);
                            UseSkillAndWait("Aranzeb's Boon", false);
                        }
                        if (me.dist(member.obj) <= _healRange)
                        {
                            UseSkillAndWait("Aranzeb's Boon", false);
                        }
                    }
                }
                if (isSkillLearned("Whirlwind's Blessing") == true)
                {
                    if (!member.obj.getBuffs().Exists(b => b.id == 6851))
                    {
                        if (member.obj == me)
                        {
                            UseSkillAndWait("Whirlwind's Blessing", true);
                        }
                        if (me.dist(member.obj) > _healRange && !(me.dist(member.obj) > 20))
                        {
                            ComeTo(member.obj, _healRange);
                            UseSkillAndWait("Whirlwind's Blessing", false);
                        }
                        if (me.dist(member.obj) <= _healRange)
                        {
                            UseSkillAndWait("Whirlwind's Blessing", false);
                        }
                    }
                }
                Thread.Sleep(2150); //Set to 5150 if you're lvl55 and learned Whirlwind's Blessing :D
            }
        }

        public Creature getLowestHPMember()
        {
            Creature obj = null;
            Double lowestHp = 99999999;
            Double pCurHP = 100;

            foreach (var member in getPartyMembers())
            {
                pCurHP = member.curhp * 100 / member.maxhp;

                if (pCurHP < lowestHp && !DeadPpl.Contains(member.obj))
                {
                    lowestHp = pCurHP;
                    obj = member.obj;
                }
            }
            return obj;
        }

        public double hasLowHP(Creature member)
        {
            return member.hp * 100 / member.maxHp;
        }

        public void healRoutine()
        {
            Creature healTarget = getLowestHPMember();
            
            if (healTarget != null)
            {
                if (me.dist(healTarget) < _healRange)
                {
                    if (hasLowHP(healTarget) < 90 && hasLowHP(healTarget) > 85)
                    {
                        if (healTarget == me)
                        {
                            UseSkillAndWait(Resurgence, true);
                        }
                        else
                        {
                            UseSkillAndWait(Resurgence, false);
                        }
                    }
                    if (hasLowHP(healTarget) < 80 && hasLowHP(healTarget) > 70)
                    {
                        if (healTarget == me)
                        {
                            UseSkillAndWait(FerventHealing, true);
                        }
                        else
                        {
                            UseSkillAndWait(FerventHealing, false);
                        }
                    }
                    if (hasLowHP(healTarget) < 70 && hasLowHP(healTarget) > 60)
                    {
                        if (healTarget == me)
                        {
                            UseSkillAndWait(MirrorLight, true);
                            UseSkillAndWait(Resurgence, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                        }
                        else
                        {
                            UseSkillAndWait(MirrorLight, false);
                            UseSkillAndWait(Resurgence, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                        }
                    }
                    if (hasLowHP(healTarget) <= 50 && hasLowHP(healTarget) > 45)
                    {
                        if (healTarget == me)
                        {
                            UseSkillAndWait(MirrorLight, true);
                            UseSkillAndWait(Resurgence, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(Mend, true);
                            UseSkillAndWait(Antithesis, true);
                        }
                        else
                        {
                            UseSkillAndWait(MirrorLight, false);
                            UseSkillAndWait(Resurgence, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(Mend, false);
                            UseSkillAndWait(Antithesis, false);
                        }
                    }
                    if (hasLowHP(healTarget) <= 45)
                    {
                        if (healTarget == me)
                        {
                            UseSkillAndWait(MirrorLight, true);
                            UseSkillAndWait(Resurgence, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(Mend, true);
                            UseSkillAndWait(Antithesis, true);
                            UseSkillAndWait(Antithesis, true);
                            UseSkillAndWait(Antithesis, true);
                        }
                        else
                        {
                            UseSkillAndWait(MirrorLight, false);
                            UseSkillAndWait(Resurgence, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(Mend, false);
                            UseSkillAndWait(Antithesis, false);
                            UseSkillAndWait(Antithesis, false);
                            UseSkillAndWait(Antithesis, false);
                        }
                    }
                    if (hasLowHP(healTarget) <= 0)
                    {
                        if (isSkillLearned("Revive") == true)
                        {
                            if (me.dist(healTarget) > 25 && !(me.dist(healTarget) > 100))
                            {
                                moveToPlayer(healTarget);
                                UseSkillAndWait("Revive");
                            }
                            else
                            {
                                UseSkillAndWait("Revive");
                            }
                        }
                        else
                        {
                            DeadPpl.Add(healTarget);
                        }
                    }
                }
                else
                {
                    moveToPlayer(healTarget);
                }
            }
        }

        public void UseSkillAndWait(string skillName, bool selfTarget = false)
        {
            //wait cooldowns first, before we try to cast skill
            while (me.isCasting || me.isGlobalCooldown)
            {
                Thread.Sleep(50);
            }

            if (!UseSkill(skillName, true, selfTarget))
            {
                if (me.target != null && GetLastError() == LastError.NoLineOfSight)
                {
                    //No line of sight, try come to target.
                    if (dist(me.target) <= 5)
                        ComeTo(me.target, 2);
                    else if (dist(me.target) <= 10)
                        ComeTo(me.target, 3);
                    else if (dist(me.target) < 20)
                        ComeTo(me.target, 8);
                    else
                        ComeTo(me.target, 8);
                }
            }
            //wait cooldown again, after we start cast skill
            while (me.isCasting || me.isGlobalCooldown)
            {
                Thread.Sleep(50);
            }
        }

        public void moveToPlayer(Creature obj)
        {
            ComeTo(obj, _followRange);
        }

        //Call on plugin stop
        public void PluginStop()
        {
        }
    }
}
 
Last edited:
There a way for it to detect each member's health without it constantly cycling through the group? I can't even use it to assist when no healing is needed as it is constantly just selecting each group member.
 
There a way for it to detect each member's health without it constantly cycling through the group? I can't even use it to assist when no healing is needed as it is constantly just selecting each group member.
Fixed =)
 
Well now it doesn't target anything on it's own now. It appears to only cast heals based on it's target's health. It detects when other group members don't have the Aranzeb's boon buff, but will not target anyone and just keep on casting it until I've manually targeted each for it to cast the buff on. It won't target itself or another member for the heals, only what it has targeted.

I changed up the heal rotations and moved the health % numbers to start healing even sooner, and it still appears to catch things late.

Code:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;
using ArcheBuddy.Bot.Classes;

namespace Follower
{
    public class Follower : Core
    {
        public static string GetPluginAuthor()
        {
            return "2face/Mod by Zagreb";
        }

        public static string GetPluginVersion()
        {
            return "1.0.0.0";
        }

        public static string GetPluginDescription()
        {
            return "Follower Plugin";
        }

        private Creature _leader = null;    // Don't change this.
        private Double _followRange = 5.0;  // Well, it will keap folowing party leader at this range.
        private Double _healRange = 20.0;   // Within this distance it will cast heal at party members.
        private String Antithesis = "Antithesis";            //           
        private String MirrorLight = "Mirror Light";         //             
        private String Resurgence = "Resurgence";            // <-- Skill names. Find them in code and change rotation.        
        private String FerventHealing = "Fervent Healing";   //
        private String Mend = "Mend";                        //  

        private List<Creature> DeadPpl = new List<Creature>();
        private bool Loop;

        public void PluginRun()
        {
            Loop = true;

            _leader = getPartyLeaderObj();
            if (_leader == null || _leader == me)
            {
                Log("Please set leader");
            }
            else
            {
                Start();
            }
        }

        public void Start()
        {
            while (Loop == true)
            {
                Thread.Sleep(200);

                if (_leader != null)
                {
                    if (_leader.inFight && me.dist(_leader) < _healRange)
                    {
                        CheckBuffs();
                        healRoutine();
                    }
                    else
                    {
                        CheckBuffs();
                        moveToPlayer(_leader);
                    }
                }
            }
        }

        public void CheckBuffs()
        {
            while (me.isCasting)
            {
                Thread.Sleep(500);
            }

            foreach (PartyMember member in getPartyMembers())
            {
                if (isSkillLearned("Aranzeb's Boon") == true)
                {
                    if (!member.obj.getBuffs().Exists(b => b.id == 2955) &&
                        !member.obj.getBuffs().Exists(b => b.id == 2956) &&
                        !member.obj.getBuffs().Exists(b => b.id == 26903))
                    {
                        if (member.obj == me)
                        {
                            UseSkillAndWait("Aranzeb's Boon", true);
                        }
                        if (me.dist(member.obj) > _healRange && !(me.dist(member.obj) > 20))
                        {
                            ComeTo(member.obj, _healRange);
                            UseSkillAndWait("Aranzeb's Boon", false);
                        }
                        if (me.dist(member.obj) <= _healRange)
                        {
                            UseSkillAndWait("Aranzeb's Boon", false);
                        }
                    }
                }
                if (isSkillLearned("Whirlwind's Blessing") == true)
                {
                    if (!member.obj.getBuffs().Exists(b => b.id == 6851))
                    {
                        if (member.obj == me)
                        {
                            UseSkillAndWait("Whirlwind's Blessing", true);
                        }
                        if (me.dist(member.obj) > _healRange && !(me.dist(member.obj) > 20))
                        {
                            ComeTo(member.obj, _healRange);
                            UseSkillAndWait("Whirlwind's Blessing", false);
                        }
                        if (me.dist(member.obj) <= _healRange)
                        {
                            UseSkillAndWait("Whirlwind's Blessing", false);
                        }
                    }
                }
                Thread.Sleep(2150); //Set to 5150 if you're lvl55 and learned Whirlwind's Blessing :D
            }
        }

        public Creature getLowestHPMember()
        {
            Creature obj = null;
            Double lowestHp = 99999999;
            Double pCurHP = 100;

            foreach (var member in getPartyMembers())
            {
                pCurHP = member.curhp * 100 / member.maxhp;

                if (pCurHP < lowestHp && !DeadPpl.Contains(member.obj))
                {
                    lowestHp = pCurHP;
                    obj = member.obj;
                }
            }
            return obj;
        }

        public double hasLowHP(Creature member)
        {
            return member.hp * 100 / member.maxHp;
        }

        public void healRoutine()
        {
            Creature healTarget = getLowestHPMember();
            
            if (healTarget != null)
            {
                if (me.dist(healTarget) < _healRange)
                {
                    if (hasLowHP(healTarget) < 95 && hasLowHP(healTarget) > 90)
                    {
                        if (healTarget == me)
                        {
                            UseSkillAndWait(Resurgence, true);
                        }
                        else
                        {
                            UseSkillAndWait(Resurgence, false);
                        }
                    }
                    if (hasLowHP(healTarget) < 85 && hasLowHP(healTarget) > 80)
                    {
                        if (healTarget == me)
                        {
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                        }
                        else
                        {
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                        }
                    }
                    if (hasLowHP(healTarget) < 75 && hasLowHP(healTarget) > 70)
                    {
                        if (healTarget == me)
                        {
                            UseSkillAndWait(MirrorLight, true);
                            UseSkillAndWait(Resurgence, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                        }
                        else
                        {
                            UseSkillAndWait(MirrorLight, false);
                            UseSkillAndWait(Resurgence, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                        }
                    }
                    if (hasLowHP(healTarget) <= 65 && hasLowHP(healTarget) > 60)
                    {
                        if (healTarget == me)
                            {
                                UseSkillAndWait(MirrorLight, true);
                                UseSkillAndWait(Resurgence, true);
                                UseSkillAndWait(FerventHealing, true);
                                UseSkillAndWait(FerventHealing, true);
                                UseSkillAndWait(FerventHealing, true);
                                UseSkillAndWait(FerventHealing, true);
                                UseSkillAndWait(FerventHealing, true);
                            }
                            else
                            {
                                UseSkillAndWait(MirrorLight, false);
                                UseSkillAndWait(Resurgence, false);
                                UseSkillAndWait(FerventHealing, false);
                                UseSkillAndWait(FerventHealing, false);
                                UseSkillAndWait(FerventHealing, false);
                                UseSkillAndWait(FerventHealing, false);
                                UseSkillAndWait(FerventHealing, false);
                            }
                        }
                        if (hasLowHP(healTarget) <= 55 && hasLowHP(healTarget) > 50)
                        {
                            if (healTarget == me)
                            {
                                UseSkillAndWait(MirrorLight, true);
                                UseSkillAndWait(Resurgence, true);
                                UseSkillAndWait(FerventHealing, true);
                                UseSkillAndWait(FerventHealing, true); 
                                UseSkillAndWait(FerventHealing, true);
                                UseSkillAndWait(FerventHealing, true);
                                UseSkillAndWait(FerventHealing, true);
                                UseSkillAndWait(Mend, true);
                                UseSkillAndWait(Antithesis, true);
                            }
                            else
                            {
                                UseSkillAndWait(MirrorLight, false);
                                UseSkillAndWait(Resurgence, false);
                                UseSkillAndWait(FerventHealing, false);
                                UseSkillAndWait(FerventHealing, false);
                                UseSkillAndWait(FerventHealing, false);
                                UseSkillAndWait(FerventHealing, false);
                                UseSkillAndWait(FerventHealing, false);
                                UseSkillAndWait(Mend, false);
                                UseSkillAndWait(Antithesis, false);
                            }
                        }
                        if (hasLowHP(healTarget) <= 45)
                        {
                            if (healTarget == me)
                            {
                                UseSkillAndWait(MirrorLight, true);
                                UseSkillAndWait(Resurgence, true);
                                UseSkillAndWait(Antithesis, true); 
                                UseSkillAndWait(FerventHealing, true);
                                UseSkillAndWait(FerventHealing, true); 
                                UseSkillAndWait(FerventHealing, true);
                                UseSkillAndWait(FerventHealing, true);
                                UseSkillAndWait(FerventHealing, true);
                                UseSkillAndWait(Mend, true);
                                UseSkillAndWait(Antithesis, true);
                                UseSkillAndWait(Antithesis, true);
                                UseSkillAndWait(Antithesis, true);                                
                            }
                            else
                            {
                                UseSkillAndWait(MirrorLight, false);
                                UseSkillAndWait(Resurgence, false);
                                UseSkillAndWait(Antithesis, false);
                                UseSkillAndWait(FerventHealing, false);
                                UseSkillAndWait(FerventHealing, false);
                                UseSkillAndWait(FerventHealing, false);
                                UseSkillAndWait(FerventHealing, false);
                                UseSkillAndWait(FerventHealing, false);
                                UseSkillAndWait(Mend, false);
                                UseSkillAndWait(Antithesis, false);
                                UseSkillAndWait(Antithesis, false);
                                UseSkillAndWait(Antithesis, false);
                        }
                    }
                    if (hasLowHP(healTarget) <= 0)
                    {
                        if (isSkillLearned("Revive") == true)
                        {
                            if (me.dist(healTarget) > 25 && !(me.dist(healTarget) > 100))
                            {
                                moveToPlayer(healTarget);
                                UseSkillAndWait("Revive");
                            }
                            else
                            {
                                UseSkillAndWait("Revive");
                            }
                        }
                        else
                        {
                            DeadPpl.Add(healTarget);
                        }
                    }
                }
                else
                {
                    moveToPlayer(healTarget);
                }
            }
        }

        public void UseSkillAndWait(string skillName, bool selfTarget = false)
        {
            //wait cooldowns first, before we try to cast skill
            while (me.isCasting || me.isGlobalCooldown)
            {
                Thread.Sleep(50);
            }

            if (!UseSkill(skillName, true, selfTarget))
            {
                if (me.target != null && GetLastError() == LastError.NoLineOfSight)
                {
                    //No line of sight, try come to target.
                    if (dist(me.target) <= 5)
                        ComeTo(me.target, 2);
                    else if (dist(me.target) <= 10)
                        ComeTo(me.target, 3);
                    else if (dist(me.target) < 20)
                        ComeTo(me.target, 8);
                    else
                        ComeTo(me.target, 8);
                }
            }
            //wait cooldown again, after we start cast skill
            while (me.isCasting || me.isGlobalCooldown)
            {
                Thread.Sleep(50);
            }
        }

        public void moveToPlayer(Creature obj)
        {
            ComeTo(obj, _followRange);
        }

        //Call on plugin stop
        public void PluginStop()
        {
        }
    }
}
 
Well now it doesn't target anything on it's own now. It appears to only cast heals based on it's target's health. It detects when other group members don't have the Aranzeb's boon buff, but will not target anyone and just keep on casting it until I've manually targeted each for it to cast the buff on. It won't target itself or another member for the heals, only what it has targeted.

I changed up the heal rotations and moved the health % numbers to start healing even sooner, and it still appears to catch things late.

Code:
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;
using ArcheBuddy.Bot.Classes;

namespace Follower
{
    public class Follower : Core
    {
        public static string GetPluginAuthor()
        {
            return "2face/Mod by Zagreb";
        }

        public static string GetPluginVersion()
        {
            return "1.0.0.5";
        }

        public static string GetPluginDescription()
        {
            return "Follower Plugin";
        }

        private Creature _leader = null;    // Don't change this.
        private Double _followRange = 5.0;  // Well, it will keap folowing party leader at this range.
        private Double _healRange = 20.0;   // Within this distance it will cast heal at party members.
        private String Antithesis = "Antithesis";            //           
        private String MirrorLight = "Mirror Light";         //             
        private String Resurgence = "Resurgence";            // <-- Skill names. Find them in code and change rotation.        
        private String FerventHealing = "Fervent Healing";   //
        private String Mend = "Mend";                        //  

        private List<Creature> DeadPpl = new List<Creature>();
        private bool Loop;

        public void PluginRun()
        {
            Loop = true;

            _leader = getPartyLeaderObj();
            if (_leader == null || _leader == me)
            {
                Log("Please set leader");
            }
            else
            {
                Start();
            }
        }

        public void Start()
        {
            while (Loop == true)
            {
                Thread.Sleep(150);

                if (_leader != null)
                {
                    if (_leader.inFight && me.dist(_leader) < _healRange)
                    {
                        CheckBuffs();
                        healRoutine();
                    }
                    else
                    {
                        CheckBuffs();
                        moveToPlayer(_leader);
                    }
                }
            }
        }

        public void CheckBuffs()
        {
            while (me.isCasting)
            {
                Thread.Sleep(100);
            }

            if (isSkillLearned("Aranzeb's Boon") == true)
            {
                if (skillCooldown(16004) == 0)
                {
                    foreach (PartyMember member in getPartyMembers())
                    {
                        if (!member.obj.getBuffs().Exists(b => b.id == 2955) &&
                            !member.obj.getBuffs().Exists(b => b.id == 2956) &&
                            !member.obj.getBuffs().Exists(b => b.id == 7661))
                        {
                            if (member.obj == me)
                            {
                                UseSkillAndWait("Aranzeb's Boon", true);
                            }
                            if (me.dist(member.obj) > _healRange && !(me.dist(member.obj) > 20))
                            {
                                SetTarget(member.obj);
                                ComeTo(member.obj, _healRange);
                                UseSkillAndWait("Aranzeb's Boon", false);
                            }
                            if (me.dist(member.obj) <= _healRange)
                            {
                                SetTarget(member.obj);
                                UseSkillAndWait("Aranzeb's Boon", false);
                            }
                            Thread.Sleep(2150);
                        }
                    }
                }
            }
            if (isSkillLearned("Whirlwind's Blessing") == true)
            {
                if (skillCooldown(23596) == 0)
                {
                    foreach (PartyMember member in getPartyMembers())
                    {
                        if (!member.obj.getBuffs().Exists(b => b.id == 6851))
                        {
                            if (member.obj == me)
                            {
                                UseSkillAndWait("Whirlwind's Blessing", true);
                            }
                            if (me.dist(member.obj) > _healRange && !(me.dist(member.obj) > 20))
                            {
                                SetTarget(member.obj);
                                ComeTo(member.obj, _healRange);
                                UseSkillAndWait("Whirlwind's Blessing", false);
                            }
                            if (me.dist(member.obj) <= _healRange)
                            {
                                SetTarget(member.obj);
                                UseSkillAndWait("Whirlwind's Blessing", false);
                            }
                            Thread.Sleep(5150);
                        }
                    }
                }
            }
        }

        public Creature getLowestHPMember()
        {
            Creature obj = null;
            Double lowestHp = 99999999;
            Double pCurHP = 100;

            foreach (var member in getPartyMembers())
            {
                pCurHP = member.curhp * 100 / member.maxhp;

                if (pCurHP < lowestHp && !DeadPpl.Contains(member.obj))
                {
                    lowestHp = pCurHP;
                    obj = member.obj;
                }
            }
            return obj;
        }

        public double hasLowHP(Creature member)
        {
            return member.hp * 100 / member.maxHp;
        }

        public void healRoutine()
        {
            Creature healTarget = getLowestHPMember();

            if (healTarget != null)
            {
                if (me.dist(healTarget) < _healRange)
                {
                    if (hasLowHP(healTarget) < 95 && hasLowHP(healTarget) > 90)
                    {
                        if (healTarget == me)
                        {
                            UseSkillAndWait(Resurgence, true);
                        }
                        else
                        {
                            SetTarget(healTarget);
                            UseSkillAndWait(Resurgence, false);
                        }
                    }
                    if (hasLowHP(healTarget) < 85 && hasLowHP(healTarget) > 80)
                    {
                        if (healTarget == me)
                        {
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                        }
                        else
                        {
                            SetTarget(healTarget);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                        }
                    }
                    if (hasLowHP(healTarget) < 75 && hasLowHP(healTarget) > 70)
                    {
                        if (healTarget == me)
                        {
                            UseSkillAndWait(MirrorLight, true);
                            UseSkillAndWait(Resurgence, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                        }
                        else
                        {
                            SetTarget(healTarget);
                            UseSkillAndWait(MirrorLight, false);
                            UseSkillAndWait(Resurgence, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                        }
                    }
                    if (hasLowHP(healTarget) <= 65 && hasLowHP(healTarget) > 60)
                    {
                        if (healTarget == me)
                        {
                            UseSkillAndWait(MirrorLight, true);
                            UseSkillAndWait(Resurgence, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                        }
                        else
                        {
                            SetTarget(healTarget);
                            UseSkillAndWait(MirrorLight, false);
                            UseSkillAndWait(Resurgence, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                        }
                    }
                    if (hasLowHP(healTarget) <= 55 && hasLowHP(healTarget) > 50)
                    {
                        if (healTarget == me)
                        {
                            UseSkillAndWait(MirrorLight, true);
                            UseSkillAndWait(Resurgence, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(Mend, true);
                            UseSkillAndWait(Antithesis, true);
                        }
                        else
                        {
                            SetTarget(healTarget);
                            UseSkillAndWait(MirrorLight, false);
                            UseSkillAndWait(Resurgence, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(Mend, false);
                            UseSkillAndWait(Antithesis, false);
                        }
                    }
                    if (hasLowHP(healTarget) <= 45)
                    {
                        if (healTarget == me)
                        {
                            UseSkillAndWait(MirrorLight, true);
                            UseSkillAndWait(Resurgence, true);
                            UseSkillAndWait(Antithesis, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(FerventHealing, true);
                            UseSkillAndWait(Mend, true);
                            UseSkillAndWait(Antithesis, true);
                            UseSkillAndWait(Antithesis, true);
                            UseSkillAndWait(Antithesis, true);
                        }
                        else
                        {
                            SetTarget(healTarget);
                            UseSkillAndWait(MirrorLight, false);
                            UseSkillAndWait(Resurgence, false);
                            UseSkillAndWait(Antithesis, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(FerventHealing, false);
                            UseSkillAndWait(Mend, false);
                            UseSkillAndWait(Antithesis, false);
                            UseSkillAndWait(Antithesis, false);
                            UseSkillAndWait(Antithesis, false);
                        }
                    }
                    if (hasLowHP(healTarget) <= 0)
                    {
                        if (healTarget == me)
                        {
                            Loop = false;
                            Log("I'm dead... :(");
                            return;
                        }

                        if (isSkillLearned("Revive") == true)
                        {
                            if (me.dist(healTarget) > 25 && !(me.dist(healTarget) > 40))
                            {
                                SetTarget(healTarget);
                                ComeTo(healTarget, _healRange);
                                UseSkillAndWait("Revive", false);
                            }
                            else
                            {
                                SetTarget(healTarget);
                                UseSkillAndWait("Revive", false);
                            }
                        }
                        else
                        {
                            DeadPpl.Add(healTarget);
                        }
                    }
                }
                else
                {
                    moveToPlayer(healTarget);
                }
            }
        }

        public void UseSkillAndWait(string skillName, bool selfTarget = false)
        {
            //wait cooldowns first, before we try to cast skill
            while (me.isCasting || me.isGlobalCooldown)
            {
                Thread.Sleep(50);
            }

            if (!UseSkill(skillName, true, selfTarget))
            {
                if (me.target != null && GetLastError() == LastError.NoLineOfSight)
                {
                    //No line of sight, try come to target.
                    if (dist(me.target) <= 5)
                        ComeTo(me.target, 2);
                    else if (dist(me.target) <= 10)
                        ComeTo(me.target, 3);
                    else if (dist(me.target) < 20)
                        ComeTo(me.target, 8);
                    else
                        ComeTo(me.target, 8);
                }
            }
            //wait cooldown again, after we start cast skill
            while (me.isCasting || me.isGlobalCooldown)
            {
                Thread.Sleep(50);
            }
        }

        public void moveToPlayer(Creature obj)
        {
            ComeTo(obj, _followRange);
        }

        //Call on plugin stop
        public void PluginStop()
        {
            DeadPpl.Clear();
        }
    }
}

Updated... :D
 
Last edited:
My healer keeps spamming resurgence all the time. Is there a way to set cooldown while is active?
 
Back
Top