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

Скриптинг Форум посвещенный созданию скриптов для L2PacketHack

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 06.01.2008, 03:33   #131
Пользователь
 
Регистрация: 10.12.2007
Сообщений: 52
Сказал Спасибо: 22
Имеет 16 спасибок в 9 сообщенях
ChiterEPT
По умолчанию Re: Re:

Цитата:
Сообщение от jestb
Цитата:
Сообщение от lQaKl
1. - это как? а просто пати кинуть?
А если кинет кто-то другой,а не я ? :) просто я не разбираюсь в программировании, и вряд ли до меня это дойдет - чтобы только от меня принимал, надо чтобы он сканировал мой ID и если это я, то давал данс, если правильно понимаю?
Цитата:
Сообщение от lQaKl
2. - проверяешь, если от сервака пришел пакет с пришлашением в пати - отправляешь пакет на прием пати
что-то типо:
begin
if "тебе кидают пати" and "пати именно от "ник""
then
begin
"принять пати, дать данс и свалить с пати"
end;
end.
В пакете с предложением о вступлении в пати #$39 со второго байта идет имя предлогающего:
ReadS(2).
ChiterEPT вне форума   Ответить с цитированием
Старый 06.01.2008, 05:28   #132
Рыцарь
 
Аватар для mks
 
Регистрация: 21.09.2007
Сообщений: 376
Сказал Спасибо: 11
Имеет 218 спасибок в 106 сообщенях
mks пока неопределено
По умолчанию Re: ДА БУДЕТ БОТ!

Всем привет, всех с новым годом!
Давно не заходил, смотрю тем рассплодилось немерено)), все не перечитал....
Лан, в общем не об этом я)).... Решил как-то я сделать бота хиллера(биш, се, не важно....) -смысл - лечить членов пати.... Набросал для начала небольшой скриптик, который анализировал пакеты от сервера содержащие информацию об изменениях параметров членов пати и тупо хилил тех у кого ХП меньше чем я укажу.... По началу казалось что все нормально, но когда я начал его использовать в больших пати(не только со своими ботами), начались проблемы - хилер тупо лечил того члена пати, чей пакет пришел первым, т.е. допустим один член пати буквально умирает, а бот лечит другого, у которого ХП еще много, но соответствовало указаному минимуму. Переделал с проверкой на больше нуждающегося в ХП члена пати))... Вроде правильно все высказал, голова квадратная после нового года)))

Ну в общем выкладываю бота хилера(СЕ), написал вчера, еще много собираюсь добавить....

Имеются несколько режимов, включаются и выключаются социальными действиями начиная с первого, думаю поймете(не китайцы же))):
-режима лечения(первое соц. действие) -действует граматно, -изначально вычисляет у кого из пати меньше всего ХП, потом сравнивает его с указанным в const HP, если меньше, то хилит его первым.
-режим бега(второе соц. действие) -режим бега работает так, что бот бежит туда же куда и хозяин, но с отклонением которое можно указать в const -chaos, генерируется случайным образом
режимы включаются и выключаются тем же соц. действием.
-ну и третье соц. дейстие - вливает МП хозяину, можно будет сделать что б это шло и автоматом, но пока не вижу смысла....
Комментарии не ставил дабы избежать пользования скриптом ламаков. Кому надо поймет, кому не понятно обьясню....
Код:
Const
  HP=2000;
  BotName='имя СЕ';
  MasterName='имя Коммандира';
  Chaos=100;

  GreatHeal='2F C1 04 00 00 00 00 00 00 00';
  GroupHeal='2F C3 04 00 00 00 00 00 00 00';

var
   CharName: array[1..9] of string;
   CharID:   array[1..9] of integer;
   CurHP:    array[1..9] of integer;
   MaxHP:    array[1..9] of integer;
   CurMP:    array[1..9] of integer;
   MaxMP:    array[1..9] of integer;
   Dev:      array[1..9] of extended;
   xe, ye: extended;
   PartyCount,i,f,e,t,MinHP,NeedHP,ox,oy,oz,x,y,z,MasterID,BotID: integer;
   exist, HealKey, RunKey: boolean;

   TimerHP: TTimer;

procedure Init; //?????????? ??? ????????? ???????
begin
  TimerHP:=TTimer.Create(nil);
  TimerHP.OnTimer:=@OnTimerHP;
  TimerHP.enabled:=true;
  TimerHP.interval:=1000;
end;

