1

Тема: Скрипты

Делимся в этой теме полезными скриптами для программы. Можно под хайдом smile

«Кораблю безопасней в порту. Но он не для этого строился.»

2

Re: Скрипты

Сборщик ников в файлик с проверкой повторов. Работает везде, пригодится для статистики или дальнейшей спам-рассылки по почтам\личкам

var
  DC_FLAG: Boolean;
  SL: TStringList;
const
  BLOCK_PACKET = $FFFF;
  fname = 'nicks.txt';

function RecvHandler(var s: string): Integer;
var
  str, nick: String;
  cmd: string;
begin
  DC_FLAG := False;

  Result := 0;
  cmd := Copy(s, 1, 4);
  if (cmd = '031F') then
  begin
     str := Copy(s, ($2B*2+1), Length(s));
     str := Copy(str, 1, pos('00', str));
     nick := HexToStr(str);     
     if SL.IndexOf(nick) = (-1) then SL.Add(nick);
  end;
end;

function CheckDisconnect(): Boolean;
const
  DC_TIMEOUT = 30000;
begin
  Result := False;
  DC_FLAG := TRUE;
  Sleep(DC_TIMEOUT);

  SL.SaveToFile(fname);  

  // Если за отведённое время не поступило 
  // входящих пакетов - нас отключило от сервера
  if DC_FLAG = TRUE then Result := True;
end;

begin
  SL := TStringList.Create();
  
  // Если файлик с никами уже существует - подгружаем его содержимое
  if FileExists(fname) then
  begin
    SL.LoadFromFile(fname);       
  end;
  
  // Работаем до дисконнекта или остановки
  repeat until (CheckDisconnect() = true);

  SL.Free();
end.
«Кораблю безопасней в порту. Но он не для этого строился.»

3

Re: Скрипты

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

var
  DC_FLAG: Boolean;
const
  BLOCK_PACKET = $FFFF;

procedure chat_msg(msg: string);
var
  len: integer;
  packet: string;
begin
  len := Length(msg);
  if (len < 1) then exit;
  packet := ('0202 ' + Format('%.2x', [len]) + StrToHex(msg) + '00');
  Send2Server(packet);
end;

procedure ChatLogger(packet: string);
var
  i, len: integer;
  nick, msg: string;
begin
  len := length(packet);
  if (len < 20) then exit;
  packet := Copy(packet, 17, len);
  i := pos('00', packet);
  
  // Вытаскиваем ник
  nick := Copy(packet, 1, i);
  
  packet := Copy(packet, 41, len);
  i := pos('00', packet);
  
  // Вытаскиваем сообщение
  msg := Copy(packet, 1, i);
  
  // Выводим
  // SaveToFile('chat.txt', HexToStr(nick) + ': ' + HexToStr(msg));
  chat_msg( HexToStr(nick) + ': ' + HexToStr(msg) );
end;

function RecvHandler(var packet: string): Integer;
var
  Cmd: String;  
begin
  DC_FLAG := False;
  
  Result := 0;
  Cmd := Copy(packet, 1, 4);
  if (Cmd = '020B') then ChatLogger(packet);
end;

function CheckDisconnect(): Boolean;
const
  DC_TIMEOUT = 30000;
begin
  Result := False;
  DC_FLAG := TRUE;
  Sleep(DC_TIMEOUT);
  
  // Если за отведённое время не поступило 
  // входящих пакетов - нас отключило от сервера
  if DC_FLAG = TRUE then Result := True;
end;

begin
  // Работаем до дисконнекта
  repeat until (CheckDisconnect() = true);
end.
«Кораблю безопасней в порту. Но он не для этого строился.»

4

Re: Скрипты

var
  DC_FLAG: Boolean;
  FilterEnable: Boolean = False;
  FilterItems: TStringList;
const
  BLOCK_PACKET = $FFFF;
  FilterFile = 'LFilter.txt';

function LootFilter(grp: Integer; GID: Integer): Boolean;
var
  loot: string;
begin
  Result := False;
  
  loot := IntToStr(grp) + ',' + IntToStr(GID);
  
  // Блокируем отображение предметов, которых нет в списке
  if (FilterItems.IndexOf(loot) = (-1)) then Result := True;
end;

