Merge pull request #93 from FreeSlave/opfor-update

Opfor update
This commit is contained in:
Andrey Akhmichin 2019-08-31 14:28:35 +05:00 committed by GitHub
commit e6400fdf1e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 313 additions and 119 deletions

View File

@ -86,6 +86,11 @@ if(${CMAKE_VERSION} VERSION_LESS "3.0.2")
endmacro() endmacro()
endif() endif()
if(NOT MSVC)
add_compile_options(-Wempty-body) # GCC/Clang flag
add_compile_options(-Wreturn-type) # GCC/Clang flag
endif()
if(BUILD_CLIENT) if(BUILD_CLIENT)
add_subdirectory(cl_dll) add_subdirectory(cl_dll)
endif() endif()

View File

@ -152,7 +152,7 @@ void WeaponsResource::LoadWeaponSprites( WEAPON *pWeapon )
pWeapon->hInactive = SPR_Load( sz ); pWeapon->hInactive = SPR_Load( sz );
pWeapon->rcInactive = p->rc; pWeapon->rcInactive = p->rc;
gHR.iHistoryGap = max( gHR.iHistoryGap, pWeapon->rcActive.bottom - pWeapon->rcActive.top ); gHR.iHistoryGap = Q_max( gHR.iHistoryGap, pWeapon->rcActive.bottom - pWeapon->rcActive.top );
} }
else else
pWeapon->hInactive = 0; pWeapon->hInactive = 0;
@ -174,7 +174,7 @@ void WeaponsResource::LoadWeaponSprites( WEAPON *pWeapon )
pWeapon->hAmmo = SPR_Load( sz ); pWeapon->hAmmo = SPR_Load( sz );
pWeapon->rcAmmo = p->rc; pWeapon->rcAmmo = p->rc;
gHR.iHistoryGap = max( gHR.iHistoryGap, pWeapon->rcActive.bottom - pWeapon->rcActive.top ); gHR.iHistoryGap = Q_max( gHR.iHistoryGap, pWeapon->rcActive.bottom - pWeapon->rcActive.top );
} }
else else
pWeapon->hAmmo = 0; pWeapon->hAmmo = 0;
@ -186,7 +186,7 @@ void WeaponsResource::LoadWeaponSprites( WEAPON *pWeapon )
pWeapon->hAmmo2 = SPR_Load( sz ); pWeapon->hAmmo2 = SPR_Load( sz );
pWeapon->rcAmmo2 = p->rc; pWeapon->rcAmmo2 = p->rc;
gHR.iHistoryGap = max( gHR.iHistoryGap, pWeapon->rcActive.bottom - pWeapon->rcActive.top ); gHR.iHistoryGap = Q_max( gHR.iHistoryGap, pWeapon->rcActive.bottom - pWeapon->rcActive.top );
} }
else else
pWeapon->hAmmo2 = 0; pWeapon->hAmmo2 = 0;
@ -320,7 +320,7 @@ int CHudAmmo::VidInit( void )
giBucketWidth = gHUD.GetSpriteRect( m_HUD_bucket0 ).right - gHUD.GetSpriteRect( m_HUD_bucket0 ).left; giBucketWidth = gHUD.GetSpriteRect( m_HUD_bucket0 ).right - gHUD.GetSpriteRect( m_HUD_bucket0 ).left;
giBucketHeight = gHUD.GetSpriteRect( m_HUD_bucket0 ).bottom - gHUD.GetSpriteRect( m_HUD_bucket0 ).top; giBucketHeight = gHUD.GetSpriteRect( m_HUD_bucket0 ).bottom - gHUD.GetSpriteRect( m_HUD_bucket0 ).top;
gHR.iHistoryGap = max( gHR.iHistoryGap, gHUD.GetSpriteRect( m_HUD_bucket0 ).bottom - gHUD.GetSpriteRect( m_HUD_bucket0 ).top ); gHR.iHistoryGap = Q_max( gHR.iHistoryGap, gHUD.GetSpriteRect( m_HUD_bucket0 ).bottom - gHUD.GetSpriteRect( m_HUD_bucket0 ).top );
// If we've already loaded weapons, let's get new sprites // If we've already loaded weapons, let's get new sprites
gWR.LoadAllWeaponSprites(); gWR.LoadAllWeaponSprites();
@ -861,7 +861,7 @@ int CHudAmmo::Draw( float flTime )
AmmoWidth = gHUD.GetSpriteRect( gHUD.m_HUD_number_0 ).right - gHUD.GetSpriteRect( gHUD.m_HUD_number_0 ).left; AmmoWidth = gHUD.GetSpriteRect( gHUD.m_HUD_number_0 ).right - gHUD.GetSpriteRect( gHUD.m_HUD_number_0 ).left;
a = (int)max( MIN_ALPHA, m_fFade ); a = (int)Q_max( MIN_ALPHA, m_fFade );
if( m_fFade > 0 ) if( m_fFade > 0 )
m_fFade -= ( gHUD.m_flTimeDelta * 20 ); m_fFade -= ( gHUD.m_flTimeDelta * 20 );

View File

