using System;
using System.Windows.Forms;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;
using ArcheBuddy.Bot.Classes;
namespace YourNamespace
{
public class YourClass : Core
{
//Считаем количество мобов, которые держат нас или нашего маунта в таргете
public int mobsCountThatAttackUs()
{
int count = 0;
foreach (var obj in getCreatures())
{
if (obj.type == BotTypes.Npc && isAttackable(obj) && isAlive(obj) && (obj.target == me || (obj.target != null && obj.target == getMount())))
count++;
}
return count;
}
//Получаем ближайшего моба, которого можно атаковать, которого не атаковал кто-либо другой, он находится в зоне
public Creature GetBestNearestMob(Zone zone)
{
Creature mob = null;
double dist = 999999;
foreach (var obj in getCreatures())
{
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.target == me || (obj.target != null && obj.target == getMount())))
{
mob = obj;
dist = me.dist(obj);
}
}
return mob;
}
//Нитка, контролирует, если мы что-либо кастуем в моба, и пока мы это делаем - его ударил ктото другой - отменяем каст.
public void CancelAttacksOnAnothersMobs()
{
// Пофиксил отмену самохила/отхил пета.
while (true)
{
if (me.isCasting && me.target!=me && me.target !=getMount() && me.target != null && me.target.firstHitter != null && me.target.firstHitter != me)
{
CancelSkill();
}
Thread.Sleep(100);
}
}
//Бафаемся
public void CheckBuffs()
{
if (buffTime("Дух сокола") == 0)
{
UseSkill("Дух сокола");
while (me.isCasting)
Thread.Sleep(100);
}
if (buffTime("Проворство") == 0 && skillCooldown("Проворство") == 0)
UseSkill("Проворство");
}
public void Buffer(string buffname,string skillname)
{
// buffname - имя бафа(отображается на персонаже)
// skillname - название скила(да, да они разные!)
// TODO: добавть таргнт, для ребафа пета/пати/рейда
//{ if (buffTime("Проворство") == 0)
// SetTarget(me);
// UseSkill("Проворство");
// }
//{ if (buffTime("Стойка лучника") == 0)
//SetTarget(me);
// UseSkill("Стойка лучника");
// }
//if (buffTime("Дух сокола II") == 0)
//{
// SetTarget(me);
// UseSkill("Дух сокола");
if (buffTime("Благословение божества II") == 0) // Проверяем наличие бафа
{
SetTarget(me);
while (me.isGlobalCooldown) // Ждём ГКД
Thread.Sleep(100);
UseSkill("Просвещение");
while (me.isCasting) // Ждём окончание каста
Thread.Sleep(100);
}
if (buffTime("Лангуст по-инистрийски") == 0) // Проверяем наличие бафа
{
SetTarget(me);
while (me.isGlobalCooldown) // Ждём ГКД
Thread.Sleep(100);
UseItem("Лангуст по-инистрийски");
while (me.isCasting) // Ждём окончание каста
Thread.Sleep(100);
}
}
public void PluginRun()
{
new Task(() => { CancelAttacksOnAnothersMobs(); }).Start();
RoundZone zone = new RoundZone(me.X, me.Y, 70); //X, Y, radius
SetGroupStatus("autoexp", false); //Добавляем группу в виджет
while (true)
{
if(!isAlive())
{
while (me.resurrectionWaitingTime > 0)
Thread.Sleep(100);
Thread.Sleep(300);
ResToRespoint();
Thread.Sleep(35000);
Thread.Sleep(2000);
//Cюда пишем наш маршрут от нуи
MoveTo (11443.74, 17346.58, 196.55);
MoveTo ( 11430.88, 17332.46, 196.09 );
MoveTo (11413.90, 17316.88, 195.35 );
MoveTo( 11389.64, 17294.14, 193.44 );
MoveTo (11367.34, 17275.40, 191.27 );
MoveTo (11353.19, 17251.64, 184.33 );
MoveTo (11347.57, 17222.25, 180.51 );
MoveTo (11351.39, 17194.39, 180.11);
UseSkill("Дар жизни");
MoveTo (11356.27, 17186.68, 179.62);
UseSkill("Дар жизни");
}
if (GetGroupStatus("autoexp"))
{
CheckBuffs();
var bestMob = GetBestNearestMob(zone);
if (lastAttacked() != null && lastAttacked().isAlive())
{
if (lastAttacked().type == BotTypes.Player) //Переключаемся на ПК если нас атаковали
bestMob = lastAttacked();
if (me.target != bestMob)
SetTarget(bestMob);
}
var myMount = getMount();
{
while (bestMob != null && isAlive(bestMob) && GetGroupStatus("autoexp") && isAlive())
{
// Переписать нахуй весь отхил!!!!!
//Хилим маунта, если нужно
if (myMount != null && hpp(myMount) < 70 && skillCooldown("Свет и тьма") == 0)
{
while (me.isGlobalCooldown) //ждем гкд
Thread.Sleep(100);
while (me.isCasting) //пока мы докастуем что либо другое
Thread.Sleep(100);
SetTarget(myMount);
UseSkill("Свет и тьма");
}
//Хилим себя, если нужно
if (hpp() < 82 && buffTime("Дар жизни") == 0)
{
while (me.isGlobalCooldown) //ждем гкд
Thread.Sleep(100);
while (me.isCasting) //пока мы докастуем что либо другое
Thread.Sleep(100);
//SetTarget(me);
UseSkill("Дар жизни");
Log("Хилимся Даром жизни");
}
// Если первой хилки оказалось мало и ХП падает.
if (hpp() < 70 && skillCooldown("Непрерывное исцеление") == 0)
{
while (me.isGlobalCooldown) //ждем гкд
Thread.Sleep(100);
while (me.isCasting) //пока мы докастуем что либо другое
Thread.Sleep(100);
SetTarget(me);
UseSkill("Непрерывное исцеление");
UseSkill("Непрерывное исцеление");
UseSkill("Непрерывное исцеление");
UseSkill("Непрерывное исцеление");
UseSkill("Непрерывное исцеление");
UseSkill("Непрерывное исцеление");
Log("Непрерывное исцеление");
}
if (bestMob.target != me && bestMob.firstHitter != null && bestMob.firstHitter != me) //если у нашего "лучшего" моба первый атакующий - не я - забиваем на него, и выходим из цикла, в дальнейшем найдем другого моба
{
bestMob = null;
break;
}
if (bestMob.firstHitter == null && mobsCountThatAttackUs() > 0 && bestMob != GetBestNearestMob(zone)) //если нашего "лучшего" моба еще не ударили, и нас держит в таргете мобы - смотрим, нет ли лучшего моба
{
bestMob = GetBestNearestMob(zone);
}
if (me.dist(bestMob) > 19) //подбегаем, если нужно
{
ComeTo(bestMob, 18);
}
if (me.dist(bestMob) <= 20) //атакуем
{
if (me.target != bestMob)
SetTarget(bestMob);
if (angle(bestMob, me) > 45 && angle(bestMob, me) < 315) //если нужно - поворачиваемся к нему лицом
TurnDirectly(bestMob);
if (buffTime(getBuff(me.target, "Отравленная стрела")) == 0 && hpp(bestMob) > 10 && mobsCountThatAttackUs() == 1 && hpp(bestMob) > 10)
if (hpp(bestMob) == 100)
UseSkill("Отравленная стрела", true);
Thread.Sleep(100);
if (buffTime("Стойка лучника III") == 0)
UseSkill("Стойка лучника", true);
Thread.Sleep(100);
UseSkill("Жертвенный огонь", true);
Thread.Sleep(100);
UseSkill("Отравленная стрела", true);
Thread.Sleep(100);
UseSkill("Метка преследователя", true);
Thread.Sleep(100);
UseSkill("Оглушающий выстрел", true);
Thread.Sleep(100);
UseSkill("Зазубренная стрела", true);
Thread.Sleep(100);
UseSkill("Разрывной выстрел", true);
Thread.Sleep(100);
if(hpp(bestMob) > 0 && skillCooldown("Азарт мстителя") == 0)
UseSkill("Азарт мстителя", true);
/* UseSkill("Стойка лучника", true);
{
if (buffTime("Стойка лучника") == 0)
//SetTarget(me);
UseSkill("Стойка лучника");
}
UseSkill ("Метка преследователя",true);
UseSkill ("Зазубренная стрела",true);
UseSkill ("Отравленная стрела",true);
UseSkill ("Разрывной выстрел",true);
UseSkill ("Азарт мстителя",true);
*/
if (buffTime(getBuff(me.target, "Бессилие")) != 0 && skillCooldown("Оковы смерти") == 0 && mobsCountThatAttackUs() == 1)
UseSkill("Оковы смерти", true);
if (me.dist(bestMob) <= 5 && mpp() > 30 && hpp(bestMob) > 10)
{
UseSkill("Пронзающие копья", true);
}
if (me.dist(bestMob) <= 5 && mpp() > 30 && hpp(bestMob) > 10)
{
UseSkill("Копья правосудия",me.X,me.Y,me.X,true);
}
if (me.dist(bestMob) <= 5 && mpp() > 30 && hpp(bestMob) > 60)
{
UseSkill("Призыв воронов", true);
}
if (me.dist(bestMob) < 6 && mpp() < 70)
UseSkill("Поглощение энергии", true);
UseSkill("Клинки смерти", true);
}
Thread.Sleep(50);
}
while (bestMob != null && !isAlive(bestMob) && bestMob.type == BotTypes.Npc && ((Npc)bestMob).dropAvailable && GetGroupStatus("autoexp") && isAlive() && bestMob.type != BotTypes.Player)
{
if (me.dist(bestMob) > 3)
ComeTo(bestMob, 1);
PickupAllDrop(bestMob);
}
if((mpp() < 60) && mobsCountThatAttackUs() == 0 && GetGroupStatus("autoexp") && isAlive())
while(mpp()<90 && mobsCountThatAttackUs() == 0 && GetGroupStatus("autoexp") && isAlive())
{
if (buffTime("Морковное пюре") == 0)
{
UseItem("Морковное пюре");
while (me.isCasting)
Thread.Sleep(1000);
}
UseSkill("Музицирование", true);
Thread.Sleep(100);
}
while (me.opPoints >= 50 && itemCount("Кожаный доспех обетованной земли") > 0 && mobsCountThatAttackUs() == 0 && isAlive())
{
UseItem("Кожаный доспех обетованной земли");
Thread.Sleep(1000);
}
}
}
Thread.Sleep(100);
}
}
}
}