function RecvHandler(var packet: string): Integer;
var
  Cmd: String;
  grp, GID: String;
begin
  DC_FLAG := False;
  
  Result := 0;
  Cmd := Copy(packet, 1, 4);
  if ( (Cmd = '0314') or (Cmd = '040F') ) then
  begin
    grp := Copy(packet, 5, 2);
    GID := Copy(packet, 9, 2) + Copy(packet, 7, 2);

    if FilterEnable then
    begin
      // Если функция вернула True - блокируем отображение предмета
      if LootFilter(StrToInt('$' + grp), StrToInt('$' + GID)) then
      begin
        Result := BLOCK_PACKET;
      end;
    end;
    
  end;
end;

function CheckDisconnect(): Boolean;
const
  DC_TIMEOUT = 30000;
begin
  Result := False;
  DC_FLAG := TRUE;
  Sleep(DC_TIMEOUT);
  
  // Если за отведённое время не поступило 
  // входящих пакетов - нас отключило от сервера
  if DC_FLAG = TRUE then Result := True;
end;

begin
  if FileExists(FilterFile) then
  begin
    FilterItems := TStringList.Create();
    FilterItems.LoadFromFile(FilterFile);
    FilterEnable := True;
  end;
  
  // Работаем до дисконнекта
  repeat until (CheckDisconnect() = true);
  
  FilterItems.Free();
end.
Post's attachments

RFItemer.rar 1.72 mb, 13 downloads since 2015-09-28 

You don't have the permssions to download the attachments of this post.
«Кораблю безопасней в порту. Но он не для этого строился.»

5 (изменено: Rolfiatina, 2016-03-03 17:35:50)

Re: Скрипты

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

var
  DC_FLAG: Boolean;
const
  BLOCK_PACKET = $FFFF;

function RecvHandler(var packet: string): Integer;
begin
  Result := 0;
  WriteLog(packet);
  StrToApp('project_test1', packet,0 );
  // действия с пакетом
  DC_FLAG := False;
end;

function CheckDisconnect(): Boolean;
const
  DC_TIMEOUT = 30000;
begin
  Result := False;
  DC_FLAG := TRUE;
  Sleep(DC_TIMEOUT);
  
  // Если за отведённое время не поступило 
  // входящих пакетов - нас отключило от сервера
  if DC_FLAG = TRUE then Result := True;
end;

begin
  repeat until (CheckDisconnect() = true);
  //StrToApp('project_test1', 'ыыыыы',0 );
end.

аттача не будет, 5 метров не прикрепляет (а несжатый 23 метра, хз чего его так раздуло)
rghost.ru/8qXBsRlHC

Поблагодарили за этот пост: admin

6 (изменено: Rolfiatina, 2016-03-05 09:50:18)

Re: Скрипты

admin пишет:

Скорей всего, я единственный, кому это будет интересно big_smile

а если вот так?)

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

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

Поблагодарили за этот пост: admin

7

Re: Скрипты

Пакет на лвл-хак

Отправляем клиенту:

0B01 [XX XX] 00 00 15

Где 15 - байт желаемого уровня (в 16-ричной системе счисления. В примере 15 будет равно 21 уровню, а 63 в данном случае ровняется 99 уровню)

XX XX - 2 байта CharID, которые можно взять из исходящего пакета на любой баф\умение

Поблагодарили за этот пост: ТоварищБелк, admin

8

Re: Скрипты

Написал то, чего многие так ждали

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

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

Выражаю благодарность A.F.I за подсказку с пакетами, без которой этот скрипт вряд ли бы появился.
Удачи smile

«Кораблю безопасней в порту. Но он не для этого строился.»

Поблагодарили за этот пост: A.F.I

9

Re: Скрипты

Скрипт записи координат для предыдущего скрипта перемещения по координатам.
Для работоспособности этого скрипта архив из предыдущего поста обязательно должен быть у вас УЖЕ распакован!

program CoordSaver;

uses
 'scripts/lib/CharMove.lib';

const
  // Файл, в который сохраняются координаты
  CoordsFileName = 'coords.txt';

procedure LogCoords(packet: string);
var
  i: Integer;
  s, x, y, z: string;
  cid: string;
const
  MAX_INT = 32768;
