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
Воспользовался
и он сбивает весь скрипт, на реколе выдает на процедуру рекола
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
Все ивенты выполняются последовательно, не параллельно. Поэтому тяжелые, долгие вещи в них не стоит пихать вообще.