Статистика ( по source картам ), шт.
Добавляем брызги при выстреле по воде
Water Splash
Добавляем брызги при выстреле по воде
Имеются следующие переводы : |
русский |
Всем привет! В этом туториале рассказано, как сделать при выстреле в воду брызги. Как и в моих прошлых туториалах, кода не очень много.
Сервер
Файл 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;
В этом же файле после gmsgTeamNames = REG_USER_MSG( "TeamNames", -1 );
gmsgWaterSplash = REG_USER_MSG( "WaterSplash", 6 );
Файл 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;
}
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. Исходный код снайперки - weapon_sniperrifle с оптическим прицелом 2. Как адаптировать код к модели - Допустим, вы сделали новую модель для автомата MP5, но порядок и кол-во анимаций не сходятся. 3. Изменяем классы монстров злой барн - Как известно, первое что хочет сделать начинающий кодер (по крайней так было у меня ) это написать какое-нибудь оружие и изменить монстров. 4. учёные не отставали - Как сделать так, чтобы учёные не отставали на каждом препятствии 5. Sparks - Как добавить искры 6. Звук попадания как в HL2 - Работа на клиенте 7. Добавление эффектов блеска для энтити (entity) - Данная статья - перевод урока от OsirisGodoftheDead с ModDB...
Cep}|{ 27.01.2013, 8:19:40 пишет :
#1 Интересно, есть ли скриншоты результата?
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 Внёс некоторые изменения в урок
#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" );
Вы не можете комментировать, т.к. вы не зарегистрированы.