Вернуться   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 спасибками от:
 

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


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

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

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


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

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

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