Цитата:
Сообщение от skymanrus
я возможно попытаюсь внедрить в него алгоритм ASTAR который занимается тем что строит пути т.е. можно будет указать боту идти в гиран из орена пешком и он сам построит путь а если встретит препятствия то внесёт их в базу данных и обойдёт
|
Подробнее про этот алгоритм можно?
Цитата:
Сообщение от skymanrus
возможности:
... если уперается в дерево или камень то пытается её обойти,
|
как ты это делаешь и насколько надежно обходит препятствия?
PS:
Подбор предметов: мне кажется надежнее создавать массив выпавших вещей и потом по его данным поднимать.
Вот такие процедуры я применял.
Код:
var
ItemBase: array[1..4,1..max] of integer; // описатель предметов
//******************************************************************************
procedure ReqGetItem;
begin
if itm=0 then begin
timer1.enabled:=true; //включаем отсчет времени
needbackup:=false;
exit;
end;
timer1.enabled:=false; //выключаем отсчет времени
//перебираем базу
for i:=1 to max do begin
//если нашли
if (ItemBase[1,i]<>0) then begin //ObjectID
say('ReqGetItem');
//даем команду подобрать вещь
buf:=#$04;
WriteD(ItemBase[1,i]);
WriteD(ItemBase[2,i]);
WriteD(ItemBase[3,i]);
WriteD(ItemBase[4,i]);
WriteH(00);
SendToServerEx(Name);
end;
end;
end;
в основном цикле
//****************************************************************************
//DropItem - выпала вещь
if FromServer and (ConnectName=Name) and (pck[1]=#$0C) then begin
//чужие вещи не берем
if (Attacker=ReadD(2)) then begin
timer1.enabled:=false; //выключаем бота
AddMob:=true;
//перебираем базу
for i:=1 to max do begin
//если нашли, то корректируем его координаты на новые
if (ItemBase[1,i]=ReadD(6)) then begin //ObjectID
ItemBase[2,i]:=ReadD(14); //x
ItemBase[3,i]:=ReadD(18); //y
ItemBase[4,i]:=ReadD(22); //z
AddMob:=false;
inc(itm);
NeedBackup:=true;
say('Корректируем данные по предмету');
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем
for i:=1 to max do begin
if (ItemBase[1,i]=0) then begin
//запоминаем в свободную ячейку
ItemBase[1,i]:=ReadD(6); //ObjectID
ItemBase[2,i]:=ReadD(14); //x
ItemBase[3,i]:=ReadD(18); //y
ItemBase[4,i]:=ReadD(22); //z
inc(itm);
NeedBackup:=true;
say('Добавили данные по предмету');
break;
end;
end;
end;
say('ColvoItm='+inttostr(itm));
end;
//****************************************************************************
//To Do: Сделать проверку на расстояние
//SpawnItem - валяется вещь
if FromServer and (ConnectName=Name) and (pck[1]=#$0B) then begin
timer1.enabled:=false; //выключаем бота
AddMob:=true;
//перебираем базу
for i:=1 to max do begin
//если нашли, то корректируем его координаты на новые
if (ItemBase[1,i]=ReadD(2)) then begin //ObjectID
ItemBase[2,i]:=ReadD(10); //x
ItemBase[3,i]:=ReadD(14); //y
ItemBase[4,i]:=ReadD(18); //z
AddMob:=false;
inc(itm);
NeedBackup:=true;
say('Корректируем данные по предмету');
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем
for i:=1 to max do begin
if (ItemBase[1,i]=0) and AddMob then begin
//запоминаем в свободную ячейку
ItemBase[1,i]:=ReadD(2); //ObjectID
ItemBase[2,i]:=ReadD(10); //x
ItemBase[3,i]:=ReadD(14); //y
ItemBase[4,i]:=ReadD(18); //z
inc(itm);
NeedBackup:=true;
say('Добавили данные по предмету');
break;
end;
end;
end;
say('ColvoItm='+inttostr(itm));
end;
//****************************************************************************
//ToDO добавить проверки про невозможность поднятия предмета
//каждые две сек подбираем предмет
if Wait(time1,2) and NeedBackup and (underAttack=false) then ReqGetItem;