begin
  // Сравнимаем айди чара с нашим, если не наш - выходим
  cid := Copy(packet, 5, 8);
  if (cid <> CharSID) then exit;

  s := reverseHexStr( Copy(packet, 13, 4) );
  i := StrToInt('$' + s);
  if i > MAX_INT then i := -(MAX_INT*2 - i);
  x := IntToStr(i);

  s := reverseHexStr( Copy(packet, 17, 4) );
  i := StrToInt('$' + s);
  if i > MAX_INT then i := -(MAX_INT*2 - i);
  y := IntToStr(i);

  s := reverseHexStr( Copy(packet, 21, 4) );
  i := StrToInt('$' + s);
  if i > MAX_INT then i := -(MAX_INT*2 - i);
  z := IntToStr(i);
  
  s := (x + ',' + y + ',' + z);
  WriteLog('[+] Coordinate add: ' + s);
  SaveToFile(CoordsFileName, s);
  
  Beep(2000, 200);
end;

// Обработчик входящих пакетов
function RecvHandler(var packet: string): Integer;
var
  Cmd: String;
begin
  Result := 0;
  Cmd := Copy(packet, 1, 4);
  
  // Узнали о том, что ожидается определенный пакет
  if (WR_FLAG) then recvWaitSwitch(cmd, packet);
  
  if (Cmd = '0414') then
  begin
    LogCoords(packet);  
  end;
end;

// Процедура-костыль из-за отсутствия DeleteFile
procedure clearFile(fName: string);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.Clear;
  sl.SaveToFile(fName);
  sl.Free();  
end;

begin
  // Чистим файл от содержимого
  clearFile(CoordsFileName);
  
  // Работаем до ручной остановки
  repeat Sleep(1000) until False;
end.

Встаём в то место, откуда планируем начать запись координат;
Запускаем скрипт;
Потихоньку тыкаем мышкой и ждём, когда персонаж остановится и зафиксирует свою позицию (будет короткий писк);

Таким образом мы сформируем "чекпоинты" для перемещения. Координаты сохраняются в корневую папку с игрой, в файлик coords.txt. "Шаги" между точками желательно делать короткими, чтобы со стороны перемещение персонажа выглядело максимально натурально.
Обратите внимание, что при каждом запуске скрипта этот файлик принудительно очищается, поэтому не забывайте сохранять ранее записанные координаты!!

«Кораблю безопасней в порту. Но он не для этого строился.»

10 (изменено: Rolfiatina, 2017-06-18 17:54:27)

Re: Скрипты

Скрипт для автоматического поеданя потов с экспой после обмена халоментала у мелкого храна.
после запуска скрипта надо один раз обменять и потом сожрать пот, и в дальнейшем после обмена пот будет жраться автоматически

var
  DC_FLAG: Boolean;
  s:string;
const
  BLOCK_PACKET = $FFFF;




function RecvHandler(var packet: string): Integer;
var
  Cmd, sDop: String;

begin
  DC_FLAG := False;

  Result := 0;
  Cmd := Copy(packet, 1, 4);


  if ((Cmd = '073D') AND (s<>'')) then
    Send2Server('070700'+s+'005629000000'+copy(packet,45,4)+'01');


end;
function SendHandler(var packet: string): Integer;
var
  Cmd:String;
begin
  Result := 0;
  Cmd := Copy(packet, 1, 4);
  if ((Cmd = '0707') AND (s='')) then
    s := copy(packet,7,2);
end;


function CheckDisconnect(): Boolean;
const
  DC_TIMEOUT = 30000;
begin
  Result := False;
  DC_FLAG := TRUE;
  Sleep(DC_TIMEOUT);

  // Если за отведённое время не поступило
  // входящих пакетов - нас отключило от сервера
  if DC_FLAG = TRUE then Result := True;
end;

begin
  s := '';
  // Работаем до дисконнекта
  repeat until (CheckDisconnect() = true);

end.

скрипт для автоматического комбинирования у героя и складывания в стопки. после запуска скрипта просто один раз меняем и жмёт на кнопку ОК или Далее, и повтор + складирование будут происходить автоматически по нажатии кнопок ОК\Далее, также будет продолжаться до того момента пока не отрубите скрипт либо не кончатся реагенты в конкретных слотах. применимо для коробок с т5, комбинации талик + катализатор, и прочей рутинной ересью.

