Жесткий скриптингРаздел для обсуждения готовых и тестируемых скриптов
Внимание! В разделе введена жесткая модерация, темы и сообщения публикуются только после проверки модераторами
Недавно решил попробовать написать бота для l2phx и чтоб все вычисления проходили в dll'ке
что дало бы огромный полюс в скорости выполнения скриптов а так же расширения возможностей простого бота
например если я когда нидь уберу все ошибки из этого кода я возможно попытаюсь внедрить в него алгоритм ASTAR который занимается тем что строит пути т.е. можно будет указать боту идти в гиран из орена пешком и он сам построит путь а если встретит препятствия то внесёт их в базу данных и обойдёт
возможности:
умеет качаться в ограниченном круге,
круг можно ограничить по Z оси чтоб не мочил тех мобов что под землёй,
имеет мини карту с возможностью масштабирования,
если уперается в дерево или камень то пытается её обойти,
если вы юзнёте в процессе кача бутылку хп то он запоминает её ид и юзает её когда хп ниже 70%,
садится когда хп 55% и встаёт при 100%,
все эти значения принятые по умолчанию можно изменить в main.dpr или привязать эти переменные к каким то событиям в форме.
ВНИМАНИЕ!!!
ДЛЯ ВКЛЮЧЕНИЯ БОТА НАДО УСТАНОВИТЬ ГАЛОЧКУ НА ЗАГРУЗОЧНОМ СКРИПТЕ КОТОРЫЙ ЕСТЬ В АРХИВЕ И ЖЕЛАТЕЛЬНО ЭТО ВСЕ ДЕЛАТЬ В ОКНЕ ВЫБОРА ЧАРА А ЗАТЕМ НАЖАТЬ КНОПКУ ЧТОБ ВОЙТИ В МИР ТОГДА ВСЕ ДАННЫЕ БУДУТ ГРУЗИТЬСЯ НАИБОЛЕЕ ПРАВИЛЬНО, ХОТЯ МОЖНО И ПРОСТО В ИГРЕ ЮЗНУТЬ КАКУЮ ТО ВЕЩЬ ТИПА ЛЕЧИЛКИ И БОТ ТОЖЕ ВКЛЮЧИТСЯ НО ТОГДА БОТ БУДЕТ ДОЛЬШЕ ГРУЗИТСЯ И МОЖЕТ ПРИВЯЗАТСЯ К КАКОМО ТО ЧАРУ ИЛИ НПЦ
ну в общем я писал такой код чтоб его можно было быстро понять и использовать как базу для разработки своих модификаций.
все расчёты ведутся в файле SKYbot.pas и при желании SKYbotFORM1.pas можно легко выключить и скомпилить длл без создания формы или прилепить свою форму.
однако иногда случаются кое какие ошибки которые я пока не могу профиксить...
в общем смотрите сами: SKYbot_Source.rar SKYbot.rar
если найдёте ошибки то пожалуйста укажите когда она возникает и что случается
а если укажите ошибки в самом файле исходника то буду просто бесконечно благодарен
__________________
На людей сердишся, когда чувсивуешь, что их поступки важны. Ничего подобного я больше не чувствую...
Последний раз редактировалось NLObP, 26.06.2008 в 17:49.
Причина: исправил ссылки
За это сообщение skymanrus нажился 21 спасибками от:
Молодец! :good:
Только StatusUpdate не правильно работает. На локальных серваках в С4 CurHP/MaxHP - нули показывает, а в Интерлюде вместо MaxHP - MP показывает. Проверил на онлайн серваке С4 - ХП определяет правильно.
И еще, дроп не всегда поднимает. Особенно если Мобы атаковали кучей.
Может лучше оба кода обрабатывать?
Код:
#$0E:if(pck[10]=#$09)then CallFunction(lib,'StatusUpdate',2,[ReadD(2),ReadD(14)]);
и
#$0E:if(pck[10]=#$0A)then CallFunction(lib,'StatusUpdate',2,[ReadD(2),ReadD(14)]);
я тестил его тока на 1 серваке и там была интерлюдия а бота написал так чтоб можно было прост немного подправить скипт в l2phx чтоб правильные значения передавались в бота.
в общем скрипт вызывающий dll можно и нужно менять в зависимости от пакетов с сервера!
на счет дропа:
в проге есть функция DropItem
и строки
Код:
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;
d<=220 //тоесть если растояния от тебя до упавшей вещи не больше 220 то вещь может быть поднята
если хочеш измени это значение на большее но главное не переборшить а то он будет бегать за каждой вещью которую выкинули на карте :)
__________________
На людей сердишся, когда чувсивуешь, что их поступки важны. Ничего подобного я больше не чувствую...
За это сообщение skymanrus нажился 2 спасибками от:
я возможно попытаюсь внедрить в него алгоритм 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;
Подбор предметов: мне кажется надежнее создавать массив выпавших вещей
я так и сделал :)
Код:
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;
бот сам будет их вносить в базу в зависимости от скорости прохода по тому или иному участку пути :)
т.е. дорога которая есть на карте и мимо которой бегают агро мобы может оказатся для бота не столь безопасным местом по сравнению с пустой и ровной полянкой :) и он скорее выберет дорогу через эту полянку чем через дорогу где бегают агрессоры
то есть будет самообучающийся бот :) послал его из глудио в орен а он идёт натыкается на препятствия и мобов и учится :) и в следующий раз если ты его пошлёш по тому же маршруту он уже пойдёт более изведанными и безопасными тропами :)
__________________
На людей сердишся, когда чувсивуешь, что их поступки важны. Ничего подобного я больше не чувствую...
skymanrus твой бот гиниален!!!пачти также генялен как волкер! но есть некатарое глюки....например лут он саберает на 5% и нет вазможности быстрой настройки бота на юз тех или иных абилок...вошем Big спс!,но жду недаждусь новай версии:D
Добавлено спустя 3 часа 50 минут 38 секунд:
Шас заметил что если на перса вешаетьсе больше1 ног моба то скрипт киляет первого моба и стаит парядка 2 мин чегото ожедая,в то время как моб ламает ребра бедному персу...