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/physobj.h | |
| 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/physobj.h')
| -rw-r--r-- | mp/src/game/server/physobj.h | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/mp/src/game/server/physobj.h b/mp/src/game/server/physobj.h new file mode 100644 index 00000000..088d5629 --- /dev/null +++ b/mp/src/game/server/physobj.h @@ -0,0 +1,237 @@ +//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef PHYSOBJ_H
+#define PHYSOBJ_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#ifndef PHYSICS_H
+#include "physics.h"
+#endif
+
+#include "entityoutput.h"
+#include "func_break.h"
+#include "player_pickup.h"
+
+// ---------------------------------------------------------------------
+//
+// CPhysBox -- physically simulated brush rectangular solid
+//
+// ---------------------------------------------------------------------
+// Physbox Spawnflags. Start at 0x01000 to avoid collision with CBreakable's
+#define SF_PHYSBOX_ASLEEP 0x01000
+#define SF_PHYSBOX_IGNOREUSE 0x02000
+#define SF_PHYSBOX_DEBRIS 0x04000
+#define SF_PHYSBOX_MOTIONDISABLED 0x08000
+#define SF_PHYSBOX_USEPREFERRED 0x10000
+#define SF_PHYSBOX_ENABLE_ON_PHYSCANNON 0x20000
+#define SF_PHYSBOX_NO_ROTORWASH_PUSH 0x40000 // The rotorwash doesn't push these
+#define SF_PHYSBOX_ENABLE_PICKUP_OUTPUT 0x80000
+#define SF_PHYSBOX_ALWAYS_PICK_UP 0x100000 // Physcannon can always pick this up, no matter what mass or constraints may apply.
+#define SF_PHYSBOX_NEVER_PICK_UP 0x200000 // Physcannon will never be able to pick this up.
+#define SF_PHYSBOX_NEVER_PUNT 0x400000 // Physcannon will never be able to punt this object.
+#define SF_PHYSBOX_PREVENT_PLAYER_TOUCH_ENABLE 0x800000 // If set, the player will not cause the object to enable its motion when bumped into
+
+// UNDONE: Hook collisions into the physics system to generate touch functions and take damage on falls
+// UNDONE: Base class PhysBrush
+class CPhysBox : public CBreakable
+{
+DECLARE_CLASS( CPhysBox, CBreakable );
+
+public:
+ DECLARE_SERVERCLASS();
+
+ void Spawn ( void );
+ bool CreateVPhysics();
+ void Move( const Vector &force );
+ virtual int ObjectCaps();
+ virtual void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
+
+ virtual int DrawDebugTextOverlays(void);
+
+ virtual void VPhysicsUpdate( IPhysicsObject *pPhysics );
+ virtual void VPhysicsCollision( int index, gamevcollisionevent_t *pEvent );
+ int OnTakeDamage( const CTakeDamageInfo &info );
+ void EnableMotion( void );
+
+ bool CanBePickedUpByPhyscannon();
+
+ // IPlayerPickupVPhysics
+ virtual void OnPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason );
+ virtual void OnPhysGunDrop( CBasePlayer *pPhysGunUser, PhysGunDrop_t Reason );
+
+ bool HasPreferredCarryAnglesForPlayer( CBasePlayer *pPlayer );
+ virtual QAngle PreferredCarryAngles( void ) { return m_angPreferredCarryAngles; }
+
+ // inputs
+ void InputWake( inputdata_t &inputdata );
+ void InputSleep( inputdata_t &inputdata );
+ void InputEnableMotion( inputdata_t &inputdata );
+ void InputDisableMotion( inputdata_t &inputdata );
+ void InputForceDrop( inputdata_t &inputdata );
+ void InputDisableFloating( inputdata_t &inputdata );
+
+ DECLARE_DATADESC();
+
+protected:
+ int m_damageType;
+ float m_massScale;
+ string_t m_iszOverrideScript;
+ int m_damageToEnableMotion;
+ float m_flForceToEnableMotion;
+ QAngle m_angPreferredCarryAngles;
+ bool m_bNotSolidToWorld;
+
+ // Outputs
+ COutputEvent m_OnDamaged;
+ COutputEvent m_OnAwakened;
+ COutputEvent m_OnMotionEnabled;
+ COutputEvent m_OnPhysGunPickup;
+ COutputEvent m_OnPhysGunPunt;
+ COutputEvent m_OnPhysGunOnlyPickup;
+ COutputEvent m_OnPhysGunDrop;
+ COutputEvent m_OnPlayerUse;
+
+ CHandle<CBasePlayer> m_hCarryingPlayer; // Player who's carrying us
+};
+
+// ---------------------------------------------------------------------
+//
+// CPhysExplosion -- physically simulated explosion
+//
+// ---------------------------------------------------------------------
+class CPhysExplosion : public CPointEntity
+{
+public:
+ DECLARE_CLASS( CPhysExplosion, CPointEntity );
+
+ void Spawn ( void );
+ void Explode( CBaseEntity *pActivator, CBaseEntity *pCaller );
+
+ CBaseEntity *FindEntity( CBaseEntity *pEntity, CBaseEntity *pActivator, CBaseEntity *pCaller );
+
+ int DrawDebugTextOverlays(void);
+
+ // Input handlers
+ void InputExplode( inputdata_t &inputdata );
+
+ DECLARE_DATADESC();
+private:
+
+ float GetRadius( void );
+
+ float m_damage;
+ float m_radius;
+ string_t m_targetEntityName;
+ float m_flInnerRadius;
+
+ COutputEvent m_OnPushedPlayer;
+};
+
+
+//==================================================
+// CPhysImpact
+//==================================================
+
+class CPhysImpact : public CPointEntity
+{
+public:
+ DECLARE_CLASS( CPhysImpact, CPointEntity );
+
+ void Spawn( void );
+ //void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
+ void Activate( void );
+
+ void InputImpact( inputdata_t &inputdata );
+
+ DECLARE_DATADESC();
+
+private:
+
+ void PointAtEntity( void );
+
+ float m_damage;
+ float m_distance;
+ string_t m_directionEntityName;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose: A magnet that creates constraints between itself and anything it touches
+//-----------------------------------------------------------------------------
+
+struct magnetted_objects_t
+{
+ IPhysicsConstraint *pConstraint;
+ EHANDLE hEntity;
+
+ DECLARE_SIMPLE_DATADESC();
+};
+
+class CPhysMagnet : public CBaseAnimating, public IPhysicsConstraintEvent
+{
+ DECLARE_CLASS( CPhysMagnet, CBaseAnimating );
+public:
+ DECLARE_DATADESC();
+ DECLARE_SERVERCLASS();
+
+ CPhysMagnet();
+ ~CPhysMagnet();
+
+ void Spawn( void );
+ void Precache( void );
+ void Touch( CBaseEntity *pOther );
+ void VPhysicsCollision( int index, gamevcollisionevent_t *pEvent );
+ void DoMagnetSuck( CBaseEntity *pOther );
+ void SetConstraintGroup( IPhysicsConstraintGroup *pGroup );
+
+ bool IsOn( void ) { return m_bActive; }
+ int GetNumAttachedObjects( void );
+ float GetTotalMassAttachedObjects( void );
+ CBaseEntity *GetAttachedObject( int iIndex );
+
+ // Checking for hitting something
+ void ResetHasHitSomething( void ) { m_bHasHitSomething = false; }
+ bool HasHitSomething( void ) { return m_bHasHitSomething; }
+
+ // Inputs
+ void InputToggle( inputdata_t &inputdata );
+ void InputTurnOn( inputdata_t &inputdata );
+ void InputTurnOff( inputdata_t &inputdata );
+
+ void InputConstraintBroken( inputdata_t &inputdata );
+
+ void DetachAll( void );
+
+// IPhysicsConstraintEvent
+public:
+ void ConstraintBroken( IPhysicsConstraint *pConstraint );
+
+protected:
+ // Outputs
+ COutputEvent m_OnMagnetAttach;
+ COutputEvent m_OnMagnetDetach;
+
+ // Keys
+ float m_massScale;
+ string_t m_iszOverrideScript;
+ float m_forceLimit;
+ float m_torqueLimit;
+
+ CUtlVector< magnetted_objects_t > m_MagnettedEntities;
+ IPhysicsConstraintGroup *m_pConstraintGroup;
+
+ bool m_bActive;
+ bool m_bHasHitSomething;
+ float m_flTotalMass;
+ float m_flRadius;
+ float m_flNextSuckTime;
+ int m_iMaxObjectsAttached;
+};
+
+#endif // PHYSOBJ_H
|