константа  force_stack = 1 это складывать всё подрят принудительно. если установить в 0 то надо вручную добавить что складывать а что нет:
  s1.add('5402'); //high grade talic master
  s1.add('0100'); //recovery item b
  s1.add('4300'); //truth obsidian
искать айдишки можно из мануала который был недавно выкинут на форуме. там рассказано о том как выдирать айди вещи и её группу. последняя строка обязательно должна быть s1.add('FFFF').
также собирает в стопки не до конца. мне было лень париться с такими хернями если к примеру придмет падает стопками по 5 штук то в конце когда будет 95+5 то делить на 2 стопки 99 и 1.  так что в данном варианте будет 95, 5 и потом вторая стопка начнёт забиваться дальше. чтобы увидеть все предметы в стопках надо будет по окончанию работы сделать релог.

const
  force_stack = 1; 


var
  DC_FLAG: Boolean;
  s1,s2,s3:TStringList;
  comb_again:string;
  g_i: integer;

const
  BLOCK_PACKET = $FFFF;



function NeedToStack(str1:string): string;
var
  i1:integer;
begin
  Result := '';
  for i1:= 0 to s1.count - 1 do
  begin
    if (s1[i1] = copy(str1,1,4)) then
    begin
      if (s3[i1] = '') then
      begin
        s3[i1] := copy(str1,5,4);
        s2[i1] := inttostr(strtoint('$'+copy(str1,9,2)));
        Break;
      end
      else
        if (strtoint(s2[i1])+strtoint('$'+copy(str1,9,2)) >= 99) then
        begin
          s3[i1] := copy(str1,5,4);
      s2[i1] := inttostr(strtoint('$'+copy(str1,9,2)));
      Break;
        end
        else
        begin
      Result := '0D08'+copy(str1,5,4)+s3[i1]+copy(str1,9,2);
          s2[i1] := inttostr(strtoint(s2[i1])+strtoint('$'+copy(str1,9,2)));
      Break;         
        end;       

    end;
    if ((force_stack = 1) and (i1 = s1.count - 1)) then
    begin
      s1.add(copy(str1,1,4));
      s2.add('0');
      s3.add('');
      Result := NeedToStack(str1);
    end;
  end;

end;


function RecvHandler(var packet: string): Integer;
var
  s, Cmd, sDop: String;

begin
  DC_FLAG := False;

  Result := 0;
  Cmd := Copy(packet, 1, 4);


  if (Cmd = '0B09') then
  begin

      s := NeedToStack(copy(packet,7,4)+copy(packet,35,4)+copy(packet,11,2));
      if (s <> '') then Send2Server(s);

  end;


end;

function SendHandler(var packet: string): Integer;
var
  s, Cmd, sDop: String;

begin
  DC_FLAG := False;

  Result := 0;
  Cmd := Copy(packet, 1, 4);
   if (Cmd = '0720') then 
   begin
     comb_again := packet;
   end;
   if (Cmd = '0723') then 
     if comb_again <> '' then
     begin
       Send2Server(comb_again);
     end;
end;

function CheckDisconnect(): Boolean;
const
  DC_TIMEOUT = 30000;
begin
  Result := False;
  DC_FLAG := TRUE;
  Sleep(DC_TIMEOUT);

  // Если за отведённое время не поступило
  // входящих пакетов - нас отключило от сервера
  if DC_FLAG = TRUE then Result := True;
end;

begin
  // Работаем до дисконнекта
  comb_again := '';
  s1 := TStringList.Create;
  s2 := TStringList.Create;
  s3 := TStringList.Create;


  //s1.add('0B0004');
  s1.add('5402'); //high grade talic master
  s1.add('0100'); //recovery item b
  s1.add('4300'); //truth obsidian
  s1.add('4200'); //elemental topaz
  s1.add('4000'); //salamander ruby
  s1.add('4100'); //last gem?
  s1.add('0B00'); //mid box
  s1.add('0A00'); //small box
  s1.add('0C00'); //large box
  s1.add('3802'); //empty large box
  s1.add('5502'); //higest grade talic master
  s1.add('FFFF');  //test
  for g_i := 0 to s1.count - 1 do
  begin
    s2.add('0');
    s3.add('');
  end;


  //s4.add('FFFFFF');
  repeat until (CheckDisconnect() = true);
  s1.free();
  s2.free();
  s3.free();

