using System;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Linq;
using ArcheBuddy.Bot.Classes;
namespace YourNamespace
{
public class YourClass : Core
{
public static string GetPluginAuthor()
{
return "ArcheBuddy";
}
public static string GetPluginVersion()
{
return "1.0";
}
public static string GetPluginDescription()
{
return "Simple mobs farm";
}
//Try to find best mob in farm zone.
public Creature GetBestNearestMob(Zone zone)
{
Creature mob = null;
double dist = 999999;
foreach (var obj in getCreatures())
{
//If creature Npc and we can attack him and creature alive and distance to this creature less than other and creature have 100% hp or creature want to kill out character.
if (obj.type == BotTypes.Npc && isAttackable(obj) && (obj.firstHitter == null || obj.firstHitter == me) && isAlive(obj) && me.dist(obj) < dist && zone.ObjInZone(obj)
&& (hpp(obj) == 100 || obj.aggroTarget == me))
{
mob = obj;
dist = me.dist(obj);
}
}
return mob;
}
//Cancel skill if mob which we want to kill already attacked by another player.
public void CancelAttacksOnAnothersMobs()
{
while (true)
{
if (me.isCasting && me.target != null && me.target.firstHitter != null && me.target.firstHitter != me)
CancelSkill();
Thread.Sleep(100);
}
}
//Check our buffs
public void CheckBuffs()
{
if (buffTime("Insulating Lens (Rank 5)") == 0 && skillCooldown("Insulating Lens") == 0)
UseSkillAndWait("Insulating Lens", true);
//if (mpp() < 50)
// UseItem("Morning Dew");
//if (mpp() < 40 && skillCooldown("Whole Grain Soup") == 0)
// UseItem("Whole Grain Soup");
}
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 PluginRun()
{
new Task(() => { CancelAttacksOnAnothersMobs(); }).Start(); //Starting new thread
RoundZone zone = new RoundZone(me.X, me.Y, 60); //Make new zone where we will farm. Its circle with center where your character stand at this moment with 80m radius.
SetGroupStatus("autoexp", false); //Add checkbox to our character widget
//If autoexp checkbox enabled in widget and our character alive
if (me.isAlive())
{
CheckBuffs();
Creature bestMob = null;
//if we have enouth mp and hp, or mobs want to kill us - try to find bestMob.
if ((mpp() > 40 && hpp() > 75) || getAggroMobs().Count > 0)
bestMob = GetBestNearestMob(zone);
//if mob exists
if (bestMob != null)
{
try
{
//while this mob alive and our character alive and checkbox in widget enabled
while (bestMob != null && isAlive(bestMob) && isExists(bestMob) && GetGroupStatus("autoexp") && isAlive())
{
//if another player attack this mob before our character.
if (bestMob.aggroTarget != me && bestMob.firstHitter != null && bestMob.firstHitter != me)
{
bestMob = null;
break;
}
//if we still dont attack our best mob, but another mob want to kill us
if (bestMob.firstHitter == null && getAggroMobs().Count > 0 && bestMob != GetBestNearestMob(zone))
bestMob = GetBestNearestMob(zone);
//Target our mob, if necessary
if (me.target != bestMob)
SetTarget(bestMob);
//Turn to our mob, if necessary
if (angle(bestMob, me) > 45 && angle(bestMob, me) < 315)
TurnDirectly(bestMob);
if (skillCooldown("Magic Circle") == 0 && dist(bestMob) <= 20 && hpp(bestMob) > 40)
{
UseSkill("Magic Circle", true);
Thread.Sleep(100);
}
if (mpp() <= 60 && skillCooldown("Enervate") == 0 &&hpp(bestMob) >40)
{
UseSkill("Enervate", true);
Thread.Sleep(100);
}
if (skillCooldown("Freezing Arrow") == 0)
{
UseSkill("Freezing Arrow", true);
Thread.Sleep(100);
}
if (skillCooldown("Freezing Arrow") != 0 && hpp() > 75)
{
for (int i=0;i<2;i++)
UseSkillAndWait("Flamebolt");
}
if (skillCooldown("Freezing Arrow") != 0 && hpp() <= 75 && skillCooldown("Enervate") == 0)
{
UseSkill("Enervate", true);
Thread.Sleep(100);
UseSkill("Earthen Grip", true);
Thread.Sleep(100);
}
if (skillCooldown("Freezing Arrow") != 0 && mpp() <= 55 && skillCooldown("Enervate") == 0)
{
UseSkill("Enervate", true);
Thread.Sleep(100);
}
//Small delay, do not load the processor
Thread.Sleep(100);
}
//Try to pickup drop from mob, if drop available
while (bestMob != null && !isAlive(bestMob) && isExists(bestMob) && bestMob.type == BotTypes.Npc && ((Npc)bestMob).dropAvailable && GetGroupStatus("autoexp") && isAlive())
{
if (me.dist(bestMob) > 3)
ComeTo(bestMob, 1);
PickupAllDrop(bestMob);
}
}
catch {}
}
//Small delay, do not load the processor
Thread.Sleep(10);
}
}
}
}