Решил выложить свою разработку. Может, кому пригодится. Для 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. Из кода выкинул весь мусор, что мне был нужен, просьба очень "внимательно следить за запятыми в десятичных дробях" ©Р. Хайнлайн