PDA

Просмотр полной версии : SKYbot-dll бот


skymanrus
16.03.2008, 01:27
Недавно решил попробовать написать бота для l2phx и чтоб все вычисления проходили в dll'ке
что дало бы огромный полюс в скорости выполнения скриптов а так же расширения возможностей простого бота
например если я когда нидь уберу все ошибки из этого кода я возможно попытаюсь внедрить в него алгоритм ASTAR который занимается тем что строит пути т.е. можно будет указать боту идти в гиран из орена пешком и он сам построит путь а если встретит препятствия то внесёт их в базу данных и обойдёт

вот можете посмотреть что получилось :) (http://up.li.ru/?id=342160;%C2%C2.jpg) не судите строго:)

возможности:
умеет качаться в ограниченном круге,
круг можно ограничить по Z оси чтоб не мочил тех мобов что под землёй,
имеет мини карту с возможностью масштабирования,
если уперается в дерево или камень то пытается её обойти,
если вы юзнёте в процессе кача бутылку хп то он запоминает её ид и юзает её когда хп ниже 70%,
садится когда хп 55% и встаёт при 100%,
все эти значения принятые по умолчанию можно изменить в main.dpr или привязать эти переменные к каким то событиям в форме.

ВНИМАНИЕ!!!
ДЛЯ ВКЛЮЧЕНИЯ БОТА НАДО УСТАНОВИТЬ ГАЛОЧКУ НА ЗАГРУЗОЧНОМ СКРИПТЕ КОТОРЫЙ ЕСТЬ В АРХИВЕ И ЖЕЛАТЕЛЬНО ЭТО ВСЕ ДЕЛАТЬ В ОКНЕ ВЫБОРА ЧАРА А ЗАТЕМ НАЖАТЬ КНОПКУ ЧТОБ ВОЙТИ В МИР ТОГДА ВСЕ ДАННЫЕ БУДУТ ГРУЗИТЬСЯ НАИБОЛЕЕ ПРАВИЛЬНО, ХОТЯ МОЖНО И ПРОСТО В ИГРЕ ЮЗНУТЬ КАКУЮ ТО ВЕЩЬ ТИПА ЛЕЧИЛКИ И БОТ ТОЖЕ ВКЛЮЧИТСЯ НО ТОГДА БОТ БУДЕТ ДОЛЬШЕ ГРУЗИТСЯ И МОЖЕТ ПРИВЯЗАТСЯ К КАКОМО ТО ЧАРУ ИЛИ НПЦ

ну в общем я писал такой код чтоб его можно было быстро понять и использовать как базу для разработки своих модификаций.

все расчёты ведутся в файле SKYbot.pas и при желании SKYbotFORM1.pas можно легко выключить и скомпилить длл без создания формы или прилепить свою форму.

однако иногда случаются кое какие ошибки которые я пока не могу профиксить...
в общем смотрите сами:
SKYbot_Source.rar (http://coderx.ru/attachment.php?attachmentid=29&d=1211519198)
SKYbot.rar (http://coderx.ru/attachment.php?attachmentid=28&d=1211519182)

если найдёте ошибки то пожалуйста укажите когда она возникает и что случается
а если укажите ошибки в самом файле исходника то буду просто бесконечно благодарен :)

NLObP
16.03.2008, 03:47
Молодец! :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)]);

skymanrus
16.03.2008, 11:42
я тестил его тока на 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 то вещь может быть поднята
если хочеш измени это значение на большее но главное не переборшить а то он будет бегать за каждой вещью которую выкинули на карте :)

NLObP
16.03.2008, 12:47
я возможно попытаюсь внедрить в него алгоритм ASTAR который занимается тем что строит пути т.е. можно будет указать боту идти в гиран из орена пешком и он сам построит путь а если встретит препятствия то внесёт их в базу данных и обойдёт
Подробнее про этот алгоритм можно?

возможности:
... если уперается в дерево или камень то пытается её обойти,

как ты это делаешь и насколько надежно обходит препятствия?

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;

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

NLObP
16.03.2008, 15:49
Это ведь типа геодаты получается? Где данные по стоимости участка брать будем?

skymanrus
16.03.2008, 15:57
бот сам будет их вносить в базу в зависимости от скорости прохода по тому или иному участку пути :)
т.е. дорога которая есть на карте и мимо которой бегают агро мобы может оказатся для бота не столь безопасным местом по сравнению с пустой и ровной полянкой :) и он скорее выберет дорогу через эту полянку чем через дорогу где бегают агрессоры

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

NLObP
16.03.2008, 16:09
Пойду думать. Может, что нибудь простенькое получится. Я у тебя много полезных идей перенял. Спасибо. :)

skymanrus
16.03.2008, 16:16
да незачто:) всегда рады :D

PunkRediska
17.03.2008, 06:55
skymanrus твой бот гиниален!!!пачти также генялен как волкер! но есть некатарое глюки....например лут он саберает на 5% и нет вазможности быстрой настройки бота на юз тех или иных абилок...вошем Big спс!,но жду недаждусь новай версии:D

Добавлено спустя 3 часа 50 минут 38 секунд:
Шас заметил что если на перса вешаетьсе больше1 ног моба то скрипт киляет первого моба и стаит парядка 2 мин чегото ожедая,в то время как моб ламает ребра бедному персу...

Grinch
17.03.2008, 07:13
кстате для твоего алгаритма лутьше юзать геодату сервера т.к. по ней бот может очень быстро просчитать путь и после двигаться по ней и не надо будет ничего забивать в базу... имхо моё мнения и понятия не имею с чем едят геодату :)

NLObP
17.03.2008, 14:21
имеет мини карту с возможностью масштабирования

Можешь подсказать каой алгоритм применял и может еще какие есть для синхронизации реальных координат и координат карты?
Я когда миникарту делал так и не смог приличного совпадения сделать. А там еще и картинку карты можно вставлять, так вообще пипец как выбирать нужную из кучи картинок.

QaK
17.03.2008, 14:38
Вопрос ко всем, у меня одного КоллФункшн вылетает с крит эррором (хотя и выполняется) если количество аргументов от 1 и больше,если 0 аргументов - то намана вызывается из дллки.

ttmii
17.03.2008, 17:14
Сейчас попытался заюзать его на Шоке Экстриме - нифига ((( 0 эмоций, подозреваю что это всвязи с недавним обновлением ? ((

DashKAaa
17.03.2008, 18:21
Сейчас попытался заюзать его на Шоке Экстриме - нифига ((( 0 эмоций, подозреваю что это всвязи с недавним обновлением ? ((
Все работает отлично, видимо не верно запускаешь кури форум все ответы в поиске найти реально!

спасибо за проделанный труд!

skymanrus
17.03.2008, 20:48
Можешь подсказать каой алгоритм применял и может еще какие есть для синхронизации реальных координат и координат карты?
да ниче особенного впринципе - афиновы перобразования на плоскости


cofx:=round((MobsX[i]-(myXreal-(750*zooom)))/(11*zooom)+27); {т.е. берём мою X координату и отнимаем от неё 750 * переменную маштабности (которую изменаеш когда перетаскиваеш тракбар) тем самым мы выделяем число которое будет проэкцией крайней левой стороны предпологаемого квадрата видимости который мы видим на форме, затем от координаты моба отнимаем это число и получаем координату которая которая уже будет в квадрате видимости а дальше её прост немного уменьшаем чтоб она вписалась в форму (11*zooom) и прибавляем 27 чтоб та точка на карте которая обозначала нашего чара была в центре квадрата }

cofy:=round((MobsY[i]-(myYreal-(750*zooom)))/(11*zooom)+17); // тож самое с Y

Rectangle(cofx, cofy, cofx+6, cofy+6); //рисуем моба на форме

А там еще и картинку карты можно вставлять, так вообще пипец как выбирать нужную из кучи картинок.
я кстати хотел прилепить к нему свои карты так как это вполне реально надо только создать функцию которая в зависимости от текущих координат чара будет грузить нужную картинку эт просто сделать другое дело что самих карт пока нету и переводить их из волкера тож не хочется потому что они не совсем точные а во вторых я решил если и буду карты вставлять то не такие тупые как в волкере, лучше сделать карту где просто отмеченны стены потому что она опять же гораздо удобнее чем тупые карты волкера и эти же карты сможет в последствии использовать внедрённый алгоритм ASTAR в качестве своеобразной геодаты :)

спросите откуда будут браться карты ? :)
их будет рисовать бот атыкаясь на стены и качаясь на локациях !
в посдедствии готовыми картами можно будет обмениваться и в конце концов думаю можно будет составить отличную геодату бота :)
Вопрос ко всем, у меня одного КоллФункшн вылетает с крит эррором (хотя и выполняется)
у меня так же было по началу главное чтоб количество параметров указанных в [] совпадало с их числом которое ставиш до []
то есть
вот простейший вызов
var lib:Integer;
procedure Init;
begin
lib:=loadLibrary('skeleton.dll');
SHOWMESSAGE(INTTOSTR(CallFunction(lib,'TestHello', 0,[0]))); //если ниче не передаём
//1 значение передаём SHOWMESSAGE(INTTOSTR(CallFunction(lib,'TestHello', 1,[23])));
//2 значение передаём SHOWMESSAGE(INTTOSTR(CallFunction(lib,'TestHello', 2,[23,32])));
//так же можно и строки передать SHOWMESSAGE(INTTOSTR(CallFunction(lib,'TestHello', 2,["dfgsва",32])));
end;

procedure Free;begin FreeLibrary(lib);end;
begin end.
ошибки при вызове CallFunction могут ещё вылетать из-за не правильно составленной dll'ки
CallFunction может возвращать ТОЛЬКО ЧИСЛА!!!

Сейчас попытался заюзать его на Шоке Экстриме
повторюсь: у меня в архиве загрузочный файл dll'ки настроен под интерлюд и тестился только на 1 серваке та что надо перенастраивать этот файлик чтоб в dll правильные значения передавались

ttmii
17.03.2008, 21:30
[quote:77666]Сейчас попытался заюзать его на Шоке Экстриме
повторюсь: у меня в архиве загрузочный файл dll'ки настроен под интерлюд и тестился только на 1 серваке та что надо перенастраивать этот файлик чтоб в dll правильные значения передавались[/quote:77666]

К сожалению, мне такое не под силу (( может поможешь ? ;) или подскажи что и чем править ))
пс: я чайник )

DashKAaa
18.03.2008, 00:37
Пробовал бота на шоке, а точнее на шоке-6 все отлично работает видит мобов и вокруг и так же отмечает на карте точки своего маршрута и долбит мобов и подбирает дроп только не весь, некоторый пролетает и сразуже долбит следующего моба.

заметил только проблема с поднятием дропа.. иногда не весь поднимает и сразуже кидается в атаку на другого моба, а дроп лежит на земле

PunkRediska
19.03.2008, 02:19
skymanrus, падскажи пажалуста дураку,как можно сменить % хп при катроам но садиться на респ и как можно заставить его юзать скилы,в том числе бафы...вопрос заключаеться не столько в алгаритмном испалнении сколько в том как эти функции загнать те в дльку и как заствить пакетхак их патом оттуда юзать?

skymanrus
19.03.2008, 13:42
skymanrus, падскажи пажалуста дураку
отличный вопросы и совсем не дурацкие ! :)

как можно сменить % хп
в файле main.dpr
проставленны все эти значения в % принятые по умолчанию
sitHPproc:=55; upHPproc:=100;butHPproc:=70;
можно конечно их там изменить и перекомпилить все но лучше будет сделать так
procedure TForm1.Edit3Change(Sender: TObject);
begin sitHPproc:=strtoint(Form1.Edit3.text); end;

procedure TForm1.Edit4Change(Sender: TObject);
begin butHPproc:=strtoint(Form1.Edit4.text);end;

procedure TForm1.Edit5Change(Sender: TObject);
begin upHPproc:=strtoint(Form1.Edit5.text);end;


и как можно заставить его юзать скилы
это уже по сложнее
вот попытаюсь это обьяснить на примере скила спойла
вот наши заветные 10 байт обозначающие сей скилл '2F FE 00 00 00 00 00 00 00 00'
теперь чтоб заставить бота использовать этот скилл надо просто вставить его в единственную функцию которая вызывается из dll'ки и передаёт какую то инфу l2phx эта функция в исходнике называется
procedure atackMOB;
ВНИМАНИЕ ! не путать с процедурой procedure Attack(atk,tar,xpos,ypos,zpos: integer); ! это разные процедуры!

именно из atackMOB посылаются все пакеты (сесть, встать, юзнуть банку ударить моба) которые гененирует SKYbot так что для того чтоб он юзал какие то скилы надо туда пихнуть в конец процедуры перед последними end;end; код использования скилла какого захочеш
например так
getrstr:='2F FE 00 00 00 00 00 00 00 00';
:) теперь все что будет делать бот это тупо кидать на всех споил и все ! :) ну тоесть испортиться фактически :)
для того чтоб он знал когда надо юзать скил а когда надо и другими вещами заниматься (сесть, встать, юзнуть банку ударить моба) надо добавить условие при котором юзается сей скилл например для спойла
это условие будет на человеском языке звучать так - если моб ещё не заспойлен то надо его заспойлить

а на delphi это будет по сложнее озвучить
надо добавить в SKYbot ещё 1 процедуру сбора информации которая будет говорить SKYbot что каст на моба прошёл

все процедуры сбора информации вы увидите в l2phx в скритпе который грузит dll
#$03:CallFunction(lib,'CharInfo',4,[ReadD(18),ReadD(2),ReadD(6),ReadD(10)]);
#$04:CallFunction(lib,'UserInfo',6,[ReadD(18),ReadD(2),ReadD(6),ReadD(10),126,ReadS(22 )]);
#$01:CallFunction(lib,'MoveToLocation',4,[ReadD(2),ReadD(6),ReadD(10),ReadD(14)]);
#$16:CallFunction(lib,'NpcInfo',6,[ReadD(2),ReadD(10),ReadC(121),ReadD(14),ReadD(18), ReadD(22)]);
#$12:CallFunction(lib,'killmob',1,[ReadD(2)]);
#$06:CallFunction(lib,'killmob',1,[ReadD(2)]);
#$05:CallFunction(lib,'Attack',5,[ReadD(2),ReadD(6),ReadD(15),ReadD(19),ReadD(23)]);
#$0D:CallFunction(lib,'GetItem',1,[ReadD(6)]);
#$0C:CallFunction(lib,'DropItem',5,[ReadD(10),ReadD(6),ReadD(14),ReadD(18),ReadD(22)]);
#$0E:if(pck[10]=#$09)then CallFunction(lib,'StatusUpdate',3,[ReadD(2),ReadD(14),ReadD(22)]);
#$27:CallFunction(lib,'InventoryUpdate',2,[ReadD(12),ReadD(8)]);

то есть новая процедура будет такая
#$76:CallFunction(lib,'MagicSkillLaunched',2,[ReadD(2),ReadD(18)]);
первый аргумент который передаются в dll'ку будут идом того кто юзнул скилл - ReadD(2) а ReadD(18) это ид того на кого юзнули скилл

теперь надо собственно создать процедуру MagicSkillLaunched в dll'ке

первым наперво добавляем её к списку экспортируемых функций в файле main.dpr
exports MagicSkillLaunched,getr,UserInfo....

затем надо написать саму процедуру в файле SKYbot.pas

для этого перед директивой implementation обьявляем прототип функции типа
procedure MagicSkillLaunched(idskill,idtarget:integer); stdcall;
и потом пишем саму процедуру после директивы implementation
в которой надо как то пометить моба на которого ты юзаеш сей скилл
например самый простой вариант который мне сейчас пришёл на ум это создание ещё одного массива где будут хранится данные показывающие использовался ли на данном мобе какой то скилл
типа массива MobsSKILL: array[1..150] of integer;
и теперь если в дллку в процедуру MagicSkillLaunched придет 2 значения в первом будет ид нашего чара а во втором будет ид моба то можно записать это в массив MobsSKILL и теперь SKYbot знает что на каком то мобе был использовать какой скилл
дальше надо обязательно найти процедуру procedure killmob(id:integer);
и поставить там строку обнуляющую MobsSKILL в случае смерти моба
теперь когда все данные у нас есть можно свободно составить в процедуре atackMOB соответствующие условие для вызова скилла спойла
например такое

if MobsSKILL[ataM]=0 then getrstr:='2F FE 00 00 00 00 00 00 00 00';
в переменной ataM записан номер моба в "базе данных" (на самом деле это всего лиш несколько массивов) которого сейчас атакует бот тоесть на человеческом языке строка
if MobsSKILL[ataM]=0 then getrstr:='2F FE 00 00 00 00 00 00 00 00';
будет звучать так:
моб которого сейчас атакует чар был заспойлен? если 0 то спойлим
мы его заспойлили и тут же пришёл пакет в процедуру MagicSkillLaunched а в ней в MobsSKILL записалось соответствующие значение отличное от нуля и теперь бот не будет больше использовать споил на заспойленного моба когда моб умрет бот сотрёт все данные о нём и запишет туда другого моба если встретит

вот так вот :D все очень просто :ROFL:

я бы сам этим сейчас занялся но не особо сейчас вижу смысла продолжать писать этот алгоритм на delphi так как честно говоря я был немного удивлён когда получил дллку в пол мига где почти ничего не делается :) кроме того время от времени возникают очень странные ошибки т.е. бот качается так себе... и как бы все хорошо но тут оп и та процедура которую он уже выполнил раз 100000 вдруг выдаёт неизвесную ошибку.. это меня добивает чесно говоря, не говоря уже о том что скорость выполнения расчётов оставляет желать лучшего... короче решил я все под ассемблер переписать чем сейчас и занимаюсь в настоящий момент

