Жесткий скриптингРаздел для обсуждения готовых и тестируемых скриптов
Внимание! В разделе введена жесткая модерация, темы и сообщения публикуются только после проверки модераторами
Недавно решил попробовать написать бота для 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 спасибками от:
хмм, привязать его к 1 персонажу возможно? чтоб все окна дургие не двигались, а двигалось только одно.
ну и что бы получше крошил всех мобов в радиусе своем, а то залетных не убивает, а стоит терпит как терминатор удары от них :x
конечно!
на самом деле эта длл тока вычисляет пакеты и передаёт все свои вычисления в пакет хак а вычисления строит на основе поступившей инфы которую шлёт тот же пакет хак тоесть можно написать такой загрузочный скрипт
delphi Код:
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:=1to500dobegin r:=CallFunction(lib,'getr',2,[n,i]);if(r=-1)thenbreak;Result:=Result+a[r];end;end;
procedure Init;begin
t:=TTimer.Create(nil);t.OnTimer:=@OnT;t.enabled:=true;t.interval:=1000;
//укажите точный путь к файлу SKYbot.dll
lib:=loadLibrary('C:\l2phx320\1\SKYbot_Source\1\main.dll');
name:='НИК ЧАРА!';
end;procedure OnT;var t:string;begin
//вызов функции из SKYbot.dll
t:=p(1);if(t<>'')thenbegin buf:=Hstr(t);SendToServerEx(name);end;
end;procedure Free;begin t.Free;FreeLibrary(lib);end;
//-----------MAIN------------beginif FromServer and(ConnectName=name)thencase 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:
Цитата:
Сообщение от DashKAaa
ну и что бы получше крошил всех мобов в радиусе своем, а то залетных не убивает, а стоит терпит как терминатор удары от них :x
это недоработки в программе в новой версии я всё это исправлю
есть ещё вариант что это исправит кто то другой исходники то есть
щас я как раз составляю примерный список того тчо надо изменить и что надо добавить
__________________
На людей сердишся, когда чувсивуешь, что их поступки важны. Ничего подобного я больше не чувствую...
и потом пишем саму процедуру после директивы 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 описуються вкладки и мапа?
конечно!
на самом деле эта длл тока вычисляет пакеты и передаёт все свои вычисления в пакет хак а вычисления строит на основе поступившей инфы которую шлёт тот же пакет хак тоесть можно написать такой загрузочный скрипт
Код:
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:=true;t.interval:=1000;
//укажите точный путь к файлу SKYbot.dll
lib:=loadLibrary('C:\l2phx320\1\SKYbot_Source\1\main.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:
Цитата:
Сообщение от DashKAaa
ну и что бы получше крошил всех мобов в радиусе своем, а то залетных не убивает, а стоит терпит как терминатор удары от них :x
это недоработки в программе в новой версии я всё это исправлю
есть ещё вариант что это исправит кто то другой :) исходники то есть :D
щас я как раз составляю примерный список того тчо надо изменить и что надо добавить
Будем ждать новую версию с удовольствием затестю ее в деле)
ну а косяки я отписывал какие встречал за 48 часов нон стоп кача в теме да будет БОТ на 19 страничке
Добавлено спустя 38 минут 44 секунды:
прописав ник вссе равно вторые окна долбят тоже мобов....
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;
я наверно первый нуб который даже не представляет как его запускать....
Помогите запустить)) :D
Складываешь SKYbot.dll и SKYbot_script_for_l2phx.txt в папку Scripts.
На странице скрипты выбираешь SKYbot_script_for_l2phx.txt ставя на нем галочку.
Остальное в первом сообщении есть.
Расскажи для чего арк тангенсы нужны? Может подскажешь, что почитать на эту тему?
они нужны для расчёта промежуточных кординат между 2 точками (точкой начала движения и точкой конца движения)
если не использовать промежуточные координаты мы увидим что наш чар не плавно перемещается по карте а прыгает из точки в точку в результате если например предпологаемый бот будет на довольно большом растоянии и бот прыгнет туда и в то время этого моба замочит кто то другой то бот остановится в неизвесной точке и дальше пойдут ошибки в вычислениях вот чтоб этой лажи не было и нужен арктангенс2 который по 2 проэкциям координат может определить угол направления и таким образом мы можем высчитать все промежуточные координаты
принцып работы функции arcTan2 взят из ActionScript там эта функция встроенная.
Цитата:
Первый вопрос. Новая версия скоро будет?
щас времени свободного маловаты но думаю что скоро напишу...
как я уже писал до этого я решил писать новую версию на ассемблере и уже написал там функцию расчёта расстояний а так же форму сделал для вывода инфы осталось только самая малость :)
__________________
На людей сердишся, когда чувсивуешь, что их поступки важны. Ничего подобного я больше не чувствую...
Привет.
Я правильно понимаю, что для передачи пакета из длл в скрипт используется функция getr?
Просто передать строку из длл в скрипт невозможно?
В этом и заключается несовершенство работы пакетхака с длл'ками?