Counter Strike : Global Offensive Source Code
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.
|
|
//========= Copyright � 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef BASEENTITY_SHARED_H
#define BASEENTITY_SHARED_H
#ifdef _WIN32
#pragma once
#endif
#ifndef CLIENT_DLL
#define SERVER_PLATTIME_RNG true
#else
#define SERVER_PLATTIME_RNG
#endif
extern ConVar hl2_episodic;
// Simple shared header file for common base entities
// entity capabilities
// These are caps bits to indicate what an object's capabilities (currently used for +USE, save/restore and level transitions)
// NOTE: (For portal 2 and paint) These +use related caps MUST be the first 6 bits!
#define FCAP_IMPULSE_USE 0x00000001 // can be used by the player
#define FCAP_CONTINUOUS_USE 0x00000002 // can be used by the player
#define FCAP_ONOFF_USE 0x00000004 // can be used by the player
#define FCAP_DIRECTIONAL_USE 0x00000008 // Player sends +/- 1 when using (currently only tracktrains)
// NOTE: Normally +USE only works in direct line of sight. Add these caps for additional searches
#define FCAP_USE_ONGROUND 0x00000010
#define FCAP_USE_IN_RADIUS 0x00000020
#define FCAP_MUST_SPAWN 0x00000040 // Spawn after restore
#define FCAP_ACROSS_TRANSITION 0x00000080 // should transfer between transitions
// UNDONE: This will ignore transition volumes (trigger_transition), but not the PVS!!!
#define FCAP_FORCE_TRANSITION 0x00000100 // ALWAYS goes across transitions
#define FCAP_NOTIFY_ON_TRANSITION 0x00000200 // Entity will receive Inside/Outside transition inputs when a transition occurs
#define FCAP_SAVE_NON_NETWORKABLE 0x00000400
#define FCAP_MASTER 0x10000000 // Can be used to "master" other entities (like multisource)
#define FCAP_WCEDIT_POSITION 0x40000000 // Can change position and update Hammer in edit mode
#define FCAP_DONT_SAVE 0x80000000 // Don't save this
// How many bits are used to transmit parent attachment indices?
#define NUM_PARENTATTACHMENT_BITS 6
// Maximum number of vphysics objects per entity
#define VPHYSICS_MAX_OBJECT_LIST_COUNT 1024
#define DEFAULT_LOOK_AT_USE_ANGLE 0.8f
#if defined( CLIENT_DLL )
#include "c_baseentity.h"
#include "c_baseanimating.h"
#else
#include "baseentity.h"
#ifdef HL2_EPISODIC
#include "info_darknessmode_lightsource.h"
#endif // HL2_EPISODIC
#endif
#include "vscript/ivscript.h"
#include "vscript_shared.h"
#if !defined( NO_ENTITY_PREDICTION )
// CBaseEntity inlines
inline bool CBaseEntity::IsPlayerSimulated( void ) const { return m_bIsPlayerSimulated; }
inline CBasePlayer *CBaseEntity::GetSimulatingPlayer( void ) { return m_hPlayerSimulationOwner.Get(); } #endif
inline MoveType_t CBaseEntity::GetMoveType() const { return (MoveType_t)(unsigned char)m_MoveType; }
inline MoveCollide_t CBaseEntity::GetMoveCollide() const { return (MoveCollide_t)(unsigned char)m_MoveCollide; }
//-----------------------------------------------------------------------------
// Collision group accessors
//-----------------------------------------------------------------------------
inline int CBaseEntity::GetCollisionGroup() const { return m_CollisionGroup; }
inline int CBaseEntity::GetFlags( void ) const { return m_fFlags; }
inline bool CBaseEntity::IsAlive( void )const { return m_lifeState == LIFE_ALIVE; }
inline CBaseEntity *CBaseEntity::GetOwnerEntity() const { return m_hOwnerEntity.Get(); }
inline CBaseEntity *CBaseEntity::GetEffectEntity() const { return m_hEffectEntity.Get(); }
#ifdef CLIENT_DLL
inline int CBaseEntity::GetPredictionRandomSeed( void ) { return m_nPredictionRandomSeed; } #else
inline int CBaseEntity::GetPredictionRandomSeed( bool bUseUnSyncedServerPlatTime ) { return bUseUnSyncedServerPlatTime ? m_nPredictionRandomSeedServer : m_nPredictionRandomSeed; } #endif
inline CBasePlayer *CBaseEntity::GetPredictionPlayer( void ) { return m_pPredictionPlayer; }
inline void CBaseEntity::SetPredictionPlayer( CBasePlayer *player ) { m_pPredictionPlayer = player; }
inline bool CBaseEntity::IsSimulatedEveryTick() const { return m_bSimulatedEveryTick; }
inline bool CBaseEntity::IsAnimatedEveryTick() const { return m_bAnimatedEveryTick; }
inline void CBaseEntity::SetSimulatedEveryTick( bool sim ) { if ( m_bSimulatedEveryTick != sim ) { m_bSimulatedEveryTick = sim; #ifdef CLIENT_DLL
Interp_UpdateInterpolationAmounts( GetVarMapping() ); #endif
} }
inline void CBaseEntity::SetAnimatedEveryTick( bool anim ) { if ( m_bAnimatedEveryTick != anim ) { m_bAnimatedEveryTick = anim; #ifdef CLIENT_DLL
Interp_UpdateInterpolationAmounts( GetVarMapping() ); #endif
} }
inline float CBaseEntity::GetAnimTime() const { return m_flAnimTime; }
inline float CBaseEntity::GetSimulationTime() const { return m_flSimulationTime; }
inline void CBaseEntity::SetAnimTime( float at ) { m_flAnimTime = at; }
inline void CBaseEntity::SetSimulationTime( float st ) { m_flSimulationTime = st; }
inline int CBaseEntity::GetEffects( void ) const { return m_fEffects; }
inline void CBaseEntity::RemoveEffects( int nEffects ) { #if !defined( CLIENT_DLL )
#ifdef HL2_EPISODIC
if ( nEffects & (EF_BRIGHTLIGHT|EF_DIMLIGHT) ) { // Hack for now, to avoid player emitting radius with his flashlight
if ( !IsPlayer() ) { RemoveEntityFromDarknessCheck( this ); } } #endif // HL2_EPISODIC
#endif // !CLIENT_DLL
m_fEffects &= ~nEffects; if ( nEffects & EF_NODRAW ) { #ifndef CLIENT_DLL
NetworkProp()->MarkPVSInformationDirty(); DispatchUpdateTransmitState(); #else
UpdateVisibility(); #endif
}
#ifdef CLIENT_DLL
if ( nEffects & EF_MARKED_FOR_FAST_REFLECTION ) { OnFastReflectionRenderingChanged(); } OnDisableShadowDepthRenderingChanged(); OnDisableCSMRenderingChanged(); OnShadowDepthRenderingCacheableStateChanged(); #endif
}
inline void CBaseEntity::ClearEffects( void ) { #if !defined( CLIENT_DLL )
#ifdef HL2_EPISODIC
if ( m_fEffects & (EF_BRIGHTLIGHT|EF_DIMLIGHT) ) { // Hack for now, to avoid player emitting radius with his flashlight
if ( !IsPlayer() ) { RemoveEntityFromDarknessCheck( this ); } } #endif // HL2_EPISODIC
#endif // !CLIENT_DLL
#ifdef CLIENT_DLL
bool bRendersInFastReflection = ( m_fEffects & EF_MARKED_FOR_FAST_REFLECTION ) != 0; #endif
m_fEffects = 0;
#ifndef CLIENT_DLL
DispatchUpdateTransmitState(); #else
UpdateVisibility(); if ( bRendersInFastReflection ) { OnFastReflectionRenderingChanged(); } OnDisableShadowDepthRenderingChanged(); OnDisableCSMRenderingChanged(); OnShadowDepthRenderingCacheableStateChanged(); #endif
}
inline bool CBaseEntity::IsEffectActive( int nEffects ) const { return (m_fEffects & nEffects) != 0; }
inline HSCRIPT ToHScript( CBaseEntity *pEnt ) { return ( pEnt ) ? pEnt->GetScriptInstance() : NULL; }
template <> ScriptClassDesc_t *GetScriptDesc<CBaseEntity>( CBaseEntity * ); inline CBaseEntity *ToEnt( HSCRIPT hScript ) {
return ( hScript ) ? (CBaseEntity *)g_pScriptVM->GetInstanceValue( hScript, GetScriptDescForClass(CBaseEntity) ) : NULL; }
// convenience functions for fishing out the vectors of this object
// equivalent to GetVectors(), but doesn't need an intermediate stack
// variable (which might cause an LHS anyway)
inline Vector CBaseEntity::Forward() const RESTRICT ///< get my forward (+x) vector
{ const matrix3x4_t &mat = EntityToWorldTransform(); return Vector( mat[0][0], mat[1][0], mat[2][0] ); }
inline Vector CBaseEntity::Left() const RESTRICT ///< get my left (+y) vector
{ const matrix3x4_t &mat = EntityToWorldTransform(); return Vector( mat[0][1], mat[1][1], mat[2][1] ); }
inline Vector CBaseEntity::Up() const RESTRICT ///< get my up (+z) vector
{ const matrix3x4_t &mat = EntityToWorldTransform(); return Vector( mat[0][2], mat[1][2], mat[2][2] ); }
// Shared EntityMessage between game and client .dlls
#define BASEENTITY_MSG_REMOVE_DECALS 1
inline bool IsPushableMoveType( int nMoveType ) { if ( nMoveType == MOVETYPE_PUSH || nMoveType == MOVETYPE_NONE || nMoveType == MOVETYPE_VPHYSICS || nMoveType == MOVETYPE_NOCLIP ) return false; return true; }
extern float k_flMaxEntityPosCoord; extern float k_flMaxEntityEulerAngle; extern float k_flMaxEntitySpeed; extern float k_flMaxEntitySpinRate;
inline bool IsEntityCoordinateReasonable( const vec_t c ) { float r = k_flMaxEntityPosCoord; return c > -r && c < r; }
inline bool IsEntityPositionReasonable( const Vector &v ) { float r = k_flMaxEntityPosCoord; return v.x > -r && v.x < r && v.y > -r && v.y < r && v.z > -r && v.z < r; }
// Returns:
// -1 - velocity is really, REALLY bad and probably should be rejected.
// 0 - velocity was suspicious and clamped.
// 1 - velocity was OK and not modified
extern int CheckEntityVelocity( Vector &v );
inline bool IsEntityQAngleReasonable( const QAngle &q ) { float r = k_flMaxEntityEulerAngle; return q.x > -r && q.x < r && q.y > -r && q.y < r && q.z > -r && q.z < r; }
// Angular velocity in exponential map form
inline bool IsEntityAngularVelocityReasonable( const Vector &q ) { float r = k_flMaxEntitySpinRate; return q.x > -r && q.x < r && q.y > -r && q.y < r && q.z > -r && q.z < r; }
// Angular velocity of each Euler angle.
inline bool IsEntityQAngleVelReasonable( const QAngle &q ) { float r = k_flMaxEntitySpinRate; return q.x > -r && q.x < r && q.y > -r && q.y < r && q.z > -r && q.z < r; }
// Should we emit physics spew into the log or not?
extern bool CheckEmitReasonablePhysicsSpew();
#endif // BASEENTITY_SHARED_H
|