Sign up - or - Login

Recover password
×

To recover your password, you must enter the username or e-mail that you used during the registration. After that, a mail with a security code will be sent to your inbox.

Your username or e-mail :

CSS SCI FI 3: HardwiredCSS SCI FI 3: Hardwired

Шутер от первого лица...

9/10/2009
Stat points ( ALL )

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


  • Description
  • HOW TO INSTALL

Water Splash

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


Author/s of tutorial : ONeiLL
Views : 2903 ( +1 )
Downloads : 118
Uploader : NIKmikrus
Created : 01/26/2013 10:28:15 PM
Source : http://hlfx.ru/forum/showthread.php?s=&threadid=3451
Rating :
 ( 3 ) 
Share :


Following translations are available : | russian |

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

  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 );
    }
}

Ну, всё.

gamer-lab.com

gamer-lab.com



1. ( 608.2 Kb )
Similar1. Исходный код ножа - weapon_knife (Нож) с двумя режимами атаки: Slash и Stab.
2. Два цвета крови у зомби - Два цвета крови у зомби
3. учёные не отставали - Как сделать так, чтобы учёные не отставали на каждом препятствии
4. Создание сценариев - Для создания сценариев (aka скриптов) в Half-Life существуют две энтити: scripted_sequence и scripted_sentence. Первая отвечает за движения, выполняемые монстром/персонажем, будь то ходьба, бег, нажатие кнопки, тряска автомата с газировкой или почёсывание подбородка. Вторая служит для того, чтобы персонаж произнес какую-то фразу. При этом его голова повернётся в сторону слушателя, и рот будет открываться в соответствии с амплитудой звука.
Cep}|{ 01/27/2013, 8:19:40 AM commented :
#1
Интересно, есть ли скриншоты результата?
NIKmikrus 01/27/2013, 9:25:22 AM commented :
#2
Жаль, но нету.
master07 01/27/2013, 2:35:04 PM commented :
#3
я пробывал получилось
SteamPlay 01/28/2013, 3:49:17 PM commented :
#4
Хороший урок!
Cep}|{ 01/29/2013, 7:03:13 PM commented :
#5
У кого получилось - делитесь скриншотами =) Добавим в урок.
ONeiLL 03/07/2013, 5:28:22 PM commented :
#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 03/08/2013, 2:32:27 PM commented :
#7
Внёс некоторые изменения в урок
gabataka 04/23/2022, 2:34:47 AM commented :
#8
дополни урок, на hlfx он дополнил что еще надо, что бы звук был.

Файл world.cpp, функ. void CWorld :: Precache( void )

PRECACHE_SOUND( "items/water_splash/water_splash1.wav" );
PRECACHE_SOUND( "items/water_splash/water_splash2.wav" );
PRECACHE_SOUND( "items/water_splash/water_splash3.wav" );
You cannot comment, because you are not logged-in.
    зомби, которого может использовать каждый
    Half-Lifeзомби, которого может использовать каждый
    dz_pettag_RF
    Counter-Strike 1.6dz_pettag_RF
    de_zamok_RF
    Counter-Strike 1.6de_zamok_RF
    de_bublik_RF
    Counter-Strike 1.6de_bublik_RF