aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/shared/sdk/sdk_fx_shared.cpp
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/shared/sdk/sdk_fx_shared.cpp
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/shared/sdk/sdk_fx_shared.cpp')
-rw-r--r--mp/src/game/shared/sdk/sdk_fx_shared.cpp224
1 files changed, 224 insertions, 0 deletions
diff --git a/mp/src/game/shared/sdk/sdk_fx_shared.cpp b/mp/src/game/shared/sdk/sdk_fx_shared.cpp
new file mode 100644
index 00000000..f81f63b4
--- /dev/null
+++ b/mp/src/game/shared/sdk/sdk_fx_shared.cpp
@@ -0,0 +1,224 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+#include "sdk_fx_shared.h"
+#include "weapon_sdkbase.h"
+
+#ifndef CLIENT_DLL
+ #include "ilagcompensationmanager.h"
+#endif
+
+#ifdef CLIENT_DLL
+
+#include "fx_impact.h"
+#include "c_sdk_player.h"
+
+ // this is a cheap ripoff from CBaseCombatWeapon::WeaponSound():
+ void FX_WeaponSound(
+ int iPlayerIndex,
+ WeaponSound_t sound_type,
+ const Vector &vOrigin,
+ CSDKWeaponInfo *pWeaponInfo )
+ {
+
+ // If we have some sounds from the weapon classname.txt file, play a random one of them
+ const char *shootsound = pWeaponInfo->aShootSounds[ sound_type ];
+ if ( !shootsound || !shootsound[0] )
+ return;
+
+ CBroadcastRecipientFilter filter; // this is client side only
+ if ( !te->CanPredict() )
+ return;
+
+ CBaseEntity::EmitSound( filter, iPlayerIndex, shootsound, &vOrigin );
+ }
+
+ class CGroupedSound
+ {
+ public:
+ string_t m_SoundName;
+ Vector m_vPos;
+ };
+
+ CUtlVector<CGroupedSound> g_GroupedSounds;
+
+
+ // Called by the ImpactSound function.
+ void ShotgunImpactSoundGroup( const char *pSoundName, const Vector &vEndPos )
+ {
+ // Don't play the sound if it's too close to another impact sound.
+ for ( int i=0; i < g_GroupedSounds.Count(); i++ )
+ {
+ CGroupedSound *pSound = &g_GroupedSounds[i];
+
+ if ( vEndPos.DistToSqr( pSound->m_vPos ) < 300*300 )
+ {
+ if ( Q_stricmp( pSound->m_SoundName, pSoundName ) == 0 )
+ return;
+ }
+ }
+
+ // Ok, play the sound and add it to the list.
+ CLocalPlayerFilter filter;
+ C_BaseEntity::EmitSound( filter, NULL, pSoundName, &vEndPos );
+
+ int j = g_GroupedSounds.AddToTail();
+ g_GroupedSounds[j].m_SoundName = pSoundName;
+ g_GroupedSounds[j].m_vPos = vEndPos;
+ }
+
+
+ void StartGroupingSounds()
+ {
+ Assert( g_GroupedSounds.Count() == 0 );
+ SetImpactSoundRoute( ShotgunImpactSoundGroup );
+ }
+
+
+ void EndGroupingSounds()
+ {
+ g_GroupedSounds.Purge();
+ SetImpactSoundRoute( NULL );
+ }
+
+#else
+
+ #include "sdk_player.h"
+ #include "te_firebullets.h"
+
+ // Server doesn't play sounds anyway.
+ void StartGroupingSounds() {}
+ void EndGroupingSounds() {}
+ void FX_WeaponSound ( int iPlayerIndex,
+ WeaponSound_t sound_type,
+ const Vector &vOrigin,
+ CSDKWeaponInfo *pWeaponInfo ) {};
+
+#endif
+
+
+
+// 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() )
+ {
+ if ( iMode == Primary_Mode )
+ pPlayer->m_PlayerAnimState->DoAnimationEvent( PLAYERANIMEVENT_FIRE_GUN_PRIMARY );
+ else
+ pPlayer->m_PlayerAnimState->DoAnimationEvent( PLAYERANIMEVENT_FIRE_GUN_SECONDARY );
+ }
+#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, 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();
+}
+