diff options
| author | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
| commit | 39ed87570bdb2f86969d4be821c94b722dc71179 (patch) | |
| tree | abc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/server/player_pickup.cpp | |
| download | source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip | |
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/server/player_pickup.cpp')
| -rw-r--r-- | mp/src/game/server/player_pickup.cpp | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/mp/src/game/server/player_pickup.cpp b/mp/src/game/server/player_pickup.cpp new file mode 100644 index 00000000..d1d1c230 --- /dev/null +++ b/mp/src/game/server/player_pickup.cpp @@ -0,0 +1,175 @@ +//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+#include "cbase.h"
+#include "player_pickup.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+// player pickup utility routine
+void Pickup_ForcePlayerToDropThisObject( CBaseEntity *pTarget )
+{
+ if ( pTarget == NULL )
+ return;
+
+ IPhysicsObject *pPhysics = pTarget->VPhysicsGetObject();
+
+ if ( pPhysics == NULL )
+ return;
+
+ if ( pPhysics->GetGameFlags() & FVPHYSICS_PLAYER_HELD )
+ {
+ CBasePlayer *pPlayer = UTIL_GetLocalPlayer();
+ pPlayer->ForceDropOfCarriedPhysObjects( pTarget );
+ }
+}
+
+
+void Pickup_OnPhysGunDrop( CBaseEntity *pDroppedObject, CBasePlayer *pPlayer, PhysGunDrop_t Reason )
+{
+ IPlayerPickupVPhysics *pPickup = dynamic_cast<IPlayerPickupVPhysics *>(pDroppedObject);
+ if ( pPickup )
+ {
+ pPickup->OnPhysGunDrop( pPlayer, Reason );
+ }
+}
+
+
+void Pickup_OnPhysGunPickup( CBaseEntity *pPickedUpObject, CBasePlayer *pPlayer, PhysGunPickup_t reason )
+{
+ IPlayerPickupVPhysics *pPickup = dynamic_cast<IPlayerPickupVPhysics *>(pPickedUpObject);
+ if ( pPickup )
+ {
+ pPickup->OnPhysGunPickup( pPlayer, reason );
+ }
+
+ // send phys gun pickup item event, but only in single player
+ if ( !g_pGameRules->IsMultiplayer() )
+ {
+ IGameEvent *event = gameeventmanager->CreateEvent( "physgun_pickup" );
+ if ( event )
+ {
+ event->SetInt( "entindex", pPickedUpObject->entindex() );
+ gameeventmanager->FireEvent( event );
+ }
+ }
+}
+
+bool Pickup_OnAttemptPhysGunPickup( CBaseEntity *pPickedUpObject, CBasePlayer *pPlayer, PhysGunPickup_t reason )
+{
+ IPlayerPickupVPhysics *pPickup = dynamic_cast<IPlayerPickupVPhysics *>(pPickedUpObject);
+ if ( pPickup )
+ {
+ return pPickup->OnAttemptPhysGunPickup( pPlayer, reason );
+ }
+ return true;
+}
+
+CBaseEntity *Pickup_OnFailedPhysGunPickup( CBaseEntity *pPickedUpObject, Vector vPhysgunPos )
+{
+ IPlayerPickupVPhysics *pPickup = dynamic_cast<IPlayerPickupVPhysics *>(pPickedUpObject);
+ if ( pPickup )
+ {
+ return pPickup->OnFailedPhysGunPickup( vPhysgunPos );
+ }
+
+ return NULL;
+}
+
+bool Pickup_GetPreferredCarryAngles( CBaseEntity *pObject, CBasePlayer *pPlayer, matrix3x4_t &localToWorld, QAngle &outputAnglesWorldSpace )
+{
+ IPlayerPickupVPhysics *pPickup = dynamic_cast<IPlayerPickupVPhysics *>(pObject);
+ if ( pPickup )
+ {
+ if ( pPickup->HasPreferredCarryAnglesForPlayer( pPlayer ) )
+ {
+ outputAnglesWorldSpace = TransformAnglesToWorldSpace( pPickup->PreferredCarryAngles(), localToWorld );
+ return true;
+ }
+ }
+ return false;
+}
+
+bool Pickup_ForcePhysGunOpen( CBaseEntity *pObject, CBasePlayer *pPlayer )
+{
+ IPlayerPickupVPhysics *pPickup = dynamic_cast<IPlayerPickupVPhysics *>(pObject);
+ if ( pPickup )
+ {
+ return pPickup->ForcePhysgunOpen( pPlayer );
+ }
+ return false;
+}
+
+AngularImpulse Pickup_PhysGunLaunchAngularImpulse( CBaseEntity *pObject, PhysGunForce_t reason )
+{
+ IPlayerPickupVPhysics *pPickup = dynamic_cast<IPlayerPickupVPhysics *>(pObject);
+ if ( pPickup != NULL && pPickup->ShouldPuntUseLaunchForces( reason ) )
+ {
+ return pPickup->PhysGunLaunchAngularImpulse();
+ }
+ return RandomAngularImpulse( -600, 600 );
+}
+
+Vector Pickup_DefaultPhysGunLaunchVelocity( const Vector &vecForward, float flMass )
+{
+#ifdef HL2_DLL
+ // Calculate the velocity based on physcannon rules
+ float flForceMax = physcannon_maxforce.GetFloat();
+ float flForce = flForceMax;
+
+ float mass = flMass;
+ if ( mass > 100 )
+ {
+ mass = MIN( mass, 1000 );
+ float flForceMin = physcannon_minforce.GetFloat();
+ flForce = SimpleSplineRemapValClamped( mass, 100, 600, flForceMax, flForceMin );
+ }
+
+ return ( vecForward * flForce );
+#endif
+
+ // Do the simple calculation
+ return ( vecForward * flMass );
+}
+
+Vector Pickup_PhysGunLaunchVelocity( CBaseEntity *pObject, const Vector &vecForward, PhysGunForce_t reason )
+{
+ // The object must be valid
+ if ( pObject == NULL )
+ {
+ Assert( 0 );
+ return vec3_origin;
+ }
+
+ // Shouldn't ever get here with a non-vphysics object.
+ IPhysicsObject *pPhysicsObject = pObject->VPhysicsGetObject();
+ if ( pPhysicsObject == NULL )
+ {
+ Assert( 0 );
+ return vec3_origin;
+ }
+
+ // Call the pickup entity's callback
+ IPlayerPickupVPhysics *pPickup = dynamic_cast<IPlayerPickupVPhysics *>(pObject);
+ if ( pPickup != NULL && pPickup->ShouldPuntUseLaunchForces( reason ) )
+ return pPickup->PhysGunLaunchVelocity( vecForward, pPhysicsObject->GetMass() );
+
+ // Do our default behavior
+ return Pickup_DefaultPhysGunLaunchVelocity( vecForward, pPhysicsObject->GetMass() );
+}
+
+bool Pickup_ShouldPuntUseLaunchForces( CBaseEntity *pObject, PhysGunForce_t reason )
+{
+ IPlayerPickupVPhysics *pPickup = dynamic_cast<IPlayerPickupVPhysics *>(pObject);
+ if ( pPickup )
+ {
+ return pPickup->ShouldPuntUseLaunchForces( reason );
+ }
+ return false;
+}
+
|