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

FAQ по EVENT

Часто задаваемые вопросы
Post Reply
shinma
Expert
Expert
Posts: 505
Joined: 28.04.2011 12:05

FAQ по EVENT

Post by shinma »

Для чего нужны эвенты? Как работают Эвенты?
Сейчас разберемся.
Эвен это событие которое ДАЕТ вам игровые переменные для дальнейшей обработки. Например ID чара, текст в чате, Имя произнесшего фразу итд.
Чем Эвент отличается от функции/процедуры: функцию/процедуру надо вызывать каждый раз когда вам нужны действия ими выполняемые. А эвент один раз запущеный продолжает работать до завершения скрипта, или пока не будет остановлен, его ненадо вызывать каждый раз. но можно в любой момент использовать данные которые дает тот или иной эвент.

Пример: давайте выведем в системный журнал имена всех персонажей НПС находящихся на экране.

Code: Select all

Program Test; 
procedure UpdateChar(TempID : Cardinal); 
begin 
AddToSystemJournal('UpdateChar = '+ GetName(TempID)); 
end; 

begin 
SetEventProc(evUpdateChar,'UpdateChar');
while True do 
wait(1000); 
end.
Разберем скрипт. Лучше всего для понимания рассматривать его с конца.

Code: Select all

while True do wait(1000);
// Запускаем бесконечный цикл. Ведь эвент работает только, пока работает скрипт. Поэтому для теста мы не дадим скрипту завершиться.

Code: Select all

SetEventProc(evUpdateChar,'UpdateChar');
//Вызываем Евент. тут давайте поподробнее

Code: Select all

 SetEventProc(evSpeech,'function_name');


SetEventProc - функция запуска эвента
evUpdateChar - собственно имя эвента. Полный список можно посмотреть тут http://stealth.od.ua/wiki/doku.php?id=event
'UpdateChar' - этот параметр передает эвенту evSpeech на растерзание функцию с именем UpdateChar и передает ей параметры. А вот какие параметры указано тут http://stealth.od.ua/wiki/doku.php?id=event

Давайте вернемся к скрипту. Выходит мы передаем параметры евента evUpdateChar в функцию UpdateChar.
Для этого надо создать эту функцию (в нашем случае создадим процедуру);

Code: Select all

procedure UpdateChar(TempID : Cardinal); 
begin 
AddToSystemJournal('UpdateChar = '+ GetName(TempID)); 
end; 
Обратите внимание как я использую переменные, которые будут переданы в процедуру для обработки. Я посмотрел на страницу http://stealth.od.ua/wiki/doku.php?id=event
и увидел там описание "evUpdateChar : [ID] - отрисовка чара (не обязательно нашего!)" Тоесть наш эвент evUpdateChar возвращает только один параметр - ID. ID в игре обьявляется типом Cardinal.
Я объявляю тип на входе в процедуру. procedure UpdateChar(TempID : Cardinal); и задаю ему имя TempID. В дальнейшем я могу в этой процедуре делать все что угодно с параметром TempID используя такие функции как
GetName(TempID) и прочие.

Теперь, если мы запустим скрипт, то увидим - каждую секунду вызывается эвент и отображать в системном журнале имена всех НПС находящихся на экране с игроком.

И чуть не забыл чтобы остановить Эвент нужно использовать функцию вызова эвента с пустым вторым параметром параметром.

Code: Select all

Пример:
SetEventProc(evUpdateChar,' '); // можно вставить пробелы или вообще пусто между кавычками. 
Этой функцией мы остановили событие отслеживающее ID всех нпс появляющихся на экране игрока.

вот еще один пример

Code: Select all

Program Test; 

procedure UpdateChar(TempID2 : Cardinal); 
begin 

if GetName(TempID2) = 'Marcos' then
AddToSystemJournal('НПС найден')
else  
AddToSystemJournal('НПС Marcos ненайден ') ;
end; 

begin 
SetEventProc(evUpdateChar,'UpdateChar');
while True do 
wait(1000); 
end.
Last edited by shinma on 08.05.2011 13:25, edited 1 time in total.
shinma
Expert
Expert
Posts: 505
Joined: 28.04.2011 12:05

Post by shinma »

вот как то так) Только вот боюсь два эвента кривые

Code: Select all

SetEventProc(evDrawGamePlayer,'DrawGamePlayer');   не выдает имена игроков
SetEventProc(evDrawObject,'DrawObject');  выдает очень редко NoName
Испытвал так

Code: Select all

Program Test; 
procedure DrawGamePlayer(TempID : Cardinal); 
begin 
AddToSystemJournal('DrawGamePlayer = '+ GetName(TempID)); 
end; 

procedure UpdateChar(TempID : Cardinal); 
begin 
AddToSystemJournal('UpdateChar = '+ GetName(TempID)); 
end; 

procedure DrawObject(TempID : Cardinal); 
begin 
AddToSystemJournal('DrawObject = '+ GetName(TempID)); 
end; 

begin 
SetEventProc(evDrawGamePlayer,'DrawGamePlayer'); 
SetEventProc(evUpdateChar,'UpdateChar');
SetEventProc(evDrawObject,'DrawObject'); 
while True do 
wait(1000); 
end.


Эту ошибку завтра обещают поправить. для того чтобы evUpdateChar определяла ID не только НПС но и ПС нужно запускать эти три эвента. почему так хз , но на деле работает.
Last edited by shinma on 08.05.2011 19:51, edited 1 time in total.
shinma
Expert
Expert
Posts: 505
Joined: 28.04.2011 12:05

Post by shinma »

evAllow_RefuseAttack Дает Id цели которую вы атаковали, а флаг скорее всего возвращает можно ли её атаковать или нельзя. Но на счет флага так и не понял.

Code: Select all

program SetEventProc; 
procedure Allow_RefuseAttack(ID:Cardinal;Attack_OK:Boolean);
var 
o:string;
begin
if  Attack_OK = true then
addToSystemJournal('ID хз кого '+intToStr(ID) + ' TRUE ')
else
addToSystemJournal('ID хз кого '+intToStr(ID) + ' False ')
end;


begin  
SetEventProc(evAllow_RefuseAttack,'Allow_RefuseAttack');   
 while true do
wait(1000);  
end.
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

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