@ -61,7 +61,7 @@ int CHudAmmoSecondary::Draw( float flTime )
// draw secondary ammo icons above normal ammo readout // draw secondary ammo icons above normal ammo readout
int a, x, y, r, g, b, AmmoWidth; int a, x, y, r, g, b, AmmoWidth;
UnpackRGB( r, g, b, RGB_YELLOWISH ); UnpackRGB( r, g, b, RGB_YELLOWISH );
a = (int)max( MIN_ALPHA, m_fFade ); a = (int)Q_max( MIN_ALPHA, m_fFade );
if( m_fFade > 0 ) if( m_fFade > 0 )
m_fFade -= ( gHUD.m_flTimeDelta * 20 ); // slowly lower alpha to fade out icons m_fFade -= ( gHUD.m_flTimeDelta * 20 ); // slowly lower alpha to fade out icons
ScaleColors( r, g, b, a ); ScaleColors( r, g, b, a );
@ -142,7 +142,7 @@ int CHudAmmoSecondary::MsgFunc_SecAmmoVal( const char *pszName, int iSize, void
int count = 0; int count = 0;
for( int i = 0; i < MAX_SEC_AMMO_VALUES; i++ ) for( int i = 0; i < MAX_SEC_AMMO_VALUES; i++ )
{ {
count += max( 0, m_iAmmoAmounts[i] ); count += Q_max( 0, m_iAmmoAmounts[i] );
} }
if( count == 0 ) if( count == 0 )

View File

@ -111,7 +111,7 @@ int HistoryResource::DrawAmmoHistory( float flTime )
{ {
if( rgAmmoHistory[i].type ) if( rgAmmoHistory[i].type )
{ {
rgAmmoHistory[i].DisplayTime = min( rgAmmoHistory[i].DisplayTime, gHUD.m_flTime + HISTORY_DRAW_TIME ); rgAmmoHistory[i].DisplayTime = Q_min( rgAmmoHistory[i].DisplayTime, gHUD.m_flTime + HISTORY_DRAW_TIME );
if( rgAmmoHistory[i].DisplayTime <= flTime ) if( rgAmmoHistory[i].DisplayTime <= flTime )
{ {
@ -127,7 +127,7 @@ int HistoryResource::DrawAmmoHistory( float flTime )
int r, g, b; int r, g, b;
UnpackRGB( r, g, b, RGB_YELLOWISH ); UnpackRGB( r, g, b, RGB_YELLOWISH );
float scale = ( rgAmmoHistory[i].DisplayTime - flTime ) * 80; float scale = ( rgAmmoHistory[i].DisplayTime - flTime ) * 80;
ScaleColors( r, g, b, min( scale, 255 ) ); ScaleColors( r, g, b, Q_min( scale, 255 ) );
// Draw the pic // Draw the pic
int ypos = ScreenHeight - (AMMO_PICKUP_PICK_HEIGHT + (AMMO_PICKUP_GAP * i)); int ypos = ScreenHeight - (AMMO_PICKUP_PICK_HEIGHT + (AMMO_PICKUP_GAP * i));
@ -158,7 +158,7 @@ int HistoryResource::DrawAmmoHistory( float flTime )
UnpackRGB( r, g, b, RGB_REDISH ); // if the weapon doesn't have ammo, display it as red UnpackRGB( r, g, b, RGB_REDISH ); // if the weapon doesn't have ammo, display it as red
float scale = ( rgAmmoHistory[i].DisplayTime - flTime ) * 80; float scale = ( rgAmmoHistory[i].DisplayTime - flTime ) * 80;
ScaleColors( r, g, b, min( scale, 255 ) ); ScaleColors( r, g, b, Q_min( scale, 255 ) );
int ypos = ScreenHeight - ( AMMO_PICKUP_PICK_HEIGHT + ( AMMO_PICKUP_GAP * i ) ); int ypos = ScreenHeight - ( AMMO_PICKUP_PICK_HEIGHT + ( AMMO_PICKUP_GAP * i ) );
int xpos = ScreenWidth - ( weap->rcInactive.right - weap->rcInactive.left ); int xpos = ScreenWidth - ( weap->rcInactive.right - weap->rcInactive.left );
@ -176,7 +176,7 @@ int HistoryResource::DrawAmmoHistory( float flTime )
UnpackRGB( r, g, b, RGB_YELLOWISH ); UnpackRGB( r, g, b, RGB_YELLOWISH );
float scale = ( rgAmmoHistory[i].DisplayTime - flTime ) * 80; float scale = ( rgAmmoHistory[i].DisplayTime - flTime ) * 80;
ScaleColors( r, g, b, min( scale, 255 ) ); ScaleColors( r, g, b, Q_min( scale, 255 ) );
int ypos = ScreenHeight - ( AMMO_PICKUP_PICK_HEIGHT + ( AMMO_PICKUP_GAP * i ) ); int ypos = ScreenHeight - ( AMMO_PICKUP_PICK_HEIGHT + ( AMMO_PICKUP_GAP * i ) );
int xpos = ScreenWidth - ( rect.right - rect.left ) - 10; int xpos = ScreenWidth - ( rect.right - rect.left ) - 10;

View File

@ -78,7 +78,7 @@ int CHudBattery::Draw( float flTime )
wrect_t rc; wrect_t rc;
rc = *m_prc2; rc = *m_prc2;
rc.top += m_iHeight * ( (float)( 100 - ( min( 100,m_iBat ) ) ) * 0.01 ); // battery can go from 0 to 100 so * 0.01 goes from 0 to 1 rc.top += m_iHeight * ( (float)( 100 - ( Q_min( 100, m_iBat ) ) ) * 0.01 ); // battery can go from 0 to 100 so * 0.01 goes from 0 to 1
UnpackRGB( r, g, b, RGB_YELLOWISH ); UnpackRGB( r, g, b, RGB_YELLOWISH );

View File

@ -148,8 +148,8 @@ inline void CenterPrint( const char *string )
inline void PlaySound( const char *szSound, float vol ) { gEngfuncs.pfnPlaySoundByName( szSound, vol ); } inline void PlaySound( const char *szSound, float vol ) { gEngfuncs.pfnPlaySoundByName( szSound, vol ); }
inline void PlaySound( int iSound, float vol ) { gEngfuncs.pfnPlaySoundByIndex( iSound, vol ); } inline void PlaySound( int iSound, float vol ) { gEngfuncs.pfnPlaySoundByIndex( iSound, vol ); }
#define max(a, b) (((a) > (b)) ? (a) : (b)) #define Q_max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b)) #define Q_min(a, b) (((a) < (b)) ? (a) : (b))
#define fabs(x) ((x) > 0 ? (x) : 0 - (x)) #define fabs(x) ((x) > 0 ? (x) : 0 - (x))
void ScaleColors( int &r, int &g, int &b, int a ); void ScaleColors( int &r, int &g, int &b, int a );

View File

@ -106,7 +106,7 @@ int CHudDeathNotice::Draw( float flTime )
continue; continue;
} }
rgDeathNoticeList[i].flDisplayTime = min( rgDeathNoticeList[i].flDisplayTime, gHUD.m_flTime + DEATHNOTICE_DISPLAY_TIME ); rgDeathNoticeList[i].flDisplayTime = Q_min( rgDeathNoticeList[i].flDisplayTime, gHUD.m_flTime + DEATHNOTICE_DISPLAY_TIME );
// Only draw if the viewport will let me // Only draw if the viewport will let me
// vgui dropped out // vgui dropped out

View File

@ -238,6 +238,14 @@ float EV_HLDM_PlayTextureSound( int idx, pmtrace_t *ptr, float *vecSrc, float *v
fattn = 1.0; fattn = 1.0;
cnt = 2; cnt = 2;
break; break;
case CHAR_TEX_SNOW:
fvol = 0.9;
fvolbar = 0.1;
rgsz[0] = "player/pl_snow1.wav";
rgsz[1] = "player/pl_snow2.wav";
rgsz[2] = "player/pl_snow3.wav";
cnt = 3;
break;
} }
// play material hit sound // play material hit sound

View File

@ -273,25 +273,25 @@ void CHudHealth::CalcDamageDirection( vec3_t vecFrom )
if( side > 0 ) if( side > 0 )
{ {
if( side > 0.3 ) if( side > 0.3 )
m_fAttackFront = max( m_fAttackFront, side ); m_fAttackFront = Q_max( m_fAttackFront, side );
} }
else else
{ {
float f = fabs( side ); float f = fabs( side );
if( f > 0.3 ) if( f > 0.3 )
m_fAttackRear = max( m_fAttackRear, f ); m_fAttackRear = Q_max( m_fAttackRear, f );
} }
if( front > 0 ) if( front > 0 )
{ {
if( front > 0.3 ) if( front > 0.3 )
m_fAttackRight = max( m_fAttackRight, front ); m_fAttackRight = Q_max( m_fAttackRight, front );
} }
else else
{ {
float f = fabs( front ); float f = fabs( front );
if( f > 0.3 ) if( f > 0.3 )
m_fAttackLeft = max( m_fAttackLeft, f ); m_fAttackLeft = Q_max( m_fAttackLeft, f );
} }
} }
} }
@ -313,28 +313,28 @@ int CHudHealth::DrawPain( float flTime )
if( m_fAttackFront > 0.4 ) if( m_fAttackFront > 0.4 )
{ {
GetPainColor( r, g, b ); GetPainColor( r, g, b );
shade = a * max( m_fAttackFront, 0.5 ); shade = a * Q_max( m_fAttackFront, 0.5 );
ScaleColors( r, g, b, shade ); ScaleColors( r, g, b, shade );
SPR_Set( m_hSprite, r, g, b ); SPR_Set( m_hSprite, r, g, b );
x = ScreenWidth / 2 - SPR_Width( m_hSprite, 0 ) / 2; x = ScreenWidth / 2 - SPR_Width( m_hSprite, 0 ) / 2;
y = ScreenHeight / 2 - SPR_Height( m_hSprite, 0 ) * 3; y = ScreenHeight / 2 - SPR_Height( m_hSprite, 0 ) * 3;
SPR_DrawAdditive( 0, x, y, NULL ); SPR_DrawAdditive( 0, x, y, NULL );
m_fAttackFront = max( 0, m_fAttackFront - fFade ); m_fAttackFront = Q_max( 0, m_fAttackFront - fFade );
} else } else
m_fAttackFront = 0; m_fAttackFront = 0;
if( m_fAttackRight > 0.4 ) if( m_fAttackRight > 0.4 )
{ {
GetPainColor( r, g, b ); GetPainColor( r, g, b );
shade = a * max( m_fAttackRight, 0.5 ); shade = a * Q_max( m_fAttackRight, 0.5 );
ScaleColors( r, g, b, shade ); ScaleColors( r, g, b, shade );
SPR_Set( m_hSprite, r, g, b ); SPR_Set( m_hSprite, r, g, b );
x = ScreenWidth / 2 + SPR_Width( m_hSprite, 1 ) * 2; x = ScreenWidth / 2 + SPR_Width( m_hSprite, 1 ) * 2;
y = ScreenHeight / 2 - SPR_Height( m_hSprite,1 ) / 2; y = ScreenHeight / 2 - SPR_Height( m_hSprite,1 ) / 2;
SPR_DrawAdditive( 1, x, y, NULL ); SPR_DrawAdditive( 1, x, y, NULL );
m_fAttackRight = max( 0, m_fAttackRight - fFade ); m_fAttackRight = Q_max( 0, m_fAttackRight - fFade );
} }
else else
m_fAttackRight = 0; m_fAttackRight = 0;
@ -342,14 +342,14 @@ int CHudHealth::DrawPain( float flTime )
if( m_fAttackRear > 0.4 ) if( m_fAttackRear > 0.4 )
{ {
GetPainColor( r, g, b ); GetPainColor( r, g, b );
shade = a * max( m_fAttackRear, 0.5 ); shade = a * Q_max( m_fAttackRear, 0.5 );
ScaleColors( r, g, b, shade ); ScaleColors( r, g, b, shade );
SPR_Set( m_hSprite, r, g, b ); SPR_Set( m_hSprite, r, g, b );
x = ScreenWidth / 2 - SPR_Width( m_hSprite, 2 ) / 2; x = ScreenWidth / 2 - SPR_Width( m_hSprite, 2 ) / 2;
y = ScreenHeight / 2 + SPR_Height( m_hSprite, 2 ) * 2; y = ScreenHeight / 2 + SPR_Height( m_hSprite, 2 ) * 2;
SPR_DrawAdditive( 2, x, y, NULL ); SPR_DrawAdditive( 2, x, y, NULL );
m_fAttackRear = max( 0, m_fAttackRear - fFade ); m_fAttackRear = Q_max( 0, m_fAttackRear - fFade );
} }
else else
m_fAttackRear = 0; m_fAttackRear = 0;
@ -357,7 +357,7 @@ int CHudHealth::DrawPain( float flTime )
if( m_fAttackLeft > 0.4 ) if( m_fAttackLeft > 0.4 )
{ {
GetPainColor( r, g, b ); GetPainColor( r, g, b );
shade = a * max( m_fAttackLeft, 0.5 ); shade = a * Q_max( m_fAttackLeft, 0.5 );
ScaleColors( r, g, b, shade ); ScaleColors( r, g, b, shade );
SPR_Set( m_hSprite, r, g, b ); SPR_Set( m_hSprite, r, g, b );
@ -365,7 +365,7 @@ int CHudHealth::DrawPain( float flTime )
y = ScreenHeight / 2 - SPR_Height( m_hSprite,3 ) / 2; y = ScreenHeight / 2 - SPR_Height( m_hSprite,3 ) / 2;
SPR_DrawAdditive( 3, x, y, NULL ); SPR_DrawAdditive( 3, x, y, NULL );
m_fAttackLeft = max( 0, m_fAttackLeft - fFade ); m_fAttackLeft = Q_max( 0, m_fAttackLeft - fFade );
} else } else
m_fAttackLeft = 0; m_fAttackLeft = 0;
@ -397,7 +397,7 @@ int CHudHealth::DrawDamage( float flTime )
SPR_Set( gHUD.GetSprite( m_HUD_dmg_bio + i ), r, g, b ); SPR_Set( gHUD.GetSprite( m_HUD_dmg_bio + i ), r, g, b );
SPR_DrawAdditive( 0, pdmg->x, pdmg->y, &gHUD.GetSpriteRect( m_HUD_dmg_bio + i ) ); SPR_DrawAdditive( 0, pdmg->x, pdmg->y, &gHUD.GetSpriteRect( m_HUD_dmg_bio + i ) );
pdmg->fExpire = min( flTime + DMG_IMAGE_LIFE, pdmg->fExpire ); pdmg->fExpire = Q_min( flTime + DMG_IMAGE_LIFE, pdmg->fExpire );
if( pdmg->fExpire <= flTime // when the time has expired if( pdmg->fExpire <= flTime // when the time has expired
&& a < 40 ) // and the flash is at the low point of the cycle && a < 40 ) // and the flash is at the low point of the cycle

