Тема: SKYbot-dll бот
Показать сообщение отдельно
Старый 16.03.2008, 15:03   #5
Пользователь
 
Аватар для skymanrus
 
Регистрация: 28.12.2007
Сообщений: 54
Сказал Спасибо: 0
Имеет 40 спасибок в 10 сообщенях
skymanrus пока неопределено
Лампочка

Код:
Подбор предметов: мне кажется надежнее создавать массив выпавших вещей
я так и сделал :)
Код:
  Itemid:  array[1..30] of integer;
  Inventid:array[1..30] of integer;
  Itemx:   array[1..30] of integer;
  Itemy:   array[1..30] of integer;
  Itemz:   array[1..30] of integer;
//=====
procedure DropItem(Invid,id,x,y,z:integer);var d,i:integer;
begin if (on1=true)then begin
i:=delta(id,Itemid);
d:=ras(myXreal,myYreal,x,y);

    if(d<=220)and(i=0)then
        for d:=1 to length(Itemid)-1 do
        if(Itemid[d]=0)then begin
        Itemid[d]:=id;
        Inventid[d]:=Invid;
        Itemx[d]:=x;
        Itemy[d]:=y;
        Itemz[d]:=z;
        break;
        end;
end;end;
//---------------------------------------------------//
procedure GetItem(id:integer);var f:integer;
begin
f:=delta(id,Itemid);
        if(f<>0)then begin
        Itemid[f]:=0;
        Inventid[f]:=0;
        Itemx[f]:=0;                 
        Itemy[f]:=0;
        Itemz[f]:=0;
        end;
end;
Цитата:
Подробнее про этот алгоритм можно?
алгоритм ASTAR (правильно пишется A* ) повсюду используется в играх для того чтоб вычислить путь из любой точки A в любую точку B с обходом всех препятствий на своём пути и с учётом самого короткого и выгодного пути (т.е. можно поставить приоритетными те пути где есть дорога и указать ему что воду стоит переплывать только в самом крайнем случае)
это лучший алгоритм поиска пути какой сейчас существует но он требует интенсивных вычислений которые было бы просто невозможно просчитать в скрипте l2phx.
этот алгоритм работает везде где есть как минимум 2 координатных оси
я о нём вычитал из книжки но наверно в инете тож можно про него прочесть
я так понимаю его смысл действия

есть точка A - начало и точка B - конец пути а так же база данных где каждому квадрату местности присваевается своего рода "стоимость" прохода по этому квадрату
например стоимость прохода по квадрату где есть дорога =1 то есть самая выгодная а стоимость прохода по обычной зелёной траве с возможностью встреч и кучей мобов =2 по воде =3 а стены и прочие препятствия просто не имеют цены так как их обходят.

имея всё выше приведённое ASTAR переключается на точку A и затем посещаек каждую из соседних к нему квадратов (всего у каждого квадрата 8 соседних квадратов)
и записывает данные каждого из посещённых квадратов в таком виде (чем длинее путь тем больше квадратов и тем больше вычислений)

Код:
квадрат такой то номер такой то.значение счёта = растояние этого квадрата до точки B + стоимость "проезда" к текущей точке
этот же квадрат такой то номер такой то.родитель квадрата = его родитель (квадрат от которого начали поиск)
когда он прошёлся по квадрату A он идёт дальше по циклу и переходит на тот квадрат у коготого "значение счёта" меньше всех остальных и вокруг которого есть ещё не посещённые клетки, так же посещает всех соседей (8 штук)
и опять переходит на тот квадрат у коготого "значение счёта" меньше всех остальных и вокруг которого еще есть не посещённые квадраты
(при этом квадраты которые содержат стены и другие препятствия не обрабатываются и игнорируются)
когда алгоритм доходит до точки B он строит сам путь по "родителям квадрата" (тут можно ещё добавить алгоритм сокращения пути типа если через 2 точки пути можно провести линию которая не касается препятствий то...)

ну скорее всего я так и не смог нужные слова подобрать чтоб опистаь этот алгоритм так что поищите в инете если не поняли :)

но самое главное что если его подключить к боту то бот станет ориентироватся на месности лучше человека и сможет качатся в лесу где куча деревьев и выстраивать пути до ближайших мобов быстрее чем это делает человек :)

Цитата:
как ты это делаешь и насколько надежно обходит препятствия?
мой алгаритм обхода препятствий не требует почти никаких вычислений :) и очень простой но и поэтому не эффективный и работает в основном чтоб обойти дерево или камешек и то шанс что он это сделат составлет примерно 75% а если встретит камешек побольше и по сложнее в конструкци то застрянет в нём навсегда :)

в общем смысл в том что бот посылает сигнал серваку на атаку моба а если перед ботом препятствие то серв шлёт пакет боту что он остановился где то на пол пути к мобу и если этот пакет повторяется 2 раза значит бот делает вывод что он застрял (это всегда работает безошибочно) затем включается собственно сам алгоритм обхода препятствия и он заключается в том что бот вмето того чтоб посылать пакет на атаку моба шлёт своего пакет передвижения со своими координатами сдвинутыми например по оси X или Y на 20-30 и таким образом появляется шанс что он обойдёт эту преграду но не очень большой :)
в общем в исходниках все выглядит так
Код:
procedure MoveToLocation(id,xpos,ypos,zpos:integer);
begin if(on1=true)then AddBD(id, xpos, ypos, zpos, 1);
 if((myID=id)and(xpov=xpos)and(ypov=ypos))then idpov:=idpov+1;

 if((myID=id)and(xpov<>xpos)and(ypov<>ypos))then begin
    xpov:=xpos;
    ypov:=ypos;
    idpov:=0;
 end;
end;
если idpov больше 2 то
Код:
if(idpov>=2)then begin
getrstr:='01'+
anti4HEX(myXreal)+
anti4HEX(myYreal+30)+
anti4HEX(myZpot)+
anti4HEX(myXreal)+
anti4HEX(myYreal)+
anti4HEX(myZpot)+
'01000000'; HPtime:=0;
end;
__________________
На людей сердишся, когда чувсивуешь, что их поступки важны. Ничего подобного я больше не чувствую...
skymanrus вне форума   Ответить с цитированием
За это сообщение skymanrus нажился 3 спасибками от: