Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

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

тут можно задать вопрос по скриптингу
Post Reply
Stels
Novice
Novice
Posts: 118
Joined: 15.02.2011 12:15

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

Post by Stels »

Подскажите, можно ли как-то через ивенты отслеживать свои хп?
К примеру, копаю в шахте, вылез элементаль и стал меня бить, чар бьет в ответ на автомате. Необходимо лечиться бинтами :) отследить, что на меня напали не выходит, т.к. он нападает без надписи атаки.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

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

Post by Vizit0r »

есть например ивент evAttack
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Stels
Novice
Novice
Posts: 118
Joined: 15.02.2011 12:15

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

Post by Stels »

Vizit0r wrote:есть например ивент evAttack
я уже смотрел на него, но немного не понял - он возвращает если на меня напали или если у меня вар мод включился и я на кого-то нападаю?
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

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

Post by drabadan »

Stels wrote:
Vizit0r wrote:есть например ивент evAttack
я уже смотрел на него, но немного не понял - он возвращает если на меня напали или если у меня вар мод включился и я на кого-то нападаю?
вроде как был evTimer внутри которого можно чекать свое хп и прочую лабуду типа вармода. Как только что-то не так, мы отписываемся от ивента делаем свои грязные дела и подписываемся назад.
Stels
Novice
Novice
Posts: 118
Joined: 15.02.2011 12:15

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

Post 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;
Раньше просто никогда не работал с ивентами, может что не так делаю? :)
Stels
Novice
Novice
Posts: 118
Joined: 15.02.2011 12:15

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

Post by Stels »

Такс, с этой проблемой разобрался. Пожскажите, а как отписаться от ивента?
Stels
Novice
Novice
Posts: 118
Joined: 15.02.2011 12:15

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

Post 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;
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

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

Post by drabadan »

да, специфика ивентов в том что ето "команда" что то делать, какой то триггер. Я бы вынул "отписку" из цикла вайл, в целом ты мог бы написать метод в котором просто чекал условия и в зависимости от условий запускал тот или иной коллбек. Типа там каждые 100 мс проверить вес проверить координаты и еще какуюнить дичь, в зависимости от результатов отписываться и выполнять обработчик.
Stels
Novice
Novice
Posts: 118
Joined: 15.02.2011 12:15

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

Post by Stels »

ну я решил сделать проще, создал два таймера, один на определение врага, а второй на хиллинг. и подписку и одписку соотвтетвенно переместил. Благодарю за помощь, вроде работает))
Last edited by Stels on 24.11.2019 20:50, edited 1 time in total.
Stels
Novice
Novice
Posts: 118
Joined: 15.02.2011 12:15

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

Post by Stels »

ну я решил сделать проще, создал два таймера, один на определение врага, а второй на хиллинг. и подписку и одписку соотвтетвенно переместил. Благодарю за помощь, вроде работает))
Stels
Novice
Novice
Posts: 118
Joined: 15.02.2011 12:15

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

Post by Stels »

Появился вопрос:
Когда входит в 1 таймер, отписывается и начинает выполнять процедуру, второй таймер не работает, не обрабатывается... как можно это обойти?
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

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

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

Таймеры лучше понимать как, что то "на крайний" случай чтоб уже там совсем воот вообще никак без него. ИМХО конечно.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

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

Post by Vizit0r »

Все ивенты выполняются последовательно, не параллельно. Поэтому тяжелые, долгие вещи в них не стоит пихать вообще.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Post Reply