Показать сообщение отдельно
Старый 07.03.2008, 21:07   #285
Гость
 
Сообщений: n/a
По умолчанию АвтоСвип

Всем привет. Вот наконец доделал и протестил АвтоСвип.
Зацените мой первый скриптец. Если какие ошибки найдете, пишите.
Код:
//Автоматизация sweep'а by APXAHGEJI
//Свип производится тока при условии что моб был ,хоть один раз, ударен ВАМИ и
//находится в списке нужных мобов.
//Возможность работы нескольких одновременных скриптов
//Социальное действие YES - запусстить/приостановить запись/АвтоСвип мобов
//Социальное действие NO остановиться - завершить запись мобов и перейтии к АвтоСвип
//После того как скрипт запущен нажимаете Yes и атакуете по одному мобу каждого
//вида которых собираетесь спойлить. Атакуете до тех пор пока не появилась запись
//что моб записан. Для удобства процесс записи можно приостановить нажатие той же
//клавиши Yes. После того как все нужные мобы записаны жмакаете NO, запись мобов
//завершается, АвтоСвип запускается, можете приступать к спойлу. АвтоСвип можно
//приостановить нажав всю туже клавишу соцдействия Yes, но запись мобов под АвтоСвип
//не остановится, и снова активировав, все нужные мобы просвипятся.

Const
  Name='Yes';
  Sweep='2F 2A 00 00 00 00 00 00 00 00';
Var
  Timer: TTimer;
  N,M,i,NpcNum: Byte;
  X,Y,Z,CharID: Integer;
  NpcTypeID,TargetID: array of Integer;
  NeedSweep,Dead: array of Boolean;
  Switch,SaveID,HaveNpc,OffSweeper: Boolean;
//******************************************************************************
//                      Вызывается при включении скрипта
//******************************************************************************
Procedure Init;
begin
  N:= 1;
  M:= 0;
  Switch:= False;
  SaveID:= True;
  SetLength( NpcTypeID, N );
  SetLength( TargetID, N );
  Timer:=TTimer.Create(nil);
  Timer.OnTimer:=@Sweeper;
  Timer.Enabled:= False;
  Timer.Interval:= 500;//время задержки свипа
  Say('Введите 1 в чат, чтобы начать/приостановить');
  Say('запись мобов или АвтоСвип.');
  Say('Введите 2 в чат, чтобы завершить запись мобов');
  Say('и приступить к сполйу.');
end;
//******************************************************************************

//******************************************************************************
//                        Вызывается при выключении скрипта
//******************************************************************************
Procedure Free;
begin
  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 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
  OffSweeper:= True;
  For i:=0 to (M-1) do begin
    If NeedSweep[i] and Dead[i] then begin
      If Switch then begin
        buf:= #$04;
        WriteD(TargetID[i]);
        WriteD(X);
        WriteD(Y);
        WriteD(Z);
        WriteC(00);
        SendToServerEx(Name);
        buf:=HStr(Sweep);
        SendToServerEx(Name);
      end;
      exit;
    end;
    If (TargetID[i]<>0) then OffSweeper:= False;
  end;
  If OffSweeper then begin
    M:= 0;
    SetLength(TargetID, M);
    SetLength(NeedSweep, M);
    SetLength(Dead, M);
    Timer.Enabled:= False;
    exit;
  end;
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
          if (ReadD(6)<>TargetID[N-1]) then TargetID[N-1]:= ReadD(6);
        if (pck[1]=#$16) and (ReadD(2)=TargetID[N-1]) then
          if (ReadD(6)<> NpcTypeID[N-1]) then begin
            NpcTypeID[N-1]:= ReadD(6);
            Inc(N);
            SetLength( NpcTypeID, N );
            SetLength( TargetID, N );
            TargetID[N-1]:= TargetID[N-2];
            NpcTypeID[N-1]:= NpcTypeID[N-2];
            Say('Моб записан');
          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);
        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;
            Timer.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:='';
        Switch:= False;
        Say('АвтоСвип приостановлен');
      end
      else begin
        pck:='';
        Switch:= True;
        Say('АвтоСвип запущен');
      end;
    //**************************************************************************
  end;
  //****************************************************************************
End.
//******************************************************************************
  Ответить с цитированием