Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7
SetEventProc (ивенты). Нужна помощь
SetEventProc (ивенты). Нужна помощь
Подскажите, можно ли как-то через ивенты отслеживать свои хп?
К примеру, копаю в шахте, вылез элементаль и стал меня бить, чар бьет в ответ на автомате. Необходимо лечиться бинтами отследить, что на меня напали не выходит, т.к. он нападает без надписи атаки.
К примеру, копаю в шахте, вылез элементаль и стал меня бить, чар бьет в ответ на автомате. Необходимо лечиться бинтами отследить, что на меня напали не выходит, т.к. он нападает без надписи атаки.
Re: SetEventProc (ивенты). Нужна помощь
есть например ивент evAttack
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Re: SetEventProc (ивенты). Нужна помощь
я уже смотрел на него, но немного не понял - он возвращает если на меня напали или если у меня вар мод включился и я на кого-то нападаю?Vizit0r wrote:есть например ивент evAttack
Re: SetEventProc (ивенты). Нужна помощь
вроде как был evTimer внутри которого можно чекать свое хп и прочую лабуду типа вармода. Как только что-то не так, мы отписываемся от ивента делаем свои грязные дела и подписываемся назад.Stels wrote:я уже смотрел на него, но немного не понял - он возвращает если на меня напали или если у меня вар мод включился и я на кого-то нападаю?Vizit0r wrote:есть например ивент evAttack
Re: SetEventProc (ивенты). Нужна помощь
Воспользовался
и он сбивает весь скрипт, на реколе выдает на процедуру рекола
PS Internal error: Out Of Range.
вот то, что находится в ивенте
Раньше просто никогда не работал с ивентами, может что не так делаю?
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 (ивенты). Нужна помощь
Такс, с этой проблемой разобрался. Пожскажите, а как отписаться от ивента?
Re: SetEventProc (ивенты). Нужна помощь
Я правильно понял, что нужно пустой указать внутри ивента, и в конце заново его назначить?
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 (ивенты). Нужна помощь
да, специфика ивентов в том что ето "команда" что то делать, какой то триггер. Я бы вынул "отписку" из цикла вайл, в целом ты мог бы написать метод в котором просто чекал условия и в зависимости от условий запускал тот или иной коллбек. Типа там каждые 100 мс проверить вес проверить координаты и еще какуюнить дичь, в зависимости от результатов отписываться и выполнять обработчик.
Re: SetEventProc (ивенты). Нужна помощь
ну я решил сделать проще, создал два таймера, один на определение врага, а второй на хиллинг. и подписку и одписку соотвтетвенно переместил. Благодарю за помощь, вроде работает))
Last edited by Stels on 24.11.2019 20:50, edited 1 time in total.
Re: SetEventProc (ивенты). Нужна помощь
ну я решил сделать проще, создал два таймера, один на определение врага, а второй на хиллинг. и подписку и одписку соотвтетвенно переместил. Благодарю за помощь, вроде работает))
Re: SetEventProc (ивенты). Нужна помощь
Появился вопрос:
Когда входит в 1 таймер, отписывается и начинает выполнять процедуру, второй таймер не работает, не обрабатывается... как можно это обойти?
Когда входит в 1 таймер, отписывается и начинает выполнять процедуру, второй таймер не работает, не обрабатывается... как можно это обойти?
Re: SetEventProc (ивенты). Нужна помощь
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 (ивенты). Нужна помощь
Все ивенты выполняются последовательно, не параллельно. Поэтому тяжелые, долгие вещи в них не стоит пихать вообще.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".