Page 1 of 1

SetEventProc (ивенты). Нужна помощь

Posted: 22.11.2019 2:53
by Stels
Подскажите, можно ли как-то через ивенты отслеживать свои хп?
К примеру, копаю в шахте, вылез элементаль и стал меня бить, чар бьет в ответ на автомате. Необходимо лечиться бинтами :) отследить, что на меня напали не выходит, т.к. он нападает без надписи атаки.

Re: SetEventProc (ивенты). Нужна помощь

Posted: 22.11.2019 21:10
by Vizit0r
есть например ивент evAttack

Re: SetEventProc (ивенты). Нужна помощь

Posted: 22.11.2019 21:35
by Stels
Vizit0r wrote:есть например ивент evAttack
я уже смотрел на него, но немного не понял - он возвращает если на меня напали или если у меня вар мод включился и я на кого-то нападаю?

Re: SetEventProc (ивенты). Нужна помощь

Posted: 22.11.2019 22:36
by drabadan
Stels wrote:
Vizit0r wrote:есть например ивент evAttack
я уже смотрел на него, но немного не понял - он возвращает если на меня напали или если у меня вар мод включился и я на кого-то нападаю?
вроде как был evTimer внутри которого можно чекать свое хп и прочую лабуду типа вармода. Как только что-то не так, мы отписываемся от ивента делаем свои грязные дела и подписываемся назад.

Re: SetEventProc (ивенты). Нужна помощь

Posted: 23.11.2019 16:35
by Stels
Воспользовался

Code: Select all

SetEventProc(evTimer1,'fight')
и он сбивает весь скрипт, на реколе выдает на процедуру рекола
PS Internal error: Out Of Range.

вот то, что находится в ивенте

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;
Раньше просто никогда не работал с ивентами, может что не так делаю? :)

Re: SetEventProc (ивенты). Нужна помощь

Posted: 24.11.2019 11:20
by Stels
Такс, с этой проблемой разобрался. Пожскажите, а как отписаться от ивента?

Re: SetEventProc (ивенты). Нужна помощь

Posted: 24.11.2019 11:26
by Stels
Я правильно понял, что нужно пустой указать внутри ивента, и в конце заново его назначить?

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;

Re: SetEventProc (ивенты). Нужна помощь

Posted: 24.11.2019 17:19
by drabadan
да, специфика ивентов в том что ето "команда" что то делать, какой то триггер. Я бы вынул "отписку" из цикла вайл, в целом ты мог бы написать метод в котором просто чекал условия и в зависимости от условий запускал тот или иной коллбек. Типа там каждые 100 мс проверить вес проверить координаты и еще какуюнить дичь, в зависимости от результатов отписываться и выполнять обработчик.

Re: SetEventProc (ивенты). Нужна помощь

Posted: 24.11.2019 17:29
by Stels
ну я решил сделать проще, создал два таймера, один на определение врага, а второй на хиллинг. и подписку и одписку соотвтетвенно переместил. Благодарю за помощь, вроде работает))

Re: SetEventProc (ивенты). Нужна помощь

Posted: 24.11.2019 17:30
by Stels
ну я решил сделать проще, создал два таймера, один на определение врага, а второй на хиллинг. и подписку и одписку соотвтетвенно переместил. Благодарю за помощь, вроде работает))

Re: SetEventProc (ивенты). Нужна помощь

Posted: 25.11.2019 14:01
by Stels
Появился вопрос:
Когда входит в 1 таймер, отписывается и начинает выполнять процедуру, второй таймер не работает, не обрабатывается... как можно это обойти?

Re: SetEventProc (ивенты). Нужна помощь

Posted: 26.11.2019 10:07
by drabadan

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;
П.С. Синтаксис мог забыть, так что ето просто идея а не реализация.

Таймеры лучше понимать как, что то "на крайний" случай чтоб уже там совсем воот вообще никак без него. ИМХО конечно.

Re: SetEventProc (ивенты). Нужна помощь

Posted: 02.12.2019 19:47
by Vizit0r
Все ивенты выполняются последовательно, не параллельно. Поэтому тяжелые, долгие вещи в них не стоит пихать вообще.