Registrierung - oder - Hineingehen
Half-Life : The Alpha UnitHalf-Life : The Alpha Unit

История Капрала Даниэля Флэтчера...

4/12/2011

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


  • Beschreibung
  • Einstellung

Water Splash

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


Der Autor der Lektion : ONeiLL
Der Durchsichten : 712 ( +1 )
Heruntergeladen : 27
Hochgeladen von : NIKmikrus
Erstellt : 01/26/2013 7:28:15 PM
Source : http://hlfx.ru/forum/showthread.php?s=&threadid=3451
Wertung :
 ( 3 ) 
Aktie :


Es gibt die folgenden Sprachen : | russisch |

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

  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 )
Die Ähnlichen1. И снова наследование классов :) - Казалось бы тема наследования классов давно избита, ан нет всё ещё существуют вопросы, правда про чуть боле сложное наследование.
2. Переключение оружия a la HL2 - Мне не нравится, как переключается оружие в ХЛ. Может, кому-то и интересно тыкать по менюшкам худа, но мне больше нравится реализация переключения в Unreal RTN, Quake Mission Packs и HL2
3. Увеличение количества мяса от взрыв - Увеличение количества мяса от взрывов людей или инопланетян.
4. субтитры из паранойи - субтитры из паранойи.
5. Изменение цвета HUD'а(полное)! - Изменение цвета HUD'а(полное)! Но прицелы придётся переделывать вам самим! Сдесь я перевевёл туториал с twhl.info на русский язык!
6. Sparks - Как добавить искры
Ссылки на объект
Полная ссылка на текущем языке :
Короткая ссылка :
Ссылка на превью-картинку :
Ссылка на картинку в полном размере :
Ссылка для вашего форума или сайта
BB код ссылка:
BB код ссылка с картинкой :
BB код картинки :
HTML код ссылка:
HTML код ссылка с картинкой :
HTML код картинки :
Cep}|{ 01/27/2013, 7:07:40 AM schreibt :
#1
Интересно, есть ли скриншоты результата?
NIKmikrus 01/27/2013, 8:13:22 AM schreibt :
#2
Жаль, но нету.
master07 01/27/2013, 1:23:04 PM schreibt :
#3
я пробывал получилось
SteamPlay 01/28/2013, 2:37:17 PM schreibt :
#4
Хороший урок!
Cep}|{ 01/29/2013, 5:51:13 PM schreibt :
#5
У кого получилось - делитесь скриншотами =) Добавим в урок.
ONeiLL 03/07/2013, 4:16:22 PM schreibt :
#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 schreibt :
#7
Внёс некоторые изменения в урок
Sie können nicht kommentieren, da Sie sind nicht registriert.
    Nina - SAMARA (MASS EFFECT 2-3)
    Nina - SAMARA (MASS EFFECT 2-3)
    Tali'Zorah vas Normandy (Mass Effect 1-3)
    Tali'Zorah vas Normandy (Mass Effect 1-3)
    Juri as Jack (Mass Effect 3)
    Juri as Jack (Mass Effect 3)
    Commander Kazama N7
    Commander Kazama N7