//BOT GNOM SPOILER by elpy
//ДЛЯ АДАПТАЦИИ: 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 elpy
//привожу для примера скрипт который управляет сразу двумя ботами приэтом не палится управляющими командами на сервере.. объяснять как переделать именно под вас- нестану.. дабы не плодить ламеров-ботоводов.. скрипт приводится для того чтобы люди могли понять как управлять сразу несколькими ботами и при етом скрыть от сервера управляющие комманды.. скрипт протестирован и 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 elpy
//Версия 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.