Регистрация - или - Войти

Восстановить пароль
×

Для восстановления пароля необходимо ввести логин или почту, которую Вы вводили при регистрации. После это, на Ваш почтовый ящик будет отпрвлено письмо с кодом.

Логин или почта :

Guitar Star (Prealpha)Guitar Star (Prealpha)

Guitar Star (Prealpha-версия) - Мод, который нужно слышать.....

18/04/2011
Статистика по выложенному объему ( Общая )

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


  • Описание
  • КАК УСТАНОВИТЬ

Water Splash

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


Автор / ы урока : ONeiLL
Просмотров : 2769 ( +1 )
Скачиваний : 113
Прислал / (а) : NIKmikrus
Дата создания : 26.01.2013 22: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 );
    }
}

Ну, всё.

gamer-lab.com

gamer-lab.com



1. ( 608.2 Kb )
Похожие1. Создание нового ствола - Создание нового ствола с новыми патронами
2. Добавление новых классов для монстр - Мы будем добавлять новый класс Блэк Опс из Оппосинг Форс
3. Увеличение количества мяса от взрыв - Увеличение количества мяса от взрывов людей или инопланетян.
4. Наследование классов в С++ - В этом туторе я попытаюсь кратко рассказать про наследование классов в С++
5. Функции движка - как и для чего - Функции движка - как и для чего их использовать?
6. субтитры из паранойи - субтитры из паранойи.
7. Неработающие двери :) - Как сделать, чтоб двери не открывались, когда нет света и рядом с ними был индикатор (красн. зел.)
8. Как перекрасить пули в ХЛ - Здесь я вам расскажу, как можно перекрасить пули в Half-Life1 и приведу свой пример
Cep}|{ 27.01.2013, 8:19:40 пишет :
#1
Интересно, есть ли скриншоты результата?
NIKmikrus 27.01.2013, 9:25:22 пишет :
#2
Жаль, но нету.
master07 27.01.2013, 14:35:04 пишет :
#3
я пробывал получилось
SteamPlay 28.01.2013, 15:49:17 пишет :
#4
Хороший урок!
Cep}|{ 29.01.2013, 19:03:13 пишет :
#5
У кого получилось - делитесь скриншотами =) Добавим в урок.
ONeiLL 07.03.2013, 17:28: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, 14:32:27 пишет :
#7
Внёс некоторые изменения в урок
gabataka 23.04.2022, 2:34:47 пишет :
#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" );
Вы не можете комментировать, т.к. вы не зарегистрированы.
    2 Flowers
    Half-Life 22 Flowers
    Content Warning (Раздача в Steam)
    Content Warning (Раздача в Steam)
    Hammerting (Раздача в GOG)
    Hammerting (Раздача в GOG)
    Islets (Раздача в EpicGamesStore)
    Islets (Раздача в EpicGamesStore)