View File

@ -75,7 +75,7 @@ void CHud::Think( void )
if( m_iFOV == 0 ) if( m_iFOV == 0 )
{ {
// only let players adjust up in fov, and only if they are not overriden by something else // only let players adjust up in fov, and only if they are not overriden by something else
m_iFOV = max( default_fov->value, 90 ); m_iFOV = Q_max( default_fov->value, 90 );
} }
} }

View File

@ -96,7 +96,7 @@ int CHudSayText::Draw( float flTime )
int y = Y_START; int y = Y_START;
// make sure the scrolltime is within reasonable bounds, to guard against the clock being reset // make sure the scrolltime is within reasonable bounds, to guard against the clock being reset
flScrollTime = min( flScrollTime, flTime + m_HUD_saytext_time->value ); flScrollTime = Q_min( flScrollTime, flTime + m_HUD_saytext_time->value );
if( flScrollTime <= flTime ) if( flScrollTime <= flTime )
{ {
@ -123,8 +123,8 @@ int CHudSayText::Draw( float flTime )
static char buf[MAX_PLAYER_NAME_LENGTH + 32]; static char buf[MAX_PLAYER_NAME_LENGTH + 32];
// draw the first x characters in the player color // draw the first x characters in the player color
strncpy( buf, g_szLineBuffer[i], min(g_iNameLengths[i], MAX_PLAYER_NAME_LENGTH + 32 ) ); strncpy( buf, g_szLineBuffer[i], Q_min(g_iNameLengths[i], MAX_PLAYER_NAME_LENGTH + 32 ) );
buf[min( g_iNameLengths[i], MAX_PLAYER_NAME_LENGTH + 31 )] = 0; buf[Q_min( g_iNameLengths[i], MAX_PLAYER_NAME_LENGTH + 31 )] = 0;
DrawSetTextColor( g_pflNameColors[i][0], g_pflNameColors[i][1], g_pflNameColors[i][2] ); DrawSetTextColor( g_pflNameColors[i][0], g_pflNameColors[i][1], g_pflNameColors[i][2] );
int x = DrawConsoleString( LINE_START, y, buf ); int x = DrawConsoleString( LINE_START, y, buf );
@ -193,7 +193,7 @@ void CHudSayText::SayTextPrint( const char *pszBuf, int iBufSize, int clientInde
} }
} }
strncpy( g_szLineBuffer[i], pszBuf, max( iBufSize - 1, MAX_CHARS_PER_LINE - 1 ) ); strncpy( g_szLineBuffer[i], pszBuf, Q_max( iBufSize - 1, MAX_CHARS_PER_LINE - 1 ) );
// make sure the text fits in one line // make sure the text fits in one line
EnsureTextFitsInOneLineAndWrapIfHaveTo( i ); EnsureTextFitsInOneLineAndWrapIfHaveTo( i );

