using System;
using System.Windows.Forms;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;
using Jungler.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) && 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()
{
Buffer("Благословение божества II", "Просвещение");
Buffer("Магический щит I","Магический щит");
Buffer("Благословение","Жертвенный огонь");
if (buffTime("Свиные ребрышки") == 0 && itemCount("Свиные ребрышки") > 0)
UseItem("Свиные ребрышки");
}
public void Buffer(string buffname,string skillname)
{
// buffname - имя бафа(отображается на персонаже)
// skillname - название скила(да, да они разные!)
// TODO: добавть таргнт, для ребафа пета/пати/рейда
if (buffTime(buffname) == 0) // Проверяем наличие бафа
{
SetTarget(me);
while (me.isGlobalCooldown) // Ждём ГКД
Thread.Sleep(100);
UseSkill(skillname);
while (me.isCasting) // Ждём окончание каста
Thread.Sleep(100);
}
}
public void MoveToFP()
{
Gps gps = new Gps(this);
gps.LoadDataBase("C:\\Users\\Виталик\\Desktop\\Новая папка\\GPS\\path.db3");
gps.maxSearchDistance=100;
UseItem("Вороной рысак",true);
Thread.Sleep(1000);
SitToMount();
gps.GpsMove("fp");
DespawnMount();
Thread.Sleep(1000);
}
public void PluginRun()
{
new Task(() => { CancelAttacksOnAnothersMobs(); }).Start();
RoundZone zone = new RoundZone(me.X, me.Y, 80); //X, Y, radius
SetGroupStatus("autoexp", false); //Добавляем группу в виджет
while (true)
{
if(!isAlive())
{
while(me.resurrectionWaitingTime>0)
Thread.Sleep(100);
Thread.Sleep(3000);
ResToRespoint();
Log("Воскрес");
Thread.Sleep(10000);
MoveTo(me.X+4,me.Y,me.Z);
MoveToFP();
}
if (GetGroupStatus("autoexp"))
{
CheckBuffs();
var bestMob = GetBestNearestMob(zone);
var myMount = getMount();
if (bestMob != null)
{
while (bestMob != null && isAlive(bestMob) && GetGroupStatus("autoexp") && isAlive())
{
//Хилим себя, если нужно
if (hpp() < 80 && buffTime("Дар жизни") == 0)
{
while (me.isGlobalCooldown) //ждем гкд
Thread.Sleep(50);
while (me.isCasting) //пока мы докастуем что либо другое
Thread.Sleep(50);
UseSkill("Дар жизни", false, true);
}
if (hpp() < 40 && skillCooldown("Непрерывное исцеление") == 0)
{
while (me.isGlobalCooldown) //ждем гкд
Thread.Sleep(50);
while (me.isCasting) //пока мы докастуем что либо другое
Thread.Sleep(50);
UseSkill("Непрерывное исцеление", false, true);
UseSkill("Непрерывное исцеление", false, true);
UseSkill("Непрерывное исцеление", false, true);
UseSkill("Непрерывное исцеление", false, true);
UseSkill("Непрерывное исцеление", false, true);
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, 19);
}
if (me.dist(bestMob) < 20) //атакуем
{
if (me.target != bestMob)
SetTarget(bestMob);
if (angle(bestMob, me) > 45 && angle(bestMob, me) < 315) //если нужно - поворачиваемся к нему лицом
TurnDirectly(bestMob);
if (hpp(bestMob) == 100 && bestMob.firstHitter == null && skillCooldown("Жертвенный огонь") == 0)
UseSkill("Жертвенный огонь", true);
if (hpp(bestMob) > 40 && skillCooldown("Магический квадрат") == 0)
UseSkill("Магический квадрат");
if (hpp(bestMob) > 25 && skillCooldown("Цепная молния") == 0 && buffTime("Магический квадрат II") != 0 && skillCooldown("Молния гнева") == 0)
UseSkill("Цепная молния");
if (hpp(bestMob) > 25 && skillCooldown("Молния гнева") == 0 && buffTime(getBuff(me.target, "Электрошок")) != 0 && buffTime("Магический квадрат II") != 0)
{
UseSkill("Молния гнева");
while (me.isCasting)
Thread.Sleep(50);
}
if (me.dist(bestMob) <= 5 && mpp() > 30 && mobsCountThatAttackUs() > 1 && skillCooldown("Призыв воронов") == 0)
UseSkill("Призыв воронов");
if (me.dist(bestMob) < 5 && mpp() < 70 && skillCooldown("Поглощение энергии") == 0)
UseSkill("Поглощение энергии");
UseSkill("Клинки смерти");
}
Thread.Sleep(50);
}
//подбегаем и подбираем дроп
try
{
foreach (var obj in getCreatures())
{
if (obj.dropAvailable && me.dist(obj) < 50)
{
ComeTo(obj, 2);
PickupAllDrop(obj);
Thread.Sleep(500);
}
}
}
catch (Exception error)
{
Log(error.ToString());
}
if ((mpp() < 30 || hpp() < 40) && mobsCountThatAttackUs() == 0 && skillCooldown("Поглощение энергии") > 10 && isAlive()) //возвращаемся на исходную точку и регенимся
{
if (buffTime("Морковное пюре") == 0 && itemCount("Морковное пюре") > 0)
UseItem("Морковное пюре");
while (mpp() < 95 && mobsCountThatAttackUs() == 0)
{
UseSkill("Музицирование");
Thread.Sleep(100);
}
}
}
}
Thread.Sleep(100);
}
}
}
}