procedure Heal;
begin
    //target
    buf:=#$04;
    WriteD(CharID[NeedHP]);
    WriteD(ox);
    WriteD(oy);
    WriteD(oz);
    WriteC(0);
    SendToServerEx(BotName);
    //heal
    buf:=hstr(GreatHeal);
    SendToServerEx(BotName);
end;

procedure SendMsg(msg:string);
begin
buf:=#$4A;
WriteD(BotID);
WriteD(2);
WriteS(BotName);
WriteS(msg);
SendToClient;
end;

procedure Min(n1,n2:integer);
begin
if n1<n2 then MinHP:=n1 else MinHP:=n2;
end;

procedure OnTimerHP(Sender: TObject);
begin
  if PartyCount>0 then
  begin
    MinHP:=CurHP[1];
    for t:=1 to PartyCount do
    begin
        if CharName[t]=MasterName then MasterID:=CharID[t];
        if CharName[t]=BotName then BotID:=CharID[t];
        min(MinHP,CurHP[t]);
    end;
    for t:=1 to PartyCount do
    begin
        if CurHP[t]=MinHP then
        begin
        NeedHP:=t;
        break;
        end;
    end;
    if (HealKey=true) and (MinHP<HP) then Heal;
  end;
end;

procedure Free; //?????????? ??? ?????????? ???????
begin
PartyCount:=0;
TimerHP.free;
 HealKey:=false;
 RunKey:=false;
end;

//???????? ????? ???????
//?????????? ??? ??????? ??????? ?????? ???? ?????? ???????
begin