end.

заточка на определнное количество слотов. после запуска скрипта выбираем какую вещь точим и с чем точим. и заточка будет повторяться до того момента пока не кончатся расходники либо пока не сломается пуха. если у вас стоит необходимая заточка на +4, но стек таликов кончился то можно не останавливать скрипт и выбирать следующий стек для заточки и оно в любом случае остановится на +4 заточке. после того как точнули на запланированное +4 чтобы точить следующую шмотку надо перезапустить скрипт. автозаточка не отображается автоматически. чтобы увидеть свою точку надо либо сделать релог, либо положить шмотку в банк, закрыть банк, открыть банк и забрать пуху. описание констант:
COUNT_UPGR = 4; - сколько раз точнуть
COUNT_TALICS = 99; - сколько таликов в стеке.

если запустить скрипт с константой на 99 таликов и в стопке не будет столько столько то остальные попытки просто будут отображены ошибкой. если у вас пуха заточенна на +1 и вы оставляете константу на количество точек на 4 то пуха будет точиться не до +4 а до +5

var
  DC_FLAG: Boolean;
  CURR_UPGR: Integer;
  CURR_TALICS: integer;
  sUpPacket: string;
const
  BLOCK_PACKET = $FFFF;
  COUNT_UPGR = 4;
  COUNT_TALICS = 99;
function SendHandler(var packet: string): Integer;
var
 cmd:string;
begin
  Result := 0;

  Cmd := Copy(packet, 1, 4);
  if (cmd = '0711') then
  begin
    sUpPacket := packet;
    CURR_TALICS:=0; 
    //CURR_TALICS := CURR_TALICS + 1;
  end;     

end;

function RecvHandler(var packet: string): Integer;
var
 cmd:string;
begin
  Result := 0;

  Cmd := Copy(packet, 1, 4);

  if (cmd = '0712') then
  begin
    CURR_TALICS := CURR_TALICS + 1;
    if (copy(packet,5,2)  = '00') then
      CURR_UPGR := CURR_UPGR + 1;
    if ((CURR_TALICS < COUNT_TALICS) and (CURR_UPGR < COUNT_UPGR)) then
      send2server(sUpPacket);   



  end;

  DC_FLAG := False;

end;

function CheckDisconnect(): Boolean;
const
  DC_TIMEOUT = 30000;
begin
  Result := False;
  DC_FLAG := TRUE;
  Sleep(DC_TIMEOUT);
  if DC_FLAG = TRUE then Result := True;
end;

begin
  CURR_UPGR:=0;
  CURR_TALICS:=0; 

  DC_FLAG := False;
  repeat until (CheckDisconnect() = true);
end.

Поблагодарили за этот пост: admin

11

Re: Скрипты

100% наложение дебафов

Очень часто бывает, что при попытке наложить баф на моба он не накладывается из-за защиты моба от стихий. Но при этом откат у дебафа получается только визуально, на сервере ограничения нет. Выкладываю скрипт, который гарантирует, что дебаф на моба или чара будет наложен

var
  lastDebuff: string;
const
  BLOCK_PACKET = $FFFF;

function SendHandler(var s: string): Integer;
var
  cmd: string;
begin
  Result := 0;
  cmd := Copy(s, 1, 4);
  if (cmd = '1101') then
  begin
    lastDebuff := s;
  end;
end;

function RecvHandler(var s: string): Integer;
var
  cmd: string;
begin
  Result := 0;
  cmd := Copy(s, 1, 4);
  if (cmd = '1102') then
  begin
    if (Copy(s, 5, 2) = '1E') then
    begin
      Send2Server(lastDebuff);
      Result := BLOCK_PACKET;
    end;  
  end;
end;

begin
  while true do sleep(1000);
end.
«Кораблю безопасней в порту. Но он не для этого строился.»

12

Re: Скрипты

Я правильно понимаю - что это актуально и в случаи когда мобом выступает Пит Босс?)

13

Re: Скрипты

Педро пишет:

Я правильно понимаю - что это актуально и в случаи когда мобом выступает Пит Босс?)

С питом не проверял, но по персам и обычным мобам работает

«Кораблю безопасней в порту. Но он не для этого строился.»

