Page 1 of 1

FAQ по EVENT

Posted: 08.05.2011 12:58
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.

Posted: 08.05.2011 13:04
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 не только НПС но и ПС нужно запускать эти три эвента. почему так хз , но на деле работает.

Posted: 08.05.2011 19:50
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.

Posted: 08.05.2011 19:50
by Vizit0r
правильно все насчет флага.