if FromServer and (pck[1]=#$52) then
  begin
    i:=6;
    for f:=1 to (PartyCount+1) do
        begin
             if CharID[f]=ReadD(2) then exist:=true else exist:=false;
             if exist=true then
             begin
                CharName[f]:=ReadS(i);
                i:=i+8;
                CurHP[f]:=ReadD(i);
                MaxHP[f]:=ReadD(i);
                CurMP[f]:=ReadD(i);
                MaxMP[f]:=ReadD(i);
                Dev[f]:=CurHP[f]/MaxHP[f];
                break;
             end;
        end;

        if exist=false then
                begin
                PartyCount:=PartyCount+1;
                f:=PartyCount;
                CharID[f]:=ReadD(2);
                CharName[f]:=ReadS(i);
                i:=i+8;
                CurHP[f]:=ReadD(i);
                MaxHP[f]:=ReadD(i);
                CurMP[f]:=ReadD(i);
                MaxMP[f]:=ReadD(i);
                Dev[f]:=CurHP[f]/MaxHP[f];
                end;
  end;


   if FromClient and (ConnectName=MasterName) and (RunKey=true) and (pck[1]=#$01) then
      begin
         xe:=ReadD(2)-Chaos/2+round(random*Chaos);
         ye:=ReadD(6)-Chaos/2+round(random*Chaos);

         x:=round(xe);
         y:=round(ye);
         z:=ReadD(10);

         buf:=#$01;
         WriteD(x);
         WriteD(y);
         WriteD(z);
         WriteD(ox);
         WriteD(oy);
         WriteD(oz);
         ox:=x;
         oy:=y;
         oz:=z;
         SendToServerEx(BotName);
      end;


   if FromClient and (ConnectName=BotName) and (pck[1]=#$01) then
      begin
         ox:=ReadD(2);
         oy:=ReadD(6);
         oz:=ReadD(10);
      end;


      //Heal mode
if FromClient and (ConnectName=MasterName) and (pck=hstr('1B 02 00 00 00')) then
begin
HealKey:=not(HealKey);
pck:='';
Case HealKey of
true: SendMsg('Heal mode ON');
false: SendMsg('Heal mode OFF');
end;
end;

//Run mode
if FromClient and (ConnectName=MasterName) and (pck=hstr('1B 03 00 00 00')) then
begin
RunKey:=not(RunKey);
pck:='';
Case RunKey of
true: SendMsg('Run mode ON');
false: SendMsg('Run mode OFF');
end;
end;

if FromClient and (pck=hstr('1B 04 00 00 00')) then
 begin
     //target master
    buf:=#$04;
    WriteD(MasterID);
    WriteD(ox);
    WriteD(oy);
    WriteD(oz);
    WriteC(0);
  SendToServerEx(BotName);
  buf:=hstr('2F F5 03 00 00 00 00 00 00 00');
  SendToServerEx(BotName);
  pck:='';
 end;
end.
ЗЫ да, забыл добавить, это походу баг пакетхака - скрипт пришлось немного видоизминять, не буду перечислять все, но допустим если последние три части переставить в начало(что не изменит программу) ПХ выдает ошибку....
__________________
FA©Q!
mks вне форума   Ответить с цитированием
За это сообщение mks нажился спасибкой от:
Старый 06.01.2008, 13:24   #133
Новичок
 
Регистрация: 18.12.2007
Сообщений: 3
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
mdbodia
По умолчанию

Пытался написать скрипт на автоподбор вещей. То-есть я привожу чара на локацию, и он собирает всё что там валяеться. Взял для этого из выложенного тут бота функцию. Но блин, совершенно ничего не получилось. Скрипт не стал выкладывать, да-бы не показывать всем какой я ламер. Буду пытаться ещё сегодня разобраться, если получиться - выложу. Просто вопрос: может там всё проще чем я думаю? Кто знает как это сделать, ну или может у когото такой скрипт есть, напишите плз.
mdbodia вне форума   Ответить с цитированием
Старый 06.01.2008, 21:10   #134
Рыцарь
 
Аватар для NLObP
 
Регистрация: 25.02.2008
Адрес: г.Волгоград
Сообщений: 2,009
Сказал Спасибо: 1,285
Имеет 1,458 спасибок в 793 сообщенях
NLObP пока неопределено
По умолчанию Re: ДА БУДЕТ БОТ!

Полные скрипты лежат на форуме.
1)Подбор вещей выпадающих с мобов, вариант.
Код:
//***************************************************************
function rastoyanie(xpos1, ypos1, xpos2, ypos2:extended):integer; //возвращает переменную rezu которая является растоянием между 2 точками
begin
  result:= Round(Sqrt(((xpos1-xpos2)*(xpos1-xpos2))+((ypos1-ypos2)*(ypos1-ypos2))));
end;
begin
  //****************************************************************************
  if (ConnectName=Name) and FromServer then begin
    case pck[1] of
      #$0C: begin
          if (MyXpos<>0) then begin
            //rastoyanie(MyXpos, MyYpos, ReadD(14), ReadD(18));
            if (rastoyanie(MyXpos, MyYpos, ReadD(14), ReadD(18))<=200) then begin
              mlk.Lines.Add('Выпала вещь!!!');
              timer1.enabled:=false;
              buf:=#$04;
              WriteD(ReadD(6));
              WriteD(ReadD(14));
              WriteD(ReadD(18));
              WriteD(ReadD(22));
              WriteC(0);
              SendToServerEx(Name);
              mlk.Lines.Add(' Пробую поднять!!!');
              delay(1000);
              timer1.enabled:=true;
            end;
          end;
      end;
  end;
end.
2) Вот еще один вариан
Код:
//******************************************************************************
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;
begin
  //****************************************************************************
  //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;
  //****************************************************************************
  //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;

  //****************************************************************************
  if Wait(time1,2000) and NeedBackup and (underAttack=false) then ReqGetItem;

  //****************************************************************************
  //определяем реальность поднятия вещи
  //GetItem
  if FromServer and (ConnectName=Name) and (pck[1]=#$0D) then begin
    //перебираем базу
    for i:=1 to max do begin
      //если нашли, то обнуляем
      if (ItemBase[1,i]=ReadD(6)) then begin  //ObjectID
        ItemBase[1,i]:=0; //ObjectID
        ItemBase[2,i]:=0; //x
        ItemBase[3,i]:=0; //y
        ItemBase[4,i]:=0; //z
        dec(itm);
        //say('Удаляем данные по предмету');
      end;
    end;
    if itm=0 then begin
      needbackup:=false;
      timer1.enabled:=true;
    end;
    say('ColvoItm='+inttostr(itm));
  end;
end.
__________________
| Для самых ленивый | Телепаты в отпуске |Мы работаем над этим |
Не умеешь - учись, не хочешь учиться - плати © Суровый Закон Жизни


NLObP вне форума   Ответить с цитированием
Старый 06.01.2008, 21:22   #135
Гость
 
Сообщений: n/a
По умолчанию НЕ берет в таргет( при нажатии на 8 ) где ошипка)

var
target: string;


begin

//PartyMemberPosition
if fromserver and (pck[1]=#$A7) then
begin
target:=#$04+pck[6]+pck[7]+pck[8]+pck[9]+pck[10]+pck[11]+pck[12]+pck[13]+pck[14]+pck[15]+pck[16]+pck[17]+pck[18]+pck[19]+pck[20]+pck[21]+#$00;
end;

//Say ? ??????
if fromserver and (pck[1]+pck[6]=#$4A#$02) then
begin
case ord(pck[18]) of
$38:
begin
buf:=target;
SendToServer;
end;
end;
end;
end.
  Ответить с цитированием
Старый 06.01.2008, 22:10   #136
Новичок
 
Регистрация: 18.12.2007
Сообщений: 3
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
mdbodia
По умолчанию Re: ДА БУДЕТ БОТ!

Цитата:
Сообщение от NLObP
Полные скрипты лежат на форуме.
Спасибо огромное, но это автоподбор когда бью моба, с него падает вешь, и он её подымает. А мн надо что-б я мог привести чара на поляну усыпанную дропом и он её попылесосил.
mdbodia вне форума   Ответить с цитированием
Старый 07.01.2008, 00:13   #137
Рыцарь
 
Аватар для NLObP
 
Регистрация: 25.02.2008
Адрес: г.Волгоград
Сообщений: 2,009
Сказал Спасибо: 1,285
Имеет 1,458 спасибок в 793 сообщенях
NLObP пока неопределено
По умолчанию Re: ДА БУДЕТ БОТ!

Цитата:
Сообщение от mdbodia
Цитата:
Сообщение от NLObP
Полные скрипты лежат на форуме.
Спасибо огромное, но это автоподбор когда бью моба, с него падает вешь, и он её подымает. А мн надо что-б я мог привести чара на поляну усыпанную дропом и он её попылесосил.
Здесь надо начать с теории. Что значит усыпано предметами? Как и видимые НПС и прочее, в том числе предметы, мы это видим в клиенте потому, что он обрабатывает все пакеты начиная с коннекта к серверу. А бот, которого включили прийдя на поляну усыпанную вещами, как он их увидит?! Вот то-то и оно. Для того, чтобы хоть что-то работало, надо ловить пакеты, я уже указал подобную процедуру. Для тех кто в танке, вот начало ее:
Код:
//SpawnItem #$0B - валяется вещь
if FromServer and (ConnectName=Name) and (pck[1]=#$0B) then begin
И ловить надо задолго до подхода к месту. В идеале она должна все время работать и вносить в базу данных. По команде уже можно пробовать собрать предметы, например в радиусе 2000 единиц. Сейчас немного понятно?
__________________
| Для самых ленивый | Телепаты в отпуске |Мы работаем над этим |
Не умеешь - учись, не хочешь учиться - плати © Суровый Закон Жизни


NLObP вне форума   Ответить с цитированием
Старый 07.01.2008, 00:44   #138
Новичок
 
Регистрация: 18.12.2007
Сообщений: 3
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
mdbodia
По умолчанию

Немного стало понятнее, спасибо. Щас будем пробовать.
mdbodia вне форума   Ответить с цитированием
Старый 07.01.2008, 17:31   #139
Новичок
 
Регистрация: 01.01.2008
Сообщений: 3
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
djbandit
По умолчанию

NLObP

Привет!!!!!!!!!!!!!!!!!!!!!!Большая просьба к тебе - напиши пожалуйста рабочий скрипт по автозаточке к интерлюде!!!Если сможешь проверь la2world.ru сервак: pvp1!Спасибо заранее!!!!!!!!!!!!!!!!!!!!!
djbandit вне форума   Ответить с цитированием
Старый 08.01.2008, 11:29   #140
Гость
 
Сообщений: n/a
По умолчанию все таки почему в таргет не берет(прошу без мата=)

var
target: string;


begin

//PartyMemberPosition
if fromserver and (pck[1]=#$A7) then
begin
target:=#$04+pck[6]+pck[7]+pck[8]+pck[9]+pck[10]+pck[11]+pck[12]+pck[13]+pck[14]+pck[15]+pck[16]+pck[17]+pck[18]+pck[19]+pck[20]+pck[21]+#$00;
end;

//Say ? ??????
if fromserver and (pck[1]+pck[6]=#$4A#$02) then
begin
case ord(pck[18]) of
$38:
begin
buf:=target;
SendToServer;
end;
end;
end;
end.
  Ответить с цитированием
Ответ

  CoderX :: Forums > Lineage II > L2PacketHack > Скриптинг


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

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

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


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

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

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