Registration - or - Enter
Black OperationBlack Operation

Черные оперативники...

15/09/2007
Half-Life: ConfessionHalf-Life: Confession

Пришло время исповеди...


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


  • Description
  • HOW TO INSTALL

Water Splash

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


Author/s of lesson : ONeiLL
Views : 985 ( +1 )
Downloads : 39
Uploaded by : NIKmikrus
Created : 01/26/2013 7:28:15 PM
Source : http://hlfx.ru/forum/showthread.php?s=&threadid=3451
Rating :
 ( 3 ) 
Share :


Available following translations : | 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 );
    }
}

Ну, всё.



1. ( 608.2 Kb )
Similar1. Изменяем классы монстров злой барн - Как известно, первое что хочет сделать начинающий кодер (по крайней так было у меня ) это написать какое-нибудь оружие и изменить монстров.
2. И снова наследование классов :) - Казалось бы тема наследования классов давно избита, ан нет всё ещё существуют вопросы, правда про чуть боле сложное наследование.
3. Два цвета крови у зомби - Два цвета крови у зомби
4. Каждой пушке - спрайт - Итак вы создали новое оружие. А в меню выбора вместо рисунка непонятные спрайты, да и прицела нет.
5. Замедление игрока - Довольно забавно наблюдать, как игрок одинаково быстро бегает как с монтировкой в руках, так и с тяжелой базукой, хотя логичнее, что держа в руках сей девайс, он будет бегать медленнее
6. Увеличение количества мяса от взрыв - Увеличение количества мяса от взрывов людей или инопланетян.
Cep}|{ 01/27/2013, 7:07:40 AM is writing :
#1
Интересно, есть ли скриншоты результата?
NIKmikrus 01/27/2013, 8:13:22 AM is writing :
#2
Жаль, но нету.
master07 01/27/2013, 1:23:04 PM is writing :
#3
я пробывал получилось
SteamPlay 01/28/2013, 2:37:17 PM is writing :
#4
Хороший урок!
Cep}|{ 01/29/2013, 5:51:13 PM is writing :
#5
У кого получилось - делитесь скриншотами =) Добавим в урок.
ONeiLL 03/07/2013, 4:16:22 PM is writing :
#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, 1:20:27 PM is writing :
#7
Внёс некоторые изменения в урок
You cannot comment, because you are not registered.
    Разбитый Газ-53
    Half-Life 2Разбитый Газ-53
    Разбитый Камаз - 4310
    Half-Life 2Разбитый Камаз - 4310
    Heavy Zombie
    Counter-Strike Global OffensiveHeavy Zombie
    Snow Bunny (Lost Planet Colonies)
    Resident Evil 6Snow Bunny (Lost Planet Colonies)

Время --------- ___ALL___ --------- : 0.70440 секунд