Код
Const
Name='*****';
Sweep='2F 2A 00 00 00 00 00 00 00 00';
Var
TimerSweep,TimerDel: TTimer;
N,M,i,NpcNum: Byte;
X,Y,Z,CharID: Integer;
NpcTypeID,TargetID: array of Integer;
NeedSweep,Dead: array of Boolean;
Switch,SaveID,HaveNpc: Boolean;
//************************************************** ****************************
// Вызывается при включении скрипта
//************************************************** ****************************
Procedure Init;
begin
N:= 1;
M:= 1;
Switch:= False;
SaveID:= True;
SetLength( NpcTypeID, N );
SetLength( TargetID, N );
TimerSweep:=TTimer.Create(nil);
TimerSweep.OnTimer:=@Sweeper;
TimerSweep.Enabled:= False;
TimerSweep.Interval:= 1000;
TimerDel:=TTimer.Create(nil);
TimerDel.OnTimer:=@Del;
TimerDel.Enabled:= False;
TimerDel.Interval:= 5000;
Say('Нажмите Yes, чтобы начать/приостановить');
Say('запись мобов или АвтоСвип.');
Say('Нажмите No, чтобы завершить запись мобов');
Say('и приступить к сполйу.');
end;
//************************************************** ****************************
//************************************************** ****************************
// Вызывается при выключении скрипта
//************************************************** ****************************
Procedure Free;
begin
TimerSweep.Free;
TimerDel.Free;
end;
//************************************************** ****************************
//************************************************** ****************************
// Посылаем сообщение, которое видно только в окне бота
//************************************************** ****************************
Procedure Say(msg:string);
begin
buf:=hstr('4A 00 00 00 00');
WriteD(2);
WriteS(Name);
WriteS(msg);
SendToClientEx(Name);
end;
//************************************************** ****************************
//************************************************** ****************************
// Проверка наличия ИД моба в массиве
//************************************************** ****************************
Procedure FindMob(ObjectID: Integer);
begin
HaveNpc:= False;
NpcNum:= M;
For i:=0 to (M-1) do
If (ObjectID=TargetID[i]) then begin
NpcNum:= i;
HaveNpc:= True;
break;
end Else
If (TargetID[i]= 0) and (NpcNum = M) then NpcNum:= i;
end;
//************************************************** ****************************
//************************************************** ****************************
// Запуск свипа каждые n секунд (n= Timer.Interval)
//************************************************** ****************************
Procedure Sweeper(Sender: TObject);
begin
For i:=0 to (M-1) do
If NeedSweep[i] and Dead[i] then begin
buf:= #$04;
WriteD(TargetID[i]);
WriteD(X);
WriteD(Y);
WriteD(Z);
WriteC(00);
SendToServerEx(Name);
buf:=HStr(Sweep);
SendToServerEx(Name);
NeedSweep[i]:= False;
exit;
end;
end;
//************************************************** ****************************
//************************************************** ****************************
//Удаление списка при отстуствии записей о мобах
//************************************************** ****************************
Procedure Del(Sender: TObject);
begin
For i:=0 to (M-1) do
If (TargetID[i]<>0) then exit;
M:= 0;
SetLength(TargetID, M);
SetLength(NeedSweep, M);
SetLength(Dead, M);
TimerDel.Enabled:= False;
TimerSweep.Enabled:= False;
end;
//************************************************** ****************************
//************************************************** ****************************
// Вызывается при приходе каждого пакета, если скрипт включен
//************************************************** ****************************
Begin
//************************************************** **************************
//Не обрабатываем пустые пакеты
If pck='' then exit;
//************************************************** **************************
//************************************************** **************************
//Если от сервака принят пакет UserInfo. Запоминаем собственный ИД.
If FromServer and (ConnectName=Name) and (pck[1]=#$04) then CharID:= ReadD(18);
//************************************************** **************************
//************************************************** **************************
//Переключение между записью ИД и АвтоСвипом
If SaveID then begin
//************************************************** ************************
//Делаем выборку нужных для свипа видов мобов
//************************************************** ************************
if Switch then
if FromServer and (ConnectName=Name) then
if (pck[1]=#$05) and (ReadD(2)=CharID) then begin
FindMob(ReadD(6));
If not HaveNpc then begin
TargetID[N-1]:= ReadD(6);
Inc(M);
SetLength( TargetID, M );
end;
end;
If (pck[1]=#$16) then
For i:=0 to (M-1) do
if (ReadD(2) = TargetID[i]) then begin
For NpcNum:= 0 to (N-1) do
If (ReadD(6)= NpcTypeID[NpcNum]) then exit;
NpcTypeID[N-1]:= ReadD(6);
Say(IntToStr(N)+' вид мобов записан');
Inc(N);
SetLength( NpcTypeID, N );
exit;
end;
//************************************************** ************************
//Управление записью мобов
//************************************************** ************************
If FromClient and (ConnectName=Name) and (pck[1]=#$1B) then begin
If (ReadD(2)=6) then
if Switch then begin
pck:='';
Switch:= False;
Say('Запись мобов приостановлена');
end
else begin
pck:='';
Switch:= True;
Say('Начата запись мобов, атакуйте нужных мобов');
end;
If (ReadD(2)=5) then begin
pck:='';
Dec(N);
M:= 0;
SetLength(NpcTypeID, N);
SetLength(TargetID, M);
SetLength(NeedSweep, M);
SetLength(Dead, M);
SaveID:= False;
Switch:= True;
Say('Запись мобов завершена, АвтоСвип активирован');
Say('Удачного спойла');
end;
end;
//************************************************** ************************
end
//************************************************** **************************
//************************************************** **************************
//Переходим от записи нужных мобов к АвтоСвипу
Else begin
//************************************************** **************************
//************************************************** ************************
//Записываем текущие координаты
if FromClient and (ConnectName=Name) and (pck[1]=#$48) then begin
X:= ReadD(2);
Y:= ReadD(6);
Z:= ReadD(10);
end;
//************************************************** ************************
//************************************************** ************************
//Анализ мобов :=))
If FromServer and (ConnectName=Name) then begin
//************************************************** **********************
//Записываем всех атакованых нами мобов (пакет Attack, причем Attacker=CharID)
If ((pck[1]= #$05) and (ReadD(2)= CharID)) then begin
FindMob(ReadD(6));
If not HaveNpc then
If (NpcNum <> M) then begin
TargetID[NpcNum]:= ReadD(6);
NeedSweep[NpcNum]:= False;
Dead[NpcNum]:= False
end Else begin
Inc(M);
SetLength(TargetID, M);
SetLength(NeedSweep, M);
SetLength(Dead, M);
TargetID[M-1]:= ReadD(6);
NeedSweep[M-1]:= False;
Dead[M-1]:= False;
If Switch then TimerSweep.Enabled:= True;
TimerDel.Enabled:= True;
end;
end;
//************************************************** **********************
//Проверяем есть ли в списке мобы
if (M <> 0) then begin
//************************************************** ********************
//Проверяем тот ли вид моба атакован (пакет NpcInfo)
If (pck[1]= #$16) then begin
FindMob(ReadD(2));
If HaveNpc and (not NeedSweep[NpcNum]) then begin
For i:=0 to (N-1) do
If (ReadD(6)= NpcTypeID[i]) then begin
HaveNpc:= False;
Break;
end;
If not HaveNpc then NeedSweep[NpcNum]:= True;
end;
end;
//************************************************** ********************
//Записываем что атакованый моб умер (пакет Die, причем Sweepable=1)
If (pck[1]= #$06) and (pck[22]= #$01) then begin
FindMob(ReadD(2));
If HaveNpc then Dead[NpcNum]:= True;
end;
//************************************************** ********************
//Удаляем записи об атакованом мобе (пакет DeleteObject)
If (pck[1]= #$12) then begin
FindMob(ReadD(2));
If HaveNpc then begin
TargetID[NpcNum]:= 0;
NeedSweep[NpcNum]:= False;
Dead[NpcNum]:= False;
end;
end;
//************************************************** ********************
end;
//************************************************** **********************
end;
//************************************************** ************************
//************************************************** ************************
//Запускаем/приостанавливаем АвтоСвип
//************************************************** ************************
If FromClient and (ConnectName=Name) and (pck[1]=#$1B) and (ReadD(2)=6) then
if Switch then begin
pck:='';
TimerSweep.Enabled:= False;
Switch:= False;
Say('АвтоСвип приостановлен');
end
else begin
pck:='';
TimerSweep.Enabled:= True;
Switch:= True;
Say('АвтоСвип запущен');
end;
//************************************************** ************************
end;
//************************************************** **************************
End.