PDA

Просмотр полной версии : ДА БУДЕТ БOT!


Страницы : [1] 2 3

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


//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,RadiusKach Yex: 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:EX TENDED;
frm:Tform;


//{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ОСНОВА МОЗГОВ БОТА}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
procedure OnTimer(Sender: TObject);
var
MinPutID:integer; //указывает индекс моба в базе путь до которого самый короткий
MinPutLenght:Extended; //квадрат расстояния до ближайшего моба
tempX1,tempY1,tempX2,tempY2,tempX3,tempY3,tempDelt aX,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,IDsu m3,IDAssistTarget: string;//ИД командира, 2-х ботов, и их сумонов
IDTargetBot1,IDTargetBot2,IDTargetBot3:string; //идешники таргетов у ботов
Sum1Present,Sum2Present,Sum3Present:BOOLEAN; // флаги присутствия самонов..
HPSUM11lim1,HPSUM11lim2,HPSUM21lim1,HPSUM21lim2,HP SUM31lim1,HPSUM31lim2,HPSUM12lim2,HPSUM13lim2,HPSU M22lim2,HPSUM23lim2,HPSUM32lim2,HPSUM33lim2,HPSUM1 2lim1,HPSUM13lim1,HPSUM22lim1,HPSUM23lim1,HPSUM32l im1,HPSUM33lim1,HPBOT1,HPBOT2,HPBOT3,HPKOMANDOS:in teger; //уровни срабатывания хила
Bot1X,Bot1Y,Bot1Z,Bot2X,Bot2Y,Bot2Z,Bot3X,Bot3Y,Bo t3Z:string;//координаты
IDBot1TargetForAttack,IDBot2TargetForAttack,IDBot3 TargetForAttack:string;//цели ботов для атаки
KomCurHP,Bot1CurHP,Bot2CurHP,Bot3CurHP,Bot1SumCurH P,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(D estX)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(Wal kSpeed)d(SwimRunSpeed)d(SwimWalkSpeed)d(FlRunSpeed )d(FlWalkSpeed)d(FlyRunSpeed)d(FlyWalkSpeed)f(Move mentSpeedMultiplier)f(AttackSpeedMultiplier)f(Coll isionRadius)f(CollisionHeight)d(HairStyle)d(HairCo lor)d(Face)d(AccessLevel)s(Title)d(ClanId)d(ClanCr estId)d(AllyId)d(AllyCrestId)d(SiegeFlags)b(Sittin g)b(Running)b(InCombat)b(AlikeDead)b(Invisible)b(M ountType)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(F eet)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(Ha ir)d(PAtk)d(PAtkSpd)d(PDef)d(EvasionRate)d(Accurac y)d(CritikalHit)d(MAtk)d(MAtkSpd)d(PAtkSpd)d(MDef) d(PvpFlag)d(Karma)d(RunSpeed)d(WalkSpeed)d(SwimRun Speed)d(SwimWalkSpeed)d(FlRunSpeed)d(FlWalkSpeed)d (FlyRunSpeed)d(FlyWalkSpeed)f(MovementSpeedMultipl ier)f(AttackSpeedMultiplier)f(CollisionRadius)f(Co llisionHeight)d(HairStyle)d(HairColor)d(Face)d(Acc essLevel)s(Title)d(ClanId)d(ClanCrestId)d(AllyId)d (AllyCrestId)d(IsClanLeader)b(MountType)b(PrivateS toreType)b(DwarvenCraft)d(PkKills)d(PvpKills)b(Cub ics)b(Cubics)b(FindPartyMembers)d(AbnormalEffect)b ()d(ClanPrivileges)d()d()d()d()d()d()d()b(RecomLef t)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(FlRu nSpd)d(FlWalkSpd)d(FlyRunSpd)d(FlyWalkSpd)f(Proper Multiplier)f(PAtkSpd)f(CollisionRadius)f(Collision Height)d(RHand)d(Unknown)d(LHand)b(Unknown)b(IsRun ning)b(IsInCombat)b(IsALikeDead)b(IsSummoned)s(Nam e)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(F eet)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(Ha ir)d(PAtk)d(PAtkSpd)d(PDef)d(EvasionRate)d(Accurac y)d(CritikalHit)d(MAtk)d(MAtkSpd)d(PAtkSpd)d(MDef) d(PvpFlag)d(Karma)d(RunSpeed)d(WalkSpeed)d(SwimRun Speed)d(SwimWalkSpeed)d(FlRunSpeed)d(FlWalkSpeed)d (FlyRunSpeed)d(FlyWalkSpeed)f(MovementSpeedMultipl ier)f(AttackSpeedMultiplier)f(CollisionRadius)f(Co llisionHeight)d(HairStyle)d(HairColor)d(Face)d(Acc essLevel)s(Title)d(ClanId)d(ClanCrestId)d(AllyId)d (AllyCrestId)d(IsClanLeader)b(MountType)b(PrivateS toreType)b(DwarvenCraft)d(PkKills)d(PvpKills)b(Cub ics)b(Cubics)b(FindPartyMembers)d(AbnormalEffect)b ()d(ClanPrivileges)d()d()d()d()d()d()d()b(RecomLef t)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(FlRu nSpd)d(FlWalkSpd)d(FlyRunSpd)d(FlyWalkSpd)f(Proper Multiplier)f(PAtkSpd)f(CollisionRadius)f(Collision Height)d(RHand)d(Unknown)d(LHand)b(Unknown)b(IsRun ning)b(IsInCombat)b(IsALikeDead)b(IsSummoned)s(Nam e)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.

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

Напишите ктонить Плз скрипт чтоб бд/свс брал пати танцевал/пел и выходил с пати

Гмм, как это ты, немного повозившись, понял? Понял, что скрипты мона писать? Или как? Так-то ее и используют для написания скриптов для саппортов(булок,бд,свс,просто ассист). Читай форум, разбирайся, просто так тебе никто ничего не напишет, только если этому кому-то самому понадобится бд/свс, а так можно просто взять готовый скрипт на баффера из этой темы, поменять баффы на песни/танцы и вход/выход из пати.

NLObP
07.10.2007, 20:41
Вот три моих скрипта на рыбалку. Реально работающих. Первые два относятся к прцессу рыбалки, а третий как вспомогательный. Почему в отдельных скриптах? Чтобы можно было тиражировать на сколько угодно чаров простым копированием и переименованием скриптов. Придумывал сам и использовал готовые скрипты. Спасибо всем.
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(it emType1)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(it emType1)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(Cur HP));
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.

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

Управлял так:
//передаем таргет
buf:=hstr('04') + IDAssistTarget + Bot1CoordX + Bot1CoordY +Bot1CoordZ + hstr('00');
SendToServerEX('NICK');
//передаем атаку чайником
buf:=hstr('45 16 00 00 00 00 00 00 00 00'); //
SendToServerEX('NICK');
end;

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

Добавлено спустя 2 минуты 46 секунд:
даже добавлю что IDAssistTarget надо брать из пакетов клиента командира (а не пакетов сервера).

ProFine
08.10.2007, 11:08
IDAssistTarget берется так, есть 2 чара допустим крафтер и лукарь. так вот я кликаю на моба лукарем получаю ID моба (затем IDAssistTarget:=ID) а затем с этим IDAssistTarget поступаю как писал выше, тоесть эмулирую команды самого крафтера.

Agat
08.10.2007, 14:41
// КАЧ БОТ "ЛОКОМАТИВ" by VORON
...
...
...
Я проставил везде в скрипте ник перса, но бот не работает... Порылся в проге (предупреждаю я не программист :oops: ) нашел строку
//MyID:string; //мой ИД
я так понял, что ее надо поправить на ИД чара... который, я так думаю можно перехватить во вкладке "просмотр", но не совсем понял в каком формате это должно быть. Извиняюсь но прошу мне помочь :cry: какой формат этого ИД?
как это должно выглядеть в коце?
Спасиб за ответ. :) :good:

xkor
08.10.2007, 15:03
Я проставил везде в скрипте ник перса, но бот не работает... Порылся в проге (предупреждаю я не программист :oops: ) нашел строку
//MyID:string; //мой ИД
я так понял, что ее надо поправить на ИД чара... который, я так думаю можно перехватить во вкладке "просмотр", но не совсем понял в каком формате это должно быть. Извиняюсь но прошу мне помочь :cry: какой формат этого ИД?
как это должно выглядеть в коце?
Спасиб за ответ. :) :good:
то что стоит после "//" считается коментарием, тоесть программа это необрабатывает, и я кста не нашел в скрипте чтоб гденить свой ник надо было ставить

Agat
08.10.2007, 18:04
// КАЧ БОТ "ЛОКОМАТИВ" by VORON
...
//MyID:string; //мой ИД
...
begin
//берем в таргет вражину
...
SendToServerEX('ник');
//пиздим его
...
SendToServerEX('ник');
...
//запоминаем мобов из пакета NPCInfo (новый моб)
if FromServer and (ConnectName = 'ник') and (pck[1]=#$16) then
b......

Можно было конечно сделать что то вроде:
const
Name='ник'; //ник перса
var
...
begin
//берем в таргет вражину
...
SendToServerEX(Name);
//пиздим его
...
Но именно в скрипте Ворона стоит именно так.
Учусь помаленьку :).
А то что // - это комментарий который не обрабатывается я знаю ) еще не настолько потерян :)
подозреваю, что там надо было // убрать и проставить ИД своего чара, хотел пример.
ЗЫ спс за ответ

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

VORON
09.10.2007, 06:01
Если тебе поможет, то там надо вводить радиус действия, он вводится отрезком с x1 потом пробежав вводишь x2. Также он может не корректно работать(вернее корректно , просто так задумано) если прибежав на локацию ты потом включаешь скрип то чар не будет находить мобов сразу. Надо чтоб скрипт вбил в массив этих мобов.
Лично у меня такой скрипт работает не по таймеру , когда моб умирает ждем когда придет пакет с удалением объекта, если это был наш объект в таргете то ищем следующего моба. А пока лежит мертвый бот можно и дроп поднять, свип провести, на и если тебя еще один моб бьет то можно перекинуть таргет на него.
спасибо друг! за помощ в развитии темы.. дело в том что я етот скрипт написал протестировал но потом забросил его.. он скучный..
1- НИКОГДА БОТ не заменит живого чара...
2- смысл игры теряется..
я люблю сам геймить-)))
я щас перед очень протиивным выбором.. у меня 3 самонера прокаченых до 78 лвл и вакраер 78 лвл на рейтах х3..
и я реально почувствовал что ета пати крута на каче.. крута на пвп но.. ето все не то...
вот еслиб у меня было 1 ШЕ 78+3 разных МАГА!!! вот ето вещ былабы
я уже протестировал скрипт для ШЕ для управления 3-мя магами.. ето бомба... кач- ураган.. про пвп ваще молчу..
враги разбегаются.. 3 мага сносят всех.. к ним подходить страшно..
а фишка вся в том что когда я их прокачаю-)) то смогу использовать ЕЛЕМЕНТАЛЬНЫЙ ШТОРМ!!!!!!!!!!!!!
в реальности етот скил никто не применяет изза сложности его исползования.. 3 разных мага должны бафнуть бруг бруга и за 5 секунд успеть стрельнуть... с помощью скрипта- я ето легко реализую-))) и ттогда я стану богом-)
ну и вам желаю того же....

mks
09.10.2007, 11:02
а фишка вся в том что когда я их прокачаю-)) то смогу использовать ЕЛЕМЕНТАЛЬНЫЙ ШТОРМ!!!!!!!!!!!!!
в реальности етот скил никто не применяет изза сложности его исползования.. 3 разных мага должны бафнуть бруг бруга и за 5 секунд успеть стрельнуть... с помощью скрипта- я ето легко реализую-))) и ттогда я стану богом-)

это будет не сложно реализовать скриптом, а в действии должно быть красиво))
ЗЫ хорошо вам, а мне ща приходится играть честно, с защитой пока не могу ниче поделать(

Agat
09.10.2007, 12:57
ProFine
Спасибо за ответ - этого незнал, проверю вечером.
VORON
Вообще я не для кача этот скрипт делаю а для прохождения квестов на ресурсы, приходится обходится без помощи клана т.к. сам всегда все отдаю на крафт сокланам, а просить стесняюсь (мне проще вмз).
А про ник какой всетаки ответ? Не надо убирать "//"? Или всетаки надо? Если да, то как править то?
mks
у меня кроме помощника ПВП (только на юзанье ЦП, почемуто на ХП не работает часть) и открытия дверей ничего не получается :) (специально пишу не "непашет" а неполучается т.к. дело скорее всего в моей кривости рук и клиенте Интерлюд).
Торжественно обещаю помочь проекту на днях.

09.10.2007, 13:04
Меня вот интересует,как настроить бота на стдачу манора.может ктонить в краце обьяснить?

Agat
09.10.2007, 13:14
1. За минуту до объявления Олимпиады ставишь галочку напротив скрипта "сдача манора". :wink:
2. Сразу у нпц пытаешься сдать манор. Выдаст ошибку. :shock: Это нормально.
3. Ждешь 8) .
4. Пропиваешь ресурсы :beer:

Agat
09.10.2007, 13:52
Ты что не читаешь? :)
В верху есть скрипт (первое сообщение, четвертое окно
///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.
Сохраняешь в текстовой файл в папке с программой (папка "Scripts").
В последней вкладке программы "Скрипты" после запуска программы в списке скриптов появится имя твоего файла, поздравляю - это твой скрипт на сдачу манора.
Далее как я описал ранее.

fox
10.10.2007, 06:11
а фишка вся в том что когда я их прокачаю-)) то смогу использовать ЕЛЕМЕНТАЛЬНЫЙ ШТОРМ!!!!!!!!!!!!!
в реальности етот скил никто не применяет изза сложности его исползования.. 3 разных мага должны бафнуть бруг бруга и за 5 секунд успеть стрельнуть... с помощью скрипта- я ето легко реализую-))) и ттогда я стану богом-)
ну и вам желаю того же....
чет не помню точно, но вроде для элементала нужно 3 разных сида. а так как на себя сид нельзя кинуть то получается что нужно 4 мага. да и откат у сидов минут 5 или 10 и у самого шторма откат тоже не малый. именно поэтому его не юзают, гемороя много, а толку мало. только на РБ демон винд используется, и то только потому что останавливает реген хп.

Grinch
10.10.2007, 10:42
наглый вопрос народ вот я играю в 3 окна С ШЕ всё понятно с ПП не очень как реализовать макрос баф или нет такой фонукции нажать на панель F5 допустим просто очень было б удобно.
возможно сделать так что Б ше рутила всех мобов которые приближаются ко мне на радиус 300 допустим типа команда all_300 :) просто очень удобно было бы жахаешь в толпу и не паришся что кто то до тя добежит :) если кто то реализует или подскажет как можно реальзовать биг спасибо скажу .
ЗЫ програмер я никакой могу редактировать скрипты додумывать логику разробатывать в скрипте но не програмить если будет много коментариев я ток за.

Grinch
10.10.2007, 20:48
лутьше ту фишку с фреймом врубить в нутри поста что б прокрутка была

Добавлено спустя 1 час 45 минут 38 секунд:
у меня есть мысл убейте её если где то есть касяк или реализуйте.
БОТ когда я бегаю между НПЦ и разговариваю с ними то получается что я отправляю какой то пакет типа жму да мне падает 1 итемчик другой прападает. Вопрос в следущем а обязательно бегать между НПЦ что б нажать ДА? или можно отправить пакет и забить на дорогу до НПЦ
ЗЫ кто не понял это квест на Ы рецепты бижи

xkor
10.10.2007, 21:52
Grinch, диалоги восновном привязаны к нпц так что невыйдет...

Agat
11.10.2007, 18:00
читай выше:
Grinch, диалоги восновном привязаны к нпц так что невыйдет...

HooleeCheeter
12.10.2007, 16:40
а как будет выглядик скрипт но то чтоб :
1 Покупал 20 итемов пакет =SKIP=
2 Продавал 20 итемов которые купил
просто у нас на сервере ГМ шоп багонутый :P а клацать уже надоело
купить то купит, а продавать замаеца, ибо у купленного будет меняца ID. на Интерлюде яве так по крайней мере.

Добавлено спустя 2 минуты 13 секунд:
Re: ДА БУДЕТ БОТ!
помогите адаптировать скрипт "инвентаризации" выложенный на старом фоурме, под IT яву. неделю уже бь.сь, ниче не поулчается (
зы: VORON , ты обешал как появится свободное время, покопаться в скрипте на автоенчант :oops:

NLObP
12.10.2007, 20:34
а как будет выглядик скрипт но то чтоб :
1 Покупал 20 итемов пакет =SKIP=
2 Продавал 20 итемов которые купил
просто у нас на сервере ГМ шоп багонутый :P а клацать уже надоело
купить то купит, а продавать замаеца, ибо у купленного будет меняца ID. на Интерлюде яве так по крайней мере.


У вещей ItemID всегда постоянный, а ObjectID разный. Вот по ItemID и надо находить свои вещи в инвентаре.
Есть функция GetObjID(ItemID) или подобная, которая возвращает ObjectID. Сделай перебор в цикле, пока не найдешь все нужные вещи. Сохрани в массиве. Потом с ними будешь работать.

помогите адаптировать скрипт "инвентаризации" выложенный на старом фоурме, под IT яву. неделю уже бь.сь, ниче не поулчается (
зы: VORON , ты обешал как появится свободное время, покопаться в скрипте на автоенчант :oops:

Что конкретно и в каком скрипте, пиши. Может подскажем, что не правильно.
А я выкладывал здесь доработанный скрипт на заточку, который точит все вещи с одним ItemID вне зависимости от ObjectID. Не смотрел?

HooleeCheeter
12.10.2007, 20:40
А я выкладывал здесь доработанный скрипт на заточку, который точит все вещи с одним ItemID вне зависимости от ODjID. Не смотрел?
я именно про него и говорю ) про твой.

NLObP
12.10.2007, 21:38
А я выкладывал здесь доработанный скрипт на заточку, который точит все вещи с одним ItemID вне зависимости от ODjID. Не смотрел?
я именно про него и говорю ) про твой.

Что именно не работатет? Это необходимо поправить под свои условия. У меня на С4 яве точит, не всегда правда с первого раза до необходимого уровня, но у меня и не ПвП сервер.
const
Name='NLObP';
Scroll=957; // 957 - ItemID Crystall Scroll Enchant Weapon (Grade D)
Weapon=129; // 129 - ItemID Sword of Revolution
MaxEnchLvl=20; //max уровень заточки

Добавлено спустя 49 минут 38 секунд:
Re: ДА БУДЕТ БОТ!
при включении скрипта на рыбалку выдается ошибка access violation at address 00528F70 in module 'l2ph.exe'. Read of address 00000000. и что делать я незнаю помочь можешь?

У меня эту ошибку выдает, когда нет подключения к серверу. В списке соединения должно быть имя чара.

HooleeCheeter
13.10.2007, 17:09
Что именно не работатет? Это необходимо поправить под свои условия. У меня на С4 яве точит, не всегда правда с первого раза до необходимого уровня, но у меня и не ПвП сервер.
вот тут http://xkorem.net/vbforum/showthread.php?t=221&page=16 мы писали что даже если ID прописать, в ервый запуск он активирует заточку и все, а в впоследующие пишет "нет такого скролла".

NLObP
13.10.2007, 20:19
Я здесь выкладывал другой скрипт на заточку, он тоже не работатет?
Напиши свои WeaponID, ScrollID, названия предметов, пакеты от сервера 1B, 27

ЗЫЖ
max=250; //max количество предметов в базе (количество ячеек в инвентаре)

HooleeCheeter
13.10.2007, 21:25
Я здесь выкладывал другой скрипт на заточку, он тоже не работатет?
Напиши свои WeaponID, ScrollID, названия предметов, пакеты от сервера 1B, 27

ЗЫЖ
max=250; //max количество предметов в базе (количество ячеек в инвентаре)
я нашёл только 1 :O

//Автоматизация заточки для PVP серверов... by NLObP
//Работа проверена на 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
Scroll=957; // ItemID Crystall Scroll Enchant Weapon (Grade D)
Weapon=129; // ItemID Sword of Revolution
MaxEnchLvl=5;

var
ItemBase: array of integer;
add: boolean;
ListCount: Integer;
Cmd:String;
timer: TTimer;

procedure Init; //Вызывается при включении скрипта
begin
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimerHP;
timer.enabled:=false;
timer.interval:=1000; //время задержки
add:=false;
SendMsg('Начало инициализации скрипта, откройте инвентарь');
end;

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

procedure SendMsg(msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(msg);
SendToClient;
end;

procedure CreateItemBase; //Создает базу ObjectID и ItemID, опять же не проверяет пакет на правильность для экономия ресурсов
var
i,j: integer;
begin
j:=4; //смещение для ListCount
ListCount:=ReadH(j); //количество итемов
SetLength(ItemBase,ListCount*2); //размер массива должен быть в 2 раза больше, чем итемов
j:=8; //смещение для ObjectID
//Пробегаем по Инвентарю и сохраняем пары ObjectID - ItemID
for i:=0 to ListCount-1 do begin
ItemBase[i*2]:=ReadD(j); //ObjectID
ItemBase[i*2+1]:=ReadD(j); //ItemID
j:=j+20;
end;
end;

procedure UpdateItemBase; //Создает базу ObjectID и ItemID, опять же не проверяет пакет на правильность для экономия ресурсов
var
i, ii, tmp, j, Count, ObjID, ItID, UpdType: integer;
begin
Count:=ReadH(2); //количество итемов
//Пробегаем по Инвентарю и сохраняем пары ObjectID - ItemID
j:=4; //смещение для действия с предметом 1-добавлен 2-изменен 3-удален
for i:=0 to Count-1 do begin
UpdType:=ReadH(j);
j:=j+2;
ObjID:=ReadD(j);
ItID:=ReadD(j);
if (UpdType=3) then begin
for ii:=0 to ListCount-1 do begin
//находим подходящий предмет
if (ItemBase[ii*2]=ObjID) then begin
ItemBase[ii*2]:=0;
ItemBase[ii*2+1]:=0;
end;
end;
end
else begin
for ii:=0 to ListCount-1 do begin
if (UpdType=1) and (ItemBase[ii*2]=0) then begin
ItemBase[ii*2]:=ObjID;
ItemBase[ii*2+1]:=ItID;
add:=false;
exit;
end else if (UpdType=1) then add:=true;
end;
end;
j:=j+18; //следующее смещение для действия с предметом
end;
if add=true then begin
ListCount:=ListCount+1; //количество итемов
SetLength(ItemBase,ListCount*2); //размер массива должен быть в 2 раза больше, чем итемов
ItemBase[(ListCount-1)*2]:=ObjID;
ItemBase[(ListCount-1)*2+1]:=ItID;
add:=false;
end;
end;

function GetObjID(ItemID:integer): integer; //Выдает ObjectID по его ItemID, если ItemID не найден в базе, выдает -1
var
i: integer;
begin
for i:=0 to ListCount-1 do
//находим первый подходящий предмет
if (ItemBase[i*2+1]=ItemID) then begin
Result:=ItemBase[i*2];
Exit;
end;
Result:=-1;
end;

procedure UseItem(ObjectID: integer);
begin
buf:=#$14;
WriteD(ObjectID);
WriteD(0);
SendToServer;
end;

procedure RequesEnchantItem(ObjectID: integer);
begin
buf:=#$58;
WriteD(ObjectID);
SendToServer;
end;

procedure TryEnchantWeapon;
begin
if GetObjID(Scroll)=-1 then begin
SendMsg('Нет такого скролла! Прервано!');
timer.enabled:=false;
exit;
end;
UseItem(GetObjID(Scroll));
if GetObjID(Weapon)=-1 then begin
SendMsg('Нет такого оружия! Прервано!');
timer.enabled:=false;
exit;
end;
RequesEnchantItem(GetObjID(Weapon));
end;

procedure OnTimerHP(Sender: TObject);
begin
TryEnchantWeapon;
end;

//************************************************** ****
// вызывается при приходе каждого пакета, если скрипт включен
//************************************************** ****
begin
//не обрабатываем пустые пакеты
if pck='' then exit;
//************************************************** **
//социальное действие yes для начало точки
if FromClient and (pck=HStr('1B 06 00 00 00')) then begin
SendMsg('Начинаем точить всё оружие!!!');
timer.enabled:=true;
end;
//социальное действие no для окончания
if FromClient and (pck=HStr('1B 05 00 00 00')) then begin
SendMsg('Окончили точить всё оружие!!!');
timer.enabled:=false;
end;
//ItemList
if FromServer and (pck[1]=#$1B) then CreateItemBase; //создание базы предметов
if (length(ItemBase)=0) then exit; //если нет базы итемов, скрипт дальше не пустит

//если удалились предметы, стираем в базе предметов пары ObjectID - ItemID
if FromServer and (pck[1]=#$27) then UpdateItemBase; //Обновление базы, если принят пакет на удаление предмета

//************************************************** ***
//Команды отладки
//************************************************** ***
//пакет Say2
if FromClient and (pck[1]=#$38) then begin
Cmd:=ReadS(2);
case Cmd of
'1':
begin
pck:='';
//Dump;
end;
'2':
begin
pck:='';
TryEnchantWeapon;
//Dump;
end;
end;
exit;
end;
//************************************************** **

end.

NLObP
13.10.2007, 21:56
Я на 1 странице топика выложил новые скрипты на рыбалку, заточку, тренировка дракона. Смотри внимательно. Попробуй, напиши результат.

HooleeCheeter
14.10.2007, 15:11
сложно ли модифицировать скрипт, чтобы он точил всего 2 веши блессед заточками. допустим поочереди варяца до 13 , 1ая ломается , и точится только она, пока не станет опять 13, и потом опять поочереди?

NLObP
14.10.2007, 16:51
сложно ли модифицировать скрипт, чтобы он точил всего 2 веши блессед заточками. допустим поочереди варяца до 13 , 1ая ломается , и точится только она, пока не станет опять 13, и потом опять поочереди?
Скрипт так и задуман. Точатся все предметы начиная с минималоного уровня до самого максимума. Пусть есть 1, 5 и 13 уровня. Точится с 1 до 5, потом два предмета до 13, а затем три с 13 уровня. В конце всегда остается хотябы один предмет.

HooleeCheeter
14.10.2007, 17:46
похоже я нашёл в чем дело ...
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;
там нужно поставить "<=", сейчас поднимут сервак проверю.

Добавлено спустя 20 минут 40 секунд:
Re: ДА БУДЕТ БОТ!
именно в это и было дело )

DeVolf
15.10.2007, 16:14
//Автоматизация заточки предметов до необходимого уровня 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='DeVolf';
Scroll=959; // ItemID Scroll Enchant Weapon (Grade S)
Weapon=6579; // ItemID Arcana Mace
MaxEnchLvl=10; //max уровень заточки
max=100; //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;
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; //следующее смещение для действия с предметом 1-добавлен 2-изменен 3-удален
end;
Say('>>ColvoWpn='+IntToStr(ColvoWpn)+' ColvoScrl='+IntToStr(ColvoScrl)+' CurEnchLvl='+IntToStr(CurEnchLvl));
end;
//************************************************** ****************************
function GetNextWeapon: integer; //Выдает ObjID предмета, если не найден в базе, выдает -1,
//достигли макс уровня заточки -2, подбираем мин текущий уровень заточки -3
var
i: integer;
begin
Result:=-1;
if CurEnchLvl>=MaxEnchLvl then begin
Result:=-2;
exit;
end;
for i:=1 to max do begin
//находим первый подходящий предмет
if (WpnBase[1,i]<>0) and (WpnBase[2,i]<=CurEnchLvl) then begin
Result:=WpnBase[1,i];
exit;
end;
end;
CurEnchLvl:=CurEnchLvl+1;
Result:=-3;
end;
//************************************************** ****************************
function GetNextScroll: integer; //Выдает ObjID скролла, если не найден в базе, выдает -1
var
i: integer;
begin
Result:=-1;
for i:=1 to max do begin
//находим первый подходящий предмет
if (ScrlBase[i]<>0) then begin
Result:=ScrlBase[i];
exit;
end;
end;
end;
//************************************************** ****************************
procedure UseItem(ObjectID: integer);
begin
buf:=#$14;
WriteD(ObjectID);
WriteD(0);
SendToServerEx(Name);
end;
//************************************************** ****************************
procedure RequesEnchantItem(ObjectID: integer);
begin
buf:=#$58;
WriteD(ObjectID);
SendToServerEx(Name);
end;
//************************************************** ****************************
procedure OnTimerHP(Sender: TObject);
var
wpn, scrl:integer;
begin
if ColvoScrl=0 then begin
Say('Кончились скроллы! Прервано!');
timer.enabled:=false;
exit;
end;
if ColvoWpn=1 then begin
Say('Остался последний предмет! Прервано!');
timer.enabled:=false;
exit;
end;
Scrl:=GetNextScroll;
if scrl=-1 then begin
Say('Нет такой заточки! Прервано!');
timer.enabled:=false;
exit;
end;
Wpn:=GetNextWeapon;
case wpn of
-1: begin
Say('Нет такого предмета! Прервано!');
timer.enabled:=false;
exit;
end;
-2: begin
Say('Достигли максимальный уровень заточки! Прервано!');
timer.enabled:=false;
exit;
end;
-3: begin
//Say('Подбираем текущий уровень заточки!');
timer.enabled:=true;
exit;
end;
end;
//************************************************
UseItem(Scrl);
RequesEnchantItem(Wpn);
//************************************************
Say('Заточили предмет! Weapon='+IntToStr(Wpn));
end;
//************************************************** ****************************
// вызывается при приходе каждого пакета, если скрипт включен
//************************************************** ****************************
begin
//************************************************** **************************
//не обрабатываем пустые пакеты
if pck='' then exit;
//************************************************** **************************
//социальное действие yes для начало точки
if FromClient and (ConnectName=Name) and (pck=HStr('1B 06 00 00 00')) then begin
CurEnchLvl:=0;
Say('Команда Старт!!!');
timer.enabled:=true;
end;
//************************************************** **************************
//социальное действие no для начало точки
if FromClient and (ConnectName=Name) and (pck=HStr('1B 05 00 00 00')) then begin
Say('Команда Стоп!!!');
timer.enabled:=false;
end;
//************************************************** **************************
//ItemList
if FromServer and (ConnectName=Name) and (pck[1]=#$1B) then CreateItemBase; //создание базы предметов
// if (ColvoWpn=0) or (ColvoScrl=0) then exit; //если нет базы итемов, скрипт дальше не пустит
//************************************************** **************************
//если удалились предметы, стираем в базе предметов пары ObjectID - ItemID
if FromServer and (ConnectName=Name) and (pck[1]=#$27) then UpdateItemBase; //Обновление базы, если принят пакет на удаление предмета
end.

усе подставил всеравно говорить что кончились скролы

NLObP
16.10.2007, 02:06
Для серверов Интерлюдии, необходимо поправить скрипт в двух метсах, из-за отличий пакетов.
//Автоматизация заточки предметов до необходимого уровня by NLObP
[skipped]
//************************************************** ****************************
procedure CreateItemBase; //пакет 1B, Создает базу ObjectID по ItemID
[skipped]
// j:=j+2;
j:=j+10; //заменить на это
[skipped]
end;
//************************************************** ****************************
procedure UpdateItemBase; //пакет 27, Создает базу ObjectID по ItemID
[skipped]
// j:=j+2; //следующее смещение для действия с предметом 1-добавлен 2-изменен 3-удален
j:=j+10; //заменить на это
[skipped]
end;

DeVolf
16.10.2007, 17:18
не помогло( :(

VORON
18.10.2007, 06:04
Скоро писать буду объяснительную.
Ворон ответь плз на вопрос:
в скрипте на качь ботом локомотив есть строка
//MyID:string; //мой ИД
наде ее править? если да, то примерный вид исправленной строки.
Спс за ответ
зачем ее править?

Добавлено спустя 11 минут 8 секунд:
может сделать каждый скрипт в отдельной теме и все эти темы в новый подфорум положить?, а то первый пост какойто очень большой получается...
да.. наверно так и стоит сделать без шуток... отя я люблю шутитьь но..
при етом в каждом топике будет отдельный скрипт обсуждаться..
тем расплодится- милиоон
и каждая из етих топов просто тупо расплодится
начнутся новые темы...
и старенькие темы со скриптами уедутв в низ ( на вторую или 3-б страницу)
я и ты ето контролировать не можем
единственное что мы можем ето прикрепить тему
но ты хочеш читать там ггде 20 тем прикреплено?
а когда товарищи из топа КУСКИ КОДОВ тоже начнут темы- плодить?
что произойдет?
КОЛАПС!
ТЕРМОЯДЕРНАЯ РЕАКЦИЯ!

Юля
18.10.2007, 13:05
кому интересно, вот примитивные сурсы на delphi для примитивного бота ловли рыбы в in-game режиме; полезно если на вашем сервере (как на моем бывшем) идет шифрование трафика и такие веши как l2phx бесполезны. пример для ознакомления, полного бота все же не буду выкладывать, кому надо сами доделают, но и этого вполне достаточно для ловли под контролем или для ознакомления.

суть проста, программа перехватывает обработку пакетов рыбалки в engine.dll (приведенные в ней адреса валидны только для клиента С4) и на основе ее "кликает" по панели где расположены значки для ловли рыбки. или просто показывает, что нужно нажать вам, если вы не в автоматическом режиме. да, эта версия не проверяет ID, так что ловите в одиночестве только :)

ссылка: http://dump.ru/files/n/n3863714963/ (http://dump.ru/files/n/n3863714963/)

p.s. если увижу в подполках (читворда или лолчита) это от вашего имени, не сносить кому-то головы, поверте мне :)

dmitry501
19.10.2007, 07:00
кому интересно, вот примитивные сурсы на delphi для примитивного бота ловли рыбы в in-game режиме; полезно если на вашем сервере (как на моем бывшем) идет шифрование трафика и такие веши как l2phx бесполезны. пример для ознакомления, полного бота все же не буду выкладывать, кому надо сами доделают, но и этого вполне достаточно для ловли под контролем или для ознакомления.

суть проста, программа перехватывает обработку пакетов рыбалки в engine.dll (приведенные в ней адреса валидны только для клиента С4) и на основе ее "кликает" по панели где расположены значки для ловли рыбки. или просто показывает, что нужно нажать вам, если вы не в автоматическом режиме. да, эта версия не проверяет ID, так что ловите в одиночестве только :)

ссылка: http://dump.ru/files/n/n3863714963/ (http://dump.ru/files/n/n3863714963/)

p.s. если увижу в подполках (читворда или лолчита) это от вашего имени, не сносить кому-то головы, поверте мне :)

Спасибо большое :) А можно еще красивые компонентики TWinXPButton, TL2Button?
А еще лучше конечно же поиметь бы информпацию по клиенту, используемым точкам входам и пр. Я конечно понимаю, что это большая ценность, но вдруг? Вот для сервера С4 например ссылка: http://dll.misie.org/functions.txt (http://dll.misie.org/functions.txt)

Юля
19.10.2007, 15:12
Спасибо большое А можно еще красивые компонентики TWinXPButton, TL2Button?
[attachment=0:83bce]L2Controls.rar[/attachment:83bce]

А еще лучше конечно же поиметь бы информпацию по клиенту, используемым точкам входам и пр.
У меня ничего подобного нет, все просто самостоятельно ишется с помошью SoftICE и OllyDbg ;)

19.10.2007, 18:47
Юля, а для чего нужно к процессу атачиться при посылке нажатия клавиш?

Grinch
20.10.2007, 21:16
You do not have enough adena вот такая надпись появляется когда сдаю манор, у кого нет денег у меня или у замка просвитите плиз нуба :)

DO12
21.10.2007, 01:37
Собсно здрасте!)
Я люблю рыбалку... (с) Не помню откуда
Так вот, использую скрипт на рыбалку в таком виде + к ниму скрипт на хилки
//Автоматизация ловли рыбы by NLObP

//Работа проверена на 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
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
Cmd:String;
timer1: TTimer;
status:boolean;
Attacker, CharID, ObjectID, SocialID, ItemID, CoordX, CoordY, CoordZ: Integer;

procedure Init; //Вызывается при включении скрипта
begin
ItemID:=0;
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer1;
timer1.enabled:=false;
timer1.interval:=1800; //время задержки
//SendMsg('Начало ловли рыбы социальное действие Yes');
end;

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

procedure SendMsg(msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(msg);
SendToClient;
end;

procedure TargetAttacker(Attacker: Integer);
begin
SendMsg('AttackerID='+IntToStr(Attacker)+' PlayerID='+IntToStr(CharID));
timer1.enabled:=false;
buf:=#$04;
WriteD(Attacker);
WriteD(CoordX);
WriteD(CoordY);
WriteD(CoordZ);
WriteC(00);
SendToServer;
end;

Procedure SaveCoord;
var
i: integer;
begin
//запоминаем свои координаты
i:=2;
CoordX:=ReadD(i);
CoordY:=ReadD(i);
CoordZ:=ReadD(i);
end;

procedure Fishing;
begin
buf:=HStr(fish);
SendToServer;
end;

procedure FishShot;
begin
buf:=#$14;
WriteD(ItemID);
WriteD(00);
SendToServer;
end;

procedure Pumping;
begin
FishShot;
buf:=HStr(pump);
SendToServer;
end;

procedure Reeling;
begin
FishShot;
buf:=HStr(reel);
SendToServer;
end;

procedure OnTimer1(Sender: TObject);
begin
Fishing;
timer1.enabled:=false;
//SendMsg('Fishing');
end;

//************************************************** ****************************
// вызывается при приходе каждого пакета, если скрипт включен
//************************************************** ****************************
begin
//не обрабатываем пустые пакеты
if pck='' then exit;
//************************************************** **************************
//Первым делом включаем Fishing Shot
if FromServer and (pck[1]=#$27) and (ItemID=0) then begin //idItem'a который мы хотим юзать
ItemID:=ReadD(8);
end;
if FromServer and (pck[1]=#$04) then
CharID:=ReadD(18);
if FromClient and (pck[1]=#$1B) then
begin
SocialID:=ReadD(2);
case SocialID of
//социальное действие Yes для начала ловли
6:begin
Status:=true;
Fishing;
end;
//социальное действие No для окончания
5:begin
Status:=false;
timer1.enabled:=false;
end;
end;
end;
if Status=true then begin
//MagicSkillUse 48, Attack 05
if FromServer and ((pck[1]=#$48) or (pck[1]=#$05)) then begin
Attacker:=ReadD(2);
ObjectID:=ReadD(6);
end;
//пакет ValidatePosition с кординатами
if FromClient and (pck[1]=#$48) then SaveCoord;
//Если мы попали в таргет или атакуемся магией
//if (Attacker<>ObjectID) and (CharID=ObjectID) then TargetAttacker(Attacker);
//FishinHPRegen
if FromServer and (pck[1]+pck[2]=#$FE#$16) and (pck[16]=#$00) then Pumping;
if FromServer and (pck[1]+pck[2]=#$FE#$16) and (pck[16]=#$01) then Reeling;
//FishingEnd
if FromServer and (pck[1]+pck[2]=#$FE#$14) then timer1.enabled:=true;
end
else exit;
end.
Рыба ловится не взирая на вылезающих мобов, всё казалось бы зашибись, кроме одного, достаточно часто вылезают 2 моба под ряд (Одного моба протягивает простая хилка), и всёб хорошо, грейтер хилка их протягивает, но я ЖАДНЫЙ и мне не хочется трарить денюжки заработаные не честным путём на то, чтоб заробатывать дальше)
Вопрос заключается в следующем: Возможно ли сделать так, чтобы когда значение ХП было ниже максимума, рыба ловиься переставала, и снова начинала при полном восстановлении?

Юля
21.10.2007, 04:15
Юля, а для чего нужно к процессу атачиться при посылке нажатия клавиш?
а, не вырезанный момент, SetKeyboardState использовала, а там без пристыковки нельзя. не обрашай внимания.

NLObP
21.10.2007, 04:36
Собсно здрасте!)
Я люблю рыбалку... (с) Не помню откуда
Так вот, использую скрипт на рыбалку в таком виде + к ниму скрипт на хилки

Посмотри в этой теме на 1 странице более свежий скрипт на рыбалку. В нем проверяется количество крючков и шотов. В остальном алгоритм тот же.

Рыба ловится не взирая на вылезающих мобов, всё казалось бы зашибись, кроме одного, достаточно часто вылезают 2 моба под ряд (Одного моба протягивает простая хилка), и всёб хорошо, грейтер хилка их протягивает, но я ЖАДНЫЙ и мне не хочется трарить денюжки заработаные не честным путём на то, чтоб заробатывать дальше) Вопрос заключается в следующем: Возможно ли сделать так, чтобы когда значение ХП было ниже максимума, рыба ловиься переставала, и снова начинала при полном восстановлении?

А это вариант для чаров, которые могут сами себя лечить:
//Автоматизация ловли рыбы by NLObP

//Возможность работы нескольких одновременных скриптов
//Добавлена проверка на кол-во крючков и шотов.
//Доработанная на предмет лечения самого себя

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

//Необходимо затариться удочкой и крючками, шотами
//выучить соответствующие скиллы

//1 одеть и снять: удочку, крючек для определения ObjectID
//2 в процессе рыбалки использовать один раз фишин-шот для определения ObjectID
//3 делаем таргет на себя для лечения

//Социальное действие 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'; //исправить на имя чара
heal=1218; //Greater Battle Heal
fish=1312;
pump=1313;
reel=1314;

//************************************************** ****************************
var
timer: TTimer;
TimerHP: TTimer;
TimerMOB: TTimer;
status, status2, ScrInUse, UnderAttack: boolean;
Cmd, Lure, ColvoLure, Shot, ColvoShot, CharObjID: Integer;
CurMP, MaxMP, MaxHP, CurHP: integer;
//************************************************** ****************************
// Вызывается при включении скрипта
//************************************************** ****************************
procedure Init;
begin
Shot:=0;
UnderAttack:=false;
Status:=false; //в процессе рыбалки или нет?
Status2:=false; //показывает, что скрипт готов к работе
ScrInUse:=false; //скрипт отключен
CharObjID:=0; //идентификатор ловца

timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimer;
timer.enabled:=false;
timer.interval:=10000; //время задержки (сделать достаточно большое, чтобы среагировать на атаку моба)

timerHP:=TTimer.Create(nil);
timerHP.OnTimer:=@OnTimerHP;
timerHP.enabled:=false;
timerHP.interval:=5000; //время между попытками лечиться

timerMOB:=TTimer.Create(nil);
timerMOB.OnTimer:=@OnTimerMOB;
timerMOB.enabled:=false;
timerMOB.interval:=60000; //ждем примерно минуту, пока моб нас колбасит

Say('1 одеть и снять: удочку, крючек!');
Say('2 в процессе рыбалки использовать один раз фишин-шот!');
Say('3 сделать таргет на себя для самолечения!');
end;

//************************************************** ****************************
// Вызывается при выключении скрипта
//************************************************** ****************************
procedure Free;
begin
timer.Free;
timerHP.Free;
timerMOB.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 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);
MaxMP:=ReadD(i);
CurMP:=ReadD(i);
if ScrInUse then begin
if not UnderAttack then begin
if (CurHP<MaxHP) then begin
timer.enabled:=false; //выключаем задержку между забросами
Status:=false;
TimerHP.enabled:=true;
TimerMOB.enabled:=true;
UnderAttack:=true;
end
else begin
if status=false then begin
TimerHP.enabled:=false;
timer.enabled:=true; //включаем задержку между забросами
end;
end;
end;
end;
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);
#$0B: CurMP:=ReadD(i*8+14);
#$0C: MaxMP:=ReadD(i*8+14);
end;
end;
if ScrInUse then begin
if not UnderAttack then begin
if (CurHP<MaxHP) then begin
timer.enabled:=false; //выключаем задержку между забросами
Status:=false;
TimerHP.enabled:=true;
TimerMOB.enabled:=true;
UnderAttack:=true;
end
else begin
if status=false then begin
TimerHP.enabled:=false;
timer.enabled:=true; //включаем задержку между забросами
end;
end;
end;
end;
end;

//************************************************** ****************************
procedure OnTimer(Sender: TObject);
begin
timer.enabled:=false; //выключаем задержку между забросами
status:=true;
Fishing;
end;

//************************************************** ****************************
procedure OnTimerMOB(Sender: TObject);
begin
UnderAttack:=false;
end;

//************************************************** ****************************
procedure OnTimerHP(Sender: TObject);
begin
// timerMOB.enabled:=true; //ждем примерно минуту, пока моб нас колбасит
//таргет на себя надо делать! Можно заранее на себя таргет сделать.
if (CurHP<MaxHP) then MagicSkillUse(heal); //каждые 10 сек лечимся, пока моб нас бъет в тесении 60 сек
end;

//************************************************** ****************************
procedure Fishing;
begin
if ColvoLure<>0 then MagicSkillUse(fish)
else begin
Status:=false;
ScrInUse:=false;
Say('Кончились крючки!');
end;
end;

//************************************************** ****************************
//пакет 2F=RequestMagicSkillUse:h(MagicID)d(CtrlPressed)b( ShiftPressed)
procedure MagicSkillUse(MagicID:integer);
begin
buf:=#$2F;
WriteD(MagicID);
WriteD(00);
WriteC(00);
SendToServerEx(Name);
end;

//************************************************** ****************************
procedure UseItem(ObjID:integer);
begin
buf:=#$14;
WriteD(ObjID);
WriteD(00);
SendToServerEx(Name);
end;

//************************************************** ****************************
//посылаем сообщение, которое видно только в окне бота
//можно использовать для отладки
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;

//************************************************** ****************************
procedure Pumping;
begin
if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
MagicSkillUse(pump);
end;

//************************************************** ****************************
procedure Reeling;
begin
if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
MagicSkillUse(reel);
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
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(it emType1)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); //количество крючков
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(it emType1)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); //количество шотов
end;

//************************************************** ****************************
if (CharObjID<>0) and (ColvoLure<>0) and not status2 then
begin
Say('Автоматизация ловли рыбы готово к работе!');
status2:=true;
end;

//************************************************** ****************************
//ItemList
if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then
begin
ColvoShot:=ObjtoColvo(Shot); //количество шотов
ColvoLure:=ObjtoColvo(Lure); //количество крючков
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 begin
timer.enabled:=true; //ждем N секунд межде рыбалками
end;
//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;

//************************************************** ****************************
//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;

//************************************************** **************************
if FromClient and (ConnectName=Name) and (pck[1]=#$1B) then begin
Cmd:=ReadD(2);
case cmd of
//социальное действие Yes для начала ловли
6: begin
if CharObjID=0 then exit;
ScrInUse:=true;
Status:=true;
Fishing;
end;
//социальное действие No для окончания
5: begin
if CharObjID=0 then exit;
if Status then Fishing;
ScrInUse:=false;
Status:=false;
timer.enabled:=false;
end;
end;
end;
end.

ЗЫЖ
Проблемный момент прервать рыбную ловлю, когда тебя атакуют. :( Поэтому в этом скрипте предполагаем, что моб атакует в промежутке между рыбалками. Время между забросами нужно делать достаточным, чтобы заметить атаку моба. Выжидаем минуту с попытками самолечения и ловим снова. На 100% отладить не могу, в реале я ловлю гномом. Замечания, поправки приветствуются.

Grinch
21.10.2007, 10:22
я рыбачу гладом в БВ хеви на шок2 самая проблема даже 1 моб когда серв лагает хилки не работают. ЗЫ что б эфективний хилится тайминг на 1000 ставить надо. я этот скрипт юзаю для кача :) просто качал сполера и устал хилки кушать поставил на автомат и кач попёр. интересно в какой линейки автохил сделают как автососки :).
ЗЫ думаю приерепить к гладу хилера, и как рас твой скриптик мне в этом поможет. т.к. не хочу юзать хил пока не исчезнет моб или пока хп глада не упадёт до 1,5к. если сделаю выложу тут.

NLObP
21.10.2007, 14:56
А объясните, для чего нужна проверка крючков и шотов?
Чтобы впустую не гонять пакеты, ведь наверно по ним запалить смогут. Представь, шотов нет а пакет на их использование посылается.

NLObP
23.10.2007, 23:29
Внес изменения в рыбалку для работы на Интерлюде. Пробуйте.

//Автоматизация ловли рыбы для Interlude by NLObP
//возможность нескольких одновременных скриптов
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и Protocol 656

//Изменения для работы на Интерлюде

//Необходимо затариться удочкой и крючками, шотами
//выучить соответствующие скиллы
//1 одеть и снять: удочку, крючек, мечь, щит для определения ObjectID
//2 в процессе рыбалки использовать один раз фишин-шот для определения ObjectID

//Социальное действие 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'; //изменить на имя чара

fish=1312;
pump=1313;
reel=1314;

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 одеть и снять: удочку, крючек, мечь, щит для определения ObjectID!');
Say('2 в процессе рыбалки использовать один раз фишин-шот для определения ObjectID!');

end;

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

//************************************************** ****************************
//пакет 2F=RequestMagicSkillUse:h(MagicID)d(CtrlPressed)b( ShiftPressed)
procedure MagicSkillUse(MagicID:integer);
begin
buf:=#$2F;
WriteD(MagicID);
WriteD(00);
WriteC(00);
SendToServerEx(Name);
end;

//************************************************** ****************************
procedure UseItem(ObjID:integer);
begin
buf:=#$14;
WriteD(ObjID);
WriteD(00);
SendToServerEx(Name);
end;

//************************************************** ****************************
//посылаем сообщение, которое видно только в окне бота
//можно использовать для отладки
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;

//************************************************** ****************************
procedure Fishing;
begin
if ColvoLure<>0 then MagicSkillUse(fish)
else begin
Status:=false;
RodInUse:=false;
Say('Кончились крючки!');
end;
end;

//************************************************** ****************************
procedure Pumping;
begin
if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
MagicSkillUse(pump);
end;

//************************************************** ****************************
procedure Reeling;
begin
if (Shot<>0) and (ColvoShot<>0) then UseItem(Shot);
MagicSkillUse(reel);
end;

//************************************************** ****************************
//ItemList - Interlude
{
1 1 writeC(0x1B);
2 2 writeH(_showWindow ? 1 : 0);

4 2 writeH(_items.length);
for(L2ItemInstance temp : _items)

6 2 writeH(temp.getItem().getType1()); // item type1
8 4 writeD(temp.getObjectId());
12 4 writeD(temp.getItemId());
16 4 writeD(temp.getCount());
20 2 writeH(temp.getItem().getType2()); // item type2
22 2 writeH(temp.getCustomType1()); // item type3
24 2 writeH(temp.isEquipped() ? 1 : 0);
26 4 writeD(temp.getItem().getBodyPart()); // rev 415 slot 0006-lr.ear 0008-neck 0030-lr.finger 0040-head 0080-?? 0100-l.hand 0200-gloves 0400-chest 0800-pants 1000-feet 2000-?? 4000-r.hand 8000-r.hand
30 2 writeH(temp.getEnchantLevel()); // enchant level
//race tickets
32 2 writeH(temp.getCustomType2()); // item type3
34 4 writeD(0); // augmentation id
38 4 writeD(temp.getLifeTimeRemaining()); // shadow weapon life time
42
}
Function ObjtoColvoIL(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*36+8) then begin
Result:=ReadD(i*36+16); //количество
exit;
end;
end;
Result:=0;
end;

//ItemList - C4
{
1 1 writeC(0x1b);
2 2 writeH(0x01);
4 2 writeH(count);
for (L2ItemInstance temp : _items)
6 2 writeH(temp.getItem().getType1()); // item type1
8 4 writeD(temp.getObjectId());
12 4 writeD(temp.getItemId());
16 4 writeD(temp.getCount());
20 2 writeH(temp.getItem().getType2()); // item type2
22 2 writeH(temp.getCustomType1()); // item type3
24 2 writeH(0x01);
26 4 writeD(temp.getItem().getBodyPart()); // rev 415 slot 0006-lr.ear 0008-neck 0030-lr.finger 0040-head 0080-?? 0100-l.hand 0200-gloves 0400-chest 0800-pants 1000-feet 2000-?? 4000-r.hand 8000-r.hand
30 2 writeH(temp.getEnchantLevel()); // enchant level
//race tickets
32 2 writeH(temp.getCustomType2()); // item type3
}
Function ObjtoColvoC4(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 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(it emType1)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(it emType1)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 (1B)
if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then begin
ColvoShot:=ObjtoColvoIL(Shot); //количество шотов
//Say('Shot='+inttostr(ColvoShot));
ColvoLure:=ObjtoColvoIL(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;
RodInUse:=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.

NLObP
25.10.2007, 00:38
друг луче б ты авто заточку для интерлюди сделал
Она точно такая же как и та, что здесь на форуме. Измени только смещение в
procedure CreateItemBase; //пакет 1B, Создает базу ObjectID по ItemID
с j:=j+2;
на j:=j+10;

и в
procedure UpdateItemBase; //пакет 27, Создает базу ObjectID по ItemID
с j:=j+2;
на j:=j+10;

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

а то задралось ждать, пока загрузится весь пост.

Grinch
26.10.2007, 20:43
подерживаю а то жесть какая то, не во всех городах и сёлах россии есть быстрый и дешовый интернет

NLObP
27.10.2007, 02:51
Даже если заменить как ты говоришь пишет что нет скролов _interluda.net вот тут например проверь там пвп и бабло достаеться быстро :) есть энчат и кристал заточки

Ок. Попробую.

Попробовал. Как я и говорил - все работат.
Для работы скрипта необходимо его инициализировать - это значит получить пакет ItemList(1B). Обычно это делается открытием инвентаря. На сервере interluda.net потребовалось, что нибудь купить/продать.
Дополнительно надо не забыть поправить константы:
const
Name='имя';
Scroll=955; // 955 - ItemID Scroll: Enchant Weapon (Grade D)
Weapon=129; // 129 - ItemID Sword of Revolution
MaxEnchLvl=21; //max уровень заточки
max=100; //max количество предметов в базе - это сколько места в инвентаре

Исправить как часто точить:
timer.interval:=5000; //время задержки

И условие, должно быть не менее двух вещей, иначе скрипт останавливается.

Прямо сейчас заточил до 21 два меча Sword of Revolution.

29.10.2007, 12:24
ItemList(1B) - вот в этом и вопрос почему при открытии инвентаря не срабатывала инициилизация, возможно ли что админы начнут делать защиту исходя из того что большинство для инициилизации скриптов требуют определенного действия?

Grinch
29.10.2007, 13:00
угу если ты решил посмотреть скока у тебя заточек осталось или чё поднял, сразу автобан :) => много КоЛ на разбан => админы заработают денег :twisted:

Добавлено спустя 1 минуту 43 секунды:
Re: Re:
Даже если заменить как ты говоришь пишет что нет скролов _interluda.net вот тут например проверь там пвп и бабло достаеться быстро :) есть энчат и кристал заточки

Ок. Попробую.

Попробовал. Как я и говорил - все работат.
Для работы скрипта необходимо его инициализировать - это значит получить пакет ItemList(1B). Обычно это делается открытием инвентаря. На сервере interluda.net потребовалось, что нибудь купить/продать.
Дополнительно надо не забыть поправить константы:
const
Name='имя';
Scroll=955; // 955 - ItemID Scroll: Enchant Weapon (Grade D)
Weapon=129; // 129 - ItemID Sword of Revolution
MaxEnchLvl=21; //max уровень заточки
max=100; //max количество предметов в базе - это сколько места в инвентаре

Исправить как часто точить:
timer.interval:=5000; //время задержки

И условие, должно быть не менее двух вещей, иначе скрипт останавливается.

Прямо сейчас заточил до 21 два меча Sword of Revolution.
скока сломал ? считал
или при авто заточке главное ритм поймать :)

NLObP
29.10.2007, 14:20
ItemList(1B) - вот в этом и вопрос почему при открытии инвентаря не срабатывала инициилизация, возможно ли что админы начнут делать защиту исходя из того что большинство для инициилизации скриптов требуют определенного действия?

Вряд ли можно, что нибудь тут админам сделать, ведь эти пакеты нужны для нормальной работы клиента. Например при открытии инвентаря приходит пакет ItemListPacket(1B), хочет админ или нет. Просто в нашем случае скрипт включается после того как он пришел и повторное окрытие уже ни чего не дает, потому что клиент уже получал этот пакет, возможно при входе перса. Все зависит от сервера, в нем может быть оптимизация посылки пакетов для уменьшения трафика. Тут надо ориентироваться на определенный сервер - ява он или офф.

угу если ты решил посмотреть скока у тебя заточек осталось или чё поднял, сразу автобан :) => много КоЛ на разбан => админы заработают денег

Для определения количества предметов выполняются стандартные команды клиента: открыть инвентарь, поднять/бросить на землю предмет, купить в магазине и ничем повредить не могут. Нам нужны только для того, чтобы сервер прислал пакет ItemListPacket(1B) или InventoryUpdate(27), надо только определить какое из этих действий нам подходит. А вот если с помощью пакетхака начнешь использовать теже заточки, которых в инвентаре уже нет, вот тогда и запалял тебя. Поэтому нам и надо отслеживать и не пускать на сервер все пакеты, которые обычно клиент не может послать.

Добавлено спустя 11 минут 48 секунд:
скока сломал ? считал
или при авто заточке главное ритм поймать :)

На том серваке до 25 можно смело точить. Так что ничего не сломал. Мой скрипт только на облегчение жизни, но никакие ритмы он поймать не может, это надо отдельно обдумывать и писать другой скрипт. Здесь только на удачу, покупаешь побольше мечей, еще больше заточек и ждешь. Повторяешь снова если не доточилось до нужного уровня. Один меч в любом случае остается. :D

31.10.2007, 13:49
Прочитал всю темку. Сам пока не пробовал ничего т.к. на работе сижу, но сразу возникла идея.
Вообщем почему бы не сделать что то типа своего языка макросов?
Например самое банальное что пришло в голову:
у бота есть надор пакетов, хотяб таких вот
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

Идея в том, чтоб бот получив команду типа "1,3,5", бафнул бы Shield, Empower, Concentration
Ну это самое простое, а вообще можно это все расширить, причем не вводом кучи команд, а просто добавлением еще одного пакета, например
b6='** ** ** ** ** ** ** ** ** **'; // что нибудь

Тогда возникает несколько вопросов...
1. Почему я ни у кого не видел массива команд? Я просто паскаль не знаю особо, так самые азы токо...
Но почему там бы не сделать что то типа такого
string[] command =
{
"2F 10 04 00 00 00 00 00 00 00", // Shield
"2F 23 04 00 00 00 00 00 00 00" // Empower
// и т.д.
};
а потом просто посылать команды в чат, и обрабатывать их
// str - команда полученная например в приват
while(str!="") // пока строка не пустая...
{
int l = str.IndexOf(','); // позиция первой ','
if(l==-1) l = str.Length; // если нету ','
buf = command[int.Parse(str.Substring(0, l))]; // получение команды по ее номеру
SendToServerEx(<че тут писать то хоть?>);
// и че то типа задержки тут надо наверное...
str.Remove(0, l); // удаление выполненной команды из строки
}
2. Любую команду можно записать аналогично вот этому b1='2F 10 04 00 00 00 00 00 00 00'?
или это токо скилы так?
3. Можно ли как то запускать готовые макросы(игровые)?
Например сделать макрос типа "delay n"/"target ***"/"assist" и тому подобные, и использовать такой макрос забив его в массив команд, так же как и скилы?
Хотя я почти уверен что нельзя... Это же клиент вроде как макрос выполняет а не сервер, так?
Можно ли как то из скрипта использовать встроенные переменные типа %self, %target, %partyN?

Короче пока сам толком не понял чего хочу, но если все это довести до ума, то такой скрипт можно будет подогнать почти под любые нужды, просто добавив команды и в самом клиенте сдалать макросы типа "имя_бафера 1,2,7,10,15 - где цифры это собственно и есть сами команды

DeVolf
02.11.2007, 20:55
друзья нужна помощ!
нужно написать скрипт купли-продажи
вот как изменить усе айтем чтоб в пакет дописывалис обджек иди (98штук) я не знаю(
а вопше пакет выглядит так 1E 00 00 00 00 62 00 00 00 BA 3A 01 10 8B 10 00 00 01 00 00 00 BB 3A 01 10 8B 10 00 00 01 00 00 00 BC 3A 01 10 8B 10 00 00 01 00 00 00 BD 3A 01 10 8B 10 00 00 01 00 00 00 BE 3A 01 10 8B 10 00 00 01 00 00 00 BF 3A 01 10 8B 10 00 00 01 00 00 00 C0 3A 01 10 8B 10 00 00 01 00 00 00 C1 3A 01 10 8B 10 00 00 01 00 00 00 C2 3A 01 10 8B 10 00 00 01 00 00 00 C3 3A 01 10 8B 10 00 00 01 00 00 00 C4 3A 01 10 8B 10 00 00 01 00 00 00 C5 3A 01 10 8B 10 00 00 01 00 00 00 C6 3A 01 10 8B 10 00 00 01 00 00 00 C7 3A 01 10 8B 10 00 00 01 00 00 00 C8 3A 01 10 8B 10 00 00 01 00 00 00 CB 3A 01 10 8B 10 00 00 01 00 00 00 CC 3A 01 10 8B 10 00 00 01 00 00 00 CD 3A 01 10 8B 10 00 00 01 00 00 00 CE 3A 01 10 8B 10 00 00 01 00 00 00 CF 3A 01 10 8B 10 00 00 01 00 00 00 D1 3A 01 10 8B 10 00 00 01 00 00 00 D2 3A 01 10 8B 10 00 00 01 00 00 00 D3 3A 01 10 8B 10 00 00 01 00 00 00 D4 3A 01 10 8B 10 00 00 01 00 00 00 D5 3A 01 10 8B 10 00 00 01 00 00 00 D6 3A 01 10 8B 10 00 00 01 00 00 00 D8 3A 01 10 8B 10 00 00 01 00 00 00 D9 3A 01 10 8B 10 00 00 01 00 00 00 DA 3A 01 10 8B 10 00 00 01 00 00 00 DB 3A 01 10 8B 10 00 00 01 00 00 00 DC 3A 01 10 8B 10 00 00 01 00 00 00 DE 3A 01 10 8B 10 00 00 01 00 00 00 DF 3A 01 10 8B 10 00 00 01 00 00 00 E0 3A 01 10 8B 10 00 00 01 00 00 00 E1 3A 01 10 8B 10 00 00 01 00 00 00 E2 3A 01 10 8B 10 00 00 01 00 00 00 E3 3A 01 10 8B 10 00 00 01 00 00 00 E4 3A 01 10 8B 10 00 00 01 00 00 00 E6 3A 01 10 8B 10 00 00 01 00 00 00 E7 3A 01 10 8B 10 00 00 01 00 00 00 E8 3A 01 10 8B 10 00 00 01 00 00 00 E9 3A 01 10 8B 10 00 00 01 00 00 00 EA 3A 01 10 8B 10 00 00 01 00 00 00 EB 3A 01 10 8B 10 00 00 01 00 00 00 EC 3A 01 10 8B 10 00 00 01 00 00 00 ED 3A 01 10 8B 10 00 00 01 00 00 00 EE 3A 01 10 8B 10 00 00 01 00 00 00 EF 3A 01 10 8B 10 00 00 01 00 00 00 F0 3A 01 10 8B 10 00 00 01 00 00 00 F1 3A 01 10 8B 10 00 00 01 00 00 00 F2 3A 01 10 8B 10 00 00 01 00 00 00 F3 3A 01 10 8B 10 00 00 01 00 00 00 F4 3A 01 10 8B 10 00 00 01 00 00 00 F5 3A 01 10 8B 10 00 00 01 00 00 00 F6 3A 01 10 8B 10 00 00 01 00 00 00 F7 3A 01 10 8B 10 00 00 01 00 00 00 F9 3A 01 10 8B 10 00 00 01 00 00 00 FA 3A 01 10 8B 10 00 00 01 00 00 00 FB 3A 01 10 8B 10 00 00 01 00 00 00 FC 3A 01 10 8B 10 00 00 01 00 00 00 FD 3A 01 10 8B 10 00 00 01 00 00 00 FE 3A 01 10 8B 10 00 00 01 00 00 00 FF 3A 01 10 8B 10 00 00 01 00 00 00 00 3B 01 10 8B 10 00 00 01 00 00 00 01 3B 01 10 8B 10 00 00 01 00 00 00 02 3B 01 10 8B 10 00 00 01 00 00 00 03 3B 01 10 8B 10 00 00 01 00 00 00 04 3B 01 10 8B 10 00 00 01 00 00 00 05 3B 01 10 8B 10 00 00 01 00 00 00 06 3B 01 10 8B 10 00 00 01 00 00 00 08 3B 01 10 8B 10 00 00 01 00 00 00 09 3B 01 10 8B 10 00 00 01 00 00 00 0A 3B 01 10 8B 10 00 00 01 00 00 00 0D 3B 01 10 8B 10 00 00 01 00 00 00 0E 3B 01 10 8B 10 00 00 01 00 00 00 0F 3B 01 10 8B 10 00 00 01 00 00 00 10 3B 01 10 8B 10 00 00 01 00 00 00 11 3B 01 10 8B 10 00 00 01 00 00 00 12 3B 01 10 8B 10 00 00 01 00 00 00 13 3B 01 10 8B 10 00 00 01 00 00 00 14 3B 01 10 8B 10 00 00 01 00 00 00 15 3B 01 10 8B 10 00 00 01 00 00 00 16 3B 01 10 8B 10 00 00 01 00 00 00 17 3B 01 10 8B 10 00 00 01 00 00 00 18 3B 01 10 8B 10 00 00 01 00 00 00 19 3B 01 10 8B 10 00 00 01 00 00 00 1A 3B 01 10 8B 10 00 00 01 00 00 00 1B 3B 01 10 8B 10 00 00 01 00 00 00 1C 3B 01 10 8B 10 00 00 01 00 00 00 1D 3B 01 10 8B 10 00 00 01 00 00 00 1E 3B 01 10 8B 10 00 00 01 00 00 00 1F 3B 01 10 8B 10 00 00 01 00 00 00 20 3B 01 10 8B 10 00 00 01 00 00 00 23 3B 01 10 8B 10 00 00 01 00 00 00 24 3B 01 10 8B 10 00 00 01 00 00 00 25 3B 01 10 8B 10 00 00 01 00 00 00 26 3B 01 10 8B 10 00 00 01 00 00 00 27 3B 01 10 8B 10 00 00 01 00 00 00
прошу помощи ибо я еше не все знаю.... :D

NLObP
03.11.2007, 18:35
В дополнение к скрипту "кач дракона" выкладываю "ботика".
Возможности скрипта: Сам атакует, сам подбирает дроп относительно выбранного нами центра.
Внесены изменения для отличия игроков от мобов, работает в случае если игрок прибежал из-за границы видимости. Если он рядом то бот принимает его за цель. Атаковать не будет, так как не зажат контрол.
Все сообщения по SAY можно закомментить, они только для отладки скрипта. Скрипт в процессе разработки.

Изменяем константы: Name, Pet, Radius, DeltaZ, по желанию max. Для инициализации скрипта надо получить пакет UserInfo(04). Как пример: открыть инвентарь, напасть на моба. Включить работу скрипта соц.действие Yes. Остановить No.

Спасибо Ворону за его "Локомотив"!

//БОТ with 'Hachling of Star' by NLObP

//************************************************** ****************************
Const
Name='NLObP'; //имя чара
Pet=''; //имя Пета
max=50; //max количество контролируемых мобов
Radius=1500; //радиус участка для поиска мобов
DeltaZ=250; //глубина/высота до мобов
//************************************************** ****************************
VAR
NameChar: string;
CentrKachX,CentrKachY,RadiusKachX,RadiusKachY, CharID, PetID, Attacker, ObjectID: integer;
CentrKachXex,CentrKachYex,RadiusKachXex,RadiusKach Yex: extended;
tempX,tempY, tempLenght: extended;
tempZ: integer;
ColvoMobs, ColvoMobs2: integer;
CurHP, MaxHP, CurMP, MaxMP, time1 :integer;
BotCoordX,BotCoordY,BotCoordZ: integer; //координаты бота
BotCoordXext,BotCoordYext,BotCoordZext:extended;
MinPutID: integer; //указывает индекс моба в базе путь до которого самый короткий
MinPutLenght: extended; //квадрат расстояния до ближайшего моба
timer1: TTimer; //основной таймер
timer2: TTimer; //вспомогательный
i, itm, SocialID:integer; // вспомогательная
AddMob, UnderAttack, scrready: boolean;
NeedBackup:boolean;

ItemBase: array[1..4,1..max] of integer; // описатель предметов
CharBase: array[1..4,1..max] of integer; // описатель игроков (которых не атакуем)
MobBase: array[1..4,1..max] of integer; // описатель мобов вокруг
MobBaseExt: array[1..4,1..max] of extended; // описатель мобов вокруг вспомогательная
{
1 - ID
2 - X
3 - Y
4 - Z
5 - Attakable //агрессивные?
}

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

itm:=0;
NeedBackup:=false;

scrready:=false;

colvomobs:=0;
colvomobs2:=0;

timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer1; //
timer1.enabled:=False; //
timer1.interval:=2000;

timer2:=TTimer.Create(nil);
timer2.OnTimer:=@OnTimer2;
timer2.enabled:=false; //
timer2.interval:=15000;
end;
//************************************************** ****************************
procedure Free; //Вызывается при выключении скрипта
begin
timer1.Free;
timer2.Free;
end;

//************************************************** ****************************
//для отладки скрипта
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
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 OnTimer2(Sender: TObject);
begin
//say('Вышло время');
UnderAttack:=false; //отцепимся от атакуемого
if itm>0 then needbackup:=true;
end;

//************************************************** ****************************
procedure ReqGetItem;
begin
if itm=0 then begin
timer1.enabled:=true; //включаем отсчет времени
needbackup:=false;
exit;
end;
timer1.enabled:=false; //выключаем отсчет времени
//перебираем базу
for i:=1 to max do begin
//если нашли, то обнуляем
if (ItemBase[1,i]<>0) then begin //ObjectID
say('ReqGetItem');
//даем команду подобрать вещь
buf:=#$04;
WriteD(ItemBase[1,i]);
WriteD(ItemBase[2,i]);
WriteD(ItemBase[3,i]);
WriteD(ItemBase[4,i]);
WriteH(00);
SendToServerEx(Name);
end;
end;
end;

//************************************************** ****************************
procedure OnTimer1(Sender: TObject);
begin
if UnderAttack then begin
TargetAttacker(Attacker);
exit;
end;
//say('Вычисляем ближайшего');
MinPutID:=0;
MinPutLenght:=99999999;
///ищем самого близково к нам моба
for i:=1 to max do begin
if (MobBaseExt[1,i]<>0) then begin
tempX:=MobBaseExt[2,i];
tempY:=MobBaseExt[3,i];
//теорема Пифагора c^2=a^2+b^2
tempLenght:=int(sqrt((BotCoordXext-tempx)*(BotCoordXext-tempx)+(BotCoordYext-tempy)*(BotCoordYext-tempy)));
if (tempLenght<MinPutLenght) and (PetID<>MobBase[1,i]) and (CharID<>MobBase[1,i]) then begin
MinPutLenght:=tempLenght;
MinPutID:=i;
//say('MinPutID='+inttostr(MinPutID)+' MinPutLenght='+Floattostr(MinPutLenght));
end;
end;
end;
say('MinPutID='+inttostr(MinPutID)+' MinPutLenght='+Floattostr(MinPutLenght));
if (minputid<>0) then begin
Attacker:=MobBase[1,MinPutID];
TargetAttacker(Attacker);
say('Attack!');
UnderAttack:=true; //зацепимся за атакуемого
end;
end;
//************************************************** ****************************
procedure TargetAtt;
begin
buf:=#$04;
WriteD(Attacker);
WriteD(BotCoordX);
WriteD(BotCoordY);
WriteD(BotCoordZ);
WriteC(00);
SendToServerEx(Name);
end;
//************************************************** ****************************
procedure TargetAttacker(Attacker: Integer);
begin
TargetAtt;
TargetAtt;
end;

//************************************************** ****************************
// вызывается при приходе каждого пакета если скрипт включен
//************************************************** ****************************
begin
//************************************************** **************************
if pck='' then exit;
//************************************************** **************************
//NPCInfo, запоминаем мобов
if FromServer and (ConnectName=Name) and (pck[1]=#$16) then begin
AddMob:=true;
//проверка, входит моб в радиус действия?
tempX:=ReadD(14); //x
tempY:=ReadD(18); //y
tempLenght:=sqrt((CentrKachXex-tempX)*(CentrKachXex-tempX)+(CentrKachYex-tempY)*(CentrKachYex-tempY));
//say('tempX='+Floattostr(tempX)+' tempY='+Floattostr(int(tempY)));
//say('Radius='+Floattostr(Radius)+' tempLenght='+Floattostr(int(tempLenght)));
tempZ:=BotCoordZ-ReadD(22);
if tempz<0 then tempZ:=tempz*(-1);
//say('TempZ='+inttostr(tempz));
//say('BotCoordZ='+inttostr(BotCoordZ));
//say('MobCoordZ='+inttostr(readd(22)));
if tempZ<=DeltaZ then begin
if (tempLenght<Radius) then begin
for i:=1 to max do begin
//если нашли Моба в базе, то коректируем его координаты на новые
if (MobBase[1,i]=ReadD(2)) and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) then begin
MobBase[2,i]:=ReadD(14); //x
MobBase[3,i]:=ReadD(18); //y
MobBase[4,i]:=ReadD(22); //z
//Ext массив
MobBaseExt[2,i]:=ReadD(14); //x
MobBaseExt[3,i]:=ReadD(18); //y
MobBaseExt[4,i]:=ReadD(22); //z
AddMob:=false;
//say('Корректируем координаты Моба'+' ColvoMobs='+inttostr(colvomobs));
//say('Radius='+Floattostr(Radius)+' tempLenght='+Floattostr(int(tempLenght)));
//say('ID='+inttostr(MobBase[1,i])+' X='+inttostr(MobBase[2,i])+' Y='+inttostr(MobBase[3,i])+' Z='+inttostr(MobBase[4,i]));
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового моба
for i:=1 to max do begin
if (MobBase[1,i]=0) and AddMob and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) then begin
//запоминаем моба в свободную ячейку
MobBase[1,i]:=ReadD(2); //ObjectID
MobBase[2,i]:=ReadD(14); //x
MobBase[3,i]:=ReadD(18); //y
MobBase[4,i]:=ReadD(22); //z
//Ext массив
MobBaseExt[1,i]:=ReadD(2); //ObjectID
MobBaseExt[2,i]:=ReadD(14); //x
MobBaseExt[3,i]:=ReadD(18); //y
MobBaseExt[4,i]:=ReadD(22); //z
inc(colvomobs);
say('Запоминаем координаты Моба'+' ColvoMobs='+inttostr(colvomobs));
//say('Radius='+Floattostr(Radius)+' tempLenght='+Floattostr(int(tempLenght)));
//say('ID='+inttostr(MobBase[1,i])+' X='+inttostr(MobBase[2,i])+' Y='+inttostr(MobBase[3,i])+' Z='+inttostr(MobBase[4,i]));
break;
end;
end;
end;
end;
end;

//************************************************** **************************
//CharInfo, запоминаем мобов
if FromServer and (ConnectName=Name) and (pck[1]=#$03) then begin
AddMob:=true;
for i:=1 to max do begin
//если нашли Моба в базе, то коректируем его координаты на новые
if (CharBase[1,i]=ReadD(18)) then begin
CharBase[2,i]:=ReadD(2); //x
CharBase[3,i]:=ReadD(6); //y
CharBase[4,i]:=ReadD(10); //z
AddMob:=false;
//say('Корректируем координаты Игрока');
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового моба
for i:=1 to max do begin
if (CharBase[1,i]=0) and AddMob then begin
//запоминаем моба в свободную ячейку
CharBase[1,i]:=ReadD(18); //ObjectID
CharBase[2,i]:=ReadD(2); //x
CharBase[3,i]:=ReadD(6); //y
CharBase[4,i]:=ReadD(10); //z
NameChar:=ReadS(22);
say('Приближается Игрок '+NameChar+'!!!');
break;
end;
end;
end;

//************************************************** **************************
//MoveToLocation, коректируем координаты мобов в базе
if FromServer and (ConnectName=Name) and (pck[1]=#$01) then begin
//say('MoveToLocation');
AddMob:=true;
//проверка, входит моб в радиус действия?
tempX:=ReadD(6); //x
tempY:=ReadD(10); //y
tempLenght:=sqrt((CentrKachXex-tempX)*(CentrKachXex-tempX)+(CentrKachYex-tempY)*(CentrKachYex-tempY));
//say('CentrKachXex='+Floattostr(CentrKachXex)+' CentrKachYex='+Floattostr(CentrKachYex));
//say('tempX='+Floattostr(tempX)+' tempY='+Floattostr(tempY));
//say('Radius='+Floattostr(Radius)+' tempLenght='+Floattostr(tempLenght));
tempZ:=BotCoordZ-ReadD(14);
if tempz<0 then tempZ:=tempz*(-1);
//say('TempZ='+inttostr(tempz));
//say('BotCoordZ='+inttostr(BotCoordZ));
//say('MobCoordZ='+inttostr(readd(14)));
if tempZ<=DeltaZ then begin
if (int(tempLenght)<Radius) then begin
//say('Radius='+Floattostr(Radius)+' tempLenght='+Floattostr(int(tempLenght)));
//перебираем базу и ищем там моба который бежит
for i:=1 to max do begin
//если нашли Моба в базе, то коректируем его координаты на новые
if (MobBase[1,i]=ReadD(2)) and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) and (CharBase[1,i]<>ReadD(2)) then begin //ObjectID
MobBase[2,i]:=ReadD(6); //x
MobBase[3,i]:=ReadD(10); //y
MobBase[4,i]:=ReadD(14); //z
//Ext массив
MobBaseExt[2,i]:=ReadD(6); //x
MobBaseExt[3,i]:=ReadD(10); //y
MobBaseExt[4,i]:=ReadD(14); //z
//say('Корректируем координаты Моба'+' ColvoMobs='+inttostr(colvomobs));
//say('>Radius='+Floattostr(Radius)+' tempLenght='+Floattostr(int(tempLenght)));
//say('ID='+inttostr(MobBase[1,i])+' X='+inttostr(MobBase[2,i])+' Y='+inttostr(MobBase[3,i])+' Z='+inttostr(MobBase[4,i]));
AddMob:=false;
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового моба
for i:=1 to max do begin
if (MobBase[1,i]=0) and AddMob and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) then begin
//запоминаем моба в свободную ячейку
MobBase[1,i]:=ReadD(2); //ObjectID
MobBase[2,i]:=ReadD(6); //x
MobBase[3,i]:=ReadD(10); //y
MobBase[4,i]:=ReadD(14); //z
//Ext массив
MobBaseExt[1,i]:=ReadD(2); //ObjectID
MobBaseExt[2,i]:=ReadD(6); //x
MobBaseExt[3,i]:=ReadD(10); //y
MobBaseExt[4,i]:=ReadD(14); //z
inc(colvomobs);
//colvomobs:=colvomobs+1;
say('Запоминаем координаты Моба'+' ColvoMobs='+inttostr(colvomobs));
//say('>Radius='+Floattostr(Radius)+' tempLenght='+Floattostr(int(tempLenght)));
//say('ID='+inttostr(MobBase[1,i])+' X='+inttostr(MobBase[2,i])+' Y='+inttostr(MobBase[3,i])+' Z='+inttostr(MobBase[4,i]));
break;
end;
end;
end;
end;
end;

//************************************************** **************************
//MagicSkillUse 48, Attack 05
if FromServer and (ConnectName=Name) and ((pck[1]=#$48) or (pck[1]=#$05)) then begin
if UnderAttack then exit; //сначало убъем одного
Attacker:=ReadD(2);
ObjectID:=ReadD(6);
if (Attacker<>ObjectID) and (CharID=ObjectID) then begin
UnderAttack:=true; //нас атакуют
needbackup:=false;
Say('Нас атакуют!');
TargetAttacker(Attacker);
end;
end;

//************************************************** **************************
//если принят пакет Die
if FromServer and (ConnectName=Name) and (pck[1]=#$06) then begin
//ищем моба в базе
if (Attacker=ReadD(2)) then begin
UnderAttack:=false; //убили атакующего моба
//say('UnderAttack=false');
timer2.enabled:=true; //включаем отсчет времени
end;
for i:=1 to max do begin
//очишаем запись связанную с етим мобом
if (MobBase[1,i]=ReadD(2)) then begin
dec(colvomobs);
//say('Удаляем координаты Моба'+' ColvoMobs='+inttostr(colvomobs));
//say('ID='+inttostr(MobBase[1,i])+' X='+inttostr(MobBase[2,i])+' Y='+inttostr(MobBase[3,i])+' Z='+inttostr(MobBase[4,i]));
MobBase[1,i]:=0; //ObjectID
MobBase[2,i]:=0; //x
MobBase[3,i]:=0; //y
MobBase[4,i]:=0; //z
//Ext массив
MobBaseExt[1,i]:=0;
MobBaseExt[2,i]:=0;
MobBaseExt[3,i]:=0;
MobBaseExt[4,i]:=0;
break;
end;
end;
end;

//************************************************** **************************
//если принят пакет DeleteObject
if FromServer and (ConnectName=Name) and (pck[1]=#$12) then begin
//ищем моба в базе
//say('DeleteObject');
if (Attacker=ReadD(2)) then begin
UnderAttack:=false; //убили атакующего моба
//say('UnderAttack=false');
timer2.enabled:=true; //включаем отсчет времени
end;
for i:=1 to max do begin
//очишаем запись связанную с етим мобом
if (MobBase[1,i]=ReadD(2)) then begin
//say('Удаляем координаты Моба');
dec(colvomobs);
//say('Удаляем координаты Моба'+' colvomobs='+inttostr(colvomobs));
//say('ID='+inttostr(MobBase[1,i])+' X='+inttostr(MobBase[2,i])+' Y='+inttostr(MobBase[3,i])+' Z='+inttostr(MobBase[4,i]));
MobBase[1,i]:=0; //ObjectID
MobBase[2,i]:=0; //x
MobBase[3,i]:=0; //y
MobBase[4,i]:=0; //z
//Ext массив
MobBaseExt[1,i]:=0;
MobBaseExt[2,i]:=0;
MobBaseExt[3,i]:=0;
MobBaseExt[4,i]:=0;
break;
end;
end;
for i:=1 to max do begin
//если нашли в базе, то удаляем
if (CharBase[1,i]=ReadD(2)) then begin
CharBase[2,i]:=0; //x
CharBase[3,i]:=0; //y
CharBase[4,i]:=0; //z
//say('Удаляем координаты Игрока');
end;
end;
end;

//************************************************** **************************
//ValidatePosition если принят пакет от клиента с моими кординатами то
if FromClient and (ConnectName=Name) and (pck[1]=#$48) then begin
//запоминаем мои координаты
BotCoordX:=ReadD(2);
BotCoordY:=ReadD(6);
BotCoordZ:=ReadD(10);
//ext
BotCoordXext:=ReadD(2);
BotCoordYext:=ReadD(6);
BotCoordZext:=ReadD(10);
//say('Запоминаем координаты Бота');
//say('Бот X='+inttostr(BotCoordX)+' Y='+inttostr(BotCoordY)+' Z='+inttostr(BotCoordZ));
//say('Бот Xext='+floattostr(BotCoordXext)+' Yext='+floattostr(BotCoordYext)+' Zext='+floattostr(BotCoordZext));
end;

//************************************************** **************************
//если от сервака принят пакет с ИД и Координатами членов пати то
if FromServer and (ConnectName=Name) and (pck[1]=#$a7) then begin
//запоминаем ИД командира
CharID:=ReadD(6);
if scrready then exit
else begin
Say('Скрипт готов к работе. Запомнил ИД лидера');
scrready:=true;
end;
end;

//************************************************** **************************
//если от сервака принят пакет с UserInfo
if FromServer and (ConnectName=Name) and (pck[1]=#$04) then begin
//Запоминаем собственный ИД
CharID:=ReadD(18);
if scrready then exit
else begin
Say('Скрипт готов к работе. Запомнил ИД лидера');
scrready:=true;
end;
end;

//************************************************** **************************
//если от сервака принят пакет с PetInfo
if FromServer and (PetID=0) and (ConnectName=Name) and (pck[1]=#$b1) then PetID:=ReadD(6);

//************************************************** **************************
//DropItem - выпала вещь
if FromServer and (ConnectName=Name) and (pck[1]=#$0C) then begin
//чужие вещи не берем
if (Attacker=ReadD(2)) then begin
timer1.enabled:=false; //выключаем бота
AddMob:=true;
//перебираем базу
for i:=1 to max do begin
//если нашли, то корректируем его координаты на новые
if (ItemBase[1,i]=ReadD(6)) then begin //ObjectID
ItemBase[2,i]:=ReadD(14); //x
ItemBase[3,i]:=ReadD(18); //y
ItemBase[4,i]:=ReadD(22); //z
AddMob:=false;
inc(itm);
NeedBackup:=true;
say('Корректируем данные по предмету');
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем
for i:=1 to max do begin
if (ItemBase[1,i]=0) then begin
//запоминаем в свободную ячейку
ItemBase[1,i]:=ReadD(6); //ObjectID
ItemBase[2,i]:=ReadD(14); //x
ItemBase[3,i]:=ReadD(18); //y
ItemBase[4,i]:=ReadD(22); //z
inc(itm);
NeedBackup:=true;
say('Добавили данные по предмету');
break;
end;
end;
end;
say('ColvoItm='+inttostr(itm));
end;

//************************************************** **************************
//Пока отключил. Бежит сломя голову за тридевять земель, не обращая внимания что лежит рядом.
//To Do: Сделать проверку на расстояние.
//SpawnItem - выляется вещь
{if FromServer and (ConnectName=Name) and (pck[1]=#$0B) then begin
timer1.enabled:=false; //выключаем бота
AddMob:=true;
//перебираем базу
for i:=1 to max do begin
//если нашли, то корректируем его координаты на новые
if (ItemBase[1,i]=ReadD(2)) then begin //ObjectID
ItemBase[2,i]:=ReadD(10); //x
ItemBase[3,i]:=ReadD(14); //y
ItemBase[4,i]:=ReadD(18); //z
AddMob:=false;
inc(itm);
NeedBackup:=true;
say('Корректируем данные по предмету');
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем
for i:=1 to max do begin
if (ItemBase[1,i]=0) and AddMob then begin
//запоминаем в свободную ячейку
ItemBase[1,i]:=ReadD(2); //ObjectID
ItemBase[2,i]:=ReadD(10); //x
ItemBase[3,i]:=ReadD(14); //y
ItemBase[4,i]:=ReadD(18); //z
inc(itm);
NeedBackup:=true;
say('Добавили данные по предмету');
break;
end;
end;
end;
say('ColvoItm='+inttostr(itm));
end;}

//************************************************** **************************
if Wait(time1,2000) and NeedBackup and (underAttack=false) then ReqGetItem;

//************************************************** **************************
//определяем реальность поднятия вещи
//GetItem
if FromServer and (ConnectName=Name) and (pck[1]=#$0D) then begin
//перебираем базу
for i:=1 to max do begin
//если нашли, то обнуляем
if (ItemBase[1,i]=ReadD(6)) then begin //ObjectID
ItemBase[1,i]:=0; //x
ItemBase[2,i]:=0; //x
ItemBase[3,i]:=0; //y
ItemBase[4,i]:=0; //z
dec(itm);
//say('Удаляем данные по предмету');
end;
end;
if itm=0 then begin
needbackup:=false;
timer1.enabled:=true;
end;
say('ColvoItm='+inttostr(itm));
end;

//************************************************** **************************
if FromClient and (ConnectName=Name) and (pck[1]=#$1B) then begin
SocialID:=ReadD(2);
case SocialID of
//социальное действие Yes для начала
6: begin
//if CharID=0 then exit;
CentrKachX:=BotCoordX;
CentrKachY:=BotCoordY;
CentrKachXex:=BotCoordXext;
CentrKachYex:=BotCoordYext;
//say('Получили координаты центра');
say('X='+inttostr(BotCoordX)+' Y='+inttostr(BotCoordY));
timer1.enabled:=true;
Say('Команда Старт!!!');
exit;
end;
//социальное действие No для окончания
5: begin
//if CharID=0 then exit;
timer1.enabled:=false;
Say('Команда Стоп!!!');
exit;
end;
end;
end;
end.

Grinch
03.11.2007, 20:56
фак... ппц ... респект!!!! слов нет :) ждём продолжения

Добавлено спустя 7 минут 55 секунд:
Re:
друзья нужна помощ!
нужно написать скрипт купли-продажи
вот как изменить усе айтем чтоб в пакет дописывалис обджек иди (98штук) я не знаю(
а вопше пакет выглядит так 1E 00 00 00 00 62 00 00 00 BA 3A 01 10 8B 10 00 00 01 00 00 00 BB 3A 01 10 8B 10 00 00 01 00 00 00 BC 3A 01 10 8B 10 00 00 01 00 00 00 BD 3A 01 10 8B 10 00 00 01 00 00 00 BE 3A 01 10 8B 10 00 00 01 00 00 00 BF 3A 01 10 8B 10 00 00 01 00 00 00 C0 3A 01 10 8B 10 00 00 01 00 00 00 C1 3A 01 10 8B 10 00 00 01 00 00 00 C2 3A 01 10 8B 10 00 00 01 00 00 00 C3 3A 01 10 8B 10 00 00 01 00 00 00 C4 3A 01 10 8B 10 00 00 01 00 00 00 C5 3A 01 10 8B 10 00 00 01 00 00 00 C6 3A 01 10 8B 10 00 00 01 00 00 00 C7 3A 01 10 8B 10 00 00 01 00 00 00 C8 3A 01 10 8B 10 00 00 01 00 00 00 CB 3A 01 10 8B 10 00 00 01 00 00 00 CC 3A 01 10 8B 10 00 00 01 00 00 00 CD 3A 01 10 8B 10 00 00 01 00 00 00 CE 3A 01 10 8B 10 00 00 01 00 00 00 CF 3A 01 10 8B 10 00 00 01 00 00 00 D1 3A 01 10 8B 10 00 00 01 00 00 00 D2 3A 01 10 8B 10 00 00 01 00 00 00 D3 3A 01 10 8B 10 00 00 01 00 00 00 D4 3A 01 10 8B 10 00 00 01 00 00 00 D5 3A 01 10 8B 10 00 00 01 00 00 00 D6 3A 01 10 8B 10 00 00 01 00 00 00 D8 3A 01 10 8B 10 00 00 01 00 00 00 D9 3A 01 10 8B 10 00 00 01 00 00 00 DA 3A 01 10 8B 10 00 00 01 00 00 00 DB 3A 01 10 8B 10 00 00 01 00 00 00 DC 3A 01 10 8B 10 00 00 01 00 00 00 DE 3A 01 10 8B 10 00 00 01 00 00 00 DF 3A 01 10 8B 10 00 00 01 00 00 00 E0 3A 01 10 8B 10 00 00 01 00 00 00 E1 3A 01 10 8B 10 00 00 01 00 00 00 E2 3A 01 10 8B 10 00 00 01 00 00 00 E3 3A 01 10 8B 10 00 00 01 00 00 00 E4 3A 01 10 8B 10 00 00 01 00 00 00 E6 3A 01 10 8B 10 00 00 01 00 00 00 E7 3A 01 10 8B 10 00 00 01 00 00 00 E8 3A 01 10 8B 10 00 00 01 00 00 00 E9 3A 01 10 8B 10 00 00 01 00 00 00 EA 3A 01 10 8B 10 00 00 01 00 00 00 EB 3A 01 10 8B 10 00 00 01 00 00 00 EC 3A 01 10 8B 10 00 00 01 00 00 00 ED 3A 01 10 8B 10 00 00 01 00 00 00 EE 3A 01 10 8B 10 00 00 01 00 00 00 EF 3A 01 10 8B 10 00 00 01 00 00 00 F0 3A 01 10 8B 10 00 00 01 00 00 00 F1 3A 01 10 8B 10 00 00 01 00 00 00 F2 3A 01 10 8B 10 00 00 01 00 00 00 F3 3A 01 10 8B 10 00 00 01 00 00 00 F4 3A 01 10 8B 10 00 00 01 00 00 00 F5 3A 01 10 8B 10 00 00 01 00 00 00 F6 3A 01 10 8B 10 00 00 01 00 00 00 F7 3A 01 10 8B 10 00 00 01 00 00 00 F9 3A 01 10 8B 10 00 00 01 00 00 00 FA 3A 01 10 8B 10 00 00 01 00 00 00 FB 3A 01 10 8B 10 00 00 01 00 00 00 FC 3A 01 10 8B 10 00 00 01 00 00 00 FD 3A 01 10 8B 10 00 00 01 00 00 00 FE 3A 01 10 8B 10 00 00 01 00 00 00 FF 3A 01 10 8B 10 00 00 01 00 00 00 00 3B 01 10 8B 10 00 00 01 00 00 00 01 3B 01 10 8B 10 00 00 01 00 00 00 02 3B 01 10 8B 10 00 00 01 00 00 00 03 3B 01 10 8B 10 00 00 01 00 00 00 04 3B 01 10 8B 10 00 00 01 00 00 00 05 3B 01 10 8B 10 00 00 01 00 00 00 06 3B 01 10 8B 10 00 00 01 00 00 00 08 3B 01 10 8B 10 00 00 01 00 00 00 09 3B 01 10 8B 10 00 00 01 00 00 00 0A 3B 01 10 8B 10 00 00 01 00 00 00 0D 3B 01 10 8B 10 00 00 01 00 00 00 0E 3B 01 10 8B 10 00 00 01 00 00 00 0F 3B 01 10 8B 10 00 00 01 00 00 00 10 3B 01 10 8B 10 00 00 01 00 00 00 11 3B 01 10 8B 10 00 00 01 00 00 00 12 3B 01 10 8B 10 00 00 01 00 00 00 13 3B 01 10 8B 10 00 00 01 00 00 00 14 3B 01 10 8B 10 00 00 01 00 00 00 15 3B 01 10 8B 10 00 00 01 00 00 00 16 3B 01 10 8B 10 00 00 01 00 00 00 17 3B 01 10 8B 10 00 00 01 00 00 00 18 3B 01 10 8B 10 00 00 01 00 00 00 19 3B 01 10 8B 10 00 00 01 00 00 00 1A 3B 01 10 8B 10 00 00 01 00 00 00 1B 3B 01 10 8B 10 00 00 01 00 00 00 1C 3B 01 10 8B 10 00 00 01 00 00 00 1D 3B 01 10 8B 10 00 00 01 00 00 00 1E 3B 01 10 8B 10 00 00 01 00 00 00 1F 3B 01 10 8B 10 00 00 01 00 00 00 20 3B 01 10 8B 10 00 00 01 00 00 00 23 3B 01 10 8B 10 00 00 01 00 00 00 24 3B 01 10 8B 10 00 00 01 00 00 00 25 3B 01 10 8B 10 00 00 01 00 00 00 26 3B 01 10 8B 10 00 00 01 00 00 00 27 3B 01 10 8B 10 00 00 01 00 00 00
прошу помощи ибо я еше не все знаю.... :D
народ один я это вижу или пакеты у него в пасете по диоганали совподают :) не ет прикол такой наверное

NLObP
04.11.2007, 15:32
да что та есть похожие) но увы ...)
так что мне некто не может помоч?

В чем помоч-то?

Добавлено спустя 59 минут 57 секунд:
Re: ДА БУДЕТ БОТ!
Немного подправил скрипт Бота.
Внес изменения в кач дракона, чтобы он мог атаковать и без маны.
//автоматический кач '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, CurMP, MaxMP, i : Integer;
tick: Integer;
timerA: TTimer;
timerB: TTimer;
timerHP: TTimer;
MagicAtck:boolean;

//************************************************** ****************************
// Подпрограммы
//************************************************** ****************************
//(c)dmitry501
//если ставить sleep() то скрипт останавливается на время, но и пакеты тоже
//не принимаются и не отправляются, так вот эта функция позваляет избежать этого
function Pause(Timewait: Integer):Boolean;
// сквозная проверка без остановки скрипта
var
t : integer;
begin
result:=false;
t:= Round(Time*86400);
if t>(tick+Timewait) then
begin
tick:=t;
result:=true;
end;
end;

//все сообщения ботов в приватном чате патилидера
//видны только нам
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 OnTimerB(Sender: TObject);
begin
//пакет RequestActionUse;
buf:=hstr('45 10 00 00 00 00 00 00 00 00'); //атака пета
SendToServerEX(Owner);
end;

procedure OnTimerHP(Sender: TObject);
begin
buf:=hstr('45 EE 03 00 00 00 00 00 00 00'); //пет лечиться
SendToServerEX(Owner);
end;

//************************************************** ****************************
// Вызывается при включении скрипта
//************************************************** ****************************
procedure Init;
begin
MagicAtck:=true; //магическая атака
OwnerID:=0;
PetID:=0;
timerA:=TTimer.Create(nil);
timerA.OnTimer:=@OnTimerA;
timerA.enabled:=false;
timerA.interval:=5000; //время отката магии пета
timerB:=TTimer.Create(nil);
timerB.OnTimer:=@OnTimerB;
timerB.enabled:=false;
timerB.interval:=5000; //время отката
timerHP:=TTimer.Create(nil);
timerHP.OnTimer:=@OnTimerHP;
timerHP.enabled:=false;
timerHP.interval:=2000; //время отката лечения пета
end;

//************************************************** ****************************
// Вызывается при выключении скрипта
//************************************************** ****************************
procedure Free;
begin
timerA.Free;
timerB.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
if magicatck then begin
buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
SendToServerEX(Owner);
Say('Атакую магией!');
TimerA.enabled:=true;
TimerB.enabled:=false;
//Say('Включили таймер');
end
else begin
Say('Атакую цель!');
TimerB.enabled:=true;
TimerA.enabled:=false;
end;
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
if magicatck then begin
buf:=hstr('45 ED 03 00 00 00 00 00 00 00'); //магическая атака пета
SendToServerEX(Owner);
Say('Атакую магией!');
TimerA.enabled:=true;
TimerB.enabled:=false;
//Say('Включили таймер');
end
else begin
Say('Атакую цель!');
TimerB.enabled:=true;
TimerA.enabled:=false;
end;
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;
TimerB.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);
CurMP:=ReadD(i);
MaxMP:=ReadD(i);
if (CurHP<MaxHP)
then TimerHP.enabled:=true
else TimerHP.enabled:=false;
if (CurMP<MaxMP/2) then MagicAtck:=false else MagicAtck:=true; //магическая атака
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);
CurMP:=ReadD(i);
MaxMP:=ReadD(i);
//Say('Считываем параметры пета');
if (CurHP<MaxHP)
then TimerHP.enabled:=true
else TimerHP.enabled:=false;
if (CurMP<MaxMP/2) then MagicAtck:=false else MagicAtck:=true; //магическая атака
end;
end.

DeVolf
04.11.2007, 19:43
да что та есть похожие) но увы ...)
так что мне некто не может помоч?

В чем помоч-то?
2ой пост на етой странице

NLObP
05.11.2007, 02:29
да что та есть похожие) но увы ...)
так что мне некто не может помоч?
В чем помоч-то?
2ой пост на етой странице
Подробно напиши что тебе надо, по пунктам. И названия пакетов пиши по английски. Что за пакет выложил, это ведь не UseItem? Что напишу скрипт не обещаю, мне может не интересно будет.

DeVolf
05.11.2007, 16:05
Вот что мне нада сделать
1 Отослать пакет на сервер (бай айтем)
2 Провести инвентаризацию
3 Найти все айтемы с ИД 4235
4 Добавить ети айтемы в пакет продажи

NLObP
08.11.2007, 02:17
Формируем пакет на продажу нескольких предметов с одинаковым ItemId, вроде визуально все правильно. Продавец в таргете. Послали пакет. Ничего не продается. Почему? Почему если одно и тоже несколько раз в пакете написать, то продается один предмет из посланного пакета?! В чем загвоздка?

Создаем пакет продажи вещей:
//************************************************** ****************************
//1E=RequestSellItem:h(ListID)d(SellCount)h(ObjectID )i(ItemID)d(Count)
procedure RequestSellItem;
var
i, j : integer;
begin
say('Продадим '+inttostr(ColvoItm2)+' предмет(а) ItemID='+inttostr(Item));
buf:=#$1E;
WriteD(0);
WriteD(ColvoItm2);
for i:=1 to ColvoItm2 do begin
WriteD(ItemBase2[1,i]);
WriteD(ItemBase2[2,i]);
WriteD(ItemBase2[3,i]);
end;
say(buf='+strtohex(buf));
SendToServerEx(Name);
end;

08.11.2007, 11:46
Советую добавить в скрипт такой вот кусок:
if FromServer and (ConnectName=CharName) and (Timer.enabled=true) and (ManorPCK<>'') and (pck[1]=#$27) then
begin
ManorPCK:='';
Timer.enabled:=false;
end;
Это чтобы не запалиться, когда скрипт будет тыкаться сдать то, чего уже и в инвентаре то нету...
Типо если приходит пакет о том чот содержимое инвентаря изменилось => манор сдался

PunkRediska
11.11.2007, 12:23
Я шас папробывал написать скриптик каторый сразу падымал бы дроп упавший с моба,но сталкнулся с такой праблемай что он падымает тока 1'ну вешь из всех дропнувшыхся.Умные люди падскажите как ето можно исправить?:)Скриптик мой выгледит так :
var
begin
if FromServer and (pck[1]=#$0C)
then begin
buf:=#$04+pck[6]+pck[7]+pck[8]+pck[9]+pck[14]+pck[15]+pck[16]+pck[17]+pck[18]+pck[19]+pck[20]+pck[21]+pck[22]+pck[23]+pck[24]+pck[25]+#$00;
SendToServer;
end;
end.

^этот^ cкрипт прост до безабразия но вобшемто сложнее и не надо:).Кста если гдето струтура пакета отлечяется от вашей,то ето бырее всего патамушто скрипт под явавскую интерлюдию.

NLObP
11.11.2007, 13:19
Я шас папробывал написать скриптик каторый сразу падымал бы дроп упавший с моба,но сталкнулся с такой праблемай что он падымает тока 1'ну вешь из всех дропнувшыхся.Умные люди падскажите как ето можно исправить?:)Скриптик мой выгледит так :
var
begin
if FromServer and (pck[1]=#$0C)
then begin
buf:=#$04+pck[6]+pck[7]+pck[8]+pck[9]+pck[14]+pck[15]+pck[16]+pck[17]+pck[18]+pck[19]+pck[20]+pck[21]+pck[22]+pck[23]+pck[24]+pck[25]+#$00;
SendToServer;
end;
end.

^этот^ cкрипт прост до безабразия но вобшемто сложнее и не надо:).Кста если гдето струтура пакета отлечяется от вашей,то ето бырее всего патамушто скрипт под явавскую интерлюдию.

Как я сделал в ботике, выше по теме. В основном цикле создаем базу по выпавшим вещам:
//************************************************** **************************
//DropItem - выпала вещь
if FromServer and (ConnectName=Name) and (pck[1]=#$0C) then begin
//чужие вещи не берем
if (Attacker=ReadD(2)) then begin
timer1.enabled:=false; //выключаем бота
//перебираем базу, ищем свободную ячейку в ней и добавляем
for i:=1 to max do begin
if (ItemBase[1,i]=0) then begin
//запоминаем в свободную ячейку
ItemBase[1,i]:=ReadD(6); //ObjectID
ItemBase[2,i]:=ReadD(14); //x
ItemBase[3,i]:=ReadD(18); //y
ItemBase[4,i]:=ReadD(22); //z
inc(itm);
NeedBackup:=true;
say('Добавили данные по предмету');
break;
end;
end;
end;
say('ColvoItm='+inttostr(itm));
end;

Подпрограмма сбора вещей. Здесь только просим поднять, на практике вещь может не взяться, недоступна к примеру и т.д.:
//************************************************** ****************************
procedure ReqGetItem;
begin
if itm=0 then begin
timer1.enabled:=true; //включаем отсчет времени
needbackup:=false;
exit;
end;
timer1.enabled:=false; //выключаем отсчет времени
//перебираем базу
for i:=1 to max do begin
//если нашли, то обнуляем
if (ItemBase[1,i]<>0) then begin //ObjectID
say('ReqGetItem');
//даем команду подобрать вещь
buf:=#$04;
WriteD(ItemBase[1,i]);
WriteD(ItemBase[2,i]);
WriteD(ItemBase[3,i]);
WriteD(ItemBase[4,i]);
WriteH(00);
SendToServerEx(Name);
end;
end;
end;

В основном цикле проверяем, что вещи реально подняты:
//************************************************** **************************
//определяем реальность поднятия вещи, пакет GetItem
if FromServer and (ConnectName=Name) and (pck[1]=#$0D) then begin
//перебираем базу
for i:=1 to max do begin
//если нашли, то обнуляем
if (ItemBase[1,i]=ReadD(6)) then begin //ObjectID
ItemBase[1,i]:=0; //x
ItemBase[2,i]:=0; //x
ItemBase[3,i]:=0; //y
ItemBase[4,i]:=0; //z
dec(itm);
say('Удаляем данные по предмету');
end;
end;
if itm=0 then begin
needbackup:=false;
timer1.enabled:=true;
end;
say('ColvoItm='+inttostr(itm));
end;

PunkRediska
11.11.2007, 19:45
Я шас папробывал написать скриптик каторый сразу падымал бы дроп упавший с моба,но сталкнулся с такой праблемай что он падымает тока 1'ну вешь из всех дропнувшыхся.Умные люди падскажите как ето можно исправить?:)Скриптик мой выгледит так :
var
begin
if FromServer and (pck[1]=#$0C)
then begin
buf:=#$04+pck[6]+pck[7]+pck[8]+pck[9]+pck[14]+pck[15]+pck[16]+pck[17]+pck[18]+pck[19]+pck[20]+pck[21]+pck[22]+pck[23]+pck[24]+pck[25]+#$00;
SendToServer;
end;
end.

^этот^ cкрипт прост до безабразия но вобшемто сложнее и не надо:).Кста если гдето струтура пакета отлечяется от вашей,то ето бырее всего патамушто скрипт под явавскую интерлюдию.

Как я сделал в ботике, выше по теме. В основном цикле создаем базу по выпавшим вещам:
//************************************************** **************************
//DropItem - выпала вещь
if FromServer and (ConnectName=Name) and (pck[1]=#$0C) then begin
//чужие вещи не берем
if (Attacker=ReadD(2)) then begin
timer1.enabled:=false; //выключаем бота
//перебираем базу, ищем свободную ячейку в ней и добавляем
for i:=1 to max do begin
if (ItemBase[1,i]=0) then begin
//запоминаем в свободную ячейку
ItemBase[1,i]:=ReadD(6); //ObjectID
ItemBase[2,i]:=ReadD(14); //x
ItemBase[3,i]:=ReadD(18); //y
ItemBase[4,i]:=ReadD(22); //z
inc(itm);
NeedBackup:=true;
say('Добавили данные по предмету');
break;
end;
end;
end;
say('ColvoItm='+inttostr(itm));
end;

Подпрограмма сбора вещей. Здесь только просим поднять, на практике вещь может не взяться, недоступна к примеру и т.д.:
//************************************************** ****************************
procedure ReqGetItem;
begin
if itm=0 then begin
timer1.enabled:=true; //включаем отсчет времени
needbackup:=false;
exit;
end;
timer1.enabled:=false; //выключаем отсчет времени
//перебираем базу
for i:=1 to max do begin
//если нашли, то обнуляем
if (ItemBase[1,i]<>0) then begin //ObjectID
say('ReqGetItem');
//даем команду подобрать вещь
buf:=#$04;
WriteD(ItemBase[1,i]);
WriteD(ItemBase[2,i]);
WriteD(ItemBase[3,i]);
WriteD(ItemBase[4,i]);
WriteH(00);
SendToServerEx(Name);
end;
end;
end;

В основном цикле проверяем, что вещи реально подняты:
//************************************************** **************************
//определяем реальность поднятия вещи, пакет GetItem
if FromServer and (ConnectName=Name) and (pck[1]=#$0D) then begin
//перебираем базу
for i:=1 to max do begin
//если нашли, то обнуляем
if (ItemBase[1,i]=ReadD(6)) then begin //ObjectID
ItemBase[1,i]:=0; //x
ItemBase[2,i]:=0; //x
ItemBase[3,i]:=0; //y
ItemBase[4,i]:=0; //z
dec(itm);
say('Удаляем данные по предмету');
end;
end;
if itm=0 then begin
needbackup:=false;
timer1.enabled:=true;
end;
say('ColvoItm='+inttostr(itm));
end;


спс что выложил ,тока ты не вылажил первую чясть где аписуются переменные и я чёто непайму Attacker-это PlayerID?:)

Добавлено спустя 29 минут 53 секунды:
всё нашол часть с переменными:) чюток подправил под себя и всё пашет СПС тебе NLObP !!

Добавлено спустя 4 часа 21 минуту 2 секунды:
Чёто у меня сёдня день какойто неудачный,скрипты не пашут ваше....Пришол от друга накалякал такой скрипточег ->
\\суть скрипта:если паявился чест то юзать анлок
var i:string;
begin
if FromServer and (pck[1]=#$16) and (pck[6]+pck[7]+pck[8]+pck[9]=#$9f+#$89+#$0f+#$00) then begin \\условия ,pck-npcinfo
buf:=#$04+hstr('(readd(2))+(readd(14))+(readd(18)) +(readd(24))') + #$00; \\таргет
SendToServer;
buf:=hstr('2F 1B 00 00 00 00 00 00 00 00 '); \\юзать анлок
SendToServer;
end;
end.
Вроде просто да безабразия а сёравно не пашет:( может ктонибудь абьеснить пачему?:)

NLObP
11.11.2007, 19:59
Чёто у меня сёдня день какойто неудачный,скрипты не пашут ваше....Пришол от друга накалякал такой скрипточег ->
\\суть скрипта:если паявился чест то юзать анлок
var i:string;
begin
if FromServer and (pck[1]=#$16) and (pck[6]+pck[7]+pck[8]+pck[9]=#$9f+#$89+#$0f+#$00) then begin \\условия ,pck-npcinfo
buf:=#$04+hstr('(readd(2))+(readd(14))+(readd(18)) +(readd(24))') + #$00; \\таргет
SendToServer;
buf:=hstr('2F 1B 00 00 00 00 00 00 00 00 '); \\юзать анлок
SendToServer;
end;
end.
Вроде просто да безабразия а сёравно не пашет:( может ктонибудь абьеснить пачему?:)

Вот так надо, координату Z неправильно считываешь
buf:=#$04+hstr('(readd(2))+(readd(14))+(readd(18)) +(readd(22))') + #$00; \\таргет

PunkRediska
11.11.2007, 20:13
с карденатай ето я случяйно ашибся када переписывал....там в чёмто другом праблема:(

NLObP
11.11.2007, 22:22
с карденатай ето я случяйно ашибся када переписывал....там в чёмто другом праблема:(
Может близко стоять надо?

PunkRediska
12.11.2007, 16:53
с карденатай ето я случяйно ашибся када переписывал....там в чёмто другом праблема:(
Может близко стоять надо?

я разабрался в чём там праблема.....там кагда хп моба=0 вылетают паакеты нескалько из каторых дроп айтим причём они идут падрят с интервалам в t причём t стремиться к нулю и t> чем время обработки скрипта вобшем праблема в движке он запускает скрипт для первого пакета а, пака скрипт выпалняеться приходят несколко других пакетав.Вот и палучяеться что кагда скрипт атправляет пакет паднять кол-во пришедших на клиент паетав дроп айтим>1ого,но следуйший абрабатываемый пакет это не тот пакет каторый был после 1ого дроп айтима а тот пакет каторый идёт за пакетам каторый атаслал скрипт.

Добавлено спустя 1 час 1 минуту 42 секунды:
Ёпт ^выше описано^ это глюк с скриптам сборшикам лута(каторый писал я ) :) но баг движка астаёться в силе:)

NLObP
12.11.2007, 18:33
l2phx наезжает на строчку в этой строке:
ListCount:=ReadH(j); //количество итемов не должно превышать max!
И что это значит?это он выделяет когда ещё неподключился к клиенту,а когда подключается,то постоянно выдаёт ошибки

У тебя какие хроники? Для С4 и Интерлюдии отличается скрипт.
Скопируй в свой скрипт взамен своего, и расскоментируй нужную часть, закоменти ненужную:
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; //если больше, то игнорируем и используем значение из 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;
inc(ss);
end;
weapon: begin
WpnBase[1,ww]:=ObjID;
WpnBase[2,ww]:=lvl;
inc(ww);
end;
end;
//для С4
j:=j+2;
//для Интерлюдии
//j:=j+10;
end;
dec(ColvoWpn);
dec(ColvoScrl);
end;

Замени у себя еще проедуру INIT на эту, здесь сразу запрашивается список предметов:
procedure Init; //Вызывается при включении скрипта
var
i:integer;
begin
CurEnchLvl:=0;
timer:=TTimer.Create(nil);
timer.OnTimer:=@OnTimerHP;
timer.enabled:=false;
timer.interval:=5000; //время задержки
add:=false;
//RequestItemList запрашиваем пакет списка предметов
buf:=hstr('0F');
SendToServerEx(Name);
end;


Добавлено спустя 17 минут 25 секунд:
l2phx наезжает на строчку в этой строке:
ListCount:=ReadH(j); //количество итемов не должно превышать max!
И что это значит?это он выделяет когда ещё неподключился к клиенту,а когда подключается,то постоянно выдаёт ошибки

Не забудь поправить под себя вот эти константы:
const
Name='NLObP'; //заменить на имя своего чара
Scroll=957; // чем будем точить, например 957 - ItemID Crystall Scroll Enchant Weapon (Grade D)
Weapon=129; //что будем точить, например 129 - ItemID Sword of Revolution
MaxEnchLvl=21; //поставить максимальный желаемый уровень заточки, не факт что доточится =)


Добавлено спустя 7 минут 56 секунд:
Re: Re:
я разабрался в чём там праблема.....там кагда хп моба=0 вылетают паакеты нескалько из каторых дроп айтим причём они идут падрят с интервалам в t причём t стремиться к нулю и t> чем время обработки скрипта вобшем праблема в движке он запускает скрипт для первого пакета а, пака скрипт выпалняеться приходят несколко других пакетав.Вот и палучяеться что кагда скрипт атправляет пакет паднять кол-во пришедших на клиент паетав дроп айтим>1ого,но следуйший абрабатываемый пакет это не тот пакет каторый был после 1ого дроп айтима а тот пакет каторый идёт за пакетам каторый атаслал скрипт.


Все верно пишешь. Только надо учесть, что сама прога успевает посмотреть все пакеты, так как она их шифрует/дешифрует. Не успевает клиент за скриптом. Для этого пакетики мы в базу складываем, а потом заставляем клиента все пакетики исполнить. У меня лично, все предметы собирает, но бывает и подглючивает.

PunkRediska
12.11.2007, 19:18
Добавлено спустя 7 минут 56 секунд:
Re: Re:
я разабрался в чём там праблема.....там кагда хп моба=0 вылетают паакеты нескалько из каторых дроп айтим причём они идут падрят с интервалам в t причём t стремиться к нулю и t> чем время обработки скрипта вобшем праблема в движке он запускает скрипт для первого пакета а, пака скрипт выпалняеться приходят несколко других пакетав.Вот и палучяеться что кагда скрипт атправляет пакет паднять кол-во пришедших на клиент паетав дроп айтим>1ого,но следуйший абрабатываемый пакет это не тот пакет каторый был после 1ого дроп айтима а тот пакет каторый идёт за пакетам каторый атаслал скрипт.


Все верно пишешь. Только надо учесть, что сама прога успевает посмотреть все пакеты, так как она их шифрует/дешифрует. Не успевает клиент за скриптом. Для этого пакетики мы в базу складываем, а потом заставляем клиента все пакетики исполнить. У меня лично, все предметы собирает, но бывает и подглючивает.

тоесть шёчики в скриптах ка4 с драконьчекам,лакаматив и т.д. нужны что бы все каманды выпалнялись клиентам своевременно?Я чесно гаваря плохо панемаю как именно пашют эти скрипты так-как там дофига процедур и функций , а их работу я панемаю в обших чертах,тоесть я панемаю как пашет процедура панемаю зачем она ,но писать их неумею и ненаю как они вызываються:)

Добавлено спустя 19 минут 56 секунд:
слушай NLObP я канешно читаю правила форума 4 раза на день,но всё таки памаги пожжалуйсто с такой ситуацией:
я нашол место где стаит 3 яшика рядам и сразу захател написать скрипт бот,но так как я незнаю как описывать процедуры решил писать систему скриптав каторые работая одновременно заменяли 1 нармальный скрипт вот они->
1.открывалка
var i:integer;
begin

if FromServer and (pck[1]=#$16) then begin
buf:=#$04+hstr('(readd(2))+(readd(14))+(readd(18)) +(readd(22))') + #$00;
SendToServer;
buf:=hstr('04 C2 B9 1E 10 A3 55 01 00 C3 46 01 00 09 F4 FF FF 00 ');
SendToServer; SendToServer;
i:=1;
end;
buf:=hstr('04 3D 97 1E 10 D5 55 01 00 3B 46 01 00 F8 F3 FF FF 00');
SendToServer;
end.
2.если чест огрызаеться
begin
if fromserver and (pck[1]=#$05) then begin
buf:=#$04+hstr('(readd(6))+(readd(15))+(readd(19)) +(readd(23))')+#$00#$00;
SendToServer;
buf:=hstr('2F 07 01 00 00 00 00 00 00 00 ');
SendToServer;
end;
end.
3.сабрать лут
var
I,a:integer; s,r:string;
begin
if FromServer and (pck[1]=#$0C)
then begin
buf:=#$04+pck[6]+pck[7]+pck[8]+pck[9]+pck[14]+pck[15]+pck[16]+pck[17]+pck[18]+pck[19]+pck[20]+pck[21]+pck[22]+pck[23]+pck[24]+pck[25]+#$00;
SendToServer;
end;end.

суть скриптав ясна,вскрывать бокс ,если чест то кил чест, и саберать лут в обоих случаях.естественно написал спамагательные скрипты :жрать хп,ультима,тест на наличее рядам чара(если чар то сесть на прадажу д армор точки за-500к с надписью "афк на долго";
эти скрипты я писал буквально час ,а с их некаректной работай не магу справиться чясами.NLObP памаги мне пажжалусто малини скрипт каторый их бы заменял пожалуйсто,а то я уже за-и-пался и за флудился ппц!:)кста если решишся памочь,то мож сможеш и вспамагательные скрипты в 1 сабрать?:)
P.S. серв интерлюдия, ява:(

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

Добавлено спустя 2 минуты 46 секунд:
даже добавлю что IDAssistTarget надо брать из пакетов клиента командира (а не пакетов сервера).

ID таргета суммонеру никак не передашь.
Управление суммоном идет пакетом RequestActionUse. Суммон аттакует цель в таргете у хозяина, таргет должен быть в зоне видимости. Да и если цель есть в таргете у хозяина, но находится далеко - суммон не идет ее бить.
Соответственно все разговоры о каче с суммонами идут прахом.

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

Добавлено спустя 2 минуты 46 секунд:
даже добавлю что IDAssistTarget надо брать из пакетов клиента командира (а не пакетов сервера).

ID таргета суммонеру никак не передашь.
Управление суммоном идет пакетом RequestActionUse. Суммон аттакует цель в таргете у хозяина, таргет должен быть в зоне видимости. Да и если цель есть в таргете у хозяина, но находится далеко - суммон не идет ее бить.
Соответственно все разговоры о каче с суммонами идут прахом.
ты не прав, то что сумон атакует цель которая находится в таргете хозяина это все работа клиента, а пакет атаки сумона прост - тупо ИД таргета и его координаты, и пофиг где хозяин. А ид моба и его координаты мы берем от коммандира.
Я со своим скриптом уводил на кач сумона за пол карты от его хозяина

NLObP
14.11.2007, 04:42
Скрипт на бота-мага. Бьет магией, отбегает, подбирает выпавшие предметы.
Можно совместно качать 'Hachling of Star'
//Бот_маг with 'Hachling of Star' by NLObP
{
Социальное действие YES включить
Социальное действие NO выключить

Скрипт распространяется как есть, и я не несу ответственности за то, что
ВЫ натворили у себя, его используя.
}

//************************************************** ****************************
Const
Name='NLObP'; //имя чара
Pet=''; //имя Пета
max=500; //max количество контролируемых мобов
Radius=1500; //радиус участка для поиска мобов
DeltaZ=250; //глубина/высота до мобов
Distance=600; //дистанция до моба
icebolt=1184; //ice bolt
windstrike=1177; //Wind Strike

//************************************************** ****************************
VAR
NameChar: string;
CharID, PetID, Attacker, ObjectID: integer;
CentrKachX,CentrKachY,CentrKachZ,RadiusKachX,Radiu sKachY: integer;
CentrKachXex,CentrKachYex,RadiusKachXex,RadiusKach Yex: extended;
tempX,tempY, tempLenght: extended;
tempZ, ColvoMobs: integer;

xe,ye: extended;
x,y,z,ox,oy,oz,n: integer;

MobCurHP, MobMaxHP, CurHP, MaxHP, CurMP, MaxMP: integer;
BotCoordX,BotCoordY,BotCoordZ: integer; //координаты бота
BotCoordXext,BotCoordYext,BotCoordZext:extended;
MinPutID: integer; //указывает индекс моба в базе путь до которого самый короткий
MinPutLenght: extended; //расстояния до ближайшего моба
timer1: TTimer; //основной таймер
timer2: TTimer; //вспомогательный
timerA: TTimer; //вспомогательный
i, itm, SocialID: integer; // вспомогательная
time1, time2: integer;
AddMob, UnderAttack, scrready, NeedBackup, fire: boolean;

ItemBase: array[1..4,1..max] of integer; // описатель предметов
CharBase: array[1..4,1..max] of integer; // описатель игроков (которых не атакуем)
MobBase: array[1..4,1..max] of integer; // описатель мобов вокруг
MobBaseExt: array[1..4,1..max] of extended; // описатель мобов вокруг вспомогательная
{ 1 - ID
2 - X
3 - Y
4 - Z}

//************************************************** ****************************
procedure Init; //Вызывается при включении скрипта
begin
UnderAttack:=false;
itm:=0;
NeedBackup:=false;
scrready:=false;
colvomobs:=0;
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer1;
timer1.enabled:=False;
timer1.interval:=1500; //каждые 2 сек ищем ближайшего моба для атаки
timerA:=TTimer.Create(nil);
timerA.OnTimer:=@OnTimerA;
timerA.enabled:=False;
timerA.interval:=1500; //каждые 2 сек магическая атака
timer2:=TTimer.Create(nil);
timer2.OnTimer:=@OnTimer2;
timer2.enabled:=false;
timer2.interval:=5000;
//RequestItemList
buf:=hstr('0F');
SendToServerEx(Name);
end;

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

//************************************************** ****************************
//сообщения в приват, на сервер не отправляются
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
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 ReqGetItem;
begin
if itm=0 then begin
timer1.enabled:=true; //включаем отсчет времени
needbackup:=false;
exit;
end;
timer1.enabled:=false; //выключаем отсчет времени
//перебираем базу
for i:=1 to max do begin
//если нашли, то обнуляем
if (ItemBase[1,i]<>0) then begin //ObjectID
say('ReqGetItem');
//даем команду подобрать вещь
buf:=#$04;
WriteD(ItemBase[1,i]);
WriteD(ItemBase[2,i]);
WriteD(ItemBase[3,i]);
WriteD(ItemBase[4,i]);
WriteH(00);
SendToServerEx(Name);
end;
end;
end;

//************************************************** ****************************
procedure OnTimer2(Sender: TObject);
begin
UnderAttack:=false; //отцепимся от атакуемого
if itm>0 then needbackup:=true;
end;

//************************************************** ****************************
//0E=StatusUpdate:h(ObjectID)d(AttribCount)d(AttrID) d(AttrValue)
procedure StatusUpdate;
var
i: integer;
begin
for i:=0 to ReadD(6)-1 do begin
case pck[i*8+10] of
#$09: MobCurHP:=ReadD(i*8+14);
#$0A: MobMaxHP:=ReadD(i*8+14);
end;
end;
if (MobCurHP<=0) then begin
underattack:=false;
say('Убили!');
end;
end;

//************************************************** ****************************
procedure OnTimer1(Sender: TObject);
begin
//не вычисляем, если уже атакуем
if UnderAttack then exit;

MinPutID:=0;
MinPutLenght:=99999999;

///ищем самого близкого к нам моба
for i:=1 to max do begin
if (MobBaseExt[1,i]<>0) then begin
tempX:=MobBaseExt[2,i];
tempY:=MobBaseExt[3,i];
//расстояние по теореме Пифагора: c^2=a^2+b^2
tempLenght:=int(sqrt((BotCoordXext-tempx)*(BotCoordXext-tempx)+(BotCoordYext-tempy)*(BotCoordYext-tempy)));
if (tempLenght<MinPutLenght) and (PetID<>MobBase[1,i]) and (CharID<>MobBase[1,i]) then begin
MinPutLenght:=tempLenght;
MinPutID:=i;
end;
end;
end;
if (minputid<>0) then begin
Attacker:=MobBase[1,MinPutID];
TargetAttacker(Attacker);
say('Атакуем моба!');
end
else MoveCenter;
end;


//************************************************** ****************************
//01=MoveBackwardToLocation:d(targetX)d(targetY)d(ta rgetZ)d(originX)d(originY)d(originZ)d(moveByMouse)
procedure MoveDistance;
begin
xe:=MobBase[2,MinPutID]+Distance/4+round(random*(Distance/4));
ye:=MobBase[3,MinPutID]+Distance/4+round(random*(Distance/4));

x:=round(xe);
y:=round(ye);
z:=MobBase[4,MinPutID];

buf:=#$01;
WriteD(x);
WriteD(y);
WriteD(z);
WriteD(BotCoordx);
WriteD(BotCoordy);
WriteD(BotCoordz);
WriteD(01);
SendToServerEx(Name);
say('держим дистанцию');
end;

procedure MoveCenter;
begin
buf:=#$01;
WriteD(CentrKachx);
WriteD(CentrKachy);
WriteD(CentrKachz);
WriteD(BotCoordx);
WriteD(BotCoordy);
WriteD(BotCoordz);
WriteD(01);
SendToServerEx(Name);
say('бежим в центр');
end;
//************************************************** ****************************
procedure TargetAtt;
begin
buf:=#$04;
WriteD(Attacker);
WriteD(BotCoordX);
WriteD(BotCoordY);
WriteD(BotCoordZ);
WriteC(00);
SendToServerEx(Name);
end;

//************************************************** *************
//2F=RequestMagicSkillUse:h(MagicID)d(CtrlPressed)b( ShiftPressed)
procedure MagicSkillUse(MagicID:integer);
begin
buf:=#$2F;
WriteD(MagicID);
WriteD(00);
WriteC(00);
SendToServerEx(Name);
end;

//************************************************** ****************************
procedure OnTimerA(Sender: TObject);
begin
MagicSkillUse(windstrike);
MoveDistance;
say('magic attack');
end;

//************************************************** ****************************
procedure TargetAttacker(Attacker: Integer);
begin
TargetAtt;
timerA.enabled:=true;
UnderAttack:=true; //зацепимся за атакуемого
end;

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

//************************************************** **************************
//не пропускаем пустые пакеты
if pck='' then exit;

//************************************************** **************************
//16=NpcInfo:h(ObjectID)d(NpcTypeID)d(IsAttackable)d (X)d(Y)d(Z)d(Heading)d(d)d(Maspd)d(Paspd)d(runSpd) d(walkSpd)d(swimRSpd)d(swimWSpd)d(flRSpd)d(flWSpd) d(FlyRSpd)d(FlyWSpd)f(ProperMul)f(Paspd)f(CollisRa dius)f(CollisHeight)d(RHand)d(d)d(LHand)b(nameabov e)b(isRun)b(isInFight)b(isAlikeDead)b(isSummoned)s (Name)s(Title)d(d)d(d)d(karma?)d(abnEffect)d(d)d(d )d(d)d(d)b(c)b(Team)f(collisRadius)f(collisHeight) d(d)
//NPCInfo, запоминаем мобов
if FromServer and (ConnectName=Name) and (pck[1]=#$16) then begin
AddMob:=true;

//проверка, входит моб в радиус действия?
tempX:=ReadD(14); //x
tempY:=ReadD(18); //y
tempLenght:=sqrt((CentrKachXex-tempX)*(CentrKachXex-tempX)+(CentrKachYex-tempY)*(CentrKachYex-tempY));

//проверям, не под землей ли моб(в катакомбах)
tempZ:=BotCoordZ-ReadD(22);
if tempz<0 then tempZ:=tempz*(-1);
if tempZ<=DeltaZ then begin
if (tempLenght<Radius) then begin
for i:=1 to max do begin
//если нашли Моба в базе, то коректируем его координаты на новые
if (MobBase[1,i]=ReadD(2)) and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) then begin
MobBase[2,i]:=ReadD(14); //x
MobBase[3,i]:=ReadD(18); //y
MobBase[4,i]:=ReadD(22); //z
//Ext массив
MobBaseExt[2,i]:=ReadD(14); //x
MobBaseExt[3,i]:=ReadD(18); //y
MobBaseExt[4,i]:=ReadD(22); //z
AddMob:=false;
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового моба
for i:=1 to max do begin
if (MobBase[1,i]=0) and AddMob and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) then begin
//запоминаем моба в свободную ячейку
MobBase[1,i]:=ReadD(2); //ObjectID
MobBase[2,i]:=ReadD(14); //x
MobBase[3,i]:=ReadD(18); //y
MobBase[4,i]:=ReadD(22); //z
//Ext массив
MobBaseExt[1,i]:=ReadD(2); //ObjectID
MobBaseExt[2,i]:=ReadD(14); //x
MobBaseExt[3,i]:=ReadD(18); //y
MobBaseExt[4,i]:=ReadD(22); //z
inc(colvomobs);
say('Запоминаем координаты Моба'+' ColvoMobs='+inttostr(colvomobs));
break;
end;
end;
end;
end;
end;

//************************************************** **************************
//CharInfo, запоминаем игроков
if FromServer and (ConnectName=Name) and (pck[1]=#$03) then begin
AddMob:=true;
for i:=1 to max do begin
//если нашли чара в базе, то коректируем его координаты на новые
if (CharBase[1,i]=ReadD(18)) then begin
CharBase[2,i]:=ReadD(2); //x
CharBase[3,i]:=ReadD(6); //y
CharBase[4,i]:=ReadD(10); //z
AddMob:=false;
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового чара
for i:=1 to max do begin
if (CharBase[1,i]=0) and AddMob then begin
//запоминаем моба в свободную ячейку
CharBase[1,i]:=ReadD(18); //ObjectID
CharBase[2,i]:=ReadD(2); //x
CharBase[3,i]:=ReadD(6); //y
CharBase[4,i]:=ReadD(10); //z
NameChar:=ReadS(22);
say('Приближается Игрок '+NameChar+'!!!');
break;
end;
end;

for i:=1 to max do begin
//если нашли Чара в базе Мобов, то удаляем его
if (MobBase[1,i]=ReadD(18)) then begin
MobBase[1,i]:=0; //x
MobBase[2,i]:=0; //x
MobBase[3,i]:=0; //y
MobBase[4,i]:=0; //z
//Ext массив
MobBaseExt[1,i]:=0; //x
MobBaseExt[2,i]:=0; //x
MobBaseExt[3,i]:=0; //y
MobBaseExt[4,i]:=0; //z
dec(colvomobs);
say('Нашли Чара в базе Мобов, удаляем его'+' ColvoMobs='+inttostr(colvomobs));
end;
end;
end;

//************************************************** **************************
//MoveToLocation, коректируем координаты мобов в базе
if FromServer and (ConnectName=Name) and (pck[1]=#$01) then begin
AddMob:=true;
//проверка, входит моб в радиус действия?
tempX:=ReadD(6); //x
tempY:=ReadD(10); //y
tempLenght:=sqrt((CentrKachXex-tempX)*(CentrKachXex-tempX)+(CentrKachYex-tempY)*(CentrKachYex-tempY));
tempZ:=BotCoordZ-ReadD(14);
if tempz<0 then tempZ:=tempz*(-1);
if tempZ<=DeltaZ then begin
if (int(tempLenght)<Radius) then begin
//перебираем базу и ищем там моба, который бежит
for i:=1 to max do begin
//если нашли моба в базе, то коректируем его координаты на новые
if (MobBase[1,i]=ReadD(2)) and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) and (CharBase[1,i]<>ReadD(2)) then begin //ObjectID
MobBase[2,i]:=ReadD(6); //x
MobBase[3,i]:=ReadD(10); //y
MobBase[4,i]:=ReadD(14); //z
//Ext массив
MobBaseExt[2,i]:=ReadD(6); //x
MobBaseExt[3,i]:=ReadD(10); //y
MobBaseExt[4,i]:=ReadD(14); //z
AddMob:=false;
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем нового моба
for i:=1 to max do begin
if (MobBase[1,i]=0) and AddMob and (CharID<>ReadD(2)) and (PetID<>ReadD(2)) then begin
//запоминаем моба в свободную ячейку
MobBase[1,i]:=ReadD(2); //ObjectID
MobBase[2,i]:=ReadD(6); //x
MobBase[3,i]:=ReadD(10); //y
MobBase[4,i]:=ReadD(14); //z
//Ext массив
MobBaseExt[1,i]:=ReadD(2); //ObjectID
MobBaseExt[2,i]:=ReadD(6); //x
MobBaseExt[3,i]:=ReadD(10); //y
MobBaseExt[4,i]:=ReadD(14); //z
inc(colvomobs);
break;
end;
end;
end;
end;
end;

//************************************************** **************************
//MagicSkillUse 48, Attack 05
if FromServer and (ConnectName=Name) and ((pck[1]=#$48) or (pck[1]=#$05)) then begin
if UnderAttack then exit; //сначало убъем одного
Attacker:=ReadD(2);
ObjectID:=ReadD(6);
if (Attacker<>ObjectID) and (CharID=ObjectID) then begin
UnderAttack:=true; //нас атакуют
needbackup:=false;
Say('Нас атакуют!');
TargetAttacker(Attacker);
end;
end;

//************************************************** **************************
//если принят пакет Die
if FromServer and (ConnectName=Name) and (pck[1]=#$06) then begin
//ищем моба в базе
if (Attacker=ReadD(2)) then begin
UnderAttack:=false; //убили атакующего моба
timerA.enabled:=False;
end;
for i:=1 to max do begin
//очишаем запись связанную с етим мобом
if (MobBase[1,i]=ReadD(2)) then begin
dec(colvomobs);
MobBase[1,i]:=0; //ObjectID
MobBase[2,i]:=0; //x
MobBase[3,i]:=0; //y
MobBase[4,i]:=0; //z
//Ext массив
MobBaseExt[1,i]:=0; //ObjectID
MobBaseExt[2,i]:=0; //x
MobBaseExt[3,i]:=0; //y
MobBaseExt[4,i]:=0; //z
break;
end;
end;
end;

//************************************************** **************************
//если принят пакет DeleteObject
if FromServer and (ConnectName=Name) and (pck[1]=#$12) then begin
//ищем моба в базе
//say('DeleteObject');
if (Attacker=ReadD(2)) then begin
UnderAttack:=false; //убили атакующего моба
timerA.enabled:=False;
end;
for i:=1 to max do begin
//очишаем запись связанную с етим мобом
if (MobBase[1,i]=ReadD(2)) then begin
dec(colvomobs);
MobBase[1,i]:=0; //ObjectID
MobBase[2,i]:=0; //x
MobBase[3,i]:=0; //y
MobBase[4,i]:=0; //z
//Ext массив
MobBaseExt[1,i]:=0; //ObjectID
MobBaseExt[2,i]:=0; //x
MobBaseExt[3,i]:=0; //y
MobBaseExt[4,i]:=0; //z
break;
end;
end;
for i:=1 to max do begin
//если нашли в базе, то удаляем
if (CharBase[1,i]=ReadD(2)) then begin
CharBase[2,i]:=0; //x
CharBase[3,i]:=0; //y
CharBase[4,i]:=0; //z
end;
end;
end;

//************************************************** **************************
//ValidatePosition если принят пакет от клиента с моими кординатами то
if FromClient and (ConnectName=Name) and (pck[1]=#$48) then begin
//запоминаем мои координаты
BotCoordX:=ReadD(2);
BotCoordY:=ReadD(6);
BotCoordZ:=ReadD(10);
//ext
BotCoordXext:=ReadD(2);
BotCoordYext:=ReadD(6);
BotCoordZext:=ReadD(10);
end;

//************************************************** **************************
//если от сервака принят пакет с ИД и Координатами членов пати то
if FromServer and (ConnectName=Name) and (pck[1]=#$a7) then begin
//запоминаем ИД командира
CharID:=ReadD(6);
if scrready then exit
else begin
Say('Скрипт готов к работе. Запомнил ИД лидера');
scrready:=true;
end;
end;

//************************************************** **************************
//если от сервака принят пакет с UserInfo
if FromServer and (ConnectName=Name) and (pck[1]=#$04) then begin
//Запоминаем собственный ИД
CharID:=ReadD(18);
if scrready then exit
else begin
Say('Скрипт готов к работе. Запомнил ИД лидера');
scrready:=true;
end;
end;

//************************************************** **************************
//если от сервака принят пакет с PetInfo
if FromServer and (PetID=0) and (ConnectName=Name) and (pck[1]=#$b1) then PetID:=ReadD(6);

//************************************************** **************************
//DropItem - выпала вещь
if FromServer and (ConnectName=Name) and (pck[1]=#$0C) then begin
//чужие вещи не берем
if (Attacker=ReadD(2)) then begin
timer1.enabled:=false; //выключаем бота
AddMob:=true;
//перебираем базу
for i:=1 to max do begin
//если нашли, то корректируем его координаты на новые
if (ItemBase[1,i]=ReadD(6)) then begin //ObjectID
ItemBase[2,i]:=ReadD(14); //x
ItemBase[3,i]:=ReadD(18); //y
ItemBase[4,i]:=ReadD(22); //z
AddMob:=false;
inc(itm);
NeedBackup:=true;
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем
for i:=1 to max do begin
if (ItemBase[1,i]=0) then begin
//запоминаем в свободную ячейку
ItemBase[1,i]:=ReadD(6); //ObjectID
ItemBase[2,i]:=ReadD(14); //x
ItemBase[3,i]:=ReadD(18); //y
ItemBase[4,i]:=ReadD(22); //z
inc(itm);
NeedBackup:=true;
break;
end;
end;
end;
say('ColvoItm='+inttostr(itm));
end;

//************************************************** **************************
//каждые две сек подбираем предмет
if Wait(time1,2) and NeedBackup and (underAttack=false) then ReqGetItem;

//************************************************** **************************
//определяем реальность поднятия вещи
//GetItem
if FromServer and (ConnectName=Name) and (pck[1]=#$0D) then begin
//перебираем базу
for i:=1 to max do begin
//если нашли, то обнуляем
if (ItemBase[1,i]=ReadD(6)) then begin //ObjectID
ItemBase[1,i]:=0; //x
ItemBase[2,i]:=0; //x
ItemBase[3,i]:=0; //y
ItemBase[4,i]:=0; //z
dec(itm);
//say('Удаляем данные по предмету');
end;
end;
if itm=0 then begin
needbackup:=false;
timer1.enabled:=true;
end;
say('ColvoItm='+inttostr(itm));
end;

//************************************************** ****************************
//StatusUpdate
if FromServer and (ConnectName=Name) and (pck[1]=#$0E) and (Attacker=ReadD(2)) then StatusUpdate;

//************************************************** **************************
if FromClient and (ConnectName=Name) and (pck[1]=#$1B) then begin
SocialID:=ReadD(2);
pck:='';
case SocialID of
//социальное действие Yes для начала
6: begin
//if CharID=0 then exit;
CentrKachX:=BotCoordX;
CentrKachY:=BotCoordY;
CentrKachZ:=BotCoordZ;
CentrKachXex:=BotCoordXext;
CentrKachYex:=BotCoordYext;
Say('Команда Старт!!!');
say('Получили координаты центра');
say('X='+inttostr(BotCoordX)+' Y='+inttostr(BotCoordY));
timer1.enabled:=true;
exit;
end;
//социальное действие No для окончания
5: begin
//if CharID=0 then exit;
timer1.enabled:=false;
timer2.enabled:=false;
timerA.enabled:=False;
underattack:=false;
Say('Команда Стоп!!!');
exit;
end;
end;
end;
end.

16.11.2007, 19:54
Можете как-нибудь добавить в скрипт для автоматизации рыбалки несколько действий?
1)Если вылазиет моб и атакует (или у перса хп опускаеца ниже определенного уровня), то перц не начинает ловить рыбу а использует оружие (вручную вводится его ИД) и валит моба (или атакующего). Затем снова берет удочку и крючки и возобновляет рыбалку.

Возможно ли такое написать???
Заранее благодарен.

PunkRediska
18.11.2007, 04:22
подскажите пожалуйста, как будет выглядеть скриптик для поднятия определенной вещи с земли(вещь заранее известна), какой командой это делается, а затем, чтоб подняло только что брошенную вещь. Заранее спасибо.
это для 1ной канкретной веши

const name='PunkyBoy';
var
I,a:integer; s,r:string;
begin
if FromServer and (pck[1]=#$0C)and (connectname=name) and (pck[10]+pck[11]+pck[12]+pck[13]=#$39#$00#$00#$00)\\id веши иначе можо записать как readd[10]=hstr('айди');
then
begin
buf:=#$04+pck[6]+pck[7]+pck[8]+pck[9]+pck[14]+pck[15]+pck[16]+pck[17]+pck[18]+pck[19]+pck[20]+pck[21]+pck[22]+pck[23]+pck[24]+pck[25]+#$00;
SendToServerex(name);

end;
end.

maxim22
20.11.2007, 18:12
Не могу понять в чем проблема.
Поправил Name='Свойник';
Запускию скрипт.
В привате получаю
1 одеть и снять: удочку, крючек!
2 в процессе рыбалки использовать один раз фишин-шот!
Проделываю все эти действия
Получаю в приват
Автоматизация ловли рыбы готово к работе!
пишу 1 в чат= не фурычит
Использую СоцДействие Yes =не фурычит происходит тока СоцДействие Yes

Раскоментировал отладочные сообщения подcчета сосок и крючков и пытаюсь ловить, подсчет ведется.
Проверил ItemID с сервером = совпадают
Не пойму куда рыть, подскажите плиз..

NLObP
20.11.2007, 23:26
Не могу понять в чем проблема.
[skip]
Не пойму куда рыть, подскажите плиз..

Может не в том месте стоял, где ловить можно. Количество шотов и количество крючков верно пишет?
Какой у тебя сервер и какой именно скрипт используешь? В личку пиши.

maxim22
21.11.2007, 03:37
Все проверил в ручном режиме-- стою там.
Количество шотов и крючков считает верно..
отправил ПМ

22.11.2007, 12:22
Всем привет! Много чего уже прочел на форуме и есть некие мысли. Я не программист но немного понимаю. Так вот есть вопросик можно ли вызвать из скрипта выполнение другого скрипта при определенных условиях и после выполнения вызваного скрипта чтобы опять запускался первый скрипт, т.е. можно в принципе сделать чтобы второй скрипт вызывал 1 и завершался?
Нужно это для того чтобы когда боч на каче умер то реснулся в город и по проложеной схеме попер обратно на место кача.
ПанкРедиска тебе кстати удалось написать скриптик по открытию сундуков, если да то может в массы выложишь?

Rubec
28.11.2007, 15:01
ты не прав, то что сумон атакует цель которая находится в таргете хозяина это все работа клиента, а пакет атаки сумона прост - тупо ИД таргета и его координаты, и пофиг где хозяин. А ид моба и его координаты мы берем от коммандира.
Я со своим скриптом уводил на кач сумона за пол карты от его хозяина

МКС плиз выложи скрипт свой на сумона чтоб на пол карты бегать )

mks
28.11.2007, 19:15
ты не прав, то что сумон атакует цель которая находится в таргете хозяина это все работа клиента, а пакет атаки сумона прост - тупо ИД таргета и его координаты, и пофиг где хозяин. А ид моба и его координаты мы берем от коммандира.
Я со своим скриптом уводил на кач сумона за пол карты от его хозяина

МКС плиз выложи скрипт свой на сумона чтоб на пол карты бегать )
Этот скрипт я писал на скорую руку(за 5-10мин) чисто для быстрой прокачки чара с помощью суммона другова чара большого лвл.
скрипт узконаправленный и сырой, поэтому думаю не стоит его выкладывать для общего пользования....

Rubec
29.11.2007, 14:27
//Скрипт на БД чтобы танцевал каждые 2 минуты и бегал за командиром
const //Dance
d1='2F 11 01 00 00 00 00 00 00 00'; // Dance of Mystic
d2='2F 15 01 00 00 00 00 00 00 00'; // Dance of Light
d4='2F 10 01 00 00 00 00 00 00 00'; // Inspirations
d3='2F 12 01 00 00 00 00 00 00 00'; // Dance of Fire
d5=''; // Dance of Concentration

var
IDPartyMember, IDAssistTarget: String; //ИД командира и ИД его таргета и Собственный ИД
CoordBDX, CoordBDY, CoordBDZ :String; //координаты бота
NameBD, NameKomandos : String; // Имена
x: integer;
timerBD: TTimer;
timerBD1: TTimer;

procedure OnTimerBD(Sender: TObject);
begin
Case x of
1: begin
buf:=hstr(d1);
SendToServerEx(NameBD);
x:=x+1;
end;
2: begin
buf:=hstr(d2);
SendToServerEx(NameBD);
x:=x+1;
end;
3: begin
bRun;
x:=0;
timerBD.enabled:=false;
end;
end;
end;

procedure OnTimerBD1(Sender: TObject);
begin
timerBD.enabled:=true;
x:=1;
end;

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

procedure Init; //Вызывается при включении скрипта
begin
NameBD:='НИК БД;
NameKomandos:='НИК КОМАНДИРА';
timerBD:=TTimer.Create(nil);
timerBD.OnTimer:=@OnTimerBD;
timerBD.enabled:=false;
timerBD.interval:=2000;
x:=0;
timerBD1:=TTimer.Create(nil);
timerBD1.OnTimer:=@OnTimerBD1;
timerBD1.enabled:=false;
timerBD1.interval:=120000;
end;

procedure Free; //Вызывается при выключении скрипта
begin
timerBD.Free;
timerBD1.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=NameBD) and (pck[1]=#$48) then
begin
//запоминаем координаты
CoordBDX:= pck[6] + pck[7] + pck[8] + pck[9];
CoordBDY:= pck[10] + pck[11] + pck[12] + pck[13];
CoordBDZ:= pck[14] + pck[15] + pck[16] + pck[17];
end;


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

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

//выйти из рабочей части скрипта чтобы другие услови не проверяли убитый пакет нулевой длинны
exit;
end;
// запускаем танцы
if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
if (pck[2]=#$38) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';

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

// остановить танцы
if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
if (pck[2]=#$39) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';

timerBD1.enabled:=false;
exit;
end;
end.


Есть проблема с этим скриптом, наверное я чего то там намутил не так как надо хоть сам скрипт и работает но выскакивает ошибка в программе << Access violation at address 00512A77 in module "l2phx.exe". Read of address 00000043. >>
Да и после отключения скрипта ошибка продолжает выскакивать.

NLObP
30.11.2007, 12:29
NameBD:='НИК БД;
NameKomandos:='НИК КОМАНДИРА';

Эти два пункта под своих чаров изменял? Обычно такая ошибка выскакивает когда не то имя стоит.

02.12.2007, 21:04
подскажите пж че надо поменять в скрипте для точки S оружия и шмота и чтобы заработал, а то у меня не пашет(



ВЫДЕЛИТЬ ВСЁ
//Автоматизация заточки предметов до необходимого уровня by NLObP
//Затачиваем поочереди все предметы с Weapon ID пока не переломаем или не заточим

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

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

//Enjoy!

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

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

NLObP
02.12.2007, 22:44
подскажите пж че надо поменять в скрипте для точки S оружия и шмота и чтобы заработал, а то у меня не пашет

В эти места ставь ItemID предметов
Scroll=957; //ItemID Scroll Enchant, чем точим
Weapon=129; //ItemID предмета, которое точим

NLObP
03.12.2007, 10:33
а где взять ItemID предмета?
1. В комплекте с пакетхаком идет ItemsID.ini. Можно в самом пакетхаке глянуть, сбросив и подобрав предмет.

для С4
959=Scroll: Enchant Weapon (Grade S)
960=Scroll: Enchant Armor (Grade S)
961=Crystal Scroll: Enchant Weapon (Grade S)
962=Crystal Scroll: Enchant Armor (Grade S)

2.Где то здесь на форуме выкладивали ссылку на файлик, поищи.

NLObP
05.12.2007, 00:39
Ну что никто так и не посмотрит скрипт на БД ??
Он у тебя рабочий. Ищи ошибку в другом месте. Вот он же с небольшими изменениями в логике включения бафов.
//Скрипт на БД чтобы танцевал каждые 2 минуты и бегал за командиром
const //Dance
d1='2F 11 01 00 00 00 00 00 00 00'; // Dance of Mystic
d2='2F 15 01 00 00 00 00 00 00 00'; // Dance of Light
d4='2F 10 01 00 00 00 00 00 00 00'; // Inspirations
d3='2F 12 01 00 00 00 00 00 00 00'; // Dance of Fire
d5=''; // Dance of Concentration

var
IDPartyMember, IDAssistTarget: String; //ИД командира и ИД его таргета и Собственный ИД
CoordBDX, CoordBDY, CoordBDZ :String; //координаты бота
NameBD, NameKomandos : String; // Имена
x: integer;
timerBD: TTimer;
timerBD1: TTimer;

procedure OnTimerBD(Sender: TObject);
begin
Case x of
1: begin
buf:=hstr(d1);
SendToServerEx(NameBD);
x:=x+1;
end;
2: begin
buf:=hstr(d2);
SendToServerEx(NameBD);
x:=x+1;
end;
3: begin
buf:=hstr(d3);
SendToServerEx(NameBD);
x:=x+1;
end;
4: begin
buf:=hstr(d4);
SendToServerEx(NameBD);
x:=x+1;
end;
5: begin
bRun;
x:=0;
timerBD1.enabled:=true;
timerBD.enabled:=false;
end;
end;
end;

procedure OnTimerBD1(Sender: TObject);
begin
timerBD.enabled:=true;
x:=1;
end;

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

procedure Init; //Вызывается при включении скрипта
begin
NameBD:='BladeDancer';
NameKomandos:='Kommander';
timerBD:=TTimer.Create(nil);
timerBD.OnTimer:=@OnTimerBD;
timerBD.enabled:=false;
timerBD.interval:=2000;
x:=0;
timerBD1:=TTimer.Create(nil);
timerBD1.OnTimer:=@OnTimerBD1;
timerBD1.enabled:=false;
timerBD1.interval:=120000;
end;

procedure Free; //Вызывается при выключении скрипта
begin
timerBD.Free;
timerBD1.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=NameBD) and (pck[1]=#$48) then
begin
//запоминаем координаты
CoordBDX:= pck[6] + pck[7] + pck[8] + pck[9];
CoordBDY:= pck[10] + pck[11] + pck[12] + pck[13];
CoordBDZ:= pck[14] + pck[15] + pck[16] + pck[17];
end;


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

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

//выйти из рабочей части скрипта чтобы другие услови не проверяли убитый пакет нулевой длинны
exit;
end;
// запускаем танцы
if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
if (pck[2]=#$38) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';

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

// остановить танцы
if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
if (pck[2]=#$39) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';

timerBD1.enabled:=false;
timerBD.enabled:=false;
exit;
end;
end.

Rubec
05.12.2007, 16:18
Да с БД я уже понял что не в скрипте дело т.к. дома все норм работает и на работе тоже эт было только когда писал скрипт и потом сразу проверял его а так уже вроде норм работает. В дальнейшем планируется модификация скрипта - добавление возможности офф пати кача с БД )

Кстати NLObP логику то ты доработал но БД не может нон стоп танцевать больше 3-х танцев ) да и три тоже не нон стоп )

Но спасибо что посмотрел ) :beer:

VORON
11.12.2007, 05:02
сдрасте я немного отсутствовал-)
QAK твою идею я поддерживаю- ето очень утомляет искать место с которого сообщения начинаются. если никто непротив- откреплю пост. я всё тут перечитал. есть кое что интересного. но мало конечно.
ченить придумать надо новое. скучновато стало. есть идеи какиенибудь?

ZZa
11.12.2007, 21:03
неплохо бы сделать первый пост покороче - я пока прочитал всю тему, весь изматерился...
например сделать несколько закрытых тем в разделе "скриптинг", с соответствующими названиями, куда поместить каждый отдельный скрипт, а в эту тему в первое сообщение вместо самих скриптов сделать ссылки на темы с ними и небольшими описаниями, заранее спасибо за то что выслушали..

такой вопрос - у меня при написании скриптов проблемка вышла - имхо стандартный инишник с пакетхаком неполный, по крайней мере я не нашел там структуры многих пакетов, например InventoryUpdate. У кого нибудь есть версия пополнее?? Если есть, буду очень признателен, если поделитесь..

VORON, дописал тут твой скрипт сдачи манора, чтобы он автоматом вырубался при удачной попытке сдачи, да и вообще причесал его, а то я смотрю у тебя руки все никак не доходят..

Добавлено спустя 1 минуту 4 секунды:
Да, кстати, эти темки с проверенными полезными скриптами неплохо было бы запиннить, ну т.е. важными сделать, да и эту темку тоже..

boyan
13.12.2007, 00:51
а может кто нить подкоректировать вот это, чтобы определял профу маг/дд и соответсвтенно баф на выбор делал

//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.

mks
13.12.2007, 12:48
Этот скрипт сырой ппц бэта версия, да и написан на скорую руку. Имеется доработаная проверенная временем версия, только я ее не выкладывал 8)

boyan
13.12.2007, 22:40
а что тебя останавливает? ;)

Добавлено спустя 9 часов 25 минут 48 секунд:
покапался я и разобрался.. =)
переделал под пп, чтобы бафал за 2кк. вроде все работает нармуль..
так как берс только в пати, то если ему кинуть пати, он ее возьмет, бафнет берс, и выйдет с пати..(только с пати палево - все очень быстро происходит, окна пати даже не видно.. )
вот скрипт..
//исходник by mks | переработан boyan
//Prophet бафае

const //баффы профета
b1='2F 0C 04 00 00 00 00 00 00 00 '; //shield
b2='2F 0B 04 00 00 00 00 00 00 00 '; //mental shield
b3='2F 3D 04 00 00 00 00 00 00 00 '; //acumen
b4='2F 15 04 00 00 00 00 00 00 00 '; //blessHP
b5='2F B4 04 00 00 00 00 00 00 00 '; //ww
b6='2F 0C 04 00 00 00 00 00 00 00 '; //magic barier
b7='2F 26 04 00 00 00 00 00 00 00 '; //bers


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:=x+1;
end;
5: begin
buf:=hstr(b5);
sendtoserver;
x:=x+1;
end;
6: begin
buf:=hstr(b6);
sendtoserver;
x:=0;
buf:=#$38;
WriteS('Spasibo i udachi! Nuzhen bers? invite to party');
WriteD(0);
SendToServer;
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
begin
pck:=''; {клиент почему-то иногда автоматом отылает кэнсл трэйд, поэтому убиватю этот пакет}
sendtoserver;
end;
if fromserver and (pck[1]=#$21) then
begin
if pck[14]+pck[15]+pck[16]=#$80#$84#$1E then {если в трэйд положили 2000000}
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;
if FromServer and (pck[1]=#$39) then //если кидают пати - берет ее, бафает берс, и выходит из пати
begin
buf:=Hstr('2A 01 00 00 00 ');
sendtoserver;
buf:=Hstr(b7);
sendtoserver;
buf:=Hstr('2B');
SendToServer;
end;
end.


Добавлено спустя 7 минут:
забыл сказать, что скрипт сделан только под баф на мага..
в планах, доработать его, чтобы определял профу, и бафал в соответствии с ней..

Добавлено спустя 6 минут 3 секунды:
буду очень благодарен, тому кто мне покажет, как прочитать ИД профы, того кто заплатил боту.. =) (чот башка не варит.. надо с дудкой завязывать)

QaK
14.12.2007, 10:18
буду очень благодарен, тому кто мне покажет, как прочитать ИД профы, того кто заплатил боту.. =) (чот башка не варит.. надо с дудкой завязывать)
Сделай массив данных в который записывай обджектИД и профаИД,которые выдираются из пакета ЧарИнфо. Когда тебе кидают трейд - по обджектИД из пакета трейда ищещ в базе нужный профаИД, и в соответствии бафаешь.

boyan
14.12.2007, 11:23
буду очень благодарен, тому кто мне покажет, как прочитать ИД профы, того кто заплатил боту.. =) (чот башка не варит.. надо с дудкой завязывать)
Сделай массив данных в который записывай обджектИД и профаИД,которые выдираются из пакета ЧарИнфо. Когда тебе кидают трейд - по обджектИД из пакета трейда ищещ в базе нужный профаИД, и в соответствии бафаешь.
а примерчик можеш написать, как при торге выдрать обжек ид и профа ид?
Я ваще не секу.. :crazy:

Добавлено спустя 4 минуты 39 секунд:
а case я сам сделаю.. =)

QaK
14.12.2007, 11:32
Target:=#$04+pck[2]+pck[3]+pck[4]+pck[5];
pck[2]+pck[3]+pck[4]+pck[5] - Это и есть ОбджектИД из пекета на трейд, а профаИД выдираешь из пакета ЧарИнфо.

З.Ы. ПОка на работе - выложить не могу, дня через 2 дома появлюсь - выложу, если не забуду :D

boyan
14.12.2007, 13:36
Target:=#$04+pck[2]+pck[3]+pck[4]+pck[5];
pck[2]+pck[3]+pck[4]+pck[5] - Это и есть ОбджектИД из пекета на трейд, а профаИД выдираешь из пакета ЧарИнфо.
З.Ы. ПОка на работе - выложить не могу, дня через 2 дома появлюсь - выложу, если не забуду :D
а почему из 04? 04 - это же информация о себе..
или #$04 - это не 04 пакет?

QaK
14.12.2007, 14:03
пакет 04 бывает 2х видов Оо
один от клиента серверу, другой от сервера к клиенту :D
так вот из пакета 5Е от сервераif FromServer and (pck[1]=#$5E)
мы берем ИД чараpck[2]+pck[3]+pck[4]+pck[5] который нам этот трейд кинул.
Затем формируем пакет для выделения этого чараTarget:=#$04+pck[2]+pck[3]+pck[4]+pck[5];чтобыы потом его злостно баффнуть :D , и далее посылаем серверу данный пакетbuf:=target;
sendtoserver; чтоб поризошло само выделение.

boyan
14.12.2007, 14:35
спасибо за разъяснения..
mks посоветовал сделать немного по другому.. =) разделять по профам, в зависимости от платы.. имхо так быстрее и удобнее.. так и сделаем..

VORON
15.12.2007, 21:10
ДРУЗЬЯ! Я ВАС ВСЕХ ЛЮБЛЮ ТОВАРИЩИ ПРОГРАММИСТЫЫ!
ПОЧЕМУ ДО СИХ ПОР КЮАКУ НЕ ДАЛИ ПРОВА МОДЕРА? ОН В РАЗВИТИЕ ФОРУМА ВЛОЖИЛ НЕМАЛО СИЛ!
ЛЕХА! ДАЙ МОДЕРА КЮАКУ! ПРОЧИТАЙ ЕГО ПОСТЫ И ТЫ ПОЙМЕШ ЧТО ОН ДОЛЖЕН БЫТЬ МОДЕРОМ!

по сути- форум стал скучен- нет свежих идей... такое впечатление что :
1- люди нехатят выкладывать и делиться тем что сами напрогали.
2- люди отупели и новых идей нет...

вся тема посвещена тому чтобы обсуждать то что уже работает.. и сделано.. неужели новых идей нет не у ково?

Добавлено спустя 39 минут 51 секунду:
лано дам вам пару мыслей вслух..
готовых скриптов не будет... за готовые скрипты - ВМЗ в пм...
но суть скрипта для программистов- выложу...

СУТЬ: давайте разберемся в процессе передвижения от точки А к точки Б чара... прозаичная задача- но в ней много вкусного...

пользователи ц4: знают что если чар в окне привязан к камуто и бижит за лидером- прицепом то он застревает часто.. и получается рассинхронизация данных.. в окне с лидером ( к каму привязано окно) всё выглядит норм- чел бежит сзади- но в своем родном окне- чел- может в ето время быть вапще не там и застрять гденить на повороте.. т.е. получается что все видят чара в одном месте- ТАМ ГДЕ ЕГО ВИДИТ СЕРВАК! а сам себя- чел может видеть при етом савсем в другом месте... застрявшим на скале или повороте..

пользователи ИНТЕРЛЮДА- знают: что если 2 окна у тебя и одно окно бафер на прицепе- то БАФЕР НИГДЕ НЕ ЗАСТРЕВАЕТ! но при етом он порой останавливается и стоит как дурак- нехочет продолжать бег за лидером в автоматическом режиме.. приходится переходить в его окно и тыкать 2 раза мышкой на лидера... чтобы продолжить авто-бег.

теперь прикладываем мозги! как так происходит? чем ц4 и ИНТЕРЛЮД отличаются в базовой постановке вопроса? мммм.... давайте разбираться...

при попытке бега вручную мы отправляем серверу- пакет с запросом на передвижение. сервер нам дает разрешение набег если ето не противоречит- ГЕОДАТЕ.. сервер подтверждает попытку бега- и клиент- визуализирует процесс перемещения.. а впроцессе бега- клиент и сервер- синхронизируют между собой координаты.. чтобы небыло таково что в клиенте чар через гору пробежал и стал мочить антараса... сервер сторается синхронизировать координаты.. причем СЕРВЕР ВЕРИТ только себе.... и поетому игра сделана так что синхронизация происходит на основе данных от сервера... если координаты у клента и сервера- отличаются на некоторую величину то игра автоматом в ИНТЕРЛЮДЕ- синхронизирует ети координаты.. собственно етот процесс синхронизации очень- интересен... ч свиду ( с другово окна для всех) ето выглядит как исчезновение чара и его появление заного.. причем с него сразу же слетает- таргет... и если вы его атаковали- то то атака тоже срывается..
ЖАРКО СТАЛО??- ы- ето пока вы еще не обдумали вкусненькое.. вкусненькое в том что в результате мы можем с использованием ПАКЕТХАКА- рассинхронизировать координаты меду сервером и клиентм- в результате чего- вызовем синхронизацию- автоматическую- при етом мы маргнем.. и у всех кто нас бил- слетит таргет и сорвется атака... и это не тока у живых чаров
а у НПЦ- тоже-))) рейды тоже немогут атаковать никуя... как тока рейд замах делает- то призходит пакет что нас атакуют- и сразу автоматом врубаем рассинхронизхацию координат.. и пипец- рейд не попадет по нам... на ВАС СКИНУЛИ ПАРАВОЗ? небеда..- раз 10 потыкали кнопку с рассинхронизацией- и паровох- ушел... вас- пкашат?- небеда- тыкаете кнопку с рассинхронизацией- и вы бессмертны...( до бана само собой) ВЫ ХОТИТЕ УБИТЬ ЧАРА на 10 ЛВЛ ВЫШЕ СЕБЯ?- сделайте скрипт на автоматическое восстановление таргета и атаки по таймеру..

ВОТ ТАК ДУМАТЬ НАДО! ЖДУ НОВЫХ ИДЕЙ! ЕСЛИ ИДЕЙ НЕБУДЕТ- Я УСОМНЮСЬ В ВАЩЕМ МОЗГЕ- ХОТЯ Я ЗНАЮ ЧТО ТУТ ЕСТЬ НЕМАЛО УМНЫХ ПАРНЕЙ!!!! ПАРНИ УМНЫЕ!_ ДАЙТЕ НОВЫЕ ИДЕИ! ХВАТИТ СТАРЬЁ ОБСУЖДАТЬ!

NLObP
15.12.2007, 22:31
А скрипт антитаргет разве не про это? Про рассинхронизацию позиции клиента с данными сервера.

dmitry501
15.12.2007, 23:41
Про это, про это :)
Voron для себя Америку открыл :)

VORON
17.12.2007, 15:01
ДИМКА! БРОСАЮ ПИТЬ! (но зато обмусолил очень хорощо) ы. не бейте меня-)

Добавлено спустя 1 день 1 час 27 минут 36 секунд:
в первом посте дописал скрипт на 3-х ФСов.. в конце..
в вчера загрузил 3 лукаря.. и мачил РБ в соло.. убить не смог но РБ меня тожэ несмог... предполагаю что нужно 6-7 лукарей... примерно.. и хана рейду...

mks
17.12.2007, 15:31
ДИМКА! БРОСАЮ ПИТЬ! (но зато обмусолил очень хорощо) ы. не бейте меня-)

Добавлено спустя 1 день 1 час 27 минут 36 секунд:
в первом посте дописал скрипт на 3-х ФСов.. в конце..
в вчера загрузил 3 лукаря.. и мачил РБ в соло.. убить не смог но РБ меня тожэ несмог... предполагаю что нужно 6-7 лукарей... примерно.. и хана рейду...
2 дестроера 74+, у каждого хевен девайдер с са на фокус, фулл бафф(дэнс нс скорость атаки, силу, криты, вампирик, варк чайнт оф виктори, вампирик, свс -криты, пдеф, варлок кот - криты) подходим к РБ бьем друг друга(осталяем 30% хп что б врубить френзи и зеалот) врубаем френзи и зеалот начинаем бить... РБ, френзи действует 2 мин, дык вот рб умирает за эти 2 минуты, хила не надо, под вампириком и френзи криты по мощному рб вылетают под 20к - все ХП восстанавливается моментально....

boyan
17.12.2007, 17:08
//считываем текущие и максимальные значения 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;
чтобы считать макс и карент МП - какие циферки надо подставить? =)

NLObP
17.12.2007, 23:30
Если не ошибаюсь, то:

procedure StatsUpdate;
var
i: integer;
begin
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$09: CurHP:=ReadD(i*8+14);
#$0A: MaxHP:=ReadD(i*8+14);
#$0B: CurMP:=ReadD(i*8+14);
#$0C: MaxMP:=ReadD(i*8+14);
#$21: CurCP:=ReadD(i*8+14);
#$22: MaxCP:=ReadD(i*8+14);
end;
end;

boyan
18.12.2007, 01:04
Если не ошибаюсь, то:

procedure StatsUpdate;
var
i: integer;
begin
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$09: CurHP:=ReadD(i*8+14);
#$0A: MaxHP:=ReadD(i*8+14);
#$0B: CurMP:=ReadD(i*8+14);
#$0C: MaxMP:=ReadD(i*8+14);
#$21: CurCP:=ReadD(i*8+14);
#$22: MaxCP:=ReadD(i*8+14);
end;
end;



вот своим этим постом, ты еще больше все запутал =)

VORON
18.12.2007, 02:02
//*************************СЛЕДИМ ЗА ХП и МП******************************************
//следим за ХП КОМАНДИРА
if FromServer and (pck[1]=#$0e) and (ConnectName = NameKom) then
if (pck[2] + pck[3] + pck[4] + pck[5] = IDKomandos) and (pck[6]=#$04) then
begin
CurHPKom:=(ord(pck[15]) * 256 + ord(pck[14]));

if (CurHPKom < round(MaxHPKom*0.7)) then
if (tick1 = 1) then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F C1 04 00 00 00 00 00 00 00');
SendToServerEX(NameBot1);
delay(500);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
end;

лмиты узнаем из пакета ЮЗЕР ИНФО ИНФО...


//*************************УЗНАЕМ ЛИМИТЫ ХП и МП***********************************************
//из пакета UserInfo который приходит во время бафа и не только

//КОМАНДИР
if FromServer and (pck[1]=#$04) and (ConnectName = NameKom) then
begin
i:=22;
tempS:=readS(i);
i:=i+48;
MaxHPKom:=readD(i);
CurHPKOM:=readD(i);
MaxMPKom:=readD(i);
CurMPKOM:=readD(i);
end;

18.12.2007, 02:26
NLObP
Спасибо тебе огромное за скрпты, это то что я целый день сегодня искал. У нас просто хитрый антибот стоит, поэтому приходиться както выкручиваться. С l2ph ещё не до конца разобрался, но коечто уже понял. Но проблема вот в чём: я никак не могу запустить эти скрипты. Пробовал и обычную версию и для люды (у мну с4 pts). l2ph318 выдаёт ошибку типа "access violidation at adress 00528f70 at module "l2phx.exe". Read of adres 0000000".
А версия 300 ругается на строчку SendToClientEx(Name);
Я уже не знаю вообще что мне делать. На какой версии работал этот скрипт? Я его просмотрл сам, он мне псц как понравился, всё просто и понятно. А запускаться не хочет ((

QaK
18.12.2007, 10:17
Если не ошибаюсь, то:

procedure StatsUpdate;
var
i: integer;
begin
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$09: CurHP:=ReadD(i*8+14);
#$0A: MaxHP:=ReadD(i*8+14);
#$0B: CurMP:=ReadD(i*8+14);
#$0C: MaxMP:=ReadD(i*8+14);
#$21: CurCP:=ReadD(i*8+14);
#$22: MaxCP:=ReadD(i*8+14);
end;
end;



Воо, только хотел спросить, прям мысли читаешь =)
Тогда другой вопрос: какие параметры, кроме хп,цп,мп мона выдрать из Статус Апдейт? #$11, например это что?

З.Ы. Данная расшифровка для С4 или ИЛ?

boyan
18.12.2007, 11:34
каждый со своей колокольни короче..
тогда пойдем по другому.. в примере от mks в считывание учавствуют разные цифры:
//считываем текущие и максимальные значения 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;


А вот сдесь, как я понимаю, считывание идет по 1:

//КОМАНДИР
if FromServer and (pck[1]=#$04) and (ConnectName = NameKom) then
begin
i:=22;
tempS:=readS(i);
i:=i+48;
MaxHPKom:=readD(i); //тут Я как понимаю i=70!?!?
CurHPKOM:=readD(i); //и тут
MaxMPKom:=readD(i); //и тут
CurMPKOM:=readD(i); //и тут
end;

где логика? кто нить объясните..

QaK
18.12.2007, 12:11
//тут Я как понимаю i=70!?!?
тут i=80+длина строки tempS

boyan
18.12.2007, 14:38
Я хочу считать количество МП, максимальное и на данный момент =) т.е. в предыдущем своем посте я спрашивал, какие циферки поставить вместо Х и У - чтобы считать =)

QaK
18.12.2007, 16:14
На, держи, ме мучайся =) :D
const NameKom='УБЕР-ПАПКО-НАГИБАТЕЛЬ';
var CurHP,MaxHp,CurMP,MaxMP,CurCP,MaxCP:integer

procedure StatsUpdate;
var
i: integer;
begin
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$09: CurHP:=ReadD(i*8+14);
#$0A: MaxHP:=ReadD(i*8+14);
#$0B: CurMP:=ReadD(i*8+14);
#$0C: MaxMP:=ReadD(i*8+14);
#$21: CurCP:=ReadD(i*8+14);
#$22: MaxCP:=ReadD(i*8+14);
end;
end;
//============================
//Основная часть скрипта
//Вызывается при приходе любого пакета
begin
if FromServer and (pck[1]=#$0E) and (ConnectName = NameKom)
then StatsUpdate;
end.

boyan
18.12.2007, 16:30
На, держи, ме мучайся =) :D
const NameKom='УБЕР-ПАПКО-НАГИБАТЕЛЬ';

Пасип! =)
пысы: интересный у тебя ник =)

NLObP
22.12.2007, 17:29
Тогда другой вопрос: какие параметры, кроме хп,цп,мп мона выдрать из Статус Апдейт? #$11, например это что?

З.Ы. Данная расшифровка для С4 или ИЛ?

Это для ИЛ
private static final String _S__0E_STATUSUPDATE = "[S] 0E StatusUpdate";
public final static int LEVEL = 0x01;
public final static int EXP = 0x02;
public final static int STR = 0x03;
public final static int DEX = 0x04;
public final static int CON = 0x05;
public final static int INT = 0x06;
public final static int WIT = 0x07;
public final static int MEN = 0x08;

public final static int CUR_HP = 0x09;
public final static int MAX_HP = 0x0a;
public final static int CUR_MP = 0x0b;
public final static int MAX_MP = 0x0c;

public final static int SP = 0x0d;
public final static int CUR_LOAD = 0x0e;
public final static int MAX_LOAD = 0x0f;

public final static int P_ATK = 0x11;
public final static int ATK_SPD = 0x12;
public final static int P_DEF = 0x13;
public final static int EVASION = 0x14;
public final static int ACCURACY = 0x15;
public final static int CRITICAL = 0x16;
public final static int M_ATK = 0x17;
public final static int CAST_SPD = 0x18;
public final static int M_DEF = 0x19;
public final static int PVP_FLAG = 0x1a;
public final static int KARMA = 0x1b;

public final static int CUR_CP = 0x21;
public final static int MAX_CP = 0x22;

В пакете StatusUpdate приходит лишь часть данных, по всей видимости изменяемых в данный момент.

Добавлено спустя 11 минут 35 секунд:
Если не ошибаюсь, то:
procedure StatsUpdate;
var
i: integer;
begin
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$09: CurHP:=ReadD(i*8+14);
#$0A: MaxHP:=ReadD(i*8+14);
#$0B: CurMP:=ReadD(i*8+14);
#$0C: MaxMP:=ReadD(i*8+14);
#$21: CurCP:=ReadD(i*8+14);
#$22: MaxCP:=ReadD(i*8+14);
end;
end;

вот своим этим постом, ты еще больше все запутал =)

Объясняю. Так как пакет StatusUpdate это:
0E=StatusUpdate:h(ObjectID)d(AttribCount)d(AttrID) d(AttrValue)
Берем из шестой позиции количество атрибутов (AttribCount). Проходим в цикле по пакету и сверяем код аттрибута (AttrID) из пакета с необходимыми нам атрибутом. Если совпало,то считываем величину этого аттрибута (AttrValue). Далее делаем необходимые проверки и действия...

По поводу ReadD(i)
ReadC(var index:integer):byte - читает из переменной pck байт
ReadH(var index:integer):word - читает из переменной pck число (2 байта) (v. 3.1.8+)
ReadD(var index:integer):integer - читает из переменной pck число (4 байта)
ReadF(var index:integer):double - читает из переменной pck число c плавающей запятой(8 байт) (v. 3.1.8+)
ReadS(var index:integer):string - читает из переменной pck строку (в пакете строка unicode нультерминированная, а результирующая строка обычная паскалевская)
Index - начальная позиция чтения, которая модифицируется функцией (сдвигается на число считанных байт)

VORON
22.12.2007, 23:42
каждый со своей колокольни короче..
тогда пойдем по другому.. в примере от mks в считывание учавствуют разные цифры:
//считываем текущие и максимальные значения 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;


А вот сдесь, как я понимаю, считывание идет по 1:

//КОМАНДИР
if FromServer and (pck[1]=#$04) and (ConnectName = NameKom) then
begin
i:=22;
tempS:=readS(i);
i:=i+48;
MaxHPKom:=readD(i); //тут Я как понимаю i=70!?!?
CurHPKOM:=readD(i); //и тут
MaxMPKom:=readD(i); //и тут
CurMPKOM:=readD(i); //и тут
end;

где логика? кто нить объясните..
мне кажется переменная I применяющаяся во втором случае автоматически увеличивает свое значение на 4 байта.. когда применяется в качестве аргумента функции READD(xxxx)...
а ваще функция READD(XXX) - ето такой зверь который считывает строку в ИНТИГЕР ФОРМАТЕ начиная с указанного в скобках порядкового байта из пакета PCK и причем если в качестве аргумента использавалось не число а переменная то она автоматически увеличивает своё значение.. для удобства ламеров.. но ламеров ета фишка лиш путает... считывает она ровно 4 БАЙТА.. и на ету величину увеличивает переменную которая применяется в качестве аргумента в скобках...

MaxHPKom:=readD(i); //тут Я как понимаю i=70!?!?
ты неправильно понял...
ибо до етого мы пременили функцию READS(xxx) с аргументом "i" и ета переменная увеличила своё значение на длинну строки которую считала... а считала она- ХЗ сколько байт... нам не известно.. но известно точно что до окончания строки.. окончание строки ето зверь- заканчивающийся на '00 00' функция READS(xxx) считывает строку с указанного в скобках порядкового номера байта до символа окончания строки в стринговую переменную...

jestb
26.12.2007, 10:22
Привет всем, кто тут сидит и помогает нупам типа меня :) , нашел много полезных идей, как, например, рыбалка и сдача манора. С спойлом и авто-качем не разбирался еще, но вот увидел, кто-то подымал тему насчет кача с БД.
Тема такая - качаюсь с БД оф пати, в принципе комп тянет 2 окна без лагов, играю в Окнах, есть макрос БД такой /danc1,/danc2,/dan3,/leave,/target "ник",/attack, а у мня соответственно макрос на прием БД.
Приходится при приему БД в пати каждый раз тыкать в окне БД "Yes" и нажимать макрос на танец.
В принципе ничего сложного и можно качаться сколько влезет, НО главная проблема это ДРОП с мобов :) .
Вот есть ли у кого-то скриптик на то, чтобы БД бегал за мной и переодически нажимал Pickup?

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

Кто-то сочтет меня совсем нубом (а так и есть, я в программировании не силен и с прогой разбираюсь методом тыка :) ), так вот пробовал запоминать пакет на нажатие Pickup и посылать его каждые 5000 м.сек, но ничего не происходит :( , а например другие SocialAction работают, а вот пикап нет :( .

Кто может помочь с скриптом - пишите, буду очень рад, наверное не только я мечтаю о таком скрипте.

п.с.: сори за длину поста - привык все подробно расписывать, чтобы не задавали лишних вопросов :) .

Добавлено спустя 5 минут 44 секунды:
Да я читал правила и видел, что нельзя просить пакеты или взломать сервер и т.п., но считаю, что в моей просьбе нет ничего противозаконного, просто экономия времени при каче (подборе дропа), прошу сильно не агриться :) .
Может примитивно рассуждаю, но думаю выглядеть скрип будет примерно как:

1. что-то типа определения кидающего пати.
2. прием пати.
3. танцы, выход с пати.
4. взятие таргета хозяина и follow (attack).
5. переодический pickup.

тока вот как это написать на языке программирования не знаю :( .

П.с. Играю на Интерлюде если это играет роль в написании скрипта.

Добавлено спустя 1 час 4 минуты 37 секунд:
//Вот попробовал по аналогии с ЕЕ бафом за 5кк сделать для БД,
//кто может подкорректируйте плз.
//Бот баффер БД, танцует при приеме в пати.

const //Танцы БД
d1='2F 13 01 00 00 00 00 00 00 00 '; //Fury
d2='2F 12 01 00 00 00 00 00 00 00 '; //Fire
d3='2F 0F 01 00 00 00 00 00 00 00 '; //Warrior
//протестировал, танцы работают :) .
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(d1);
sendtoserver;
x:=x+1;
end;
2: begin
buf:=hstr(d2);
sendtoserver;
x:=x+1;
end;
3: begin
buf:=hstr(d3);
sendtoserver;
x:=x+1;
end;
end;
end;

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

if FromServer and (pck[1]=#$5E) and (x=0) then //что делает эта строка? Можно ли
//сделать чтобы не пытался принять пати если уже в пати, потому что
//после приема продолжает слать сообщения типа "кого вы приглашаете, сейчас не в игре"?
begin
Target:=#$04+pck[2]+pck[3]+pck[4]+pck[5]; //ммм, берет в таргет того, кто кидает трейд?
buf:=hstr('44 01 00 00 00'); //как понимаю это пакет на "yes" трейда? хотелось бы тоже самое на прием пати.
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.
Вот попробовал сам поредактировать скрипт на офф пати Дансы, пометил где что понял, а где нет.
Надеюсь не зря стараюсь и кто-то доведет до ума мою задумку.

QaK
26.12.2007, 10:25
чтобы БД бегал за мной и переодически нажимал Pickup?
На самом деле в клиенте ты не нажимаешь поднять, а сравниваешь свои координаты и координаты раскиданных вокруг тебя предметов, если расстояние от тебя до предмета не больше определенного значения, то посылается пакет, в который пишется ObjectID поднимаемого предмета, у каждого! предмета в игре свой уникальный ObjectID.1. что-то типа определения кидающего пати.
2. прием пати.
3. танцы, выход с пати.
4. взятие таргета хозяина и follow (attack).
5. переодический pickup.
1. - это как? а просто пати кинуть?
2. - проверяешь, если от сервака пришел пакет с пришлашением в пати - отправляешь пакет на прием пати
3.Про танцы:можно взять из топика "да будет бот", скрипты на баффалку-саппорта. После того как отбаффаешь - шлешь пакет на разрыв пати.
4. Взятие таргета тоже можно взять из "да будет бот", скрипты на баффалку-саппорта.
5. Тут посложнее, нужно вести мониторинг всех вещей, которые валяются в округе и соответственно, если вешь лежит в зоне досягаемости - поднимать предмет, как я описал выше.

З.Ы. Новый год скоро, скрипт писать лень =) может после нового года на автоподъем вещей напишу, остальное сам можешь собрать.Удачи.

jestb
26.12.2007, 11:53
1. - это как? а просто пати кинуть? А если кинет кто-то другой,а не я ? :) просто я не разбираюсь в программировании, и вряд ли до меня это дойдет - чтобы только от меня принимал, надо чтобы он сканировал мой ID и если это я, то давал данс, если правильно понимаю?
2. - проверяешь, если от сервака пришел пакет с пришлашением в пати - отправляешь пакет на прием пати что-то типо:
begin
if "тебе кидают пати" and "пати именно от "ник""
then
begin
"принять пати, дать данс и свалить с пати"
end;
end.
3.Про танцы:можно взять из топика "да будет бот", скрипты на баффалку-саппорта. После того как отбаффаешь - шлешь пакет на разрыв пати. пошел искать.
4. Взятие таргета тоже можно взять из "да будет бот", скрипты на баффалку-саппорта. уже ищу.
5. Тут посложнее, нужно вести мониторинг всех вещей, которые валяются в округе и соответственно, если вешь лежит в зоне досягаемости - поднимать предмет, как я описал выше. лес дремучий :)
З.Ы. Новый год скоро, скрипт писать лень =) может после нового года на автоподъем вещей напишу Спасибо :) , с наступающим.
остальное сам можешь собрать.Удачи.
пошел пороюсь в скриптах, пока сервак лежит :) .

QaK
26.12.2007, 12:08
Спасибо , с наступающим.
И тебя с наступающим потом после НГ посмотрб что мона сделать ...

26.12.2007, 14:18
Если вопрос по скрипту антитаргета. Активирую, подключаю модули(т+), но когда рыбачу (скрипт на рыбалку здоровский , спс биг) и вылавливается моб, то он меня постоянно атакует и таргет не сбрасывается. Хз че делать.
p.s. мб кто знает как можно избавится от мобов при рыбалке( может кто знает места где мобы проваливаются по склону в воду), просто когда 2 а то и 3 раза подряд вылавлиешь моба, то хилки не спасают точно.
Плз помогите.

QaK
26.12.2007, 14:23
Скрипт на антитаргет везде(практически) профиксен.

jestb
26.12.2007, 15:58
просидел часа полтора, вот до чего дошел:
begin
if FromClient and (ConnectName='char1') //посылаю с 1-го окна пакет "SocialActionYes"
and (pck=HStr('1B 06 00 00 00')) then begin
buf:=HStr('2A 01 00 00 00'); //п.№1 - принять пати
buf:=HStr('2F 13 01 00 00 00 00 00 00 00 '); //п.№2 - Fury
buf:=HStr('2F 12 01 00 00 00 00 00 00 00 '); //п.№3 - Fire
buf:=HStr('2F 0F 01 00 00 00 00 00 00 00 '); //п.№4 - Warrior
buf:=HStr('2B'); //п.№5 - выйти с пати
buf:=HStr('04 B2 F9 20 48 24 CB 00 00 45 2B FF FF A6 F3 FF FF 00'); //п.№7 - следовать за мной
SendToServerEx('char2'); //вместо 1-го окна "yes", 2-е окно делает пункты №1-№7.
pck:='';
end;
end.
//тока вот проблема :( он принимает пати, делает п№1-2 и все :( . Как прописать,
//чтобы между п№2-3-4 была задержка в 1 секунду, и вобще что я пропустил, чтобы пункты включались один за другим?.

Но даже с таким скриптом:
begin
if FromClient and (ConnectName='char1') //посылаю с 1-го окна пакет "SocialActionYes"
and (pck=HStr('1B 06 00 00 00')) then begin
buf:=HStr('2A 01 00 00 00'); // - принять пати
SendToServerEx('char2'); //вместо 1-го окна "yes", 2-е окно принимает пати.
pck:='';
end;
end.
нажимаю на 1 окне макрос приема БД и "yes", а на окне БД только макрос танцев, уже удобнее чем было :) .
Ща попытаюсь доработать первый свой скрипт.

QaK
26.12.2007, 16:28
Попробуй так
begin
if FromClient and (ConnectName='char1') //посылаю с 1-го окна пакет "SocialActionYes"
and (pck=HStr('1B 06 00 00 00')) then begin
buf:=HStr('2A 01 00 00 00'); //п.№1 - принять пати
SendToServerEx('char2');
Delay(1000);
buf:=HStr('2F 13 01 00 00 00 00 00 00 00 '); //п.№2 - Fury
SendToServerEx('char2');
Delay(1000);
buf:=HStr('2F 12 01 00 00 00 00 00 00 00 '); //п.№3 - Fire
SendToServerEx('char2');
Delay(1000);
buf:=HStr('2F 0F 01 00 00 00 00 00 00 00 '); //п.№4 - Warrior
SendToServerEx('char2');
Delay(1000);
buf:=HStr('2B'); //п.№5 - выйти с пати
Delay(1000);
buf:=HStr('04 B2 F9 20 48 24 CB 00 00 45 2B FF FF A6 F3 FF FF 00'); //п.№7 - следовать за мной
SendToServerEx('char2'); //вместо 1-го окна "yes", 2-е окно делает пункты №1-№7.
pck:='';
end;
end.


Единственный минус в том, что когда идет задержка 1 сек то в это время никакие пакеты не обрабатываются.


const MainChar = 'Сюда имя основного перса';
BD = 'Сюда ник БД соответственно'

var Timer1:TTimer;
actions:array[1..6] of string;
nm:integer;

procedure Init;
begin
nm:=1;

Timer1:=TTimer.Create(nil);
Timer1.OnTimer:=@OnTimer1;
Timer1.enabled:=false;
Timer1.interval:=1000; //задержка 1 сек;

actions[1]:='2A 01 00 00 00';
actions[2]:='2F 13 01 00 00 00 00 00 00 00 ';
actions[3]:='2F 12 01 00 00 00 00 00 00 00 ';
actions[4]:='2F 0F 01 00 00 00 00 00 00 00 ';
actions[5]:='2B'
actions[6]:='04 B2 F9 20 48 24 CB 00 00 45 2B FF FF A6 F3 FF FF 00';
end;

procedure Timer1.ontimer(Sender:Tobject);
begin if nm>6 then Timer1.Enabled:=false
else begin buff:=Hstr(actions[nm]);
SendToServerEx(BD);
inc(nm);
end;
end;

procedure Free;
begin
Timer1.Free;
end;

begin
if Pck='' then exit;
if FromClient and (ConnectName=MainChar) //посылаю с 1-го окна пакет "SocialActionYes"
and (pck=HStr('1B 06 00 00 00')) then begin
pck:='';
buf:=HStr(actions[nm]);
SendToServerEx(BD);
Timer1.Enabled:=true;
end;
end.


попробуй так.

QaK
27.12.2007, 08:46
Спасиб Qak , пойду тестить.
Единственный облом в том, чтоactions[6]:='04 B2 F9 20 48 24 CB 00 00 45 2B FF FF A6 F3 FF FF 00';
этот пакет каждый раз будет разный, для каждого захода на акк. Там нуно еще добавить кое-что, или вручную отлавить пакет и заменить его.

djbandit
01.01.2008, 03:55
* . . * . * . . * . .* * . . * . . * . * . . * . . . С НАСТУПАЮЩИМ НОВЫМ ГОДОМ ! ! ! * . * Счастья, удачи, любви... В 2008!!! . . . * . . * * . . . * . . * . *. . * . . .* *.. ..* . * *. . * . . *.


ПРИВЕТ РЕБЯТА!!!!Я тут про заточку читал!По всем страницам прошёлся, но увы так и не нашёл целиком скрипта для автозаточки на интерлюдию!Пожалуйста выложите готовый скрипт для интерлюдии!!Заранее ОГРОМНЕЙШЕЕ СПАСИБО :friends:


Собственно сам сервер: la2world.ru ( Pvp1x1200)

ChiterEPT
06.01.2008, 03:33
1. - это как? а просто пати кинуть? А если кинет кто-то другой,а не я ? :) просто я не разбираюсь в программировании, и вряд ли до меня это дойдет - чтобы только от меня принимал, надо чтобы он сканировал мой ID и если это я, то давал данс, если правильно понимаю?
2. - проверяешь, если от сервака пришел пакет с пришлашением в пати - отправляешь пакет на прием пати что-то типо:
begin
if "тебе кидают пати" and "пати именно от "ник""
then
begin
"принять пати, дать данс и свалить с пати"
end;
end.

В пакете с предложением о вступлении в пати #$39 со второго байта идет имя предлогающего:
ReadS(2).

mks
06.01.2008, 05:28
Всем привет, всех с новым годом!
Давно не заходил, смотрю тем рассплодилось немерено)), все не перечитал....
Лан, в общем не об этом я)).... Решил как-то я сделать бота хиллера(биш, се, не важно....) -смысл - лечить членов пати.... Набросал для начала небольшой скриптик, который анализировал пакеты от сервера содержащие информацию об изменениях параметров членов пати и тупо хилил тех у кого ХП меньше чем я укажу.... По началу казалось что все нормально, но когда я начал его использовать в больших пати(не только со своими ботами), начались проблемы - хилер тупо лечил того члена пати, чей пакет пришел первым, т.е. допустим один член пати буквально умирает, а бот лечит другого, у которого ХП еще много, но соответствовало указаному минимуму. Переделал с проверкой на больше нуждающегося в ХП члена пати))... Вроде правильно все высказал, голова квадратная после нового года)))

Ну в общем выкладываю бота хилера(СЕ), написал вчера, еще много собираюсь добавить....

Имеются несколько режимов, включаются и выключаются социальными действиями начиная с первого, думаю поймете(не китайцы же))):
-режима лечения(первое соц. действие) -действует граматно, -изначально вычисляет у кого из пати меньше всего ХП, потом сравнивает его с указанным в const HP, если меньше, то хилит его первым.
-режим бега(второе соц. действие) -режим бега работает так, что бот бежит туда же куда и хозяин, но с отклонением которое можно указать в const -chaos, генерируется случайным образом
режимы включаются и выключаются тем же соц. действием.
-ну и третье соц. дейстие - вливает МП хозяину, можно будет сделать что б это шло и автоматом, но пока не вижу смысла....
Комментарии не ставил дабы избежать пользования скриптом ламаков. Кому надо поймет, кому не понятно обьясню....

Const
HP=2000;
BotName='имя СЕ';
MasterName='имя Коммандира';
Chaos=100;

GreatHeal='2F C1 04 00 00 00 00 00 00 00';
GroupHeal='2F C3 04 00 00 00 00 00 00 00';

var
CharName: array[1..9] of string;
CharID: array[1..9] of integer;
CurHP: array[1..9] of integer;
MaxHP: array[1..9] of integer;
CurMP: array[1..9] of integer;
MaxMP: array[1..9] of integer;
Dev: array[1..9] of extended;
xe, ye: extended;
PartyCount,i,f,e,t,MinHP,NeedHP,ox,oy,oz,x,y,z,Mas terID,BotID: integer;
exist, HealKey, RunKey: boolean;

TimerHP: TTimer;

procedure Init; //?????????? ??? ????????? ???????
begin
TimerHP:=TTimer.Create(nil);
TimerHP.OnTimer:=@OnTimerHP;
TimerHP.enabled:=true;
TimerHP.interval:=1000;
end;

procedure Heal;
begin
//target
buf:=#$04;
WriteD(CharID[NeedHP]);
WriteD(ox);
WriteD(oy);
WriteD(oz);
WriteC(0);
SendToServerEx(BotName);
//heal
buf:=hstr(GreatHeal);
SendToServerEx(BotName);
end;

procedure SendMsg(msg:string);
begin
buf:=#$4A;
WriteD(BotID);
WriteD(2);
WriteS(BotName);
WriteS(msg);
SendToClient;
end;

procedure Min(n1,n2:integer);
begin
if n1<n2 then MinHP:=n1 else MinHP:=n2;
end;

procedure OnTimerHP(Sender: TObject);
begin
if PartyCount>0 then
begin
MinHP:=CurHP[1];
for t:=1 to PartyCount do
begin
if CharName[t]=MasterName then MasterID:=CharID[t];
if CharName[t]=BotName then BotID:=CharID[t];
min(MinHP,CurHP[t]);
end;
for t:=1 to PartyCount do
begin
if CurHP[t]=MinHP then
begin
NeedHP:=t;
break;
end;
end;
if (HealKey=true) and (MinHP<HP) then Heal;
end;
end;

procedure Free; //?????????? ??? ?????????? ???????
begin
PartyCount:=0;
TimerHP.free;
HealKey:=false;
RunKey:=false;
end;

//???????? ????? ???????
//?????????? ??? ??????? ??????? ?????? ???? ?????? ???????
begin

if FromServer and (pck[1]=#$52) then
begin
i:=6;
for f:=1 to (PartyCount+1) do
begin
if CharID[f]=ReadD(2) then exist:=true else exist:=false;
if exist=true then
begin
CharName[f]:=ReadS(i);
i:=i+8;
CurHP[f]:=ReadD(i);
MaxHP[f]:=ReadD(i);
CurMP[f]:=ReadD(i);
MaxMP[f]:=ReadD(i);
Dev[f]:=CurHP[f]/MaxHP[f];
break;
end;
end;

if exist=false then
begin
PartyCount:=PartyCount+1;
f:=PartyCount;
CharID[f]:=ReadD(2);
CharName[f]:=ReadS(i);
i:=i+8;
CurHP[f]:=ReadD(i);
MaxHP[f]:=ReadD(i);
CurMP[f]:=ReadD(i);
MaxMP[f]:=ReadD(i);
Dev[f]:=CurHP[f]/MaxHP[f];
end;
end;


if FromClient and (ConnectName=MasterName) and (RunKey=true) and (pck[1]=#$01) then
begin
xe:=ReadD(2)-Chaos/2+round(random*Chaos);
ye:=ReadD(6)-Chaos/2+round(random*Chaos);

x:=round(xe);
y:=round(ye);
z:=ReadD(10);

buf:=#$01;
WriteD(x);
WriteD(y);
WriteD(z);
WriteD(ox);
WriteD(oy);
WriteD(oz);
ox:=x;
oy:=y;
oz:=z;
SendToServerEx(BotName);
end;


if FromClient and (ConnectName=BotName) and (pck[1]=#$01) then
begin
ox:=ReadD(2);
oy:=ReadD(6);
oz:=ReadD(10);
end;


//Heal mode
if FromClient and (ConnectName=MasterName) and (pck=hstr('1B 02 00 00 00')) then
begin
HealKey:=not(HealKey);
pck:='';
Case HealKey of
true: SendMsg('Heal mode ON');
false: SendMsg('Heal mode OFF');
end;
end;

//Run mode
if FromClient and (ConnectName=MasterName) and (pck=hstr('1B 03 00 00 00')) then
begin
RunKey:=not(RunKey);
pck:='';
Case RunKey of
true: SendMsg('Run mode ON');
false: SendMsg('Run mode OFF');
end;
end;

if FromClient and (pck=hstr('1B 04 00 00 00')) then
begin
//target master
buf:=#$04;
WriteD(MasterID);
WriteD(ox);
WriteD(oy);
WriteD(oz);
WriteC(0);
SendToServerEx(BotName);
buf:=hstr('2F F5 03 00 00 00 00 00 00 00');
SendToServerEx(BotName);
pck:='';
end;
end.

ЗЫ да, забыл добавить, это походу баг пакетхака - скрипт пришлось немного видоизминять, не буду перечислять все, но допустим если последние три части переставить в начало(что не изменит программу) ПХ выдает ошибку....

mdbodia
06.01.2008, 13:24
Пытался написать скрипт на автоподбор вещей. То-есть я привожу чара на локацию, и он собирает всё что там валяеться. Взял для этого из выложенного тут бота функцию. Но блин, совершенно ничего не получилось. Скрипт не стал выкладывать, да-бы не показывать всем какой я ламер. Буду пытаться ещё сегодня разобраться, если получиться - выложу. Просто вопрос: может там всё проще чем я думаю? Кто знает как это сделать, ну или может у когото такой скрипт есть, напишите плз.

NLObP
06.01.2008, 21:10
Полные скрипты лежат на форуме.
1)Подбор вещей выпадающих с мобов, вариант.
//************************************************** *************
function rastoyanie(xpos1, ypos1, xpos2, ypos2:extended):integer; //возвращает переменную rezu которая является растоянием между 2 точками
begin
result:= Round(Sqrt(((xpos1-xpos2)*(xpos1-xpos2))+((ypos1-ypos2)*(ypos1-ypos2))));
end;
begin
//************************************************** **************************
if (ConnectName=Name) and FromServer then begin
case pck[1] of
#$0C: begin
if (MyXpos<>0) then begin
//rastoyanie(MyXpos, MyYpos, ReadD(14), ReadD(18));
if (rastoyanie(MyXpos, MyYpos, ReadD(14), ReadD(18))<=200) then begin
mlk.Lines.Add('Выпала вещь!!!');
timer1.enabled:=false;
buf:=#$04;
WriteD(ReadD(6));
WriteD(ReadD(14));
WriteD(ReadD(18));
WriteD(ReadD(22));
WriteC(0);
SendToServerEx(Name);
mlk.Lines.Add(' Пробую поднять!!!');
delay(1000);
timer1.enabled:=true;
end;
end;
end;
end;
end.
2) Вот еще один вариан
//************************************************** ****************************
procedure ReqGetItem;
begin
if itm=0 then begin
timer1.enabled:=true; //включаем отсчет времени
needbackup:=false;
exit;
end;
timer1.enabled:=false; //выключаем отсчет времени
//перебираем базу
for i:=1 to max do begin
//если нашли, то обнуляем
if (ItemBase[1,i]<>0) then begin //ObjectID
say('ReqGetItem');
//даем команду подобрать вещь
buf:=#$04;
WriteD(ItemBase[1,i]);
WriteD(ItemBase[2,i]);
WriteD(ItemBase[3,i]);
WriteD(ItemBase[4,i]);
WriteH(00);
SendToServerEx(Name);
end;
end;
end;
begin
//************************************************** **************************
//DropItem - выпала вещь
if FromServer and (ConnectName=Name) and (pck[1]=#$0C) then begin
//чужие вещи не берем
if (Attacker=ReadD(2)) then begin
timer1.enabled:=false; //выключаем бота
AddMob:=true;
//перебираем базу
for i:=1 to max do begin
//если нашли, то корректируем его координаты на новые
if (ItemBase[1,i]=ReadD(6)) then begin //ObjectID
ItemBase[2,i]:=ReadD(14); //x
ItemBase[3,i]:=ReadD(18); //y
ItemBase[4,i]:=ReadD(22); //z
AddMob:=false;
inc(itm);
NeedBackup:=true;
say('Корректируем данные по предмету');
end;
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем
for i:=1 to max do begin
if (ItemBase[1,i]=0) then begin
//запоминаем в свободную ячейку
ItemBase[1,i]:=ReadD(6); //ObjectID
ItemBase[2,i]:=ReadD(14); //x
ItemBase[3,i]:=ReadD(18); //y
ItemBase[4,i]:=ReadD(22); //z
inc(itm);
NeedBackup:=true;
say('Добавили данные по предмету');
break;
end;
end;
end;
say('ColvoItm='+inttostr(itm));
end;
//************************************************** **************************
//SpawnItem - валяется вещь
if FromServer and (ConnectName=Name) and (pck[1]=#$0B) then begin
timer1.enabled:=false; //выключаем бота
AddMob:=true;
//перебираем базу
for i:=1 to max do begin
//если нашли, то корректируем его координаты на новые
if (ItemBase[1,i]=ReadD(2)) then begin //ObjectID
ItemBase[2,i]:=ReadD(10); //x
ItemBase[3,i]:=ReadD(14); //y
ItemBase[4,i]:=ReadD(18); //z
AddMob:=false;
inc(itm);
NeedBackup:=true;
say('Корректируем данные по предмету');
end;
//иначе, перебираем базу, ищем свободную ячейку в ней и добавляем
for i:=1 to max do begin
if (ItemBase[1,i]=0) and AddMob then begin
//запоминаем в свободную ячейку
ItemBase[1,i]:=ReadD(2); //ObjectID
ItemBase[2,i]:=ReadD(10); //x
ItemBase[3,i]:=ReadD(14); //y
ItemBase[4,i]:=ReadD(18); //z
inc(itm);
NeedBackup:=true;
say('Добавили данные по предмету');
break;
end;
end;
end;
say('ColvoItm='+inttostr(itm));
end;

//************************************************** **************************
if Wait(time1,2000) and NeedBackup and (underAttack=false) then ReqGetItem;

//************************************************** **************************
//определяем реальность поднятия вещи
//GetItem
if FromServer and (ConnectName=Name) and (pck[1]=#$0D) then begin
//перебираем базу
for i:=1 to max do begin
//если нашли, то обнуляем
if (ItemBase[1,i]=ReadD(6)) then begin //ObjectID
ItemBase[1,i]:=0; //ObjectID
ItemBase[2,i]:=0; //x
ItemBase[3,i]:=0; //y
ItemBase[4,i]:=0; //z
dec(itm);
//say('Удаляем данные по предмету');
end;
end;
if itm=0 then begin
needbackup:=false;
timer1.enabled:=true;
end;
say('ColvoItm='+inttostr(itm));
end;
end.

06.01.2008, 21:22
var
target: string;


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;

//Say ? ??????
if fromserver and (pck[1]+pck[6]=#$4A#$02) then
begin
case ord(pck[18]) of
$38:
begin
buf:=target;
SendToServer;
end;
end;
end;
end.

mdbodia
06.01.2008, 22:10
Полные скрипты лежат на форуме.
Спасибо огромное, но это автоподбор когда бью моба, с него падает вешь, и он её подымает. А мн надо что-б я мог привести чара на поляну усыпанную дропом и он её попылесосил.

NLObP
07.01.2008, 00:13
Полные скрипты лежат на форуме.
Спасибо огромное, но это автоподбор когда бью моба, с него падает вешь, и он её подымает. А мн надо что-б я мог привести чара на поляну усыпанную дропом и он её попылесосил.

Здесь надо начать с теории. Что значит усыпано предметами? Как и видимые НПС и прочее, в том числе предметы, мы это видим в клиенте потому, что он обрабатывает все пакеты начиная с коннекта к серверу. А бот, которого включили прийдя на поляну усыпанную вещами, как он их увидит?! Вот то-то и оно. Для того, чтобы хоть что-то работало, надо ловить пакеты, я уже указал подобную процедуру. Для тех кто в танке, вот начало ее:
//SpawnItem #$0B - валяется вещь
if FromServer and (ConnectName=Name) and (pck[1]=#$0B) then begin
И ловить надо задолго до подхода к месту. В идеале она должна все время работать и вносить в базу данных. По команде уже можно пробовать собрать предметы, например в радиусе 2000 единиц. Сейчас немного понятно?

mdbodia
07.01.2008, 00:44
Немного стало понятнее, спасибо. Щас будем пробовать.

djbandit
07.01.2008, 17:31
NLObP

Привет!!!!!!!!!!!!!!!!!!!!!!Большая просьба к тебе - напиши пожалуйста рабочий скрипт по автозаточке к интерлюде!!!Если сможешь проверь la2world.ru сервак: pvp1!Спасибо заранее!!!!!!!!!!!!!!!!!!!!!

08.01.2008, 11:29
var
target: string;


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;

//Say ? ??????
if fromserver and (pck[1]+pck[6]=#$4A#$02) then
begin
case ord(pck[18]) of
$38:
begin
buf:=target;
SendToServer;
end;
end;
end;
end.

NLObP
08.01.2008, 15:28
Попробуй воспользоваться подпрограммами
Надо учесть, что пакет A7=PartyMemberPosition:d(membercount)d(objID)d(X)d (Y)d(Z)
1-й это командир пати, следующие патимемберы по порядку как перечислены в клиенте.

//************************************************** *************
//04=Action:h(ObjectID)d(OriginX)d(OriginY)d(OriginZ )b(ShiftFlag)
procedure Target(AttackerObjID: Integer);
begin
buf:=#$04;
WriteD(AttackerObjID);
WriteD(MyXpos);
WriteD(MyYpos);
WriteD(MyZpos);
WriteC(00);
SendToServerEx(Name);
end;

begin
//************************************************** **************************
//не обрабатываем пустые пакеты
if pck='' then exit;
//************************************************** **************************
if (ConnectName=Name) and FromServer then begin
case pck[1] of
#$04: begin
//пакет с инфой о моём чаре
i:=2;
MyXpos:=ReadD(i); //получаю координату х моего чара
MyYpos:=ReadD(i); //получаю координату у моего чара
MyZpos:=ReadD(i); //получаю координату z моего чара
//Запоминаем ИД
i:=18;
MyObjID:=ReadD(i); //получаю ид моего чара
//смещение переменное, зависит от имени (LenName*2+2)
i:=i+(Length(Name)*2+2)+48; //44 для С4
MaxHP:=ReadD(i);
CurHP:=ReadD(i);
end;
//************************************************** **************************
//если от сервака принят пакет с ИД и Координатами членов пати то
//A7=PartyMemberPosition:d(membercount)d(objID)d(X)d (Y)d(Z)
#$A7: begin
//запоминаем ИД командира
MyObjID:=ReadD(6);
end;
end;
end;

if (ConnectName=Name) and FromClient then begin
case pck[1] of
//ValidatePosition пакет от клиента с моими кординатами
#$48: begin
//обновляем если мы сошли с места
MyXpos:=ReadD(2); //получаю координату х моего чара
MyYpos:=ReadD(6); //получаю координату у моего чара
MyZpos:=ReadD(10); //получаю координату z моего чара
end;
end;
end.

Shnaider
08.01.2008, 17:19
Народ,вот мне skymanrus сделал скрипт на бег за нужным чаром второго моего чара
Можете сделать его так,чтобы он включался по нажатию SokolA действия Pick UP,но сам он неподбирал бы дроп,а включался скрипт ходьбы за SokolA и SokolB тоже бы пытался подобрать дроп столько раз сколько нажал на Pick UP SokolA.Потом чтобы когда SokolA нажимает например Victory,то l2phx бы неотправлял этот пакет серверу,но выключал бы скрипт ходьбы за SokolA и SokolB начинал атаковать цель SokolA по ассисту
begin // main!!!!!!!!!!!!!!!!!!!

if FromClient and (ConnectName='SokolA') and (pck[1]=#$48) then //мы сошли с места
begin
buf:=#$01;
WriteD(ReadD(2));
WriteD(ReadD(6));
WriteD(ReadD(10));
WriteD(0);
WriteD(0);
WriteD(0);
buf:=buf+#$01+#$00+#$00+#$00;
SendToServerEx('SokolB');
end;

end.
Вот пример xkor'a на то чтобы пакет на действие Victory от SokolA недоходил до сервера, а SokolB садится
begin
if FromClient and (ConnectName='SokolA')
and (pck=HStr('1b 04 00 00 00')) then begin
buf:=HStr('45 00 00 00 00 00 00 00 00 00');
SendToServerEx('SokolB');
pck:='';
end;
end.

QaK
09.01.2008, 11:07
Ну вот и я вернулся =)
-режим бега(второе соц. действие) -режим бега работает так, что бот бежит туда же куда и хозяин, но с отклонением которое можно указать в const -chaos, генерируется случайным образом
режимы включаются и выключаются тем же соц. действием.
:beer: Сам давно хотел написать, да некогда все было var
target: string;


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;

//Say ? ??????
if fromserver and (pck[1]+pck[6]=#$4A#$02) then
begin
case ord(pck[18]) of
$38:
begin
buf:=target;
SendToServer;
end;
end;
end;
end.
от сервера и от клиента пакеты путаешь, от сервера приходит пакет о том, что кто-то кого-то выделил, а от клиента нужно посылать пакет Action (04)

QaK
09.01.2008, 17:02
кто-нибудь вот это действие с бегом за лидером по координатам с небольшим отставанием
Ты бредишь? МКС его ж написал, глаза разуй на предыдущую страничку загляни.
другим кто нешарит помочь вам западло Ты считаешь эта фраза кого-нить вдохновит написать нужный тебе скрипт? Нефиг тут сопли раводить, не умеешь - учись, здесь форум программистов, а не халаявное написание скриптов на заказ. :evil:

mks
09.01.2008, 17:58
Shnaider

//-------------------------------------------------------------------------------------------
//ловим пакет от клиента отправленный коммандиром при перемещении
if FromClient and (ConnectName=MasterName) and (pck[1]=#$01) then
begin
x:=ReadD(2);
y:=ReadD(6);
z:=ReadD(10); //координаты точки куда пошел коммандир

ox:=ReadD(14);
oy:=ReadD(18);
oz:=ReadD(22);//координаты точки откуда шел коммандир
//-------------------------------------------------------------------------------------------
//имеем координаты точек откуда и куда шел коммандир
//делаем с координатами все что душе угодно
//строим аналогичный пакет
buf:=#$01;
WriteD(x);
WriteD(y);
WriteD(z);

WriteD(ox);
WriteD(oy);
WriteD(oz);
SendToServerEx(BotName); //отправляем его серверу ботом
end;


вот и все

djbandit
09.01.2008, 18:31
for i:=1 to ListCount do begin
ObjID:=ReadD(j); //ObjectID
ItmID:=ReadD(j); //ItemID
j:=j+14;
Lvl:=ReadD(j); //Level
case ItmID of
ScrollID: begin
ScrollBase[ss]:=ObjID;
inc(ss);
Say('ColvoScrl='+IntToStr(ss));
end;

Что может быть за ошибка в слове которое подчеркнули выделил?В чём ошбика?

keyn
09.01.2008, 20:45
mks
Мужик, С прошедшими тебя праздниками!!!

Слушай за скрип твой на СЕ Хиллера огромный респект, все супер сделано - только вот у меня такая проблема пока незнаю как решить, Вообщем если задать значение HP больше чем есть реально у SE - SE начинает себя хилять пока руки не отсохнут - вот хотел какнибудь решить этот казус - может ли скрип какнибудь следить за максимальными значениями HP членов пати и уже исходя из этих значений хилять тех у кого это значение стало меньше? Извиняюсь за калабур сам еще от НГ не отошел )))

mks
10.01.2008, 11:54
mks
Мужик, С прошедшими тебя праздниками!!!

Слушай за скрип твой на СЕ Хиллера огромный респект, все супер сделано - только вот у меня такая проблема пока незнаю как решить, Вообщем если задать значение HP больше чем есть реально у SE - SE начинает себя хилять пока руки не отсохнут - вот хотел какнибудь решить этот казус - может ли скрип какнибудь следить за максимальными значениями HP членов пати и уже исходя из этих значений хилять тех у кого это значение стало меньше? Извиняюсь за калабур сам еще от НГ не отошел )))
скрипт запоминает все значиния и максимальные и текущие и HP и MP.
для твоего случая у меня там имеется переменная dev (extended) которая содержит в себе отношение текущего ХП к макс ХП, т.е. CurHP/MaxHP, так что здесь ты можешь немного переделать в условиях, что б сравнивалось не с текущим количеством ХП а с этой переменной, и будет хилить как тебе удобно, допустим если хп члена пати меньше чем 1/2 от максимума

Добавлено спустя 38 минут 34 секунды:
Re: ДА БУДЕТ БОТ!
или еще проще добавь в этом месте
for t:=1 to PartyCount do
begin
if (CurHP[t]=MinHP) and (CurHP[t]<MaxHP[t]) then
begin
NeedHP:=t;
break;
end;
end;

QaK
11.01.2008, 08:40
например /assist MasterName?,атаку сделать смогу,но никак непойму как делается ассист
Смотришь кого выделяет коммандир (пакет Action) выдираешь из него ID цели, и при определенный условиях выделяешь объект с запомненныйм ID.

keyn
14.01.2008, 00:56
или еще проще добавь в этом месте
for t:=1 to PartyCount do
begin
if (CurHP[t]=MinHP) and (CurHP[t]<MaxHP[t]) then
begin
NeedHP:=t;
break;
end;
end;


Блин, запутался я в трех соснах, если делать таким макаром, то SE начинает хилять как только HP начинает уменьшаться, но как только HP достигает Максимума SE продолжает тупо хилять полностью здорового перса - два дня ковыряюсь немогу найти где косяк...

VORON
14.01.2008, 11:11
или еще проще добавь в этом месте
for t:=1 to PartyCount do
begin
if (CurHP[t]=MinHP) and (CurHP[t]<MaxHP[t]) then
begin
NeedHP:=t;
break;
end;
end;


Блин, запутался я в трех соснах, если делать таким макаром, то SE начинает хилять как только HP начинает уменьшаться, но как только HP достигает Максимума SE продолжает тупо хилять полностью здорового перса - два дня ковыряюсь немогу найти где косяк...
-) да да я с етим сталкивался.. хилы продолжаются даже если ХП- полное.. такое бывает когда таймер используеш для хила, в котором смутриш что если какаято переменная =TRUE то хилиш а FALSE= нехилиш.. поетому откажись от использования таймера для етой задачи.. хиль непосредственно в обработчике пакета из которого инфа про ХП и МП берется.. я пытался понять почему таймер некоректно так работает.. но так и непонял

mks
14.01.2008, 11:36
не знаю че у вас за проблемы, но я пользуюсь этим скриптом, и все у меня нормально работает

keyn
14.01.2008, 23:05
Приду домой буду голову ломать дальше, потому что судя по коду все должно быть гладко...

Добавлено спустя 4 часа 54 минуты 50 секунд:
То ли с ума сошел я, - то ли мир вокруг меня глумится... Ковыряю сейчас скрипт msk на бота хилера...

Const
HP=2000;
BotName='Хилер';
MasterName='Командос';
Chaos=100;

GreatHeal='2F C1 04 00 00 00 00 00 00 00';
GroupHeal='2F C3 04 00 00 00 00 00 00 00';

var
CharName: array[1..9] of string;
CharID: array[1..9] of integer;
CurHP: array[1..9] of integer;
MaxHP: array[1..9] of integer;
CurMP: array[1..9] of integer;
MaxMP: array[1..9] of integer;
Dev: array[1..9] of extended;
xe, ye: extended;
PartyCount,i,f,e,t,MinHP,NeedHP,ox,oy,oz,x,y,z,Mas terID,BotID: integer;
exist, HealKey, RunKey: boolean;

TimerHP: TTimer;

procedure Init; //Aucuaaaony i?e aee??aiee ne?eioa
begin
TimerHP:=TTimer.Create(nil);
TimerHP.OnTimer:=@OnTimerHP;
TimerHP.enabled:=true;
TimerHP.interval:=1000;
end;

procedure Heal;
begin
//target
buf:=#$04;
WriteD(CharID[NeedHP]);
WriteD(ox);
WriteD(oy);
WriteD(oz);
WriteC(0);
SendToServerEx(BotName);
//heal
buf:=hstr(GreatHeal);
SendToServerEx(BotName);
end;

procedure SendMsg(msg:string);
begin
buf:=#$4A;
WriteD(BotID);
WriteD(2);
WriteS(BotName);
WriteS(msg);
SendToClient;
end;

procedure Min(n1,n2:integer);
begin
if n1<n2 then MinHP:=n1 else MinHP:=n2;
end;

procedure OnTimerHP(Sender: TObject);
begin
if PartyCount>0 then
begin
MinHP:=CurHP[1];
for t:=1 to PartyCount do
begin
if CharName[t]=MasterName then MasterID:=CharID[t];
if CharName[t]=BotName then BotID:=CharID[t];
min(MinHP,CurHP[t]);
end;
for t:=1 to PartyCount do
begin
if (CurHP[t]=MinHP) and (CurHP[t]<MaxHP[t]) then
begin
NeedHP:=t;
break;
end;
end;
if (HealKey=true) and (MinHP<HP) then Heal;
end;
end;

procedure Free; //Aucuaaaony i?e auee??aiee ne?eioa
begin
PartyCount:=0;
TimerHP.free;
HealKey:=false;
RunKey:=false;
end;

//iniiaiay ?anou ne?eioa
//aucuaaaony i?e i?eoiaa ea?aiai iaeaoa anee ne?eio aee??ai
begin

if FromServer and (pck[1]=#$52) then
begin
i:=6;
for f:=1 to (PartyCount+1) do
begin
if CharID[f]=ReadD(2) then exist:=true else exist:=false;
if exist=true then
begin
CharName[f]:=ReadS(i);
i:=i+8;
CurHP[f]:=ReadD(i);
MaxHP[f]:=ReadD(i);
CurMP[f]:=ReadD(i);
MaxMP[f]:=ReadD(i);
Dev[f]:=CurHP[f]/MaxHP[f];
break;
end;
end;

if exist=false then
begin
PartyCount:=PartyCount+1;
f:=PartyCount;
CharID[f]:=ReadD(2);
CharName[f]:=ReadS(i);
i:=i+8;
CurHP[f]:=ReadD(i);
MaxHP[f]:=ReadD(i);
CurMP[f]:=ReadD(i);
MaxMP[f]:=ReadD(i);
Dev[f]:=CurHP[f]/MaxHP[f];
end;
end;


if FromClient and (ConnectName=MasterName) and (RunKey=true) and (pck[1]=#$01) then
begin
xe:=ReadD(2)-Chaos/2+round(random*Chaos);
ye:=ReadD(6)-Chaos/2+round(random*Chaos);

x:=round(xe);
y:=round(ye);
z:=ReadD(10);

buf:=#$01;
WriteD(x);
WriteD(y);
WriteD(z);
WriteD(ox);
WriteD(oy);
WriteD(oz);
ox:=x;
oy:=y;
oz:=z;
SendToServerEx(BotName);
end;


if FromClient and (ConnectName=BotName) and (pck[1]=#$01) then
begin
ox:=ReadD(2);
oy:=ReadD(6);
oz:=ReadD(10);
end;


//Heal mode
if FromClient and (ConnectName=MasterName) and (pck=hstr('1B 02 00 00 00')) then
begin
HealKey:=not(HealKey);
pck:='';
Case HealKey of
true: SendMsg('Heal mode ON');
false: SendMsg('Heal mode OFF');
end;
end;

//Run mode
if FromClient and (ConnectName=MasterName) and (pck=hstr('1B 03 00 00 00')) then
begin
RunKey:=not(RunKey);
pck:='';
Case RunKey of
true: SendMsg('Run mode ON');
false: SendMsg('Run mode OFF');
end;
end;

if FromClient and (pck=hstr('1B 04 00 00 00')) then
begin
//target master
buf:=#$04;
WriteD(MasterID);
WriteD(ox);
WriteD(oy);
WriteD(oz);
WriteC(0);
SendToServerEx(BotName);
buf:=hstr('2F F5 03 00 00 00 00 00 00 00');
SendToServerEx(BotName);
pck:='';
end;
end.[/quote]


Короче вчера вот строго в этом виде все работало без мистики - с одним лиш косяком кторый заключался в том, что SE хилял безконечно после того, как опрделил что у одного из членов пати Текущее HP меньше чем максимальное.

Сейчас в этом же виде когда включаеш HEAL MODE - L2PacketHack вывливает коврик Variant or safe array index out of bounds :shock:
Ошибка исчезает если вернуть строку if (CurHP[t]=MinHP) and (CurHP[t]<MaxHP[t]) then к виду if CurHP[t]=MinHP then

Похоже крыша у меня поехала... тяжелых наркотиков не употреблял вроде на кануне. :unknown:

mks
15.01.2008, 11:39
keyn обрати внимание, у меня в скрипте не учтен один момент: если один или несколько членов пати выходят из него, и ты пересоздаешь пати, или появляются новые члены, то ID старых членов пати остаются в массивах, т.е. таким образом если количество ID игроков побывавших в твоем пати превысит 9, то должна вылезти ошибка(массивы-то не динамические), и еще не пойму почему у тебя СЕ начинает бессприрывно хилять после того как заметит что хп члена меньше заданного минимума - после хила приходит пакет что хп члена пати увеличилось, все заносится в массив, и если хп больше минимума СЕ должен перестать хил, у меня-то все работает....

keyn
15.01.2008, 15:41
mks, У меня в пати всего 3 чара было, на них тестировал, сейчас буду скрипт с нуля писать, по аналогии с твоим, думаю по шагам разберусь - у меня соображалка так устроена, пока по своему не сделаю хрен разберусь в чужих трудах.

mks
15.01.2008, 16:24
mks, У меня в пати всего 3 чара было, на них тестировал, сейчас буду скрипт с нуля писать, по аналогии с твоим, думаю по шагам разберусь - у меня соображалка так устроена, пока по своему не сделаю хрен разберусь в чужих трудах.
дерзай, потом скажешь че вышло

VORON
15.01.2008, 21:43
ых, скучаю по етому топу-)) но пока я не разберусь с "ДЕШИРИРУЕМ ТРАФИК" мне тут ловить нечего-))

keyn
15.01.2008, 23:10
mks, Кажется допетрил я в чем дело - перехватил пакет UserInfo и проанализировав его пришел к выводу, что там идет смещение - получается что MaxHP находится на месте CurrentHP - CurrentHP находится на месте MaxMP - отсюда скрипт неправильно вырывает значения и получаются такие глюки. Сейчас препешу определение характеристик конкретно под вид этого пакета - Похоже Админы сервера на ктором я это все тестил - намудрили такой вот капкан. А может Интерлюдия так работает - ХЗ

QaK
16.01.2008, 00:00
2keyn возможно причина в следующем:
В пакете ЮзерИнфо длина ника и/или длина титула - строковый параметр, может быть разной длины - отсюда и смещение.

Добавлено спустя 1 минуту 13 секунд:
то ли мир вокруг меня глумится
тяжелых наркотиков не употреблял вроде на кануне.
Жжошь :ROFL:

VORON
16.01.2008, 00:14
KEYN, етот вопрос вроде негде не поднимался но я при переходе с ц4 на интерлюд тоже с етим стокнулся... на несколько байт сдвинуто ХП и МП.. -)) жэлаю удачи-))

NLObP
16.01.2008, 02:18
Эта процедура одинаково работает на C4 и IL

var
MyID, CurHP, MaxHP : integer;

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;
end;

begin
if (ConnectName=Name) and FromServer then begin
case pck[1] of
#$0E: begin
if (MyID=ReadD(2)) then StatsUpdate;
end;
end;
end;
end.

VORON
16.01.2008, 02:41
NLO, я незнаю синтаксиса КЕЙС ОФ.. просьба и не говарить что я нуб.. я ето и так занаю.. вопщем твой скрипт мне не понятен.. но плиз по факту: ХП и ЦП сдвинуто в "ц4" и в "интерлюде" на несколько байтов.. если они сдвинуты то нельзя говорить об том что общий скрипт существует для "ц" и "интерлюда".. я же говарю про то что сдвинуты порядковые номера.. за счет увеличения чего???- непонятно но сдвинуты.. на 2 байта вроде.. вродеде в сторону увеличения.... там где МАКСИМАЛЬНОЕ КОЛ-ВО ХП = пишется ТЕКУЩЕЕ... тоже самое справедливо и для МП..

Добавлено спустя 2 минуты 7 секунд:
лучше лог пакета дай от интерлюда... и нуждающийся в помощи- аналогичны лог даст.. и станет всё понятно

Добавлено спустя 11 минут 42 секунды:
автор: нефиг такие вопросы задовать- неочем типа (почему не работает готовый скрипт) .. ну ето и так всем понятно.. у тебя сервер отличается от того на котором скрипт делался...
главное понять смысл скрипта.. и переделать его под себя.. какуюто новую идею увидеть- ту что други у себя сделали.. для етого и топ... 99% скриптов которые тут нельзя применять на среднестатистическом сервере без переделки..
об чем ето говорит? об том что скрипты кривые?? или об том что люди неспособны переделать их? или об том что шифрация на серваке изменена?
вот пример первый скрипт в первом посте.. там я объяснял как и что сделать чтоб переделать для того чтоб это запустилось... в других скриптах- аналогично..
нужно переделывать, подстраивать.. доделывать...
согласись выяснить места расположения текущих значений переменных- нефиг делать для твое случая..
и отмониторить их- тожэ нефиг делать..
создаеш форму и там (проще всего) в каптион пишеш ХП и МП.. ну что еще проще может быть? просто тебе лень.. вот и нагружаеш форум просмотрами и ответами...

mks
16.01.2008, 10:59
keyn вообще-то скрипт я писал для интерлюда, где его и использую.... конечно я не исключаю возможности не соответствия пакетов на разных серверах, но советую не путать пакеты ЮзерИнфо с СмолПатиИнфо, я использую второй:

#$52
D: UserID
S: UserName
D: CurCP
D: MaxCP
D: CurHP
D: MaxHP
D: CurMP
D: MaxMP

VORON
16.01.2008, 21:57
MKS, мне кажется очень много вопросов у людей связано с бональными вещам.. которые получаются изза того что нет удобного интерфейса для мониторинга значений переменных в режиме онлайн... люди в слепую тычатся.. поетой причине дам кусочек кода который на стадии разработки скрипта нужно в скрипт добавить и с его помощью отоброжать значения переменных на екране..
var
frm:Tform;

memo:Tmemo;

procedure Init; //Вызывается при включении скрипта
begin
frm := TForm.Create(nil);
frm.Caption := 'Chat';
frm.BorderStyle := bsSizeable;
frm.Position := poScreencenter;
frm.Width:=600;
frm.Height:=700;
frm.FormStyle:=FsStayOnTop;
frm.Show;

memo :=TMemo.create(nil);
memo.parent:=frm;
memo.align:=alClient;

end;

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

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

if FromClient then
begin

memo.Lines.Add('сюда пишем всё что хотим и видемето на екране екране, например:'+inttostr(12345));

end;
end.

NLObP
17.01.2008, 01:42
NLO, я незнаю синтаксиса КЕЙС ОФ.. просьба и не говарить что я нуб.. я ето и так занаю.. вопщем твой скрипт мне не понятен.. но плиз по факту: ХП и ЦП сдвинуто в "ц4" и в "интерлюде" на несколько байтов.. если они сдвинуты то нельзя говорить об том что общий скрипт существует для "ц" и "интерлюда".. я же говарю про то что сдвинуты порядковые номера.. за счет увеличения чего???- непонятно но сдвинуты.. на 2 байта вроде.. вродеде в сторону увеличения.... там где МАКСИМАЛЬНОЕ КОЛ-ВО ХП = пишется ТЕКУЩЕЕ... тоже самое справедливо и для МП..

лучше лог пакета дай от интерлюда... и нуждающийся в помощи- аналогичны лог даст.. и станет всё понятно

Вот кусочек исходника пакета Интерлюдии
writeC(0x04);
writeD(_cha.getX());
writeD(_cha.getY());
writeD(_cha.getZ());
writeD(_cha.getHeading());
writeD(_cha.getObjectId());
writeS(_cha.getName());
writeD(_cha.getRace().ordinal());
writeD(_cha.getSex());
writeD(_cha.getBaseClass());
writeD(_cha.getLevel());
writeQ(_cha.getExp());
writeD(_cha.getSTR());
writeD(_cha.getDEX());
writeD(_cha.getCON());
writeD(_cha.getINT());
writeD(_cha.getWIT());
writeD(_cha.getMEN());
writeD(_cha.getMaxHp());
writeD((int) _cha.getCurrentHp());
writeD(_cha.getMaxMp());
writeD((int) _cha.getCurrentMp());
writeD(_cha.getSp());
writeD(_cha.getCurrentLoad());
writeD(_cha.getMaxLoad());

Вот то же самое для С4
writeC(0x04);
writeD(_cha.getX());
writeD(_cha.getY());
writeD(_cha.getZ());
writeD(_cha.getHeading());
writeD(_cha.getObjectId());
writeS(_cha.getName());
writeD(_cha.getRace().ordinal());
writeD(_cha.getSex());
writeD(_cha.getClassId().getId());
writeD(_cha.getLevel());
writeD(_cha.getExp());
writeD(_cha.getSTR());
writeD(_cha.getDEX());
writeD(_cha.getCON());
writeD(_cha.getINT());
writeD(_cha.getWIT());
writeD(_cha.getMEN());
writeD(_cha.getMaxHp());
writeD((int) _cha.getCurrentHp());
writeD(_cha.getMaxMp());
writeD((int)_cha.getCurrentMp());
writeD(_cha.getSp());
writeD(_cha.getCurrentLoad());
writeD(_cha.getMaxLoad());

Отличаются в размерности EXP'ы. В С4 это 4 байта в Интерлюдии 8 байт - вот оно и смещение!

По поводу пакета StatusUpdate #0E. Он появляется гораздо чаще пакета UserInfo #04. И одинаков для С4 и Интерлюдии

Коды атрибутов в пакете UserInfo
public static int LEVEL = 0x01;
public static int EXP = 0x02;
public static int STR = 0x03;
public static int DEX = 0x04;
public static int CON = 0x05;
public static int INT = 0x06;
public static int WIT = 0x07;
public static int MEN = 0x08;
public static int CUR_HP = 0x09;
public static int MAX_HP = 0x0a;
public static int CUR_MP = 0x0b;
public static int MAX_MP = 0x0c;
public static int SP = 0x0d;
public static int CUR_LOAD = 0x0e;
public static int MAX_LOAD = 0x0f;
public static int P_ATK = 0x11;
public static int ATK_SPD = 0x12;
public static int P_DEF = 0x13;
public static int EVASION = 0x14;
public static int ACCURACY = 0x15;
public static int CRITICAL = 0x16;
public static int M_ATK = 0x17;
public static int CAST_SPD = 0x18;
public static int M_DEF = 0x19;
public static int PVP_FLAG = 0x1a;
public static int KARMA = 0x1b;
public static int CUR_CP = 0x21;
public static int MAX_CP = 0x22;

И сам пакет
{
writeC(0x0e); //тип пакета
writeD(_objectId); //указывает к кому относится этот пакет
writeD(_attributes.size()); //кол-во атрибутов в пакете
for (Attribute temp : _attributes)
{
writeD(temp.id); //код атрибута
writeD(temp.value); //величина
}
}
Вышеприведенная мною процедура, в цикле сравнивает атрибуты с необходимым нам и подставлеет его величину.
Из UserInfo, по мне, надо только ObjID чара брать, ну может еще макс. значения атрибутов, а все остальное из StatusUpdate.

SWS
17.01.2008, 02:02
NLObP, плиз скажи где брал исходники сервака, я искал там порядок тату был другой. Там было с INT, а игра передаёт начиная с STR, я сначала не понимал че не так. :)

keyn
17.01.2008, 02:21
mks,

#$52
D: UserID
S: UserName
D: CurCP
D: MaxCP
D: CurHP
D: MaxHP
D: CurMP
D: MaxMP


Вот смотри выдрал пакет PartySmallWindowUpdate который шлет сервак где я мучаю скрипту.

52 43 D6 70 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CD 08 00 00 CD 08 00 00 FA 0B 00 00 FA 0B 00 00 F9 02 00 00 FA 02 00 00 33 00 00 00 39 00 00 00

Ник чара - Выставил в нули - дабы не светитЦо :roll:
CurCP
MaxCP
CurHP
MaxHP
CurMP
MaxMP

Сравни если не сложно - со своим пакетом - есть ли смещение?

VORON
17.01.2008, 05:08
я делал кучу разновидностей подобных ботов.. поетому накуя ты пати виндоу смотриш???
смотри- СТАТУС ПАДЕЙТ!
оттуда выдергивай инфу про ХП и МП... и про лимиты ХП и МП тоже (ммаксимальное кол-во) лимиты для того чтобы скрипт сделать универсальным типа 70% от шкалы- лить ХП.. а не фиксировать ето число константой каждый раз- переправля для нового лвл-)...
спс за твой грамотный вопрос нам.. красиво так всё нарисовал в красках- стало всё понятно сразу...
впредь если вопросы возникнут- спрашивай максимально уточняя что именно не выходит.. чтоб мы поняли..
павкет СТАТУС АПДЕЙТ приходит каждый раз при изменении кол-ва ХП и МП.... и не только.. при бафах еще и т.д.
поетому нефиг пати окно смотреть!! смотри СТАТУС АБДЕЙТ!

Добавлено спустя 5 минут 29 секунд:
MKS, я нехачу сказать что твой скрипт кривой.. просто если выдергивать инфу из СТАТУС АБДЕЙТ то ето более коректней.. и работать будет дажэ без создания пати..
P.S.- протестировано

Добавлено спустя 2 минуты:
Re: ДА БУДЕТ БОТ!
Эта процедура одинаково работает на C4 и IL

var
MyID, CurHP, MaxHP : integer;

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;
end;

begin
if (ConnectName=Name) and FromServer then begin
case pck[1] of
#$0E: begin
if (MyID=ReadD(2)) then StatsUpdate;
end;
end;
end;
end.

не проверял но думаю он прав...
СТАТУС АПДЕЙТ ИСПОЛЬЗУЕТСЯ!

mks
17.01.2008, 12:23
VORON
просто если выдергивать инфу из СТАТУС АБДЕЙТ то ето более коректней..
я бы назвал этот вывод не очень корректным)), потому как выдергивая инфу из пакетов СмолПати все будет работать корректно.
Да, используя инфу из СтатусАпдэйт, скрипт можно что б работал и вне пати, но таковой задачи при написании у меня небыло, к тому же с пакетом СмолПати проще работать, плюс сам хилер может находиться не в пати и хилять, т.к. если коммандир находится в пати а хилер нет, то пакеты СмолПати всеравно приходят через коммандира ;)
еще про хил в зависимости от процентного кол-ва хп я тоже делал, сначала так и использовал, но потом пришел к выводу что лучше когда указываешь конкретное количество, небольшой пример:
пати Дестроер и какой-нидь темный эльф, - у дестроера под баффом 10к ХП, а у эльфа 4к, и прикинь сам как все будет выглядеть если здесь хил будет идти по %....

VORON
17.01.2008, 13:40
MKS, ну как как... нормально.. то что дестр ХП жрет немереноо- факт.. но лить их 1 фиг надо.. от того что пререправим на фиксированное значение- меньше лиль не прийдется...

Добавлено спустя 8 минут 4 секунды:

var
Bot1X,Bot1Y,Bot1Z,Bot2X,Bot2Y,Bot2Z:string;
rnd:integer;

NameKom,NameBot1,NameBot2:string;

MaxHPKom,MaxHPBot1,MaxHPBot2:integer;
MaxMPKom,MaxMPBot1,MaxMPBot2:integer;

CurHPKom,CurMPKom,CurHPbot1,CurMPbot1,CurHPbot2,Cu rMPbot2:integer;

IDKomandos,IDbot1,IDbot2:string;
ChekIdKom,ChekIdBot1,ChekIdBot2:boolean;

timer1: TTimer; //баф БОТ1
timer2: TTimer; //баф БОТ2
timer3: TTimer; //для создания пати
tick1,tick2,tick3:integer;

i:integer;
tempD:integer;
tempS:String;

//*********************БУФ ШЕ************************************************ ******************
procedure OnTimer1(Sender: TObject);
begin
// buf:=hstr('2F 2C 04 00 00 00 00 00 00 00'); //па
// buf:=hstr('2F 10 04 00 00 00 00 00 00 00'); //пд
// buf:=hstr('2F 35 04 00 00 00 00 00 00 00'); //фокус
// buf:=hstr('2F B4 04 00 00 00 00 00 00 00'); //вв
// buf:=hstr('2F 0B 04 00 00 00 00 00 00 00'); //ментал
// buf:=hstr('2F A5 04 00 00 00 00 00 00 00'); //резист к ветру
// buf:=hstr('2F D8 04 00 00 00 00 00 00 00'); //гвиданс-акураси
// buf:=hstr('2F DA 04 00 00 00 00 00 00 00'); //деф виспер- сила крита
// 2F 36 04 00 00 00 00 00 00 00 кон
// 2F 23 04 00 00 00 00 00 00 00 емповер
// 2F F4 04 00 00 00 00 00 00 00 вамп

//буф командира (ШЕ)
if tick1=1 then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F F4 04 00 00 00 00 00 00 00'); //вамп
SendToServerEX(NameBot1);
end;

if tick1=2 then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F 2C 04 00 00 00 00 00 00 00'); //па
SendToServerEX(NameBot1);
end;

if tick1=3 then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F 10 04 00 00 00 00 00 00 00'); //пд
SendToServerEX(NameBot1);
end;

if tick1=4 then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F B4 04 00 00 00 00 00 00 00'); //вв
SendToServerEX(NameBot1);
end;

if tick1=5 then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F 35 04 00 00 00 00 00 00 00'); //фокус
SendToServerEX(NameBot1);
end;

if tick1=6 then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F DA 04 00 00 00 00 00 00 00'); //деф виспер- сила крита
SendToServerEX(NameBot1);
end;

if tick1=7 then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F 0B 04 00 00 00 00 00 00 00'); //ментал
SendToServerEX(NameBot1);
end;

if tick1=8 then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F A5 04 00 00 00 00 00 00 00'); //резист к ветру
SendToServerEX(NameBot1);
end;

if tick1=9 then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F D8 04 00 00 00 00 00 00 00'); //гвиданс-акураси
SendToServerEX(NameBot1);
end;


//буф ШЕ (ШЕ)
if tick1=10 then
begin
buf:=hstr('04') + IDBot1 + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F 10 04 00 00 00 00 00 00 00'); //щит
SendToServerEX(NameBot1);
end;

if tick1=11 then
begin
buf:=hstr('04') + IDbot1 + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F B4 04 00 00 00 00 00 00 00'); //вв
SendToServerEX(NameBot1);
end;

if tick1=12 then
begin
buf:=hstr('04') + IDBot1 + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F 36 04 00 00 00 00 00 00 00'); //кон
SendToServerEX(NameBot1);
end;

if tick1=13 then
begin
buf:=hstr('04') + IDBot1 + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F 23 04 00 00 00 00 00 00 00'); //емп
SendToServerEX(NameBot1);
end;

if tick1=14 then
begin
buf:=hstr('04') + IDBot1 + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F 0B 04 00 00 00 00 00 00 00'); //ментал
SendToServerEX(NameBot1);
end;

if tick1=15 then
begin
buf:=hstr('04') + IDBot1 + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F A5 04 00 00 00 00 00 00 00'); //резист к ветру
SendToServerEX(NameBot1);
end;

//буф ПП (ШЕ)
if tick1=16 then
begin
buf:=hstr('04') + IDBot2 + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F 23 04 00 00 00 00 00 00 00'); //емп
SendToServerEX(NameBot1);
end;

if tick1=17 then
begin
buf:=hstr('04') + IDBot2 + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F A5 04 00 00 00 00 00 00 00'); //резист к ветру
SendToServerEX(NameBot1);
end;


tick1:=tick1+1;

if tick1=18 then
begin
tick1:=1;
timer1.enabled:=false;
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
end;
end;

//*********************БУФ ПП************************************************ ******************
//список бафов:
//2F 0B 04 00 00 00 00 00 00 00 ментал
//2F 10 04 00 00 00 00 00 00 00 щит
//2F 2C 04 00 00 00 00 00 00 00 па
//2F 35 04 00 00 00 00 00 00 00 фокус
//2F 36 04 00 00 00 00 00 00 00 кон
//2F 3D 04 00 00 00 00 00 00 00 акумен
//2F A7 04 00 00 00 00 00 00 00 резист к огню
//2F B4 04 00 00 00 00 00 00 00 вв
//2F 26 04 00 00 00 00 00 00 00 берс
//2F 14 04 00 00 00 00 00 00 00 ХП реген
//2F 3E 04 00 00 00 00 00 00 00 хаст
//2F 15 04 00 00 00 00 00 00 00 блесс ХП
//2F 0C 04 00 00 00 00 00 00 00 маджик барьер
//

procedure OnTimer2(Sender: TObject);
begin
//буф командира (ПП)
if tick2=1 then
begin
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F 3E 04 00 00 00 00 00 00 00'); //хаст
SendToServerEX(NameBot2);
end;

if tick2=2 then
begin
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F 15 04 00 00 00 00 00 00 00'); //блес ХП
SendToServerEX(NameBot2);
end;

if tick2=3 then
begin
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F 0C 04 00 00 00 00 00 00 00'); //маджик барьер
SendToServerEX(NameBot2);
end;

if tick2=4 then
begin
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F 3D 04 00 00 00 00 00 00 00'); //акумен
SendToServerEX(NameBot2);
end;

if tick2=5 then
begin
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F A7 04 00 00 00 00 00 00 00'); //резист к огню
SendToServerEX(NameBot2);
end;

if tick2=6 then
begin
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F 26 04 00 00 00 00 00 00 00'); //берс
SendToServerEX(NameBot2);
end;

if tick2=7 then
begin
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F 14 04 00 00 00 00 00 00 00'); //реген ХП
SendToServerEX(NameBot2);
end;

//баф ШЕ (ПП)
if tick2=8 then
begin
buf:=hstr('04') + IDbot1 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F 15 04 00 00 00 00 00 00 00'); //блесс ХП
SendToServerEX(NameBot2);
end;

if tick2=9 then
begin
buf:=hstr('04') + IDbot1 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F 0C 04 00 00 00 00 00 00 00'); //маджик барьер
SendToServerEX(NameBot2);
end;

if tick2=10 then
begin
buf:=hstr('04') + IDbot1 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F 3D 04 00 00 00 00 00 00 00'); //акумен
SendToServerEX(NameBot2);
end;

if tick2=11 then
begin
buf:=hstr('04') + IDbot1 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F A7 04 00 00 00 00 00 00 00'); //резист к огню
SendToServerEX(NameBot2);
end;

//баф ПП (ПП)
if tick2=12 then
begin
buf:=hstr('04') + IDbot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F 15 04 00 00 00 00 00 00 00'); //блесс ХП
SendToServerEX(NameBot2);
end;

if tick2=13 then
begin
buf:=hstr('04') + IDbot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F 0C 04 00 00 00 00 00 00 00'); //маджик барьер
SendToServerEX(NameBot2);
end;

if tick2=14 then
begin
buf:=hstr('04') + IDbot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F 10 04 00 00 00 00 00 00 00'); //пд
SendToServerEX(NameBot2);
end;

if tick2=15 then
begin
buf:=hstr('04') + IDbot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F 3D 04 00 00 00 00 00 00 00'); //акумен
SendToServerEX(NameBot2);
end;

if tick2=16 then
begin
buf:=hstr('04') + IDbot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F B4 04 00 00 00 00 00 00 00'); //вв
SendToServerEX(NameBot2);
end;

if tick2=17 then
begin
buf:=hstr('04') + IDbot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F A7 04 00 00 00 00 00 00 00'); //резист к огню
SendToServerEX(NameBot2);
end;

if tick2=18 then
begin
buf:=hstr('04') + IDbot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F 36 04 00 00 00 00 00 00 00'); //кон
SendToServerEX(NameBot2);
end;

if tick2=19 then
begin
buf:=hstr('04') + IDbot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F 0B 04 00 00 00 00 00 00 00'); //ментал
SendToServerEX(NameBot2);
end;

tick2:=tick2+1;

if tick2=20 then
begin
tick2:=1;
timer2.enabled:=false;
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot2);
end;
end;

//****************************РАЗДАЧА ПРИГЛАШЕНИЙ НА ВСТУПЛЕНИЕ В ПАТИ*******************
//*********************А ТАКЖЕ ПОСЫЛКА ТЕКСТА Я1 Я2 Я3 для захвата ИДешников************
procedure OnTimer3(Sender: TObject);
begin

if tick3 = 1 then
begin
buf:=hstr('2B');
SendToServerEX(NameKom);
SendToServerEX(NameBot1);
SendToServerEX(NameBot2);
end;

if tick3 = 2 then
begin
buf:=hstr('29');
writeS(namebot1);
buf:=buf + hstr('00 00 00 00');
SendToServerEX(NameKom);
end;

if tick3 = 3 then
begin
buf:=hstr('29');
writeS(namebot2);
buf:=buf + hstr('00 00 00 00');
SendToServerEX(NameKom);
end;

if tick3 = 4 then
if (IDKomandos = '') or (IDBot1 = '') or (IDBot2 = '') then
begin
buf:=hstr('38');
writes('я1');
buf:=buf + hstr('03 00 00 00'); ///9- али // 3-пати // 01 - общий
sendtoserverex(NameKom);

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

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

tick3:=tick3+1;

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

end;

//*************************БЕЖИМ ЗА ЛИДЕРОМ*******************************************
//процедура заставляет бежать ботов за лидером
procedure BotBeg;
begin
//проверяем условие чтоб координаты ботов небыли равными '' и ИД был перехвачен
if IDKomandos <> '' then
begin
//выделяем командира, эмулируя щелчек мыши
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
//бежим за командиром эмулируя повторный щелчек мыши по таргету
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);

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


procedure Init; //Вызывается при включении скрипта
begin
NameKom:='ник- командоса';
NameBot1:='ник ШЕ;
NameBot2:='ник ПП';

CurHPKom:=15000;
CurHPBot1:=15000;
CurHPBot2:=15000;

CurMPKom:=15000;
CurMPBot1:=15000;
CurMPBot2:=15000;

MaxHPKom:=10;
MaxHPBot1:=10;
MaxHPBot2:=10;

ChekIDKom:=false;
ChekIDBot1:=false;
ChekIDBot2:=false;

tick1:=1;
tick2:=1;
tick3:=1;

timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer1; //
timer1.enabled:=false; //
timer1.interval:=4000;

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:=1000;

end;

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

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

//******************************АВТОСОГЛАШЕНИЕ НА ВСТУПЛЕНИЕ В ПАТИ************************
//******************************ПРИ УСЛОВИИ ЧТО ПАТИ ДАЕТ- КОМАНДИР************************
if FromServer and (ConnectName=NameBot1) and (pck[1]=#$39) then
if ReadS(2)=NameKom then
begin
buf:=hstr('2A 01 00 00 00');
sendtoserverex(NameBot1);
end;

if FromServer and (ConnectName=NameBot2) and (pck[1]=#$39) then
if ReadS(2)=NameKom then
begin
buf:=hstr('2A 01 00 00 00');
sendtoserverex(NameBot2);
end;

//******************************БЛОК ДЛЯ ЗАПОМИНАНИЯ ИДЕШНИКОВ БОТОВ***********************
//******************************ОТЛАВЛИВАЕМ Я1 Я2 Я3***************************************
if FromServer and (ConnectName=NameKom) and (pck[1]=#$4A) then
begin
i:=10;
tempS:=readS(i);

if tempS=NameKom then
begin
tempS:=ReadS(i);
if tempS='я1' then
begin
IDKomandos:=pck[2]+pck[3]+pck[4]+pck[5];
end;
end;
end;

if FromServer and (ConnectName=NameBot1) and (pck[1]=#$4A) then
begin
i:=10;
tempS:=readS(i);
if tempS=NameBot1 then
begin
tempS:=ReadS(i);
if tempS='я2' then
begin
IDBot1:=pck[2]+pck[3]+pck[4]+pck[5];
end;
end;
end;

if FromServer and (ConnectName=NameBot2) and (pck[1]=#$4A) then
begin
i:=10;
tempS:=readS(i);
if tempS=NameBot2 then
begin
tempS:=ReadS(i);
if tempS='я3' then
begin
IDBot2:=pck[2]+pck[3]+pck[4]+pck[5];
end;
end;
end;
//*******************ЗАХВАТ КООРДИНАТ***************************************** **********
//если принят пакет от клиента с кординатами бота то
if FromClient and (ConnectName=NameBot1) 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=NameBot2) 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;

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

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

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

//*************************УЗНАЕМ ЛИМИТЫ ХП и МП***********************************************
//из пакета UserInfo который приходит во время бафа и не только

//КОМАНДИР
if FromServer and (pck[1]=#$04) and (ConnectName = NameKom) then
begin
i:=22;
tempS:=readS(i);
i:=i+48;
MaxHPKom:=readD(i);
CurHPKOM:=readD(i);
MaxMPKom:=readD(i);
CurMPKOM:=readD(i);
end;

//1-й бот
if FromServer and (pck[1]=#$04) and (ConnectName = NameBot1) then
begin
i:=22;
tempS:=readS(i);
i:=i+48;
MaxHPBot1:=readD(i);
CurHPBot1:=readD(i);
MaxMPBot1:=readD(i);
CurMPBot1:=readD(i);
end;

//2-й бот
if FromServer and (pck[1]=#$04) and (ConnectName = NameBot2) then
begin
i:=22;
tempS:=readS(i);
i:=i+48;
MaxHPBot2:=readD(i);
CurHPBot2:=readD(i);
MaxMPBot2:=readD(i);
CurMPBot2:=readD(i);
end;

//*************************СЛЕДИМ ЗА ХП и МП******************************************
//следим за ХП КОМАНДИРА
if FromServer and (pck[1]=#$0e) and (ConnectName = NameKom) then
if (pck[2] + pck[3] + pck[4] + pck[5] = IDKomandos) and (pck[6]=#$04) then
begin
CurHPKom:=(ord(pck[15]) * 256 + ord(pck[14]));

if (CurHPKom < round(MaxHPKom*0.6)) then
if (tick1 = 1) then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
SendToServerEX(NameBot1);
delay(500);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
end;

if (CurHPKom < round(MaxHPKom*0.8)) then
if (tick2 = 1) then
begin
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
SendToServerEX(NameBot2);
delay(500);
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
end;

end;

//следим за МП КОМАНДИРА
if FromServer and (pck[1]=#$0e) and (ConnectName = NameKom) then
if (pck[2] + pck[3] + pck[4] + pck[5] = IDKomandos) and (pck[6]=#$02) then
begin
CurMPKom:=(ord(pck[15]) * 256 + ord(pck[14]));

RND:=round(random*100);

if (CurMPKom < round(MaxMPKom*0.8)) and (rnd<15) then
if (tick1 = 1) then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F F5 03 00 00 00 00 00 00 00');
SendToServerEX(NameBot1);
delay(500);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
end;
end;


//следим за ХП у БОТ1
if FromServer and (pck[1]=#$0e) and (ConnectName = NameBot1) then
if (pck[2] + pck[3] + pck[4] + pck[5] = IDbot1) and (pck[6]=#$04) then
begin
CurHPbot1:=(ord(pck[15]) * 256 + ord(pck[14]));

if (CurHPbot1 < round(MaxHPBot1*0.8)) then
if (tick1 = 1) then
begin
buf:=hstr('04') + IDbot1 + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
SendToServerEX(NameBot1);
delay(500);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
end;

if (CurHPbot1 < round(MaxHPBot1*0.6)) then
if (tick1 = 1) then
begin
buf:=hstr('04') + IDbot1 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
SendToServerEX(NameBot2);
delay(500);
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
end;

end;

//следим за ХП у БОТ2
if FromServer and (pck[1]=#$0e) and (ConnectName = NameBot2) then
if (pck[2] + pck[3] + pck[4] + pck[5] = IDbot2) and (pck[6]=#$04) then
begin
CurHPbot2:=(ord(pck[15]) * 256 + ord(pck[14]));

if (CurHPbot2 < round(MaxHPBot2*0.8)) then
if (tick2 = 1) then
begin
buf:=hstr('04') + IDbot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
SendToServerEX(NameBot2);
delay(500);
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
end;

if (CurHPbot2 < round(MaxHPBot2*0.6)) then
if (tick2 = 1) then
begin
buf:=hstr('04') + IDbot2 + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
SendToServerEX(NameBot1);
delay(500);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
end;

end;

//**************************УПРАВЛЕНИЕ************** **********************************
//ПОКЛОН- БЕЖАТЬ за КОМАНДИРОМ
if FromClient and (ConnectName=NameKom) and (pck=hstr('1B 07 00 00 00')) then
begin
pck:='';
BotBeg;
exit;
end;

//ПРИВЕТСТВИЕ- БАФ ПЕРВЫМ БОТОМ (первая кнопка)
if FromClient and (ConnectName=NameKom) and (pck=hstr('1B 02 00 00 00')) then
begin
pck:='';
timer1.enabled:=true;
exit;
end;

//ГРИИТЕРИНГ - ПОБЕДА - баф ПП (вторая кнопка)
if FromClient and (ConnectName=NameKom) and (pck=hstr('1B 03 00 00 00')) then
begin
pck:='';
timer2.enabled:=true;
exit;
end;

//ADVANCE- В АТАКУ - пати быстрое создание (3-я кнопка)
if FromClient and (ConnectName=NameKom) and (pck=hstr('1B 04 00 00 00')) then
begin
pck:='';
//сразу рвем пати у всех чаров и командир раздает пати поновому
//чары автоматически принимают пати
//используется таймер т.к. одновременно 2-м чарам пати кинуть нельзя
timer3.enabled:=true;
exit;
end;



end.


тут применяется статус апдейт для контроля ХП и МП в% от шкалы

mks
17.01.2008, 13:43
VORON
ну если б ты поюзал сам скрипт лечащий по %, то понял бы: еще один пример:
допустим ты поставил хил при 50%, у дестра это 5к ХП, у темных около 2к, ну вот у дестра сняли допустим до 3к, а у темного сняли до 1.5к, скрипт будет хилять дестра, а темный сдохнет, я ж говорю у самого сначала стоял хил по %, меня это не устроило

VORON
17.01.2008, 13:59
приоритет хила очень просто реализовать- кодом.. чтоб смотреть каму хил нужнее..
заливка ХП фиксированным числом- нерешает задачу..

mks
17.01.2008, 14:07
VORON
у меня приоритет хила работает так: вычисляется у кого из пати меньше всего ХП(не в процентах), сравнивается с указаным минимумом, если меньше хилит, при таком расскладе бот ведет себя очень даже адекватно, - никто не умирает, и МП у бота рассходуется в разумных пределах

NLObP
17.01.2008, 18:53
NLObP, плиз скажи где брал исходники сервака, я искал там порядок тату был другой. Там было с INT, а игра передаёт начиная с STR, я сначала не понимал че не так. :)
Брал здесь (http://trac.balancer.ru/svn/l2j/trunk/). Только они давно не обновлялись. Лучше всего поискать на _www.l2jserver.com здесь (http://www.l2jserver.com/trac/browser/trunk)

VORON
18.01.2008, 02:49
ЦИТАТА:
"
у меня приоритет хила работает так: вычисляется у кого из пати меньше всего ХП(не в процентах), сравнивается с указаным минимумом, если меньше хилит,
"
а как начет того кому нужнее??? твои логи не решает задачи.. лить нужно таму каму- нужнее.. как их отличить? кто из них нужней???
ты сказал что:"
у меня приоритет хила работает так: вычисляется у кого из пати меньше всего ХП(не в процентах), сравнивается с указаным минимумом, если меньше хилит
"
я тебя отлично понимаю за то что ты говариш но.. не лучшели сделать дополнительную проверку????
КАМУ НУЖНЕЕ?? дестроеру или ШЕ- причем у обоих- 50% шкалы... так вот .. ето уже тонкости.. каждый сам для себя решает ково хилить надо... но в скрипте ето надо учитывать а не просто так на шару хилять дестра..

QaK
18.01.2008, 08:34
Блин, вы еще подеритесь, по поводу приоритета хила :x , по-моему каждый ставит его так, как именно ему надо, кто по профам, кто по процетну, кто по текущему значению ХП :friends: .

mks
18.01.2008, 10:57
тогда предлогаю что б скрипт следил за таргетами противника(запоминал кто из пати находится в таргете противника), выяснял класс противника(воен/маг) и выставлял окончательный преоритет операясь на кол-во м.деф/п.деф членов пати и возможной атаки(физической/магической) находящихся в таргете членов пати примерно предпологая потенциально нанесенный урон, вот тогда будет всем хилам хил, но пока меня устраивает мой вариант)

VORON
18.01.2008, 18:11
жэсть-)) спс за пост-))... впринципе- немного подумав мы ето можем реализовать скриптом.... и тогда будет всем хилам - хил-))

QaK
19.01.2008, 09:27
тогда предлогаю что б скрипт следил за таргетами противника(запоминал кто из пати находится в таргете противника), выяснял класс противника(воен/маг) и выставлял окончательный преоритет операясь на кол-во м.деф/п.деф членов пати и возможной атаки(физической/магической) находящихся в таргете членов пати примерно предпологая потенциально нанесенный урон, вот тогда будет всем хилам хил, но пока меня устраивает мой вариант)
:Bravo: Мдаа, мегаидея =) респект!

boyan
21.01.2008, 10:46
народ.. не могу что-то понять, в чом косяк.. запуская скрипт, ем банки последовательно, какие надо.. и через некоторое время, скрипт начинает автоматом есть ГЦП банки.. количество ЦП у перса не изменяется..
Самое обидное, что пробывал на бафере(свс) на арене мдт - все отлично было.. собрался мэйном неверных побегать пострелять - такой вот косяк выходит.. а в чом дело - понять не могу..
const
Name='тут_ник'; //ник перса
var
CurHP,MaxHP,CurCP,MaxCP,CurMP,MaxMp: integer;
CPuse,CPuses,HPuse,MPuse: string;

TimerCP,TimerCPs,TimerHP,TimerMP: TTimer;

procedure Init; //Вызывается при включении скрипта
begin
TimerCP:=TTimer.Create(nil);
TimerCP.OnTimer:=@OnTimerCP;
TimerCP.enabled:=false;
TimerCP.interval:=500; //интервал юзания ГЦП банки

TimerCPs:=TTimer.Create(nil);
TimerCPs.OnTimer:=@OnTimerCPs;
TimerCPs.enabled:=false;
TimerCPs.interval:=500; //интервал юзания ЦП банки

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

TimerMP:=TTimer.Create(nil);
TimerMP.OnTimer:=@OnTimerMP;
TimerMP.enabled:=false;
TimerMP.interval:=500; //интервал юзания МП банки
end;

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

procedure OnTimerCPs(Sender: TObject);
begin
buf:=CPuses;
SendToServerEx(Name);
end;

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

procedure OnTimerMP(Sender: TObject);
begin
buf:=MPuse;
SendToServerEx(Name);
end;

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

procedure StatsUpdate;
var
i: integer;
begin
for i:=0 to ReadD(6)-1 do
case pck[i*8+10] of
#$09: CurHP:=ReadD(i*8+14);
#$0A: MaxHP:=ReadD(i*8+14);
#$0B: CurMP:=ReadD(i*8+14);
#$0C: MaxMP:=ReadD(i*8+14);
#$21: CurCP:=ReadD(i*8+14);
#$22: MaxCP:=ReadD(i*8+14);
end;
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 (CPuses='') then CPuses:=pck;
if FromClient and (ConnectName=Name) and (pck[1]=#$14) and (CPuses<>pck) and (HPuse='') then HPuse:=pck;
if FromClient and (ConnectName=Name) and (pck[1]=#$14) and (HPuse<>pck) and (MPuse='') then MPuse:=pck;

if FromServer and (pck[1]=#$0E) and (ConnectName = Name) //считываем значения ЦП, ХП, МП максимальные и на данный момент.
then StatsUpdate;

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

QaK
21.01.2008, 10:56
скрипт начинает автоматом есть ГЦП банки..
В смысле через некоторое время? В то время когда ЦП уменьшается, или просто через интервал, без всякой причины?количество ЦП у перса не изменяется..

Т.е. банки хаваются, (из инвентаря исчезают) а цп у перса не восстанавливается?

Добавлено спустя 20 секунд:
Опиши плз поподробнее

mks
21.01.2008, 11:42
boyan
у тебя косяки в присваивании пакетов использования цп хп и тп)
поменяй этот кусок

//пьем сначала Г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 (CPuses='') then CPuses:=pck;
if FromClient and (ConnectName=Name) and (pck[1]=#$14) and (CPuses<>pck) and (HPuse='') then HPuse:=pck;
if FromClient and (ConnectName=Name) and (pck[1]=#$14) and (HPuse<>pck) and (MPuse='') then MPuse:=pck;

на

if FromClient and (count<4) and (ConnectName=Name) and (pck[1]=#$14) then
begin
count:=count+1;
case count of
1: CPuse:=pck;
2: CPuses:=pck;
3: HPuse:=pck;
4: MPuse:=pck;
end;
end;

и все будет в шоколаде

QaK
21.01.2008, 12:52
СТАТУС ПАДЕЙТ!
Ток щас заметил - Статус Падейт - прикольная очепятка =)

keyn
21.01.2008, 14:48
MKS, мне кажется очень много вопросов у людей связано с бональными вещам.. которые получаются изза того что нет удобного интерфейса для мониторинга значений переменных в режиме онлайн... люди в слепую тычатся.. поетой причине дам кусочек кода который на стадии разработки скрипта нужно в скрипт добавить и с его помощью отоброжать значения переменных на екране...
var
frm:Tform;

memo:Tmemo;

procedure Init; //Вызывается при включении скрипта
begin
frm := TForm.Create(nil);
frm.Caption := 'Chat';
frm.BorderStyle := bsSizeable;
frm.Position := poScreencenter;
frm.Width:=600;
frm.Height:=700;
frm.FormStyle:=FsStayOnTop;
frm.Show;

memo :=TMemo.create(nil);
memo.parent:=frm;
memo.align:=alClient;

end;

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

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

if FromClient then
begin

memo.Lines.Add('сюда пишем всё что хотим и видемето на екране екране, например:'+inttostr(12345));

end;
end.

VORON - Респект за эту тему, мдя вообще в шоколаде все стало - очень удобно скрипты писать - Все косяки очень быстро можно отследить и принять меры. :good:

boyan
21.01.2008, 16:07
скрипт начинает автоматом есть ГЦП банки..
В смысле через некоторое время? В то время когда ЦП уменьшается, или просто через интервал, без всякой причины?количество ЦП у перса не изменяется..

Т.е. банки хаваются, (из инвентаря исчезают) а цп у перса не восстанавливается?

Добавлено спустя 20 секунд:
Опиши плз поподробнее
т.е. захожу в игру, включаю скрипт, кушаю банки.. и например сажусь и ничего не делаю.. хп, мп, цп полные..
через пол минуты - минуту скрипт начинает кушать банки цп.. с интервалом пол секунды.. и не останавливается пока скрипт не выключиш/не кончатся банки..

QaK
21.01.2008, 16:20
boyan, попробуй отмониторить значения ХП,МП,ЦП, которые скрипт считывает (заготовка Кейна 2 поста выше), может неправильно определяются значения МП,ХП,ЦИ текущие и максимальные...

mks
21.01.2008, 16:57
boyan

if FromServer and (pck[1]=#$0E) and (ConnectName = Name) //считываем значения ЦП, ХП, МП максимальные и на данный момент.
then StatsUpdate;

а свой ID ты не проверяешь, вот он тебе и записывает в хп цп и мп параметры из всех пакетов 0E
тебе надо выдрать откуда-нидь свой ID и подправит здесь

if FromServer and (pck[1]=#$0E) and (ConnectName = Name) and (ReadD(2)=MyID) //считываем значения ЦП, ХП, МП максимальные и на данный момент.
then StatsUpdate;

boyan
22.01.2008, 11:53
boyan

if FromServer and (pck[1]=#$0E) and (ConnectName = Name) //считываем значения ЦП, ХП, МП максимальные и на данный момент.
then StatsUpdate;

а свой ID ты не проверяешь, вот он тебе и записывает в хп цп и мп параметры из всех пакетов 0E
тебе надо выдрать откуда-нидь свой ID и подправит здесь

if FromServer and (pck[1]=#$0E) and (ConnectName = Name) and (ReadD(2)=MyID) //считываем значения ЦП, ХП, МП максимальные и на данный момент.
then StatsUpdate;

Хорошо, выдеру.. скажите как =)

Rubec
23.01.2008, 15:52
Народ есть идейка но незнаю осуществима она или нет при помощи пакетхака.
Суть такова чтобы использовать скрипт для логаута во время опасности допустим из режима боя.
Это можно сделать путем отсылки пакета на вход того же аккаунта два раза и тогда того чара который был онлайн выбивает из клиента и он сразу выходит не дожидаясь выхода из режима боя при простом дисконекте такого нет. Информация не проверена поэтому если есть предложения или возражения по этому поводу прошу писать :)

boyan
23.01.2008, 15:58
Если найти пакет, который позволяет сделать форс логаут, то сделать это эллементарно.. ловим пакет от клиента(социальные действия например), заменяем на *нежный нам пакет* и шлем серверу..

Rubec
23.01.2008, 16:30
в том то и дело что как найти пакет форс логаут?

VORON
23.01.2008, 20:28
не забывайте про 1 весч.. все пакеты идут в зашифрованном виде- ключ динамически меняется с каждым пакетом.. пакетхак применяет стандартный алгоритм шифрации и каждый раз внедряясь в трафик помнит 4 ключа в памяти 2- ВХОД/ВЫХОД для клиента, 2- ВХОД/ВЫХОД для сервера.. трафик проходя черех пакетхак раскодируется одним ключем и закодируется другим.. таким образом синхронизация ключа между клиентом и сервером- не нарушается.. если втайне от клиента сделать релог на серваке то ключ моментально- рассинхронизируется.. и вылет с критом обеспечен..

Rubec
23.01.2008, 23:59
Да на критикал по большому счету наплевать лишь бы в нужной ситуации можно было моментально исчезнуть из мира и не быть растерзаным врагами, пригодится когда ПК вдруг стал в толпе врагов неудачно выделив цель или когда на 77 лвл вдруг мобы несклолько штук подцепил еще и стан поймал вообщем тема актуальна и критикал тут уже как побочный эффект но лучше перегрузить окно чем вкушать плоды вышеуказанного и не только ))

24.01.2008, 00:27
boyan, попробуй отмониторить значения ХП,МП,ЦП, которые скрипт считывает (заготовка Кейна 2 поста выше), может неправильно определяются значения МП,ХП,ЦИ текущие и максимальные...
отмониторил.. бывает так что считывает не мое.. из какого пакета и как выдрать, подскажите плз.. ваще не секу.. =(

VORON
24.01.2008, 01:23
Да на критикал по большому счету наплевать лишь бы в нужной ситуации можно было моментально исчезнуть из мира и не быть растерзаным врагами, пригодится когда ПК вдруг стал в толпе врагов неудачно выделив цель или когда на 77 лвл вдруг мобы несклолько штук подцепил еще и стан поймал вообщем тема актуальна и критикал тут уже как побочный эффект но лучше перегрузить окно чем вкушать плоды вышеуказанного и не только ))
запросто-))
читая топ "ПАКЕТЫ" из соттветствующего раздела- я убежден в том что такие пакеты- есть, и причем их очень много!-)) например попробуй на страйдере покататься, неимея онного-)) моментальный дисконект.. правда бан будет или нет- ето вопрос.. но суть такова что нужно полную лабуду отправить серваку.. сервак ее несможэт переварить и моментальный дисконект... тока тестируй ето на отдельном акаунте .. иногда за такое- автобан бывает- но чаще- всё нормально..

Добавлено спустя 2 минуты 24 секунды:
попробуй сервак NETPINGOM пропинговать с неизвестным содержимым раза 3-4 подряд...

Rubec
24.01.2008, 11:10
Баян вот так выдрать ИД свой
if FromServer and (pck[1]=#$04) and (ReadS(22)=NameKomandos) then
begin
IDKomandos:=pck[18] + pck[19] + pck[20] + pck[21];

end;

Добавлено спустя 20 минут 13 секунд:
запросто-))
читая топ "ПАКЕТЫ" из соттветствующего раздела- я убежден в том что такие пакеты- есть, и причем их очень много!-)) например попробуй на страйдере покататься, неимея онного-)) моментальный дисконект.. правда бан будет или нет- ето вопрос.. но суть такова что нужно полную лабуду отправить серваку.. сервак ее несможэт переварить и моментальный дисконект... тока тестируй ето на отдельном акаунте .. иногда за такое- автобан бывает- но чаще- всё нормально.

Дело в том что клиент то вырубится а вот исчезнет ли чар из игрового мира моментально тут вопрос ?

VORON
24.01.2008, 13:06
если ты видиш табличку (вы были отсоеденены от сервера) значит тебя там уже нет.. за исключением ситуации с обрывом линии связи..

Добавлено спустя 13 минут 37 секунд:
свой ИД можно выдрать многими разными способами..
1. при старте скрипта скрипт отправит в чат сообщение с фиксированным содержанием.. и в скрипте будет кусок который реагирует на ето содержание с условием что ИМЯ- совпадает с заданным именем (в пакете от сервера с соббщением в чат) оттуда скрипт получит ИД..
2. при старте скрипта автоматически сделать СОЦИАЛЬНОЕ ДЕЙСТВИЕ- любое.. и в скрипте будет кусок который реагирует на него и получает ИД.. смысл таков что ты делаеш СОЦ ДЕЙСТВИЕ- и его видят- все.. в тожэ время и ты сам его видиш.. сервер дает пакет всем вокруг на визуализацию етого действия.. в етом пакете используется ИД чара и НОМЕР действия.. на него можно скриптом отреагировать и выдернуть ИД.. но ето тока 1 раз.. после успешного захвата ИД нужно сделать так чтоб больше не реагировать на ето действие..
3. привинтивный метод.. при старте скрипта скрипт будет ждать- ково ты первым выделиш.. в игре выделяеш сам себя- и скрипт запоминает ИД того ково ты выделил.. 1 раз тока.. потом уже небудет запоминать..

список далеко не полный.. милион способов для захвата своего ИД...

24.01.2008, 22:53
Баян вот так выдрать ИД свой
if FromServer and (pck[1]=#$04) and (ReadS(22)=NameKomandos) then
begin
IDKomandos:=pck[18] + pck[19] + pck[20] + pck[21];

end;

при вставке этого кода, ругается на pck[21] - не подходящий тип пишет.. =(

boyan
24.01.2008, 23:08
хм.. не тот тип поставил.. теперь при типе: стринг, в этом месте гуд

if FromServer and (pck[1]=#$0E) and (ReadS(22)=Name) then
begin
MyID:=pck[18] + pck[19] + pck[20] + pck[21];
end;
вот сдесь, (ReadS(22) - некорректно считавыет имя.. точнее не считывает совсем.. при мониторинге дает (ReadS(22)='?'.

NLObP
25.01.2008, 00:06
Нет в этом пакете строковых данных. Ты что-то перепутал.
s0E=StatusUpdate:h(ObjectID)d(AttribCount)d(AttrID )d(AttrValue)
Такие данные есть в пакете
s04=UserInfo:d(X)d(Y)d(Z)d(Heading)h(ObjectID)s(Na me)d(Race)d(Sex)h(ClassID)d(Level)f(Exp)d(STR)d(DE X)d(CON)d(INT)d(WIT)d(MEN)d(MaxHP)d(CurHP)d(MaxMP) d(CurMP)d(SP)d(CurLoad)d(MaxLoad)d(d)d(DHair)d(Rea r)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(L RHand)d(Hair)i(DHair)i(Rear)i(Lear)i(Neck)i(RFinge r)i(LFinger)i(Head)i(RHand)i(LHand)i(Gloves)i(Ches t)i(Legs)i(Feet)i(Back)i(LRHand)i(Hair)d(Patk)d(Pa spd)d(Pdef)d(evasion)d(accur)d(crithit)d(Matk)d(Ma spd)d(Paspd)d(Mdef)d(PvpFlag)d(Karma)d(runSpd)d(wa lkSpd)d(swimRSpd)d(swimWSpd)d(flRSpd)d(flWSpd)d(fl yRSpd)d(flyWSpd)f(MoveMul)f(aspdMul)f(collisRadius )f(collisHeight)d(HairStyle)d(HairColor)d(Face)d(A ccessLvl)s(Title)d(clanID)d(clanCrestId)d(AllyID)d (AllyCrestId)d(ClanLeader)b(Mount)b(shop)b(DwarfCr aft)d(PKkills)d(PVPkills)w(cubics)w(cubID)b(findpa rty)d(abnEffects)b(c)d(clanPrivil)w(RecomLeft)w(Re comHave)d(d)w(InventLimit)h(ClassID)d(sEff)d(maxCP )d(curCP)b(Mount)b(Team)d(clanBigCrestId)b(Noble)b (Hero)b(Fishing)d(fishX)d(fishY)d(fishZ)d(NameColo r)b(isRun)d(FaceID)i(Face)d(PledgeClass)d(d)d(Titl eColor)d(Cursed)
0

Rubec
25.01.2008, 11:11
Я не знаю де он 0Е взял )) у меня 04 написано

Добавлено спустя 1 минуту 3 секунды:
и это для Ц4

mks
25.01.2008, 11:59
хм.. не тот тип поставил.. теперь при типе: стринг, в этом месте гуд


Код: Выделить всё
if FromServer and (pck[1]=#$0E) and (ReadS(22)=Name) then
begin
MyID:=pck[18] + pck[19] + pck[20] + pck[21];
end;
вот сдесь, (ReadS(22) - некорректно считавыет имя.. точнее не считывает совсем.. при мониторинге дает (ReadS(22)='?'.
да народ не надо путать попу с пальцем
все считывается корректно, естественно при таком присвоении MyID надо ставить стринг, а что б получить интегер напиши вместо
MyID:=pck[18] + pck[19] + pck[20] + pck[21];
MyID:=ReadD(18);

VORON
25.01.2008, 12:25
Boyan1, целая страница топа посвещена тому чтоб тебе объяснить как свое ХП и МП и ИД считать.. хотя на первой странице в готовых скриптах ето уже милион раз сделано разными способами..
давай я тебе покажу если тебе лень разбираться:
возьмём для примера скрипт:

var
Bot1X,Bot1Y,Bot1Z,Bot2X,Bot2Y,Bot2Z:string;
IDAssistTarget:string;
rnd:integer;

bafSE: array [1..100] of string;
bafPP: array [1..100] of string;
BafSEApplyChar: array [1..100] of string;
BafSEApplyBaf: array [1..100] of string;
BafPPApplyChar: array [1..100] of string;
BafPPApplyBaf: array [1..100] of string;

NameKom,NameBot1,NameBot2:string;

MaxHPKom,MaxHPBot1,MaxHPBot2:integer;
MaxMPKom,MaxMPBot1,MaxMPBot2:integer;

CurHPKom,CurMPKom,CurHPbot1,CurMPbot1,CurHPbot2,Cu rMPbot2:integer;

IDKomandos,IDbot1,IDbot2:string;
ChekIdKom,ChekIdBot1,ChekIdBot2:boolean;

timer1: TTimer; //баф БОТ1
timer2: TTimer; //баф БОТ2
timer3: TTimer; //для создания пати
tick1,tick2,tick3:integer;

i:integer;
tempD:integer;
tempS:String;

//*********************БУФ ШЕ************************************************ ******************
procedure OnTimer1(Sender: TObject);
begin
bafSE[1]:=hstr('2F 2C 04 00 00 00 00 00 00 00'); //па
bafSE[2]:=hstr('2F 10 04 00 00 00 00 00 00 00'); //пд
bafSE[3]:=hstr('2F 35 04 00 00 00 00 00 00 00'); //фокус
bafSE[4]:=hstr('2F B4 04 00 00 00 00 00 00 00'); //вв
bafSE[5]:=hstr('2F 0B 04 00 00 00 00 00 00 00'); //ментал
bafSE[6]:=hstr('2F A5 04 00 00 00 00 00 00 00'); //резист к ветру
bafSE[7]:=hstr('2F D8 04 00 00 00 00 00 00 00'); //гвиданс-акураси
bafSE[8]:=hstr('2F DA 04 00 00 00 00 00 00 00'); //деф виспер- сила крита
bafSE[9]:=hstr('2F 36 04 00 00 00 00 00 00 00'); //кон
bafSE[10]:=hstr('2F 23 04 00 00 00 00 00 00 00'); //емповер
bafSE[11]:=hstr('2F F4 04 00 00 00 00 00 00 00'); //вамп
bafSE[12]:=hstr('2F 70 05 00 00 00 00 00 00 00'); //скаред атак реезист

BafSEApplyChar[1]:=IDKomandos;
BafSEApplyBaf[1]:=bafSE[1];
BafSEApplyChar[2]:=IDKomandos;
BafSEApplyBaf[2]:=bafSE[2];
BafSEApplyChar[3]:=IDKomandos;
BafSEApplyBaf[3]:=bafSE[3];
BafSEApplyChar[4]:=IDKomandos;
BafSEApplyBaf[4]:=bafSE[8];
BafSEApplyChar[5]:=IDKomandos;
BafSEApplyBaf[5]:=bafSE[4];
BafSEApplyChar[6]:=IDKomandos;
BafSEApplyBaf[6]:=bafSE[7];
BafSEApplyChar[7]:=IDKomandos;
BafSEApplyBaf[7]:=bafSE[5];
BafSEApplyChar[8]:=IDKomandos;
BafSEApplyBaf[8]:=bafSE[6];

BafSEApplyChar[9]:=IDBot1;
BafSEApplyBaf[9]:=bafSE[2];
BafSEApplyChar[10]:=IDBot1;
BafSEApplyBaf[10]:=bafSE[9];
BafSEApplyChar[11]:=IDBot1;
BafSEApplyBaf[11]:=bafSE[4];
BafSEApplyChar[12]:=IDBot1;
BafSEApplyBaf[12]:=bafSE[5];
BafSEApplyChar[13]:=IDBot1;
BafSEApplyBaf[13]:=bafSE[6];
BafSEApplyChar[14]:=IDBot1;
BafSEApplyBaf[14]:=bafSE[10];
BafSEApplyChar[15]:=IDBot1;
BafSEApplyBaf[15]:=bafSE[12];

BafSEApplyChar[16]:=IDBot2;
BafSEApplyBaf[16]:=bafSE[10];

buf:=hstr('04') + BafSEApplyChar[tick1] + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);

buf:=BafSEApplyBaf[tick1];
SendToServerEX(NameBot1);


tick1:=tick1+1;

if tick1=17 then
begin
tick1:=1;
timer1.enabled:=false;
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
end;
end;

//*********************БУФ ПП************************************************ ******************
procedure OnTimer2(Sender: TObject);
begin
//список бафов:
bafPP[1]:=hstr('2F 0B 04 00 00 00 00 00 00 00'); //ментал
bafPP[2]:=hstr('2F 10 04 00 00 00 00 00 00 00'); // щит
bafPP[3]:=hstr('2F 2C 04 00 00 00 00 00 00 00'); // па
bafPP[4]:=hstr('2F 35 04 00 00 00 00 00 00 00'); // фокус
bafPP[5]:=hstr('2F 36 04 00 00 00 00 00 00 00'); // кон
bafPP[6]:=hstr('2F 3D 04 00 00 00 00 00 00 00'); // акумен
bafPP[7]:=hstr('2F A7 04 00 00 00 00 00 00 00'); // резист к огню
bafPP[8]:=hstr('2F B4 04 00 00 00 00 00 00 00'); // вв
bafPP[9]:=hstr('2F 26 04 00 00 00 00 00 00 00'); // берс
bafPP[10]:=hstr('2F 14 04 00 00 00 00 00 00 00'); // ХП реген
bafPP[12]:=hstr('2F 3E 04 00 00 00 00 00 00 00'); // хаст
bafPP[13]:=hstr('2F 15 04 00 00 00 00 00 00 00'); // блесс ХП
bafPP[14]:=hstr('2F 0C 04 00 00 00 00 00 00 00'); // маджик барьер
bafPP[15]:=hstr('2F 6C 05 00 00 00 00 00 00 00'); // гритер ПА
bafPP[16]:=hstr('2F 6D 05 00 00 00 00 00 00 00'); // гритер ПД
bafPP[17]:=hstr('2F 70 05 00 00 00 00 00 00 00'); // скаред атак резист
bafPP[18]:=hstr('2F 71 05 00 00 00 00 00 00 00'); // дарк атак резист
bafPP[19]:=hstr('2F A5 04 00 00 00 00 00 00 00'); // резист к ветру


BafPPApplyChar[1]:=IDKomandos;
BafPPApplyBaf[1]:=bafPP[6];
BafPPApplyChar[2]:=IDKomandos;
BafPPApplyBaf[2]:=bafPP[7];
BafPPApplyChar[3]:=IDKomandos;
BafPPApplyBaf[3]:=bafPP[9];
BafPPApplyChar[4]:=IDKomandos;
BafPPApplyBaf[4]:=bafPP[10]; //
BafPPApplyChar[5]:=IDKomandos;
BafPPApplyBaf[5]:=bafPP[12];
BafPPApplyChar[6]:=IDKomandos;
BafPPApplyBaf[6]:=bafPP[13];
BafPPApplyChar[7]:=IDKomandos;
BafPPApplyBaf[7]:=bafPP[14];
BafPPApplyChar[8]:=IDKomandos;
BafPPApplyBaf[8]:=bafPP[15];
BafPPApplyChar[9]:=IDKomandos;
BafPPApplyBaf[9]:=bafPP[18];

BafPPApplyChar[10]:=IDBot2;
BafPPApplyBaf[10]:=bafPP[1];
BafPPApplyChar[11]:=IDBot2;
BafPPApplyBaf[11]:=bafPP[2];
BafPPApplyChar[12]:=IDBot2;
BafPPApplyBaf[12]:=bafPP[5];
BafPPApplyChar[13]:=IDBot2;
BafPPApplyBaf[13]:=bafPP[6];
BafPPApplyChar[14]:=IDBot2;
BafPPApplyBaf[14]:=bafPP[7];
BafPPApplyChar[15]:=IDBot2;
BafPPApplyBaf[15]:=bafPP[8];
BafPPApplyChar[16]:=IDBot2;
BafPPApplyBaf[16]:=bafPP[13];
BafPPApplyChar[17]:=IDBot2;
BafPPApplyBaf[17]:=bafPP[14];
BafPPApplyChar[18]:=IDBot2;
BafPPApplyBaf[18]:=bafPP[16];
BafPPApplyChar[19]:=IDBot2;
BafPPApplyBaf[19]:=bafPP[17];
BafPPApplyChar[20]:=IDBot2;
BafPPApplyBaf[20]:=bafPP[18];
BafPPApplyChar[21]:=IDBot2;
BafPPApplyBaf[21]:=bafPP[19];

BafPPApplyChar[22]:=IDBot1;
BafPPApplyBaf[22]:=bafPP[6];
BafPPApplyChar[23]:=IDBot1;
BafPPApplyBaf[23]:=bafPP[7];
BafPPApplyChar[24]:=IDBot1;
BafPPApplyBaf[24]:=bafPP[13];
BafPPApplyChar[25]:=IDBot1;
BafPPApplyBaf[25]:=bafPP[14];
BafPPApplyChar[26]:=IDBot1;
BafPPApplyBaf[26]:=bafPP[16];
BafPPApplyChar[27]:=IDBot1;
BafPPApplyBaf[27]:=bafPP[18];


buf:=hstr('04') + BafPPApplyChar[tick2] + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot2);

buf:=BafPPApplyBaf[tick2];
SendToServerEX(NameBot2);

tick2:=tick2+1;

if tick2=28 then
begin
tick2:=1;
timer2.enabled:=false;
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot2);
end;
end;

//****************************РАЗДАЧА ПРИГЛАШЕНИЙ НА ВСТУПЛЕНИЕ В ПАТИ*******************
//*********************А ТАКЖЕ ПОСЫЛКА ТЕКСТА Я1 Я2 Я3 для захвата ИДешников************
procedure OnTimer3(Sender: TObject);
begin

if tick3 = 1 then
begin
buf:=hstr('2B');
SendToServerEX(NameKom);
SendToServerEX(NameBot1);
SendToServerEX(NameBot2);
end;

if tick3 = 2 then
begin
buf:=hstr('29');
writeS(namebot1);
buf:=buf + hstr('00 00 00 00');
SendToServerEX(NameKom);
end;

if tick3 = 3 then
begin
buf:=hstr('29');
writeS(namebot2);
buf:=buf + hstr('00 00 00 00');
SendToServerEX(NameKom);
end;

if tick3 = 4 then
//if (IDKomandos = '') or (IDBot1 = '') or (IDBot2 = '') then
begin
buf:=hstr('38');
writes('я1');
buf:=buf + hstr('03 00 00 00'); ///9- али // 3-пати // 01 - общий
sendtoserverex(NameKom);

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

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

tick3:=tick3+1;

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

end;

//*************************БЕЖИМ ЗА ЛИДЕРОМ*******************************************
//процедура заставляет бежать ботов за лидером
procedure BotBeg;
begin
//проверяем условие чтоб координаты ботов небыли равными '' и ИД был перехвачен
if IDKomandos <> '' then
begin
//выделяем командира, эмулируя щелчек мыши
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
//бежим за командиром эмулируя повторный щелчек мыши по таргету
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);

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


procedure Init; //Вызывается при включении скрипта
begin
NameKom:='VORON7';
NameBot1:='Volya';
NameBot2:='MasterBuf';

CurHPKom:=15000;
CurHPBot1:=15000;
CurHPBot2:=15000;

CurMPKom:=15000;
CurMPBot1:=15000;
CurMPBot2:=15000;

MaxHPKom:=10;
MaxHPBot1:=10;
MaxHPBot2:=10;

ChekIDKom:=false;
ChekIDBot1:=false;
ChekIDBot2:=false;

tick1:=1;
tick2:=1;
tick3:=1;

timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer1; //
timer1.enabled:=false; //
timer1.interval:=4000;

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:=1000;

end;

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

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

//******************************АВТОСОГЛАШЕНИЕ НА ВСТУПЛЕНИЕ В ПАТИ************************
//******************************ПРИ УСЛОВИИ ЧТО ПАТИ ДАЕТ- КОМАНДИР************************
if FromServer and (ConnectName=NameBot1) and (pck[1]=#$39) then
if ReadS(2)=NameKom then
begin
buf:=hstr('2A 01 00 00 00');
sendtoserverex(NameBot1);
end;

if FromServer and (ConnectName=NameBot2) and (pck[1]=#$39) then
if ReadS(2)=NameKom then
begin
buf:=hstr('2A 01 00 00 00');
sendtoserverex(NameBot2);
end;

//******************************БЛОК ДЛЯ ЗАПОМИНАНИЯ ИДЕШНИКОВ БОТОВ***********************
//******************************ОТЛАВЛИВАЕМ Я1 Я2 Я3***************************************
if FromServer and (ConnectName=NameKom) and (pck[1]=#$4A) then
begin
i:=10;
tempS:=readS(i);

if tempS=NameKom then
begin
tempS:=ReadS(i);
if tempS='я1' then
begin
IDKomandos:=pck[2]+pck[3]+pck[4]+pck[5];
end;
end;
end;

if FromServer and (ConnectName=NameBot1) and (pck[1]=#$4A) then
begin
i:=10;
tempS:=readS(i);
if tempS=NameBot1 then
begin
tempS:=ReadS(i);
if tempS='я2' then
begin
IDBot1:=pck[2]+pck[3]+pck[4]+pck[5];
end;
end;
end;

if FromServer and (ConnectName=NameBot2) and (pck[1]=#$4A) then
begin
i:=10;
tempS:=readS(i);
if tempS=NameBot2 then
begin
tempS:=ReadS(i);
if tempS='я3' then
begin
IDBot2:=pck[2]+pck[3]+pck[4]+pck[5];
end;
end;
end;
//*******************ЗАХВАТ КООРДИНАТ***************************************** **********
//если принят пакет от клиента с кординатами бота то
if FromClient and (ConnectName=NameBot1) 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=NameBot2) 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;

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

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

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

//*************************УЗНАЕМ ЛИМИТЫ ХП и МП***********************************************
//из пакета UserInfo который приходит во время бафа и не только

//КОМАНДИР
if FromServer and (pck[1]=#$04) and (ConnectName = NameKom) then
begin
i:=22;
tempS:=readS(i);
i:=i+48;
MaxHPKom:=readD(i);
CurHPKOM:=readD(i);
MaxMPKom:=readD(i);
CurMPKOM:=readD(i);
end;

//1-й бот
if FromServer and (pck[1]=#$04) and (ConnectName = NameBot1) then
begin
i:=22;
tempS:=readS(i);
i:=i+48;
MaxHPBot1:=readD(i);
CurHPBot1:=readD(i);
MaxMPBot1:=readD(i);
CurMPBot1:=readD(i);
end;

//2-й бот
if FromServer and (pck[1]=#$04) and (ConnectName = NameBot2) then
begin
i:=22;
tempS:=readS(i);
i:=i+48;
MaxHPBot2:=readD(i);
CurHPBot2:=readD(i);
MaxMPBot2:=readD(i);
CurMPBot2:=readD(i);
end;

//*************************СЛЕДИМ ЗА ХП и МП******************************************
//следим за ХП КОМАНДИРА
if FromServer and (pck[1]=#$0e) and (ConnectName = NameKom) then
if (pck[2] + pck[3] + pck[4] + pck[5] = IDKomandos) and (pck[6]=#$04) then
begin
CurHPKom:=(ord(pck[15]) * 256 + ord(pck[14]));

if (CurHPKom < round(MaxHPKom*0.7)) then
if (tick1 = 1) then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F C1 04 00 00 00 00 00 00 00');
SendToServerEX(NameBot1);
delay(500);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
end;

if (CurHPKom < round(MaxHPKom*0.8)) then
if (tick2 = 1) then
begin
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
SendToServerEX(NameBot2);
delay(500);
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
end;

end;

//следим за МП КОМАНДИРА
if FromServer and (pck[1]=#$0e) and (ConnectName = NameKom) then
if (pck[2] + pck[3] + pck[4] + pck[5] = IDKomandos) and (pck[6]=#$02) then
begin
CurMPKom:=(ord(pck[15]) * 256 + ord(pck[14]));

RND:=round(random*100);

if (CurMPKom < round(MaxMPKom*0.8)) and (rnd<15) then
if (tick1 = 1) then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F F5 03 00 00 00 00 00 00 00');
SendToServerEX(NameBot1);
delay(500);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
end;
end;


//следим за ХП у БОТ1
if FromServer and (pck[1]=#$0e) and (ConnectName = NameBot1) then
if (pck[2] + pck[3] + pck[4] + pck[5] = IDbot1) and (pck[6]=#$04) then
begin
CurHPbot1:=(ord(pck[15]) * 256 + ord(pck[14]));

if (CurHPbot1 < round(MaxHPBot1*0.8)) then
if (tick1 = 1) then
begin
buf:=hstr('04') + IDbot1 + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F C1 04 00 00 00 00 00 00 00');
SendToServerEX(NameBot1);
delay(500);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
end;

if (CurHPbot1 < round(MaxHPBot1*0.6)) then
if (tick1 = 1) then
begin
buf:=hstr('04') + IDbot1 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
SendToServerEX(NameBot2);
delay(500);
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
end;

end;

//следим за ХП у БОТ2
if FromServer and (pck[1]=#$0e) and (ConnectName = NameBot2) then
if (pck[2] + pck[3] + pck[4] + pck[5] = IDbot2) and (pck[6]=#$04) then
begin
CurHPbot2:=(ord(pck[15]) * 256 + ord(pck[14]));

if (CurHPbot2 < round(MaxHPBot2*0.8)) then
if (tick2 = 1) then
begin
buf:=hstr('04') + IDbot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F C1 04 00 00 00 00 00 00 00');
SendToServerEX(NameBot2);
delay(500);
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
end;

if (CurHPbot2 < round(MaxHPBot2*0.6)) then
if (tick2 = 1) then
begin
buf:=hstr('04') + IDbot2 + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
SendToServerEX(NameBot1);
delay(500);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
end;

end;

//**********************СЛЕДИМ ЗА ТАРГЕТАМИ****************************************
//КОМАНДИР
//если принят пакет со сменой таргета у командира то
if FromServer and (pck[1]=#$A6) and (ConnectName = NameKom) then
begin
//запоминаем ИД таргета командира для ассиста
IDAssistTarget:= pck[2]+pck[3]+pck[4]+pck[5];
end;

//**********************САЖАЕМ ВСЮ ПАТИ ЧЕРЕЗ КОНТРОЛ****************************************
//если принят пакет на сажание с контролом то сажаем всю пати
if FromClient and (pck=hstr('45 00 00 00 00 01 00 00 00 00')) and (ConnectName = NameKom) then
begin
buf:=hstr('45 00 00 00 00 01 00 00 00 00');
SendToServerEX(NameBot1);
buf:=hstr('45 00 00 00 00 01 00 00 00 00');
SendToServerEX(NameBot2);
end;


//**************************УПРАВЛЕНИЕ************** **********************************
//ПОКЛОН- БЕЖАТЬ за КОМАНДИРОМ
if FromClient and (ConnectName=NameKom) and (pck=hstr('1B 07 00 00 00')) then
begin
pck:='';
BotBeg;
exit;
end;

//ПРИВЕТСТВИЕ- БАФ ПЕРВЫМ БОТОМ (первая кнопка)
if FromClient and (ConnectName=NameKom) and (pck=hstr('1B 02 00 00 00')) then
begin
pck:='';
timer1.enabled:=true;
exit;
end;

//ГРИИТЕРИНГ - ПОБЕДА - баф ПП (вторая кнопка)
if FromClient and (ConnectName=NameKom) and (pck=hstr('1B 03 00 00 00')) then
begin
pck:='';
timer2.enabled:=true;
exit;
end;

//ADVANCE- В АТАКУ - пати быстрое создание (3-я кнопка)
if FromClient and (ConnectName=NameKom) and (pck=hstr('1B 04 00 00 00')) then
begin
pck:='';
//сразу рвем пати у всех чаров и командир раздает пати поновому
//чары автоматически принимают пати
//используется таймер т.к. одновременно 2-м чарам пати кинуть нельзя
timer3.enabled:=true;
exit;
end;

//YES- ШАКЛЯ ПО АССИСТУ (4-я кнопка)
if FromClient and (ConnectName=NameKom) and (pck=hstr('1B 06 00 00 00')) then
begin
pck:='';
buf:=hstr('04') + IDAssistTarget + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('04') + IDAssistTarget + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);

buf:=hstr('2F B6 04 00 00 00 00 00 00 00');
SendToServerEX(NameBot1);
buf:=hstr('2F B1 04 00 00 00 00 00 00 00');
SendToServerEX(NameBot2);
exit;
end;



end.


разбираемся, прри старте скрипта самое главное захватить ИД у всех кто принимает участие в скрипте.. за ето отвечает следущие кусочки:

var
NameKom,NameBot1,NameBot2:string;
IDKomandos,IDbot1,IDbot2:string;
ChekIdKom,ChekIdBot1,ChekIdBot2:boolean;
... ...
procedure Init; //Вызывается при включении скрипта
begin
NameKom:='ОСНОВА';
NameBot1:='ШЕник';
NameBot2:='ППНик';
... .. ..
end;
... .... ..
//ADVANCE- В АТАКУ - пати быстрое создание (3-я кнопка)
if FromClient and (ConnectName=NameKom) and (pck=hstr('1B 04 00 00 00')) then
begin
pck:='';
//сразу рвем пати у всех чаров и командир раздает пати поновому
//чары автоматически принимают пати
//используется таймер т.к. одновременно 2-м чарам пати кинуть нельзя
timer3.enabled:=true;
exit;
end;
... ... ..
//****************************РАЗДАЧА ПРИГЛАШЕНИЙ НА ВСТУПЛЕНИЕ В ПАТИ*******************
//*********************А ТАКЖЕ ПОСЫЛКА ТЕКСТА Я1 Я2 Я3 для захвата ИДешников************
procedure OnTimer3(Sender: TObject);
begin

if tick3 = 1 then
begin
buf:=hstr('2B');
SendToServerEX(NameKom);
SendToServerEX(NameBot1);
SendToServerEX(NameBot2);
end;

if tick3 = 2 then
begin
buf:=hstr('29');
writeS(namebot1);
buf:=buf + hstr('00 00 00 00');
SendToServerEX(NameKom);
end;

if tick3 = 3 then
begin
buf:=hstr('29');
writeS(namebot2);
buf:=buf + hstr('00 00 00 00');
SendToServerEX(NameKom);
end;

if tick3 = 4 then
//if (IDKomandos = '') or (IDBot1 = '') or (IDBot2 = '') then
begin
buf:=hstr('38');
writes('я1');
buf:=buf + hstr('03 00 00 00'); ///9- али // 3-пати // 01 - общий
sendtoserverex(NameKom);

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

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

tick3:=tick3+1;

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

end;
... ... ... ... ...
//******************************АВТОСОГЛАШЕНИЕ НА ВСТУПЛЕНИЕ В ПАТИ************************
//******************************ПРИ УСЛОВИИ ЧТО ПАТИ ДАЕТ- КОМАНДИР************************
if FromServer and (ConnectName=NameBot1) and (pck[1]=#$39) then
if ReadS(2)=NameKom then
begin
buf:=hstr('2A 01 00 00 00');
sendtoserverex(NameBot1);
end;

if FromServer and (ConnectName=NameBot2) and (pck[1]=#$39) then
if ReadS(2)=NameKom then
begin
buf:=hstr('2A 01 00 00 00');
sendtoserverex(NameBot2);
end;
.... ... ... ... ...
//******************************БЛОК ДЛЯ ЗАПОМИНАНИЯ ИДЕШНИКОВ БОТОВ***********************
//******************************ОТЛАВЛИВАЕМ Я1 Я2 Я3***************************************
if FromServer and (ConnectName=NameKom) and (pck[1]=#$4A) then
begin
i:=10;
tempS:=readS(i);

if tempS=NameKom then
begin
tempS:=ReadS(i);
if tempS='я1' then
begin
IDKomandos:=pck[2]+pck[3]+pck[4]+pck[5];
end;
end;
end;

if FromServer and (ConnectName=NameBot1) and (pck[1]=#$4A) then
begin
i:=10;
tempS:=readS(i);
if tempS=NameBot1 then
begin
tempS:=ReadS(i);
if tempS='я2' then
begin
IDBot1:=pck[2]+pck[3]+pck[4]+pck[5];
end;
end;
end;

if FromServer and (ConnectName=NameBot2) and (pck[1]=#$4A) then
begin
i:=10;
tempS:=readS(i);
if tempS=NameBot2 then
begin
tempS:=ReadS(i);
if tempS='я3' then
begin
IDBot2:=pck[2]+pck[3]+pck[4]+pck[5];
end;
end;
end;


итак.. после запуска скрипта.. жмем социальное действие.. при етом автоматически создается пати и в ету пати в чат все боты и командир пишут автоматически "я1" "я2" "я3".. последний блок в коде отлавливает етот текст из чата, проверяет кто автор етого текста.. и если имя автора совпадает с именем бота и текст совпадает с заданным "я2" то из етого пакета (сообщение в чат-ответ сервера) выдирается ИД отправителя.. т.е. мы имеем 3 ИДешника.. 1- ИД главного перса которого надо хилить и 2 ИДешника ботов (ШЕ и ПП)..
теперь приступаем к слежению за состоянием ХП и собственно хилу..

procedure Init; //Вызывается при включении скрипта
begin
NameKom:='ОСНОВА';
NameBot1:='ШЕник';
NameBot2:='ППник';

CurHPKom:=15000;
CurHPBot1:=15000;
CurHPBot2:=15000;

CurMPKom:=15000;
CurMPBot1:=15000;
CurMPBot2:=15000;

MaxHPKom:=10;
MaxHPBot1:=10;
MaxHPBot2:=10;
... ... ...
end;

при старте скрипта задаем значения с потолка лимитивные.. т.е. максимальные уровни.. в работе скрипт их сам подкоректирует на реальные значения.. ето нужно для того чтобы исключить хил при старте скрипта, пока еще скрипт не вычислил значения лимитов ХП и МП нужно ручками их 1 раз в начале вписать..

и вот собственно слежение за лимитами и текущими значениями:

//*************************УЗНАЕМ ЛИМИТЫ ХП и МП***********************************************
//из пакета UserInfo который приходит во время бафа и не только

//КОМАНДИР
if FromServer and (pck[1]=#$04) and (ConnectName = NameKom) then
begin
i:=22;
tempS:=readS(i);
i:=i+48;
MaxHPKom:=readD(i);
CurHPKOM:=readD(i);
MaxMPKom:=readD(i);
CurMPKOM:=readD(i);
end;

//1-й бот
if FromServer and (pck[1]=#$04) and (ConnectName = NameBot1) then
begin
i:=22;
tempS:=readS(i);
i:=i+48;
MaxHPBot1:=readD(i);
CurHPBot1:=readD(i);
MaxMPBot1:=readD(i);
CurMPBot1:=readD(i);
end;

//2-й бот
if FromServer and (pck[1]=#$04) and (ConnectName = NameBot2) then
begin
i:=22;
tempS:=readS(i);
i:=i+48;
MaxHPBot2:=readD(i);
CurHPBot2:=readD(i);
MaxMPBot2:=readD(i);
CurMPBot2:=readD(i);
end;
... ... ... ...
//*************************СЛЕДИМ ЗА ХП и МП******************************************
//следим за ХП КОМАНДИРА
if FromServer and (pck[1]=#$0e) and (ConnectName = NameKom) then
if (pck[2] + pck[3] + pck[4] + pck[5] = IDKomandos) and (pck[6]=#$04) then
begin
CurHPKom:=(ord(pck[15]) * 256 + ord(pck[14]));

if (CurHPKom < round(MaxHPKom*0.7)) then
if (tick1 = 1) then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F C1 04 00 00 00 00 00 00 00');
SendToServerEX(NameBot1);
delay(500);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
end;

if (CurHPKom < round(MaxHPKom*0.8)) then
if (tick2 = 1) then
begin
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
SendToServerEX(NameBot2);
delay(500);
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
end;

end;

//следим за МП КОМАНДИРА
if FromServer and (pck[1]=#$0e) and (ConnectName = NameKom) then
if (pck[2] + pck[3] + pck[4] + pck[5] = IDKomandos) and (pck[6]=#$02) then
begin
CurMPKom:=(ord(pck[15]) * 256 + ord(pck[14]));

RND:=round(random*100);

if (CurMPKom < round(MaxMPKom*0.8)) and (rnd<15) then
if (tick1 = 1) then
begin
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F F5 03 00 00 00 00 00 00 00');
SendToServerEX(NameBot1);
delay(500);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
end;
end;


//следим за ХП у БОТ1
if FromServer and (pck[1]=#$0e) and (ConnectName = NameBot1) then
if (pck[2] + pck[3] + pck[4] + pck[5] = IDbot1) and (pck[6]=#$04) then
begin
CurHPbot1:=(ord(pck[15]) * 256 + ord(pck[14]));

if (CurHPbot1 < round(MaxHPBot1*0.8)) then
if (tick1 = 1) then
begin
buf:=hstr('04') + IDbot1 + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F C1 04 00 00 00 00 00 00 00');
SendToServerEX(NameBot1);
delay(500);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
end;

if (CurHPbot1 < round(MaxHPBot1*0.6)) then
if (tick1 = 1) then
begin
buf:=hstr('04') + IDbot1 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
SendToServerEX(NameBot2);
delay(500);
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
end;

end;

//следим за ХП у БОТ2
if FromServer and (pck[1]=#$0e) and (ConnectName = NameBot2) then
if (pck[2] + pck[3] + pck[4] + pck[5] = IDbot2) and (pck[6]=#$04) then
begin
CurHPbot2:=(ord(pck[15]) * 256 + ord(pck[14]));

if (CurHPbot2 < round(MaxHPBot2*0.8)) then
if (tick2 = 1) then
begin
buf:=hstr('04') + IDbot2 + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('2F C1 04 00 00 00 00 00 00 00');
SendToServerEX(NameBot2);
delay(500);
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
buf:=hstr('04') + IDKomandos + Bot2X + Bot2Y + Bot2Z + hstr('00');
SendToServerEX(NameBot2);
end;

if (CurHPbot2 < round(MaxHPBot2*0.6)) then
if (tick2 = 1) then
begin
buf:=hstr('04') + IDbot2 + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('2F F7 03 00 00 00 00 00 00 00');
SendToServerEX(NameBot1);
delay(500);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
buf:=hstr('04') + IDKomandos + Bot1X + Bot1Y + Bot1Z + hstr('00');
SendToServerEX(NameBot1);
end;

end;

проблема с переходом с ц на интерлюд случается в етом блоке:

//КОМАНДИР
if FromServer and (pck[1]=#$04) and (ConnectName = NameKom) then
begin
i:=22;
tempS:=readS(i);
i:=i+48;
MaxHPKom:=readD(i);
CurHPKOM:=readD(i);
MaxMPKom:=readD(i);
CurMPKOM:=readD(i);
end;

конкретно в строке i:=i+48; 48 - ето для интерлюда.. но я етот скрипт разрабатывал на ц4.. и там было непомню сколько.. либо 44 либо 52.. при переходе на интерлюд пакет чуть чуть изменился етот на 4 байта съехало расположение ХМ и МП относительно имени..
ну вопщем я думаю разберешся теперь? а то раздули пустяк на 2 страници уже..

mks
25.01.2008, 13:12
VORON
ну вопщем я думаю разберешся теперь? а то раздули пустяк на 2 страници уже..
да помойму уже достаточно все разжевали, нужно просто что б человек сам попробовал поразмыслить....
думаю через день-другой можно будет темку подчистить
boyan
советую копирнуть себе части которые сочтешь полезными

boyan
25.01.2008, 20:24
вроде разобрался..
возникла новая проблемма. =)
иногда, скорость бега, уменьшается ровно в два раза.. лечится: например отключение и включением автоюза сосок

VORON
26.01.2008, 00:54
вроде разобрался..
возникла новая проблемма. =)
иногда, скорость бега, уменьшается ровно в два раза.. лечится: например отключение и включением автоюза сосок
ну что сказать тебе? значит ты отсылаеш клиенту пакет USERINFO в котором написано что у тебя скорость маленькая... а когда соски или что то другое юзаеш сервер- новый пакет отсылает клиенту твоему( правильный пает) в котором реальная скорость указывается.. ты ваще понимаеш разницу между входящим и исходящим травиком? что такое клиент и сервер?

Добавлено спустя 6 минут 57 секунд:
собственно вопрос в том: как? накуя? и каким образом? и где именно? ты отсылаеш клиенту фальшивые сведения об своих характеристиках?.. ты на етот вопрос должен ответить сам.. для начала ответь "накуя?" (сам себе) потом ответь навопрос "как ето я так делаю?" .. потом ответь сам себе "какой кусок кода у меня отсылает пакет ЮЗЕРИНФО- клиенту?" и всё станет ясно...

boyan
26.01.2008, 13:12
это все понятно.. только вот отсылаются серверу всего 4 пакета, которые соснифаны, при юзе банок в клиенте.. (ГЦП, ЦП. ГХП, и МП). Больше никаких пакетов Я не шлю..
Да и если бы, все было так просто - отослал переделанный ЮсерИнфо, с нужными параметрами - и у тебя статы становятся, такие как захотел, то этот скрипт был бы не нужен в принципе.. сделал, из себя РБ, и погнал.. с зацикленным скриптом..

26.01.2008, 13:25
помогите с нетпинг...
A8=NetPing:h(PingID)d(Unknown)d(UnknownConst)
никак не пойму что там кроме ид'а :unknown:

VORON
26.01.2008, 14:14
боян, не серверу смотри а клиенту... ты гдето отсылаеш клиенту пакет ЮЗЕР ИНФО.. либо готовый пакет от сервера изменяеш гдето..

QaK
26.01.2008, 15:56
A8=NetPing:h(PingID)d(Unknown)d(UnknownConst)
unknownconst - константа сервера, для каждого своя
unknown - пинг

26.01.2008, 22:54
чар некоторое время сидит и потом вылетает, в чём может быть ошибка? :o

const
Name='Palevo';
var
started :boolean; //есть чо?

procedure Init;
begin
Randomize;
end;

begin
if FromClient and (ConnectName=Name) and (pck[1]=#$1B) then begin
case ReadD(2) of //SocialID
//социальное действие Yes для начала
6: begin
pck:='';
NoFreeOnClientDisconnect;
NoFreeOnServerDisconnect;
started:=true;
buf:=#$7E; //гы-гы-гы
SendToClientEx(Name); //паслать на...
end;
end;
end;
if FromServer and (ConnectName=Name) and (pck[1]=#$D3) and started then begin
buf:=#$A8;
WriteD(ReadD(2)); //pingid
WriteD(Int(Random()*100)); //ping 0-100
WriteD(2048); //const
SendToServerEx(Name); //паслать на...
pck:=''; //killhim :-F
end;
end.

ps звиняюсь за тупость :pardon:

VORON
27.01.2008, 10:36
думаю ошибка в етом: WriteD(Int(Random()*100)); //ping 0-100
с чего ты взял что там рандом?

Grinch
30.01.2008, 21:58
народ кто сделал норм радар по клану? очень надо а то я тут случайно пк отмыл одного баюма выбил и боты со шлемом драконик, а клан у них 50% хиро и как то не охота в спину что б меня киляли :) если можно поделитесь скриптиком рабочим

Murdoc
31.01.2008, 15:32
народ кто сделал норм радар по клану? очень надо а то я тут случайно пк отмыл одного баюма выбил и боты со шлемом драконик, а клан у них 50% хиро и как то не охота в спину что б меня киляли :) если можно поделитесь скриптиком рабочим
Угу. Каждому!!!
Что за хроники? я уже писал у меня есть несколько радарчиков, но на моем ц4 кроме хингейма и аима демы ничего не работает.

Grinch
06.02.2008, 09:44
на наверно баян но вчера сидел правил скриптик :)
//автоматическое использование НР пробирок by NLObP + СP редакция GrinchB
// 1-Изменяем Name='ххх';
// 2-бросаем, подбираем или выпиваем Heal Potion и СП как включите там всё написано будет в чат
//Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS" и Protocol 656

const
Name='ххх';
var
ColvoCP,ColvoHP, CharObjID, ItemObjHP, ItemObjCP: integer;
CurHP,MaxHP,CurCP,MaxCP: integer;
TimerCP,TimerHP: TTimer;
Status: boolean;
//************************************************** ****************************
procedure OnTimerHP(Sender: TObject);
begin
if ColvoHP=0 then exit;
buf:=#$14;
WriteD(ItemObjHP);
WriteD(00);
SendToServerEx(Name);
ColvoHP:=ColvoHP-1; //количество хилок
if ColvoHP=0 then begin
Say('Хилок='+inttostr(ColvoHP));
Say('Кончились хилки! Закупите Heal Potion!');
end;
end;
procedure OnTimerCP(Sender: TObject);
begin
if ColvoCP=0 then exit;
buf:=#$14;
WriteD(ItemObjCP);
WriteD(00);
SendToServerEx(Name);
ColvoCP:=ColvoCP-1; //количество CP
if ColvoCP=0 then begin
Say('CP='+inttostr(ColvoCP));
Say('ЕСЛИ ТЫ ПОЛУЧИЛ ЭТО СООБЩЕНИЕ ТЫ ТРУП!');
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);
MaxCP:=ReadD(i);
CurCP:=ReadD(i);
//Say('MaxHP='+inttostr(MaxHP)+'CurHP='+inttostr(Cur HP));
if ItemObjHP=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);
#$21: CurCP:=ReadD(i*8+14);
#$22: MaxCP:=ReadD(i*8+14);
end;
end;
if ItemObjHP=0 then exit;
if (CurHP<=MaxHP-50) then TimerHP.enabled:=true else TimerHP.enabled:=false;
if ItemObjCP=0 then exit;
if (CurCP<=MaxCP-200) then TimerCP.enabled:=true else TimerCP.enabled:=false;
end;
//************************************************** ****************************
procedure ObjtoColvoHP(ItemObjHP:integer);
var
i: integer;
begin
if ItemObjHP=0 then exit;
for i:=0 to ReadD(4)-1 do begin
if ItemObjHP=ReadD(i*28+8) then ColvoHP:=ReadD(i*28+16); //количество хилок
end;
end;
procedure ObjtoColvoCP(ItemObjCP:integer);
var
i: integer;
begin
if ItemObjCP=0 then exit;
for i:=0 to ReadD(8)-1 do begin
if ItemObjCP=ReadD(i*28+8) then ColvoCP:=ReadD(i*28+16); //количество хилок
end;
end;


//************************************************** ****************************
// Вызывается при включении скрипта
//************************************************** ****************************
procedure Init;
begin
status:=false;
CharObjID:=0;
ItemObjHP:=0;
ItemObjCP:=0;
timerHP:=TTimer.Create(nil);
timerHP.OnTimer:=@OnTimerHP;
timerHP.enabled:=false;
timerHP.interval:=5000; //время отката лечения
Say('Для начала работы скрипта бросаем, подбираем или выпиваем Heal Potion!');
timerCP:=TTimer.Create(nil);
timerCP.OnTimer:=@OnTimerCP;
timerCP.enabled:=false;
timerCP.interval:=100; //время отката для шоков или где быстро кушаются банки
Say('Для начала работы скрипта бросаем, подбираем или выпиваем CP!');
end;
//************************************************** ****************************
// Вызывается при выключении скрипта
//************************************************** ****************************
procedure Free;
begin
timerHP.Free;
timerCP.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
ItemObjHP:=ReadD(8);
ColvoHP:=ReadD(16); //количество хилок
if status then exit;
Say('Автоматическое использование Нeal Рotion готово к работе!');
Say('Хилок='+inttostr(ColvoHP));

end;
if FromServer and (ConnectName=Name) and (pck[1]=#$27) and (ReadD(12)=5592) then begin //CP, Lesser Healing Potion
ItemObjCP:=ReadD(8);
ColvoCP:=ReadD(16); //количество CP
if status then exit;
Say('Автоматическое использование CP готово к работе!');
Say('CP='+inttostr(ColvoCP));

status:=true;
end;
//************************************************** ****************************
//ItemList
if FromServer and (ConnectName=Name) and (pck[1]=#$1B) and status then begin
ObjtoColvoHP(ItemObjHP); //количество хилок
//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.


скажу сразу я пока учусь програмить и спс NLObP и его коментариям т.к. без них я б не разобрался как ет работает и не добавил банки ЦП. думаю доработать потом под 2 вида банок что б кушалось по очереди т.к. метод кульный :) и грейт хилки добавить на условие кушания меньше 30% и до 60% потом снова красненькие вот тока сейчас не эти занят хочу велосипед изобрести.
Идея простая скилы юзаются в порядке нажатия после отката предыдущего так вот хочу сделать процедурку котороя бы на автомате брала время из пакета и заменить в скриптах на баф таймер ровно допустим 2секунды на число реального каста как правило ето в районе 1-5 секунд взависимости от бафа под смом вообще стремиться к нулю. Так что пока буду думать юзайте хп и цп банки так. Или помогите кто шарит в програмерстве т.к. ет не простая процедура и очень как мне кажеться полезная

Добавлено спустя 4 минуты 47 секунд:
а мой пост о пакете с такими даные найдёте в теме "ищу пакет" я его сам в итоге нашёл всё расписано там

QaK
07.02.2008, 09:03
Grinch, сделай таймер, у которого значение Interval присваивай считываемому значению реюза из пакета $48

Grinch
07.02.2008, 23:52
lQaKl ы делаю, но из-за кривизны рук и недостатка свободного времени пишеться медлено тем более делаю по аналогии других скриптов.

Добавлено спустя 11 часов 56 минут 56 секунд:
const
Name='xxx';//скилы от ПП для теста
b1='2F 3D 04 00 00 00 00 00 00 00 '; //Acumen
b2='2F 18 04 00 00 00 00 00 00 00 '; //BtS
b3='2F 15 04 00 00 00 00 00 00 00 '; //BtB
b4='2F 2C 04 00 00 00 00 00 00 00 '; //Might
b5='2F 10 04 00 00 00 00 00 00 00 '; //Shield
b6='2F 36 04 00 00 00 00 00 00 00 '; //concentration
b7='2F 35 04 00 00 00 00 00 00 00 '; //Focus
b8='2F DA 04 00 00 00 00 00 00 00 '; //DW
b9='2F D8 04 00 00 00 00 00 00 00 '; //Точночть
b10='2F B4 04 00 00 00 00 00 00 00 '; //WW
b11='2F 0C 04 00 00 00 00 00 00 00 '; // MB
b12='2F 0B 04 00 00 00 00 00 00 00 '; // Mental
b13='2F 3E 04 00 00 00 00 00 00 00 '; // Haste
b14='2F 48 05 00 00 00 00 00 00 00 '; // EP
b15='2F DB 04 00 00 00 00 00 00 00 '; // щит
var
prof,x, SkilID, SkilHIT : integer;
timer1: TTimer;
Target: string;
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;


procedure Init; //Вызывается при включении скрипта
begin
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer;
timer1.enabled:=true;
timer1.interval:=SkilHIT;// главная трабла или не всё так просто :( значение не присваивается динамически изначальео его
просто нет пробовал менять на 2000 там ниже вместа адреса числа


Say('НУ РАБОТАЙ!');
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:=x+1;
end;
5: begin
buf:=hstr(b5);
sendtoserver;

x:=x+1;
end;
6: begin
buf:=hstr(b6);
sendtoserver;

x:=x+1;
end;
7: begin
buf:=hstr(b7);
sendtoserver;

x:=x+1;
end;
8: begin
buf:=hstr(b8);
sendtoserver;

x:=x+1;
end;
9: begin
buf:=hstr(b9);
sendtoserver;

x:=x+1;
end;
10: begin
buf:=hstr(b10);
sendtoserver;

x:=x+1;
end;
11: begin
buf:=hstr(b11);
sendtoserver;

x:=x+1;
end;
12: begin
buf:=hstr(b12);
sendtoserver;

x:=x+1;
end;
13: begin
buf:=hstr(b13);
sendtoserver;

x:=x+1;
end;
14: begin
buf:=hstr(b14);
sendtoserver;

x:=x+1;
end;
15: begin
buf:=hstr(b15);
sendtoserver;

x:=0;
end;
end;

end;




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

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

if FromServer and (ConnectName=Name) and (pck[1]=#$48) then
begin
SkilHIT:=ReadD(18);
SkilID:= ReadD(10);
Say('Скил='+inttostr(SkilID)); // иди скрипта так для самопроверке кстате можно тестить бафы на ускорение каста и шмот
Say('Откат='+inttostr(SkilHIT)); //время каста скила

end;
if FromClient and (pck[1]+pck[2]=#$38#$31)then //1- нажимаем в любой чат окуратней я пакет не убил
begin
prof:=1
end;
if prof=1 then begin
x:=1;
prof:=0;
end;
Say('x='+inttostr(x))// так что б мониторить измение в чате
end.
ЗЫ НЕ РАБОТАЕТ в чём трабла?

08.02.2008, 14:51
var
IDPartyMember, IDAssistTarget, IDMy: String;
CoordVarkX, CoordVarkY, CoordVarkZ :String;

procedure VarkBeg;
begin
if (CoordVarkX<>'Bot1') and (IDPartyMember<>'TRATATA') then
begin
buf:=hstr('04') + IDPartyMember + CoordVarkX + CoordVarkY + CoordVarkZ + hstr('00');
SendToServerEX('Bot1');
buf:=hstr('04') + IDPartyMember + CoordVarkX + CoordVarkY + CoordVarkZ + hstr('00');
SendToServerEX('Bot1');
end;
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 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='TRATATA') 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;

if FromClient and (ConnectName='TRATATA')and (pck[1]=#$38) then
begin
pck:='';
VarkBeg;
exit;
end;

end.

08.02.2008, 16:27
Почему когда я вставляю пакет(с выбором таргета) в посылку он его снова не выделяет?????????

04 40 77 80 48 A4 61 00 00 43 22 00 00 E9 F1 FF FF 00 00 00 00 BB 41 5F 27 87 B3 78 99 E3 0C FD 64 29 3F 43 68

№ | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | Строкой
-----+-------------------------------------------------+-----------------
0000 | 04 40 77 80 48 A4 61 00 00 43 22 00 00 E9 F1 FF | .@wЂH¤a..C"..йся
0010 | FF 00 00 00 00 BB 41 5F 27 87 B3 78 99 E3 0C FD | я....»A_'‡іx™г.э
0020 | 64 29 3F 43 68 | d)?Ch

Grinch
08.02.2008, 23:43
народ хелп как правельно взять id перса что б оно было как бы константа :) т.е. ьерём 1 раз и больше не трогаем я знаю что оно и не меняется больше но когда я ставлю id в константу копируя ее с пакета скрипт работает коректно а когда выдёргиваю из чар инфо происходит что то необъянимое короче хелп ми

NLObP
08.02.2008, 23:51
народ хелп как правельно взять id перса что б оно было как бы константа :) т.е. ьерём 1 раз и больше не трогаем я знаю что оно и не меняется больше но когда я ставлю id в константу копируя ее с пакета скрипт работает коректно а когда выдёргиваю из чар инфо происходит что то необъянимое короче хелп ми
Покажи как ты это делаешь. Тогда можно подсказывать.

Grinch
09.02.2008, 00:13
procedure Init;
****
***
***
procedure InitStats;
begin
CharObjID:=ReadD(18);
end;

begin
//UserInfo
if FromServer and (ConnectName=Name) and (pck[1]=#$04) then InitStats;
ну и код где выделяем пакет 48 + иди перса если проходит берём начинает считывать время каста и кастует как робот :)
end

Добавлено спустя 45 секунд:
как всё заработает выложу скриптик мне нравиться в целом в тихом месте кастует всё на ура

VORON
09.02.2008, 13:36
народ хелп как правельно взять id перса что б оно было как бы константа :) т.е. ьерём 1 раз и больше не трогаем я знаю что оно и не меняется больше но когда я ставлю id в константу копируя ее с пакета скрипт работает коректно а когда выдёргиваю из чар инфо происходит что то необъянимое короче хелп ми
проблема бональна-))

CharObjID:=ReadD(18);
ты приравниваеш что к чему? ИД ЧАРА надо хранить в СТРИНГЕ! для того чтобы его можно было напрямую без преобразований использовать.. т.е. тебе надо запомнить 4 символа 18, 19, 20, 21 байты... а ты используя функцию READD(xx) - преобразуеш СТРИНГ- в число интигер... само собой ето число будет от первоначального стринга отличаеш.. ето равносильно функции STRTOINT('stroka'),.
вопщем если ты меня понял то :
приведи CharObjID к типу STRING..
а строку CharObjID:=ReadD(18); приведи к виду:
CharObjID:=pck[18]+pck[19]+pck[20]+pck[21];

а в твоем варианте ето работало так:
CharObjID:=StrToInt(pck[18]+pck[19]+pck[20]+pck[21]);

st01en
09.02.2008, 15:09
проблема бональна-))Хм, а почему нельзя хранить ID как число?
ReadD(var index:integer):integer - читает из переменной pck число (4 байта)как раз то что нужно помоему.

xkor
09.02.2008, 15:53
CharObjID:=ReadD(18);
ты приравниваеш что к чему? ИД ЧАРА надо хранить в СТРИНГЕ! для того чтобы его можно было напрямую без преобразований использовать.. т.е. тебе надо запомнить 4 символа 18, 19, 20, 21 байты... а ты используя функцию READD(xx) - преобразуеш СТРИНГ- в число интигер... само собой ето число будет от первоначального стринга отличаеш.. ето равносильно функции STRTOINT('stroka'),.
вопщем если ты меня понял то :
приведи CharObjID к типу STRING..
а строку CharObjID:=ReadD(18); приведи к виду:
CharObjID:=pck[18]+pck[19]+pck[20]+pck[21];

а в твоем варианте ето работало так:
CharObjID:=StrToInt(pck[18]+pck[19]+pck[20]+pck[21]);
не ожидал от тя такого бреда...
ReadD (который копирует область памяти размером 4 байта из строки в числовую переменную) не имеет никакого отношения к StrToInt который преобразует строку в число, StrToInt выполняется во многие разы медленнее чем ReadD, так что не путай человека

st01en, не совсем понял зачем те делать чтоб тока при первом пакете юзеринфо считывался ИД, быстродействие от того что ИД будет считываться каждый раз почти не пострадает да и на всяких проверках первый ли это раз быстродействие пострадает даже немного сильнее, но всёравно кстати незначительно)

st01en
09.02.2008, 17:44
st01en, не совсем понял зачем те делать чтоб тока при первом пакете юзеринфо считывался ИД, быстродействие от того что ИД будет считываться каждый раз почти не пострадает да и на всяких проверках первый ли это раз быстродействие пострадает даже немного сильнее, но всёравно кстати незначительно)
а я так и не делаю, я на каждый пакет ЮзернИнфо ИД заново достаю, только не здесь, моя тема в программщине :)
Сюда я случайно влез потому, что странным показалось то что VORON написал :)
Grinch, этот ответ похоже тебе адресовался.

xkor
09.02.2008, 20:38
Grinch, этот ответ похоже тебе адресовался.
хех, точно ему.., не на тот ник нажал)

VORON
10.02.2008, 03:07
проблема бональна-))Хм, а почему нельзя хранить ID как число?
ReadD(var index:integer):integer - читает из переменной pck число (4 байта)как раз то что нужно помоему.
ну сматри если ты используеш для хранения ИДешника (4-х байтного) ИНТИГЕР- то- тебе его применять надо по особому!.. простой IntToStr - некатит... нужно применять WRITED(Integer) , а ты скорее всего применяеш хз как.. тот клочек кода что ты дал- тока запоминает.. ето дело каждого как запомнить.. кто то хранит в ИНТИГЕРЕ.. а кто то в СТРИГЕ.. но приетом использовать надо- адекватно.. вставлять в правильном формате.. у тебя проблема именно в етом.. надо делать так:
вариант 1: запоминать данные из пакета- 04 (ИД ЧАРА) в стринговом формате (ID:= PCK[18]+PCK[19]+PCK[20]+PCK[21]) и применять его тупо: (buf:=buf+ID)
вариант 2: запоминать в интигере ID:=READD(18) но тогда етот интигер в нужное место надо встовлять по особому..
BUF:=BUF; //string
writeD(ID);


ну вот собственно.. скорее всего ты запомнил в одном формате а применил в другом...

Grinch
10.02.2008, 14:50
народ как говориться стоять зорька :) я выложу скрипт целиуом, а вы попробуйте заставить его работать динамически считывая ид чара :) просто динамически считывается другой пакет $48 (ид мой)(иди кого бафаем или убиваем) (ну и т.д.)( время каста)(время отката), И что получается когда я вбиваю ИД константой всё работает когда считываю не работает причём считывается всё верно.

const
PPbafer = 'НИК ТВОЕГО ПП';// ps если нет пп то юзаем чьи нибуть бафы но не меньше 5
buff =
['2F 3D 04 00 00 00 00 00 00 00 ', //Acumen
'2F 18 04 00 00 00 00 00 00 00 ', //BtS
'2F 15 04 00 00 00 00 00 00 00 ', //BtB
'2F 2C 04 00 00 00 00 00 00 00 ', //Might
'2F 10 04 00 00 00 00 00 00 00 ', //Shield
'2F 36 04 00 00 00 00 00 00 00 ', //concentration
'2F 35 04 00 00 00 00 00 00 00 ', //Focus
'2F DA 04 00 00 00 00 00 00 00 ', //DW
'2F D8 04 00 00 00 00 00 00 00 ', //Точночть
'2F B4 04 00 00 00 00 00 00 00 ', //WW
'2F 0C 04 00 00 00 00 00 00 00 ', // MB
'2F 0B 04 00 00 00 00 00 00 00 ', // Mental
'2F 3E 04 00 00 00 00 00 00 00 ', // Haste
'2F 48 05 00 00 00 00 00 00 00 ', // EP
'2F DB 04 00 00 00 00 00 00 00 ']; // щит
SS=0;
PPbaferID=1212167608;
var
prof,x,y, SkilID, SkilHIT,{PPbaferID} : integer;
timer1, timer2: TTimer;
Target: string;
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(PPbafer);
WriteS(msg);
SendToClientEx(PPbafer);
end;


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


end;
//procedure InitStats;
{begin

PPbaferID:=ReadD(18);
end; }
procedure OnTimer1(Sender: TObject);
begin
if x = 1 then
Say('Начинаем баффаццо');
buf:=hstr(buff[x]); //берем нужный элемент из массива
SendToServerEx(PPbafer);
inc(x); //увеличиваем х на 1
if x = 15 then
begin Say('Баффаццо вроде закончили');
Timer1.Enabled:=False; //закончили баффаццо - таймер отключили
x:=0;
end;
Say('x='+inttostr(x))// так что б мониторить измение в чате
end;

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

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;
if FromServer and (ConnectName=PPbafer) and ((pck[1]=#$04) then InitStats;
if FromServer and (ConnectName=PPbafer) and ((pck[1]=#$48) and (ReadD(18)=SS)) then exit ;
if FromServer and (ConnectName=PPbafer) and ((pck[1]=#$48) and (ReadD(2)=PPbaferID)) then
begin
SkilHIT:=ReadD(18);
SkilID:= ReadD(10);
Timer1.Interval:=SkilHit+100; //ставим время отката скила +100 константа смешения тупо что б паузу сделать маленькую
Say('Скил='+inttostr(SkilID)); // иди скрипта так для самопроверке кстате можно тестить бафы на ускорение каста и шмот
Say('Откат='+inttostr(SkilHIT)); //время каста скила
end;

if FromClient and (pck[1]+pck[2]=#$38#$31) and (ConnectName=PPbafer) then //1- нажимаем в любой чат окуратней я пакет не убил
begin
prof:=1;
Timer1.Enabled:=True; //врубаем таймер

end;
if prof=1 then begin
y:=1;
prof:=0;
end;

// Say('ID'+inttostr(PPbaferID));
end.




и в крацее для чего нужен ИД бафера, постойте в геране или в зоне кача сколько летит пакетов $48 выделяем свой просто и скрипт работает прямо и не сбивается

Добавлено спустя 6 минут 30 секунд:
ну 2 варианта там где ид константа надо свой написать :) или закоментировать и попробовать профиксить ошибку которую я допустил не могу понять в чём она т.к. в тонкостях не разбираюсь и половину что вы тут написали просто не понял :cry:

xkor
10.02.2008, 15:18
тоесть так непашет? const
PPbafer = 'НИК ТВОЕГО ПП';// ps если нет пп то юзаем чьи нибуть бафы но не меньше 5
buff =
['2F 3D 04 00 00 00 00 00 00 00 ', //Acumen
'2F 18 04 00 00 00 00 00 00 00 ', //BtS
'2F 15 04 00 00 00 00 00 00 00 ', //BtB
'2F 2C 04 00 00 00 00 00 00 00 ', //Might
'2F 10 04 00 00 00 00 00 00 00 ', //Shield
'2F 36 04 00 00 00 00 00 00 00 ', //concentration
'2F 35 04 00 00 00 00 00 00 00 ', //Focus
'2F DA 04 00 00 00 00 00 00 00 ', //DW
'2F D8 04 00 00 00 00 00 00 00 ', //Точночть
'2F B4 04 00 00 00 00 00 00 00 ', //WW
'2F 0C 04 00 00 00 00 00 00 00 ', // MB
'2F 0B 04 00 00 00 00 00 00 00 ', // Mental
'2F 3E 04 00 00 00 00 00 00 00 ', // Haste
'2F 48 05 00 00 00 00 00 00 00 ', // EP
'2F DB 04 00 00 00 00 00 00 00 ']; // щит
SS=0;
//PPbaferID=1212167608;
var
prof,x,y, SkilID, SkilHIT,PPbaferID : integer;
timer1, timer2: TTimer;
Target: string;
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(PPbafer);
WriteS(msg);
SendToClientEx(PPbafer);
end;


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


end;
procedure InitStats;
begin
PPbaferID:=ReadD(18);
end;

procedure OnTimer1(Sender: TObject);
begin
if x = 1 then
Say('Начинаем баффаццо');
buf:=hstr(buff[x]); //берем нужный элемент из массива
SendToServerEx(PPbafer);
inc(x); //увеличиваем х на 1
if x = 15 then
begin Say('Баффаццо вроде закончили');
Timer1.Enabled:=False; //закончили баффаццо - таймер отключили
x:=0;
end;
Say('x='+inttostr(x))// так что б мониторить измение в чате
end;

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

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;
if FromServer and (ConnectName=PPbafer) and ((pck[1]=#$04) then InitStats;
if FromServer and (ConnectName=PPbafer) and ((pck[1]=#$48) and (ReadD(18)=SS)) then exit ;
if FromServer and (ConnectName=PPbafer) and ((pck[1]=#$48) and (ReadD(2)=PPbaferID)) then
begin
SkilHIT:=ReadD(18);
SkilID:= ReadD(10);
Timer1.Interval:=SkilHit+100; //ставим время отката скила +100 константа смешения тупо что б паузу сделать маленькую
Say('Скил='+inttostr(SkilID)); // иди скрипта так для самопроверке кстате можно тестить бафы на ускорение каста и шмот
Say('Откат='+inttostr(SkilHIT)); //время каста скила
end;

if FromClient and (pck[1]+pck[2]=#$38#$31) and (ConnectName=PPbafer) then //1- нажимаем в любой чат окуратней я пакет не убил
begin
prof:=1;
Timer1.Enabled:=True; //врубаем таймер

end;
if prof=1 then begin
y:=1;
prof:=0;
end;

// Say('ID'+inttostr(PPbaferID));
end.

Grinch
10.02.2008, 15:32
впринципе работает :) ток работает после того как ИД свой получит а ет происходит не сразу после включения скрипта хм значит стоило нажраться что б ето понять с больной головой :) так как сделать так что б ИД побыстрей считывался наверное шмотку снять одеть стоит

Добавлено спустя 4 минуты 37 секунд:
ЗЫ и работает как то рандомно надо подумать :) ещё

xkor
10.02.2008, 15:33
чтоб пришел пакет UserInfo надо просто открыть и закрыть окно инвенторя в клиенте)
ЗЫ а чтоб это сам скрипт делал надо прост заставить его при запуске слать пакет запроса инвенторя, я его номер непомню, так что прост поймай его и шли когда нужно получить UserInfo

Grinch
10.02.2008, 15:40
кароче ясно терь бум думать как ше заставить ману, лить до фула с бешеной скоростью :) вроде с хп где то видел подобное бум править :)

st01en
10.02.2008, 16:09
ну сматри если ты используеш для хранения ИДешника (4-х байтного) ИНТИГЕР- то- тебе его применять надо по особому!.. простой IntToStr - некатит... нужно применять WRITED(Integer) , а ты скорее всего применяеш хз как.. тот клочек кода что ты дал- тока запоминает..
1. Не пойму где ты IntToStr увидел :) ты вроде первый про него в теме вспомнил
2. Я клочка никакого не давал ;) а соответственно ничего и не применяю
3. и выыобще вы меня с кем-то путаете :)

Rubec
11.02.2008, 12:36
Народ есть вопрос может ли кто нибудь подсказать как сделать так чтобы вывести ХП сумонов в отдельном окне чтобы оно было поверх всех клиентов, как вырвать значение ХП не проблема

Grinch
12.02.2008, 22:13
я думаю эт ботва на уровне клиента и выципить окно... ну хз интересная идея а что за линейка поконкретней можно?

Добавлено спустя 1 день 8 часов 43 минуты 45 секунд:
проверяет принадлежность координат заданой зоне
const
Name='Ник перса тестера;
//первая координата квадрата
ax=-88370;
ay=142700;
az=3640;
//вторая координата квадрата
bx=-87427;
by=142700;
bz=-3640;
//третья координата квадрата
cx=-87427;
cy=141800;
cz=-3640;
//четвёртая координата квадрата
dx=-88368;
dy=141752;
dz=-3640;
var
mx, my: real;
MyID:integer;
pl,pl1,pl2,pl3,p2,p21,p22,p23:integer;
timer1 : TTimer;
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
procedure Init; //Вызывается при включении скрипта
begin
// дык таймер но он выключен он нам не нужен в этом скрипте, но мало ли
// timer1:=TTimer.Create(nil);
//timer1.OnTimer:=@OnTimer1;
// timer1.enabled:=false;//по начал не запускаем таймер, только по команде
//timer1.interval:=2000;// 2 секунды - начальный интервал таймера
end;
procedure InitStats;
begin
MyID:=ReadD(18);
Say('ID'+inttostr(MyID));
end;
procedure InitXYZ;
begin
mx:=ReadD(6);
my:=ReadD(10);
//нород если криво то помидорами не кидай те кто закодит для n угольника
//тому респект и уважуха, особенно если квадрат будет с возможность мёртвыъ координат внутри, но ет мат задача не для моих мозгов
//ет квадрат АБЦД
pl:=Ploshad(ax,ay,bx,by,cx,cy);
pl1:=Ploshad(mx,my,bx,by,cx,cy);
pl2:=Ploshad(ax,ay,mx,my,cx,cy);
pl3:=Ploshad(ax,ay,bx,by,mx,my);
p2:=Ploshad(ax,ay,dx,dy,cx,cy);
p21:=Ploshad(mx,my,dx,dy,cx,cy);
p22:=Ploshad(ax,ay,mx,my,cx,cy);
p23:=Ploshad(ax,ay,dx,dy,mx,my);
//проверяем условие принадлежиности наших координат к квадрату АБЦД
if (pl<pl1+pl2+pl3+50)and((pl>pl1+pl2+pl3-50))or (p2<p21+p22+p23+50)and((p2>p21+p22+p23-50)) then Say('Мы в квадрате!')
else Say('МЫ НЕ в квадрете!')


end;

function Ploshad(ax,ay,bx,by,cx,cy:real):integer;
var d1,d2,d3,per:real;
//описываем по какой то там формуле лощадь треугольника
begin
d1:=sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by)); // 1-я сторона (длина)
d2:=sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by)); // 2-я сторона (длина)
d3:=sqrt((ax-cx)*(ax-cx)+(ay-cy)*(ay-cy)); // 3-я сторона (длина)
per:=(d1+d2+d3)/2; // полуппериметр
Result:=Round(sqrt(per*(per-d1)*(per-d2)*(per-d3))); // считаем площадь
end;
procedure Free; //Вызывается при выключении скрипта
begin
//timer1.enabled:=false;
//timer1.Free;
end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit; //убераем пусты пакеты
//думаем о нашем ИД думаем...
if FromServer and (ConnectName=Name) and (pck[1]=#$04) then InitStats;
// думаем о координатах своих
if FromServer and (ConnectName=Name) and (pck[1]=#$01)and (ReadD(2)=myID) then InitXYZ;
end.

ЗЫ кто красивей может реализовать? и пригрузку констант из файла :) реализуйте плиз если б lQaKl за что ему респект большой, я б ето ещё неделю писал а так полтора дня думал над алгоритмом полтора дня писал lQaKl поправил за 10 минут и вот чудо, работает :beer:

Добавлено спустя 12 минут 57 секунд:
зы место теста забыл сказать Арена Глудин ПВП зона

QaK
13.02.2008, 08:28
if (pl<pl1+pl2+pl3+50)and((pl>pl1+pl2+pl3-50))or (p2<p21+p22+p23+50)and((p2>p21+p22+p23-50))
Многовато взял +-3 максимум

Grinch
13.02.2008, 08:36
дык он не сразу заработал у меня ж талант касячить норм код :) знаю что 3 достаточно

Добавлено спустя 3 минуты 23 секунды:
терь как бы его
pl:=Ploshad(ax,ay,bx,by,cx,cy);
pl1:=Ploshad(mx,my,bx,by,cx,cy);
pl2:=Ploshad(ax,ay,mx,my,cx,cy);
pl3:=Ploshad(ax,ay,bx,by,mx,my);
p2:=Ploshad(ax,ay,dx,dy,cx,cy);
p21:=Ploshad(mx,my,dx,dy,cx,cy);
p22:=Ploshad(ax,ay,mx,my,cx,cy);
p23:=Ploshad(ax,ay,dx,dy,mx,my);
if (pl<pl1+pl2+pl3+50)and((pl>pl1+pl2+pl3-50))or (p2<p21+p22+p23+50)and((p2>p21+p22+p23-50)) then Say('Мы в квадрате!')
else Say('МЫ НЕ в квадрете!')


покрасифше сделать что б треугольников н штук было просто с n Штук треугольниками можно горада забивать много времени на каждый город уйдёт, но их не бесконечное колличество :)

13.02.2008, 12:56
d1:=sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by)); // 1-я сторона (длина)
d2:=sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by)); // 2-я сторона (длина)
d3:=sqrt((ax-cx)*(ax-cx)+(ay-cy)*(ay-cy)); // 3-я сторона (длина)
per:=(d1+d2+d3)/2; // полуппериметр
Result:=Round(sqrt(per*(per-d1)*(per-d2)*(per-d3))); // считаем площадь
end;


Без всего этого можно обойтись и только целочисленной математикой, ищи алгоритмы целочисленной геометрии в интернете.

ASSA
13.02.2008, 18:57
(Скрипт для раскатывания рб в 4 окна и тд)
var
MOBID, partyLEADER: string;

begin
if FromServer and (ConnectName='BOT1') and (pck[1]=#$a7) then
begin
partyLEADER:=pck[6]+pck[7]+pck[8]+pck[9];
end;

begin
if FromServer and (ConnectName='BOT1') and (pck[1]=#$29)
and (pck[2]+pck[3]+pck[4]+pck[5]=partyLEADER)
then
begin
MOBID:=pck[6]+pck[7]+pck[8]+pck[9];
buf:=#$0a+MOBID+#$00+#$00+#$00+#$00;
SendToServerEx('BOT1');
SendToServerEx('BOT2');
SendToServerEx('BOT3');
SendToServerEx('BOT4');
pck:=''; //kill9em poket
end;

end;

end.

Grinch
13.02.2008, 20:17
d1:=sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by)); // 1-я сторона (длина)
d2:=sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by)); // 2-я сторона (длина)
d3:=sqrt((ax-cx)*(ax-cx)+(ay-cy)*(ay-cy)); // 3-я сторона (длина)
per:=(d1+d2+d3)/2; // полуппериметр
Result:=Round(sqrt(per*(per-d1)*(per-d2)*(per-d3))); // считаем площадь
end;


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

NLObP
13.02.2008, 21:41
чтоб пришел пакет UserInfo надо просто открыть и закрыть окно инвенторя в клиенте)
ЗЫ а чтоб это сам скрипт делал надо прост заставить его при запуске слать пакет запроса инвенторя, я его номер непомню, так что прост поймай его и шли когда нужно получить UserInfo

Вот это можно включить в процедуру INIT
//RequestItemList
buf:=hstr('0F');
SendToServerEx(Name);

Grinch
13.02.2008, 22:45
NLObP
не ты первый кто говорит об этом, но это пока начало кода бота возможно придётся ещё модернизировать чёнить а там ID сам проскочит, допустим в мониторинге сосок стрел и всякой ботвы :) мечтаю о таком скрипте хотя он почти готов на хп и цп подправить и гуд будет, а то у меня бывает в каче я робот :D соски заканчиваются неожидано особено у сумонеров 5к+ за баф в катах если и без пофа пп :) спириты вообще улетают так что цель есть :) next => :evil:

ASSA
14.02.2008, 12:40
Хочу вот попробовать убить РБ в 1 окно.
1- может пакетно увеличить скорость атаки или как бы атаковать много раз за 1-2 сек.
2- может для етого пакет юзеринфо или атаки брать???

QaK
14.02.2008, 13:28
Хочу вот попробовать убить РБ в 1 окно.1- может пакетно увеличить скорость атаки или как бы атаковать много раз за 1-2 сек.2- может для етого пакет юзеринфо или атаки брать???
1)Нет
2)Нет

as7
14.02.2008, 13:53
На основе скрипта автозаточки от NLObP
Попытался отредактировать скрипт под автокристаллизацию. Давно искал такой скрипт, но средствами Валкера он не реализуем в С6.
В природе его не существует (я потратив кучу времени лично не нашёл).

//Атоматизация кристаллизации предметов
//На полной основе "Автоматизация заточки предметов до необходимого уровня by NLObP"

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

//Enjoy!

//************************************************** ****************************
const
Name='ABC'; //заменить на имя своего чара
Weapon=6579; // ItemID Arcana Mace //что будем кристаллизовать
MaxEnchLvl=2; //max уровень заточки предмета, который не разрешаем ломать (типа защиты)
max=100; //max количество предметов в базе
var
// WpnObjID: array[1..maxwpn,1..maxwpn] of integer; //Weapon ObjID
WpnBase: array[1..2,1..max] of integer; //Weapon ObjID,lvl
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:=1000; //время задержки
Say('Для инициализации скрипта сделайте покупку (С6) или откройте инвентарь (С4)');
end;
//************************************************** ****************************
procedure Free; //Вызывается при выключении скрипта
begin
WpnBase:=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, ww, j, ObjID, ItemID, lvl, ListCount: integer;
begin
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
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; //для С6
end;
ColvoWpn:=ww-1;
Say('>ColvoWpn='+IntToStr(ColvoWpn)+' CurEnchLvl='+IntToStr(CurEnchLvl));
end;
//************************************************** ****************************
procedure UpdateItemBase; //пакет 27, Создает базу ObjectID по ItemID
var
i, ii, j, 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;
end;
2:case ItemID of
weapon:
for ii:=1 to max do
if WpnBase[1,ii]=ObjID then WpnBase[2,ii]:=lvl;
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;
end;
end;
//j:=j+2; //для С4
j:=j+10; //для С6 //следующее смещение для действия с предметом 1-добавлен 2-изменен 3-удален
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;
//************************************************** ****************************
procedure UseItem(ObjectID: integer);
begin
buf:=#$72;
WriteD(ObjectID);
WriteD(01);
WriteD(00);
WriteD(00);
SendToServerEx(Name);
end;
//************************************************** ****************************
procedure OnTimerHP(Sender: TObject);
var
wpn :integer;
begin
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(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.

Как это не странно, но скрипт работает.
Прошу мну не пинать, учитывая, что это первая программа в моей жизни (ну очень нужна была!).
Если автор исходника посчитает, что я как-то задел его профессиональные чувства - пусть удалит её!

Rubec
15.02.2008, 11:39
Объясните для тупых для чего этот скрипт???

const
Name='Ник перса тестера;
//первая координата квадрата
ax=-88370;
ay=142700;
az=3640;
//вторая координата квадрата
bx=-87427;
by=142700;
bz=-3640;
//третья координата квадрата
cx=-87427;
cy=141800;
cz=-3640;
//четвёртая координата квадрата
dx=-88368;
dy=141752;
dz=-3640;
var
mx, my: real;
MyID:integer;
pl,pl1,pl2,pl3,p2,p21,p22,p23:integer;
timer1 : TTimer;
procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
procedure Init; //Вызывается при включении скрипта
begin
// дык таймер но он выключен он нам не нужен в этом скрипте, но мало ли
// timer1:=TTimer.Create(nil);
//timer1.OnTimer:=@OnTimer1;
// timer1.enabled:=false;//по начал не запускаем таймер, только по команде
//timer1.interval:=2000;// 2 секунды - начальный интервал таймера
end;
procedure InitStats;
begin
MyID:=ReadD(18);
Say('ID'+inttostr(MyID));
end;
procedure InitXYZ;
begin
mx:=ReadD(6);
my:=ReadD(10);
//нород если криво то помидорами не кидай те кто закодит для n угольника
//тому респект и уважуха, особенно если квадрат будет с возможность мёртвыъ координат внутри, но ет мат задача не для моих мозгов
//ет квадрат АБЦД
pl:=Ploshad(ax,ay,bx,by,cx,cy);
pl1:=Ploshad(mx,my,bx,by,cx,cy);
pl2:=Ploshad(ax,ay,mx,my,cx,cy);
pl3:=Ploshad(ax,ay,bx,by,mx,my);
p2:=Ploshad(ax,ay,dx,dy,cx,cy);
p21:=Ploshad(mx,my,dx,dy,cx,cy);
p22:=Ploshad(ax,ay,mx,my,cx,cy);
p23:=Ploshad(ax,ay,dx,dy,mx,my);
//проверяем условие принадлежиности наших координат к квадрату АБЦД
if (pl<pl1+pl2+pl3+50)and((pl>pl1+pl2+pl3-50))or (p2<p21+p22+p23+50)and((p2>p21+p22+p23-50)) then Say('Мы в квадрате!')
else Say('МЫ НЕ в квадрете!')


end;

function Ploshad(ax,ay,bx,by,cx,cy:real):integer;
var d1,d2,d3,per:real;
//описываем по какой то там формуле лощадь треугольника
begin
d1:=sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by)); // 1-я сторона (длина)
d2:=sqrt((cx-bx)*(cx-bx)+(cy-by)*(cy-by)); // 2-я сторона (длина)
d3:=sqrt((ax-cx)*(ax-cx)+(ay-cy)*(ay-cy)); // 3-я сторона (длина)
per:=(d1+d2+d3)/2; // полуппериметр
Result:=Round(sqrt(per*(per-d1)*(per-d2)*(per-d3))); // считаем площадь
end;
procedure Free; //Вызывается при выключении скрипта
begin
//timer1.enabled:=false;
//timer1.Free;
end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit; //убераем пусты пакеты
//думаем о нашем ИД думаем...
if FromServer and (ConnectName=Name) and (pck[1]=#$04) then InitStats;
// думаем о координатах своих
if FromServer and (ConnectName=Name) and (pck[1]=#$01)and (ReadD(2)=myID) then InitXYZ;
end.

QaK
15.02.2008, 11:55
Объясните для тупых для чего этот скрипт???
Это скрипт для проверки находится ли свой перс в прямоугольнике, заданном координатами 4х точек.

ASSA
15.02.2008, 17:04
Хочу вот попробовать убить РБ в 1 окно.1- может пакетно увеличить скорость атаки или как бы атаковать много раз за 1-2 сек.2- может для етого пакет юзеринфо или атаки брать???
1)Нет
2)Нет


ДЫК ведь можно попробовать, как со СЛИПом(там задержку на повторное накладывание можно убирать)..
Лана я пробону, мож получится че-нить подобное :oops:

xkor
16.02.2008, 12:36
1 - бред ибо низя
2 - аналогично...