Русское сообщество по скриптингу

События начало и конец раунда в Metamod

Все вопросы по скриптингу для Metamod, помощь в редактировании плагинов.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для
Metamod.


Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [pawn], в противном случае, если тег [pawn] не отображает ваш код, можно использовать тег [code].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник плагина.

События начало и конец раунда в Metamod

Сообщение simsergey » 09 июл 2011, 02:07

Доброго времени суток, уважаемые Гуру. :-)

Возник такой вопрос, как можно поймать события "начало раунда" и "конец раунда" ?
Вот к примеру, как событие "подключение клиента" - функция mm_ClientConnect.

Смотрел, как делается в amxx, там вроде как регистрируют событие через register_event, посмотрел в исходниках самого amxx мода, а там целая система регистрации событий, обработки.. вообщем сложновато устроено..

Может быть есть варианты попрще, чем копипаст половины amxx ?
У кого какие предложения ?

--
С уважением :-)
Не нравятся смайлы? - не интерпретируй их.
Аватара пользователя
simsergey
 
Сообщения: 46
Зарегистрирован: 27 июн 2011, 11:26
Благодарил (а): 15 раз.
Поблагодарили: 3 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: События начало и конец раунда в Metamod

Сообщение DJ_WEST » 09 июл 2011, 20:34

Понятие начало раунда и конец раунда в Metamod нету. У каждой игры - по разному. Предположу, что речь идет о CS 1.6. Так вот обычно там начало раунда, к примеру, ловится так:
[pawn]register_event("HLTV", "Round_Start", "a", "1=0", "2=0") [/pawn]
Через events. В Metamod точно также. Подключаем хук на pfnMessageBegin функцию, а дальше уже с ней и работаем:
[pawn]void pfnMessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed) [/pawn]
Для HLTV будут срабатывать следующие условия:
[pawn]msg_dest == MSG_SPEC[/pawn]
А дальше еще получаем id для HLTV события с помощью GET_USER_MSG_ID, либо сразу проверяем, указываем его номер вручную и проверяем:
[pawn]msg_type == 33[/pawn]
ID взял из:
http://wiki.alliedmods.net/Half-Life_1_Game_Events 


Соответственно для конца раунда тоже есть свой event.
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: События начало и конец раунда в Metamod

Сообщение simsergey » 10 июл 2011, 15:19

DJ_WEST, спасибо за подсказку. :thumbs_up
Если я правильно понял, регистрируем функцию pfnMessageBegin, и в ней отбираем нужно событие?

Пишем, к примеру, функцию, которая при каждом событии будет выводить информацию о нем в консоль сервера.
Но что-то я видимо делаю не так, т.к. функция pfnMessageBegin не вызывается..

Функция:
[pawn]void pfnMessageBegin (int msg_dest, int msg_type, const float *pOrigin, edict_t *ed)
{
    
    ef
.pfnServerPrint("\r\nMessageBegin\r\n\r\n");
    ef.pfnServerPrint("\r\nmsg_type = ");
    ef.pfnServerPrint((char*)msg_type);
    ef.pfnServerPrint("\r\nmsg_dest = ");
    ef.pfnServerPrint((char*)msg_dest);
    ef.pfnServerPrint("\r\n\r\n");
    mg->mres=MRES_HANDLED;
}
 [/pawn]
Регистрируем ее:
[pawn]// Receive engine function table from engine.
C_DLLEXPORT void WINAPI GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals )
{
    memcpy(&ef, pengfuncsFromEngine, sizeof(enginefuncs_t));
    gpGlobals = pGlobals;
    pengfuncsFromEngine->pfnMessageBegin = pfnMessageBegin;
}
 [/pawn]
Переменные:
[pawn]enginefuncs_t ef; [/pawn]
Структуры:
[pawn]
// Engine hands this to DLLs for functionality callbacks
typedef struct enginefuncs_s
{   
     
.....
    void        (*pfnMessageBegin)        (int msg_dest, int msg_type, const float *pOrigin, edict_t *ed);
    void        (*pfnMessageEnd)           (void);
     .....
    void        (*pfnServerPrint)        ( const char *szMsg );
}
 enginefuncs_t;
 [/pawn]

Работоспособность самой dll проверял путем регистрации события pfnClientConnect, при коннекте любого клиента вызывается функция.

Я что-то упустил, или сделал не так? :dntknw:
Не нравятся смайлы? - не интерпретируй их.
Аватара пользователя
simsergey
 
Сообщения: 46
Зарегистрирован: 27 июн 2011, 11:26
Благодарил (а): 15 раз.
Поблагодарили: 3 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: События начало и конец раунда в Metamod

Сообщение DJ_WEST » 11 июл 2011, 14:19

Вместе с иходниками Metamod идет примерный плагин - stub_plugin. Взгляни на engine_api.cpp, там если функция не используется стоит NULL. Находишь pfnMessageBegin и ставишь вместо NULL -> pfnMessageBegin (или любое другое название твоей функции по перехвату).
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: События начало и конец раунда в Metamod

Сообщение simsergey » 12 июл 2011, 00:31

Что-то по этому способу вообще ничего не получается.
Странно, но stub_plugin после компиляции не работает вообще никак..