DashKAaa
19.03.2008, 14:36
хмм, привязать его к 1 персонажу возможно? чтоб все окна дургие не двигались, а двигалось только одно.
ну и что бы получше крошил всех мобов в радиусе своем, а то залетных не убивает, а стоит терпит как терминатор удары от них :x

skymanrus
19.03.2008, 20:42
хмм, привязать его к 1 персонажу возможно?
конечно!
на самом деле эта длл тока вычисляет пакеты и передаёт все свои вычисления в пакет хак а вычисления строит на основе поступившей инфы которую шлёт тот же пакет хак тоесть можно написать такой загрузочный скрипт
program SKYbot;
var lib:Integer;name:string;t:TTimer;function p(n:integer;):string;var a:array[1..18]of char;i,r:Integer;begin a[1]:='1';a[2]:='2';a[3]:='3';a[4]:='4';a[5]:='5';a[6]:='6';a[7]:='7';a[8]:='8';a[9]:='9';a[10]:='0';a[11]:='A';a[12]:='B';a[13]:='C';a[14]:='D';a[15]:='E';a[16]:='F';a[17]:=' ';Result:='';for i:=1 to 500 do begin r:=CallFunction(lib,'getr',2,[n,i]);if(r=-1)then break;Result:=Result+a[r];end;end;
procedure Init;begin
t:=TTimer.Create(nil);t.OnTimer:=@OnT;t.enabled:=t rue;t.interval:=1000;
//укажите точный путь к файлу SKYbot.dll
lib:=loadLibrary('C:\l2phx320\1\SKYbot_Source\1\ma in.dll');
name:='НИК ЧАРА!';
end;procedure OnT;var t:string;begin
//вызов функции из SKYbot.dll
t:=p(1);if(t<>'')then begin buf:=Hstr(t);SendToServerEx(name);end;
end;procedure Free;begin t.Free;FreeLibrary(lib);end;
//-----------MAIN------------
begin if FromServer and (ConnectName=name) then case pck[1]of
#$03:CallFunction(lib,'CharInfo',4,[ReadD(18),ReadD(2),ReadD(6),ReadD(10)]);
#$04:CallFunction(lib,'UserInfo',6,[ReadD(18),ReadD(2),ReadD(6),ReadD(10),126,ReadS(22 )]);
#$01:CallFunction(lib,'MoveToLocation',4,[ReadD(2),ReadD(6),ReadD(10),ReadD(14)]);
#$16:CallFunction(lib,'NpcInfo',6,[ReadD(2),ReadD(10),ReadC(121),ReadD(14),ReadD(18), ReadD(22)]);
#$12:CallFunction(lib,'killmob',1,[ReadD(2)]);
#$06:CallFunction(lib,'killmob',1,[ReadD(2)]);
#$05:CallFunction(lib,'Attack',5,[ReadD(2),ReadD(6),ReadD(15),ReadD(19),ReadD(23)]);
#$0D:CallFunction(lib,'GetItem',1,[ReadD(6)]);
#$0C:CallFunction(lib,'DropItem',5,[ReadD(10),ReadD(6),ReadD(14),ReadD(18),ReadD(22)]);
#$0E:if(pck[10]=#$09)then CallFunction(lib,'StatusUpdate',3,[ReadD(2),ReadD(14),ReadD(22)]);
#$27:CallFunction(lib,'InventoryUpdate',2,[ReadD(12),ReadD(8)]);
end;end.

