|
|
//========= Copyright � 1996-2005, 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; }
int ExploitableByPlayer() const { return m_iExploitableByPlayer; }
// inputs
void InputWake( inputdata_t &inputdata ); void InputSleep( inputdata_t &inputdata ); void InputEnableMotion( inputdata_t &inputdata ); void InputDisableMotion( inputdata_t &inputdata ); void InputEnable( inputdata_t &inputdata ); void InputDisable( inputdata_t &inputdata ); void InputForceDrop( inputdata_t &inputdata ); void InputDisableFloating( inputdata_t &inputdata ); void InputBecomeDebris( 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; int m_iExploitableByPlayer;
// 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
//
// ---------------------------------------------------------------------
#define SF_PHYSEXPLOSION_NODAMAGE 0x0001
#define SF_PHYSEXPLOSION_PUSH_PLAYER 0x0002
#define SF_PHYSEXPLOSION_RADIAL 0x0004
#define SF_PHYSEXPLOSION_TEST_LOS 0x0008
#define SF_PHYSEXPLOSION_DISORIENT_PLAYER 0x0010
class CPhysExplosion : public CPointEntity { public: DECLARE_CLASS( CPhysExplosion, CPointEntity );
void Spawn ( void ); void Explode( CBaseEntity *pActivator, CBaseEntity *pCaller ); void ExplodeAndRemove( CBaseEntity *pActivator, CBaseEntity *pCaller );
CBaseEntity *FindEntity( CBaseEntity *pEntity, CBaseEntity *pActivator, CBaseEntity *pCaller );
int DrawDebugTextOverlays(void);
// Input handlers
void InputExplode( inputdata_t &inputdata ); void InputExplodeAndRemove( inputdata_t &inputdata );
DECLARE_DATADESC(); float GetRadius( void ); float m_damage; float m_radius; string_t m_targetEntityName; float m_flInnerRadius; COutputEvent m_OnPushedPlayer; };
void CreatePhysExplosion( Vector origin, float magnitude, float radius, string_t target, float innerRadius, int flags );
//==================================================
// 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
|