14

Re: Скрипты

var
  DC_FLAG: Boolean;
  FilterEnable: Boolean = False;
  FilterItems: TStringList;
const
  BLOCK_PACKET = $FFFF;
  FilterFile = 'LFilter.txt';

function LootFilter(grp: Integer; GID: Integer): Boolean;
var
  loot: string;
begin
  Result := False;
  
  loot := IntToStr(grp) + ',' + IntToStr(GID);
  
  // Блокируем отображение предметов, которых нет в списке
  if (FilterItems.IndexOf(loot) = (-1)) then Result := True;
end;

function RecvHandler(var packet: string): Integer;
var
  Cmd: String;
  grp, GID: String;
begin
  DC_FLAG := False;
  
  Result := 0;
  Cmd := Copy(packet, 1, 4);
  if ( (Cmd = '0314') or (Cmd = '040F') ) then
  begin
    grp := Copy(packet, 5, 2);
    GID := Copy(packet, 9, 2) + Copy(packet, 7, 2);

    if FilterEnable then
    begin
      // Если функция вернула True - блокируем отображение предмета
      if LootFilter(StrToInt('$' + grp), StrToInt('$' + GID)) then
      begin
        Result := BLOCK_PACKET;
      end;
    end;
    
  end;
end;

function CheckDisconnect(): Boolean;
const
  DC_TIMEOUT = 30000;
begin
  Result := False;
  DC_FLAG := TRUE;
  Sleep(DC_TIMEOUT);
  
  // Если за отведённое время не поступило 
  // входящих пакетов - нас отключило от сервера
  if DC_FLAG = TRUE then Result := True;
end;

begin
  if FileExists(FilterFile) then
  begin
    FilterItems := TStringList.Create();
    FilterItems.LoadFromFile(FilterFile);
    FilterEnable := True;
  end;
  
  // Работаем до дисконнекта
  repeat until (CheckDisconnect() = true);
  
  FilterItems.Free();
end.

Поблагодарили за этот пост: admin

15

Re: Скрипты

var
  DC_FLAG: Boolean;
  FilterEnable: Boolean = False;
  FilterItems: TStringList;
const
  BLOCK_PACKET = $FFFF;
  FilterFile = 'LFilter.txt';

function LootFilter(grp: Integer; GID: Integer): Boolean;
var
  loot: string;
begin
  Result := False;
  
  loot := IntToStr(grp) + ',' + IntToStr(GID);
  
  // Блокируем отображение предметов, которых нет в списке
  if (FilterItems.IndexOf(loot) = (-1)) then Result := True;
end;

function RecvHandler(var packet: string): Integer;
var
  Cmd: String;
  grp, GID: String;
begin
  DC_FLAG := False;
  
  Result := 0;
  Cmd := Copy(packet, 1, 4);
  if ( (Cmd = '0314') or (Cmd = '040F') ) then
  begin
    grp := Copy(packet, 5, 2);
    GID := Copy(packet, 9, 2) + Copy(packet, 7, 2);

    if FilterEnable then
    begin
      // Если функция вернула True - блокируем отображение предмета
      if LootFilter(StrToInt('$' + grp), StrToInt('$' + GID)) then
      begin
        Result := BLOCK_PACKET;
      end;
    end;
    
  end;
end;

function CheckDisconnect(): Boolean;
const
  DC_TIMEOUT = 30000;
begin
  Result := False;
  DC_FLAG := TRUE;
  Sleep(DC_TIMEOUT);
  
  // Если за отведённое время не поступило 
  // входящих пакетов - нас отключило от сервера
  if DC_FLAG = TRUE then Result := True;
end;

begin
  if FileExists(FilterFile) then
  begin
    FilterItems := TStringList.Create();
    FilterItems.LoadFromFile(FilterFile);
    FilterEnable := True;
  end;
  
  // Работаем до дисконнекта
  repeat until (CheckDisconnect() = true);
  
  FilterItems.Free();
end.
«Кораблю безопасней в порту. Но он не для этого строился.»

16

Re: Скрипты

admin пишет:

100% наложение дебафов

Очень часто бывает, что при попытке наложить баф на моба он не накладывается из-за защиты моба от стихий. Но при этом откат у дебафа получается только визуально, на сервере ограничения нет. Выкладываю скрипт, который гарантирует, что дебаф на моба или чара будет наложен