View File

@ -561,7 +561,7 @@ int CHudScoreboard::MsgFunc_TeamInfo( const char *pszName, int iSize, void *pbuf
if( g_TeamInfo[j].name[0] == '\0' ) if( g_TeamInfo[j].name[0] == '\0' )
break; break;
} }
m_iNumTeams = max( j, m_iNumTeams ); m_iNumTeams = Q_max( j, m_iNumTeams );
strncpy( g_TeamInfo[j].name, g_PlayerExtraInfo[i].teamname, MAX_TEAM_NAME ); strncpy( g_TeamInfo[j].name, g_PlayerExtraInfo[i].teamname, MAX_TEAM_NAME );
g_TeamInfo[j].players = 0; g_TeamInfo[j].players = 0;

View File

@ -197,7 +197,7 @@ int CHudStatusBar::Draw( float fTime )
// let user set status ID bar centering // let user set status ID bar centering
if( ( i == STATUSBAR_ID_LINE ) && CVAR_GET_FLOAT( "hud_centerid" ) ) if( ( i == STATUSBAR_ID_LINE ) && CVAR_GET_FLOAT( "hud_centerid" ) )
{ {
x = max( 0, max( 2, ( ScreenWidth - TextWidth ) ) / 2 ); x = Q_max( 0, Q_max( 2, ( ScreenWidth - TextWidth ) ) / 2 );
y = ( ScreenHeight / 2 ) + ( TextHeight * CVAR_GET_FLOAT( "hud_centerid" ) ); y = ( ScreenHeight / 2 ) + ( TextHeight * CVAR_GET_FLOAT( "hud_centerid" ) );
} }

View File

@ -213,8 +213,8 @@ float V_CalcBob( struct ref_params_s *pparams )
bob = sqrt( vel[0] * vel[0] + vel[1] * vel[1] ) * cl_bob->value; bob = sqrt( vel[0] * vel[0] + vel[1] * vel[1] ) * cl_bob->value;
bob = bob * 0.3 + bob * 0.7 * sin(cycle); bob = bob * 0.3 + bob * 0.7 * sin(cycle);
bob = min( bob, 4 ); bob = Q_min( bob, 4 );
bob = max( bob, -7 ); bob = Q_max( bob, -7 );
return bob; return bob;
} }
@ -708,7 +708,7 @@ void V_CalcNormalRefdef( struct ref_params_s *pparams )
if( dt > 0.0 ) if( dt > 0.0 )
{ {
frac = ( t - ViewInterp.OriginTime[foundidx & ORIGIN_MASK] ) / dt; frac = ( t - ViewInterp.OriginTime[foundidx & ORIGIN_MASK] ) / dt;
frac = min( 1.0, frac ); frac = Q_min( 1.0, frac );
VectorSubtract( ViewInterp.Origins[( foundidx + 1 ) & ORIGIN_MASK], ViewInterp.Origins[foundidx & ORIGIN_MASK], delta ); VectorSubtract( ViewInterp.Origins[( foundidx + 1 ) & ORIGIN_MASK], ViewInterp.Origins[foundidx & ORIGIN_MASK], delta );
VectorMA( ViewInterp.Origins[foundidx & ORIGIN_MASK], frac, delta, neworg ); VectorMA( ViewInterp.Origins[foundidx & ORIGIN_MASK], frac, delta, neworg );
@ -1576,7 +1576,7 @@ void V_DropPunchAngle( float frametime, float *ev_punchangle )
len = VectorNormalize( ev_punchangle ); len = VectorNormalize( ev_punchangle );
len -= ( 10.0 + len * 0.5 ) * frametime; len -= ( 10.0 + len * 0.5 ) * frametime;
len = max( len, 0.0 ); len = Q_max( len, 0.0 );
VectorScale( ev_punchangle, len, ev_punchangle ); VectorScale( ev_punchangle, len, ev_punchangle );
} }

View File

@ -892,6 +892,11 @@ void ClientPrecache( void )
PRECACHE_SOUND( "player/pl_wade3.wav" ); PRECACHE_SOUND( "player/pl_wade3.wav" );
PRECACHE_SOUND( "player/pl_wade4.wav" ); PRECACHE_SOUND( "player/pl_wade4.wav" );
PRECACHE_SOUND( "player/pl_snow1.wav" ); // walk on snow
PRECACHE_SOUND( "player/pl_snow2.wav" );
PRECACHE_SOUND( "player/pl_snow3.wav" );
PRECACHE_SOUND( "player/pl_snow4.wav" );
PRECACHE_SOUND( "debris/wood1.wav" ); // hit wood texture PRECACHE_SOUND( "debris/wood1.wav" ); // hit wood texture
PRECACHE_SOUND( "debris/wood2.wav" ); PRECACHE_SOUND( "debris/wood2.wav" );
PRECACHE_SOUND( "debris/wood3.wav" ); PRECACHE_SOUND( "debris/wood3.wav" );

View File

@ -598,6 +598,7 @@ void CCTFMultiplay::ChangePlayerTeam(CBasePlayer *pPlayer, int iTeam)
WRITE_BYTE(ENTINDEX(pPlayer->edict())); WRITE_BYTE(ENTINDEX(pPlayer->edict()));
WRITE_SHORT(pPlayer->pev->frags); WRITE_SHORT(pPlayer->pev->frags);
WRITE_SHORT(pPlayer->m_iDeaths); WRITE_SHORT(pPlayer->m_iDeaths);
WRITE_SHORT(0);
WRITE_SHORT(pPlayer->pev->team); WRITE_SHORT(pPlayer->pev->team);
MESSAGE_END(); MESSAGE_END();

View File

