Код:
Подбор предметов: мне кажется надежнее создавать массив выпавших вещей
я так и сделал :)
Код:
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;