Добавлено спустя 2 минуты 25 секунд:
Re:

ну и что бы получше крошил всех мобов в радиусе своем, а то залетных не убивает, а стоит терпит как терминатор удары от них :x

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

PunkRediska
19.03.2008, 21:29
и потом пишем саму процедуру после директивы implementation
в которой надо как то пометить моба на которого ты юзаеш сей скилл
например самый простой вариант который мне сейчас пришёл на ум это создание ещё одного массива где будут хранится данные показывающие использовался ли на данном мобе какой то скилл
типа массива MobsSKILL: array[1..150] of integer;
и теперь если в дллку в процедуру MagicSkillLaunched придет 2 значения в первом будет ид нашего чара а во втором будет ид моба то можно записать это в массив MobsSKILL и теперь SKYbot знает что на каком то мобе был использовать какой скилл
дальше надо обязательно найти процедуру procedure killmob(id:integer);
и поставить там строку обнуляющую MobsSKILL в случае смерти моба
теперь когда все данные у нас есть можно свободно составить в процедуре atackMOB соответствующие условие для вызова скилла спойла
например такое

if MobsSKILL[ataM]=0 then getrstr:='2F FE 00 00 00 00 00 00 00 00';
в переменной ataM записан номер моба в "базе данных" (на самом деле это всего лиш несколько массивов) которого сейчас атакует бот тоесть на человеческом языке строка
if MobsSKILL[ataM]=0 then getrstr:='2F FE 00 00 00 00 00 00 00 00';
будет звучать так:

М-м... всё ето канечно оч интересно,и как нестранно панятно:),но всёже хочет задать допалнительный вапрос:"можно ли привязать юзанье скила к % саатношению хп?" насколько я панемаю для етого надо написать в самой функци procedure MagicSkillLaunched(idskill,idtarget:integer); stdcall;
что типа if curHP/maxHp/100<60 then getstr:='2F 10 00 00 00 00 00 00 00 00'; так?

Добавлено спустя 4 минуты 30 секунд:
Ешё вапросик,в файле SKYbotFORM1 описуються вкладки и мапа?

Добавлено спустя 11 секунд:
Ешё вапросик,в файле SKYbotFORM1 описуються вкладки и мапа?

DashKAaa
19.03.2008, 23:48
хмм, привязать его к 1 персонажу возможно?
конечно!
на самом деле эта длл тока вычисляет пакеты и передаёт все свои вычисления в пакет хак а вычисления строит на основе поступившей инфы которую шлёт тот же пакет хак тоесть можно написать такой загрузочный скрипт
program SKYbot;
var lib:Integer;name:string;t:TTimer;function p(n:integer;):string;var a:array[1..18]of char;i,r:Integer;begin a[1]:='1';a[2]:='2';a[3]:='3';a[4]:='4';a[5]:='5';a[6]:='6';a[7]:='7';a[8]:='8';a[9]:='9';a[10]:='0';a[11]:='A';a[12]:='B';a[13]:='C';a[14]:='D';a[15]:='E';a[16]:='F';a[17]:=' ';Result:='';for i:=1 to 500 do begin r:=CallFunction(lib,'getr',2,[n,i]);if(r=-1)then break;Result:=Result+a[r];end;end;
procedure Init;begin
t:=TTimer.Create(nil);t.OnTimer:=@OnT;t.enabled:=t rue;t.interval:=1000;
//укажите точный путь к файлу SKYbot.dll
lib:=loadLibrary('C:\l2phx320\1\SKYbot_Source\1\ma in.dll');
name:='НИК ЧАРА!';
end;procedure OnT;var t:string;begin
//вызов функции из SKYbot.dll
t:=p(1);if(t<>'')then begin buf:=Hstr(t);SendToServerEx(name);end;
end;procedure Free;begin t.Free;FreeLibrary(lib);end;
//-----------MAIN------------
begin if FromServer and (ConnectName=name) then case pck[1]of
#$03:CallFunction(lib,'CharInfo',4,[ReadD(18),ReadD(2),ReadD(6),ReadD(10)]);
#$04:CallFunction(lib,'UserInfo',6,[ReadD(18),ReadD(2),ReadD(6),ReadD(10),126,ReadS(22 )]);
#$01:CallFunction(lib,'MoveToLocation',4,[ReadD(2),ReadD(6),ReadD(10),ReadD(14)]);
#$16:CallFunction(lib,'NpcInfo',6,[ReadD(2),ReadD(10),ReadC(121),ReadD(14),ReadD(18), ReadD(22)]);
#$12:CallFunction(lib,'killmob',1,[ReadD(2)]);
#$06:CallFunction(lib,'killmob',1,[ReadD(2)]);
#$05:CallFunction(lib,'Attack',5,[ReadD(2),ReadD(6),ReadD(15),ReadD(19),ReadD(23)]);
#$0D:CallFunction(lib,'GetItem',1,[ReadD(6)]);
#$0C:CallFunction(lib,'DropItem',5,[ReadD(10),ReadD(6),ReadD(14),ReadD(18),ReadD(22)]);
#$0E:if(pck[10]=#$09)then CallFunction(lib,'StatusUpdate',3,[ReadD(2),ReadD(14),ReadD(22)]);
#$27:CallFunction(lib,'InventoryUpdate',2,[ReadD(12),ReadD(8)]);
end;end.

