Добавляем брызги при выстреле по воде
Water Splash
Добавляем брызги при выстреле по воде
Following translations are available : |
russian |
Всем привет! В этом туториале рассказано, как сделать при выстреле в воду брызги. Как и в моих прошлых туториалах, кода не очень много.
Сервер
Файл 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 );
}
}
Ну, всё.
Similar 1. Новые типы патронов - Каждый хоть раз добавлял в Хл новое оружие но ему не нравилось, что оно или слишком мощно стреляет или слишком слабо. 2. Новый монстр - В общем-то это самый лёгкий тутор который можно придумать. 3. Замедление игрока - Довольно забавно наблюдать, как игрок одинаково быстро бегает как с монтировкой в руках, так и с тяжелой базукой, хотя логичнее, что держа в руках сей девайс, он будет бегать медленнее
Cep}|{ 01/27/2013, 8:19:40 AM commented :
#1 Интересно, есть ли скриншоты результата?
master07 01/27/2013, 2:35:04 PM commented :
#3 я пробывал получилось
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.