You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
4.1 KiB
145 lines
4.1 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#ifndef PHYSICS_CANNISTER_H |
|
#define PHYSICS_CANNISTER_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "player_pickup.h" |
|
|
|
class CSteamJet; |
|
|
|
class CThrustController : public IMotionEvent |
|
{ |
|
DECLARE_SIMPLE_DATADESC(); |
|
|
|
public: |
|
IMotionEvent::simresult_e Simulate( IPhysicsMotionController *pController, IPhysicsObject *pObject, float deltaTime, Vector &linear, AngularImpulse &angular ) |
|
{ |
|
angular = m_torqueVector; |
|
linear = m_thrustVector; |
|
return SIM_LOCAL_ACCELERATION; |
|
} |
|
|
|
void CalcThrust( const Vector &position, const Vector &direction, IPhysicsObject *pPhys ) |
|
{ |
|
Vector force = direction * m_thrust * pPhys->GetMass(); |
|
|
|
// Adjust for the position of the thruster -- apply proper torque) |
|
pPhys->CalculateVelocityOffset( force, position, &m_thrustVector, &m_torqueVector ); |
|
pPhys->WorldToLocalVector( &m_thrustVector, m_thrustVector ); |
|
} |
|
|
|
Vector m_thrustVector; |
|
AngularImpulse m_torqueVector; |
|
float m_thrust; |
|
}; |
|
|
|
class CPhysicsCannister : public CBaseCombatCharacter, public CDefaultPlayerPickupVPhysics |
|
{ |
|
DECLARE_CLASS( CPhysicsCannister, CBaseCombatCharacter ); |
|
public: |
|
~CPhysicsCannister( void ); |
|
|
|
void Spawn( void ); |
|
void Precache( void ); |
|
virtual void OnRestore(); |
|
bool CreateVPhysics(); |
|
|
|
DECLARE_DATADESC(); |
|
virtual void VPhysicsUpdate( IPhysicsObject *pPhysics ); |
|
|
|
virtual QAngle PreferredCarryAngles( void ) { return QAngle( -90, 0, 0 ); } |
|
virtual bool HasPreferredCarryAnglesForPlayer( CBasePlayer *pPlayer ) { return true; } |
|
|
|
// |
|
// Input handlers. |
|
// |
|
void InputActivate(inputdata_t &data); |
|
void InputDeactivate(inputdata_t &data); |
|
void InputExplode(inputdata_t &data); |
|
void InputWake( inputdata_t &data ); |
|
|
|
bool TestCollision( const Ray_t &ray, unsigned int mask, trace_t& trace ); |
|
|
|
virtual int OnTakeDamage( const CTakeDamageInfo &info ); |
|
|
|
int ObjectCaps() |
|
{ |
|
return (BaseClass::ObjectCaps() | FCAP_IMPULSE_USE); |
|
} |
|
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) |
|
{ |
|
CBasePlayer *pPlayer = ToBasePlayer( pActivator ); |
|
if ( pPlayer ) |
|
{ |
|
pPlayer->PickupObject( this ); |
|
} |
|
} |
|
|
|
void CannisterActivate( CBaseEntity *pActivator, const Vector &thrustOffset ); |
|
void CannisterFire( CBaseEntity *pActivator ); |
|
void Deactivate( void ); |
|
void Explode( CBaseEntity *pAttacker ); |
|
void ExplodeTouch( CBaseEntity *pOther ); |
|
void VPhysicsCollision( int index, gamevcollisionevent_t *pEvent ); |
|
|
|
// Don't treat as a live target |
|
virtual bool IsAlive( void ) { return false; } |
|
|
|
virtual void TraceAttack( const CTakeDamageInfo &info, const Vector &dir, trace_t *ptr, CDmgAccumulator *pAccumulator ); |
|
|
|
void ShutdownJet( void ); |
|
void BeginShutdownThink( void ); |
|
|
|
public: |
|
virtual bool OnAttemptPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason ) { return true; } |
|
virtual void OnPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason ); |
|
virtual void OnPhysGunDrop( CBasePlayer *pPhysGunUser, PhysGunDrop_t reason ); |
|
virtual CBasePlayer *HasPhysicsAttacker( float dt ); |
|
virtual bool ShouldPuntUseLaunchForces( PhysGunForce_t reason ) |
|
{ |
|
if ( reason == PHYSGUN_FORCE_LAUNCHED ) |
|
return (m_thrustTime!=0); |
|
|
|
return false; |
|
} |
|
virtual AngularImpulse PhysGunLaunchAngularImpulse( void ) { return vec3_origin; } |
|
virtual Vector PhysGunLaunchVelocity( const Vector &forward, float flMass ) { return vec3_origin; } |
|
|
|
protected: |
|
void SetPhysicsAttacker( CBasePlayer *pEntity, float flTime ); |
|
|
|
|
|
public: |
|
Vector m_thrustOrigin; |
|
CThrustController m_thruster; |
|
IPhysicsMotionController *m_pController; |
|
CSteamJet *m_pJet; |
|
bool m_active; |
|
float m_thrustTime; |
|
float m_damage; |
|
float m_damageRadius; |
|
|
|
float m_activateTime; |
|
string_t m_gasSound; |
|
|
|
bool m_bFired; // True if this cannister was fire by a weapon |
|
|
|
COutputEvent m_onActivate; |
|
COutputEvent m_OnAwakened; |
|
|
|
CHandle<CBasePlayer> m_hPhysicsAttacker; |
|
float m_flLastPhysicsInfluenceTime; |
|
EHANDLE m_hLauncher; // Entity that caused this cannister to launch |
|
|
|
private: |
|
Vector CalcLocalThrust( const Vector &offset ); |
|
}; |
|
|
|
#endif // PHYSICS_CANNISTER_H
|
|
|