Регистрация - или - Войти
Black Mesa SidelineBlack Mesa Sideline

За чертой Черной Мезы...

22/09/2007
Sven Co-op 4.8Sven Co-op 4.8

Это кооперативная модификация для Half-Life, где игроки должны сражаться с NPC, выполнять разные задачи в команде....

18/01/1999

Добавляем брызги при выстреле по воде


  • Описание
  • Ссылка и установка

Water Splash

Добавляем брызги при выстреле по воде


Автор / ы урока : ONeiLL
Просмотров : 823 ( +1 )
Скачиваний : 34
Прислал / (а) : NIKmikrus
Дата создания : 26.01.2013 19:28:15
Источник : http://hlfx.ru/forum/showthread.php?s=&threadid=3451
Рейтинг :
 ( 3 ) 
Поделиться :


Имеются следующие переводы : | русский |

Всем привет! В этом туториале рассказано, как сделать при выстреле в воду брызги. Как и в моих прошлых туториалах, кода не очень много.

  1. Сервер

    Файл world.cpp, функция void CWorld

    Precache( void )

PRECACHE_MODEL( "sprites/effects/splash1.spr" );
PRECACHE_MODEL( "sprites/effects/splash2.spr" );
PRECACHE_SOUND( "items/water_splash/water_splash1.wav" );
PRECACHE_SOUND( "items/water_splash/water_splash2.wav" );
PRECACHE_SOUND( "items/water_splash/water_splash3.wav" );

Открываем combat.cpp, и перед функцией Vector CBaseEntity::FireBulletsPlayer вставляем:

extern int    gmsgWaterSplash;
void CBaseEntity::FireBulletsWater( Vector vecSrc, Vector vecEnd )
{
    if( !( POINT_CONTENTS( vecEnd ) == CONTENTS_WATER && POINT_CONTENTS( vecSrc ) != CONTENTS_WATER ) )
        return;

    // Ищем растояние между vecSrc и vecEnd
    float x = vecEnd.x - vecSrc.x;
    float y = vecEnd.y - vecSrc.y;
    float z = vecEnd.z - vecSrc.z;
    float len = sqrt( x * x + y * y + z * z );

    // Делим по полам
    Vector vecTemp = Vector( ( vecEnd.x + vecSrc.x ) / 2, ( vecEnd.y + vecSrc.y ) / 2, ( vecEnd.z + vecSrc.z ) / 2 );

    if( len <= 1 )
    {
        MESSAGE_BEGIN(MSG_ALL, gmsgWaterSplash);
        WRITE_COORD( vecTemp.x );
        WRITE_COORD( vecTemp.y );
        WRITE_COORD( vecTemp.z );
        MESSAGE_END();

        switch( RANDOM_LONG( 1, 3 ) )
        {
            case 1:
                UTIL_EmitAmbientSound( ENT(0), vecTemp, "items/water_splash/water_splash1.wav", 1, ATTN_NORM, 0, 100 );
            break;
            case 2:
                UTIL_EmitAmbientSound( ENT(0), vecTemp, "items/water_splash/water_splash2.wav", 1, ATTN_NORM, 0, 100 );
            break;
            case 3:
                UTIL_EmitAmbientSound( ENT(0), vecTemp, "items/water_splash/water_splash3.wav", 1, ATTN_NORM, 0, 100 );
            break;
        }
    }
    else
    {
        if( POINT_CONTENTS( vecTemp ) == CONTENTS_WATER )
            FireBulletsWater( vecSrc, vecTemp );
        else
            FireBulletsWater( vecTemp, vecEnd );
    }
}

Ищем функцию Vector CBaseEntity::FireBulletsPlayer и после UTIL_BubbleTrail( vecSrc, tr.vecEndPos, (flDistance * tr.flFraction) / 64.0 ); пишем:

FireBulletsWater( vecSrc, tr.vecEndPos );

Теперь в файле cbase.h, в классе CBaseEntity надо объявить нашу функцию:

void    FireBulletsWater( Vector vecEnd, Vector vecSrc );

Теперь файл player.cpp После int gmsgTeamNames = 0;

int gmsgWaterSplash = 0;

В этом же файле после gmsgTeamNames = REG_USER_MSG( "TeamNames", -1 );

gmsgWaterSplash = REG_USER_MSG( "WaterSplash", 6 );
  1. Клиент

Файл hud.h, класс CHud, после int _cdecl MsgFunc_Concuss( const char *pszName, int iSize, void *pbuf );

int _cdecl MsgFunc_WaterSplash( const char *pszName, int iSize, void *pbuf );

Файл hud.cpp, после функции int __MsgFunc_GameMode(const char *pszName, int iSize, void *pbuf )

int __MsgFunc_WaterSplash(const char *pszName, int iSize, void *pbuf)
{
    gHUD.MsgFunc_WaterSplash( pszName, iSize, pbuf );
    return 1;
}
Здесь же, в функции void CHud

