К примеру, копаю в шахте, вылез элементаль и стал меня бить, чар бьет в ответ на автомате. Необходимо лечиться бинтами
 отследить, что на меня напали не выходит, т.к. он нападает без надписи атаки.
 отследить, что на меня напали не выходит, т.к. он нападает без надписи атаки. отследить, что на меня напали не выходит, т.к. он нападает без надписи атаки.
 отследить, что на меня напали не выходит, т.к. он нападает без надписи атаки.я уже смотрел на него, но немного не понял - он возвращает если на меня напали или если у меня вар мод включился и я на кого-то нападаю?Vizit0r wrote:есть например ивент evAttack
вроде как был evTimer внутри которого можно чекать свое хп и прочую лабуду типа вармода. Как только что-то не так, мы отписываемся от ивента делаем свои грязные дела и подписываемся назад.Stels wrote:я уже смотрел на него, но немного не понял - он возвращает если на меня напали или если у меня вар мод включился и я на кого-то нападаю?Vizit0r wrote:есть например ивент evAttack
Code: Select all
SetEventProc(evTimer1,'fight')Code: Select all
Procedure fight;
var Elemental: Array of Cardinal;
j: integer;
Elem: cardinal; 
begin
 Elemental := [$0070,$0071,$006E,$006D,$00A6,$006F,$006B,$006C];  //Тип элементалей
 for j:=0 to (GetArrayLength(Elemental)-1) do
  begin
    while FindType(Elemental[j],Ground) <> 0 do
      begin 
        AddToSystemJournal('Охота на элементаля началась!');
        if GetDistance(FindItem) < distance  then      
            begin
                distance := GetDistance(FindItem);
                Elem := FindItem;
                setWarMode(true);
                Attack(Elem);
                NewMoveXY(GetX(Elem),GetY(Elem),true,1,true);
            end;
        if (gethp(self) < (getmaxhp(self))) and not dead then
            begin 
                UoSay('[BandSelf]');
                checklag(LagMs);
                wait(6000);    
            end;
        wait(100);
      end;
    wait(100);
    if dead then figh:=0;
  end;
  figh:= 1;
  if WarMode then setWarMode(false);
end;
Code: Select all
Procedure fight;
var Elemental: Array of Cardinal;
j: integer;
Elem: cardinal; 
begin
 Elemental := [$0070,$0071,$006E,$006D,$00A6,$006F,$006B,$006C];  //Тип элементалей
 for j:=0 to (GetArrayLength(Elemental)-1) do
  begin
    while FindType(Elemental[j],Ground) <> 0 do
      begin
        SetEventProc(evTimer1,' '); 
        AddToSystemJournal('Охота на элементаля началась!');
        if (gethp(self) < (getmaxhp(self))) and not dead then
            begin 
                UoSay('[BandSelf]');
                checklag(LagMs);
                wait(6000);    
            end;
        if GetDistance(FindItem) < distance  then      
            begin
                distance := GetDistance(FindItem);
                Elem := FindItem;
                setWarMode(true);
                Attack(Elem);
                NewMoveXY(GetX(Elem),GetY(Elem),true,1,true);
            end;
        wait(100);
      end;
    //wait(100);
    if dead then figh:=0;
  end;
  figh:= 1;
  if WarMode then setWarMode(false);
  SetEventProc(evTimer1,'fight');
end;Code: Select all
const minWait = 100;
// Ето вставляем вместо стандартных вейтов в скрипте
CheckWaitLag(3000);
procedure CheckWaitLag(durationMS: Integer);
var i, count: Integer;
begin
  count := durationMS / minWait;
  for i := 0 to count-1 do
    if (CheckLag(30000)) then
       begin
          // Будет намного лучше чекать все потенциальные проблемы тут
          // Так как у тебя в 100 раз больше контроля по выполнению коллбеков
          Wait(minWait);
       end
    else 
       Beep;
end;