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();
}
}
}