Пятница, 03.05.2024, 00:01
Приветствую Вас Guest | RSS
Главная страница | Статьи | Регистрация | Вход
Меню сайта

Случайный рисунок

Категории каталога
Туториалы по маппингу (HL2) [68]
Туториалы по маппингу для Half-Life
Туториалы по текстурированию (HL2) [10]
Туторы по текстурированию для Half-Life
Туториалы по моделированию (HL2) [9]
Туторы по моделированию для Half-Life
Туториалы по программированию (HL2) [53]
Туторы по прагроммированию для Half-life
Другие туториалы (HL1 и HL2) [4]
Туторы которые не вошли в другие категории
Half-Life 2 Beta [1]
Статьи о npc и weapon в бете Half-Life 2, а так же мануалы и FAQ.
Туториалы по маппингу (HL1) [14]
Туторы по маппингу для Half-Life 1
Туториалы по текстурированию (HL1) [1]
Туторы по текстурированию для Half-Life 1
Туториалы по моделированию (HL1) [1]
Туторы по моделированию для Half-Life 1
Туториалы по программированию (HL1) [30]
Туторы по программированию для Half-Life 1

Наш опрос
Очистить ли форум от всех сообщений и начать всё с чистого листа?
Всего ответов: 561

Начало » Статьи » Туториалы по программированию (HL1)

Xash postActivate system. Тутор
В жизни каждого кодера под хл наступает такой интересный момент, когда ему нужно активировать что-либопри старте карты. Чаще всего это - передача мессаги на клиент. И тут кодеры сталкиваются с одним оченьнеприятным явлением - ни в обычной халфе, ни в спирите НЕТ нормальных методов, для активации мессаг при страте игры. Из Spawn вызывать нельзя - слишком рано. Activate()срабатыват чуть позже, но он идет перед LinkUserMessage, к тому же его используют другие энтити для своих целей и изменять время срабатывания крайне нежелательно, дабы не нарушить работу того же спирита. Продвинутые кодеры, вроде Бузера, не заморачиваясь
вызывают нужные мессаги прямо из CBasePlayer (для спирита 1.6 я и сам так поступил, каюсь), но, во первых это неудобно, во вторых, просто некрасиво. В Спирите Лаури предложил нам свой метод: UTIL_DesiredAction Но... Вы видели, как эта шутка работает? - сначала CBaseEntity:Activate, потом pev->nextthink +
а саму месаагу Лаури вызывает из тчинка, а если тчинк нам понадобится для других целей? Все это и побудило меня разработать xash PostActivate System. Система обладает следующими возможностями - она точно определяет время спавна игрока и вызывает некую функцию PostActivate, которая собсна и используется кодерами по их усмотрению - просто вставьте в классе своей энтити.
Функцию void PostActivate( void ); и вызывайте из нее все что хотите - это будет срабатывать каждый раз при старте карты.
В класс CBaseEntity добавьте нашу новую функцию virtual void PostActivate ( void ) {}
Теперь добавим собсно вызов нашей функции в client.cpp
После инклудов вставьте вот это:
BOOL MSGSended;
float MsgDelay;
а перед функцией StartFrame - вот этот код:

void ServerPostActivate( void )
{
    edict_t    *pEdict = INDEXENT( 1 );
    CBasePlayer *plr = (CBasePlayer*UTIL_PlayerByIndex(1);
    CBaseEntity    *pClass;
    
    if(!pEdict || MSGSended) return;//player spawned ?
        //NOTE: Time to affect is obsolete delay before sendingmessage
    //Tune multiplayer time if need
    
    if ( MsgDelay > gpGlobals->time ) return;
        if (plr && !plr->m_fInitHUD && !gInitHUD)
    {
        for ( int i = 1; i < gpGlobals->maxEntities; i++,pEdict++ )
        {
            if ( pEdict->free )continue;
                pClass = CBaseEntity::Instance(pEdict);
            if ( pClass && !(pClass->pev->flags &FL_DORMANT) )
            {
                pClass->PostActivate();
            }
        }
        MSGSended = TRUE;//messages sucessfully sended
    }
}

Добавьте вызов этой функции непосредственно в StartFrame
Теперь настроим время вызова из ClientPrecache - добавьте в самом начале этой функции следующие строки:

MSGSended = FALSE;
if(IsMultiplayer()) MsgDelay = 0.5 + gpGlobals->time;
    else    MsgDelay = 0.03 + gpGlobals->time;
        

Функция ISMultilplayer - это shared функция самого xash, замените её на g_pGameRules->isMultiplayer или как
там оно выглядит в оригинальном хл :)
MsgDelay - это время активации нашей фнукции - если поставить его слишком маленьким возможны проблемы.
Здесь приведены оптимальные значения для сингла и мульта.
Ну собсно и все, наслаждайтесь :)


Источник: http://www.hlfx.ru/forum/showthread.php?s=5ac665d08b0b17fd1b0b22cbbbc86ced&threadid=67
Категория: Туториалы по программированию (HL1) | Добавил: DetLeR (16.08.2007) | Автор: Дядя Миша
Просмотров: 861 | Рейтинг: 0.0 |

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Кто в Онлайн

Друзья сайта

Баннеры

  Сайт CrazyArts   Black   Сообщество сайтов о Half-Life   Самый   Только   Все   hl2 top 100     Rambler's Top100  

игры
игры

  Каталог сайтов Планета Топ 100 - Planet Top 100       ТОП ЛУЧШИХ ИГРОВЫХ САЙТОВ           Detroit Team Site :: Моды от Detroit Team, видео, новости.   Naruto-kun[Звезда Наруто]  


The idea of dising: Homie7