@ -20,6 +20,7 @@
#include "cbase.h" #include "cbase.h"
#include "monsters.h" #include "monsters.h"
#include "schedule.h" #include "schedule.h"
#include "defaultai.h"
#include "weapons.h" #include "weapons.h"
#include "talkmonster.h" #include "talkmonster.h"
#include "soundent.h" #include "soundent.h"
@ -32,16 +33,21 @@ public:
void SetYawSpeed(void); void SetYawSpeed(void);
int ISoundMask(void); int ISoundMask(void);
virtual int ObjectCaps( void ) { return CTalkMonster::ObjectCaps() | FCAP_IMPULSE_USE; } virtual int ObjectCaps( void ) { return CTalkMonster::ObjectCaps() | FCAP_IMPULSE_USE; }
int Classify() { return CLASS_PLAYER_ALLY_MILITARY; }
void DeathSound( void ); void DeathSound( void );
void PainSound( void ); void PainSound( void );
Schedule_t *GetScheduleOfType(int Type);
Schedule_t *GetSchedule(void);
void DeclineFollowing(); void DeclineFollowing();
void EXPORT DrillUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value);
virtual int Save( CSave &save ); virtual int Save( CSave &save );
virtual int Restore( CRestore &restore ); virtual int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[]; static TYPEDESCRIPTION m_SaveData[];
void TalkInit();
float m_painTime; float m_painTime;
}; };
@ -85,15 +91,7 @@ void CDrillSergeant::Spawn()
m_afCapability = bits_CAP_HEAR | bits_CAP_TURN_HEAD | bits_CAP_DOORS_GROUP; m_afCapability = bits_CAP_HEAR | bits_CAP_TURN_HEAD | bits_CAP_DOORS_GROUP;
MonsterInit(); MonsterInit();
SetUse( &CDrillSergeant::DrillUse ); SetUse( &CTalkMonster::FollowerUse );
}
void CDrillSergeant::DrillUse(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value)
{
if( m_useTime > gpGlobals->time )
return;
if( pCaller != NULL && pCaller->IsPlayer() && IRelationship(pCaller) < R_DL && IRelationship(pCaller) != R_FR )
DeclineFollowing();
} }
void CDrillSergeant::DeclineFollowing() void CDrillSergeant::DeclineFollowing()
@ -173,3 +171,143 @@ void CDrillSergeant::DeathSound( void )
break; break;
} }
} }
void CDrillSergeant::TalkInit()
{
CTalkMonster::TalkInit();
m_szGrp[TLK_ANSWER] = "DR_ANSWER";
m_szGrp[TLK_QUESTION] = "DR_QUESTION";
m_szGrp[TLK_IDLE] = "DR_IDLE";
m_szGrp[TLK_STARE] = "DR_STARE";
m_szGrp[TLK_USE] = "DR_OK";
m_szGrp[TLK_UNUSE] = "DR_WAIT";
m_szGrp[TLK_STOP] = "DR_STOP";
m_szGrp[TLK_NOSHOOT] = "DR_SCARED";
m_szGrp[TLK_HELLO] = "DR_HELLO";
m_szGrp[TLK_PLHURT1] = "!DR_CUREA";
m_szGrp[TLK_PLHURT2] = "!DR_CUREB";
m_szGrp[TLK_PLHURT3] = "!DR_CUREC";
m_szGrp[TLK_PHELLO] = NULL;// UNDONE
m_szGrp[TLK_PIDLE] = NULL;// UNDONE
m_szGrp[TLK_PQUESTION] = "DR_PQUEST";
m_szGrp[TLK_SMELL] = "DR_SMELL";
m_szGrp[TLK_WOUND] = "DR_WOUND";
m_szGrp[TLK_MORTAL] = "DR_MORTAL";
}
extern Schedule_t slBaFaceTarget[];
extern Schedule_t slBaFollow[];
extern Schedule_t slIdleBaStand[];
Schedule_t *CDrillSergeant::GetScheduleOfType( int Type )
{
Schedule_t *psched;
switch( Type )
{
// Hook these to make a looping schedule
case SCHED_TARGET_FACE:
// call base class default so that barney will talk
// when 'used'
psched = CTalkMonster::GetScheduleOfType( Type );
if( psched == slIdleStand )
return slBaFaceTarget; // override this for different target face behavior
else
return psched;
case SCHED_TARGET_CHASE:
return slBaFollow;
case SCHED_IDLE_STAND:
// call base class default so that scientist will talk
// when standing during idle
psched = CTalkMonster::GetScheduleOfType( Type );
if( psched == slIdleStand )
{
// just look straight ahead.
return slIdleBaStand;
}
else
return psched;
}
return CTalkMonster::GetScheduleOfType( Type );
}
Schedule_t *CDrillSergeant::GetSchedule( void )
{
if( HasConditions( bits_COND_HEAR_SOUND ) )
{
CSound *pSound;
pSound = PBestSound();
ASSERT( pSound != NULL );
if( pSound && (pSound->m_iType & bits_SOUND_DANGER) )
return GetScheduleOfType( SCHED_TAKE_COVER_FROM_BEST_SOUND );
}
switch( m_MonsterState )
{
case MONSTERSTATE_COMBAT:
{
// dead enemy
if( HasConditions( bits_COND_ENEMY_DEAD ) )
{
// call base class, all code to handle dead enemies is centralized there.
return CBaseMonster::GetSchedule();
}
// always act surprized with a new enemy
if( HasConditions( bits_COND_NEW_ENEMY ) && HasConditions( bits_COND_LIGHT_DAMAGE ) )
return GetScheduleOfType( SCHED_SMALL_FLINCH );
if( HasConditions( bits_COND_HEAVY_DAMAGE ) )
return GetScheduleOfType( SCHED_TAKE_COVER_FROM_ENEMY );
}
break;
case MONSTERSTATE_ALERT:
case MONSTERSTATE_IDLE:
if( HasConditions( bits_COND_LIGHT_DAMAGE | bits_COND_HEAVY_DAMAGE ) )
{
// flinch if hurt
return GetScheduleOfType( SCHED_SMALL_FLINCH );
}
if( m_hEnemy == 0 && IsFollowing() )
{
if( !m_hTargetEnt->IsAlive() )
{
// UNDONE: Comment about the recently dead player here?
StopFollowing( FALSE );
break;
}
else
{
if( HasConditions( bits_COND_CLIENT_PUSH ) )
{
return GetScheduleOfType( SCHED_MOVE_AWAY_FOLLOW );
}
return GetScheduleOfType( SCHED_TARGET_FACE );
}
}
if( HasConditions( bits_COND_CLIENT_PUSH ) )
{
return GetScheduleOfType( SCHED_MOVE_AWAY );
}
// try to say something about smells
TrySmellTalk();
break;
default:
break;
}
return CTalkMonster::GetSchedule();
}

View File

@ -2311,6 +2311,7 @@ int CHFGrunt :: TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, flo
PlaySentence( "FG_SHOT", 4, VOL_NORM, ATTN_NORM ); PlaySentence( "FG_SHOT", 4, VOL_NORM, ATTN_NORM );
} }
} }
return ret;
} }
//========================================================= //=========================================================

View File