Добавлено спустя 2 минуты 25 секунд:
Re:

ну и что бы получше крошил всех мобов в радиусе своем, а то залетных не убивает, а стоит терпит как терминатор удары от них :x

это недоработки в программе в новой версии я всё это исправлю
есть ещё вариант что это исправит кто то другой :) исходники то есть :D
щас я как раз составляю примерный список того тчо надо изменить и что надо добавить
Будем ждать новую версию с удовольствием затестю ее в деле)
ну а косяки я отписывал какие встречал за 48 часов нон стоп кача в теме да будет БОТ на 19 страничке

Добавлено спустя 38 минут 44 секунды:
прописав ник вссе равно вторые окна долбят тоже мобов....

NLObP
07.04.2008, 18:50
Skymanrus!
Первый вопрос. Новая версия скоро будет? :)
Второй. Расскажи для чего арк тангенсы нужны? Может подскажешь, что почитать на эту тему?
function ArcTan2(y : Extended; x : Extended) : Extended;
begin
if (x=0) then x:=0.01;
Result:=1;
Try
begin
if (((x>=0) and (y>0)) or ((x>=0) and (y<=0))) then Result:=ArcTan(y/x)*180/pi;
if ((x<0) and (y>=0)) then Result:=(ArcTan(y/x)*180/pi)+180;
if ((x<0) and (y<0)) then Result:=(ArcTan(y/x)*180/pi)-180;
end;
except on E:Exception do
begin
ShowMessage('код 4: y:'+floattostr(y)+' x:'+floattostr(x)+' Result:'+floattostr(Result)+' !'+E.ClassName+' ошибка: '+E.Message);
end;
end;
end;
и
//--------эта процедура вычисляет мои реальные координаты-----------//
procedure MYposPROC;
var
i:integer;
begin
if(on1=true)then
begin
try
begin
HPtime:=HPtime+1;
if(myXreal=0) then
begin
myXreal:=myXpot;
myYreal:=myYpot;
end;
//изменение текущих координат чара
if ((myXreal<>0) and (myYreal<>0) and (ras(myXreal, myYreal, myXpot, myYpot)>=33)) then
begin
myXreal:=round(myXreal+((MYspeed/2)*cos(pi+(pi/180*ArcTan2(myYreal-myYpot,myXreal-myXpot)))));
myYreal:=round(myYreal+((MYspeed/2)*sin(pi+(pi/180*ArcTan2(myYreal-myYpot,myXreal-myXpot)))));
end;
//обновляем растояния от меня до мобов
for i:=0 to length(MobsRAS)-1 do
begin
if(MobsRAS[i]<>0) then MobsRAS[i]:=ras(myXreal,myYreal,MobsX[i],MobsY[i]);
//включаем режим бота если onSKYbot=true
if(onSKYbot=true)then
begin
if(myXradiy=0) then
begin
myXradiy:=myXreal;
myYradiy:=myYreal;
yaSIT:=false;
end;
end
else
begin
myXradiy:=0;
myYradiy:=0;
end;

end;
except on E:Exception do ShowMessage('код 54: onSKYbot:'+Booltostr(onSKYbot)+' myXreal:'+inttostr(myXreal));
end;
end;
end;

NLObP
08.04.2008, 00:58
я наверно первый нуб который даже не представляет как его запускать....
Помогите запустить)) :D
Складываешь SKYbot.dll и SKYbot_script_for_l2phx.txt в папку Scripts.
На странице скрипты выбираешь SKYbot_script_for_l2phx.txt ставя на нем галочку.
Остальное в первом сообщении есть.

Grinch
11.04.2008, 09:18
Второй. Расскажи для чего арк тангенсы нужны? Может подскажешь, что почитать на эту тему?
типа что б не бегать задом на перёд, но могу и ошибаться

Добавлено спустя 1 минуту 4 секунды:
зы так же можно разобраться как убегать от моба. т.е. куда

skymanrus
14.04.2008, 12:41
Расскажи для чего арк тангенсы нужны? Может подскажешь, что почитать на эту тему?


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

принцып работы функции arcTan2 взят из ActionScript там эта функция встроенная.

Первый вопрос. Новая версия скоро будет?
щас времени свободного маловаты но думаю что скоро напишу...
как я уже писал до этого я решил писать новую версию на ассемблере и уже написал там функцию расчёта расстояний а так же форму сделал для вывода инфы осталось только самая малость :)

