//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: APIs for player pickup of physics objects // //=============================================================================// #ifndef PLAYER_PICKUP_H #define PLAYER_PICKUP_H #ifdef _WIN32 #pragma once #endif #ifdef HL2_DLL // Needed for launch velocity extern ConVar physcannon_minforce; extern ConVar physcannon_maxforce; #endif // Reasons behind a pickup enum PhysGunPickup_t { PICKED_UP_BY_CANNON, PUNTED_BY_CANNON, PICKED_UP_BY_PLAYER, // Picked up by +USE, not physgun. }; // Reasons behind a drop enum PhysGunDrop_t { DROPPED_BY_PLAYER, THROWN_BY_PLAYER, DROPPED_BY_CANNON, LAUNCHED_BY_CANNON, }; enum PhysGunForce_t { PHYSGUN_FORCE_DROPPED, // Dropped by +USE PHYSGUN_FORCE_THROWN, // Thrown from +USE PHYSGUN_FORCE_PUNTED, // Punted by cannon PHYSGUN_FORCE_LAUNCHED, // Launched by cannon }; void PlayerPickupObject( CBasePlayer *pPlayer, CBaseEntity *pObject ); void Pickup_ForcePlayerToDropThisObject( CBaseEntity *pTarget ); void Pickup_OnPhysGunDrop( CBaseEntity *pDroppedObject, CBasePlayer *pPlayer, PhysGunDrop_t reason ); void Pickup_OnPhysGunPickup( CBaseEntity *pPickedUpObject, CBasePlayer *pPlayer, PhysGunPickup_t reason = PICKED_UP_BY_CANNON ); bool Pickup_OnAttemptPhysGunPickup( CBaseEntity *pPickedUpObject, CBasePlayer *pPlayer, PhysGunPickup_t reason = PICKED_UP_BY_CANNON ); bool Pickup_GetPreferredCarryAngles( CBaseEntity *pObject, CBasePlayer *pPlayer, matrix3x4_t &localToWorld, QAngle &outputAnglesWorldSpace ); bool Pickup_ForcePhysGunOpen( CBaseEntity *pObject, CBasePlayer *pPlayer ); bool Pickup_ShouldPuntUseLaunchForces( CBaseEntity *pObject, PhysGunForce_t reason ); AngularImpulse Pickup_PhysGunLaunchAngularImpulse( CBaseEntity *pObject, PhysGunForce_t reason ); Vector Pickup_DefaultPhysGunLaunchVelocity( const Vector &vecForward, float flMass ); Vector Pickup_PhysGunLaunchVelocity( CBaseEntity *pObject, const Vector &vecForward, PhysGunForce_t reason ); CBaseEntity *Pickup_OnFailedPhysGunPickup( CBaseEntity *pPickedUpObject, Vector vPhysgunPos ); abstract_class IPlayerPickupVPhysics { public: // Callbacks for the physgun/cannon picking up an entity virtual bool OnAttemptPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason = PICKED_UP_BY_CANNON ) = 0; virtual CBaseEntity *OnFailedPhysGunPickup( Vector vPhysgunPos ) = 0; virtual void OnPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason = PICKED_UP_BY_CANNON ) = 0; virtual void OnPhysGunDrop( CBasePlayer *pPhysGunUser, PhysGunDrop_t Reason ) = 0; virtual bool HasPreferredCarryAnglesForPlayer( CBasePlayer *pPlayer = NULL ) = 0; virtual QAngle PreferredCarryAngles( void ) = 0; virtual bool ForcePhysgunOpen( CBasePlayer *pPlayer ) = 0; virtual AngularImpulse PhysGunLaunchAngularImpulse() = 0; virtual bool ShouldPuntUseLaunchForces( PhysGunForce_t reason ) = 0; virtual Vector PhysGunLaunchVelocity( const Vector &vecForward, float flMass ) = 0; }; class CDefaultPlayerPickupVPhysics : public IPlayerPickupVPhysics { public: virtual bool OnAttemptPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason = PICKED_UP_BY_CANNON ) { return true; } virtual CBaseEntity *OnFailedPhysGunPickup( Vector vPhysgunPos ) { return NULL; } virtual void OnPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason = PICKED_UP_BY_CANNON ) {} virtual void OnPhysGunDrop( CBasePlayer *pPhysGunUser, PhysGunDrop_t reason ) {} virtual bool HasPreferredCarryAnglesForPlayer( CBasePlayer *pPlayer ) { return false; } virtual QAngle PreferredCarryAngles( void ) { return vec3_angle; } virtual bool ForcePhysgunOpen( CBasePlayer *pPlayer ) { return false; } virtual AngularImpulse PhysGunLaunchAngularImpulse() { return RandomAngularImpulse( -600, 600 ); } virtual bool ShouldPuntUseLaunchForces( PhysGunForce_t reason ) { return reason == PHYSGUN_FORCE_LAUNCHED; } virtual Vector PhysGunLaunchVelocity( const Vector &vecForward, float flMass ) { return Pickup_DefaultPhysGunLaunchVelocity( vecForward, flMass ); } }; #endif // PLAYER_PICKUP_H