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

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

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 19.09.2007, 21:16   #1
Рыцарь
 
Аватар для VORON
 
Регистрация: 06.08.2007
Сообщений: 209
Сказал Спасибо: 6
Имеет 67 спасибок в 34 сообщенях
VORON пока неопределено
Злость ДА БУДЕТ БOT!

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

Код:
//BOT GNOM SPOILER by VORON
//ДЛЯ АДАПТАЦИИ: NICK- переправить в имя чара бота.
//PCK[24] заменить на PCK[xx] в зависимости от того сколько символов в нике персонажа
//который будет управлять ботом pck[24]- для имен состоящих из 6 символов.
//если ваш главный персонаж 5 символов в нике то будет pck[22], если 6 то pck[24]
//если 7 то pck[26], если 8 pck[28] и т.д.
//ДЛЯ РАБОТЫ СКРИПТА: БОТ- лидер пати, ГЛАВНЫЙ ПЕРС (командир) - на первом месте в пати после бота
//кнопки управления пишутся в ПАТИ ЧАТ
//ДЛЯ УПРАВЛЕНИЯ:
//цифра 1 в пати чат - означет бежать за командиром
//цифра 2 в пати чат - атакавать и спойлить врага по ассисту с коммандиром
//свип после смерти моба происходит- автоматически при условии что ТРУП- в таргете у командира

var
IDPartyMember, IDAssistTarget, IDMy: String; //ИД командира и ИД его таргета
MyCoordX, MyCoordY, MyCoordZ :String; //координаты бота

begin
//если от сервака принят пакет с ИД и Координатами членов пати то
if FromServer and (ConnectName='NICK') and (pck[1]=#$a7) then
begin
//запоминаем ИД члена пати чье имя первое в списке пати (ИД командира)
IDPartyMember:=pck[22] + pck[23] + pck[24] + pck[25];
//Запоминаем собственный ИД (ИД бота)
IDMy:=pck[6] + pck[7] + pck[8] + pck[9];
end;

//если принят пакет со сменой таргета у командира то
if FromServer and (ConnectName='NICK') and (pck[1]=#$29) then
if (pck[2]+pck[3]+pck[4]+pck[5]=IDPartyMember) then
begin
//запоминаем ИД таргета командира для ассиста
IDAssistTarget:= pck[6]+pck[7]+pck[8]+pck[9];
end;

//если принят пакет от клиента с моими кординатами то
if FromClient and (ConnectName='NICK') and (pck[1]=#$48) then
begin
//запоминаем мои координаты
MyCoordX:= pck[6] + pck[7] + pck[8] + pck[9];
MyCoordY:= pck[10] + pck[11] + pck[12] + pck[13];
MyCoordZ:= pck[14] + pck[15] + pck[16] + pck[17];
end;


//БЕГАЕМ ЗА КОМАНДИРОМ
//если принято сообщение
//если оно в написано в патичат
//если отправитель- командир
//если текст в нем- цифра "1"
if FromServer and (ConnectName='NICK') and (pck[1]=#$4a) then
if (pck[6]=#$03) and (pck[2]+pck[3]+pck[4]+pck[5] = IDPartyMember) then
if (pck[24] = #$31) then
if (MyCoordX<>'') then
begin
//выделяем командира, эмулируя щелчек мыши
buf:=hstr('04') + IDPartyMember + MyCoordX + MyCoordY + MyCoordZ + hstr('00');
SendToServerEX('NICK');
//бежим за командиром эмулируя повторный щелчек мыши по таргету
buf:=hstr('04') + IDPartyMember + MyCoordX + MyCoordY + MyCoordZ + hstr('00');
SendToServerEX('NICK');
end;

//СПОЙЛИМ ПО АССИСТУ
//если принято сообщение
//если оно в написано в патичат
//если отправитель- командир
//если текст в нем- цифра "2"
//если скрипт уже перехватил координаты и все значения для переменных
if FromServer and (ConnectName='NICK') and (pck[1]=#$4a) then
if (pck[6]=#$03) and (pck[2]+pck[3]+pck[4]+pck[5] = IDPartyMember) then 
if (pck[24] = #$32) then
if (MyCoordX<>'') then
begin
//берем в таргет вражину по ассисту
buf:=hstr('04') + IDAssistTarget + MyCoordX + MyCoordY + MyCoordZ + hstr('00');
SendToServerEX('NICK');
//юзаем спойл
buf:=hstr('2F FE 00 00 00 00 00 00 00 00');
SendToServerEX('NICK');
end;

//СВИПАЕМ АВТОМАТИЧЕСКИ
//если принят пакет DIE для моба (моб умер)
//если труп моба в таргете у командира
//если скрипт уже перехватил координаты и все значения для переменных
if FromServer and (ConnectName='NICK') and (pck[1]=#$06) then
if (pck[2]+pck[3]+pck[4]+pck[5] = IDAssistTarget) then
if (MyCoordX<>'') then
begin
//юзаем cвип (предполагая что в таргет брать ненужно, т.к. мы его спойлили и
//труп остался в таргете у бота)
buf:=hstr('2F 2A 00 00 00 00 00 00 00 00');
SendToServerEX('NICK');
end;

end.
Код:
//by VORON
//привожу для примера скрипт который управляет сразу двумя ботами приэтом не палится управляющими командами на сервере.. объяснять как переделать именно под вас- нестану.. дабы не плодить ламеров-ботоводов.. скрипт приводится для того чтобы люди могли понять как управлять сразу несколькими ботами и при етом скрыть от сервера управляющие комманды.. скрипт протестирован и 100% рабочий.
//поясню лиш: что в скрипте принимают участие 3 перехваченных ака:2 бота GNOM-спойлер и VARK а также 1 KOMANDOS который является лидером пати. КОМАНДИР управляет ботами посылкой сообщений в патичат (цифры 1 и 2 и +).. гном свипает труп- автоматически.. приетом СЕРВЕР неполучает никаких сообщений.. СКРИПТ убивает ети сообщения.. а раз сервер ничего не получает- значит и палева перед админами почти 0.. ну 5% палева на то что подозрительно что 2 бота синхронно бегают и вополняют схожие команды.. думаю что в последующих версиях скрипта нужно вводить рандомную задержку выполнения команд ботами.. но об етом потом..

var
IDPartyMember, IDAssistTarget, IDMy: String; //ИД командира и ИД его таргета и Собственный ИД
CoordGnomX, CoordGnomY, CoordGnomZ :String; //координаты бота
CoordVarkX, CoordVarkY, CoordVarkZ :String; //координаты бота
IDTargetForSpoil : String; //ИД проспойленного моба


procedure GnomBeg;
begin
if (CoordGnomX <> '') and (IDPartyMember <> '') then
begin
//выделяем командира, эмулируя щелчек мыши
buf:=hstr('04') + IDPartyMember + CoordGnomX + CoordGnomY + CoordGnomZ + hstr('00');
SendToServerEX('GNOM');
//бежим за командиром эмулируя повторный щелчек мыши по таргету
buf:=hstr('04') + IDPartyMember + CoordGnomX + CoordGnomY + CoordGnomZ + hstr('00');
SendToServerEX('GNOM');
end;
end;

procedure GnomSpoil;
begin
if (CoordGnomX <> '') and (IDAssistTarget <> '') then
begin
//берем в таргет вражину по ассисту
buf:=hstr('04') + IDAssistTarget + CoordGnomX + CoordGnomY + CoordGnomZ + hstr('00');
SendToServerEX('GNOM');
//юзаем спойл
buf:=hstr('2F FE 00 00 00 00 00 00 00 00');
SendToServerEX('GNOM');
//запоминаем цель которую спойлили
IDTargetForSpoil:= IDAssistTarget;
end;
end;

procedure GnomSweep;
begin
//юзаем cвип (предполагая что в таргет брать ненужно, т.к. мы его спойлили и
//труп остался в таргете у бота)
buf:=hstr('2F 2A 00 00 00 00 00 00 00 00');
SendToServerEX('GNOM');
end;

procedure VarkBeg;
begin
if (CoordVarkX <> '') and (IDPartyMember <> '') then
begin
//выделяем командира, эмулируя щелчек мыши
buf:=hstr('04') + IDPartyMember + CoordVarkX + CoordVarkY + CoordVarkZ + hstr('00');
SendToServerEX('VARK');
//бежим за командиром эмулируя повторный щелчек мыши по таргету
buf:=hstr('04') + IDPartyMember + CoordVarkX + CoordVarkY + CoordVarkZ + hstr('00');
SendToServerEX('VARK');
end;
end;

procedure VarkAttack;
begin
if (CoordVarkX <> '') and (IDAssistTarget <> '') then
begin
//берем в таргет вражину по ассисту
buf:=hstr('04') + IDAssistTarget + CoordVarkX + CoordVarkY + CoordVarkZ + hstr('00');
SendToServerEX('VARK');
//пиздим его
buf:=hstr('04') + IDAssistTarget + CoordVarkX + CoordVarkY + CoordVarkZ + hstr('00');
SendToServerEX('VARK');
end;
end;

procedure VarkHeal;
begin

buf:=hstr('2F CD 04 00 00 00 00 00 00 00');
//отправляем пакет серваку
SendToServerEx('VARK');

end;


//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
//честно незнаю зачем эта строка. но логика мыслей такая: если принят пустой пакет то выйти из рабочей части скрипта и необрабатывать этот пакет. вопрос стоит так: если запущено сразу несколько скриптов и в первом скрипте убит кокайто пакет и проверка пошла дальше по другим скриптам и попала в етот скрипт то етот пустой (убитый) пакет обрабатывать- нестоит. так как это приведет к ошибке при синтаксисе (if fromclient and pck[1]=XX then) так как пакет нулевой длинны то возможно проверка первого байта в нем приведет к ошибке.
if pck='' then exit;

//если от сервака принят пакет с ИД и Координатами членов пати то
if FromServer and (pck[1]=#$a7) then
begin
//запоминаем ИД командира
IDPartyMember:=pck[6] + pck[7] + pck[8] + pck[9];
end;

//если принят пакет со сменой таргета у командира то
if FromServer and (pck[1]=#$29) then
if (pck[2]+pck[3]+pck[4]+pck[5]=IDPartyMember) then
begin
//запоминаем ИД таргета командира для ассиста
IDAssistTarget:= pck[6]+pck[7]+pck[8]+pck[9];
end;

//если принят пакет от клиента с кординатами гнома то
if FromClient and (ConnectName='GNOM') and (pck[1]=#$48) then
begin
//запоминаем координаты
CoordGnomX:= pck[6] + pck[7] + pck[8] + pck[9];
CoordGnomY:= pck[10] + pck[11] + pck[12] + pck[13];
CoordGnomZ:= pck[14] + pck[15] + pck[16] + pck[17];
end;

//если принят пакет от клиента с кординатами варка то
if FromClient and (ConnectName='VARK') and (pck[1]=#$48) then
begin
//запоминаем координаты
CoordVarkX:= pck[6] + pck[7] + pck[8] + pck[9];
CoordVarkY:= pck[10] + pck[11] + pck[12] + pck[13];
CoordVarkZ:= pck[14] + pck[15] + pck[16] + pck[17];
end;

//далее идут управляющие команды

//если КОМАНДИР пишет в любой чат цифру "1" (код "#$31 #$00" в юникоде (в юникоде под 1 символ используются 2 байта) я так понял) то
if FromClient and (ConnectName='KOMANDOS')and (pck[1]=#$38) then
if (pck[2]=#$31) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';
//гном бежит за КОМАНДИРОМ
GnomBeg;
//ВАРК БЕЖИТ за КОМАНДИРОМ
VarkBeg;
//выйти из рабочей части скрипта чтобы другие услови не проверяли убитый пакет нулевой длинны
exit;
end;

if FromClient and (ConnectName='KOMANDOS')and (pck[1]=#$38) then
if (pck[2]=#$32) and (pck[3]=#$00) then
begin
pck:='';
GnomSpoil;
VarkAttack;
exit;
end;

if FromServer and (ConnectName='GNOM') and (pck[1]=#$06) then
if (pck[2]+pck[3]+pck[4]+pck[5] = IDTargetForSpoil) then
begin
GnomSweep;
end;

if FromClient and (ConnectName='KOMANDOS')and (pck[1]=#$38) then
if (pck[2]=#$2b) and (pck[3]=#$00) then
begin
pck:='';
VarkHeal;
exit;
end;

end.
Код:
//L2XBotOptimizer by Xelat
//Версия 1.0
//Управление:
//в чат пишется минус и команда, например -spoil
//Удобнее всего использовать макросы, прописывая в них команды
const
PartyLeader='Xelat';
var
CharPos,CharID,CharSpoil:TStrings;
TargetID,Cmd,ObjID:string;

procedure Init;
begin
CharID:=TStringList.Create;
CharPos:=TStringList.Create;
CharSpoil:=TStringList.Create;
end;

procedure Free;
begin
CharID.Free;
CharPos.Free;
CharSpoil.Free;
end;

procedure Say(msg:string);
begin
buf:=#$4A#0#0#0#0;
WriteD(2);
WriteS(ConnectName);
WriteS(msg);
SendToClientEx(PartyLeader);
end;

procedure FollowLeader;
var
i:integer;
ObjID,tmp:string;
begin
tmp:=#4+CharID.Values[PartyLeader];
for i:=0 to CharID.Count-1 do
  begin
    ObjID:=CharID.Names[i];
    if ObjID=PartyLeader then continue;
    buf:=tmp+CharPos.Values[ObjID]+#0;
    SendToServerEx(ObjID);
    SendToServerEx(ObjID);
  end;
end;

procedure Attack(ObjID:string);
begin
if (TargetID='') or (CharPos.Values[ObjID]='') then exit;
buf:=#4+TargetID+CharPos.Values[ObjID]+#0;
SendToServerEx(ObjID);
SendToServerEx(ObjID);
end;

procedure Spoil(ObjID:string);
begin
if (TargetID='') or (CharPos.Values[ObjID]='') then exit;
buf:=#4+TargetID+CharPos.Values[ObjID]+#0;
SendToServerEx(ObjID);
buf:=#$2F#$FE#0#0#0#0#0#0#0#0;
SendToServerEx(ObjID);
CharSpoil.Values[ObjID]:=TargetID;
end;

procedure Sweep(ObjID:string);
begin
if (CharSpoil.Values[ObjID]='') or (CharPos.Values[ObjID]='') then exit;
buf:=#4+CharSpoil.Values[ObjID]+CharPos.Values[ObjID]+#0;
SendToServerEx(ObjID);
buf:=#$2F#$2A#0#0#0#0#0#0#0#0;
SendToServerEx(ObjID);
CharSpoil.Values[ObjID]:='';
end;

procedure Heal(ObjID:string);
begin
if CharPos.Values[ObjID]='' then exit;
buf:=#4+CharID.Values[PartyLeader]+CharPos.Values[ObjID]+#0;
SendToServerEx(ObjID);
buf:=#$2F#$CD#4#0#0#0#0#0#0#0#0;
SendToServerEx(ObjID);
end;

begin
if pck='' then exit;

//UserInfo
if FromServer and (pck[1]=#4) then
begin
ObjID:=ReadS(18);
if (ObjID=ConnectName) and (CharID.Values[ObjID]='') then
  begin
  CharID.Values[ObjID]:=Copy(pck,14,4);
  Say('Я готов!');
  end;
end
else
//ValidatePosition
if FromClient and (pck[1]=#$48) then
begin
CharPos.Values[ConnectName]:=Copy(pck,2,12);
end
else
//Action
if FromClient and (pck[1]=#4) and (ConnectName=PartyLeader) then
begin
ObjID:=Copy(pck,2,4);
if ObjID<>TargetID then
  begin
  TargetID:=ObjID;
  Say('Цель выбрана');
  end;
end
else
//Say2
if FromClient and (pck[1]=#$38) then
begin
 Cmd:=ReadS(2);
 if (Cmd[1]='-') then
 begin
 Cmd:=Copy(Cmd,2,Length(Cmd)-1);
  case Cmd of
  'follow':FollowLeader;
  'heal':Heal('Vark');
  'spoil':Spoil('Gnom');
  'sweep':Sweep('Gnom');
  'attack':
    begin
    Attack('Vark');
    Attack('Gnom');
    end;
  end;
 pck:='';
 end;
end
else
if FromServer and ((pck[1]=#6) or (pck[1]=#12)) then
if (TargetID<>'') or (CharSpoil.Values[ConnectName]<>'') then
begin
ObjID:=Copy(pck,2,4);
if ObjID=TargetID then TargetID:='';
if ObjID=CharSpoil.Values[ConnectName] then
  begin
  if (pck[1]=#6) then Sweep(ConnectName)
  else CharSpoil.Values[ConnectName]:='';
  end;
end;

end.
Код:
//by VORON
//СКРИПТ АВТОМАТИЧЕСКОЙ СДАЧИ МАНОРА
//использование: скрипт запускается за несколько минут до объявления об олимпиаде
//при получении системного сообщения об ее начале засекается системное время и вычисляется время
//сдачи манора, также активируется таймер с интервалом ХХХ МС для контроля системного времени.
//после этого пытаемся сдать свои всходы- вручную. при этом мы получим ошибку что-
//манор система: выключена в данный момент. но при етом пакет на сдачу манора- скрипт запомнит в
//память для дальнейшего использования. через заданное время скрипт отправит 10 раз запомненный
//пакет с интервалом 0,3сек.
//проверено что: если манор сдастся примерно на 4-й раз (4-й повтор пакета) то остальные 6 повторов
//сервер принимает без ошибок, хотя в инвенторе отсутствуют нужные всходы- сервер на это не ругается

var
PaketManora: string; //Пакет на сдачу манора, который мы отправим серваку зараннее с помощью клиента
// и запомним его для того чтобы вручную не формировать его кодом.
//важно что оправлять его нужно после после объявления об олимпиаде.
//так как в пакете манора используются ИД сессии, которые изменяются
//каждый ровный час.

timer1: TTimer; //таймер контролирующий системное время

StartTime: TDateTime;
EndTime: TDateTime;


x:integer;

procedure Init; //Вызывается при включении скрипта
begin
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer; //
timer1.enabled:=false; // таймер по умолчанию выключен
timer1.interval:=400; // через каждые 0,4сек будем засекать контрольное время сдачи манора

x:=0;
end;

procedure Free; //Вызывается при выключении скрипта
begin
timer1.Free; //освобождаем занимаемую память таймером
end;

//вызывается при срабатывании таймера
procedure OnTimer(Sender: TObject);
begin
//если наступило время сдавать манор и скрипт пока еще не отправил 30 попыток его сдать то
if (time >= EndTime) and (x<30) then
begin
// отправляем пакет на сдачу манора.
buf:=PaketManora;
SendToServer;
//счетчик попыток
x:=x+1;
end;
end;


begin

//если перехвачен пакет на сдачу манора то
if FromClient and (pck[1]=#$D0) and (pck[2]=#$09) and (pck[3]=#$00) then
begin
//запоминаем его полностью
PaketManora:=pck;
end;

//если получен пакет об начале олимпиады то
if FromServer and (pck[1]=#$64) and (pck[2]=#$69) and (pck[3]=#$06) then
begin
//засекаем текущее время
StartTime:=time;
//вычисляем время сдачи манора (прибавляем нужное время которое нужно засеч после получения сообщения об илимпиаде)
EndTime:=StartTime + EncodeTime(0,5,49,0); // изменяем и корректируем ето число в формате (ЧЧ,ММ,СС,МС)
//активируем таймер
timer1.enabled:=true;

end;

end.
Код:
//by VORON
//СКРИПТ превращающий ФС в ХИЛЛЕРА для лидера пати
//ХИЛ наливается нонстопом.


var
IDPartyMember: String; //ИД командира
IDSummon : String; //ИД самона
SummonPresent : Boolean; //Есть или нет сумон
NeedHP : Boolean; //тригер нужно ХП лить или нет
timer1: TTimer;
timer2: TTimer;

procedure Init; //Вызывается при включении скрипта
begin
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer1; //
timer1.enabled:=true; //
timer1.interval:=1000;

timer2:=TTimer.Create(nil);
timer2.OnTimer:=@OnTimer2; //
timer2.enabled:=true; //
timer2.interval:=1000;

SummonPresent:=FALSE;
NeedHP:=FALSE;

end;

// первый таймер следит за хилами
//если сумон вызван и танку надо ХП то наливаем его
procedure OnTimer1(Sender: TObject);
begin
///
if (SummonPresent = TRUE) and (NeedHP = TRUE) then
begin
buf:=hstr('45 F7 03 00 00 00 00 00 00 00');
SendToServerEx('ник');
end;
end;

//если самона нет то вызываем его
procedure OnTimer2(Sender: TObject);
begin
///
if (SummonPresent = FALSE) then
begin
//завем нового сумона
buf:=hstr('2F 35 05 00 00 00 00 00 00 00');
SendToServerEX('ник');
end;
end;



procedure Free; //Вызывается при выключении скрипта
begin
timer1.Free;
timer2.Free;
end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin

//если от сервака принят пакет с ИД и Координатами членов пати то
if FromServer and (pck[1]=#$a7) and (ConnectName = 'ник') then
begin
//запоминаем ИД командира
IDPartyMember:=pck[6] + pck[7] + pck[8] + pck[9];
end;

//следим за СТАТУСОМ командира.
if FromServer and (pck[1]=#$0e) and (ConnectName = 'ник') then
if (pck[2] + pck[3] + pck[4] + pck[5] = IDPartyMember) and (pck[6]=#$04) then
begin
//емсли ХП танка меньше заданного уровня то срабаитывает тригер
//и в работу подключается первый таймер
if ((ord(pck[15]) * 256 + ord(pck[14])) <= 2500) then
begin
NeedHP:=TRUE;
end;
//синтаксис ELSE забыл-)
if ((ord(pck[15]) * 256 + ord(pck[14])) > 2500) then
begin
NeedHP:=FALSE;
end;
end;

//запоминаем ИД своего самона при вызове
if FromServer and (pck[1]=#$b1) and (ConnectName = 'ник') then
begin
//Если ИД самона сменился, значит он новый.
//значит ставим соски на автомат и ставим флаг присутствия сумона
if (IDSummon <> pck[6] + pck[7] + pck[8] + pck[9]) then
begin
buf:=hstr('D0 05 00 F7 19 00 00 01 00 00 00');
SendToServerEX('ник');
SummonPresent:=TRUE;
end;
IDSummon:=pck[6] + pck[7] + pck[8] + pck[9];
end;


//следим за ХП самона.. если мало то завем нового..
if FromServer and (pck[1]=#$b5) and (ConnectName = 'ник') then
if (pck[6]+pck[7]+pck[8]+pck[9]=IDSummon) then
if ((ord(pck[33]) * 256 + ord(pck[32])) <= 1500) then
begin
//ансумоним
buf:=hstr('45 34 00 00 00 00 00 00 00 00');
SendToServerEX('ник');
SummonPresent:=False;

end;

end.
Код:
//by VORON
//скрипт который рассказывает анекдоты без бана:
///////////////////////////////////////////////////////////////////////////
var
temp: array [1..20] of string;
timer1: TTimer;
x: integer;

procedure Init; //Вызывается при включении скрипта
begin
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer; //
timer1.enabled:=true; //
timer1.interval:=1000;



temp[1]:='" Водка в стиле IT: ';
temp[2]:='0.1л - demo ';
temp[3]:='0.25л - trial version ';
temp[4]:='0.5л - personal edition ';
temp[5]:='0.7л - professional edition ';
temp[6]:='1.0л - network edition ';
temp[7]:='1.75л - enterprise ';
temp[8]:='3л - for small business ';
temp[9]:='5л - corporate edition ';
temp[10]:='Бутыль самогона - home edition ';
temp[11]:='"На посошок" - Service pack ';
temp[12]:='Рассол с утра - Recovery tool ';
temp[13]:='Закуска - plugins ';
temp[14]:='Пиво - patch ';
temp[15]:='Coca-cola, Fanta, 7 UP - trojan viruses';
temp[16]:='';


x:=1;
end;

procedure OnTimer(Sender: TObject);
begin
///
if temp[x] <> '' then
begin
buf:=hstr('38');
writes(temp[x]);
buf:=buf + hstr('01 00 00 00'); ///9- али // 3-пати // 01 - общий
sendtoserverex('ник');
end;
x:=x+1;
if x>= 19 then x:=19; //ЭТА СТРОКА ДЛЯ ТОГО ЧТОБ XELAT заценил глубину мысли! незнаю я синтаксиса-) и учиться лень-) там какойто АНТИЛ надо применять-) а зачем? и так все пашет.
end;


procedure Free; //Вызывается при выключении скрипта
begin
timer1.Free;
end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin

end.
Код:
//by 6yDDucT
//автоматическое использование НР пробирок
var MyID:Word;
    OID:String;

begin
 if FromServer and (pck[1]=#$27) and (ReadD(12)=1060) then
   OID:=pck[8]+pck[9]+pck[10]+pck[11]; //1060 - idItem'a который мы хотим юзать, в данном случае Lesser Healing Potion

 if FromServer and (pck[1]=#$04) then  MyID:=ReadD(18);
 if FromServer and (pck[1]=#$0e) and (ReadD(2)=MyID) then
  if ReadD(6)=4 then
   if (ReadD(14)<=400) then //400 - кол-во ХП при котором начнется пьянка.
    begin
     buf:=#$14+OID+#$00#$00#$00#$00;
     SendToServer;
    end;
end.
Код:
// КАЧ БОТ "ЛОКОМАТИВ" by VORON
//вопщем краткая анотация.. ето конечно покачто не полноценный бот а просто база для написания бота нормального. в данном варианте бот помнит всех мобов вокруг себя и их координаты меняет у себя в памяти если они бегают. такжэ бот знает область в которой нужно качаться круглую, и умеет определять принадлежность мобов к етой зоне. 1 раз в 5 секунд бот принимает решение о том ково атаковать, атакует он ближнего к себе моба из зоны кача.
//впринципе и все..-)) на ету базу убилось 3 дня-) теперь буду доробатывать, модернизировать, и добавлять примочки разные.
VAR
CentrKachX,CentrKachY,RadiusKachX,RadiusKachY: string;
CentrKachXex,CentrKachYex,RadiusKachXex,RadiusKachYex: extended;
RadiusKachEx: extended;


MobID:      array[1..100] of string; // описатель мобов вокруг
MobX:       array[1..100] of string;
MobY:       array[1..100] of string;
MobZ:       array[1..100] of string;
MobActive:  array[1..100] of TDateTime;   //время последнего проявления активности моба


MyCoordX,MyCoordY,MyCoordZ:string; //координаты бота
MyCoordXex,MyCoordYex,MyCoordZex:extended;

//MyID:string;  //мой ИД

timer1: TTimer; //основной таймер
timer2: TTimer; //вспомогательный

i:integer; // вспомогательная
Stop:Boolean;

tX1,tY1,tX2,tY2,tX3,tY3,tDeltaX,tDeltaY,tLenght:EXTENDED;
frm:Tform;


//{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ОСНОВА МОЗГОВ БОТА}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
procedure OnTimer(Sender: TObject);
var
MinPutID:integer; //указывает индекс моба в базе путь до которого самый короткий
MinPutLenght:Extended; //квадрат расстояния до ближайшего моба
tempX1,tempY1,tempX2,tempY2,tempX3,tempY3,tempDeltaX,tempDeltaY,tempLenght:Extended;
begin
MinPutID:=0;
MinPutLenght:=99999999999;
///ищем самого близково к нам моба

for i:= 1 to 100 do
 begin
  if MobID[i] <> '' then
   begin
   tempX1:=ord(MobX[i][3])*256*256  + ord(MobX[i][2]) * 256 + ord(MobX[i][1]);
   tempY1:=ord(MobY[i][3])*256*256  + ord(MobY[i][2]) * 256 + ord(MobY[i][1]);
   if (MobX[i][4] = #$FF) then tempX1:=16777215-tempX1;
   if (MobY[i][4] = #$FF) then tempY1:=16777215-tempY1;


   tempLenght:= sqrt((MyCoordXex-tempx1)*(MyCoordXex-tempx1) + (MyCoordYex-tempy1)*(MyCoordYex-tempy1));

    if (tempLenght<MinPutLenght) then
    begin
     MinPutLenght:=tempLenght;
     MinPutID:=i;
    end;
  end;
 end;

frm.caption:=FloatToStr(MinPutLenght);

   tempX1:=ord(MobX[MinPutID][3])*256*256  + ord(MobX[MinPutID][2]) * 256 + ord(MobX[MinPutID][1]);
   tempY1:=ord(MobY[MinPutID][3])*256*256  + ord(MobY[MinPutID][2]) * 256 + ord(MobY[MinPutID][1]);
   if (MobX[MinPutID][4] = #$FF) then tempX1:=16777215-tempX1;
   if (MobY[MinPutID][4] = #$FF) then tempY1:=16777215-tempY1;

   tempLenght:= sqrt((CentrKachXex-tempX1)*(CentrKachXex-tempX1) + (CentrKachYex-tempY1)*(CentrKachYex-tempY1));



//если радиус от центра до моба меньше чем от чентра до граници кача то
//бьем етого моба
if (tempLenght < RadiusKachEx) then
if (minputid<>0) then
  begin
    //берем в таргет вражину
    buf:=hstr('04') + MobID[MinPutID] + MyCoordX + MyCoordY + MyCoordZ + hstr('00');
    SendToServerEX('ник');
    //пиздим его
    buf:=hstr('04') + MobID[MinPutID] + MyCoordX + MyCoordY + MyCoordZ + hstr('00');
    SendToServerEX('ник');
  end;
end;

procedure OnTimer2(Sender: TObject);
var
x:integer;
begin
///проверка активности мобов. если моб не шевелится 5 минут то
//ето бажный моб или рейд или ваще нпц какойто..
//значит нех его помнить.. стираем его из базы
{for i:= 1 to 100 do
 begin
  if (MobID[i]<>'') then
  if (MobActive[i] < (time - EncodeTime(0,5,0,0))) then
   begin
       MobID[i]:='';
       MobX[i]:='';
       MobY[i]:='';
       MobZ[i]:='';
   end;
 end;}
x:=0;
for i:= 1 to 100 do
begin
if mobid[i] <> '' then x:=x+1;
end;
//frm.caption:=inttostr(x);
//showmessage(inttostr(x));
end;


procedure Init; //Вызывается при включении скрипта
begin
  timer1:=TTimer.Create(nil);
  timer1.OnTimer:=@OnTimer; //
  timer1.enabled:=False; //
  timer1.interval:=5000;

  timer2:=TTimer.Create(nil);
  timer2.OnTimer:=@OnTimer2;
  timer2.enabled:=true; //
  timer2.interval:=5000;

  frm := TForm.Create(nil);
  frm.Caption := 'Chat';
  frm.BorderStyle := bsSizeable;
  frm.Position := poScreencenter;
  frm.Width:=400;
  frm.Height:=600;
  frm.FormStyle:=FsStayOnTop;
  frm.Show;
end;

procedure Free; //Вызывается при выключении скрипта
begin
timer1.Free;
timer2.Free;
  frm.Free;
end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
//*************************************************************************************************
//*************************************************************************************************
//*************************************************************************************************

begin
if pck='' then exit;
//////////////////////////////////////////////////////////////////////////////////////////////////
//запоминаем мобов из пакета NPCInfo (новый моб)
if FromServer and (ConnectName = 'ник') and (pck[1]=#$16) then
begin
STOP:=False;
for i:= 1 to 100 do
  begin
//если нашли то коректируем его координаты в базе на новые
    if (MobID[i] = pck[2] + pck[3] + pck[4] + pck[5]) then
     begin
     MobX[i]:=pck[14] + pck[15] + pck[16] + pck[17];
     MobY[i]:=pck[18] + pck[19] + pck[20] + pck[21];
     MobZ[i]:=pck[22] + pck[23] + pck[24] + pck[25];
     Stop:=true;
     end;
  end;
//перебираем базу и ищем свободную ячейку в ней
   for i:= 1 to 100 do
    begin
     if (MobID[i]='') and (STOP=FALSE) then
      begin
//запоминаем моба в свободную ячейку
       MobID[i]:=pck[2] + pck[3] + pck[4] + pck[5];
       MobX[i]:=pck[14] + pck[15] + pck[16] + pck[17];
       MobY[i]:=pck[18] + pck[19] + pck[20] + pck[21];
       MobZ[i]:=pck[22] + pck[23] + pck[24] + pck[25];
       break;
      end;
    end;
end;
/////////////////////////////////////////////////////////////////////////////////////////////
//если принят пакет ДЕЛЕТ ОБЖЭКТ
if FromServer and (ConnectName = 'ник') and (pck[1]=#$12) then
begin
//ищем моба в базе
 for i:= 1 to 100 do
  begin
//очишаем запись связанную с етим мобом
   if (MobId[i]= pck[2] + pck[3] + pck[4] + pck[5]) then
    begin
       MobID[i]:='';
       MobX[i]:='';
       MobY[i]:='';
       MobZ[i]:='';
       break;

    end;
  end;
end;
////////////////////////////////////////////////////////////////////////////////////////////////////
//коректируем координаты мобов в базе
if FromServer and (ConnectName = 'ник') and (pck[1]=#$01) then
begin
//перебираем базу и ищем там моба который бежит

for i:= 1 to 100 do
  begin
//если нашли то коректируем его координаты в базе на новые
    if (MobID[i] = pck[2] + pck[3] + pck[4] + pck[5]) then
     begin
     MobX[i]:=pck[18] + pck[19] + pck[20] + pck[21];
     MobY[i]:=pck[22] + pck[23] + pck[24] + pck[25];
     MobZ[i]:=pck[26] + pck[27] + pck[28] + pck[29];
     break;
     end;
  end;

end;

////////////////////////////////////////////////////////////////////////////////////////////
//чекаем круглую область кача сообщениями x1 x2
if FromClient and (ConnectName='ник')and (pck[1]=#$38) then
  if (pck[2]=#$78) and (pck[3]=#$00) and (pck[4]=#$31) and (pck[5]=#$00) then
    begin
     pck:='';
     CentrKachX:=MyCoordX;
     CentrKachY:=MyCoordY;

     CentrKachXex:= ord(CentrKachX[3])*256*256  + ord(CentrKachX[2]) * 256 + ord(CentrKachX[1]);
     CentrKachYex:= ord(CentrKachY[3])*256*256  + ord(CentrKachY[2]) * 256 + ord(CentrKachY[1]);
     if (CentrKachX[4] = #$FF) then CentrKachXex:=16777215-CentrKachXex;
     if (CentrKachY[4] = #$FF) then CentrKachYex:=16777215-CentrKachYex;

     exit;
    end;
//////////
if FromClient and (ConnectName='ник')and (pck[1]=#$38) then
  if (pck[2]=#$78) and (pck[3]=#$00) and (pck[4]=#$32) and (pck[5]=#$00) then
    begin
     pck:='';
     RadiusKachX:=MyCoordX;
     RadiusKachY:=MyCoordY;

       RadiusKachXex:= ord(RadiusKachX[3])*256*256  + ord(RadiusKachX[2]) * 256 + ord(RadiusKachX[1]);
       RadiusKachYex:= ord(RadiusKachY[3])*256*256  + ord(RadiusKachY[2]) * 256 + ord(RadiusKachY[1]);
       if (RadiusKachX[4] = #$FF) then RadiusKachXex:=16777215-RadiusKachXex;
       if (RadiusKachY[4] = #$FF) then RadiusKachYex:=16777215-RadiusKachYex;

       RadiusKachEx:=sqrt((RadiusKachXex-CentrKachXex)*(RadiusKachXex-CentrKachXex) + (RadiusKachYex-CentrKachYex)*(RadiusKachYex-CentrKachYex));;

     exit;
    end;
////////////////////////////////////////////////////////////////////////////////////////////////////
//если принят пакет от клиента с моими кординатами то
  if FromClient and (ConnectName='ник') and (pck[1]=#$48) then
    begin
//запоминаем мои координаты
    MyCoordX:= pck[2] + pck[3] + pck[4] + pck[5];
    MyCoordY:= pck[6] + pck[7] + pck[8] + pck[9];
    MyCoordZ:= pck[10] + pck[11] + pck[12] + pck[13];

    MyCoordXex:= ord(MyCoordX[3])*256*256  + ord(MyCoordX[2]) * 256 + ord(MyCoordX[1]);
    MyCoordYex:= ord(MyCoordY[3])*256*256  + ord(MyCoordY[2]) * 256 + ord(MyCoordY[1]);
    if (MyCoordX[4] = #$FF) then MyCoordXex:=16777215-MyCoordXex;
    if (MyCoordY[4] = #$FF) then MyCoordYex:=16777215-MyCoordYex;
    end;

///////////////////////////////////////////////////////////////////////////////////////////
//запускаем мозги бота отправив "хх" в чат
  if FromClient and (ConnectName='ник')and (pck[1]=#$38) then
  if (pck[2]=#$78) and (pck[3]=#$00) and (pck[4]=#$78) and (pck[5]=#$00) then
    begin
     pck:='';
     timer1.enabled:=TRUE;
     exit;
    end;
end.
Код:
//by mks
//Бот баффер Elven Saint, баффает за 5кк

const //баффы 3й профы
b1='2F 49 05 00 00 00 00 00 00 00 ';
b2='2F 4A 05 00 00 00 00 00 00 00 ';
b3='2F 17 05 00 00 00 00 00 00 00 ';
b4='2F 4B 05 00 00 00 00 00 00 00 ';

var
Target: string;
prof,x: integer;
timer1: TTimer;

procedure Init; 
begin
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer;
timer1.enabled:=true;
timer1.interval:=2000;
end;

procedure OnTimer(Sender: TObject);
begin
 case x of
 1: begin
    buf:=hstr(b1);
    sendtoserver;
    x:=x+1;
    end;
 2: begin
    buf:=hstr(b2);
    sendtoserver;
    x:=x+1;
    end;
 3: begin
    buf:=hstr(b3);
    sendtoserver;
    x:=x+1;
    end;
 4: begin
    buf:=hstr(b4);
    sendtoserver;
    x:=0;
    end;
 end;
end;

procedure Free; 
begin
timer1.Free;
end;
 ///////////////////////////////////////////////////////////////////
begin

   if FromServer and (pck[1]=#$5E) and (x=0) then //подкорректил немного, что б бот не принимал трэйд когда кого-то уже баффает 06.08.07
      begin
        Target:=#$04+pck[2]+pck[3]+pck[4]+pck[5];
        buf:=hstr('44 01 00 00 00');
        sendtoserver;  //если кидают трэйд, то принимать
   end;
      if fromclient and (pck[1]=#$44) then pck:=''; {клиент почему-то иногда автоматом отылает кэнсл трэйд, поэтому убиватю этот пакет}
   if fromserver and (pck[1]=#$21) then
      begin
      if pck[14]+pck[15]+pck[16]=#$40#$4B#$4C  then {если в трэйд положили 5кк}
             begin
             buf:=hstr('17 01 00 00 00');//подтвердить трэйд
             prof:=1;
             end;
            if prof=0 then buf:=hstr('17 00 00 00 00');//отмена трэйда
      sendtoserver;
   end;

   if FromServer and (pck[1]+pck[2]=#$22#$01) then
     begin
      buf:=target;
      sendtoserver;

    if prof=1 then
    begin
      x:=1;
      prof:=0;
    end;
    
end;
end.
Код:
//by QaK
//Скрипт на титул бегущей строкой
var
  Main : TForm;
  Timer : TTimer;
  Button : TButton;
  Edit: TEdit;
  Start : Boolean = False;
  Pos_i : Integer;

procedure Init; //Вызывается при включении скрипта
begin
Pos_i:=1;
//формочка
Main := TForm.Create(nil);
Main.Caption := 'Анимированный Титул v 1.0';
Main.BorderStyle := bsSizeable;
Main.Position := poDesigned;
Main.Left :=725;
Main.Top :=0;
Main.Width :=300;
Main.Height :=150;

//пример титула будет выводиться сюда
Edit := TEdit.Create(Main);
Edit.Parent := Main;
Edit.Left := 100;
Edit.Top := 10;
Edit.Width := 102;

//таймер
Timer := TTimer.Create(Main);
Timer.Interval := 1050;
Timer.Enabled := False;
Timer.onTimer := @TimerTimer;

Button := TButton.Create(Main);
Button.Parent := Main;
Button.Caption := 'Старт';
Button.Left := 10;
Button.Top := 10;
Button.onClick := @ButtonClick;

Main.Show;
end;

procedure Free; //Вызывается при выключении скрипта
begin
Edit.Free;
Timer.Free;
Button.Free;
Main.Free;
end;

//процедура смена титула
procedure ChangeTitle(CharName,Title:String);
begin buf:=#$55;
      WriteS(CharName);
      WriteS(Title);
      SendToServer;
end;

//обработчик таймера
procedure TimerTimer(Sender : TTimer);
var i:integer;
    Title:string;                            //Титул текущий
    Full_Title : String = '<Phantom Ranger>';//титул полностью - строка любой длины
    Char_Name : String = 'QaK';              //имя перса 
begin Title:='';
      for i:=1 to 16 do                          //читаем 16 символов = макс длина титула
      if ((i+Pos_i)mod(Length(Full_Title)+1))=0  //если читаем нулевой символ строки Full_Title 
         then Title:=Title+' '                   //вставляем пробел   
         else Title:=Title+Full_Title[(i+Pos_i)mod(Length(Full_Title)+1)];//если нет - то вставляем символ

      Pos_i:=(Pos_i+1)mod(Length(Full_Title)+1); //меняем позицию +1 и если дошли до конца строки - идем читать сначала

      Edit.Text:=Title;
      ChangeTitle(Char_Name,Title);
end;

//запуск титула
procedure ButtonClick(Sender : TButton);
begin
Start := Not (Start);
Timer.Enabled := Start;
If Start
   then Button.Caption:='Стоп'
   else Button.Caption:='Старт';
end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
end.
Код:
//by vimin
//Скрипт для SE, чтобы бегал, лечил и бафал по команде от командира.

const //баффы
b1='2F 10 04 00 00 00 00 00 00 00';    // Shield
b2='2F 0B 04 00 00 00 00 00 00 00';    // Mental Shield
b3='2F 23 04 00 00 00 00 00 00 00';    // Empower
b4='2F B4 04 00 00 00 00 00 00 00';    // Wind Walk
b5='2F 36 04 00 00 00 00 00 00 00';    // Concentration

var
IDPartyMember, IDAssistTarget: String; //ИД командира и ИД его таргета и Собственный ИД
CoordBufX, CoordBufY, CoordBufZ :String; //координаты бота
NameBuffer, NameKomandos : String; // Имена
x: integer;
timer1: TTimer;

procedure OnTimer(Sender: TObject);
begin
 case x of
 1: begin
    //выделяем командира, эмулируя щелчек мыши
    buf:=hstr('04') + IDPartyMember + CoordBufX + CoordBufY + CoordBufZ + hstr('00');
    SendToServerEX(NameBuffer);

    buf:=hstr(b1);
    SendToServerEx(NameBuffer);
    x:=x+1;
    end;
 2: begin
    buf:=hstr(b2);
    SendToServerEx(NameBuffer);
    x:=x+1;
    end;
 3: begin
    buf:=hstr(b3);
    SendToServerEx(NameBuffer);
    x:=x+1;
    end;
 4: begin
    buf:=hstr(b4);
    SendToServerEx(NameBuffer);
    x:=x+1;
    end;
5: begin
    buf:=hstr(b5);
    SendToServerEx(NameBuffer);
    x:=0;
    timer1.enabled:=false;
    end;
 end;
end;

procedure bRun;
begin
     if (CoordBufX <> '') and (IDPartyMember <> '') then
     begin
          //выделяем командира, эмулируя щелчек мыши
          buf:=hstr('04') + IDPartyMember + CoordBufX + CoordBufY + CoordBufZ + hstr('00');
          SendToServerEX(NameBuffer);
          //бежим за командиром эмулируя повторный щелчек мыши по таргету
          buf:=hstr('04') + IDPartyMember + CoordBufX + CoordBufY + CoordBufZ + hstr('00');
          SendToServerEX(NameBuffer);
     end;
end;

procedure bHeal;
begin
     if (CoordBufX <> '') and (IDPartyMember <> '') then
     //if (IDPartyMember <> '') then
     begin
          //выделяем командира, эмулируя щелчек мыши
          buf:=hstr('04') + IDPartyMember + CoordBufX + CoordBufY + CoordBufZ + hstr('00');
          SendToServerEx(NameBuffer);

          // хил
          buf:=hstr('2F C1 04 00 00 00 00 00 00 00'); // Greater Heal

          //отправляем пакет серваку
          SendToServerEx(NameBuffer);
     end;
end;

procedure bRecharge;
begin
     // таргет командира
     buf:=hstr('04') + IDPartyMember + CoordBufX + CoordBufY + CoordBufZ + hstr('00');
     SendToServerEx(NameBuffer);

     // речарж
     buf:=hstr('2F F5 03 00 00 00 00 00 00 00'); // Recharge

     //отправляем пакет серваку
     SendToServerEx(NameBuffer);
     //Say('Make recharge');
end;

procedure Init; //Вызывается при включении скрипта
begin
     NameBuffer:='Buffer';
     NameKomandos:='Komandos';
     timer1:=TTimer.Create(nil);
     timer1.OnTimer:=@OnTimer;
     timer1.enabled:=false;
     timer1.interval:=5000;
     x:=0;
end;

procedure Free; //Вызывается при выключении скрипта
begin
    timer1.Free;
end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
     if pck='' then exit;

     //если от сервака принят пакет с ИД и Координатами членов пати то
     if FromServer and (pck[1]=#$a7) then
     begin
          //запоминаем ИД командира
          IDPartyMember:=pck[6] + pck[7] + pck[8] + pck[9];
     end;

   //если принят пакет от клиента с кординатами бафера то
   if FromClient and (ConnectName=NameBuffer) and (pck[1]=#$48) then
   begin
        //запоминаем координаты
        CoordBufX:= pck[6] + pck[7] + pck[8] + pck[9];
        CoordBufY:= pck[10] + pck[11] + pck[12] + pck[13];
        CoordBufZ:= pck[14] + pck[15] + pck[16] + pck[17];
   end;

   //далее идут управляющие команды

   //если КОМАНДИР пишет в любой чат цифру "1" (код "#$31 #$00" в юникоде (в юникоде под 1 символ используются 2 байта) я так понял) то
   if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
      if (pck[2]=#$31) and (pck[3]=#$00) then
      begin
           //убиваем этот пакет, чтоб сервер его не получил
           pck:='';
           //Бафер БЕЖИТ за КОМАНДИРОМ
           bRun;

           //выйти из рабочей части скрипта чтобы другие услови не проверяли убитый пакет нулевой длинны
           exit;
      end;

   // если КОМАНДИР пишет в любой чат цифру "2"
   if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
       if (pck[2]=#$32) and (pck[3]=#$00) then
       begin
            //убиваем этот пакет, чтоб сервер его не получил
            pck:='';
            bHeal;
            exit;
       end;

   // если КОМАНДИР пишет в любой чат цифру "3" (речардж)
   if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
       if (pck[2]=#$33) and (pck[3]=#$00) then
       begin
            //убиваем этот пакет, чтоб сервер его не получил
            pck:='';
            bRecharge;
            exit;
       end;

   // если КОМАНДИР пишет в любой чат цифру "4" (ребаф)
   if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
       if (pck[2]=#$34) and (pck[3]=#$00) then
       begin
            //убиваем этот пакет, чтоб сервер его не получил
            pck:='';

            // бафы
            timer1.enabled:=true;
            x:=1;
            exit;
       end;

end.
Код:
//Помошник SE by mks
//управляется командами в приват
//баффает, регенит МП, кидает рут по ассисту

const
ment='2F 0B 04 00 00 00 00 00 00 00';     //1  команды в приват
shield='2F 10 04 00 00 00 00 00 00 00';   //2
conc='2F 36 04 00 00 00 00 00 00 00';     //3
ww='2F B4 04 00 00 00 00 00 00 00';       //4
emp='2F 23 04 00 00 00 00 00 00 00';      //5
regen='2F F5 03 00 00 00 00 00 00 00';    //7
root='2F B1 04 00 00 00 00 00 00 00';     //6
res='2F F8 03 00 00 00 00 00 00 00';      //9
sit='45 00 00 00 00 00 00 00 00 00';      //a

var
target, assist: string;                   //target 8, assist 0


procedure Init; //Вызывается при включении скрипта
begin

end;

procedure Free; //Вызывается при выключении скрипта
begin

end;


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;

                      //TargetSelected
       if FromServer and (pck[1]=#$29) then
          begin
            assist:=#$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
            $61:
               begin
                 buf:=hstr(sit);
                 SendToServer;
               end;
            $30:
               begin
                 buf:=assist;
                 SendToServer;
               end;
            $31:
               begin
                 buf:=hstr(ment);
                 SendToServer;
               end;
            $32:
               begin
                 buf:=hstr(shield);
                 SendToServer;
               end;
            $33:
               begin
                 buf:=hstr(conc);
                 SendToServer;
               end;
            $34:
               begin
                 buf:=hstr(ww);
                 SendToServer;
               end;
            $35:
               begin
                 buf:=hstr(emp);
                 SendToServer;
               end;
            $37:
               begin
                 buf:=target;
                 sendtoserver;
                 buf:=hstr(regen);
                 SendToServer;
               end;
            $36:
               begin
                 buf:=assist;
                 sendtoserver;
                 buf:=hstr(root);
                 SendToServer;
               end;
            $39:
               begin
                 buf:=hstr(res);
                 SendToServer;
               end;
            $38:
               begin
                 buf:=target;
                 SendToServer;
               end;
            end;
       end;
end.
Код:
//by mks
//помошник в PvP и PK.
//пьет CP и HP пробирки в нужное время(можно добавить и MP для пвп серваков), и освобождает вас от небоходимости зажатия клавиши Ctrl, которая так меня раздражает!(думаю это раздражает и не только меня)
///////////////////////////////////////////////////////
///////////////Master PvP by MKS v.1.0/////////////////
///////////////////////////////////////////////////////

//после активации скрипта необходимо выпить сначала банку CP, потом HP для получения их ID
const
   Name='xxxxxxx';  //ник перса
var
   CurHP,MaxHP,CurCP,MaxCP: integer;
   CPuse,HPuse: string;

   TimerCP,TimerHP: TTimer;

procedure Init; //Вызывается при включении скрипта
begin
  TimerCP:=TTimer.Create(nil);
  TimerCP.OnTimer:=@OnTimerCP;
  TimerCP.enabled:=false;
  TimerCP.interval:=1000;  //интервал 1сек, т.к. чаще пить CP всеравно не будет, дабы не засорять трафик

  TimerHP:=TTimer.Create(nil);
  TimerHP.OnTimer:=@OnTimerHP;
  TimerHP.enabled:=false;
  TimerHP.interval:=15000; //интервал 15сек, т.к. действие одной бутылки = 15сек
end;

procedure OnTimerCP(Sender: TObject);
begin
  buf:=CPuse;
  SendToServerEx(Name);
end;
procedure OnTimerHP(Sender: TObject);
begin
  buf:=HPuse;
  SendToServerEx(Name);
end;

procedure Free; //Вызывается при выключении скрипта
begin
  TimerCP.free;
  TimerHP.free;
  HPuse:='';
  CPuse:='';
end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
//пьем сначала CP, потом HP банку что б запомнить их ID(я решил взять эти пакеты целиком, дабы не усложнять)
  if FromClient and (ConnectName=Name) and (pck[1]=#$14) and (CPuse='') then CPuse:=pck;
  if FromClient and (ConnectName=Name) and (pck[1]=#$14) and (CPuse<>pck) and (HPuse='') then HPuse:=pck;

//считываем текущие и максимальные значения CP и HP
if FromServer and (pck[1]+pck[6]=#$0E#$04) then
  begin
    CurHP:=ReadD(14);
    MaxHP:=ReadD(22);
    CurCP:=ReadD(30);
    MaxCP:=ReadD(38);
  end;

//если вы используете не грэйтер CP то вместо 200 подставьте кол-во CP сколько восстанавливает 1 банка
if (CurCP<MaxCP-200) and (CPuse<>'') then TimerCP.enabled:=true else TimerCP.enabled:=false;
if (CurHP<MaxHP) and (HPuse<>'') then TimerHP.enabled:=true else TimerHP.enabled:=false;

//если используем скилы или заклинания добавляем флаг Ctrl, что б не надо было удерживать контрол
if FromClient and (ConnectName=Name) and (pck[1]=#$2F) then pck[6]:=#$01;

//если наводим таргет, повторное нажатие по нему подменивается на атаку, опять же что б не удерживать контрол
if FromClient and (ConnectName=Name) and (pck[1]=#$04) then pck[1]:=#$0A;

end.
Код:
авот щедевр! выкладываю- с чувством обиды что меня забанили за етот скрипт! но ! скрипт- жэсть хотя ничего нового в нем нет.. всеголиш 3 ФСа управляются ШЕ.. ы-) но так как уже бан словил- поделюсь с вами.. насладился я етим скриптом  в доволь--).

var
IDKomandos,IDBot1,IDBot2,IDBot3,IDsum1,IDsum2,IDsum3,IDAssistTarget: string;//ИД командира, 2-х ботов, и их сумонов
IDTargetBot1,IDTargetBot2,IDTargetBot3:string; //идешники таргетов у ботов
Sum1Present,Sum2Present,Sum3Present:BOOLEAN; // флаги присутствия самонов..
HPSUM11lim1,HPSUM11lim2,HPSUM21lim1,HPSUM21lim2,HPSUM31lim1,HPSUM31lim2,HPSUM12lim2,HPSUM13lim2,HPSUM22lim2,HPSUM23lim2,HPSUM32lim2,HPSUM33lim2,HPSUM12lim1,HPSUM13lim1,HPSUM22lim1,HPSUM23lim1,HPSUM32lim1,HPSUM33lim1,HPBOT1,HPBOT2,HPBOT3,HPKOMANDOS:integer; //уровни срабатывания хила
Bot1X,Bot1Y,Bot1Z,Bot2X,Bot2Y,Bot2Z,Bot3X,Bot3Y,Bot3Z:string;//координаты
IDBot1TargetForAttack,IDBot2TargetForAttack,IDBot3TargetForAttack:string;//цели ботов для атаки
KomCurHP,Bot1CurHP,Bot2CurHP,Bot3CurHP,Bot1SumCurHP,Bot2SumCurHP,Bot3SumCurHP:INTEGER;
PvP:STRING; //принимает значение '00' или '01' указывающее на режим атаки с контролом или без
  paket:string;

Rezim:integer;
TP:Boolean;
timer1: TTimer; //для смены самонов
timer2: TTimer; //баф 1 бот
timer3: TTimer; //баф 2 бот
timer4: TTimer; //баф 3 бот

chek2,chek3,chek4:integer;



procedure Bot1beg;
begin
if  (Bot1X <> '') and (IDKomandos <> '') then

    begin
    //выделяем командира, эмулируя щелчек мыши
    buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
    SendToServerEX('VORON7');
    //бежим за командиром эмулируя повторный щелчек мыши по таргету
    buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
    SendToServerEX('VORON7');

    buf:=hstr('45 16 00 00 00 00 00 00 00 00');
    SendToServerEX('VORON7');
    end;
end;

procedure Bot2beg;
begin
if  (Bot2X <> '') and (IDKomandos <> '') then

    begin
    //выделяем командира, эмулируя щелчек мыши
    buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
    SendToServerEX('crown');
    //бежим за командиром эмулируя повторный щелчек мыши по таргету
    buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
    SendToServerEX('crown');

    buf:=hstr('45 16 00 00 00 00 00 00 00 00');
    SendToServerEX('crown');
    end;
end;

procedure Bot3beg;
begin
if  (Bot3X <> '') and (IDKomandos <> '') then

    begin
    //выделяем командира, эмулируя щелчек мыши
    buf:=hstr('04') + IDKomandos + Bot3X + Bot3Y + Bot3Z + hstr('00');
    SendToServerEX('Petr1');
    //бежим за командиром эмулируя повторный щелчек мыши по таргету
    buf:=hstr('04') + IDKomandos + Bot3X + Bot3Y + Bot3Z + hstr('00');
    SendToServerEX('Petr1');

    buf:=hstr('45 16 00 00 00 00 00 00 00 00');
    SendToServerEX('Petr1');
    end;
end;

procedure Bot1attack;
begin
if  (Bot1X <> '') and (IDAssistTarget <> '') then
if  (IDAssistTarget<>IDKomandos) and (IDAssistTarget<>IDBot1) and (IDAssistTarget<>IDBot2) and (IDAssistTarget<>IDBot3) then
    begin
    //выделяем вражину
    buf:=hstr('04') + IDAssistTarget + Bot1X + Bot1Y + Bot1Z + hstr('00');
    SendToServerEX('VORON7');

    IDBot1TargetForAttack:=IDAssistTarget;

    buf:=hstr('45 16 00 00 00')+ hstr(pvp)  +hstr('00 00 00 00');
    SendToServerEX('VORON7');

    end;
end;

procedure Bot2attack;
begin
if  (Bot2X <> '') and (IDAssistTarget <> '') then
if  (IDAssistTarget<>IDKomandos) and (IDAssistTarget<>IDBot1) and (IDAssistTarget<>IDBot2) and (IDAssistTarget<>IDBot3) then
    begin
    //выделяем вражину
    buf:=hstr('04') + IDAssistTarget + Bot2X + Bot2Y + Bot2Z + hstr('00');
    SendToServerEX('crown');

    IDBot2TargetForAttack:=IDAssistTarget;

    buf:=hstr('45 16 00 00 00')+ hstr(pvp)  +hstr('00 00 00 00');
    SendToServerEX('crown');

    end;
end;

procedure Bot3attack;
begin
if  (Bot3X <> '') and (IDAssistTarget <> '') then
if  (IDAssistTarget<>IDKomandos) and (IDAssistTarget<>IDBot1) and (IDAssistTarget<>IDBot2) and (IDAssistTarget<>IDBot3) then
    begin
    //выделяем вражину
    buf:=hstr('04') + IDAssistTarget + Bot3X + Bot3Y + Bot3Z + hstr('00');
    SendToServerEX('Petr1');

    IDBot3TargetForAttack:=IDAssistTarget;

    buf:=hstr('45 16 00 00 00')+ hstr(pvp)  +hstr('00 00 00 00');
    SendToServerEX('Petr1');

    end;
end;

procedure AllBotShot;
begin
if  (IDAssistTarget <> '') then
    begin
    //выделяем вражину
    buf:=hstr('04') + IDAssistTarget + Bot3X + Bot3Y + Bot3Z + hstr('00');
    SendToServerEX('VORON7');
    SendToServerEX('crown');
    SendToServerEX('Petr1');


    buf:=hstr('45 2F 00 00 00 01 00 00 00 00');
    SendToServerEX('VORON7');
    SendToServerEX('crown');
    SendToServerEX('Petr1');

    end;
end;


procedure Init; //Вызывается при включении скрипта
begin
chek2:=1;
chek3:=1;
chek4:=1;

PvP:='00';

//начальные значения переменных
Sum1Present:=FALSE;
Sum2Present:=FALSE;
Sum3Present:=FALSE;

TP:=FALSE;

Rezim:=1;

HPKOMANDOS:=2605-300;
KomCurHP:=2605;

HPBOT1:=4121-900;
Bot1CurHP:=4121;
HPSUM11lim1:=6876-936;
HPSUM12lim1:=7085-936;
HPSUM13lim1:=5314-936;
Bot1SumCurHP:=6876;

HPBOT2:=3097-900;
Bot2CurHP:=3097;
HPSUM21lim1:=6876-936;
HPSUM22lim1:=6876-936;
HPSUM23lim1:=5157-936;
Bot2SumCurHP:=6876;

HPBOT3:=2333-900;
Bot3CurHP:=2333;
HPSUM31lim1:=5414-936;
HPSUM32lim1:=5414-936;
HPSUM33lim1:=4060-936;
Bot3SumCurHP:=5414;

  timer1:=TTimer.Create(nil);
  timer1.OnTimer:=@OnTimer1;
  timer1.enabled:=true;
  timer1.interval:=1000;

  timer2:=TTimer.Create(nil);
  timer2.OnTimer:=@OnTimer2;
  timer2.enabled:=false;
  timer2.interval:=4000;

  timer3:=TTimer.Create(nil);
  timer3.OnTimer:=@OnTimer3;
  timer3.enabled:=false;
  timer3.interval:=4000;

  timer4:=TTimer.Create(nil);
  timer4.OnTimer:=@OnTimer4;
  timer4.enabled:=false;
  timer4.interval:=4000;


 buf:=hstr('38');
 writes('я1');
 buf:=buf +  hstr('03 00 00 00'); ///9- али  //  3-пати  // 01 - общий
 sendtoserverex('Blud');

 buf:=hstr('38');
 writes('я2');
 buf:=buf +  hstr('03 00 00 00'); ///9- али  //  3-пати  // 01 - общий
 sendtoserverex('VORON7');

 buf:=hstr('38');
 writes('я3');
 buf:=buf +  hstr('03 00 00 00'); ///9- али  //  3-пати  // 01 - общий
 sendtoserverex('crown');

 buf:=hstr('38');
 writes('я4');
 buf:=buf +  hstr('03 00 00 00'); ///9- али  //  3-пати  // 01 - общий
 sendtoserverex('Petr1');

//юзаем бтм для фикса координат
 buf:=hstr('2F 85 04 00 00 00 00 00 00 00');
 sendtoserverex('VORON7');
 sendtoserverex('crown');
 sendtoserverex('Petr1');

end;

procedure Free; //Вызывается при выключении скрипта
begin
timer1.Free;
timer2.Free;
timer3.Free;
timer4.Free;
end;
//***************БУФ САМОНОВ ПРИ СМЕНЕ******************************************************
procedure OnTimer2(Sender: TObject);
begin
if chek2=1 then
 begin
  buf:=hstr('2F 7A 04 00 00 00 00 00 00 00');
  SendToServerEX('VORON7');
 end;

if chek2=2 then
 begin
  buf:=hstr('2F 75 04 00 00 00 00 00 00 00');
  SendToServerEX('VORON7');
 end;

if chek2=3 then
 begin
  buf:=hstr('2F 74 04 00 00 00 00 00 00 00');
  SendToServerEX('VORON7');
 end;

if chek2=4 then
 begin
  buf:=hstr('2F 73 04 00 00 00 00 00 00 00');
  SendToServerEX('VORON7');
 end;

chek2:=chek2+1;

if chek2=5 then
 begin
 chek2:=1;
 timer2.enabled:=false;
 end;
end;

procedure OnTimer3(Sender: TObject);
begin
if chek3=1 then
 begin
  buf:=hstr('2F 7A 04 00 00 00 00 00 00 00');
  SendToServerEX('crown');
 end;

if chek3=2 then
 begin
  buf:=hstr('2F 75 04 00 00 00 00 00 00 00');
  SendToServerEX('crown');
 end;

if chek3=3 then
 begin
  buf:=hstr('2F 74 04 00 00 00 00 00 00 00');
  SendToServerEX('crown');
 end;

if chek3=4 then
 begin
  buf:=hstr('2F 73 04 00 00 00 00 00 00 00');
  SendToServerEX('crown');
 end;

chek3:=chek3+1;

if chek3=5 then
 begin
 chek3:=1;
 timer3.enabled:=false;
 end;
end;

procedure OnTimer4(Sender: TObject);
begin
if chek4=1 then
 begin
  buf:=hstr('2F 7A 04 00 00 00 00 00 00 00');
  SendToServerEX('Petr1');
 end;

if chek4=2 then
 begin
  buf:=hstr('2F 75 04 00 00 00 00 00 00 00');
  SendToServerEX('Petr1');
 end;

if chek4=3 then
 begin
  buf:=hstr('2F 74 04 00 00 00 00 00 00 00');
  SendToServerEX('Petr1');
 end;

if chek4=4 then
 begin
  buf:=hstr('2F 73 04 00 00 00 00 00 00 00');
  SendToServerEX('Petr1');
 end;

chek4:=chek4+1;

if chek4=5 then
 begin
 chek4:=1;
 timer4.enabled:=false;
 end;
end;

//****************************ЗАВЕМ НОВЫХ САМОНОВ********************************************
procedure OnTimer1(Sender: TObject);
begin

 if (Sum1Present=FALSE) then
  begin
  if (Rezim=1) then
     begin
      buf:=hstr('2F CC 04 00 00 00 00 00 00 00');
      SendToServerEX('VORON7');
     end;
  if (Rezim=2) then
     begin
      buf:=hstr('2F 68 04 00 00 00 00 00 00 00');
      SendToServerEX('VORON7');
     end;
  if (Rezim=3) then
     begin
      buf:=hstr('2F FE 04 00 00 00 00 00 00 00');
      SendToServerEX('VORON7');
     end;
  end;


 if (Sum2Present=FALSE) then
  begin
  if (Rezim=1) then
     begin
      buf:=hstr('2F CC 04 00 00 00 00 00 00 00');
      SendToServerEX('crown');
     end;
  if (Rezim=2) then
     begin
      buf:=hstr('2F 68 04 00 00 00 00 00 00 00');
      SendToServerEX('crown');
     end;
  if (Rezim=3) then
     begin
      buf:=hstr('2F FE 04 00 00 00 00 00 00 00');
      SendToServerEX('crown');
     end;
  end;

 if (Sum3Present=FALSE) then
  begin
  if (Rezim=1) then
     begin
      buf:=hstr('2F CC 04 00 00 00 00 00 00 00');
      SendToServerEX('Petr1');
     end;
  if (Rezim=2) then
     begin
      buf:=hstr('2F 68 04 00 00 00 00 00 00 00');
//      SendToServerEX('Petr1');
     end;
  if (Rezim=3) then
     begin
      buf:=hstr('2F FE 04 00 00 00 00 00 00 00');
      SendToServerEX('Petr1');
     end;
  end;

end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;
//********************ОСТСЛЕЖИВАЕМ ТРУПАКИ********************************************************
//если кто то умер.. пакет DIE.. то хилить его ненадо...
//нефиг трупы хилить...
  if FromServer and (pck[1]=#$06) then
  if (pck[2]+pck[3]+pck[4]+pck[5] = IDKomandos) then KomCurHP:=15000;

  if FromServer and (pck[1]=#$06) then
  if (pck[2]+pck[3]+pck[4]+pck[5] = IDBot1) then Bot1CurHP:=15000;

  if FromServer and (pck[1]=#$06) then
  if (pck[2]+pck[3]+pck[4]+pck[5] = IDBot2) then Bot2CurHP:=15000;

  if FromServer and (pck[1]=#$06) then
  if (pck[2]+pck[3]+pck[4]+pck[5] = IDBot3) then Bot3CurHP:=15000;

  if FromServer and (pck[1]=#$06) then
  if (pck[2]+pck[3]+pck[4]+pck[5] = IDsum1) then Bot1SumCurHP:=15000;

  if FromServer and (pck[1]=#$06) then
  if (pck[2]+pck[3]+pck[4]+pck[5] = IDsum2) then Bot2SumCurHP:=15000;

  if FromServer and (pck[1]=#$06) then
  if (pck[2]+pck[3]+pck[4]+pck[5] = IDsum3) then Bot3SumCurHP:=15000;

//****************************БЛОК КОДА ДЛЯ ЗАПОМИНАНИЯ ВСЕХ ИДЕШНИКОВ************************
//запоминаем ИД лидера. если лидер пишет в чат 'я1' то запоминаем ид из ответа сервера
//условия требуют переделки под разных чаров.. в зависимости от кол-ва букв в нике и самого ника
  if FromServer and (ConnectName='Blud') and (pck[1]=#$4A) then
  if (pck[10]+pck[11]+pck[12]+pck[13]+pck[14]+pck[15]=hstr('42 00 6C 00 75 00')) then
  if (pck[20]+pck[21]+pck[22]+pck[23]+pck[24]+pck[25]=hstr('4F 04 31 00 00 00')) then
  begin
  IDKomandos:=pck[2]+pck[3]+pck[4]+pck[5];
  end;

  if FromServer and (ConnectName='VORON7') and (pck[1]=#$4A) then
  if (pck[10]+pck[11]+pck[12]+pck[13]+pck[14]+pck[15]=hstr('56 00 4F 00 52 00')) then
  if (pck[24]+pck[25]+pck[26]+pck[27]+pck[28]+pck[29]=hstr('4F 04 32 00 00 00')) then
  begin
  IDbot1:=pck[2]+pck[3]+pck[4]+pck[5];
  end;

  if FromServer and (ConnectName='crown') and (pck[1]=#$4A) then
  if (pck[10]+pck[11]+pck[12]+pck[13]+pck[14]+pck[15]=hstr('63 00 72 00 6F 00')) then
  if (pck[22]+pck[23]+pck[24]+pck[25]+pck[26]+pck[27]=hstr('4F 04 33 00 00 00')) then
  begin
  IDbot2:=pck[2]+pck[3]+pck[4]+pck[5];
  end;

  if FromServer and (ConnectName='Petr1') and (pck[1]=#$4A) then
  if (pck[10]+pck[11]+pck[12]+pck[13]+pck[14]+pck[15]=hstr('50 00 65 00 74 00')) then
  if (pck[22]+pck[23]+pck[24]+pck[25]+pck[26]+pck[27]=hstr('4F 04 34 00 00 00')) then
  begin
  IDbot3:=pck[2]+pck[3]+pck[4]+pck[5];
  end;

//запоминаем ИД своего самона при вызове из пакета PetInfo
  if FromServer and (pck[1]=#$b1) and (ConnectName = 'VORON7')  then
    begin
    //Если ИД самона сменился, значит он новый.
    //значит ставим соски на автомат и ставим флаг присутствия сумона
    if (IDSum1 <> pck[6] + pck[7] + pck[8] + pck[9]) and (Sum1Present=FALSE)  then
      begin
      buf:=hstr('D0 05 00 F7 19 00 00 01 00 00 00');
      SendToServerEX('VORON7');
      buf:=hstr('D0 05 00 F5 19 00 00 01 00 00 00');
      SendToServerEX('VORON7');
      //ЗАПУСК ТАЙМЕРА с БАФОМ
      timer2.enabled:=true;
      end;
    Sum1Present:=TRUE;
    IDsum1:=pck[6] + pck[7] + pck[8] + pck[9];
    end;

  if FromServer and (pck[1]=#$b1) and (ConnectName = 'crown')  then
    begin
    //Если ИД самона сменился, значит он новый.
    //значит ставим соски на автомат и ставим флаг присутствия сумона
    if (IDSum2 <> pck[6] + pck[7] + pck[8] + pck[9]) and (Sum2Present=FALSE) then
      begin
      buf:=hstr('D0 05 00 F7 19 00 00 01 00 00 00');
      SendToServerEX('crown');
      buf:=hstr('D0 05 00 F5 19 00 00 01 00 00 00');
      SendToServerEX('crown');
      //ЗАПУСК ТАЙМЕРА с БАФОМ
      timer3.enabled:=true;
      end;
    Sum2Present:=TRUE;
    IDsum2:=pck[6] + pck[7] + pck[8] + pck[9];
    end;

    if FromServer and (pck[1]=#$b1) and (ConnectName = 'Petr1')  then
    begin
    //Если ИД самона сменился, значит он новый.
    //значит ставим соски на автомат и ставим флаг присутствия сумона
    if (IDSum2 <> pck[6] + pck[7] + pck[8] + pck[9]) and (Sum3Present=FALSE) then
      begin
      buf:=hstr('D0 05 00 F7 19 00 00 01 00 00 00');
      SendToServerEX('Petr1');
      buf:=hstr('D0 05 00 F5 19 00 00 01 00 00 00');
      SendToServerEX('Petr1');
      //ЗАПУСК ТАЙМЕРА с БАФОМ
      timer4.enabled:=true;
      end;
    Sum3Present:=TRUE;
    IDsum3:=pck[6] + pck[7] + pck[8] + pck[9];
    end;
//**************************ПРИ ИСЧЕЗАНИИ САМОНА - ПРЕДПОЛАГАЕМ ЧТО ОН УМЕР******************
//второй вариант то что мы телепортировались..
//но при телепортации не меняется идешник самона..
//поетой причине соски не будут ставиться на автомат повторно..
//произойдет попытка вызова самона.. ето не страшно..
  if FromServer and (pck[1]=#$12) and (ConnectName = 'VORON7')  then
  if  (pck[2]+pck[3]+pck[4]+pck[5]=IDsum1) then
  begin
    Sum1Present:=FALSE;
  end;

  if FromServer and (pck[1]=#$12) and (ConnectName = 'crown')  then
  if  (pck[2]+pck[3]+pck[4]+pck[5]=IDsum2) then
  begin
    Sum2Present:=FALSE;
  end;

  if FromServer and (pck[1]=#$12) and (ConnectName = 'Petr1')  then
  if  (pck[2]+pck[3]+pck[4]+pck[5]=IDsum3) then
  begin
    Sum3Present:=FALSE;
  end;

//**********************СЛЕДИМ ЗА ХП САМОНОВ*****************************
//следим за ХП самона.. если мало то хилим..
  if FromServer and (pck[1]=#$b5) and (ConnectName = 'VORON7')  then
  if (pck[6]+pck[7]+pck[8]+pck[9]=IDSum1) then
  begin
  Bot1SumCurHP:=(ord(pck[33]) * 256 + ord(pck[32]));
   //УД
    if (Bot1SumCurHP <= 1000) then
      begin
      //хилим
      buf:=hstr('2F 13 05 00 00 00 00 00 00 00');
      SendToServerEX('VORON7');
      end;

    if (Rezim=1) and (Bot1SumCurHP <= HPSUM11lim1) then
      begin
      //хилим
      buf:=hstr('2F 67 04 00 00 00 00 00 00 00');
      SendToServerEX('VORON7');
      end;
    if (Rezim=2) and (Bot1SumCurHP <= HPSUM12lim1) then
      begin
      //хилим
      buf:=hstr('2F 67 04 00 00 00 00 00 00 00');
      SendToServerEX('VORON7');
      end;
    if (Rezim=3) and (Bot1SumCurHP <= HPSUM13lim1) then
      begin
      //хилим
      buf:=hstr('2F 67 04 00 00 00 00 00 00 00');
      SendToServerEX('VORON7');
      end;
   end;
///////////////////


  if FromServer and (pck[1]=#$b5) and (ConnectName = 'crown')  then
  if (pck[6]+pck[7]+pck[8]+pck[9]=IDSum2) then
  begin
  Bot2SumCurHP:=(ord(pck[33]) * 256 + ord(pck[32]));

    if (Bot2SumCurHP <= 1000) then
      begin
      //УД
      buf:=hstr('2F 13 05 00 00 00 00 00 00 00');
      SendToServerEX('crown');
      end;

    if (Rezim=1) and (Bot2SumCurHP <= HPSUM21lim1) then
      begin
      //хилим
      buf:=hstr('2F 67 04 00 00 00 00 00 00 00');
      SendToServerEX('crown');
      end;
    if (Rezim=2) and (Bot2SumCurHP <= HPSUM22lim1) then
      begin
      //хилим
      buf:=hstr('2F 67 04 00 00 00 00 00 00 00');
      SendToServerEX('crown');
      end;
    if (Rezim=3) and (Bot2SumCurHP <= HPSUM23lim1) then
      begin
      //хилим
      buf:=hstr('2F 67 04 00 00 00 00 00 00 00');
      SendToServerEX('crown');
      end;
  end;
///////
  if FromServer and (pck[1]=#$b5) and (ConnectName = 'Petr1')  then
  if (pck[6]+pck[7]+pck[8]+pck[9]=IDSum3) then
  begin
  Bot3SumCurHP:=(ord(pck[33]) * 256 + ord(pck[32]));

      if (Bot3SumCurHP <= 1000) then
      begin
      //УД
      buf:=hstr('2F 13 05 00 00 00 00 00 00 00');
      SendToServerEX('Petr1');
      end;

    if (Rezim=1) and (Bot3SumCurHP <= HPSUM31lim1) then
      begin
      //хилим
      buf:=hstr('2F 67 04 00 00 00 00 00 00 00');
      SendToServerEX('Petr1');
      end;
    if (Rezim=2) and (Bot3SumCurHP <= HPSUM32lim1) then
      begin
      //хилим
      buf:=hstr('2F 67 04 00 00 00 00 00 00 00');
      SendToServerEX('Petr1');
      end;
    if (Rezim=3) and (Bot3SumCurHP <= HPSUM33lim1) then
      begin
      //хилим
      buf:=hstr('2F 67 04 00 00 00 00 00 00 00');
      SendToServerEX('Petr1');
      end;
  end;
//**********************ЗАПОМИНАЕМ КООРДИНАТЫ***********************************************
//если принят пакет от клиента с кординатами бота то
  if FromClient and (ConnectName='VORON7') and (pck[1]=#$48) then
    begin
//запоминаем координаты
    Bot1X:= pck[2] + pck[3] + pck[4] + pck[5];
    Bot1Y:= pck[6] + pck[7] + pck[8] + pck[9];
    Bot1Z:= pck[10] + pck[11] + pck[12] + pck[13];
    end;

//если принят пакет от клиента с кординатами бота то
  if FromClient and (ConnectName='crown') and (pck[1]=#$48) then
    begin
//запоминаем координаты
    Bot2X:= pck[2] + pck[3] + pck[4] + pck[5];
    Bot2Y:= pck[6] + pck[7] + pck[8] + pck[9];
    Bot2Z:= pck[10] + pck[11] + pck[12] + pck[13];
    end;

//если принят пакет от клиента с кординатами бота то
  if FromClient and (ConnectName='Petr1') and (pck[1]=#$48) then
    begin
//запоминаем координаты
    Bot3X:= pck[2] + pck[3] + pck[4] + pck[5];
    Bot3Y:= pck[6] + pck[7] + pck[8] + pck[9];
    Bot3Z:= pck[10] + pck[11] + pck[12] + pck[13];
    end;
//**********************СЛЕДИМ ЗА ТАРГЕТАМИ****************************************
//КОМАНДИР
//если принят пакет со сменой таргета у командира то
  if FromServer and (pck[1]=#$A6) and (ConnectName = 'Blud') then
   begin
//запоминаем ИД таргета командира для ассиста
   IDAssistTarget:= pck[2]+pck[3]+pck[4]+pck[5];
   end;

//БОТ1
//если принят пакет со сменой таргета то
  if FromServer and (pck[1]=#$A6) and (ConnectName = 'VORON7') then
   begin
//запоминаем ИД таргета
   IDTargetBot1:= pck[2]+pck[3]+pck[4]+pck[5];
   end;

//БОТ2
//если принят пакет со сменой таргета то
  if FromServer and (pck[1]=#$A6) and (ConnectName = 'crown') then
   begin
//запоминаем ИД таргета
   IDTargetBot2:= pck[2]+pck[3]+pck[4]+pck[5];
   end;

//БОТ3
//если принят пакет со сменой таргета то
  if FromServer and (pck[1]=#$A6) and (ConnectName = 'Petr1') then
   begin
//запоминаем ИД таргета
   IDTargetBot3:= pck[2]+pck[3]+pck[4]+pck[5];
   end;
//**********************СЛЕДИМ ЗА ХП БОТОВ и ЛИДЕРА (сумонеры хилят)***************************
//следим за СТАТУСОМ ЛИДЕРА
  if FromServer and (pck[1]=#$0e) and (ConnectName = 'Blud')  then
  if (pck[2] + pck[3] + pck[4] + pck[5] = IDKomandos) and (pck[6]=#$04) then
  begin
    KomCurHP:=(ord(pck[15]) * 256 + ord(pck[14]));

     if (KomCurHP < HPKOMANDOS) then
     begin
      buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
      SendToServerEX('VORON7');
      buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
      SendToServerEX('VORON7');
      buf:=hstr('04') + IDBot1 + Bot1X + Bot1Y + Bot1Z + hstr('00');
      SendToServerEX('VORON7');

      buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
      SendToServerEX('crown');
      buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
      SendToServerEX('crown');
      buf:=hstr('04') + IDBot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
      SendToServerEX('crown');


      buf:=hstr('04') + IDKomandos + Bot3X + Bot3Y + Bot3Z + hstr('00');
      SendToServerEX('Petr1');
      buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
      SendToServerEX('Petr1');
      buf:=hstr('04') + IDBot3 + Bot3X + Bot3Y + Bot3Z + hstr('00');
      SendToServerEX('Petr1');
     end;
  end;

//следим за СТАТУСОМ 1-го бота
  if FromServer and (pck[1]=#$0e) and (ConnectName = 'VORON7')  then
  if (pck[2] + pck[3] + pck[4] + pck[5] = IDBot1) and (pck[6]=#$04) then
    begin
    Bot1CurHP:=(ord(pck[15]) * 256 + ord(pck[14]));

      if (Bot1CurHP < HPBOT1) then
      begin
      buf:=hstr('04') + IDBot1 + Bot1X + Bot1Y + Bot1Z + hstr('00');
      SendToServerEX('VORON7');
      buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
      SendToServerEX('VORON7');
      buf:=hstr('04') + IDBot1 + Bot1X + Bot1Y + Bot1Z + hstr('00');
      SendToServerEX('VORON7');

      buf:=hstr('04') + IDBot1 + Bot2X + Bot2Y + Bot2Z + hstr('00');
      SendToServerEX('crown');
      buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
      SendToServerEX('crown');
      buf:=hstr('04') + IDBot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
      SendToServerEX('crown');

      buf:=hstr('04') + IDBot1 + Bot3X + Bot3Y + Bot3Z + hstr('00');
      SendToServerEX('Petr1');
      buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
      SendToServerEX('Petr1');
      buf:=hstr('04') + IDBot3 + Bot3X + Bot3Y + Bot3Z + hstr('00');
      SendToServerEX('Petr1');
      end;
   end;

//следим за СТАТУСОМ 2-го бота
  if FromServer and (pck[1]=#$0e) and (ConnectName = 'crown')  then
  if (pck[2] + pck[3] + pck[4] + pck[5] = IDBot2) and (pck[6]=#$04) then
    begin
    Bot2CurHP:=(ord(pck[15]) * 256 + ord(pck[14]));

      if (Bot2CurHP < HPBOT2) then
      begin
      buf:=hstr('04') + IDBot2 + Bot1X + Bot1Y + Bot1Z + hstr('00');
      SendToServerEX('VORON7');
      buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
      SendToServerEX('VORON7');
      buf:=hstr('04') + IDBot1 + Bot1X + Bot1Y + Bot1Z + hstr('00');
      SendToServerEX('VORON7');

      buf:=hstr('04') + IDBot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
      SendToServerEX('crown');
      buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
      SendToServerEX('crown');
      buf:=hstr('04') + IDBot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
      SendToServerEX('crown');

      buf:=hstr('04') + IDBot2 + Bot3X + Bot3Y + Bot3Z + hstr('00');
      SendToServerEX('Petr1');
      buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
      SendToServerEX('Petr1');
      buf:=hstr('04') + IDBot3 + Bot3X + Bot3Y + Bot3Z + hstr('00');
      SendToServerEX('Petr1');
      end;
   end;

//следим за СТАТУСОМ 3-го бота
  if FromServer and (pck[1]=#$0e) and (ConnectName = 'Petr1')  then
  if (pck[2] + pck[3] + pck[4] + pck[5] = IDBot3) and (pck[6]=#$04) then
    begin
    Bot3CurHP:=(ord(pck[15]) * 256 + ord(pck[14]));
     if (Bot3CurHP < HPBOT3) then
     begin
      buf:=hstr('04') + IDBot3 + Bot1X + Bot1Y + Bot1Z + hstr('00');
      SendToServerEX('VORON7');
      buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
      SendToServerEX('VORON7');
      buf:=hstr('04') + IDBot1 + Bot1X + Bot1Y + Bot1Z + hstr('00');
      SendToServerEX('VORON7');

      buf:=hstr('04') + IDBot3 + Bot2X + Bot2Y + Bot2Z + hstr('00');
      SendToServerEX('crown');
      buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
      SendToServerEX('crown');
      buf:=hstr('04') + IDBot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
      SendToServerEX('crown');

      buf:=hstr('04') + IDBot3 + Bot3X + Bot3Y + Bot3Z + hstr('00');
      SendToServerEX('Petr1');
      buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
      SendToServerEX('Petr1');
      buf:=hstr('04') + IDBot3 + Bot3X + Bot3Y + Bot3Z + hstr('00');
      SendToServerEX('Petr1');
      end;
    end;

//**********************УПРАВЛЯЕМ БРИГАДОЙ**************************************************
//ПРИВЕТСТВИЕ- БЕГ за ЛИДЕРОМ
  if FromClient and (ConnectName='Blud') and (pck=hstr('1B 02 00 00 00')) then
    begin
     pck:='';
     bot1beg;
     bot2beg;
     bot3beg;
     exit;
    end;

//ПОБЕДА
  if FromClient and (ConnectName='Blud') and (pck=hstr('1B 03 00 00 00')) then
    begin
     pck:='';
     bot1attack;
     exit;
    end;

//В АТАКУ
  if FromClient and (ConnectName='Blud') and (pck=hstr('1B 04 00 00 00')) then
    begin
     pck:='';
     bot2attack;
     exit;
    end;

//ДА
  if FromClient and (ConnectName='Blud') and (pck=hstr('1B 06 00 00 00')) then
    begin
     pck:='';
     bot3attack;
     exit;
    end;

//КУБИКИ "44" в чат
  if FromClient and (ConnectName='Blud')and (pck[1]=#$38) then
  if (pck[2]=#$34) and (pck[3]=#$00) and (pck[4]=#$34) and (pck[5]=#$00) then
    begin
     pck:='';
      buf:=hstr('2F 32 05 00 00 00 00 00 00 00');
      SendToServerEX('VORON7');
     exit;
    end;

//"55" в чат
  if FromClient and (ConnectName='Blud')and (pck[1]=#$38) then
  if (pck[2]=#$35) and (pck[3]=#$00) and (pck[4]=#$35) and (pck[5]=#$00) then
    begin
     pck:='';
//      buf:=hstr('2F 30 05 00 00 00 00 00 00 00');
//      SendToServerEX('Petr1');
     exit;
    end;

//НЕТ - СТРЕЛЯЕМ
  if FromClient and (ConnectName='Blud') and (pck=hstr('1B 05 00 00 00')) then
    begin
     pck:='';
     AllBotShot;
     exit;
    end;

//"т2" в чат
  if FromClient and (ConnectName='Blud')and (pck[1]=#$38) then
  if (pck[2]=#$42) and (pck[3]=#$04) and (pck[4]=#$32) and (pck[5]=#$00) then
    begin
     pck:='';

     buf:=hstr('45 34 00 00 00 00 00 00 00 00');
     SendToServerEX('VORON7');
     buf:=hstr('45 34 00 00 00 00 00 00 00 00');
     SendToServerEX('crown');
     buf:=hstr('45 34 00 00 00 00 00 00 00 00');
     SendToServerEX('Petr1');

     Rezim:=2;
     exit;
    end;
//если "т3"
  if FromClient and (ConnectName='Blud')and (pck[1]=#$38) then
  if (pck[2]=#$42) and (pck[3]=#$04) and (pck[4]=#$33) and (pck[5]=#$00) then
    begin
     pck:='';

     buf:=hstr('45 34 00 00 00 00 00 00 00 00');
     SendToServerEX('VORON7');
     buf:=hstr('45 34 00 00 00 00 00 00 00 00');
     SendToServerEX('crown');
     buf:=hstr('45 34 00 00 00 00 00 00 00 00');
     SendToServerEX('Petr1');

     Rezim:=3;
     exit;
    end;
//если "т1"
  if FromClient and (ConnectName='Blud')and (pck[1]=#$38) then
  if (pck[2]=#$42) and (pck[3]=#$04) and (pck[4]=#$31) and (pck[5]=#$00) then
    begin
     pck:='';

     buf:=hstr('45 34 00 00 00 00 00 00 00 00');
     SendToServerEX('VORON7');
     buf:=hstr('45 34 00 00 00 00 00 00 00 00');
     SendToServerEX('crown');
     buf:=hstr('45 34 00 00 00 00 00 00 00 00');
     SendToServerEX('Petr1');

     Rezim:=1;
     exit;
    end;

//если "тп"
  if FromClient and (ConnectName='Blud')and (pck[1]=#$38) then
  if (pck[2]=#$42) and (pck[3]=#$04) and (pck[4]=#$3F) and (pck[5]=#$04) then
    begin
     pck:='';
     buf:=hstr('2F EE 04 00 00 00 00 00 00 00');
     SendToServerEX('VORON7');
     buf:=hstr('2F EE 04 00 00 00 00 00 00 00');
     SendToServerEX('crown');
     buf:=hstr('2F EE 04 00 00 00 00 00 00 00');
     SendToServerEX('Petr1');
     if TP=FALSE THEN
                 begin
                 buf:=hstr('4A 54 ED 50 49 02 00 00 00 2D 00 3E 00 50 00 75 00 62 00 6C 00 69 00 63 00 45 00 6E 00 65 00 6D 00 79 00 00 00 54 00 50 00 20 00 4F 00 4E 00 00 00');
                 SendToClientEX('Blud');
                 TP:=TRUE;
                 PvP:='01';
                 EXIT;
                 end;
     if TP=TRUE THEN
                 begin
                 buf:=hstr('4A 54 ED 50 49 02 00 00 00 2D 00 3E 00 50 00 75 00 62 00 6C 00 69 00 63 00 45 00 6E 00 65 00 6D 00 79 00 00 00 54 00 50 00 20 00 4F 00 46 00 46 00 00 00 ');
                 SendToClientEX('Blud');
                 TP:=FALSE;
                 PvP:='00';
                 EXIT;
                 end;

     exit;
    end;
//если "дд" то ассасина..
  if FromClient and (ConnectName='Blud')and (pck[1]=#$38) then
  if (pck[2]=#$34) and (pck[3]=#$04) and (pck[4]=#$34) and (pck[5]=#$04) then
    begin
     pck:='';
     buf:=hstr('2F 44 05 00 00 00 00 00 00 00');
     SendToServerEX('VORON7');
     exit;
    end;



end.
Код:
{#############################################################################
Бот - локомотив от Alexus
версия : 0.3 (бета)
дата: 08.04.08

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

Возможности:
- запоминает центр и радиус кача
- запоминает список мобов на которых надо охотиться!
- запоминает и затем подбирает дроп, упавший с убитых им мобов
- умеет лечиться банками (тип банки легко настраивается), ведется учет количества оставшихся банок
- управляется из окна чата в самом клиенте
- имеет окно для вывода всех параметров и статистики
- если моб по какой-то причине стал недосягаемым (стоит за деревом), то через 1 мин БОТ переключится на другого моба.
- если бот умирает, то не палимся и прекращаем рыпаться...(скоро появиться возможность логаута)
- работает под С4 и С6

Недостатки:   (со временем будет исправлено)
- бот не умеет обходить препядствия
- бот может увязаться за атаковавшим его другим игроком

Инструкция:
1. Запускаем ПакетХак, запускаем игрового клиента
2. Внимательно НАСТРАИВАЕМ параметры в секции настройки, жмем кнопку "Сохранить" и запускаем скрипт.
3. Добираемся до места кача
4. Выбираем в таргет моба на которого хотим охотится и отправляем в общий чат->  1
5. Валим моба. Если все правильно сделали будет выдано сообщение в чате что моб добавлен.
6. Выбираем следующего моба отправляем в общий чат цифру 2, валим его и т.д. можно выбрать до 10 разных тварей.
7. Становимся в центр кача и отправляем в общий чат-> pos , если все правильно то в чате будет выдано сообщение, что координаты заданы.
8. Бежим к краю радиуса кача и отправляем в общий чат-> dist, в чате вылезет сообщение от системы, что радиус задан.
9. Валим как можно больше мобов в округе, становимся примерно в центр и отправляем в общий чат-> start ,
   если все сделано верно, то будет выдано соответствующее сообщение.
10. Если бот поймал моба в таргет и побежал его атаковать, то можно свернуть окно игры
   и смотреть на информационное окно скрипта.
#############################################################################}

const
//################### Сеция настройки бота ############################################
 NickName = 'abc';                 // Твой ник в игре
 Interlude = true;                 // C4 - false, C6 - true;
 HPMedium = 70;                    // Уровень жизни, при котором начинаем глотать банки
 HPBottleID = 1061;                //  ItemID 1060=Lesser Healing Potion;    1061=Healing Potion;   1539=Greater Healing Potion;
 Vertical = 300;                   // Вертикальный радиус кача
 InvRazmer = 99;                   // Размер инвентаря -1 (т.е. если инвентарь 80, то пишем сюда 79)
//############# Секция расширенной настройки для опытных ботоводеров :) ###################################
 TimerCombat_Interval = 1000;      // частота срабатывания таймера атаки в милисекундах, чем меньше это число, тем быстрее бот будет думать.
 TimerPickUp_Interval = 500;       // частота срабатывания таймера сбора дропа, чем меньше это число, тем быстрее бот будет думать.
 TimerForm_Interval = 1000;        // частота срабатывания таймера обновления формы, чем меньше это число, тем быстрее будут обновляться данные в форме.
 DrinkDelay = 14;                  // минимальное время задержки повторного питься бутылки (10 - 20 сек)
 Attack_Time = 60;                 // Время на убивание моба в секундах.
 PickUp_Time = 30;                 // Врямя на поднятие дропа в секундах.
 OblastVidimosti = 1000;           // Приращение к радиусу кача, для мобов которые стоят прямо на границе радиуса (изменять от 100 до 1000)
 maximumItems = 100;               // Размер базы мобов и дропа
//########################################################################################
 NpcTypeID_List_Razmer = 10;       // Размер списка мобов (не трогать!)
 OX = 1; OY = 2; OZ= 3;            //  Служебные константы

var
 InitMode, PickUpMode : boolean;
//-------------------------------------- БД  --------------------------------------------------
 MobsID   : array [1..maximumItems] of integer;
 MobsDist : array [1..maximumItems] of integer;           // Расстояние от центра кача
 MobsXYZ  : array [1..maximumItems, 1..3] of integer;     // Координаты
 MobsAgression : array [1..maximumItems] of boolean;      // Моб атакует меня или стоит в сторонке...
 MobsLastIndex: integer;                                  // индекс последнего элемента базы

 NpcTypeID_List : array [1..NpcTypeID_List_Razmer] of integer;  // Список мобов  (коды мобов)
 NpcTypeID_List_Count : integer;                          // Текущий размер списка
 NpcTypeID_CurrentMob : integer;

 Items_ObjectID : array [1..maximumItems] of integer;     // БД дропа с мобов
 Items_ItemID : array [1..maximumItems] of integer;
 Items_XYZ : array [1..maximumItems, 1..3] of integer;
 ItemsLastIndex: integer;

 Inventory: array[0..InvRazmer, 0..9] of integer;                // инвентарь (itemType1, ObjectID, ItemID, count, itemType2, CustType1, isEquipped, BodyPart, EnchantLevel, CustType2)
 HPBottleObjID, HPBottleCount : integer;                  // ObjID и количество HP-бутылей

 TargetID, LastKilledMobObjID : integer;                  // Текущая цель, последний убитый моб

 MobsKilled : integer;                                    //   счетчик убитых мобов

 Povtor: integer;
 CenterX, CenterY, CenterZ : integer;                     // Центр кача
 Radius: integer;                                         // Радиус кача
//--------------------------------------------------------
 MyX, MyY, MyZ : integer;                                 // Мои статы
 MyID, MyHP, MyMaxHP: integer;
 MyMP, MyMaxMP, MyCP, MyMaxCP: integer;
 HPlevelProcent : integer;                                 // уровень жизни в прочентах
//--------------------------------------------------------
 frm: TForm;                                              // переменные описания формы
 log, MobsDBscreen, ItemsDBScreen: TMemo;
 panel: TPanel;
 frmParamIndex: byte;
 textX, textY, textZ, textMyID, textMyHP, textMyMaxHP: TEdit;
 textMyMP, textMyMaxMP, textMyCP, textMyMaxCP: TEdit;
 textCenterX, textCenterY, textCenterZ, textRadius : TEdit;
 textTargetID, textMobX, textMobY, textMobZ : TEdit;
 textAttackCycle, textMobsKilled: TEdit;
//----------------------------------------------------------
 TimerForm, TimerCombat, TimerPickUp : TTimer;              // таймеры
 time1: integer;
 Calculated_AttackTime, Calculated_PickUpTime : integer;
 AttackCycle: integer;                                      // Цикл атаки
//##############################################################################################

procedure Init; //Вызывается при включении скрипта
 begin
  ClearDB;
  MyID:= 0;        // обнуляем ВСЕ данные
  MyX:= 0;
  MyY:= 0;
  MyZ:= 0;
  MyID:= 0;
  MyHP:= 0;
  MyMaxHP:= 0;
  MyMP:= 0;
  MyMaxMP:= 0;
  MyCP:= 0;
  MyMaxCP:= 0;
  time1:=1;
  Calculated_AttackTime:= round (1000 / TimerCombat_Interval * Attack_Time);
  Calculated_PickUpTime:= round (1000 / TimerPickUp_Interval * PickUp_Time);
  HPlevelProcent:= 0;
  HPBottleObjID:= 0;
  HPBottleCount:= 0;
  InitMode:= true;
  TimerCombat:=TTimer.Create(nil);           // создаем таймеры
  TimerCombat.OnTimer:=@OnTimerCombat;
  TimerCombat.enabled:=false;
  TimerCombat.interval:= TimerCombat_Interval;
  TimerForm:=TTimer.Create(nil);
  TimerForm.OnTimer:=@OnTimerForm;
  TimerForm.enabled:=true;
  TimerForm.interval:= TimerForm_Interval;
  TimerPickUp:=TTimer.Create(nil);
  TimerPickUp.OnTimer:=@OnTimerPickUp;
  TimerPickUp.enabled:=false;
  TimerPickUp.interval:= TimerPickUp_Interval;
  frmParamIndex:=0;                          // создаем контролы в форме
  frm:= TForm.Create(nil);
  frm.Caption:= 'BOT by Alexus ver: 0.3 beta';
  frm.BorderStyle := bsSizeable;
  frm.Position := poScreenCenter;
  frm.Width:=650;
  frm.Height:=700;
  MobsDBscreen:=TMemo.Create(frm);
  MobsDBscreen.parent:=frm;
  MobsDBscreen.ReadOnly:=true;
  MobsDBscreen.ScrollBars:=2;
  MobsDBscreen.Top:=1;
  MobsDBscreen.Width:=460;
  MobsDBscreen.Height:=285;
  MobsDBscreen.Lines.Add('Мобы');
  ItemsDBscreen:=TMemo.Create(frm);
  ItemsDBscreen.parent:=frm;
  ItemsDBscreen.ReadOnly:=true;
  ItemsDBscreen.ScrollBars:=2;
  ItemsDBscreen.Top:=286;
  ItemsDBscreen.Width:=460;
  ItemsDBscreen.Height:=285;
  ItemsDBscreen.Lines.Add('Дроп');
  panel:=TPanel.Create(frm);
  panel.parent:=frm;
  panel.align:=alRight;
  log:=TMemo.Create(panel);
  log.parent:=frm;
  log.align:=alBottom;
  log.ReadOnly:=true;
  log.ScrollBars:=2;
  log.Width:=570;
  log.Height:=100;
  log.Lines.Add('...');
  textMyID:= CreateTextBox('textMyID');
  CreateLabel('Мой ID :');
  textX:= CreateTextBox('textX');
  CreateLabel('Мой X :');
  textY:= CreateTextBox('textY');
  CreateLabel('Мой Y :');
  textZ:= CreateTextBox('textZ');
  CreateLabel('Мой Z :');
  textMyHP:= CreateTextBox('textMyHP');
  CreateLabel('Мой HP :');
  textMyMaxHP:= CreateTextBox('textMyMaxHP');
  CreateLabel('Мой MaxHP :');
  textMyMP:= CreateTextBox('textMyMP');
  CreateLabel('Мой MP :');
  textMyMaxMP:= CreateTextBox('textMyMaxMP');
  CreateLabel('Мой MaxMP :');
  textMyCP:= CreateTextBox('textMyCP');
  CreateLabel('Мой CP :');
  textMyMaxCP:= CreateTextBox('textMyMaxCP');
  CreateLabel('Мой MaxCP :');
  inc(frmParamIndex);
  textCenterX:= CreateTextBox('textCenterX');
  CreateLabel('Ц. кач Х:');
  textCenterY:= CreateTextBox('textCenterY');
  CreateLabel('Ц. кач Y:');
  textCenterZ:= CreateTextBox('textCenterZ');
  CreateLabel('Ц. кач Z:');
  textRadius:= CreateTextBox('Radius');
  CreateLabel('Radius :');
  inc(frmParamIndex);
  textTargetID:= CreateTextBox('TargetID');
  CreateLabel('Цель ID :');
  textAttackCycle:= CreateTextBox('AttackCycle');
  CreateLabel('Цикл атаки:');
  textMobsKilled:= CreateTextBox('MobsKilled');
  CreateLabel('Убито моб:');
  frm.Show;                // выводим форму на экран
  buf:= #$0F;              // принудительно вызываем пакеты инвентаря и userinfo
  SendToServerEx(NickName);
end;

procedure ClearDB;                                          // Очистка БД
 var                                                        // Надо все занулять, иначе там хрень всякая вылезает или старые данные
  i, n: word;
 begin
  MobsLastIndex:= 0;                                              // Очищаем переменные
  ItemsLastIndex:= 0;
  TargetID:= 0;
  LastKilledMobObjID:= 0;
  MobsKilled:= 0;
  Povtor:= 0;
  CenterX:= 0;
  CenterY:= 0;
  CenterZ:= 0;
  Radius:= 0;
  AttackCycle:= 0;
  for i:=1 to NpcTypeID_List_Razmer do NpcTypeID_List[i]:= 0;
  NpcTypeID_List_Count:= 0;
  NpcTypeID_CurrentMob:= 0;
  for i:=1 to maximumItems do                                // Очищаем базу
   begin
    MobsID[i]:= 0;
    MobsDist[i]:= 0;
    MobsXYZ[i, OX]:= 0;
    MobsXYZ[i, OY]:= 0;
    MobsXYZ[i, OZ]:= 0;
    MobsAgression[i]:= false;
    Items_ObjectID[i]:= 0;
    Items_ItemID[i]:= 0;
    Items_XYZ[i, OX]:= 0;
    Items_XYZ[i, OY]:= 0;
    Items_XYZ[i, OZ]:= 0;
   end;
  for i:=0 to InvRazmer do for n:=0 to 9 do Inventory[i, n]:= 0;
 end;

function Wait(var tick: integer;Timewait: Integer): Boolean; // сквозная проверка без остановки скрипта (c)dmitry501, modifed by Sh00rGo
var
  t: integer;
begin
  result:=false;
  t:=Round(Time*86400);
  if t>(tick+Timewait) then begin
    if tick>0 then result:=true;
    tick:=t;
  end;
end;

//############################## Модуль работы с Инвентарем ###########################
procedure InventoryCreate;
var
  i,k, offset : integer;
begin
  if interlude then offset:= 8 else offset:=0;
  for i:=0 to InvRazmer do
    if (i<ReadH(4)) then begin
      Inventory[i,0]:=ReadH(i*(28+offset)+6);  // itemType1
      Inventory[i,1]:=ReadD(i*(28+offset)+8);  // ObjectId
      Inventory[i,2]:=ReadD(i*(28+offset)+12); // ItemID
      Inventory[i,3]:=ReadD(i*(28+offset)+16); // count
      Inventory[i,4]:=ReadH(i*(28+offset)+20); // itemType2
      Inventory[i,5]:=ReadH(i*(28+offset)+22); // CustType1
      Inventory[i,6]:=ReadH(i*(28+offset)+24); // isEquipped
      Inventory[i,7]:=ReadD(i*(28+offset)+26); // BodyPart
      Inventory[i,8]:=ReadH(i*(28+offset)+30); // EnchantLevel
      Inventory[i,9]:=ReadH(i*(28+offset)+32); // CustType2
    end else
      for k:=0 to 9 do Inventory[i,k]:=0; // забиваем нулями
end;

procedure InventoryUpdate;
 var
  i,j,k, offset: integer;
 begin
  if interlude then offset:= 8 else offset:=0;
  for j:=0 to (ReadH(2)-1) do
   begin
    case pck[j*(30+offset)+4] of
     #$01: k:=0; // add item, запишет на пустую ячейку
     #$02: k:=ReadD(j*(30+offset)+8); // mod item
     #$03: begin // remove item, обнулит ячейки удаленного предмета
            k:=ReadD(j*(30+offset)+8);
            for i:=0 to InvRazmer do if (Inventory[i,0]=k) then
             begin
              for k:=0 to 9 do Inventory[i,k]:=0;
              exit;
             end;
           end;
    end;
    for i:=0 to InvRazmer do if (Inventory[i,1]=k) then
     begin
      Inventory[i,0]:=ReadH(j*(30+offset)+6);  // itemType1
      Inventory[i,1]:=ReadD(j*(30+offset)+8);  // ObjectId
      Inventory[i,2]:=ReadD(j*(30+offset)+12); // ItemID
      Inventory[i,3]:=ReadD(j*(30+offset)+16); // count
      Inventory[i,4]:=ReadH(j*(30+offset)+20); // itemType2
      Inventory[i,5]:=ReadH(j*(30+offset)+22); // CustType1
      Inventory[i,6]:=ReadH(j*(30+offset)+24); // isEquipped
      Inventory[i,7]:=ReadD(j*(30+offset)+26); // BodyPart
      Inventory[i,8]:=ReadH(j*(30+offset)+30); // EnchantLevel
      Inventory[i,9]:=ReadH(j*(30+offset)+32); // CustType2
      break;
     end;
   end;
 end;

function GetInv(obj,up,down:integer): integer; // up и down не проверяются
   var // 0-itemType1, 1-ObjectId, 2-ItemID, 3-count, 4-itemType2, 5-CustType1, 6-isEquipped, 7-BodyPart, 8-EnchantLevel, 9-CustType2
    i: integer;
 begin
  for i:=0 to InvRazmer do if (Inventory[i,up]=obj) then
   begin
    Result:=Inventory[i,down];
    exit;
   end;
  Result:=-1;
end;

{procedure UseItemID(ItemID:integer);       //Использовать предмет с заданным ItemID
 var
  ObjItemID : integer;
 begin
  ObjItemID:= GetInv(ItemID,2,1);
  if ObjItemID = -1 then exit;
  buf:=#$14;
  WriteD(ObjItemID);
  WriteD(0);
  SendToServerEx(NickName);;
 end;}

procedure UseItemObjID(ItemObjID:integer);       //Использовать предмет с заданным ItemID
 begin
  buf:=#$14;
  WriteD(ItemObjID);
  WriteD(0);
  SendToServerEx(NickName);;
 end;
//############################################################################################

function rastoyanie(NpcX, NpcY, NpcZ : integer) : integer; // вычисление растояния между 2 точками
 var
  dx,dy,dz, summa : integer;
 begin
  dx:= NpcX-CenterX;
  dy:= NpcY-CenterY;
  dz:= NpcZ-CenterZ;
  summa:= dx*dx+dy*dy;                                            // мне кажется, что так будет быстрее считаться
  if summa = 0 then result:= 0 else result:= Round(sqrt(summa));  // обход возможной ошибки, если моб стоит прямо в центре кача
  if abs(dz) > vertical then result := result + 5000;             // добавляем коррекцию по вертикали
end;

procedure AddDroppedItem (ObjID, ItemID, X, Y, Z: integer);       // Процедура добавляет дропнутую вещь в БД
 begin
  inc (ItemsLastIndex);
  if ItemsLastIndex > maximumItems then exit;
  Items_ObjectID[ItemsLastIndex]:= ObjID;
  Items_ItemID[ItemsLastIndex]:= ItemID;
  Items_XYZ[ItemsLastIndex, OX]:= X;
  Items_XYZ[ItemsLastIndex, OY]:= Y;
  Items_XYZ[ItemsLastIndex, OZ]:= Z;
  log.Lines.Add('Вещь добавлена, индекс в БД: '+ inttostr(ItemsLastIndex));
 end;

procedure AddtoDB (id, x,y,z : integer; agression : boolean);     // Процедура добавляет в БД нового моба
 var
  i:integer;
  dist: integer;
 begin
  dist:= rastoyanie (x,y,z);                                       // вычиляем расстояние от центра кача до моба
  if dist > (Radius + OblastVidimosti) then exit;                  // если моб слишко далеко то ничего не делаем
  inc (MobsLastIndex);                                             // увеличиваем размер БД
  log.Lines.Add('Моб добавлен, индекс в БД: '+ inttostr(i));
  if agression then log.Lines.Add('На нас напала какая-то вражина.');
  MobsID[MobsLastIndex]:= id;                                                  // Записываем моба
  MobsDist[MobsLastIndex]:= dist;
  MobsXYZ[MobsLastIndex, OX]:= x;
  MobsXYZ[MobsLastIndex, OY]:= y;
  MobsXYZ[MobsLastIndex, OZ]:= z;
  MobsAgression[MobsLastIndex]:= agression;
 end;

procedure UpdateDB (i:integer; id, x,y,z : integer; agression : boolean);   // Процедура обновляет данные в БД по мобу
 var
  dist: integer;
 begin
  if (MOBSXYZ[i, OX] = x) and (MOBSXYZ[i, OY] = y) and (MobsAgression[i] = agression) then exit;  // проверяем, а надо ли чего нить менят
  dist:= rastoyanie (x,y,z);
  if dist > (Radius + OblastVidimosti) then DelDBItem(i) else          // перепроверяем расстояние до моба, если он вышел за границу кача, то удаляем его
   begin
    log.Lines.Add('Моб обновлен, индекс в БД: '+ inttostr(i));
    if agression then log.Lines.Add('На нас напала какая-то вражина.');
    MobsDist[i]:= dist;                                    // записываем данные
    MobsXYZ[i, OX]:= x;
    MobsXYZ[i, OY]:= y;
    MobsXYZ[i, OZ]:= z;
    MobsAgression[i]:= agression;
   end;
 end;

procedure DelDBItem (i: integer);                              // процедура удалаяет моба из БД
 var
  n: integer;
 begin
  log.Lines.Add('Моб удален, индекс в БД: '+ inttostr(i));
  MobsID[i]:= 0;
  MobsDist[i]:= 0;
  MobsXYZ[i, OX]:= 0;
  MobsXYZ[i, OY]:= 0;
  MobsXYZ[i, OZ]:= 0;
  MobsAgression[i]:= false;
  if i < MobsLastIndex then for n:= i+1 to MobsLastIndex do       // если надо, производим циклический сдвиг данных в массивах
   begin
    MobsID[n-1]:= MobsID[n];
    MobsDist[n-1]:= MobsDist[n];
    MobsXYZ[n-1, OX]:= MobsXYZ[n, OX];
    MobsXYZ[n-1, OY]:= MobsXYZ[n, OY];
    MobsXYZ[n-1, OZ]:= MobsXYZ[n, OZ];
    MobsAgression[n-1]:= MobsAgression[n];
   end;
  dec (MobsLastIndex);                                        // уменьшаем размер БД
 end;

procedure DelDroppedItem (i: integer);                         // процедура удалаяет вещь из БД
 var
  n: integer;
 begin
  Items_ObjectID[i]:= 0;
  Items_ItemID[i]:= 0;
  Items_XYZ[i, OX]:= 0;
  Items_XYZ[i, OY]:= 0;
  Items_XYZ[i, OZ]:= 0;
  log.Lines.Add('Вещь удалена, индекс в БД: '+ inttostr(i));
  if i < ItemsLastIndex then for n:= i+1 to ItemsLastIndex do
   begin
    Items_ObjectID[n-1]:= Items_ObjectID[n];
    Items_ItemID[n-1] :=  Items_ItemID[n];
    Items_XYZ[n-1, OX]:=  Items_XYZ[n, OX];
    Items_XYZ[n-1, OY]:=  Items_XYZ[n, OY];
    Items_XYZ[n-1, OZ]:=  Items_XYZ[n, OZ];
   end;
  dec (ItemsLastIndex);
 end;

function CheckItems (id: integer) : integer;                   // функция проверяет наличие заданной вещи в БД
 var
  i: integer;
 begin
  result:= 0;
  for i:=1 to ItemsLastIndex do if Items_ObjectID[i] = id then
   begin
    result:=i;                                                  // И возвращаем его индекс по БД
    break;
   end;
 end;

function TestPovtor (id: integer) : integer;                   // функция проверяет наличие заданного моба в БД
 var
  i: integer;
 begin
  result:=0;
  for i:=1 to MobsLastIndex do if MobsID[i] = id then               // Ищем нужный ID в нашей БД
   begin
    result:=i;                                                  // И возвращаем его индекс по БД
    break;
   end;
 end;

function InMobsList (NpcTypeID: integer) : boolean;            // функция проверяет наличие заданного моба в списке на атаку
 var
  i: integer;
 begin
  result:= false;
  for i:=1 to NpcTypeID_List_Count do if NpcTypeID_List[i] = NpcTypeID then result:= true;     // проверяем по списку
 end;

procedure SendMsg(msg:string);                                  // отправка системных сообщений клиенту
begin
  buf:=#$4A;
  WriteD(0);
  WriteD(10);
  WriteS('');
  WriteS(msg);
  SendToClientEx(NickName);
end;

function ValidateData : boolean;                                // функция проверки правильности задания всех параметров для начала кача
 begin
  if (MyX <> 0) and (MyY <> 0) and (MyZ <> 0) and (MyID <> 0) and (MyHP > 0) and (MyMaxHP > 0) and         // верификация всех данных, чтобы потом в боевом режиме
     (MyMP > 0) and (MyMaxMP > 0) and {(MyCP <> 0) and (MyMaxCP <> 0) and }                                 // не перепроверять все данные по 100 раз
     (CenterX <> 0) and (CenterY <> 0) and (CenterZ <> 0) and (Radius > 0) and (NpcTypeID_List_Count > 0) then
      begin
       SendMsg('Все начальные параметры заданы и проверены!');
       log.Lines.Add('Все начальные параметры заданы и проверены!');
       result:= true;
      end
     else
      begin
       SendMsg('Ошибка задания начальных параметров!');
       log.Lines.Add('Ошибка задания начальных параметров!');
       result:= false;
      end;
 end;

procedure UserCommandsInitMode;    // комманды пользователя для режима настройки бота
 begin                              // если комманда обработана удачно, то в чат сообщение не попадет, а будет выдано системное сообщение прямо в клиент
  case (ReadS(2)) of
   'pos' :   if MyX <> 0 then                        // центр кача
              begin
               CenterX:= MyX;
               CenterY:= MyY;
               CenterZ:= MyZ;
               SendMsg('Центр кача задан успешно!');
               log.Lines.Add('Центр кача задан успешно!');
               pck:='';
              end;
   'dist' :  if (CenterX <> 0) and (MyX <> 0) then                // радиус кача
              begin
               Radius:= rastoyanie (MyX,MyY,MyZ);
               SendMsg('Радиус кача задан успешно');
               SendMsg('R= '+ inttostr(Radius));
               log.Lines.Add('Радиус кача задан успешно, R = '+ inttostr(Radius));
               pck:='';
              end;
   'reset':  begin                                                // сброс параметров
              ClearDB;
              SendMsg('БД очищена, введите заново все параметры');
              log.Lines.Add('БД очищена!');
              pck:='';
             end;
   '1', '2', '3', '4', '5', '6', '7', '8', '9', '10' :            // задаем мобов
              begin
               if (NpcTypeID_List_Count+1) <> strtoint(ReadS(2)) then
                begin
                 SendMsg('Добавлять мобов можно тока по очереди 1, 2, 3...');
                 pck:='';
                 exit;
                end;
               NpcTypeID_CurrentMob:= strtoint(ReadS(2));
               SendMsg('Добавляем моба № '+ ReadS(2));
               pck:='';
              end;
   'start':   begin                                               // собственно запуск бота
               if ValidateData and InitMode then
                begin
                 SendMsg('ЗАПУСКАЕМ ИСУСТВЕННЫЙ ИНТЕЛЛЕКТ!');
                 log.Lines.Add('ЗАПУСКАЕМ ИСУСТВЕННЫЙ ИНТЕЛЛЕКТ!');
                 TargetID:=0;
                 InitMode:= false;
                 TimerCombat.enabled:=true;                      // запускаем таймер
                end
                else
                 begin
                  SendMsg('Еще не все параметры заданы. Проверьте параметры...');
                  log.Lines.Add('Еще не все параметры заданы. Проверьте параметры...');
                 end;
               pck:='';
              end;
  end;
 end;

procedure UserCommandsCombatMode;     // комманды пользователя для боевого режима
 begin                                // команды говорят сами за себя)
  case (ReadS(2)) of
   'pause' : begin
              TimerCombat.enabled:= not(TimerCombat.enabled);
              pck:='';
              if TimerCombat.enabled then
               begin
                SendMsg('Искуственный интелект запущен!');
                log.Lines.Add('Искуственный интелект запущен!');
               end
               else
                begin
                 SendMsg('Искуственный интелект приостановлен.');
                 log.Lines.Add('Искуственный интелект приостановлен.');
                end
             end;
   'stop'  : begin
              pck:='';
              SendMsg('Искуственный интелект остановлен.');
              log.Lines.Add('Искуственный интелект остановлен.');
              StopGame;
             end;

  end;
 end;

procedure StopGame;                     // остановка кача
 begin
  TimerCombat.enabled:= false;
//  InitMode:= true;
  TimerPickUp.enabled:=false;
  TargetID:= 0;
  ClearDB;
 end;

function GetMinDistID : integer;     // функция поиска ближайшего моба в БД
 var
  i, dist : integer;
 begin
  dist:=10000;                       // задаем заранее нереальную дистанцию
  for i:=1 to MobsLastIndex do if (MobsID[i] <> 0) and (MobsDist[i] < dist) then
   begin                            // фишка в том, что в базе хранятся расстояния не до меня, а до центра кача
    dist:= MobsDist[i];             // но в катах то расстояния небольшие
    result:= i;                      // если нашли хоть одного моба или несколько возращаем его индекс ближайшего к центру кача
   end;
  if dist = 10000 then result:= 0;   // иначе возвращаем 0 (ничего не найдено)
 end;

function AgroTest : integer;        // функция проверяет, атакует ли меня кто-нибудь или нет
 var
  i: integer;
 begin
  result:=0;
  for i:=1 to MobsLastIndex do if MobsAgression[i] then  // ищем первого попавшегося моба, который нас атакует
   begin
    result:= i;                                      // возвращаем его индекс по БД
    break;
   end;
 end;

procedure PhisicalAttack;          // команда атаки
 begin
 buf:=#$04; //action
  WriteD(TargetID);
  WriteD(MyX);
  WriteD(MyY);
  WriteD(MyZ);
  WriteC(0);
  SendToServerEx(NickName);
 end;

procedure InitPickUpMode(mode: boolean);
begin
 if mode then
  begin
   PickUpMode:= true;
   TimerCombat.enabled:= false;
   TimerPickUp.enabled:= true;
  end
 else
  begin
   PickUpMode:= false;
   TimerCombat.enabled:= true;
   TimerPickUp.enabled:= false;
  end;
end;

procedure OnTimerPickUp (Sender: TObject);         // таймер поднятия дропа
 var
  povtor: integer;
 begin
  if (AgroTest > 0) and (TargetID = 0) then
   begin
    InitPickUpMode(false);
    exit;
   end;
  if (ItemsLastIndex > 0) and (TargetID = 0) then
   begin
    TargetID:= Items_ObjectID[ItemsLastIndex];
    AttackCycle:= 0;
    PhisicalAttack;
    exit;
   end;
  if (ItemsLastIndex > 0) and (TargetID > 0) then
   begin
    inc (AttackCycle);
    if ((AttackCycle mod 5) = 0) then PhisicalAttack;
    if AttackCycle > Calculated_PickUpTime then
     begin
      Povtor:= CheckItems(TargetID);
      if Povtor <> 0 then DelDroppedItem(Povtor);
      TargetID:= 0;
     end;
    exit;
   end;
  if (ItemsLastIndex = 0) then InitPickUpMode(false);
 end;

procedure OnTimerCombat (Sender: TObject);         // боевой таймер, вся логика поведения бота находится именно здесь!!!
 var
  Agro, MinDistID: integer;
 begin
  if MobsLastIndex = 0 then    // если нет мобов в базе, то
   begin
    if ItemsLastIndex > 0 then InitPickUpMode(true);   // надо дроп подбирать
    exit;                     // выходим от сюда
   end;
  if TargetID > 0 then           // если в прицеле есть моб, то
   begin                                  // валим вражину
    if ((AttackCycle mod 5) = 0) then PhisicalAttack;
    inc(AttackCycle);
    if AttackCycle > Calculated_AttackTime then              // если валим моба больше минуты, значит это баг...
     begin
      Povtor:= TestPovtor(TargetID);
      if Povtor <> 0 then DelDBItem(Povtor);
      TargetID:= 0;
     end;
    exit;
   end;
  Agro:= AgroTest;                            // если есть мобы в базе и нет текущей цели, то
  MinDistID:= GetMinDistID;                   // запускаем алгоритм выбора цели
  if Agro > 0 then                            // если нас кто-то атакует, то его и выбираем
   begin
    TargetID:= MobsID[Agro];
    PhisicalAttack;                            // берем вражину в таргет
    AttackCycle:= 0;
    exit;
   end;
  if ItemsLastIndex > 0 then  // если чего-то валяется на земле, то
   begin
    InitPickUpMode(true);   // надо дроп подбирать
    exit;
   end;
  if MobsDist[MinDistID] <= Radius then      // иначе ищем ближайшего   #################################################
   begin
    TargetID:= MobsID[MinDistID];
    PhisicalAttack;                           // берем вражину в таргет
    AttackCycle:= 0;
    exit;
   end
 end;

procedure OnTimerForm (Sender: TObject);           // таймер обновления данных в форме
 var
  i: integer;
 begin
  textMyID.text:= inttostr(MyID);                      // обновляем данные в окне
  textX.text:= inttostr(MyX);
  textY.text:= inttostr(MyY);
  textZ.text:= inttostr(MyZ);
  textMyHP.text:= inttostr(MyHP);
  textMyMaxHP.text:= inttostr(MyMaxHP);
  textMyMP.text:= inttostr(MyMP);
  textMyMaxMP.text:= inttostr(MyMaxMP);
  textMyCP.text:= inttostr(MyCP);
  textMyMaxCP.text:= inttostr(MyMaxCP);
  textCenterX.text:= inttostr(CenterX);
  textCenterY.text:= inttostr(CenterY);
  textCenterZ.text:= inttostr(CenterZ);
  textRadius.text:= inttostr(Radius);
  textTargetID.text:= inttostr(TargetID);
  textAttackCycle.text:= inttostr(AttackCycle);
  textMobsKilled.text:= inttostr(MobsKilled);
  MobsDBscreen.lines.Clear;
  for i:=1 to MobsLastIndex do     // выводим БД мобов
   begin
    if TargetID = MobsID[i] then  MobsDBscreen.lines.add ('-> '+inttostr(i)+' МобID: '+inttostr(MobsID[i])+' дистанция '+inttostr(MobsDist[i]))
    else if MobsAgression[i] then MobsDBscreen.lines.add ('<- '+inttostr(i)+' МобID: '+inttostr(MobsID[i])+' дистанция '+inttostr(MobsDist[i]))
    else MobsDBscreen.lines.add ('-- '+inttostr(i)+' МобID: '+inttostr(MobsID[i])+' дистанция '+inttostr(MobsDist[i]));
   end;
  ItemsDBscreen.lines.Clear;       // выводим БД дропа
  for i:=1 to ItemsLastIndex do ItemsDBscreen.lines.add ('индекс в БД: '+inttostr(i)+'   объект ID: '+inttostr(Items_ObjectID[i])+'   ID вещи: '+inttostr(Items_ItemID[i]));
 end;

procedure CreateLabel (text: string);             // процедура автоматизирует создание текстовых меток в форме
 var
  l: TLabel;
 begin
  l:= TLabel.Create(panel);
  l.caption:=text;
  l.parent:=panel;
  l.left:=5;
  l.top:=15+20*frmParamIndex;
  inc(frmParamIndex);
 end;

function CreateTextBox (text:string) :TEdit;        // функция автоматизирует создание текстовых полей для вывода данных в форме
 var
  e: TEdit;
 begin
  e:= TEdit.Create(panel);
  e.text:=text;
  e.parent:=panel;
  e.left:=60;
  e.top:=10+20*frmParamIndex;
  result:= e;
 end;

procedure Free; //Вызывается при выключении скрипта
begin
 MobsDBscreen.free;
 ItemsDBscreen.free;
 log.free;
 frm.free;
 ClearDB;
 TimerForm.free;
 TimerCombat.free;
 TimerPickUp.free;
end;

procedure UserInfo;            // обновление донных о себе
 var
  i:word;
 begin
  if InitMode then MyID:=ReadD(18);
  MyX:=ReadD(2);
  MyY:=ReadD(6);
  MyZ:=ReadD(10);
  i:=22;
  ReadS(i);
  if interlude then i:=i+48 else i:=i+44;
  MyMaxHP:=ReadD(i);
  MyHP:=ReadD(i);
  MyMaxMP:=ReadD(i);        // чисто информативно
  MyMP:=ReadD(i);
//  i:=i+363;               пока не используется
//  MyMaxCP:=ReadD(i);
//  MyCP:=ReadD(i);
 end;

procedure StatusUpdate;       // обновление данных о себе
 var
  i:integer;
 begin
  for i:=0 to ReadD(6)-1 do
   case pck[i*8+10] of
    #$09: MyHP:=ReadD(i*8+14);
    #$0A: MyMaxHP:=ReadD(i*8+14);
    #$0B: MyMP:=ReadD(i*8+14);
    #$0C: MyMaxMP:=ReadD(i*8+14);
//    #$21: MyCP:=ReadD(i*8+14);          пока не используется
//    #$22: MyMaxCP:=ReadD(i*8+14);
   end;
  if MyMaxHP > 0 then HPlevelProcent:= Round((MyMaxHP/100)*HPMedium);
 end;

procedure DrinkBottle;          // пьем бутылки и следим за их количеством
 begin
  if HPBottleCount > 0 then
   begin
    UseItemObjID(HPBottleObjID);
    dec (HPBottleCount);
   end;
 end;

begin
 if pck = '' then exit;
 if (ConnectName = NickName) and FromServer and (not InitMode) then  // разбор пакетов от сервера в Боевом режиме
   case pck[1] of
    #$01: begin                             //   MoveToLocation:h(ObjectID)d(CurX)d(CurY)d(CurZ)d(DestX)d(DestY)d(DestZ)
           povtor:= TestPovtor(ReadD(2));
           if Povtor > 0 then
            begin
             updateDB(Povtor, ReadD(2), ReadD(18), ReadD(22), ReadD(26), false);
            end;
          end;
//    #$03: ;                             //   CharInfo:d(X)d(Y)d(Z)-(4)h(ObjectID)s(Name)d(Race)d(Sex)d(ClassID)-(4)i(Head)i(RHand)i(LHand)i(Gloves)i(Chest)i(Legs)i(Feet)i(Back)i(LRHand)i(Hair)d(PvPFlag)d(Carma)d(MSpeed)d(PSpeed)d(PvpFlag)d(Karma)d(RunSpeed)d(WalkSpeed)d(SwimRunSpeed)d(SwimWalkSpeed)d(FlRunSpeed)d(FlWalkSpeed)d(FlyRunSpeed)d(FlyWalkSpeed)f(MovementSpeedMultiplier)f(AttackSpeedMultiplier)f(CollisionRadius)f(CollisionHeight)d(HairStyle)d(HairColor)d(Face)d(AccessLevel)s(Title)d(ClanId)d(ClanCrestId)d(AllyId)d(AllyCrestId)d(SiegeFlags)b(Sitting)b(Running)b(InCombat)b(AlikeDead)b(Invisible)b(MountType)b(PrivateStoreType)
    #$04: if ReadS(22) = NickName then    //   UserInfo:d(X)d(Y)d(Z)d(Heading)h(ObjectID)s(Name)d(Race)d(Sex)d(ClassID)d(Level)d(Exp)d(STR)d(DEX)d(CON)d(INT)d(WIT)d(MEN)d(MaxHP)d(CurrentHP)d(MaxMP)d(CurrentMP)d(SP)d(CurrentLoad)d(MaxLoad)d(Unknown)d(Under)d(REar)d(LEar)d(Neck)d(RFinger)d(LFinger)d(Head)d(RHand)d(LHand)d(Gloves)d(Chest)d(Legs)d(Feet)d(Back)d(LRHand)d(Hair)i(Under)i(REar)i(LEar)i(Neck)i(RFinger)i(LFinger)i(Head)i(RHand)i(LHand)i(Gloves)i(Chest)i(Legs)i(Feet)i(Back)i(LRHand)i(Hair)d(PAtk)d(PAtkSpd)d(PDef)d(EvasionRate)d(Accuracy)d(CritikalHit)d(MAtk)d(MAtkSpd)d(PAtkSpd)d(MDef)d(PvpFlag)d(Karma)d(RunSpeed)d(WalkSpeed)d(SwimRunSpeed)d(SwimWalkSpeed)d(FlRunSpeed)d(FlWalkSpeed)d(FlyRunSpeed)d(FlyWalkSpeed)f(MovementSpeedMultiplier)f(AttackSpeedMultiplier)f(CollisionRadius)f(CollisionHeight)d(HairStyle)d(HairColor)d(Face)d(AccessLevel)s(Title)d(ClanId)d(ClanCrestId)d(AllyId)d(AllyCrestId)d(IsClanLeader)b(MountType)b(PrivateStoreType)b(DwarvenCraft)d(PkKills)d(PvpKills)b(Cubics)b(Cubics)b(FindPartyMembers)d(AbnormalEffect)b()d(ClanPrivileges)d()d()d()d()d()d()d()b(RecomLeft)b()b(RecomHave)b()
           begin
            UserInfo;
            if MyHP = 0 then             // Проверка не убили ли нас...
             begin
              SendMsg('Нас убили...');
              log.Lines.Add('Нас убили...');
              StopGame;
             end;
           end;
    #$05{, #$48}: begin                     //   05= Attack:d(AttackerID)d(TargetID)d(Damage)b(Flags)d(X)d(Y)d(Z)h(Hits)
           if ReadD(6) = MyID then
            begin
             Povtor:= TestPovtor(ReadD(2));//   48= MagicSkillUse
             if Povtor = 0 then AddtoDB (ReadD(2), ReadD(15), ReadD(19), ReadD(23), true)
                           else UpdateDB(Povtor, ReadD(2), ReadD(15), ReadD(19), ReadD(23), true);
            end;
          end;
    #$06: begin                             //   Die:d(ChaID)
           povtor:= TestPovtor(ReadD(2));
           if Povtor > 0 then
            begin
             if MobsID[povtor] = TargetID then
              begin
               LastKilledMobObjID:=TargetID;
               inc (MobsKilled);               // подводим статистику
               TargetID:= 0;
               // споил надо делать тута
              end;
             DelDBItem(povtor);
            end;
          end;
    #$0C: if LastKilledMobObjID = ReadD(2) then         //   DropItem:h(PlayerID)h(ObjectID)i(ItemID)d(X)d(Y)d(Z)d(Stackable)d(Count)
           begin
            AddDroppedItem(ReadD(6), ReadD(10), ReadD(14), ReadD(18), ReadD(22));
           end;
    #$0D: if TargetID = ReadD(6) then                                              //   GetItem:d(PlayerID)h(ObjectID)d(X)d(Y)d(Z)
           begin
            TargetID:= 0;
           end;
    #$0E: if MyID=ReadD(2) then     //   StatusUpdate:h(ObjectID)d(Attributes)
           begin
            StatusUpdate;
            if (MyHP > 0) and (MyHP < HPlevelProcent) then if Wait(time1,DrinkDelay) then DrinkBottle;     // пьем бутылки
            if MyHP > HPlevelProcent then time1:=1;
            if MyHP = 0 then                                  // Проверка не убили ли нас...
             begin
              SendMsg('Нас убили...');
              log.Lines.Add('Нас убили...');
              StopGame;
             end;
           end;
    #$12: begin                                         //   DeleteObject:h(ObjectID)
           if LastKilledMobObjID = ReadD(2) then LastKilledMobObjID:= 0
            else begin
             Povtor:= CheckItems(ReadD(2));
             if Povtor <> 0 then DelDroppedItem(Povtor);
            end;
          end;
    #$16: begin                         //   NpcInfo:h(ObjectID)d(NpcTypeID)d(IsAttackable)d(X)d(Y)d(Z)d(Heading)d(Unknown)d(MAtkSpd)d(PAtkSpd)d(RunSpd)d(WalkSpd)d(SwimRunSpd)d(SwimWalkSpd)d(FlRunSpd)d(FlWalkSpd)d(FlyRunSpd)d(FlyWalkSpd)f(ProperMultiplier)f(PAtkSpd)f(CollisionRadius)f(CollisionHeight)d(RHand)d(Unknown)d(LHand)b(Unknown)b(IsRunning)b(IsInCombat)b(IsALikeDead)b(IsSummoned)s(Name)s(Title)
           if InMobsList(ReadD(6)) and (ReadD(10)=1) and (pck[121]=#$00) then
            begin
             Povtor:= TestPovtor(ReadD(2));
             if Povtor = 0 then AddtoDB (ReadD(2), ReadD(14), ReadD(18), ReadD(22), false)
                           else UpdateDB(Povtor, ReadD(2), ReadD(14), ReadD(18), ReadD(22), false);
           end;
          end;
   end;

 if (ConnectName = NickName) and FromClient and (not InitMode) then   // разбор пакетов от клиента в боевом режиме
   case pck[1] of
//   #$04: {TargetID:= ReadD(2)};          //  Action:h(ObjectID)d(OriginX)d(OriginY)d(OriginZ)b(ActionID)
   #$38: UserCommandsCombatMode;         //  Say2:s(Text)d(Type)s(Target)
   #$48: begin                           //  ValidatePosition:d(X)d(Y)d(Z)d(Heading)d(Data)
           MyX:= ReadD(2);
           MyY:= ReadD(6);
           MyZ:= ReadD(10);
          end;
   end;

 if (ConnectName = NickName) and FromServer and InitMode then   // разбор пакетов от сервера в режиме настройки бота
   case pck[1] of
    #$04: if ReadS(22) = NickName then UserInfo; //   UserInfo:d(X)d(Y)d(Z)d(Heading)h(ObjectID)s(Name)d(Race)d(Sex)d(ClassID)d(Level)d(Exp)d(STR)d(DEX)d(CON)d(INT)d(WIT)d(MEN)d(MaxHP)d(CurrentHP)d(MaxMP)d(CurrentMP)d(SP)d(CurrentLoad)d(MaxLoad)d(Unknown)d(Under)d(REar)d(LEar)d(Neck)d(RFinger)d(LFinger)d(Head)d(RHand)d(LHand)d(Gloves)d(Chest)d(Legs)d(Feet)d(Back)d(LRHand)d(Hair)i(Under)i(REar)i(LEar)i(Neck)i(RFinger)i(LFinger)i(Head)i(RHand)i(LHand)i(Gloves)i(Chest)i(Legs)i(Feet)i(Back)i(LRHand)i(Hair)d(PAtk)d(PAtkSpd)d(PDef)d(EvasionRate)d(Accuracy)d(CritikalHit)d(MAtk)d(MAtkSpd)d(PAtkSpd)d(MDef)d(PvpFlag)d(Karma)d(RunSpeed)d(WalkSpeed)d(SwimRunSpeed)d(SwimWalkSpeed)d(FlRunSpeed)d(FlWalkSpeed)d(FlyRunSpeed)d(FlyWalkSpeed)f(MovementSpeedMultiplier)f(AttackSpeedMultiplier)f(CollisionRadius)f(CollisionHeight)d(HairStyle)d(HairColor)d(Face)d(AccessLevel)s(Title)d(ClanId)d(ClanCrestId)d(AllyId)d(AllyCrestId)d(IsClanLeader)b(MountType)b(PrivateStoreType)b(DwarvenCraft)d(PkKills)d(PvpKills)b(Cubics)b(Cubics)b(FindPartyMembers)d(AbnormalEffect)b()d(ClanPrivileges)d()d()d()d()d()d()d()b(RecomLeft)b()b(RecomHave)b()
    #$06: if (ReadD(2) = TargetID) and (NpcTypeID_CurrentMob <> 0) then                              //   Die:d(ChaID)
           if (NpcTypeID_List[NpcTypeID_CurrentMob] <> 0) then
            begin
             SendMsg('Моб №' + inttostr(NpcTypeID_CurrentMob) + ' добавлен в базу');
             log.Lines.Add('Моб №' + inttostr(NpcTypeID_CurrentMob) + ' добавлен в базу');
             inc(NpcTypeID_List_Count);
             NpcTypeID_CurrentMob:= 0;
             TargetID:= 0;
            end;
    #$16: if (ReadD(2) = TargetID) and (NpcTypeID_CurrentMob <> 0) then NpcTypeID_List[NpcTypeID_CurrentMob]:= ReadD(6);//NpcInfo:h(ObjectID)d(NpcTypeID)d(IsAttackable)d(X)d(Y)d(Z)d(Heading)d(Unknown)d(MAtkSpd)d(PAtkSpd)d(RunSpd)d(WalkSpd)d(SwimRunSpd)d(SwimWalkSpd)d(FlRunSpd)d(FlWalkSpd)d(FlyRunSpd)d(FlyWalkSpd)f(ProperMultiplier)f(PAtkSpd)f(CollisionRadius)f(CollisionHeight)d(RHand)d(Unknown)d(LHand)b(Unknown)b(IsRunning)b(IsInCombat)b(IsALikeDead)b(IsSummoned)s(Name)s(Title)
    #$1B: begin
           InventoryCreate;  // Инвентарь
           HPBottleObjID:= getinv(HPBottleID, 2,1);
           HPBottleCount:= getinv(HPBottleID, 2,3);
          end;
    #$27: begin
           InventoryUpdate;
           HPBottleCount:= getinv(HPBottleID, 2,3);
          end;
   end;

 if (ConnectName = NickName) and FromClient and InitMode then      // разбор пакетов от клиента в режиме настройки бота
   case pck[1] of
    #$04: TargetID:= ReadD(2);       //  Action:h(ObjectID)d(OriginX)d(OriginY)d(OriginZ)b(ActionID)
    #$38: UserCommandsInitMode;      //  Say2:s(Text)d(Type)s(Target)
    #$48: begin                      //  ValidatePosition:d(X)d(Y)d(Z)d(Heading)d(Data)
           MyX:= ReadD(2);
           MyY:= ReadD(6);
           MyZ:= ReadD(10);
          end;
   end;

end.

Код:
{БОТ - Воин помошник от Alexus
версия: 0.3 (бета)
дата: 08.04.08

Описание:
Универсальный скрипт для война - помошника в каче.
Помошник бегает за вами куда бы вы не пошли и атакует ваши цели по ассисту,
как только вы сами начнете атаку (двойным кликом мыши по цели).
Либо может быть вагончиком в паровозе ботов и бегать за Локомотивом

Возможности:
1. Может бегать и за живим игроком и за ботом - локомотивом (от Alexus)
1. Бегает за Вами, не отлипает.
2. Помогает бить врагов.
3. Умеет лечиться (тип банки легко настраивается).
4. Скрипту неважно, находятся ли персы в пати или нет.
5. Работает на С4 и С6 серверах.

Инструкция:
1. Запускаем ПакетХак.
2. Если используем совместно с ботом - Локомотивом (от Alexus), то в "Списке скриптов" ставим этот скрипт ниже локомотива.
2. Запускаем оба клиента игры.
3. Задаем (ниже) реальные имена командира и помошника.
4. Внимательно настраиваем остальные константы в Секции настройки.
5. Запускаем скрипт.
}
//######################## Секция настройки ######################################################
const
 interlude = true;   // C6 - true,  C4 - false;
 CommanderName = 'abc';           // Ник командира
 AssistantName = 'def';           // Ник помошника
 CommanderBot = true;             // Командир - это "бот - Локомотив", или человек?
 HPMedium = 70;                   // % с которого начинаем лечиться банками
 HPBottleID = 1061;               //  ItemID 1060=Lesser Healing Potion;    1061=Healing Potion;   1539=Greater Healing Potion;
 DrinkDelay = 14;                 // минимальное время задержки повторного питься бутылки (10 - 20 сек)
 InvRazmer = 99;                  // Размер инвенторя у ассистента -1 (если инвентарь 80, то писать надо 79, если 100, то писать 99)
//#################################################################################################

var
 CommanderX, CommanderY, CommanderZ : integer;            // Мои статы
 CommanderID, CommanderHP, CommanderMaxHP: integer;

 AssistX, AssistY, AssistZ : integer;                     // Статы помошника
 AssistID, AssistHP, AssistMaxHP: integer;
 AssistMP, AssistMaxMP : integer;
 AssistHPlevelProcent : integer;

 TargetID : integer;
 time1: integer;
 Inventory: array[0..InvRazmer, 0..9] of integer;  // инвентарь (itemType1, ObjectID, ItemID, count, itemType2, CustType1, isEquipped, BodyPart, EnchantLevel, CustType2)
 HPBottleObjID: integer;                           // ObjectID бутыли
 HpBottleCount: integer;                           // количество бутылей

procedure Init; //Вызывается при включении скрипта
 begin
  CommanderID:= 0;        // обнуляем ВСЕ данные
  CommanderX:= 0;
  CommanderY:= 0;
  CommanderZ:= 0;
  CommanderID:= 0;
  CommanderHP:= 0;
  CommanderMaxHP:= 0;
//  MyMP:= 0;
//  MyMaxMP:= 0;
  AssistID:= 0;
  AssistX:= 0;
  AssistY:= 0;
  AssistZ:= 0;
  AssistID:= 0;
  AssistHP:= 0;
  AssistMaxHP:= 0;
  AssistMP:= 0;
  AssistMaxMP:= 0;
  TargetID:=0;
  time1:=1;
  buf:= #$0F;                            //запрашиваем пакеты с инвентарем и userinfo
  SendToServerEx(AssistantName);
  SendToServerEx(CommanderName);
 end;

function Wait(var tick: integer;Timewait: Integer): Boolean; // сквозная проверка без остановки скрипта (c)dmitry501, modifed by Sh00rGo
 var
  t: integer;
 begin
  result:=false;
  t:=Round(Time*86400);
  if t>(tick+Timewait) then begin
    if tick>0 then result:=true;
    tick:=t;
  end;
 end;

//############################## Модуль работы с Инвентарем ###########################
procedure InventoryCreate;
var
  i,k, offset : integer;
begin
  if interlude then offset:= 8 else offset:=0;
  for i:=0 to InvRazmer do
    if (i<ReadH(4)) then begin
      Inventory[i,0]:=ReadH(i*(28+offset)+6);  // itemType1
      Inventory[i,1]:=ReadD(i*(28+offset)+8);  // ObjectId
      Inventory[i,2]:=ReadD(i*(28+offset)+12); // ItemID
      Inventory[i,3]:=ReadD(i*(28+offset)+16); // count
      Inventory[i,4]:=ReadH(i*(28+offset)+20); // itemType2
      Inventory[i,5]:=ReadH(i*(28+offset)+22); // CustType1
      Inventory[i,6]:=ReadH(i*(28+offset)+24); // isEquipped
      Inventory[i,7]:=ReadD(i*(28+offset)+26); // BodyPart
      Inventory[i,8]:=ReadH(i*(28+offset)+30); // EnchantLevel
      Inventory[i,9]:=ReadH(i*(28+offset)+32); // CustType2
    end else
      for k:=0 to 9 do Inventory[i,k]:=0; // забиваем нулями
end;

function GetInv(obj,up,down:integer): integer; // up и down не проверяются
   var // 0-itemType1, 1-ObjectId, 2-ItemID, 3-count, 4-itemType2, 5-CustType1, 6-isEquipped, 7-BodyPart, 8-EnchantLevel, 9-CustType2
    i: integer;
 begin
  for i:=0 to InvRazmer do if (Inventory[i,up]=obj) then
   begin
    Result:=Inventory[i,down];
    exit;
   end;
  Result:=-1;
end;

procedure UseItemObjID(ItemObjID:integer);       //Использовать предмет с заданным ItemID
 begin
  buf:=#$14;
  WriteD(ItemObjID);
  WriteD(0);
  SendToServerEx(AssistantName);;
 end;
//############################################################################################

procedure AssistUserInfo;                  // обновление данных о ассистенте
 var
  i:word;
 begin
  AssistID:=ReadD(18);
  AssistX:=ReadD(2);
  AssistY:=ReadD(6);
  AssistZ:=ReadD(10);
  i:=22;
  ReadS(i);
  if interlude then i:=i+48 else i:=i+44;
  AssistMaxHP:=ReadD(i);
  AssistHP:=ReadD(i);
  AssistMaxMP:=ReadD(i);        // чисто информативно
  AssistMP:=ReadD(i);
//  i:=i+363;               пока не используется
//  MyMaxCP:=ReadD(i);
//  MyCP:=ReadD(i);
 end;

procedure AssistStatusUpdate;       // обновление данных о ассистенте
 var
  i:integer;
 begin
  for i:=0 to ReadD(6)-1 do
   case pck[i*8+10] of
    #$09: AssistHP:=ReadD(i*8+14);
    #$0A: AssistMaxHP:=ReadD(i*8+14);
    #$0B: AssistMP:=ReadD(i*8+14);
    #$0C: AssistMaxMP:=ReadD(i*8+14);
//    #$21: MyCP:=ReadD(i*8+14);          пока не используется
//    #$22: MyMaxCP:=ReadD(i*8+14);
   end;
  if AssistMaxHP > 0 then AssistHPlevelProcent:= Round((AssistMaxHP/100)*HPMedium);
 end;

procedure CommanderUserInfo;             //   обновление данных о себе
 var
  i:word;
 begin
  CommanderID:=ReadD(18);
  CommanderX:=ReadD(2);
  CommanderY:=ReadD(6);
  CommanderZ:=ReadD(10);
  i:=22;
  ReadS(i);
  if interlude then i:=i+48 else i:=i+44;
  CommanderMaxHP:=ReadD(i);
  CommanderHP:=ReadD(i);
 end;

procedure Action;          // команда действия
 begin
  buf:=#$04;                //action
  WriteD(TargetID);
  WriteD(AssistX);
  WriteD(AssistY);
  WriteD(AssistZ);
  WriteC(0);
  SendToServerEx(AssistantName);
 end;

procedure DrinkBottle;          // пьем бутылки и следим за их количеством
 begin
  if HPBottleCount > 0 then
   begin
    UseItemObjID(HPBottleObjID);
    dec (HPBottleCount);
   end;
 end;

begin                   // Далее обработка входящих пакетов
 if pck = '' then exit;

 if (ConnectName = CommanderName) and FromServer then
  case pck[1] of
   #$04: if ReadS(22) = CommanderName then CommanderUserInfo;
  end;

 if (ConnectName = AssistantName) and FromServer then
  case pck[1] of
   #$04: if ReadS(22) = AssistantName then AssistUserInfo;
   #$0E: if AssistID=ReadD(2) then     //   StatusUpdate:h(ObjectID)d(Attributes)
           begin
            AssistStatusUpdate;
            if (AssistHP > 0) and (AssistHP < AssistHPlevelProcent) then if Wait(time1, DrinkDelay) then DrinkBottle;     // пьем бутылки с интервалом в 19 сек
            if (AssistHP > 0) and (AssistHP > AssistHPlevelProcent) then time1:=1;
           end;
   #$1B: begin
          InventoryCreate;  // Инвентарь
          HPBottleObjID:= getinv(HPBottleID, 2,1);
          HPBottleCount:= getinv(HPBottleID, 2,3);
         end;
   //#$27: InventoryUpdate;
  end;

 if (ConnectName = AssistantName) and FromServer and CommanderBot then
  case pck[1] of
   #$01: if CommanderID = ReadD(2) then
         begin
          TargetID:= CommanderID;
          Action; Action;
         end;
   #$05, #$60 : if CommanderID = ReadD(2) then            //Attack:d(AttackerID)d(TargetID)d(Damage)b(Flags)d(X)d(Y)d(Z)h(Hits)
          begin
           TargetID:= ReadD(6);
           Action; Action;
          end;
  end;

 if (ConnectName = CommanderName) and FromClient and (not CommanderBot) then
  case pck[1] of
   #$01: begin
          TargetID:= CommanderID;
          Action; Action;
         end;
   #$04: begin
          TargetID:= ReadD(2);            //  Action:h(ObjectID)d(OriginX)d(OriginY)d(OriginZ)b(ActionID)
          Action;
         end;
  end;

end.
__________________
Цитата:
Сообщение от pybukon
прежде чета попросить я немнога раскажу чтоб вы понили как мне плоха
Цитата:
Сообщение от Byrger
А как сделать мой скрипт бесконечным?
Цитата:
Сообщение от XKOR
.. каждый день ионизированной ногой протирает больную)
Цитата:
Сообщение от PsyR
Вылоджите пожалуйста скрипт на рыбалку желательно что бы сам в ВХ клал адаптированый под шоки и так же скрипт на ТТ рец, тоже с диалогами
VORON вне форума   Ответить с цитированием
За это сообщение VORON нажился 18 спасибками от:
Старый 07.10.2007, 17:09   #2
Рыцарь
 
Аватар для QaK
 
Регистрация: 28.09.2007
Сообщений: 1,558
Сказал Спасибо: 71
Имеет 351 спасибок в 244 сообщенях
QaK пока неопределено
По умолчанию

Цитата:
Сообщение от Bravisimo
Я ничего не понимаю в написании скриптов
Учи программирование на Паскале,потом Делфи.
Цитата:
Сообщение от Bravisimo
Но немного повозьвшись с этой прогой я понял что можно ее использовать для Бото БД /СВС

Напишите ктонить Плз скрипт чтоб бд/свс брал пати танцевал/пел и выходил с пати
Гмм, как это ты, немного повозившись, понял? Понял, что скрипты мона писать? Или как? Так-то ее и используют для написания скриптов для саппортов(булок,бд,свс,просто ассист). Читай форум, разбирайся, просто так тебе никто ничего не напишет, только если этому кому-то самому понадобится бд/свс, а так можно просто взять готовый скрипт на баффера из этой темы, поменять баффы на песни/танцы и вход/выход из пати.
QaK вне форума   Ответить с цитированием
Старый 07.10.2007, 20:41   #3
Рыцарь
 
Аватар для NLObP
 
Регистрация: 25.02.2008
Адрес: г.Волгоград
Сообщений: 2,009
Сказал Спасибо: 1,285
Имеет 1,458 спасибок в 793 сообщенях
NLObP пока неопределено
По умолчанию Re: ДА БУДЕТ БОТ!

Вот три моих скрипта на рыбалку. Реально работающих. Первые два относятся к прцессу рыбалки, а третий как вспомогательный. Почему в отдельных скриптах? Чтобы можно было тиражировать на сколько угодно чаров простым копированием и переименованием скриптов. Придумывал сам и использовал готовые скрипты. Спасибо всем.
1)fishin.txt
Код:
//Автоматизация ловли рыбы by NLObP
//Возможность работы нескольких одновременных скриптов
//Добавлена проверка на кол-во крючков и шотов.
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и Protocol 656
//Необходимо затариться удочкой и крючками, шотами
//выучить соответствующие скиллы
//1 одеть и снять: удочку, крючек для определения ObjectID
//2 в процессе рыбалки использовать один раз фишин-шот для определения ObjectID
//3 в процессе боя использовать Healing Potion для определения ObjectID
//Социальное действие YES или 1 в чат - начать
//Социальное действие NO или 2 в чат - остановиться
//Enjoy!

{Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.}

const
  Name='NLObP';
  fish='2F 20 05 00 00 00 00 00 00 00';
  pump='2F 21 05 00 00 00 00 00 00 00';
  reel='2F 22 05 00 00 00 00 00 00 00';
var
  timer: TTimer;
  status, status2, RodInUse:boolean;
  Lure, ColvoLure, Shot, ColvoShot, CharObjID: Integer;
  SocialID: Integer;
  Cmd:string;
//******************************************************************************
//                      Вызывается при включении скрипта
//******************************************************************************
procedure Init;
begin
  Shot:=0;
  Status:=false;
  Status2:=false;
  RodInUse:=false;
  timer:=TTimer.Create(nil);
  timer.OnTimer:=@OnTimer;
  timer.enabled:=false;
  timer.interval:=5000; //время задержки
  Say('1 одеть и снять: удочку, крючек!');
  Say('2 в процессе рыбалки использовать один раз фишин-шот!');
end;
//******************************************************************************
//                        Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
  timer.Free;
end;
//******************************************************************************
Function ObjtoColvo(ItemObjID:integer): integer;
var
  i: integer;
begin
  if ItemObjID=0 then exit;
  for i:=0 to ReadD(4)-1 do begin
    if ItemObjID=ReadD(i*28+8) then begin
        Result:=ReadD(i*28+16); //количество
        exit;
    end;
  end;
  Result:=0;
end;
//******************************************************************************
//посылаем сообщение, которое видно только в окне бота
//можно использовать для отладки
procedure Say(msg:string);
begin
  buf:=hstr('4A 00 00 00 00');
  WriteD(2);
  WriteS(Name);
  WriteS(msg);
  SendToClientEx(Name);
end;
//******************************************************************************
procedure UseItem(ObjID:integer);
begin
    buf:=#$14;
    WriteD(ObjID);
    WriteD(00);
    SendToServerEx(Name);
end;
//******************************************************************************
procedure Pumping;
begin
  if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
  //else Say('Кончились шоты!');
  buf:=HStr(pump);
  SendToServerEx(Name);
end;
//******************************************************************************
procedure Reeling;
begin
  if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
  //else Say('Кончились шоты!');
  buf:=HStr(reel);
  SendToServerEx(Name);
end;

//******************************************************************************
procedure Fishing;
begin
  if ColvoLure<>0 then begin
    RodInUse:=true;
    buf:=HStr(fish);
    SendToServerEx(Name);
  end
  else begin
    Status:=false;
    Say('Кончились крючки!');
    exit; //прекращаем рыбалку
  end;
end;
//******************************************************************************
procedure OnTimer(Sender: TObject);
begin
    Fishing;
    timer.enabled:=false;
end;
//******************************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
  //не обрабатываем пустые пакеты
  if pck='' then exit;
  //****************************************************************************
  //если от сервака принят пакет с UserInfo. Запоминаем собственный ИД
  if FromServer and (ConnectName=Name) and (pck[1]=#$04) then CharObjID:=ReadD(18);
  //****************************************************************************
  {необходимо уточнить ItemID для своего сервера!!!
  6519=Green Colored Lure - Low Grade A
  6520=Green Colored Lure - Medium Grade
  6521=Green Colored Lure - High Grade
  6522=Purple Colored Lure - Low Grade
  6523=Purple Colored Lure - Medium Grade
  6524=Purple Colored Lure - High Grade
  6525=Yellow Colored Lure - Low Grade
  6526=Yellow Colored Lure - Medium Grade
  6527=Yellow Colored Lure - High Grade}
  //InventoryUpdate(27):w(count)w(1add2mod3remove)w(itemType1)h(ObjectID)i(ItemId)d(Count)
  //запоминаем ObjectID Lure и ColvoLure
  if FromServer and (ConnectName=Name) and (pck[1]=#$27) and ((ReadD(12)>=6519) and (ReadD(12)<=6527)) then begin
     Lure:=ReadD(8);
     ColvoLure:=ReadD(16); //количество крючков
     //Say('Крючков='+inttostr(ColvoLure));
  end;
  //****************************************************************************
  {необходимо уточнить ItemID для своего сервера!!!
  6535=Fishing Shot: non-grade
  6536=Fishing Shot: D-grade
  6537=Fishing Shot: C-grade
  6538=Fishing Shot: B-grade
  6539=Fishing Shot: A-grade
  6540=Fishing Shot: S-grade}
  //InventoryUpdate(27):w(count)w(1add2mod3remove)w(itemType1)h(ObjectID)i(ItemId)d(Count)
  //запоминаем ObjectID Fishing Shot и ColvoShot
  if FromServer and (ConnectName=Name) and (pck[1]=#$27) and ((ReadD(12)>=6535) and (ReadD(12)<=6540)) then begin
     Shot:=ReadD(8);
     ColvoShot:=ReadD(16); //количество шотов
     //Say('Шотов='+inttostr(ColvoShot));
  end;
  //******************************************************************************
  if (CharObjID<>0) and (ColvoLure<>0) and not status2 then begin //(Shot<>0) and (ColvoShot<>0) and
    Say('Автоматизация ловли рыбы готово к работе!');
    status2:=true;
  end;
  //******************************************************************************
  //ItemList
  if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then begin
     ColvoShot:=ObjtoColvo(Shot); //количество шотов
     //Say('Shot='+inttostr(ColvoShot));
     ColvoLure:=ObjtoColvo(Lure); //количество крючков
     //Say('Lure='+inttostr(ColvoLure));
  end;
  //****************************************************************************
  //ловим рыбу
  if Status and FromServer and (ConnectName=Name) and (CharObjID<>0) then begin
       //FishingEnd
       if (pck[1]+pck[2]=#$FE#$14) and (CharObjID=ReadD(4)) then timer.enabled:=true; //FishingEnd ждем N секунд межде рыбалками
       //FishinHPRegen
       if (pck[1]+pck[2]=#$FE#$16) and (CharObjID=ReadD(4)) and (pck[15]+pck[16]=#$00#$00) then pumping;
       if (pck[1]+pck[2]=#$FE#$16) and (CharObjID=ReadD(4)) and (pck[15]+pck[16]=#$00#$01) then reeling;
  end;
  //****************************************************************************
  if FromClient and (ConnectName=Name) and (pck[1]=#$1B) then begin
    SocialID:=ReadD(2);
    case SocialID of
      //социальное действие Yes для начала ловли
      6: begin
            if CharObjID=0 then exit;
            Status:=true;
            Fishing;
      end;
      //социальное действие No для окончания
      5: begin
            if CharObjID=0 then exit;
            if Status and RodInUse then Fishing;
            Status:=false;
            RodInUse:=false;
            timer.enabled:=false;
      end;
    end;
  end;
end.
2)fish_open.txt
Код:
//Автоматизация потрошения рыбы by NLObP
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и  Protocol 656
//Как только поймаете рыбку, она потрошиться.

{Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.}

//*******************************************************************
const
    Name='NLObP'; //имя чара
//*******************************************************************
var
  ItemObjID, time1: integer;
  status: boolean;
//*******************************************************************
procedure Init; //Вызывается при включении скрипта
begin
    time1:=0;
    status:=false;
end;
//*******************************************************************
procedure Free; //Вызывается при выключении скрипта
begin
end;
//*******************************************************************
function Wait(var tick:integer; Timewait: Integer): Boolean;
// сквозная проверка без остановки скрипта (c)dmitry501
// modifed by Sh00rGo
var
  t: integer;
begin
  result:=false;
  t:=Round(Time*86400);
  if t>(tick+Timewait/1000) then begin
    if tick>0 then result:=true;
    tick:=t;
  end;
end;
//*******************************************************************
procedure UseItem(ObjectID:integer);
begin
   buf:=#$14;
   WriteD(ObjectID);
   WriteD(0);
   SendToServerEx(Name);
end;
//*******************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//*******************************************************************
begin
  //*******************************************************************
  //не обрабатываем пустые пакеты
  if pck='' then exit;
  //*******************************************************************
  //потрошим рыбу
  //необходимо уточнить ItemID рыб для своего сервера!!!
  if FromServer and (pck[1]+pck[2]=#$27#$01) and (ConnectName=Name) and ((ReadD(12)>=6411) and (ReadD(12)<=6518)) then
  begin
    ItemObjID:=ReadD(8);
    status:=true;
  end;
  //*******************************************************************
  if Wait(time1,2000) and status then begin
    UseItem(ItemObjID);
    status:=false;
  end;
end.
3)use_hp.txt
Код:
//автоматическое использование НР пробирок by NLObP
// 1-Изменяем Name='NLObP';
// 2-бросаем, подбираем или выпиваем Heal Potion
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и  Protocol 656

const
    Name='NLObP';
var
    ColvoHP, CharObjID, ItemObjID: integer;
    MaxHP, CurHP: integer;
    TimerHP: TTimer;
    Status: boolean;
//******************************************************************************
procedure OnTimerHP(Sender: TObject);
begin
    if ColvoHP=0 then exit;
    buf:=#$14;
    WriteD(ItemObjID);
    WriteD(00);
    SendToServerEx(Name);
    ColvoHP:=ColvoHP-1; //количество хилок
    if ColvoHP=0 then begin
      Say('Хилок='+inttostr(ColvoHP));
      Say('Кончились хилки! Закупите Heal Potion!');
    end;
end;
//******************************************************************************
procedure Say(msg:string);
begin
  buf:=hstr('4A 00 00 00 00');
  WriteD(2);
  WriteS(Name);
  WriteS(msg);
  SendToClientEx(Name);
end;
//******************************************************************************
procedure InitStats;
var
  i: integer;
begin
  //Запоминаем ИД
  i:=18;
  CharObjID:=ReadD(i);
  //смещение переменное, зависит от имени (LenName*2+2)
  i:=i+(Length(Name)*2+2)+44;
  MaxHP:=ReadD(i);
  CurHP:=ReadD(i);
  //Say('MaxHP='+inttostr(MaxHP)+'CurHP='+inttostr(CurHP));
  if ItemObjID=0 then exit;
  if (CurHP<MaxHP-50) then TimerHP.enabled:=true else TimerHP.enabled:=false;
end;
//******************************************************************************
procedure StatsUpdate;
var
  i: integer;
begin
  for i:=0 to ReadD(6)-1 do begin
    case pck[i*8+10] of
      #$09: CurHP:=ReadD(i*8+14);
      #$0A: MaxHP:=ReadD(i*8+14);
    end;
  end;
  if ItemObjID=0 then exit;
  if (CurHP<=MaxHP-50) then TimerHP.enabled:=true else TimerHP.enabled:=false;
end;
//******************************************************************************
procedure ObjtoColvo(ItemObjID:integer);
var
  i: integer;
begin
  if ItemObjID=0 then exit;
  for i:=0 to ReadD(4)-1 do begin
    if ItemObjID=ReadD(i*28+8) then ColvoHP:=ReadD(i*28+16); //количество хилок
  end;
end;
//******************************************************************************
//                 Вызывается при включении скрипта
//******************************************************************************
procedure Init;
begin
    status:=false;
    CharObjID:=0;
    ItemObjID:=0;
    timerHP:=TTimer.Create(nil);
    timerHP.OnTimer:=@OnTimerHP;
    timerHP.enabled:=false;
    timerHP.interval:=5000; //время отката лечения
    Say('Для начала работы скрипта бросаем, подбираем или выпиваем Heal Potion!');
end;
//******************************************************************************
//                 Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
     timerHP.Free;
end;
//******************************************************************************
//       Вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
 //******************************************************************************
  //не обрабатываем пустые пакеты
  if pck='' then exit;
 //******************************************************************************
 //InventoryUpdate
 if FromServer and (ConnectName=Name) and (pck[1]=#$27) and ((ReadD(12)=1060) or (ReadD(12)=1061)) then begin //Healing Potion, Lesser Healing Potion
    ItemObjID:=ReadD(8);
    ColvoHP:=ReadD(16); //количество хилок
    if status then exit;
    Say('Автоматическое использование Нeal Рotion готово к работе!');
    Say('Хилок='+inttostr(ColvoHP));
    status:=true;
 end;
 //******************************************************************************
 //ItemList
 if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then begin
    ObjtoColvo(ItemObjID); //количество хилок
    //Say('Хилок='+inttostr(ColvoHP));
 end;
 //******************************************************************************
 //UserInfo
 if FromServer and (ConnectName=Name) and (pck[1]=#$04) then InitStats;
 //******************************************************************************
 //StatusUpdate
 if FromServer and (ConnectName=Name) and (pck[1]=#$0E) and (CharObjID=ReadD(2)) then StatsUpdate;
end.
Кач магического дракона.
training_dragon.txt
Код:
//Автоматический кач 'Hatchling of the Stars' by NLObP
// Для работы скрипта:
// 1 - Саммоним дракона
// 2 - кладем ему еду, броню, когти
// На автомате, при нападении хозяина на моба дракон автоматически ассистит
// при необходимости лечит себя, после боя следует за хозяином.

//******************************************************************************
//                   константы и переменные скрипта
//******************************************************************************
const
    Owner='NLObP';     //ник перса хозяина
    Pet='';
var
    OwnerID, PetID, TargetID : Integer; //ИД хозяина, пета, ИД таргета
    CoordX, CoordY, CoordZ : String;   //координаты пета
    Cmd :String;                      //команда пету
    CurHP, MaxHP, i : Integer;
    tick: Integer;
    timerA: TTimer;
    timerHP: TTimer;
//******************************************************************************
//                          Подпрограммы
//******************************************************************************
//все сообщения ботов в приватном чате патилидера
//видны только нам
procedure Say(msg:string);
begin
  buf:=hstr('4A 00 00 00 00');
  WriteD(2);
  WriteS(ConnectName);
  WriteS(msg);
  SendToClientEx(Owner);
end;
//******************************************************************************
procedure OnTimerA(Sender: TObject);
begin
    //пакет RequestActionUse;
    buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
    SendToServerEX(Owner);
    //Say('магическая атака пета');
end;
//******************************************************************************
procedure OnTimerHP(Sender: TObject);
begin
    buf:=hstr('45 EE 03 00 00 00 00 00 00 00'); //пет лечиться
    SendToServerEX(Owner);
end;
//******************************************************************************
//                 Вызывается при включении скрипта
//******************************************************************************
procedure Init;
begin
    OwnerID:=0;
    PetID:=0;
    timerA:=TTimer.Create(nil);
    timerA.OnTimer:=@OnTimerA; //
    timerA.enabled:=false; //
    timerA.interval:=1000; //время отката магии пета
    timerHP:=TTimer.Create(nil);
    timerHP.OnTimer:=@OnTimerHP; //
    timerHP.enabled:=false; //
    timerHP.interval:=2000; //время отката лечения пета
end;
//******************************************************************************
//                 Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
     timerA.Free;
     timerHP.Free;
end;
//******************************************************************************
//       Вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
  //не обрабатываем пустые пакеты
  if pck='' then exit;
//******************************************************************************
  //если от сервака принят пакет с UserInfo
  if FromServer and (OwnerID=0) and (ConnectName=Owner) and (pck[1]=#$04) then begin
      //Запоминаем собственный ИД
      OwnerID:=ReadD(18);
      Say('Скрипт готов к работе!');
  end;
//******************************************************************************
  //пакет Attack
  //атаковать, если хозяин напал на цель
  if FromServer and (ConnectName=Owner) and (pck[1]=#$05) and (OwnerID=ReadD(2)) then begin
      if (TargetID<>0) and (OwnerID<>TargetID) then begin
          buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
          SendToServerEX(Owner);
          TimerA.enabled:=true;
          //Say('Включили таймер');
      end;
  end;
//******************************************************************************
  //пакет MagicSkillUse
  //атаковать, если хозяин напал на цель магией
  if FromServer and (ConnectName=Owner) and (pck[1]=#$48) and (OwnerID=ReadD(2)) then begin
      if (TargetID<>0) and (OwnerID<>TargetID) then begin
          buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
          SendToServerEX(Owner);
          //Say('Атакую цель!');
          TimerA.enabled:=true;
          //Say('Включили таймер');
      end;
  end;
//******************************************************************************
  //пакет TargetSelect
  //если принят пакет со сменой таргета
  if FromServer and (ConnectName=Owner) and (pck[1]=#$a6) then begin
      //запоминаем ИД таргета для ассиста
      TargetID:=ReadD(2);
      //Say('Это ИД таргета.');
  end;
//******************************************************************************
  //пакет TargetUnselected
  //командир отменил цель
  if FromServer and (ConnectName=Owner) and (pck[1]=#$2a) and (OwnerID=ReadD(2)) then begin
      TargetID:=0;
      buf:=hstr('45 11 00 00 00 00 00 00 00 00'); //stop current action
      SendToServerEX(Owner);
      //Say('Стоп!');
      TimerA.enabled:=false;
      //Say('Выключили таймер');
  end;
//******************************************************************************
  //если от сервака принят пакет с PetInfo
  if FromServer and (PetID=0) and (ConnectName=Owner) and (pck[1]=#$b1) then begin
      //Запоминаем ИД пета
      PetID:=ReadD(6);
     //смещение переменное, зависит от имени Пета(LenName*2+2) и имени Чара(LenName*2+2)
     //126 байт до имени Пета(LenName*2+2) и имени Чара(LenName*2+2) после 20 байт (+1 начало CurHP)
     i:=126+(Length(Pet)*2+2)+(Length(Owner)*2+2)+20+1;
     CurHP:=ReadD(i);
     MaxHP:=ReadD(i);
      if (CurHP<MaxHP)
         then TimerHP.enabled:=true
         else TimerHP.enabled:=false;
         //Say('Запомнил ИД и жизнь пета');
  end;
//******************************************************************************
  //пакет PetStatusUpdate
  //проверяем на жизнь пета
  if FromServer and (ConnectName=Owner) and (pck[1]=#$b5) and (PetID=ReadD(6)) then begin
     //смещение переменное, зависит от имени Пета(LenName*2+2)
     //21 байт до имени Пета(LenName*2+2) после 8 байт (+1 начало CurHP)
     i:=21+(Length(Pet)*2+2)+8+1;
     CurHP:=ReadD(i);
     MaxHP:=ReadD(i);
     //Say('Считываем параметры пета');
     if (CurHP<MaxHP)
        then TimerHP.enabled:=true
        else TimerHP.enabled:=false;
   end;
end.
Автоматизация заточки предметов.
zatochka.txt
Код:
//Автоматизация заточки предметов до необходимого уровня by NLObP
//Затачиваем поочереди все предметы с Weapon ID пока не переломаем или не заточим

//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS"

//Необходимо затариться оружием, заточками и валерьянкой
//Открываем инвентарь для инициализации скрипта
//Социальное действие YES начать
//Социальное действие NO остановиться

//Enjoy!

{Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.}

//******************************************************************************
const
  Name='NLObP';
  Scroll=957; // 957 - ItemID Crystall Scroll Enchant Weapon (Grade D)
  Weapon=129; // 129 - ItemID Sword of Revolution D-grade
  MaxEnchLvl=20; //max уровень заточки
  max=250;    //max количество предметов в базе
var
//  WpnObjID:  array[1..maxwpn,1..maxwpn] of integer;    //Weapon ObjID
  WpnBase:  array[1..2,1..max] of integer;    //Weapon ObjID,lvl
  ScrlBase:  array[1..max] of integer;    //Scroll ObjID
  add: boolean; //прошла заточка?
  timer: TTimer;
  CurEnchLvl, ColvoWpn, ColvoScrl, CurWpn, CurScrl: integer;
//******************************************************************************
procedure Init; //Вызывается при включении скрипта
var
  i:integer;
begin
  //Enchant:=false;
  CurEnchLvl:=0;
  timer:=TTimer.Create(nil);
  timer.OnTimer:=@OnTimerHP;
  timer.enabled:=false;
  timer.interval:=2500; //время задержки
  Say('Для инициализации скрипта, откройте инвентарь');
end;
//******************************************************************************
procedure Free; //Вызывается при выключении скрипта
begin
  WpnBase:=nil;
  ScrlBase:=nil;
  timer.Free;
end;
//******************************************************************************
procedure Say(msg:string);
begin
  buf:=hstr('4A 00 00 00 00');
  WriteD(2);
  WriteS(Name);
  WriteS(msg);
  SendToClientEx(Name);
end;
//******************************************************************************
procedure CreateItemBase; //пакет 1B, Создает базу ObjectID по ItemID
var
  i, ss, ww, j, ObjID, ItemID, lvl, ListCount: integer;
begin
  ss:=1; //индекс в массиве скроллов
  ww:=1; //индекс в массиве предметов
  j:=4; //смещение для ListCount
  ListCount:=ReadH(j); //количество итемов не должно превышать max!
  if ListCount>max then ListCount:=max;
  j:=8; //смещение для ObjectID
  //Пробегаем по Инвентарю и сохраняем ObjectID соответствующие необходимым ItemID
  for i:=1 to ListCount do begin
     ObjID:=ReadD(j);      //ObjectID
     ItemID:=ReadD(j);    //ItemID
     j:=j+14;
     Lvl:=ReadD(j);    //Level
     case ItemID of
        scroll: begin
            ScrlBase[ss]:=ObjID;
            ss:=ss+1;
            //Say('ColvoScrl='+IntToStr(ss));
        end;
        weapon: begin
            WpnBase[1,ww]:=ObjID;
            WpnBase[2,ww]:=lvl;
            ww:=ww+1;
            //Say('ColvoWpn='+IntToStr(ww));
        end;
     end;
    j:=j+2; //для С4
//    j:=j+10; //для Интерлюдии
  end;
  ColvoWpn:=ww-1;
  ColvoScrl:=ss-1;
  Say('>ColvoWpn='+IntToStr(ColvoWpn)+' ColvoScrl='+IntToStr(ColvoScrl)+' CurEnchLvl='+IntToStr(CurEnchLvl));
end;
//******************************************************************************
procedure UpdateItemBase; //пакет 27, Создает базу ObjectID по ItemID
var
  i, ii, j, ss, ww, ObjID, ItemID, Lvl, ListCount, UpdType: integer;
begin
  ListCount:=ReadH(2); //количество итемов
  //Пробегаем по Инвентарю и сохраняем пары ObjectID - Lvl
  j:=4; //смещение для действия с предметом 1-добавлен 2-изменен 3-удален
//  Say('Апдейт базы!');
  for i:=1 to ListCount do begin
    UpdType:=ReadH(j);
    j:=j+2;
    ObjID:=ReadD(j);
    ItemID:=ReadD(j);
    j:=j+14;
    Lvl:=ReadH(j);
//    Say('Предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(ItemID));
    case UpdType of
      1:case ItemID of
          weapon: begin
            ColvoWpn:=ColvoWpn+1;
            //Say('Добавили предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(weapon));
            for ii:=1 to max do
              if WpnBase[1,ii]=0 then begin WpnBase[1,ii]:=ObjID; WpnBase[2,ii]:=lvl; end;
          end;
          scroll: begin
            ss:=ss+1;
            //Say('Добавили скролл! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(scroll));
            for ii:=1 to max do
              if ScrlBase[ii]=0 then ScrlBase[ii]:=ObjID;
          end;
      end;
      2:case ItemID of
          weapon:
            for ii:=1 to max do
              if WpnBase[1,ii]=ObjID then WpnBase[2,ii]:=lvl;
          scroll:
            //Say('Внимание! Изменения в скролле!?');
      end;
      //удален
      3:case ItemID of
          weapon: begin
             ColvoWpn:=ColvoWpn-1;
             for ii:=1 to max do
              if WpnBase[1,ii]=ObjID then begin WpnBase[1,ii]:=0; WpnBase[2,ii]:=0; end;
              //Say('Удаляем предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(weapon));
          end;
          scroll: begin
             ColvoScrl:=ColvoScrl-1;
             for ii:=1 to max do
              if ScrlBase[ii]=ObjID then ScrlBase[ii]:=0;
              //Say('Удаляем скролл! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(scroll));
          end;
      end;
    end;
    j:=j+2; //для С4
//    j:=j+10; //для Интерлюдии
  end;
  Say('>>ColvoWpn='+IntToStr(ColvoWpn)+' ColvoScrl='+IntToStr(ColvoScrl)+' CurEnchLvl='+IntToStr(CurEnchLvl));
end;
//******************************************************************************
function GetNextWeapon: integer; //Выдает ObjID предмета, если  не найден в базе, выдает -1,
//достигли макс уровня заточки -2, подбираем мин текущий уровень заточки -3
var
  i: integer;
begin
  Result:=-1;
  if CurEnchLvl>=MaxEnchLvl then begin
    Result:=-2;
    exit;
  end;
  for i:=1 to max do begin
    //находим первый подходящий предмет
    if (WpnBase[1,i]<>0) and (WpnBase[2,i]=CurEnchLvl) then begin
      Result:=WpnBase[1,i];
      exit;
    end;
  end;
  CurEnchLvl:=CurEnchLvl+1;
  Result:=-3;
end;
//******************************************************************************
function GetNextScroll: integer; //Выдает ObjID скролла, если  не найден в базе, выдает -1
var
  i: integer;
begin
  Result:=-1;
  for i:=1 to max do begin
    //находим первый подходящий предмет
    if (ScrlBase[i]<>0) then begin
      Result:=ScrlBase[i];
      exit;
    end;
  end;
end;
//******************************************************************************
procedure UseItem(ObjectID: integer);
begin
  buf:=#$14;
  WriteD(ObjectID);
  WriteD(0);
  SendToServerEx(Name);
end;
//******************************************************************************
procedure RequesEnchantItem(ObjectID: integer);
begin
  buf:=#$58;
  WriteD(ObjectID);
  SendToServerEx(Name);
end;
//******************************************************************************
procedure OnTimerHP(Sender: TObject);
var
  wpn, scrl:integer;
begin
    if ColvoScrl=0 then begin
      Say('Кончились скроллы! Прервано!');
      timer.enabled:=false;
      exit;
    end;
    if ColvoWpn=1 then begin
      Say('Остался последний предмет! Прервано!');
      timer.enabled:=false;
      exit;
    end;
    Scrl:=GetNextScroll;
    if scrl=-1 then begin
      Say('Нет такой заточки! Прервано!');
      timer.enabled:=false;
      exit;
    end;
    Wpn:=GetNextWeapon;
    case wpn of
    -1: begin
          Say('Нет такого предмета! Прервано!');
          timer.enabled:=false;
          exit;
       end;
    -2: begin
          Say('Достигли максимальный уровень заточки! Прервано!');
          timer.enabled:=false;
          exit;
        end;
    -3: begin
          //Say('Подбираем текущий уровень заточки!');
          timer.enabled:=true;
          exit;
        end;
    end;
    //************************************************
    UseItem(Scrl);
    RequesEnchantItem(Wpn);
    //************************************************
    Say('Заточили предмет! Weapon='+IntToStr(Wpn));
end;
//******************************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
  //****************************************************************************
  //не обрабатываем пустые пакеты
  if pck='' then exit;
  //****************************************************************************
  //социальное действие yes для начало точки
  if FromClient and (ConnectName=Name) and (pck=HStr('1B 06 00 00 00')) then begin
    CurEnchLvl:=0;
    Say('Команда Старт!!!');
    timer.enabled:=true;
  end;
  //****************************************************************************
  //социальное действие no для начало точки
  if FromClient and (ConnectName=Name) and (pck=HStr('1B 05 00 00 00')) then begin
    Say('Команда Стоп!!!');
    timer.enabled:=false;
  end;
  //****************************************************************************
  //ItemList
  if FromServer and (ConnectName=Name) and (pck[1]=#$1B) then CreateItemBase; //создание базы предметов
//  if (ColvoWpn=0) or (ColvoScrl=0) then exit; //если нет базы итемов, скрипт дальше не пустит
  //****************************************************************************
  //если удалились предметы, стираем в базе предметов пары ObjectID - ItemID
  if FromServer and (ConnectName=Name) and (pck[1]=#$27) then UpdateItemBase; //Обновление базы, если принят пакет на удаление предмета
end.
__________________
| Для самых ленивый | Телепаты в отпуске |Мы работаем над этим |
Не умеешь - учись, не хочешь учиться - плати © Суровый Закон Жизни


NLObP вне форума   Ответить с цитированием
За это сообщение NLObP нажился 11 спасибками от:
Старый 08.10.2007, 06:17   #4
Новичок
 
Регистрация: 08.10.2007
Сообщений: 3
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
ProFine
По умолчанию

Как то в старом форуме подымалась идея о управлении суммонеров в пати. Решил тоже проверить. Проверял на чайнике крафтера. Самого крафтера сажал, а вторым чаром управлял. У меня не получилось заставить его очень далеко бегать, максимум на растоянии видимости, проверял на L2C4. Хм, может это действительно так? А может сервер такой странный, или я скрипт не так написал.

Управлял так:
Код:
//передаем таргет
buf:=hstr('04') + IDAssistTarget + Bot1CoordX + Bot1CoordY +Bot1CoordZ + hstr('00');
SendToServerEX('NICK');
//передаем атаку чайником
buf:=hstr('45 16 00 00 00 00 00 00 00 00'); //
SendToServerEX('NICK');
end;
ProFine вне форума   Ответить с цитированием
Старый 08.10.2007, 09:37   #5
Местный
 
Регистрация: 06.10.2007
Сообщений: 31
Сказал Спасибо: 3
Имеет 5 спасибок в 4 сообщенях
fox
По умолчанию

вся фишка чтоб передать ID таргета самонеру через пакетхак,а не через сервер. просто тупой ассист не катит. по твоему куску не видно откуда берется IDAssistTarget.

Добавлено спустя 2 минуты 46 секунд:
даже добавлю что IDAssistTarget надо брать из пакетов клиента командира (а не пакетов сервера).
__________________
Цитата:
Народ подскажите почему вылетает l2wmx2.exe ерором когда я запускаю на WinXp sp3. Хочет отправлють прогу в макрософт а я жму неотправлять , ещо там запалят вопщем АЛЛАРМ шоделать???
fox вне форума   Ответить с цитированием
Старый 08.10.2007, 11:08   #6
Новичок
 
Регистрация: 08.10.2007
Сообщений: 3
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
ProFine
По умолчанию

IDAssistTarget берется так, есть 2 чара допустим крафтер и лукарь. так вот я кликаю на моба лукарем получаю ID моба (затем IDAssistTarget:=ID) а затем с этим IDAssistTarget поступаю как писал выше, тоесть эмулирую команды самого крафтера.
ProFine вне форума   Ответить с цитированием
Старый 08.10.2007, 14:41   #7
Пользователь
 
Регистрация: 07.10.2007
Сообщений: 29
Сказал Спасибо: 38
Имеет 7 спасибок в 3 сообщенях
Agat пока неопределено
По умолчанию

Цитата:
// КАЧ БОТ "ЛОКОМАТИВ" by VORON
...
...
...
Я проставил везде в скрипте ник перса, но бот не работает... Порылся в проге (предупреждаю я не программист :oops: ) нашел строку
//MyID:string; //мой ИД
я так понял, что ее надо поправить на ИД чара... который, я так думаю можно перехватить во вкладке "просмотр", но не совсем понял в каком формате это должно быть. Извиняюсь но прошу мне помочь :cry: какой формат этого ИД?
как это должно выглядеть в коце?
Спасиб за ответ. :) :good:
Agat вне форума   Ответить с цитированием
Старый 08.10.2007, 15:03   #8
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

Цитата:
Сообщение от Agat
Я проставил везде в скрипте ник перса, но бот не работает... Порылся в проге (предупреждаю я не программист :oops: ) нашел строку
//MyID:string; //мой ИД
я так понял, что ее надо поправить на ИД чара... который, я так думаю можно перехватить во вкладке "просмотр", но не совсем понял в каком формате это должно быть. Извиняюсь но прошу мне помочь :cry: какой формат этого ИД?
как это должно выглядеть в коце?
Спасиб за ответ. :) :good:
то что стоит после "//" считается коментарием, тоесть программа это необрабатывает, и я кста не нашел в скрипте чтоб гденить свой ник надо было ставить
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Старый 08.10.2007, 18:04   #9
Пользователь
 
Регистрация: 07.10.2007
Сообщений: 29
Сказал Спасибо: 38
Имеет 7 спасибок в 3 сообщенях
Agat пока неопределено
По умолчанию Re: ДА БУДЕТ БОТ!

Цитата:
Сообщение от VORON

// КАЧ БОТ "ЛОКОМАТИВ" by VORON
...
//MyID:string; //мой ИД
...
begin
//берем в таргет вражину
...
SendToServerEX('ник');
//пиздим его
...
SendToServerEX('ник');
...
//запоминаем мобов из пакета NPCInfo (новый моб)
if FromServer and (ConnectName = 'ник') and (pck[1]=#$16) then
b......
Можно было конечно сделать что то вроде:
Код:
const
   Name='ник';  //ник перса
var
...
begin
    //берем в таргет вражину
    ...
    SendToServerEX(Name);
    //пиздим его
    ...
Но именно в скрипте Ворона стоит именно так.
Учусь помаленьку :).
А то что // - это комментарий который не обрабатывается я знаю ) еще не настолько потерян :)
подозреваю, что там надо было // убрать и проставить ИД своего чара, хотел пример.
ЗЫ спс за ответ
Agat вне форума   Ответить с цитированием
Старый 09.10.2007, 05:39   #10
Новичок
 
Регистрация: 08.10.2007
Сообщений: 3
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
ProFine
По умолчанию Re:

Цитата:
Сообщение от Agat
Я проставил везде в скрипте ник перса, но бот не работает... Порылся в проге (предупреждаю я не программист :oops: ) нашел строку
//MyID:string; //мой ИД
я так понял, что ее надо поправить на ИД чара... который, я так думаю можно перехватить во вкладке "просмотр", но не совсем понял в каком формате это должно быть. Извиняюсь но прошу мне помочь :cry: какой формат этого ИД?
как это должно выглядеть в коце?
Спасиб за ответ. :) :good:
Если тебе поможет, то там надо вводить радиус действия, он вводится отрезком с x1 потом пробежав вводишь x2. Также он может не корректно работать(вернее корректно , просто так задумано) если прибежав на локацию ты потом включаешь скрип то чар не будет находить мобов сразу. Надо чтоб скрипт вбил в массив этих мобов.
Лично у меня такой скрипт работает не по таймеру , когда моб умирает ждем когда придет пакет с удалением объекта, если это был наш объект в таргете то ищем следующего моба. А пока лежит мертвый бот можно и дроп поднять, свип провести, на и если тебя еще один моб бьет то можно перекинуть таргет на него.
ProFine вне форума   Ответить с цитированием
Ответ

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


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

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

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


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

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

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