@ -131,7 +131,7 @@ void CPenguinGrenade::Spawn(void)
pev->gravity = 0.5; pev->gravity = 0.5;
pev->friction = 0.5; pev->friction = 0.5;
pev->dmg = gSkillData.snarkDmgPop; pev->dmg = gSkillData.plrDmgHandGrenade;
m_flDie = gpGlobals->time + PENGUIN_DETONATE_DELAY; m_flDie = gpGlobals->time + PENGUIN_DETONATE_DELAY;
@ -161,33 +161,12 @@ void CPenguinGrenade::Precache(void)
void CPenguinGrenade::Killed(entvars_t *pevAttacker, int iGib) void CPenguinGrenade::Killed(entvars_t *pevAttacker, int iGib)
{ {
pev->model = iStringNull;// make invisible if( m_hOwner != 0 )
SetThink(&CPenguinGrenade::SUB_Remove); pev->owner = m_hOwner->edict();
SetTouch(NULL); CGrenade::Detonate();
pev->nextthink = gpGlobals->time + 0.1; UTIL_BloodDrips( pev->origin, g_vecZero, BloodColor(), 80 );
if( m_hOwner != 0 )
// since squeak grenades never leave a body behind, clear out their takedamage now.
// Squeaks do a bit of radius damage when they pop, and that radius damage will
// continue to call this function unless we acknowledge the Squeak's death now. (sjb)
pev->takedamage = DAMAGE_NO;
// play squeek blast
EMIT_SOUND_DYN(ENT(pev), CHAN_ITEM, "squeek/sqk_blast1.wav", 1, 0.5, 0, PITCH_NORM);
CSoundEnt::InsertSound(bits_SOUND_COMBAT, pev->origin, SMALL_EXPLOSION_VOLUME, 3.0);
UTIL_BloodDrips(pev->origin, g_vecZero, BloodColor(), 80);
if (m_hOwner != 0)
RadiusDamage(pev, m_hOwner->pev, pev->dmg, CLASS_NONE, DMG_BLAST);
else
RadiusDamage(pev, pev, pev->dmg, CLASS_NONE, DMG_BLAST);
// reset owner so death message happens
if (m_hOwner != 0)
pev->owner = m_hOwner->edict(); pev->owner = m_hOwner->edict();
CBaseMonster::Killed(pevAttacker, GIB_ALWAYS);
} }
void CPenguinGrenade::GibMonster(void) void CPenguinGrenade::GibMonster(void)
@ -358,7 +337,8 @@ void CPenguinGrenade::SuperBounceTouch(CBaseEntity *pOther)
else else
ApplyMultiDamage(pev, pev); ApplyMultiDamage(pev, pev);
pev->dmg += gSkillData.snarkDmgPop; // add more explosion damage pev->dmg += gSkillData.plrDmgHandGrenade; // add more explosion damage
pev->dmg = Q_min(pev->dmg, 500);
// m_flDie += 2.0; // add more life // m_flDie += 2.0; // add more life
// make bite sound // make bite sound

View File