Emocean
15.04.2008, 15:19
Привет.
Я правильно понимаю, что для передачи пакета из длл в скрипт используется функция getr?
Просто передать строку из длл в скрипт невозможно?
В этом и заключается несовершенство работы пакетхака с длл'ками?

skymanrus
15.04.2008, 16:15
Emocean ты всё правильно понял :)

Emocean
15.04.2008, 16:43
То есть пакет по сути передается множеством значений integer?
Если функция возвращает integer, то CallFunction нормально передаст это значение?
А какие еще типы можно передать из dll?

Ptica
16.04.2008, 12:54
skymanrus, есть предложение переделать SKYbot для работы без пакетхака

skymanrus
16.04.2008, 17:46
То есть пакет по сути передается множеством значений integer?
Если функция возвращает integer, то CallFunction нормально передаст это значение?
А какие еще типы можно передать из dll?
Emocean у меня лично кроме обычных чисел со знаком ничего не передавалось и это не удивительно потому что если взглянуть как реализована функция CallFunction в пакет хаке то всё становится ясно...
там функция dll вызывается через ассемблерную вставку и результат работы этой dll функции помещается в 32-битный регистр eax а этот регистр сам по себе не может кикак передать строки и вообще ничего кроме цифр, хотя тип char в него должен свободно умещатся но он не передаётся... короче как я уже писал сейчас в пакет хаке функция CallFunction может возвращать только 4-байтовые числа со знаком в народе говоря - integer

skymanrus, есть предложение переделать SKYbot для работы без пакетхака

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

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

Emocean
16.04.2008, 18:35
skymanrus, спасибо за развернутый ответ :)
Интересно, а никто не пробовал переписать функцию CallFunction и перекомпилировать пакетхак?

QaK
17.04.2008, 09:58
а никто не пробовал переписать функцию CallFunction и перекомпилировать пакетхак?Я пробую, пока не очень получается.

skymanrus
17.04.2008, 13:25
Я пробую, пока не очень получается.
да эта работка на пару недель если не месяцев...

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

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

да и я всё же не понимаю зачем этот вопрос вобще обсуждать если я уже в исходниках своих показывал как строки передавать произвольные и с большой скоростью...

Grinch
17.04.2008, 17:37
skymanrus, спасибо за развернутый ответ :)
Интересно, а никто не пробовал переписать функцию CallFunction и перекомпилировать пакетхак?

:grin::-D знаю типа такого сейчас типо етим тока и занимается :))) говорить не буду кто это забанит

Добавлено через 51 секунду
ы он уже ответил :)

Emocean
24.04.2008, 11:38
если у кого нить есть возможность - обновите файлы пожалуйста. на дампе ссылки подохли. (файл отсутствует на нашем сервере.)
Там было это:

poizon
30.04.2008, 14:09
ну так как на счёт того чтобы его запустить?
проблема то остаётся, при запуске выдаёт ту самую ошибку про которую жаловались выше ещё давно.
сервак абисс интерлюд

NLObP
30.04.2008, 15:32
ну так как на счёт того чтобы его запустить?
проблема то остаётся, при запуске выдаёт ту самую ошибку про которую жаловались выше ещё давно.
сервак абисс интерлюд

Опиши ошибку подробнее. У меня запускался и на С4 и на Интерлюдии.

NLObP
23.05.2008, 10:07
Skybot by skymanrus

Archibal
25.02.2009, 23:59
Бот прикольный - респект канешно, действительно жаль что новой версии так и нету - может кто в курсе о её судьбе?
Столкнулся с такой бедой - работает супер - но как только подбтрает с дропа бафф-бутылку сопориться и больше ничего не делает((

usta
31.03.2009, 00:12
Бот очень прикольный респект за труды, хотелось бы увидить новую версию, благодарен заранее

DashKAaa
02.04.2009, 11:43
Бот от локомотива, на данный момент самый актуальный.

hackbozb
02.11.2009, 16:33
http://xmages.net/out.php/i601968_.jpg (http://xmages.net) появляется после того как в окне выбора персонажа ставлю галочку напротив скрипта, и выдает такие сообщения каждые 2 секунды... Что не так???

cSSx
05.11.2009, 01:34
У меня такая проблема запускаю скрипт ,скрипт врубается ,но не чего не происходит ,чар тупо стоит на месте)


P/s -посоветуйте как быть?

sinles
01.12.2009, 14:55
Мне кажется увеличить шансы на успешный обход камня или дерева можно просто ощупывая его носом. То есть отправлять бота не в какие то случайные координаты вокруг него а заставить его перебирать все возможные варианты выхода из ситуации, назад - вправо - вперед - влево, чередуя их при этом с попытками повторно напасть на моба и для верности с попытками найти другого расположенного ближе. Таким образом будет гораздо больше информации о препятствиях на местности которую можно будет записывать составляя карту.

TAMBIK
02.12.2009, 01:59
ощупывая его носом.
а заставить его перебирать все
возможные варианты выхода из ситуации,
назад - вправо - вперед - влево,
а как это по вашему мнению будит
выглядеть в машинном коде

sinles
02.12.2009, 19:39
С первой страницы
if(idpov>=2)then begin
getrstr:='01'+
anti4HEX(myXreal)+
anti4HEX(myYreal+30)+
anti4HEX(myZpot)+
anti4HEX(myXreal)+
anti4HEX(myYreal)+
anti4HEX(myZpot)+
'01000000'; HPtime:=0;
end;
Не знаю как и что работает дальше но просто это следует слегка разнообразить, то есть что то на подобии такого:
(пишу условно на С)

void fu1 (bool a, int b)
{
if(a)
{
getrstr:='01'+
anti4HEX(myXreal)+
anti4HEX(myYreal+b)+
anti4HEX(myZpot)+
anti4HEX(myXreal)+
anti4HEX(myYreal)+
anti4HEX(myZpot)+
'01000000'; HPtime:=0;
return;
}
getrstr:='01'+
anti4HEX(myXreal+b)+
anti4HEX(myYreal)+
anti4HEX(myZpot)+
anti4HEX(myXreal)+
anti4HEX(myYreal)+
anti4HEX(myZpot)+
'01000000'; HPtime:=0;
}

//основная процедура или управляющая
{
...
while(Не_Подвергнут_Нападению)
{
Напасть_на_выбранного_моба
if(idpov>=2)
{
//генерируем 2 параметра в зависимости от того какой раз персонаж втыкается носом Например:
bool a = (rand()%3 % 2)? 1 : 0; //что бы чара уносило в сторону
int b = (rand()%3 % 2)? -30 : 30;
fu1(a, b);
} //if
} //while
...
}

вот что я имел ввиду. Как мне кажется такой вариант позволит как минимум долго рыпатся :)

