Вернуться   CoderX :: Forums > Lineage II > L2PacketHack > Жесткий скриптинг
Войти через OpenID

Жесткий скриптинг Раздел для обсуждения готовых и тестируемых скриптов
Внимание! В разделе введена жесткая модерация, темы и сообщения публикуются только после проверки модераторами

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 16.03.2008, 01:27   #1
Пользователь
 
Аватар для skymanrus
 
Регистрация: 28.12.2007
Сообщений: 54
Сказал Спасибо: 0
Имеет 40 спасибок в 10 сообщенях
skymanrus пока неопределено
По умолчанию SKYbot-dll бот

Недавно решил попробовать написать бота для 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 вне форума   Ответить с цитированием
За это сообщение skymanrus нажился 21 спасибками от:
Старый 16.03.2008, 03:47   #2
Рыцарь
 
Аватар для NLObP
 
Регистрация: 25.02.2008
Адрес: г.Волгоград
Сообщений: 2,009
Сказал Спасибо: 1,285
Имеет 1,458 спасибок в 793 сообщенях
NLObP пока неопределено
По умолчанию Re: SKYbot-dll бот

Молодец! :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)]);
__________________
| Для самых ленивый | Телепаты в отпуске |Мы работаем над этим |
Не умеешь - учись, не хочешь учиться - плати © Суровый Закон Жизни


NLObP вне форума   Ответить с цитированием
Старый 16.03.2008, 11:42   #3
Пользователь
 
Аватар для skymanrus
 
Регистрация: 28.12.2007
Сообщений: 54
Сказал Спасибо: 0
Имеет 40 спасибок в 10 сообщенях
skymanrus пока неопределено
По умолчанию

я тестил его тока на 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 вне форума   Ответить с цитированием
За это сообщение skymanrus нажился 2 спасибками от:
Старый 16.03.2008, 12:47   #4
Рыцарь
 
Аватар для NLObP
 
Регистрация: 25.02.2008
Адрес: г.Волгоград
Сообщений: 2,009
Сказал Спасибо: 1,285
Имеет 1,458 спасибок в 793 сообщенях
NLObP пока неопределено
По умолчанию Re: SKYbot-dll бот

Цитата:
Сообщение от skymanrus
я возможно попытаюсь внедрить в него алгоритм 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;
__________________
| Для самых ленивый | Телепаты в отпуске |Мы работаем над этим |
Не умеешь - учись, не хочешь учиться - плати © Суровый Закон Жизни


NLObP вне форума   Ответить с цитированием
За это сообщение NLObP нажился спасибкой от:
Старый 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 спасибками от:
Старый 16.03.2008, 15:49   #6
Рыцарь
 
Аватар для NLObP
 
Регистрация: 25.02.2008
Адрес: г.Волгоград
Сообщений: 2,009
Сказал Спасибо: 1,285
Имеет 1,458 спасибок в 793 сообщенях
NLObP пока неопределено
По умолчанию Re: SKYbot-dll бот

Это ведь типа геодаты получается? Где данные по стоимости участка брать будем?
__________________
| Для самых ленивый | Телепаты в отпуске |Мы работаем над этим |
Не умеешь - учись, не хочешь учиться - плати © Суровый Закон Жизни


NLObP вне форума   Ответить с цитированием
Старый 16.03.2008, 15:57   #7
Пользователь
 
Аватар для skymanrus
 
Регистрация: 28.12.2007
Сообщений: 54
Сказал Спасибо: 0
Имеет 40 спасибок в 10 сообщенях
skymanrus пока неопределено
По умолчанию

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

то есть будет самообучающийся бот :) послал его из глудио в орен а он идёт натыкается на препятствия и мобов и учится :) и в следующий раз если ты его пошлёш по тому же маршруту он уже пойдёт более изведанными и безопасными тропами :)
__________________
На людей сердишся, когда чувсивуешь, что их поступки важны. Ничего подобного я больше не чувствую...
skymanrus вне форума   Ответить с цитированием
За это сообщение skymanrus нажился спасибкой от:
Старый 16.03.2008, 16:09   #8
Рыцарь
 
Аватар для NLObP
 
Регистрация: 25.02.2008
Адрес: г.Волгоград
Сообщений: 2,009
Сказал Спасибо: 1,285
Имеет 1,458 спасибок в 793 сообщенях
NLObP пока неопределено
По умолчанию Re: SKYbot-dll бот

Пойду думать. Может, что нибудь простенькое получится. Я у тебя много полезных идей перенял. Спасибо. :)
__________________
| Для самых ленивый | Телепаты в отпуске |Мы работаем над этим |
Не умеешь - учись, не хочешь учиться - плати © Суровый Закон Жизни


NLObP вне форума   Ответить с цитированием
Старый 16.03.2008, 16:16   #9
Пользователь
 
Аватар для skymanrus
 
Регистрация: 28.12.2007
Сообщений: 54
Сказал Спасибо: 0
Имеет 40 спасибок в 10 сообщенях
skymanrus пока неопределено
По умолчанию

да незачто:) всегда рады :D
__________________
На людей сердишся, когда чувсивуешь, что их поступки важны. Ничего подобного я больше не чувствую...
skymanrus вне форума   Ответить с цитированием
Старый 17.03.2008, 06:55   #10
Новичок
 
Регистрация: 07.11.2007
Сообщений: 14
Сказал Спасибо: 1
Имеет 1 спасибку в 1 сообщении
PunkRediska
По умолчанию

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

Добавлено спустя 3 часа 50 минут 38 секунд:
Шас заметил что если на перса вешаетьсе больше1 ног моба то скрипт киляет первого моба и стаит парядка 2 мин чегото ожедая,в то время как моб ламает ребра бедному персу...
__________________
http://www.magnum-shoes.ru/
PunkRediska вне форума   Ответить с цитированием
За это сообщение PunkRediska нажился спасибкой от:
Ответ

  CoderX :: Forums > Lineage II > L2PacketHack > Жесткий скриптинг


Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 17:50.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!