Планируется сюда собрать всю разбросанную по разным топам инфу про полезных ботов и скрипты к ним.. и обсуждение перенести сюда чтоб по кусочкам с разных топов информацию не черпать.
для начала обсуждения дам следущее:
Код:
//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
Вылоджите пожалуйста скрипт на рыбалку желательно что бы сам в ВХ клал адаптированый под шоки и так же скрипт на ТТ рец, тоже с диалогами
Но немного повозьвшись с этой прогой я понял что можно ее использовать для Бото БД /СВС
Напишите ктонить Плз скрипт чтоб бд/свс брал пати танцевал/пел и выходил с пати
Гмм, как это ты, немного повозившись, понял? Понял, что скрипты мона писать? Или как? Так-то ее и используют для написания скриптов для саппортов(булок,бд,свс,просто ассист). Читай форум, разбирайся, просто так тебе никто ничего не напишет, только если этому кому-то самому понадобится бд/свс, а так можно просто взять готовый скрипт на баффера из этой темы, поменять баффы на песни/танцы и вход/выход из пати.
Вот три моих скрипта на рыбалку. Реально работающих. Первые два относятся к прцессу рыбалки, а третий как вспомогательный. Почему в отдельных скриптах? Чтобы можно было тиражировать на сколько угодно чаров простым копированием и переименованием скриптов. Придумывал сам и использовал готовые скрипты. Спасибо всем.
1)fishin.txt
Код:
//Автоматизация ловли рыбы by NLObP
//Возможность работы нескольких одновременных скриптов
//Добавлена проверка на кол-во крючков и шотов.
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и Protocol 656
//Необходимо затариться удочкой и крючками, шотами
//выучить соответствующие скиллы
//1 одеть и снять: удочку, крючек для определения ObjectID
//2 в процессе рыбалки использовать один раз фишин-шот для определения ObjectID
//3 в процессе боя использовать Healing Potion для определения ObjectID
//Социальное действие YES или 1 в чат - начать
//Социальное действие NO или 2 в чат - остановиться
//Enjoy!
{Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.}
const
Name='NLObP';
fish='2F 20 05 00 00 00 00 00 00 00';
pump='2F 21 05 00 00 00 00 00 00 00';
reel='2F 22 05 00 00 00 00 00 00 00';
var
timer: TTimer;
status, status2, RodInUse:boolean;
Lure, ColvoLure, Shot, ColvoShot, CharObjID: Integer;
SocialID: Integer;
Cmd:string;
//******************************************************************************
// Вызывается при включении скрипта
//******************************************************************************
procedure Init;
begin
Shot:=0;
Status:=false;
Status2:=false;
RodInUse:=false;
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimer;
timer.enabled:=false;
timer.interval:=5000; //время задержки
Say('1 одеть и снять: удочку, крючек!');
Say('2 в процессе рыбалки использовать один раз фишин-шот!');
end;
//******************************************************************************
// Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
timer.Free;
end;
//******************************************************************************
Function ObjtoColvo(ItemObjID:integer): integer;
var
i: integer;
begin
if ItemObjID=0 then exit;
for i:=0 to ReadD(4)-1 do begin
if ItemObjID=ReadD(i*28+8) then begin
Result:=ReadD(i*28+16); //количество
exit;
end;
end;
Result:=0;
end;
//******************************************************************************
//посылаем сообщение, которое видно только в окне бота
//можно использовать для отладки
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
//******************************************************************************
procedure UseItem(ObjID:integer);
begin
buf:=#$14;
WriteD(ObjID);
WriteD(00);
SendToServerEx(Name);
end;
//******************************************************************************
procedure Pumping;
begin
if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
//else Say('Кончились шоты!');
buf:=HStr(pump);
SendToServerEx(Name);
end;
//******************************************************************************
procedure Reeling;
begin
if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
//else Say('Кончились шоты!');
buf:=HStr(reel);
SendToServerEx(Name);
end;
//******************************************************************************
procedure Fishing;
begin
if ColvoLure<>0 then begin
RodInUse:=true;
buf:=HStr(fish);
SendToServerEx(Name);
end
else begin
Status:=false;
Say('Кончились крючки!');
exit; //прекращаем рыбалку
end;
end;
//******************************************************************************
procedure OnTimer(Sender: TObject);
begin
Fishing;
timer.enabled:=false;
end;
//******************************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
//не обрабатываем пустые пакеты
if pck='' then exit;
//****************************************************************************
//если от сервака принят пакет с UserInfo. Запоминаем собственный ИД
if FromServer and (ConnectName=Name) and (pck[1]=#$04) then CharObjID:=ReadD(18);
//****************************************************************************
{необходимо уточнить ItemID для своего сервера!!!
6519=Green Colored Lure - Low Grade A
6520=Green Colored Lure - Medium Grade
6521=Green Colored Lure - High Grade
6522=Purple Colored Lure - Low Grade
6523=Purple Colored Lure - Medium Grade
6524=Purple Colored Lure - High Grade
6525=Yellow Colored Lure - Low Grade
6526=Yellow Colored Lure - Medium Grade
6527=Yellow Colored Lure - High Grade}
//InventoryUpdate(27):w(count)w(1add2mod3remove)w(itemType1)h(ObjectID)i(ItemId)d(Count)
//запоминаем ObjectID Lure и ColvoLure
if FromServer and (ConnectName=Name) and (pck[1]=#$27) and ((ReadD(12)>=6519) and (ReadD(12)<=6527)) then begin
Lure:=ReadD(8);
ColvoLure:=ReadD(16); //количество крючков
//Say('Крючков='+inttostr(ColvoLure));
end;
//****************************************************************************
{необходимо уточнить ItemID для своего сервера!!!
6535=Fishing Shot: non-grade
6536=Fishing Shot: D-grade
6537=Fishing Shot: C-grade
6538=Fishing Shot: B-grade
6539=Fishing Shot: A-grade
6540=Fishing Shot: S-grade}
//InventoryUpdate(27):w(count)w(1add2mod3remove)w(itemType1)h(ObjectID)i(ItemId)d(Count)
//запоминаем ObjectID Fishing Shot и ColvoShot
if FromServer and (ConnectName=Name) and (pck[1]=#$27) and ((ReadD(12)>=6535) and (ReadD(12)<=6540)) then begin
Shot:=ReadD(8);
ColvoShot:=ReadD(16); //количество шотов
//Say('Шотов='+inttostr(ColvoShot));
end;
//******************************************************************************
if (CharObjID<>0) and (ColvoLure<>0) and not status2 then begin //(Shot<>0) and (ColvoShot<>0) and
Say('Автоматизация ловли рыбы готово к работе!');
status2:=true;
end;
//******************************************************************************
//ItemList
if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then begin
ColvoShot:=ObjtoColvo(Shot); //количество шотов
//Say('Shot='+inttostr(ColvoShot));
ColvoLure:=ObjtoColvo(Lure); //количество крючков
//Say('Lure='+inttostr(ColvoLure));
end;
//****************************************************************************
//ловим рыбу
if Status and FromServer and (ConnectName=Name) and (CharObjID<>0) then begin
//FishingEnd
if (pck[1]+pck[2]=#$FE#$14) and (CharObjID=ReadD(4)) then timer.enabled:=true; //FishingEnd ждем N секунд межде рыбалками
//FishinHPRegen
if (pck[1]+pck[2]=#$FE#$16) and (CharObjID=ReadD(4)) and (pck[15]+pck[16]=#$00#$00) then pumping;
if (pck[1]+pck[2]=#$FE#$16) and (CharObjID=ReadD(4)) and (pck[15]+pck[16]=#$00#$01) then reeling;
end;
//****************************************************************************
if FromClient and (ConnectName=Name) and (pck[1]=#$1B) then begin
SocialID:=ReadD(2);
case SocialID of
//социальное действие Yes для начала ловли
6: begin
if CharObjID=0 then exit;
Status:=true;
Fishing;
end;
//социальное действие No для окончания
5: begin
if CharObjID=0 then exit;
if Status and RodInUse then Fishing;
Status:=false;
RodInUse:=false;
timer.enabled:=false;
end;
end;
end;
end.
2)fish_open.txt
Код:
//Автоматизация потрошения рыбы by NLObP
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и Protocol 656
//Как только поймаете рыбку, она потрошиться.
{Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.}
//*******************************************************************
const
Name='NLObP'; //имя чара
//*******************************************************************
var
ItemObjID, time1: integer;
status: boolean;
//*******************************************************************
procedure Init; //Вызывается при включении скрипта
begin
time1:=0;
status:=false;
end;
//*******************************************************************
procedure Free; //Вызывается при выключении скрипта
begin
end;
//*******************************************************************
function Wait(var tick:integer; Timewait: Integer): Boolean;
// сквозная проверка без остановки скрипта (c)dmitry501
// modifed by Sh00rGo
var
t: integer;
begin
result:=false;
t:=Round(Time*86400);
if t>(tick+Timewait/1000) then begin
if tick>0 then result:=true;
tick:=t;
end;
end;
//*******************************************************************
procedure UseItem(ObjectID:integer);
begin
buf:=#$14;
WriteD(ObjectID);
WriteD(0);
SendToServerEx(Name);
end;
//*******************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//*******************************************************************
begin
//*******************************************************************
//не обрабатываем пустые пакеты
if pck='' then exit;
//*******************************************************************
//потрошим рыбу
//необходимо уточнить ItemID рыб для своего сервера!!!
if FromServer and (pck[1]+pck[2]=#$27#$01) and (ConnectName=Name) and ((ReadD(12)>=6411) and (ReadD(12)<=6518)) then
begin
ItemObjID:=ReadD(8);
status:=true;
end;
//*******************************************************************
if Wait(time1,2000) and status then begin
UseItem(ItemObjID);
status:=false;
end;
end.
3)use_hp.txt
Код:
//автоматическое использование НР пробирок by NLObP
// 1-Изменяем Name='NLObP';
// 2-бросаем, подбираем или выпиваем Heal Potion
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и Protocol 656
const
Name='NLObP';
var
ColvoHP, CharObjID, ItemObjID: integer;
MaxHP, CurHP: integer;
TimerHP: TTimer;
Status: boolean;
//******************************************************************************
procedure OnTimerHP(Sender: TObject);
begin
if ColvoHP=0 then exit;
buf:=#$14;
WriteD(ItemObjID);
WriteD(00);
SendToServerEx(Name);
ColvoHP:=ColvoHP-1; //количество хилок
if ColvoHP=0 then begin
Say('Хилок='+inttostr(ColvoHP));
Say('Кончились хилки! Закупите Heal Potion!');
end;
end;
//******************************************************************************
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
//******************************************************************************
procedure InitStats;
var
i: integer;
begin
//Запоминаем ИД
i:=18;
CharObjID:=ReadD(i);
//смещение переменное, зависит от имени (LenName*2+2)
i:=i+(Length(Name)*2+2)+44;
MaxHP:=ReadD(i);
CurHP:=ReadD(i);
//Say('MaxHP='+inttostr(MaxHP)+'CurHP='+inttostr(CurHP));
if ItemObjID=0 then exit;
if (CurHP<MaxHP-50) then TimerHP.enabled:=true else TimerHP.enabled:=false;
end;
//******************************************************************************
procedure StatsUpdate;
var
i: integer;
begin
for i:=0 to ReadD(6)-1 do begin
case pck[i*8+10] of
#$09: CurHP:=ReadD(i*8+14);
#$0A: MaxHP:=ReadD(i*8+14);
end;
end;
if ItemObjID=0 then exit;
if (CurHP<=MaxHP-50) then TimerHP.enabled:=true else TimerHP.enabled:=false;
end;
//******************************************************************************
procedure ObjtoColvo(ItemObjID:integer);
var
i: integer;
begin
if ItemObjID=0 then exit;
for i:=0 to ReadD(4)-1 do begin
if ItemObjID=ReadD(i*28+8) then ColvoHP:=ReadD(i*28+16); //количество хилок
end;
end;
//******************************************************************************
// Вызывается при включении скрипта
//******************************************************************************
procedure Init;
begin
status:=false;
CharObjID:=0;
ItemObjID:=0;
timerHP:=TTimer.Create(nil);
timerHP.OnTimer:=@OnTimerHP;
timerHP.enabled:=false;
timerHP.interval:=5000; //время отката лечения
Say('Для начала работы скрипта бросаем, подбираем или выпиваем Heal Potion!');
end;
//******************************************************************************
// Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
timerHP.Free;
end;
//******************************************************************************
// Вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
//******************************************************************************
//не обрабатываем пустые пакеты
if pck='' then exit;
//******************************************************************************
//InventoryUpdate
if FromServer and (ConnectName=Name) and (pck[1]=#$27) and ((ReadD(12)=1060) or (ReadD(12)=1061)) then begin //Healing Potion, Lesser Healing Potion
ItemObjID:=ReadD(8);
ColvoHP:=ReadD(16); //количество хилок
if status then exit;
Say('Автоматическое использование Нeal Рotion готово к работе!');
Say('Хилок='+inttostr(ColvoHP));
status:=true;
end;
//******************************************************************************
//ItemList
if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then begin
ObjtoColvo(ItemObjID); //количество хилок
//Say('Хилок='+inttostr(ColvoHP));
end;
//******************************************************************************
//UserInfo
if FromServer and (ConnectName=Name) and (pck[1]=#$04) then InitStats;
//******************************************************************************
//StatusUpdate
if FromServer and (ConnectName=Name) and (pck[1]=#$0E) and (CharObjID=ReadD(2)) then StatsUpdate;
end.
Кач магического дракона.
training_dragon.txt
Код:
//Автоматический кач 'Hatchling of the Stars' by NLObP
// Для работы скрипта:
// 1 - Саммоним дракона
// 2 - кладем ему еду, броню, когти
// На автомате, при нападении хозяина на моба дракон автоматически ассистит
// при необходимости лечит себя, после боя следует за хозяином.
//******************************************************************************
// константы и переменные скрипта
//******************************************************************************
const
Owner='NLObP'; //ник перса хозяина
Pet='';
var
OwnerID, PetID, TargetID : Integer; //ИД хозяина, пета, ИД таргета
CoordX, CoordY, CoordZ : String; //координаты пета
Cmd :String; //команда пету
CurHP, MaxHP, i : Integer;
tick: Integer;
timerA: TTimer;
timerHP: TTimer;
//******************************************************************************
// Подпрограммы
//******************************************************************************
//все сообщения ботов в приватном чате патилидера
//видны только нам
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(ConnectName);
WriteS(msg);
SendToClientEx(Owner);
end;
//******************************************************************************
procedure OnTimerA(Sender: TObject);
begin
//пакет RequestActionUse;
buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
SendToServerEX(Owner);
//Say('магическая атака пета');
end;
//******************************************************************************
procedure OnTimerHP(Sender: TObject);
begin
buf:=hstr('45 EE 03 00 00 00 00 00 00 00'); //пет лечиться
SendToServerEX(Owner);
end;
//******************************************************************************
// Вызывается при включении скрипта
//******************************************************************************
procedure Init;
begin
OwnerID:=0;
PetID:=0;
timerA:=TTimer.Create(nil);
timerA.OnTimer:=@OnTimerA; //
timerA.enabled:=false; //
timerA.interval:=1000; //время отката магии пета
timerHP:=TTimer.Create(nil);
timerHP.OnTimer:=@OnTimerHP; //
timerHP.enabled:=false; //
timerHP.interval:=2000; //время отката лечения пета
end;
//******************************************************************************
// Вызывается при выключении скрипта
//******************************************************************************
procedure Free;
begin
timerA.Free;
timerHP.Free;
end;
//******************************************************************************
// Вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
//не обрабатываем пустые пакеты
if pck='' then exit;
//******************************************************************************
//если от сервака принят пакет с UserInfo
if FromServer and (OwnerID=0) and (ConnectName=Owner) and (pck[1]=#$04) then begin
//Запоминаем собственный ИД
OwnerID:=ReadD(18);
Say('Скрипт готов к работе!');
end;
//******************************************************************************
//пакет Attack
//атаковать, если хозяин напал на цель
if FromServer and (ConnectName=Owner) and (pck[1]=#$05) and (OwnerID=ReadD(2)) then begin
if (TargetID<>0) and (OwnerID<>TargetID) then begin
buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
SendToServerEX(Owner);
TimerA.enabled:=true;
//Say('Включили таймер');
end;
end;
//******************************************************************************
//пакет MagicSkillUse
//атаковать, если хозяин напал на цель магией
if FromServer and (ConnectName=Owner) and (pck[1]=#$48) and (OwnerID=ReadD(2)) then begin
if (TargetID<>0) and (OwnerID<>TargetID) then begin
buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
SendToServerEX(Owner);
//Say('Атакую цель!');
TimerA.enabled:=true;
//Say('Включили таймер');
end;
end;
//******************************************************************************
//пакет TargetSelect
//если принят пакет со сменой таргета
if FromServer and (ConnectName=Owner) and (pck[1]=#$a6) then begin
//запоминаем ИД таргета для ассиста
TargetID:=ReadD(2);
//Say('Это ИД таргета.');
end;
//******************************************************************************
//пакет TargetUnselected
//командир отменил цель
if FromServer and (ConnectName=Owner) and (pck[1]=#$2a) and (OwnerID=ReadD(2)) then begin
TargetID:=0;
buf:=hstr('45 11 00 00 00 00 00 00 00 00'); //stop current action
SendToServerEX(Owner);
//Say('Стоп!');
TimerA.enabled:=false;
//Say('Выключили таймер');
end;
//******************************************************************************
//если от сервака принят пакет с PetInfo
if FromServer and (PetID=0) and (ConnectName=Owner) and (pck[1]=#$b1) then begin
//Запоминаем ИД пета
PetID:=ReadD(6);
//смещение переменное, зависит от имени Пета(LenName*2+2) и имени Чара(LenName*2+2)
//126 байт до имени Пета(LenName*2+2) и имени Чара(LenName*2+2) после 20 байт (+1 начало CurHP)
i:=126+(Length(Pet)*2+2)+(Length(Owner)*2+2)+20+1;
CurHP:=ReadD(i);
MaxHP:=ReadD(i);
if (CurHP<MaxHP)
then TimerHP.enabled:=true
else TimerHP.enabled:=false;
//Say('Запомнил ИД и жизнь пета');
end;
//******************************************************************************
//пакет PetStatusUpdate
//проверяем на жизнь пета
if FromServer and (ConnectName=Owner) and (pck[1]=#$b5) and (PetID=ReadD(6)) then begin
//смещение переменное, зависит от имени Пета(LenName*2+2)
//21 байт до имени Пета(LenName*2+2) после 8 байт (+1 начало CurHP)
i:=21+(Length(Pet)*2+2)+8+1;
CurHP:=ReadD(i);
MaxHP:=ReadD(i);
//Say('Считываем параметры пета');
if (CurHP<MaxHP)
then TimerHP.enabled:=true
else TimerHP.enabled:=false;
end;
end.
Автоматизация заточки предметов.
zatochka.txt
Код:
//Автоматизация заточки предметов до необходимого уровня by NLObP
//Затачиваем поочереди все предметы с Weapon ID пока не переломаем или не заточим
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS"
//Необходимо затариться оружием, заточками и валерьянкой
//Открываем инвентарь для инициализации скрипта
//Социальное действие YES начать
//Социальное действие NO остановиться
//Enjoy!
{Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.}
//******************************************************************************
const
Name='NLObP';
Scroll=957; // 957 - ItemID Crystall Scroll Enchant Weapon (Grade D)
Weapon=129; // 129 - ItemID Sword of Revolution D-grade
MaxEnchLvl=20; //max уровень заточки
max=250; //max количество предметов в базе
var
// WpnObjID: array[1..maxwpn,1..maxwpn] of integer; //Weapon ObjID
WpnBase: array[1..2,1..max] of integer; //Weapon ObjID,lvl
ScrlBase: array[1..max] of integer; //Scroll ObjID
add: boolean; //прошла заточка?
timer: TTimer;
CurEnchLvl, ColvoWpn, ColvoScrl, CurWpn, CurScrl: integer;
//******************************************************************************
procedure Init; //Вызывается при включении скрипта
var
i:integer;
begin
//Enchant:=false;
CurEnchLvl:=0;
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimerHP;
timer.enabled:=false;
timer.interval:=2500; //время задержки
Say('Для инициализации скрипта, откройте инвентарь');
end;
//******************************************************************************
procedure Free; //Вызывается при выключении скрипта
begin
WpnBase:=nil;
ScrlBase:=nil;
timer.Free;
end;
//******************************************************************************
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
//******************************************************************************
procedure CreateItemBase; //пакет 1B, Создает базу ObjectID по ItemID
var
i, ss, ww, j, ObjID, ItemID, lvl, ListCount: integer;
begin
ss:=1; //индекс в массиве скроллов
ww:=1; //индекс в массиве предметов
j:=4; //смещение для ListCount
ListCount:=ReadH(j); //количество итемов не должно превышать max!
if ListCount>max then ListCount:=max;
j:=8; //смещение для ObjectID
//Пробегаем по Инвентарю и сохраняем ObjectID соответствующие необходимым ItemID
for i:=1 to ListCount do begin
ObjID:=ReadD(j); //ObjectID
ItemID:=ReadD(j); //ItemID
j:=j+14;
Lvl:=ReadD(j); //Level
case ItemID of
scroll: begin
ScrlBase[ss]:=ObjID;
ss:=ss+1;
//Say('ColvoScrl='+IntToStr(ss));
end;
weapon: begin
WpnBase[1,ww]:=ObjID;
WpnBase[2,ww]:=lvl;
ww:=ww+1;
//Say('ColvoWpn='+IntToStr(ww));
end;
end;
j:=j+2; //для С4
// j:=j+10; //для Интерлюдии
end;
ColvoWpn:=ww-1;
ColvoScrl:=ss-1;
Say('>ColvoWpn='+IntToStr(ColvoWpn)+' ColvoScrl='+IntToStr(ColvoScrl)+' CurEnchLvl='+IntToStr(CurEnchLvl));
end;
//******************************************************************************
procedure UpdateItemBase; //пакет 27, Создает базу ObjectID по ItemID
var
i, ii, j, ss, ww, ObjID, ItemID, Lvl, ListCount, UpdType: integer;
begin
ListCount:=ReadH(2); //количество итемов
//Пробегаем по Инвентарю и сохраняем пары ObjectID - Lvl
j:=4; //смещение для действия с предметом 1-добавлен 2-изменен 3-удален
// Say('Апдейт базы!');
for i:=1 to ListCount do begin
UpdType:=ReadH(j);
j:=j+2;
ObjID:=ReadD(j);
ItemID:=ReadD(j);
j:=j+14;
Lvl:=ReadH(j);
// Say('Предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(ItemID));
case UpdType of
1:case ItemID of
weapon: begin
ColvoWpn:=ColvoWpn+1;
//Say('Добавили предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(weapon));
for ii:=1 to max do
if WpnBase[1,ii]=0 then begin WpnBase[1,ii]:=ObjID; WpnBase[2,ii]:=lvl; end;
end;
scroll: begin
ss:=ss+1;
//Say('Добавили скролл! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(scroll));
for ii:=1 to max do
if ScrlBase[ii]=0 then ScrlBase[ii]:=ObjID;
end;
end;
2:case ItemID of
weapon:
for ii:=1 to max do
if WpnBase[1,ii]=ObjID then WpnBase[2,ii]:=lvl;
scroll:
//Say('Внимание! Изменения в скролле!?');
end;
//удален
3:case ItemID of
weapon: begin
ColvoWpn:=ColvoWpn-1;
for ii:=1 to max do
if WpnBase[1,ii]=ObjID then begin WpnBase[1,ii]:=0; WpnBase[2,ii]:=0; end;
//Say('Удаляем предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(weapon));
end;
scroll: begin
ColvoScrl:=ColvoScrl-1;
for ii:=1 to max do
if ScrlBase[ii]=ObjID then ScrlBase[ii]:=0;
//Say('Удаляем скролл! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(scroll));
end;
end;
end;
j:=j+2; //для С4
// j:=j+10; //для Интерлюдии
end;
Say('>>ColvoWpn='+IntToStr(ColvoWpn)+' ColvoScrl='+IntToStr(ColvoScrl)+' CurEnchLvl='+IntToStr(CurEnchLvl));
end;
//******************************************************************************
function GetNextWeapon: integer; //Выдает ObjID предмета, если не найден в базе, выдает -1,
//достигли макс уровня заточки -2, подбираем мин текущий уровень заточки -3
var
i: integer;
begin
Result:=-1;
if CurEnchLvl>=MaxEnchLvl then begin
Result:=-2;
exit;
end;
for i:=1 to max do begin
//находим первый подходящий предмет
if (WpnBase[1,i]<>0) and (WpnBase[2,i]=CurEnchLvl) then begin
Result:=WpnBase[1,i];
exit;
end;
end;
CurEnchLvl:=CurEnchLvl+1;
Result:=-3;
end;
//******************************************************************************
function GetNextScroll: integer; //Выдает ObjID скролла, если не найден в базе, выдает -1
var
i: integer;
begin
Result:=-1;
for i:=1 to max do begin
//находим первый подходящий предмет
if (ScrlBase[i]<>0) then begin
Result:=ScrlBase[i];
exit;
end;
end;
end;
//******************************************************************************
procedure UseItem(ObjectID: integer);
begin
buf:=#$14;
WriteD(ObjectID);
WriteD(0);
SendToServerEx(Name);
end;
//******************************************************************************
procedure RequesEnchantItem(ObjectID: integer);
begin
buf:=#$58;
WriteD(ObjectID);
SendToServerEx(Name);
end;
//******************************************************************************
procedure OnTimerHP(Sender: TObject);
var
wpn, scrl:integer;
begin
if ColvoScrl=0 then begin
Say('Кончились скроллы! Прервано!');
timer.enabled:=false;
exit;
end;
if ColvoWpn=1 then begin
Say('Остался последний предмет! Прервано!');
timer.enabled:=false;
exit;
end;
Scrl:=GetNextScroll;
if scrl=-1 then begin
Say('Нет такой заточки! Прервано!');
timer.enabled:=false;
exit;
end;
Wpn:=GetNextWeapon;
case wpn of
-1: begin
Say('Нет такого предмета! Прервано!');
timer.enabled:=false;
exit;
end;
-2: begin
Say('Достигли максимальный уровень заточки! Прервано!');
timer.enabled:=false;
exit;
end;
-3: begin
//Say('Подбираем текущий уровень заточки!');
timer.enabled:=true;
exit;
end;
end;
//************************************************
UseItem(Scrl);
RequesEnchantItem(Wpn);
//************************************************
Say('Заточили предмет! Weapon='+IntToStr(Wpn));
end;
//******************************************************************************
// вызывается при приходе каждого пакета, если скрипт включен
//******************************************************************************
begin
//****************************************************************************
//не обрабатываем пустые пакеты
if pck='' then exit;
//****************************************************************************
//социальное действие yes для начало точки
if FromClient and (ConnectName=Name) and (pck=HStr('1B 06 00 00 00')) then begin
CurEnchLvl:=0;
Say('Команда Старт!!!');
timer.enabled:=true;
end;
//****************************************************************************
//социальное действие no для начало точки
if FromClient and (ConnectName=Name) and (pck=HStr('1B 05 00 00 00')) then begin
Say('Команда Стоп!!!');
timer.enabled:=false;
end;
//****************************************************************************
//ItemList
if FromServer and (ConnectName=Name) and (pck[1]=#$1B) then CreateItemBase; //создание базы предметов
// if (ColvoWpn=0) or (ColvoScrl=0) then exit; //если нет базы итемов, скрипт дальше не пустит
//****************************************************************************
//если удалились предметы, стираем в базе предметов пары ObjectID - ItemID
if FromServer and (ConnectName=Name) and (pck[1]=#$27) then UpdateItemBase; //Обновление базы, если принят пакет на удаление предмета
end.
Как то в старом форуме подымалась идея о управлении суммонеров в пати. Решил тоже проверить. Проверял на чайнике крафтера. Самого крафтера сажал, а вторым чаром управлял. У меня не получилось заставить его очень далеко бегать, максимум на растоянии видимости, проверял на L2C4. Хм, может это действительно так? А может сервер такой странный, или я скрипт не так написал.
вся фишка чтоб передать ID таргета самонеру через пакетхак,а не через сервер. просто тупой ассист не катит. по твоему куску не видно откуда берется IDAssistTarget.
Добавлено спустя 2 минуты 46 секунд:
даже добавлю что IDAssistTarget надо брать из пакетов клиента командира (а не пакетов сервера).
__________________
Цитата:
Народ подскажите почему вылетает l2wmx2.exe ерором когда я запускаю на WinXp sp3. Хочет отправлють прогу в макрософт а я жму неотправлять , ещо там запалят вопщем АЛЛАРМ шоделать???
IDAssistTarget берется так, есть 2 чара допустим крафтер и лукарь. так вот я кликаю на моба лукарем получаю ID моба (затем IDAssistTarget:=ID) а затем с этим IDAssistTarget поступаю как писал выше, тоесть эмулирую команды самого крафтера.
Я проставил везде в скрипте ник перса, но бот не работает... Порылся в проге (предупреждаю я не программист :oops: ) нашел строку
//MyID:string; //мой ИД
я так понял, что ее надо поправить на ИД чара... который, я так думаю можно перехватить во вкладке "просмотр", но не совсем понял в каком формате это должно быть. Извиняюсь но прошу мне помочь :cry: какой формат этого ИД?
как это должно выглядеть в коце?
Спасиб за ответ. :) :good:
Я проставил везде в скрипте ник перса, но бот не работает... Порылся в проге (предупреждаю я не программист :oops: ) нашел строку
//MyID:string; //мой ИД
я так понял, что ее надо поправить на ИД чара... который, я так думаю можно перехватить во вкладке "просмотр", но не совсем понял в каком формате это должно быть. Извиняюсь но прошу мне помочь :cry: какой формат этого ИД?
как это должно выглядеть в коце?
Спасиб за ответ. :) :good:
то что стоит после "//" считается коментарием, тоесть программа это необрабатывает, и я кста не нашел в скрипте чтоб гденить свой ник надо было ставить
__________________
Я здесь практически не появляюсь!, Skype - ikskor
// КАЧ БОТ "ЛОКОМАТИВ" by VORON
...
//MyID:string; //мой ИД
...
begin
//берем в таргет вражину
...
SendToServerEX('ник');
//пиздим его
...
SendToServerEX('ник');
...
//запоминаем мобов из пакета NPCInfo (новый моб)
if FromServer and (ConnectName = 'ник') and (pck[1]=#$16) then
b......
Можно было конечно сделать что то вроде:
Код:
const
Name='ник'; //ник перса
var
...
begin
//берем в таргет вражину
...
SendToServerEX(Name);
//пиздим его
...
Но именно в скрипте Ворона стоит именно так.
Учусь помаленьку :).
А то что // - это комментарий который не обрабатывается я знаю ) еще не настолько потерян :)
подозреваю, что там надо было // убрать и проставить ИД своего чара, хотел пример.
ЗЫ спс за ответ
Я проставил везде в скрипте ник перса, но бот не работает... Порылся в проге (предупреждаю я не программист :oops: ) нашел строку
//MyID:string; //мой ИД
я так понял, что ее надо поправить на ИД чара... который, я так думаю можно перехватить во вкладке "просмотр", но не совсем понял в каком формате это должно быть. Извиняюсь но прошу мне помочь :cry: какой формат этого ИД?
как это должно выглядеть в коце?
Спасиб за ответ. :) :good:
Если тебе поможет, то там надо вводить радиус действия, он вводится отрезком с x1 потом пробежав вводишь x2. Также он может не корректно работать(вернее корректно , просто так задумано) если прибежав на локацию ты потом включаешь скрип то чар не будет находить мобов сразу. Надо чтоб скрипт вбил в массив этих мобов.
Лично у меня такой скрипт работает не по таймеру , когда моб умирает ждем когда придет пакет с удалением объекта, если это был наш объект в таргете то ищем следующего моба. А пока лежит мертвый бот можно и дроп поднять, свип провести, на и если тебя еще один моб бьет то можно перекинуть таргет на него.