alexteam
02.12.2009, 20:57
"Долго рыпаться в рандомных направлениях" не есть "алгоритмом обхода препятствий". ибо как минимум глупо, как максимум неэффективно.

sinles
03.12.2009, 00:15
глупо стоять перед маленьким камушком и думать что это непроходимое препятствие :)
не сложные по конструкции препятствия, такие как: камни, деревья, ровные стены, да и в общем много других, Можно преодолевать "взявшись правой рукой за стену" и двигаясь вперед, для того что бы не ходить по кругу, а что бы все же найти выход, следует с каждой "итерацией" пытаться отправится по назначению....
Эффективность конечно явно ниже чем заранее просчитанный путь вокруг, НО этот просчитанный путь требует разработки довольно сложного алгоритма и алгоритм как в задачи коммивояжера не годится, потому как он ооочень ресурсоемкий.
Я предлагаю заставить бота двигаться в тех направлениях в которых мы знаем что нет стены (это не то что я писал выше в коде) а мы точно знаем что её нет там откуда мы пришли, то есть шаг назад, теперь мы знаем что её нет или справа или слева, то есть шагаем в сторону, если стена то повторяем до тех пор пока мы не подойдем к краю области в которой сказано быть, пока не войдем в бой (битва а дальше надо подумать) в таком случае меняем ведущую руку вот и все.

Что тут может быть не эффективного ? мы топчемся лишнюю минуту вокруг камня не более того.

При отсутствии данных о внешнем мире я не представляю других вариантов решения, как похоже и автор и в общем то вы :)

alexteam
03.12.2009, 01:12
astar. и Этим все сказано.

Bad_Bad
11.12.2009, 20:28
Обходить надежднее по схеме формата:

если уперлись в препятствие, то
отойти назад и немного в сторону
продолжить движение (простая атака в случе мили)

sinles
14.12.2009, 14:19
Вот о чем я и говорил. Так и препятствие носом ощупаем, получим данные, и достигнем цели.

Lynx
20.12.2009, 20:36
а можно самому перед качем описывать каждое препятствие как окружность, куда нельзя ходить? 2-мя тыками: По центру препятствия и по его краю. Записывать в файл центр окружности и её радиус. Каждый раз, когда хотим куда-то пойти, прверять, нет ли между нами и мобом препятствия.

довольно утомительно, но перед боем потратишь 5мин на описание местности, в следующий раз туда же вернёшься. потом можно дополнять свой файл чужими. чтобы не перегружать комп проверками разбить всю карту на квадраты и загружать из файла только нужный
а что такое это ASI?

ZaN
30.12.2009, 16:15
2Lynx

http://coderx.ru/showthread.php?t=2265 (что такое ASI)

pkforewer
30.12.2009, 18:09
пишет ошибку
"Код 8 cur 185191 max 1754"
как исправить? нажимаю "ок" вылетает л2пнх потом дисконект из л2

Breadfan
12.01.2010, 09:25
пишет ошибку
"Код 8 cur 185191 max 1754"
как исправить? нажимаю "ок" вылетает л2пнх потом дисконект из л2
тебе нужно тело скрипта поправить под свой сервер - в данном случае - некорретно сичтываются показатели хп\мп

LamerOK
27.01.2010, 16:03
я так и не понял какие именно части тела скрипта отвечают за адаптацию к определенному серверу?

Breadfan
12.12.2012, 18:03
длл под себя перепиши.

http://coderx.ru/attachment.php?attachmentid=29&d=1211519198 вот это
да какая вам разница, в атаку вставьте тупо одним скилом спамить.