Я первый раз использовал одну "болванку плагина Metamod", скачал Вы должны зарегистрироваться, чтобы видеть ссылки..
Функции работали, за исключением engine_api.
Собрал простенький плагин на stub_plugin, он отказался работать :(

Ничего не инициализируется.. Заметил интересный момент, у библиотек по разному экспортируется одна и та же функция:
[pawn]C_DLLEXPORT void WINAPI GiveFnptrsToDll( enginefuncs_t* pengfuncsFromEngine, 
                                          globalvars_t 
*pGlobals ) [/pawn]
В первом случае функции библиотеки экспортируются так:
Код: Выделить всё
 GetEngineFunctions
 GetEntityAPI2
 GiveFnptrsToDll
 Meta_Attach
 Meta_Detach
 Meta_Query

Во втором так:
Код: Выделить всё
 GetEngineFunctions
 GetEntityAPI2
 Meta_Attach
 Meta_Detach
 Meta_Query
 _GiveFnptrsToDll@8

При этом, самое интересное то, что функция GiveFnptrsToDll в обоих случаях объявлена одинаково.

Если во втором случае убрать WINAPI - то объявление получается так же, как и первом случае, но при этом, при старте сервер падает.. В случае если оставить WINAPI - dll не работает, а просто висит для красоты..
DJ_WEST писал(а): Находишь pfnMessageBegin и ставишь вместо NULL -> pfnMessageBegin (или любое другое название твоей функции по перехвату).

Если я правильно вычитал исходник - то получается, это структура, заранее заполненная NULL (указателями вникуда), в которой, по нужному порядку, я один из указателей заменяю на существующую функцию. После - структура передается на отправку в метамод.

В первом случае получается почти тоже самое, только в разнице с тем, что сначала обнуляется структура, потом в нее добавляется нужные указатели на нужные функции (структура заполняется динамически, а не сразу), и инфа передается в метамод.

Теореически, эфект в первом случае должен быть тот же, что и в stub_plugin.

DJ_WEST, прошу прощения за оффтоп.., это уже другая тема.. :-[

На самом деле, ситуация очень забавненькая, я в ней покопаюсь поглубже.
Что касается темы - вопрос думаю решен, т.к. куда копать я понял, копать надо в сторону перехвата событий, причем через pfnMessageBegin.

Спасибо за помощь.

P. S. Если есть коментарии по выше написанному - прошу прокоментировать :-)

P. S. S. было бы не плохо, еслиб кто-нибудь из умных людей сообразил простенькую статейку по написанию плагинов с нуля, с работоспособной болванкой в качестве примера к статье, для таких нубов как я :boast:
Не нравятся смайлы? - не интерпретируй их.
Аватара пользователя
simsergey
 
Сообщения: 46
Зарегистрирован: 27 июн 2011, 11:26
Благодарил (а): 15 раз.
Поблагодарили: 3 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: События начало и конец раунда в Metamod

Сообщение 6a6kin » 12 июл 2011, 01:41

На заказ не пишу.
Аватара пользователя
6a6kin
Скриптер
 
Сообщения: 332
Зарегистрирован: 09 мар 2010, 16:40
Благодарил (а): 38 раз.
Поблагодарили: 278 раз.

Re: События начало и конец раунда в Metamod

Сообщение simsergey » 12 июл 2011, 02:46

Спасибо за ссылки, понятные статьи. Почему-то я их не заметил.. :-[
Знать бы где у меня грабли...

Из второй статьи:
[pawn] void WINAPI GiveFnptrsToDll(enginefuncs_t* pengfuncsFromEngine, globalvars_t *pGlobals)
{
   memcpy(&g_engfuncs, pengfuncsFromEngine, sizeof(enginefuncs_t));
   gpGlobals = pGlobals;
   ALERT(at_console, "[HELLOWORLD]: GiveFnptrsToDll\n");
}
 [/pawn]
Как я понимаю, при вызове функции GiveFnptrsToDll движком, должна появляться запись в консоли:
[pawn]ALERT(at_console, "[HELLOWORLD]: GiveFnptrsToDll\n"); [/pawn]
Чего-то в консоли глухо, на сегодня... :(

Администратор, наверное, будет недоволен офтопом... :-X
Не нравятся смайлы? - не интерпретируй их.
Аватара пользователя
simsergey
 
Сообщения: 46
Зарегистрирован: 27 июн 2011, 11:26
Благодарил (а): 15 раз.
Поблагодарили: 3 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: События начало и конец раунда в Metamod

Сообщение noo00oob » 13 июл 2011, 15:42

А не факт что во время GiveFnptrsToDll движковые функции работают.
Один фрукт, страдающий недостачей времени, нашел его ради меня любимого и писал(а):
noo00oob, зачем родился на свет вообще? срать на форумах это понятно.. больше изъеба не найти как бэ? а то, что ты недоношенная скотина, сдерживайся, детка.
noo00oob
 
Сообщения: 1061
Зарегистрирован: 09 янв 2010, 21:52
Благодарил (а): 258 раз.
Поблагодарили: 395 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: События начало и конец раунда в Metamod

Сообщение simsergey » 13 июл 2011, 16:44

Нашел я грабли :boast:

Как бы странно это не звучало, достаточно было всего лишь пересобрать сам метамод.
Использовал стандартный плагин stub_plugin, расширив его одной лишь функцией pfnMessageBegin.

Все заработало. :-)
Буду творить дальше. :zzz:
Не нравятся смайлы? - не интерпретируй их.
Аватара пользователя
simsergey
 
Сообщения: 46
Зарегистрирован: 27 июн 2011, 11:26
Благодарил (а): 15 раз.
Поблагодарили: 3 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: События начало и конец раунда в Metamod

Сообщение noo00oob » 13 июл 2011, 17:57

Вот только была бы статья, как отлавливать функции классов энтить ( как в hamsandwich), вообще было бы здорово.
Один фрукт, страдающий недостачей времени, нашел его ради меня любимого и писал(а):
noo00oob, зачем родился на свет вообще? срать на форумах это понятно.. больше изъеба не найти как бэ? а то, что ты недоношенная скотина, сдерживайся, детка.
noo00oob
 
Сообщения: 1061
Зарегистрирован: 09 янв 2010, 21:52
Благодарил (а): 258 раз.
Поблагодарили: 395 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

След.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3