@ -26,10 +26,11 @@
#include "decals.h" #include "decals.h"
#include "soundent.h" #include "soundent.h"
#include "game.h" #include "game.h"
#include "weapons.h"
#define VOLTIGORE_SPRINT_DIST 256 // how close the voltigore has to get before starting to sprint and refusing to swerve #define VOLTIGORE_SPRINT_DIST 256 // how close the voltigore has to get before starting to sprint and refusing to swerve
#define VOLTIGORE_MAX_BEAMS 12 #define VOLTIGORE_MAX_BEAMS 8
#define VOLTIGORE_CLASSNAME "monster_alien_voltigore" #define VOLTIGORE_CLASSNAME "monster_alien_voltigore"
#define VOLTIGORE_BABY_CLASSNAME "monster_alien_babyvoltigore" #define VOLTIGORE_BABY_CLASSNAME "monster_alien_babyvoltigore"
@ -39,10 +40,10 @@
#define VOLTIGORE_ZAP_BLUE 255 #define VOLTIGORE_ZAP_BLUE 255
#define VOLTIGORE_ZAP_BEAM "sprites/lgtning.spr" #define VOLTIGORE_ZAP_BEAM "sprites/lgtning.spr"
#define VOLTIGORE_ZAP_NOISE 80 #define VOLTIGORE_ZAP_NOISE 80
#define VOLTIGORE_ZAP_WIDTH 40 #define VOLTIGORE_ZAP_WIDTH 30
#define VOLTIGORE_ZAP_BRIGHTNESS 255 #define VOLTIGORE_ZAP_BRIGHTNESS 255
#define VOLTIGORE_ZAP_DISTANCE 512 #define VOLTIGORE_ZAP_DISTANCE 512
#define VOLTIGORE_GLOW_SCALE 1.0f #define VOLTIGORE_GLOW_SCALE 0.75f
#define VOLTIGORE_GIB_COUNT 9 #define VOLTIGORE_GIB_COUNT 9
#define VOLTIGORE_GLOW_SPRITE "sprites/blueflare2.spr" #define VOLTIGORE_GLOW_SPRITE "sprites/blueflare2.spr"
@ -68,8 +69,8 @@ public:
void Spawn(void); void Spawn(void);
static void Shoot(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity); static void Shoot(entvars_t *pevOwner, Vector vecStart, Vector vecVelocity);
void Touch(CBaseEntity *pOther); void EXPORT BallTouch(CBaseEntity *pOther);
void EXPORT BeamThink(void); void EXPORT FlyThink(void);
virtual int Save(CSave &save); virtual int Save(CSave &save);
virtual int Restore(CRestore &restore); virtual int Restore(CRestore &restore);
@ -112,7 +113,7 @@ void CVoltigoreEnergyBall::Spawn(void)
pev->solid = SOLID_BBOX; pev->solid = SOLID_BBOX;
pev->rendermode = kRenderTransAdd; pev->rendermode = kRenderTransAdd;
pev->renderamt = 220; pev->renderamt = 255;
SET_MODEL(ENT(pev), VOLTIGORE_GLOW_SPRITE); SET_MODEL(ENT(pev), VOLTIGORE_GLOW_SPRITE);
pev->frame = 0; pev->frame = 0;
@ -135,14 +136,15 @@ void CVoltigoreEnergyBall::Shoot(entvars_t *pevOwner, Vector vecStart, Vector ve
pEnergyBall->pev->velocity = vecVelocity; pEnergyBall->pev->velocity = vecVelocity;
pEnergyBall->pev->owner = ENT(pevOwner); pEnergyBall->pev->owner = ENT(pevOwner);
pEnergyBall->SetThink(&CVoltigoreEnergyBall::BeamThink); pEnergyBall->SetTouch(&CVoltigoreEnergyBall::BallTouch);
pEnergyBall->SetThink(&CVoltigoreEnergyBall::FlyThink);
pEnergyBall->pev->nextthink = gpGlobals->time + 0.1; pEnergyBall->pev->nextthink = gpGlobals->time + 0.1;
} }
//========================================================= //=========================================================
// Purpose: // Purpose:
//========================================================= //=========================================================
void CVoltigoreEnergyBall::Touch(CBaseEntity *pOther) void CVoltigoreEnergyBall::BallTouch(CBaseEntity *pOther)
{ {
if (m_timeToDie) { if (m_timeToDie) {
return; return;
@ -157,17 +159,18 @@ void CVoltigoreEnergyBall::Touch(CBaseEntity *pOther)
} }
else else
{ {
pOther->TakeDamage(pev, VARS( pev->owner ), gSkillData.voltigoreDmgBeam, DMG_SHOCK); pOther->TakeDamage(pev, VARS( pev->owner ), gSkillData.voltigoreDmgBeam, DMG_SHOCK|DMG_ALWAYSGIB);
} }
pev->velocity = Vector(0,0,0); pev->velocity = Vector(0,0,0);
m_timeToDie = gpGlobals->time + 0.3; m_timeToDie = gpGlobals->time + 0.3;
ResetTouch();
} }
//========================================================= //=========================================================
// Purpose: // Purpose:
//========================================================= //=========================================================
void CVoltigoreEnergyBall::BeamThink(void) void CVoltigoreEnergyBall::FlyThink(void)
{ {
pev->nextthink = gpGlobals->time + 0.1; pev->nextthink = gpGlobals->time + 0.1;
if (m_timeToDie) if (m_timeToDie)
@ -628,26 +631,18 @@ void CVoltigore::HandleAnimEvent(MonsterEvent_t *pEvent)
case VOLTIGORE_AE_THROW: case VOLTIGORE_AE_THROW:
{ {
// SOUND HERE! // SOUND HERE!
Vector vecSpitOffset;
Vector vecSpitDir; Vector vecSpitDir;
UTIL_MakeVectors(pev->angles); UTIL_MakeVectors(pev->angles);
// !!!HACKHACK - the spot at which the spit originates (in front of the mouth) was measured in 3ds and hardcoded here. Vector vecSpitOrigin, vecAngles;
// we should be able to read the position of bones at runtime for this info. GetAttachment(3, vecSpitOrigin, vecAngles);
vecSpitOffset = (gpGlobals->v_right * 8 + gpGlobals->v_forward * 37 + gpGlobals->v_up * 23); vecSpitDir = ShootAtEnemy(vecSpitOrigin);
vecSpitOffset = (pev->origin + vecSpitOffset);
vecSpitDir = ((m_hEnemy->pev->origin + m_hEnemy->pev->view_ofs) - vecSpitOffset).Normalize();
vecSpitDir.x += RANDOM_FLOAT(-0.01, 0.01);
vecSpitDir.y += RANDOM_FLOAT(-0.01, 0.01);
vecSpitDir.z += RANDOM_FLOAT(-0.01, 0);
// do stuff for this event. // do stuff for this event.
//AttackSound(); //AttackSound();
CVoltigoreEnergyBall::Shoot(pev, vecSpitOffset, vecSpitDir * 1000); CVoltigoreEnergyBall::Shoot(pev, vecSpitOrigin, vecSpitDir * 1000);
// turn the beam glow off. // turn the beam glow off.
DestroyBeams(); DestroyBeams();
@ -664,13 +659,20 @@ void CVoltigore::HandleAnimEvent(MonsterEvent_t *pEvent)
// SOUND HERE! // SOUND HERE!
CBaseEntity *pHurt = CheckTraceHullAttack(120, gSkillData.voltigoreDmgPunch, DMG_CLUB); CBaseEntity *pHurt = CheckTraceHullAttack(120, gSkillData.voltigoreDmgPunch, DMG_CLUB);
if (pHurt) if (pHurt)
{
if (FBitSet(pHurt->pev->flags, FL_MONSTER|FL_CLIENT))
{ {
pHurt->pev->punchangle.z = -15; pHurt->pev->punchangle.z = -15;
pHurt->pev->punchangle.x = 15; pHurt->pev->punchangle.x = 15;
pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_right * -150; pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_right * -150;
pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_up * 100; pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_up * 100;
}
EMIT_SOUND(ENT(pev), CHAN_VOICE, RANDOM_SOUND_ARRAY(pMeleeHitSounds), RANDOM_FLOAT(0.8, 0.9), ATTN_NORM); EMIT_SOUND(ENT(pev), CHAN_VOICE, RANDOM_SOUND_ARRAY(pMeleeHitSounds), RANDOM_FLOAT(0.8, 0.9), ATTN_NORM);
Vector vecArmPos, vecArmAng;
GetAttachment( 0, vecArmPos, vecArmAng );
SpawnBlood( vecArmPos, pHurt->BloodColor(), 25 );// a little surface blood.
} }
else else
{ {
@ -684,12 +686,19 @@ void CVoltigore::HandleAnimEvent(MonsterEvent_t *pEvent)
// SOUND HERE! // SOUND HERE!
CBaseEntity *pHurt = CheckTraceHullAttack(120, gSkillData.voltigoreDmgPunch, DMG_CLUB); CBaseEntity *pHurt = CheckTraceHullAttack(120, gSkillData.voltigoreDmgPunch, DMG_CLUB);
if (pHurt) if (pHurt)
{
if (FBitSet(pHurt->pev->flags, FL_MONSTER|FL_CLIENT))
{ {
pHurt->pev->punchangle.x = 20; pHurt->pev->punchangle.x = 20;
pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_forward * 150; pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_forward * 150;
pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_up * 100; pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_up * 100;
}
EMIT_SOUND(ENT(pev), CHAN_VOICE, RANDOM_SOUND_ARRAY(pMeleeHitSounds), RANDOM_FLOAT(0.8, 0.9), ATTN_NORM); EMIT_SOUND(ENT(pev), CHAN_VOICE, RANDOM_SOUND_ARRAY(pMeleeHitSounds), RANDOM_FLOAT(0.8, 0.9), ATTN_NORM);
Vector vecArmPos, vecArmAng;
GetAttachment( 0, vecArmPos, vecArmAng );
SpawnBlood( vecArmPos, pHurt->BloodColor(), 25 );// a little surface blood.
} }
else else
{ {
@ -814,7 +823,8 @@ Schedule_t slVoltigoreRangeAttack1[] =
bits_COND_NEW_ENEMY | bits_COND_NEW_ENEMY |
bits_COND_ENEMY_DEAD | bits_COND_ENEMY_DEAD |
bits_COND_HEAVY_DAMAGE | bits_COND_HEAVY_DAMAGE |
bits_COND_ENEMY_OCCLUDED | // Attack animation is quite long, so it's better to not stop it when enemy hides
//bits_COND_ENEMY_OCCLUDED |
bits_COND_NO_AMMO_LOADED, bits_COND_NO_AMMO_LOADED,
0, 0,
"Voltigore Range Attack1" "Voltigore Range Attack1"
@ -1041,7 +1051,7 @@ void CVoltigore::Killed(entvars_t *pevAttacker, int iGib)
WRITE_SHORT( m_beamTexture ); WRITE_SHORT( m_beamTexture );
WRITE_BYTE( 0 ); // framestart WRITE_BYTE( 0 ); // framestart
WRITE_BYTE( 10 ); // framerate WRITE_BYTE( 10 ); // framerate
WRITE_BYTE( RANDOM_LONG( 10, 15 ) ); // life WRITE_BYTE( RANDOM_LONG( 8, 10 ) ); // life
WRITE_BYTE( VOLTIGORE_ZAP_WIDTH ); // width WRITE_BYTE( VOLTIGORE_ZAP_WIDTH ); // width
WRITE_BYTE( VOLTIGORE_ZAP_NOISE ); // noise WRITE_BYTE( VOLTIGORE_ZAP_NOISE ); // noise
WRITE_BYTE( VOLTIGORE_ZAP_RED ); // r, g, b WRITE_BYTE( VOLTIGORE_ZAP_RED ); // r, g, b
@ -1151,7 +1161,7 @@ void CVoltigore::UpdateBeams()
void CVoltigore::CreateGlow() void CVoltigore::CreateGlow()
{ {
m_pBeamGlow = CSprite::SpriteCreate(VOLTIGORE_GLOW_SPRITE, pev->origin, FALSE); m_pBeamGlow = CSprite::SpriteCreate(VOLTIGORE_GLOW_SPRITE, pev->origin, FALSE);
m_pBeamGlow->SetTransparency(kRenderTransAdd, 255, 255, 255, 255, kRenderFxNoDissipation); m_pBeamGlow->SetTransparency(kRenderTransAdd, 255, 255, 255, 0, kRenderFxNoDissipation);
m_pBeamGlow->SetAttachment(edict(), 4); m_pBeamGlow->SetAttachment(edict(), 4);
m_pBeamGlow->SetScale(VOLTIGORE_GLOW_SCALE); m_pBeamGlow->SetScale(VOLTIGORE_GLOW_SCALE);
} }
@ -1262,13 +1272,20 @@ void CBabyVoltigore::HandleAnimEvent(MonsterEvent_t* pEvent)
{ {
CBaseEntity *pHurt = CheckTraceHullAttack(70, gSkillData.babyVoltigoreDmgPunch, DMG_CLUB | DMG_ALWAYSGIB); CBaseEntity *pHurt = CheckTraceHullAttack(70, gSkillData.babyVoltigoreDmgPunch, DMG_CLUB | DMG_ALWAYSGIB);
if (pHurt) if (pHurt)
{
if (FBitSet(pHurt->pev->flags, FL_MONSTER|FL_CLIENT))
{ {
pHurt->pev->punchangle.z = -10; pHurt->pev->punchangle.z = -10;
pHurt->pev->punchangle.x = 10; pHurt->pev->punchangle.x = 10;
pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_right * -100; pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_right * -100;
pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_up * 50; pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_up * 50;
}
EMIT_SOUND(ENT(pev), CHAN_VOICE, RANDOM_SOUND_ARRAY(pMeleeHitSounds), RANDOM_FLOAT(0.8, 0.9), ATTN_NORM); EMIT_SOUND(ENT(pev), CHAN_VOICE, RANDOM_SOUND_ARRAY(pMeleeHitSounds), RANDOM_FLOAT(0.8, 0.9), ATTN_NORM);
Vector vecArmPos, vecArmAng;
GetAttachment( 0, vecArmPos, vecArmAng );
SpawnBlood( vecArmPos, pHurt->BloodColor(), 25 );// a little surface blood.
} }
else else
{ {
@ -1281,12 +1298,19 @@ void CBabyVoltigore::HandleAnimEvent(MonsterEvent_t* pEvent)
{ {
CBaseEntity *pHurt = CheckTraceHullAttack(70, gSkillData.babyVoltigoreDmgPunch, DMG_CLUB | DMG_ALWAYSGIB); CBaseEntity *pHurt = CheckTraceHullAttack(70, gSkillData.babyVoltigoreDmgPunch, DMG_CLUB | DMG_ALWAYSGIB);
if (pHurt) if (pHurt)
{
if (FBitSet(pHurt->pev->flags, FL_MONSTER|FL_CLIENT))
{ {
pHurt->pev->punchangle.x = 15; pHurt->pev->punchangle.x = 15;
pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_forward * 100; pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_forward * 100;
pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_up * 50; pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_up * 50;
}
EMIT_SOUND(ENT(pev), CHAN_VOICE, RANDOM_SOUND_ARRAY(pMeleeHitSounds), RANDOM_FLOAT(0.8, 0.9), ATTN_NORM); EMIT_SOUND(ENT(pev), CHAN_VOICE, RANDOM_SOUND_ARRAY(pMeleeHitSounds), RANDOM_FLOAT(0.8, 0.9), ATTN_NORM);
Vector vecArmPos, vecArmAng;
GetAttachment( 0, vecArmPos, vecArmAng );
SpawnBlood( vecArmPos, pHurt->BloodColor(), 25 );// a little surface blood.
} }
else else
{ {

View File

@ -318,8 +318,6 @@ public:
void TabulateAmmo( void ); void TabulateAmmo( void );
Vector m_vecLastViewAngles;
float m_flStartCharge; float m_flStartCharge;
float m_flAmmoStartCharge; float m_flAmmoStartCharge;
float m_flPlayAftershock; float m_flPlayAftershock;
@ -376,6 +374,8 @@ public:
void Service_Grapple( void ); void Service_Grapple( void );
Vector m_vecLastViewAngles;
bool m_bSentBhopcap; // If false, the player just joined and needs a bhopcap message. bool m_bSentBhopcap; // If false, the player just joined and needs a bhopcap message.
bool m_bIsClimbing; bool m_bIsClimbing;

View File

@ -1652,6 +1652,14 @@ float TEXTURETYPE_PlaySound( TraceResult *ptr, Vector vecSrc, Vector vecEnd, in
fattn = 1.0; fattn = 1.0;
cnt = 2; cnt = 2;
break; break;
case CHAR_TEX_SNOW:
fvol = 0.9;
fvolbar = 0.1;
rgsz[0] = "player/pl_snow1.wav";
rgsz[1] = "player/pl_snow2.wav";
rgsz[2] = "player/pl_snow3.wav";
cnt = 3;
break;
} }
// did we hit a breakable? // did we hit a breakable?

View File

@ -72,6 +72,7 @@ playermove_t *pmove = NULL;
#define CHAR_TEX_COMPUTER 'P' #define CHAR_TEX_COMPUTER 'P'
#define CHAR_TEX_GLASS 'Y' #define CHAR_TEX_GLASS 'Y'
#define CHAR_TEX_FLESH 'F' #define CHAR_TEX_FLESH 'F'
#define CHAR_TEX_SNOW 'O'
#define STEP_CONCRETE 0 // default step sound #define STEP_CONCRETE 0 // default step sound
#define STEP_METAL 1 // metal floor #define STEP_METAL 1 // metal floor
@ -82,6 +83,7 @@ playermove_t *pmove = NULL;
#define STEP_SLOSH 6 // shallow liquid puddle #define STEP_SLOSH 6 // shallow liquid puddle
#define STEP_WADE 7 // wading in liquid #define STEP_WADE 7 // wading in liquid
#define STEP_LADDER 8 // climbing ladder #define STEP_LADDER 8 // climbing ladder
#define STEP_SNOW 9
#define PLAYER_FATAL_FALL_SPEED 1024// approx 60 feet #define PLAYER_FATAL_FALL_SPEED 1024// approx 60 feet
#define PLAYER_MAX_SAFE_FALL_SPEED 580// approx 20 feet #define PLAYER_MAX_SAFE_FALL_SPEED 580// approx 20 feet
@ -486,6 +488,25 @@ void PM_PlayStepSound( int step, float fvol )
break; break;
} }
break; break;
case STEP_SNOW:
switch( irand )
{
// right foot
case 0:
pmove->PM_PlaySound( CHAN_BODY, "player/pl_snow1.wav", fvol, ATTN_NORM, 0, PITCH_NORM );
break;
case 1:
pmove->PM_PlaySound( CHAN_BODY, "player/pl_snow3.wav", fvol, ATTN_NORM, 0, PITCH_NORM );
break;
// left foot
case 2:
pmove->PM_PlaySound( CHAN_BODY, "player/pl_snow2.wav", fvol, ATTN_NORM, 0, PITCH_NORM );
break;
case 3:
pmove->PM_PlaySound( CHAN_BODY, "player/pl_snow4.wav", fvol, ATTN_NORM, 0, PITCH_NORM );
break;
}
break;
} }
} }
@ -508,6 +529,8 @@ int PM_MapTextureTypeStepType( char chTextureType )
return STEP_TILE; return STEP_TILE;
case CHAR_TEX_SLOSH: case CHAR_TEX_SLOSH:
return STEP_SLOSH; return STEP_SLOSH;
case CHAR_TEX_SNOW:
return STEP_SNOW;
} }
} }
@ -647,6 +670,7 @@ void PM_UpdateStepSound( void )
pmove->flTimeStepSound = fWalking ? 400 : 300; pmove->flTimeStepSound = fWalking ? 400 : 300;
break; break;
case CHAR_TEX_DIRT: case CHAR_TEX_DIRT:
case CHAR_TEX_SNOW:
fvol = fWalking ? 0.25 : 0.55; fvol = fWalking ? 0.25 : 0.55;
pmove->flTimeStepSound = fWalking ? 400 : 300; pmove->flTimeStepSound = fWalking ? 400 : 300;
break; break;