Init( void ), после HOOK_MESSAGE( AllowSpec );

HOOK_MESSAGE( WaterSplash );

Файл hud_msg.cpp, после #define MAX_CLIENTS 32

extern void EV_HLDM_WaterSplash( float x, float y, float z );

int CHud :: MsgFunc_WaterSplash( const char *pszName, int iSize, void *pbuf )
{
    BEGIN_READ( pbuf, iSize );
    float X, Y, Z;

    X = READ_COORD();
    Y = READ_COORD();
    Z = READ_COORD();

    EV_HLDM_WaterSplash( X, Y, Z );
    return 1;
}

Файл ev_hldm.cpp

void EV_HLDM_WaterSplash( float x, float y, float z )
{
    int  iWaterSplash = gEngfuncs.pEventAPI->EV_FindModelIndex ("sprites/effects/splash1.spr");
    TEMPENTITY *pTemp = gEngfuncs.pEfxAPI->R_TempSprite( Vector( x, y, z + 50 ),
    Vector( 0, 0, 0 ),
    0.5, iWaterSplash, kRenderTransAdd, kRenderFxNone, 1.0, 0.5, FTENT_SPRANIMATE | FTENT_FADEOUT | FTENT_COLLIDEKILL );

    if(pTemp)
    {
        pTemp->fadeSpeed = 90.0;
        pTemp->entity.curstate.framerate = 100.0;
        pTemp->entity.curstate.renderamt = 155;
        pTemp->entity.curstate.rendercolor.r = 255;
        pTemp->entity.curstate.rendercolor.g = 255;
        pTemp->entity.curstate.rendercolor.b = 255;
    }

    iWaterSplash = gEngfuncs.pEventAPI->EV_FindModelIndex ("sprites/effects/splash2.spr");
    pTemp = gEngfuncs.pEfxAPI->R_TempSprite( Vector( x, y, z ),
    Vector( 0, 0, 0 ),
    0.2, iWaterSplash, kRenderTransAdd, kRenderFxNone, 1.0, 0.5, FTENT_SPRANIMATE | FTENT_FADEOUT | FTENT_COLLIDEKILL );

    if(pTemp)
    {
        pTemp->fadeSpeed = 60.0;
        pTemp->entity.curstate.framerate = 50.0;
        pTemp->entity.curstate.renderamt = 100;
        pTemp->entity.curstate.rendercolor.r = 255;
        pTemp->entity.curstate.rendercolor.g = 255;
        pTemp->entity.curstate.rendercolor.b = 255;
        pTemp->entity.angles = Vector( 90, 0, 0 );
    }
}

Ну, всё.



1. ( 608.2 Kb )
Похожие1. И снова наследование классов :) - Казалось бы тема наследования классов давно избита, ан нет всё ещё существуют вопросы, правда про чуть боле сложное наследование.
2. учёные не отставали - Как сделать так, чтобы учёные не отставали на каждом препятствии
3. Смена моделей персонажей - Смена моделей персонажей прямо в Хамере
4. Летающие бочки и trigger_push - Все, кто хотя бы один раз прошел Hl1 наверняка знает, что на карте c2a5 (там где плотина) есть такие прикольные бочки, которые подскакивают вверх и там взрываются.
5. Trigger_PlayerFreeez - Trigger_PlayerFreeez (остановка игрока)
6. Как сделать вортигонта из HL1 другом - Моя первая статья
Cep}|{ 27.01.2013, 7:07:40 пишет :
#1
Интересно, есть ли скриншоты результата?
NIKmikrus 27.01.2013, 8:13:22 пишет :
#2
Жаль, но нету.
master07 27.01.2013, 13:23:04 пишет :
#3
я пробывал получилось
SteamPlay 28.01.2013, 14:37:17 пишет :
#4
Хороший урок!
Cep}|{ 29.01.2013, 17:51:13 пишет :
#5
У кого получилось - делитесь скриншотами =) Добавим в урок.
ONeiLL 07.03.2013, 16:16:22 пишет :
#6
О, это ж мой урок =)
Вот скрины:
http://hlfx.ru/forum/attachment.php?s=&postid=99657
http://cs-mapping.com.ua/forum/attachment.php?attachmentid=97191

ЗЫ: Первоисточник желательно указывать:
http://hlfx.ru/forum/showthread.php?s=&threadid=3451
ONeiLL 08.03.2013, 13:20:27 пишет :
#7
Внёс некоторые изменения в урок
Вы не можете комментировать, т.к. вы не зарегистрированы.
    UT3 Evangelion Model Pack v1.1 Final
    Unreal Tournament 3UT3 Evangelion Model Pack v1.1 Final
    OldSkool Amp'd
    Unreal Tournament 99OldSkool Amp'd
    Csejte Castle HerdCoop Map Pack V3
    Unreal Tournament 99Csejte Castle HerdCoop Map Pack V3
    Unreal Tournament 3 Original Soundtrack
    Unreal Tournament 3 Original Soundtrack