var
  lastDebuff: string;
const
  BLOCK_PACKET = $FFFF;

function SendHandler(var s: string): Integer;
var
  cmd: string;
begin
  Result := 0;
  cmd := Copy(s, 1, 4);
  if (cmd = '1101') then
  begin
    lastDebuff := s;
  end;
end;

function RecvHandler(var s: string): Integer;
var
  cmd: string;
begin
  Result := 0;
  cmd := Copy(s, 1, 4);
  if (cmd = '1102') then
  begin
    if (Copy(s, 5, 2) = '1E') then
    begin
      Send2Server(lastDebuff);
      Result := BLOCK_PACKET;
    end;  
  end;
end;

begin
  while true do sleep(1000);
end.

Не работает. Может быть погрешность из-за цербера, но ни клиент-сайдом ни пакетом не накладывает пакет, сообщая, что идет откат

17

Re: Скрипты

A.F.I пишет:

Не работает. Может быть погрешность из-за цербера, но ни клиент-сайдом ни пакетом не накладывает пакет, сообщая, что идет откат

На цербере вроде бы фикс. Руофф и америка работает 100%

«Кораблю безопасней в порту. Но он не для этого строился.»

18

Re: Скрипты

Rolfiatina пишет:
admin пишет:

Скорей всего, я единственный, кому это будет интересно big_smile

а если вот так?)

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

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

а если кукла появляется бегает от моба к мобу и чар в нее стреляет но урон не проходит? что тогда? куда копать?

19

Re: Скрипты

о как) некрофил)

if copy(packet,1,4) = '0506' then i_num_mob := monster_get(i_num_mob);

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

20

Re: Скрипты

Вступаем в любую пати

function SendHandler(var packet: string): Integer;
var
  s: String;
  cmd: string;
begin
  Result := 0;
  cmd := Copy(packet, 1, 4);
  if (cmd = '0D1A') then
  begin
    s := Copy(packet, 9, 12);
    Send2Server('1003' + s);
  end;
end;

begin
  while true do sleep($FFFFFFFF);
end.

Чтобы вступить - берем в таргет главу пати. Если есть свободные места и с левелом всё ок - наш перс туда принудительно засунется)) Актуально на каче, когда брать не хотят

«Кораблю безопасней в порту. Но он не для этого строился.»

21

Re: Скрипты

Берем в пати против воли (злой баг, позволяет любого взять в пати и выставить лут на себя (например, перед добивом моба))

function SendHandler(var packet: string): Integer;
var
  s: String;
  cmd: string;
begin
  Result := 0;
  cmd := Copy(packet, 1, 4);
  if (cmd = '0D1A') then
  begin
    s := Copy(packet, 9, 12);
    Send2Server('1006' + s);
  end;
end;

begin
  while true do sleep($FFFFFFFF);
end.
«Кораблю безопасней в порту. Но он не для этого строился.»

22

Re: Скрипты

Файл отстутсвует, просьба перезалить
Спасибо.

Rolfiatina пишет:

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

var
  DC_FLAG: Boolean;
const
  BLOCK_PACKET = $FFFF;

function RecvHandler(var packet: string): Integer;
begin
  Result := 0;
  WriteLog(packet);
  StrToApp('project_test1', packet,0 );
  // действия с пакетом
  DC_FLAG := False;
end;

function CheckDisconnect(): Boolean;
const
  DC_TIMEOUT = 30000;
begin
  Result := False;
  DC_FLAG := TRUE;
  Sleep(DC_TIMEOUT);
  
  // Если за отведённое время не поступило 
  // входящих пакетов - нас отключило от сервера
  if DC_FLAG = TRUE then Result := True;
end;

begin
  repeat until (CheckDisconnect() = true);
  //StrToApp('project_test1', 'ыыыыы',0 );
end.

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

23

Re: Скрипты

Невозможно играть нормально!!1
Куда платить, чтобы снова работало?

24

Re: Скрипты

Невозможно играть нормально!!1

А где ты играешь?)

25

Re: Скрипты

Педро пишет:

Невозможно играть нормально!!1

А где ты играешь?)

На текущий момень можно комфортно играть только на одном сервере, сам понимаешь, что это цербер