Накидал бота на добычу руды в области, но не могу понять, почему он отрубается, помогите, пожалуйста, разобраться.
Вот код:
UPD. Отредактировал код. Плагин вполне работоспособный для фарма руды. Необходимо только создать карту с маршрутом.
Вот код:
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 DefaultNameSpace{
public class DefaultClass : Core
{
private Gps gps;
int NormalOre = 0;
int RareOre = 0;
//когда разберусь, как вывести логи, будеты выводится количество лута, которое собрал персонаж
int Iron = 0; int Copper = 0; int Silver = 0; int Gold = 0; int Stone = 0; int Echium = 0; //обычная руда
int RareIron = 0; int RareCopper = 0; int RareSilver = 0; int RareGold = 0; int RareEchium = 0; //проки
int Emerald = 0; int Topaz = 0; int Diamond = 0; int Sapphire = 0; int Ruby = 0; //драгоценный камни
public static string GetPluginAuthor()
{
return "Stakasha";
}
public static string GetPluginVersion()
{
return "1.0.1.0";
}
public static string GetPluginDescription()
{
return "Сбор руды по точкам. Точек можно указать сколько угодно, называть необходимо числами (1, 2, ..., 15, 16,..., n) Бот будет проходить от первой точке к последней. Последняя точка должна быть около первой, чтобы бот мог начать новый груг";
}
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 GoToTheStartMine()
//{
// gps = new Gps(this);
// gps.LoadDataBase(Application.StartupPath + "\\Plugins\\miner\\miner_start.db3");
// gps.GpsMove("Start");
// Log("Бежим к старту");
// Thread.Sleep(50000);
//}
//Call on plugin start
public void PluginRun()
{
ClearLogs();
//GoToTheStartMine();
SetGroupStatus("Сбор руды", false);
double searchDist = 20;
//установить отбор, по карте можно собирать не только руду
uint[] doodadSearchIds = new uint[]{1671, //залежи железа
466}; //заросли сорняка
gps = new Gps(this);
gps.LoadDataBase(Application.StartupPath + "\\Plugins\\miner\\miner.db3"); //Точки называются числами (1, 2, 3, ..., 15, ..., n)
var _GpsPoints = gps.GetAllGpsPoints();
int count = _GpsPoints.Count();
Log("Всего точек: " + count);
int tochka = 1; //точка старта
gps.GpsMove(tochka.ToString());
Log(System.DateTime.Now.ToLongTimeString() + ": Пришли на старт, точка: " + tochka);
//int vremenno = 3;//количество точек, по которым бегает персонаж (времеено, пока разбираюсь с gps)
bool mining = true;
while(mining)
{
if (GetGroupStatus("Сбор руды") && me.isAlive())
{
try
{
//Log("loop");
Thread.Sleep(500);
var needdoodads = getDoodads().Where(w => dist(w, me) <= searchDist && doodadSearchIds.Contains(w.id));
if(needdoodads.Count()>0)
{
foreach(var doodad in needdoodads)
{
if(doodad!=null && ((doodad.name == "Залежи железа") || (doodad.name == "Порода с блестящими вкраплениями")))//Залежи железа;Порода с блестящими вкраплениями
{
if(doodad.name == "Выработанные залежи")
Log(System.DateTime.Now.ToLongTimeString() + ": Это мы добаывать не будем: " + doodad.name);
else
{
if(me.laborPoints<200)
{
UseItem("Большая бутыль с имбирным напитком");
Log(System.DateTime.Now.ToLongTimeString() + ": Выпил баночку");
Thread.Sleep(500);
}
if(me.laborPoints<30)
{
mining = false;
}
CheckAggro();
var needdoodadskills = doodad.getUseSkills();
//Log(System.DateTime.Now.ToLongTimeString() + ": Найдено: " + string.Format("{0} Его ID: {1} Расстояние до объекта: {2}",
//doodad.name,
//doodad.id,
//dist(doodad,me)));
ComeTo(doodad);
Thread.Sleep(500);
Log(System.DateTime.Now.ToLongTimeString() + ": Обрабатываю: " + doodad.name);//, #FFDFD991,false);
UseDoodadSkill(needdoodadskills[0].id, doodad, true, 0.4);
//процедуру записи в лог дропнутого лута надо сюда добавить
if(doodad.name == "Порода с блестящими вкраплениями")
RareOre++;
else
NormalOre++;
Thread.Sleep(500);
}
}
}
}
else
{
tochka++;
if (tochka<(count+1))
{
//Log(System.DateTime.Now.ToLongTimeString() + ": Рядом нет руды. Перемещаемся к точке: " + tochka.ToString());
gps.GpsMove(tochka.ToString());
CheckAggro();
}
else
{
tochka = 1;
//Log(System.DateTime.Now.ToLongTimeString() + ": Возвращаемся в начало");
gps.GpsMove(tochka.ToString());
Log(System.DateTime.Now.ToLongTimeString() + ": Ждем респа руды");
Thread.Sleep(5000); //Установка времени ожидания респа, после прохождения круга (1 секунда = 1000)
}
//Thread.Sleep(500);
}
}
catch(Exception ex)
{
//Log(ex.Message);
Log("Что-то пошло не так");
}
}
}
//Log("Exit loop");
}
public void CheckAggro()
{
// Log(DateTime.Now.ToLongTimeString() + " : CheckAggro");
if(getAggroMobs().Count > 0)
{
//Log(DateTime.Now.ToLongTimeString() + " : " + getAggroMobs().Count.ToString());
foreach(var obj in getAggroMobs())
{
Log(DateTime.Now.ToLongTimeString() + ": " + obj.name + ": KILL!!! KILL!!! KILL!!!");
SetTarget(obj);
TurnDirectly(me.target);
//Log(DateTime.Now.ToLongTimeString() + ": fighting");
while(obj.isAlive())
{
TurnDirectly(me.target);
if (skillCooldown("Сокрушение разума") == 0)
{
UseSkillAndWait("Сокрушение разума");
UseSkillAndWait("Хватка земли");
}
for (int i=0;i<2;i++)
UseSkillAndWait("Сгустки пламени");
if(!obj.inFight)
return;
}
Log(DateTime.Now.ToLongTimeString() + " : fight is over");
}
}
}
//Call on plugin stop
public void PluginStop()
{
ClearLogs();
Log("Обработано обычной породы :" + NormalOre.ToString());
Log("Обработано редкой породы :" + RareOre.ToString());
}
}
}
UPD. Отредактировал код. Плагин вполне работоспособный для фарма руды. Необходимо только создать карту с маршрутом.
Last edited: