Вернуться   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 спасибками от:
Старый 19.04.2008, 12:05   #2
Новичок
 
Аватар для Alan
 
Регистрация: 11.10.2007
Адрес: Питер
Сообщений: 13
Сказал Спасибо: 261
Имеет 0 спасибок в 0 сообщенях
Alan
По умолчанию

to Voron вы писали 16.03.2008, 00:48 --->
ДРУЗЬЯ, частично перечитал топ.. и с ужасом обнаружил что нет нормальной реализации глотания банок ХП, ГХП, ГЦП... тот вариант что предложил МКС предполагает предварительную подготовку скрипта.. т.е. после запуска скрипта следуют самому ручками глотнуть банки в нужной последовательности..

так вот скрипт суперский! Пасиба! Есть над чем подумать 8)
вот например, бафать баферы начинют все вместе! Со стороны палево полное. Дальше нету банок мп, я например играю боевым магом, мне сешка нужна как заливка + баф. Сешка-шилка сама себе не регенит манку, те у нее есть скил инвок например, + лопала б банки мп. И вот еще я играю в связке пп+se+бд. ставлю вместо ее - бд, скрипт зависает, тода как сешка в связке с пп бегают намано. Если можно дополнить скрипт, добавить в него бд, был бы полноценный скрипт. А так нареканий нету. Вчера укокошил варовскую патьку один 8))))) Правда был под бд друга 8) Хилит, ману льет как нужно. Хотя нет, не настроить для вара лечилку. те что бы начинали лечить при 95% хп. не понял как, при варе это жизнено важно 8) (буду еще искать)
ОГРОМНОЕ ПАСИБА ЗА ТВОЙ ТРУД! ЗА ТВОЙ СКРИПТ! ОН ЛУЧШИЙ!
Alan вне форума   Ответить с цитированием
Старый 19.04.2008, 22:07   #3
Новичок
 
Аватар для Alan
 
Регистрация: 11.10.2007
Адрес: Питер
Сообщений: 13
Сказал Спасибо: 261
Имеет 0 спасибок в 0 сообщенях
Alan
По умолчанию

ту Voron.
вопросец по твоему куску скрипта:
delphi Код:
//YES-  РУТ ПО АССИСТУ (4-я кнопка) либо переделать в какойто дебаф от каждого бафера он свой.. по ассисту все баферы какуюто куйню кинут на цель по ассисту..   if FromClient then   if ConnectName=NameKom then   if pck[1]+pck[2]=hstr('1B 06') then     begin      pck:='';       buf:= hstr('14') + OidgcpPotion0 + hstr('00 00 00 00'); // обычную хилку       if (OidgcpPotion0 <> '') then SendToServerEX(NameKom); {      buf:=hstr('04') + IDAssistTarget + Bot1X + Bot1Y + Bot1Z + hstr('00');       if NameBot1<>'' then SendToServerEX(NameBot1);       buf:=hstr('04') + IDAssistTarget + Bot2X + Bot2Y + Bot2Z + hstr('00');       if NameBot2<>'' then SendToServerEX(NameBot2);       buf:=hstr('04') + IDAssistTarget + Bot3X + Bot3Y + Bot3Z + hstr('00');       if NameBot3<>'' then SendToServerEX(NameBot3);       buf:=hstr('2F B1 04 00 00 00 00 00 00 00');       if NameBot1<>'' then SendToServerEX(NameBot1);       buf:=hstr('2F B1 04 00 00 00 00 00 00 00');       if NameBot2<>'' then SendToServerEX(NameBot2);       buf:=hstr('2F B1 04 00 00 00 00 00 00 00');       if NameBot3<>'' then SendToServerEX(NameBot3);}      exit;     end;

что не так? баферы не кидают рут

Последний раз редактировалось NLObP, 07.05.2008 в 01:13. Причина: вставил тэги [HIGHLIGHT="delphi"]...[/HIGHLIGHT]
Alan вне форума   Ответить с цитированием
Старый 19.04.2008, 22:23   #4
Новичок
 
Регистрация: 19.04.2008
Сообщений: 2
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
boroda пока неопределено
По умолчанию

подскажите я ещё токо седня начал разбираться я всё сделал по интрукции скрипта Бот - локомотив от Alexus
версия : 0.3 (бета)
дата: 08.04.08
Но при нажатии старт пишет не все параметры заданы
в чём же может дело Хотя я всё сделал как надо
Хроники6 клиент

Ой Ура разобрался
Желаю всем успехов по написанию ботов вы спасаите многих



Да ещё хотел добавить нехватает бафера-бота полноценного к примеру пп что бы просто ввести ник за кем бегать и бафать определёнными бафами ( просто и со вкусом )

Последний раз редактировалось boroda, 19.04.2008 в 23:51.
boroda вне форума   Ответить с цитированием
Старый 20.04.2008, 11:06   #5
Новичок
 
Аватар для Alan
 
Регистрация: 11.10.2007
Адрес: Питер
Сообщений: 13
Сказал Спасибо: 261
Имеет 0 спасибок в 0 сообщенях
Alan
По умолчанию

boroda, все есть, поиск в руки........

ту Voron по поводу рута, очень нужный пункт оказался в твоем скрипте. Вроде все правильно на первый взгляд, но не работает этот кусок.
Alan вне форума   Ответить с цитированием
Старый 28.04.2008, 09:53   #6
Рыцарь
 
Аватар для QaK
 
Регистрация: 28.09.2007
Сообщений: 1,558
Сказал Спасибо: 71
Имеет 351 спасибок в 244 сообщенях
QaK пока неопределено
По умолчанию

Alan, скобки фигурные убери { } - такие вот
QaK вне форума   Ответить с цитированием
Старый 28.04.2008, 11:53   #7
Рыцарь
 
Аватар для VORON
 
Регистрация: 06.08.2007
Сообщений: 209
Сказал Спасибо: 6
Имеет 67 спасибок в 34 сообщенях
VORON пока неопределено
По умолчанию

Цитата:
Сообщение от QaK Посмотреть сообщение
Alan, скобки фигурные убери { } - такие вот
логично
VORON вне форума   Ответить с цитированием
Старый 28.04.2008, 12:20   #8
Новичок
 
Аватар для Alan
 
Регистрация: 11.10.2007
Адрес: Питер
Сообщений: 13
Сказал Спасибо: 261
Имеет 0 спасибок в 0 сообщенях
Alan
По умолчанию

Пасиба, ща буду тестить, Voron с возвращеницем 8)
Потестил, вместо рута жрет банки сп. нужно поменять пакет наверное, если ты еще тут подскажи какой, чичаз буду искать его.

Последний раз редактировалось Alan, 28.04.2008 в 14:03.
Alan вне форума   Ответить с цитированием
Старый 02.05.2008, 23:49   #9
Рыцарь
 
Аватар для VORON
 
Регистрация: 06.08.2007
Сообщений: 209
Сказал Спасибо: 6
Имеет 67 спасибок в 34 сообщенях
VORON пока неопределено
По умолчанию

АЛАН ну ты голова вапще...
ну сам подумай над текстом кода приведенным тобой.. кусок кода с киданием ДЕБАФА (рута и фикни всякой) закоментирован.. а лишний явно кусок кода ето выпивание ЦП (или ХП там) банок..
я думаю так что 2 строки относящиеся к выпивани. ХП-ЦП пробирок- там явно лишнии.. а то что закоменчено- явно- нужное..
почему так вышло? ну когда я функцию глотания банок внедрял то тестировал на принудительном выпивании етих пробирок и вот закоментил кусок кода с РУТам и вместо них вбил 2 строки принудительного глотания ЦП и ХП банок.. а когда всё сделал забыл стереть ети 2 строки и раскоментить то что в скобках..
__________________
Цитата:
Сообщение от pybukon
прежде чета попросить я немнога раскажу чтоб вы понили как мне плоха
Цитата:
Сообщение от Byrger
А как сделать мой скрипт бесконечным?
Цитата:
Сообщение от XKOR
.. каждый день ионизированной ногой протирает больную)
Цитата:
Сообщение от PsyR
Вылоджите пожалуйста скрипт на рыбалку желательно что бы сам в ВХ клал адаптированый под шоки и так же скрипт на ТТ рец, тоже с диалогами
VORON вне форума   Ответить с цитированием
За это сообщение VORON нажился 2 спасибками от:
Старый 03.05.2008, 00:17   #10
Рыцарь
 
Аватар для Grinch
 
Регистрация: 29.02.2008
Сообщений: 928
Сказал Спасибо: 127
Имеет 130 спасибок в 93 сообщенях
Grinch пока неопределено
По умолчанию

VORON, +1 ответ кульный слав богу скрипта твоего не видел, он снова для всего и вся?
Grinch вне форума   Ответить с цитированием
Ответ

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



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

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


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

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

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