Показать сообщение отдельно
Старый 16.03.2008, 10:12   #298
Пользователь
 
Аватар для APXAHGEJI
 
Регистрация: 08.03.2008
Сообщений: 77
Сказал Спасибо: 31
Имеет 19 спасибок в 15 сообщенях
APXAHGEJI
По умолчанию

Слегка поправил выложенный ранее АвтоСвип. Упростил запись мобов, свипает стабильнее.
Код:
//Автоматизация 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.
//******************************************************************************
Добавлено спустя 5 минут 19 секунд:
И кстати у меня еще вопросик назрел.
Мне крайне ненравятся все эти извращения с вводом чего либо в чат или использования соцдействия.
Нельзяли аткивировать некоторый код при нажатии ,например, клавиши W?
APXAHGEJI вне форума   Ответить с цитированием
За это сообщение APXAHGEJI нажился спасибкой от: