короче я сделал сюда пару строчек чтобы спойлить можно было для этого надо ещё запустить скрипт (был выложен в да будет бот)
delphi Код:
//Автоматизация sweep'а by APXAHGEJI
//Свип производится тока при условии что моб был ,хоть один раз, ударен ВАМИ и
//находится в списке нужных мобов.
//Возможность работы нескольких одновременных скриптов
//Социальное действие YES - запусстить/приостановить запись/АвтоСвип мобов
//Социальное действие NO остановиться - завершить запись мобов и перейтии к АвтоСвип
//После того как скрипт запущен нажимаете Yes и атакуете мобов
//которых собираетесь спойлить. Атакуете до тех пор пока не появилась запись
//что моб записан. Для удобства процесс записи можно приостановить нажатие той же
//клавиши Yes. После того как все нужные мобы записаны жмакаете NO, запись мобов
//завершается, АвтоСвип запускается, можете приступать к спойлу. АвтоСвип можно
//приостановить нажав всю туже клавишу соцдействия Yes, но запись мобов под АвтоСвип
//не остановится, и снова активировав, все нужные мобы просвипятся.
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.
//******************************************************************************
этот скрипт запускаем настраиваем
а в боте незабудкина процедуру phisicalattack меняем на вот такую
delphi Код:
procedure PhisicalAttack; // команда атаки
var
ppp1: integer;
begin
buf:=#$04; //action
WriteD(TargetID);
WriteD(MyX);
WriteD(MyY);
WriteD(MyZ);
WriteC(0);
SendToServerEx(NickName);
if ppp1 = targetid then begin
ppp1:= targetid
end
else
begin
buf:=HStr('2F FE 00 00 00 00 00 00 00 00'); //spoil
SendToServerEx(NickName);
End;
ppp1:= targetid
end;
всё работает кидает спойл на моба 1 раз а другой крипт свипит