// This runs on both the client and the server. // On the server, it only does the damage calculations. // On the client, it does all the effects. void FX_FireBullets( int iPlayerIndex, const Vector &vOrigin, const QAngle &vAngles, int iWeaponID, int iMode, int iSeed, float flSpread ) { bool bDoEffects = true; #ifdef CLIENT_DLL C_SDKPlayer *pPlayer = ToSDKPlayer( ClientEntityList().GetBaseEntity( iPlayerIndex ) ); #else CSDKPlayer *pPlayer = ToSDKPlayer( UTIL_PlayerByIndex( iPlayerIndex) ); #endif const char * weaponAlias = WeaponIDToAlias( iWeaponID ); if ( !weaponAlias ) { DevMsg("FX_FireBullets: weapon alias for ID %i not found\n", iWeaponID ); return; } char wpnName[128]; Q_snprintf( wpnName, sizeof( wpnName ), "weapon_%s", weaponAlias ); WEAPON_FILE_INFO_HANDLE hWpnInfo = LookupWeaponInfoSlot( wpnName ); if ( hWpnInfo == GetInvalidWeaponInfoHandle() ) { DevMsg("FX_FireBullets: LookupWeaponInfoSlot failed for weapon %s\n", wpnName ); return; } CSDKWeaponInfo *pWeaponInfo = static_cast< CSDKWeaponInfo* >( GetFileWeaponInfoFromHandle( hWpnInfo ) ); #ifdef CLIENT_DLL // Do the firing animation event. if ( pPlayer && !pPlayer->IsDormant() ) { pPlayer->m_PlayerAnimState->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); } #else // if this is server code, send the effect over to client as temp entity // Dispatch one message for all the bullet impacts and sounds. TE_FireBullets( iPlayerIndex, vOrigin, vAngles, iWeaponID, iMode, iSeed, flSpread ); bDoEffects = false; // no effects on server #endif iSeed++; int iDamage = pWeaponInfo->m_iDamage; int iAmmoType = pWeaponInfo->iAmmoType; WeaponSound_t sound_type = SINGLE; if ( bDoEffects) { FX_WeaponSound( iPlayerIndex, sound_type, vOrigin, pWeaponInfo ); } // Fire bullets, calculate impacts & effects if ( !pPlayer ) return; StartGroupingSounds(); #if !defined (CLIENT_DLL) // Move other players back to history positions based on local player's lag lagcompensation->StartLagCompensation( pPlayer, LAG_COMPENSATE_BOUNDS ); #endif for ( int iBullet=0; iBullet < pWeaponInfo->m_iBullets; iBullet++ ) { RandomSeed( iSeed ); // init random system with this seed // Get circular gaussian spread. float x, y; x = RandomFloat( -0.5, 0.5 ) + RandomFloat( -0.5, 0.5 ); y = RandomFloat( -0.5, 0.5 ) + RandomFloat( -0.5, 0.5 ); iSeed++; // use new seed for next bullet pPlayer->FireBullet( vOrigin, vAngles, flSpread, iDamage, iAmmoType, pPlayer, bDoEffects, x,y ); } #if !defined (CLIENT_DLL) lagcompensation->FinishLagCompensation( pPlayer ); #endif EndGroupingSounds(); }
// This runs on both the client and the server. // On the server, it only does the damage calculations. // On the client, it does all the effects. void FX_FireBullets( int iPlayerIndex, const Vector &vOrigin, const QAngle &vAngles, const CSDK_WeaponInfo *pWeaponInfo, int iMode, int iSeed, float flSpread ) { bool bDoEffects = true; #ifdef CLIENT_DLL C_SDK_Player *pPlayer = ToSDK_Player( ClientEntityList().GetBaseEntity( iPlayerIndex ) ); #else CSDK_Player *pPlayer = ToSDK_Player( UTIL_PlayerByIndex( iPlayerIndex) ); #endif iSeed++; int iDamage = pWeaponInfo->m_iDamage; int iAmmoType = pWeaponInfo->iAmmoType; WeaponSound_t sound_type = SINGLE; if ( bDoEffects) { FX_WeaponSound( iPlayerIndex, sound_type, vOrigin, pWeaponInfo ); } // Fire bullets, calculate impacts & effects if ( !pPlayer ) return; StartGroupingSounds(); #if !defined (CLIENT_DLL) // Move other players back to history positions based on local player's lag //lagcompensation->StartLagCompensation( pPlayer, pPlayer->GetCurrentCommand() ); #endif for ( int iBullet=0; iBullet < pWeaponInfo->m_iBullets; iBullet++ ) { RandomSeed( iSeed ); // init random system with this seed // Get circular gaussian spread. float x, y; x = RandomFloat( -0.5, 0.5 ) + RandomFloat( -0.5, 0.5 ); y = RandomFloat( -0.5, 0.5 ) + RandomFloat( -0.5, 0.5 ); iSeed++; // use new seed for next bullet pPlayer->FireBullet( vOrigin, vAngles, flSpread, iDamage, iAmmoType, pPlayer, bDoEffects, x,y ); } #if !defined (CLIENT_DLL) //lagcompensation->FinishLagCompensation( pPlayer ); #endif EndGroupingSounds(); }