Показать сообщение отдельно
Старый 01.06.2010, 14:17   #43
Новичок
 
Регистрация: 03.01.2009
Сообщений: 12
Сказал Спасибо: 4
Имеет 1 спасибку в 1 сообщении
Rifleman пока неопределено
Сообщение Макрос средствами пакетхака

Решил выложить свою разработку. Может, кому пригодится. Для Hellbound'а.
Суть кода: В массиве задаётся последовательность действий, это может быть просто пакет в формате строки (например '39 2A 01 00 00 00 00 00 00 00'), либо какая-то спец команда (например 'Attack').
Далее, по таймеру считываются последовательно строки массива, и то, что там записано отправляется на выполнение. Т.к. время на выполнение скилла может быть различное в зависимости от ситуации, то для такого случая я ввёл динамически изменяющееся время у таймера. Как только от серва приходит пакет с использованием скилла, скрипт считывает время использования и задаёт его таймеру + некоторая поправка.
Код:
Const
   NICK='Указываете ваш ник';
var
 tmrActions:  TTimer; // Таймер для последовательность действий
 Actions:    Array[0..10, 0..2] of String;  //Массив действий. 
{Записываются в ячейки массива пакеты, которые нужно послать. Далее, по таймеру посылается следующий пакет из списка.
 Первый индекс массива - номер действия, второй индекс: 
 0 - собственно действие, 1 - Параметр действия (напр. Ид скилла), 2 - время таймера до следующего действия
}
 MyID, : Integer;
 NumAct:     Integer; // Номер текущего действия
 IsSkill: Boolean; // Показывает, используем ли мы скилл в данный момент

Procedure UseSkill(ID: Integer); // Процедура использования скилла
begin
  buf:=#$39;
  WriteD(ID);
  WriteD(0);
  WriteC(0);
  SendToServerEX(NICK);
end;

Procedure OntmrAction(Sender: TObject); 
begin
   Case Actions[NumAct, 0] of // Сдесь мы определяем тип действия.
   'Attack': begin // Атаковать текущую цель
                
             end;

   'Use':    begin // Использование предмета
                UseItem(StrToInt(Actions[NumAct, 1])); // Эта процедура может быть разная, потому не привожу
             end;

   'Skill':  begin // Использование скилла
                UseSkill(StrToInt(Actions[NumAct, 1]));
                IsSkill:= True;
             end;
   '-1':     begin // Останов макроса
                NumAct:=0;
                tmrActions.Enabled:=False;
                Times:=0;
                exit;
             end;
   else begin // Если же не приведена внутренняя команда, то просто отсылаем пакет
                buf:= Hstr(Actions[NumAct, 0]); 
                SendToServerEX(NICK);
        end;
   end;
   NumAct:= NumAct+1; 
   If (IsSkill=False) then tmrActions.Interval:= StrToInt(Actions[NumAct, 2]); // Изменяем время у таймера до следующего пункта
   //В случае скилла время изменяется считыванием нужного пакета
end;

procedure Init; //Вызывается при включении скрипта
begin
  tmrActions:= TTimer.Create(nil);
  tmrActions.OnTimer:= @OntmrAction;
  tmrActions.Enabled:= False;
  tmrActions.Interval:= 200;

  // 6590 - Angel Slayer
  // 6602 - Demon Splinter  (один из ))))
  // 425 - Hawk Spirit Totem
  // Макрос представляет из себя: Одеть Сплинтеры, потом юзнуть Хавка, одеть АС, начать атаку
  Actions[0, 0]:='Use';
  Actions[0, 1]:='6602';
  Actions[0, 2]:='300';  // Задаём время до следующего пункта, в мс

  Actions[1, 0]:='Skill';
  Actions[1, 1]:='425';
  Actions[1, 2]:='2000'; // В принципе, можно и не ставить

  Actions[2, 0]:='Use';
  Actions[2, 1]:='6590';
  Actions[2, 2]:='300';

  Actions[3, 0]:='Attack';
  Actions[3, 1]:='';
  Actions[3, 2]:='300';

  Actions[4, 0]:='-1';

  MyID:= -1;
end;

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

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

  if FromServer and (ConnectName=NICK) then case pck[1] of
    #$32: Begin    // User Info
             If (MyID <> -1) then exit;
             MyID:=ReadD(18); // запоминаем наш ИД
          end;
    #$11: begin;  // Инвентаризация барахла в карманах
             InventoryCreate; // Инвентаризацию берите, какая удобнее
          end;
    #$21: Begin  // Обновление инвентаря
             InventoryUpdate;
          End;
    #$48: begin // MagicSkillUse 
             If (ReadD(2)<>MyID) Or (IsSkill=False) then Exit; // Если не мы юзаем - не обрабатываем
             tmrActions.Interval:= ReadD(18)+100; // Изменяем время у таймера с учётом времени произношения скилла, 100 - небольшая добавка, чтоб лучше работало
             IsSkill:= False;
          end;
  end;
end.
P.S. Из кода выкинул весь мусор, что мне был нужен, просьба очень "внимательно следить за запятыми в десятичных дробях" ©Р. Хайнлайн

Последний раз редактировалось Rifleman, 01.06.2010 в 14:33.
Rifleman вне форума   Ответить с цитированием
За это сообщение Rifleman нажился спасибкой от: