222 lines
10 KiB
C
222 lines
10 KiB
C
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $Workfile: $
|
||
|
// $Date: $
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
#if !defined( C_TE_LEGACYTEMPENTS_H )
|
||
|
#define C_TE_LEGACYTEMPENTS_H
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
class C_BaseEntity;
|
||
|
class C_LocalTempEntity;
|
||
|
struct model_t;
|
||
|
|
||
|
#include "mempool.h"
|
||
|
#include "utllinkedlist.h"
|
||
|
|
||
|
#if defined( CSTRIKE_DLL ) || defined( SDK_DLL )
|
||
|
enum
|
||
|
{
|
||
|
CS_SHELL_9MM = 0,
|
||
|
CS_SHELL_57,
|
||
|
CS_SHELL_12GAUGE,
|
||
|
CS_SHELL_556,
|
||
|
CS_SHELL_762NATO,
|
||
|
CS_SHELL_338MAG
|
||
|
};
|
||
|
#endif
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Interface for lecacy temp entities
|
||
|
//-----------------------------------------------------------------------------
|
||
|
abstract_class ITempEnts
|
||
|
{
|
||
|
public:
|
||
|
virtual ~ITempEnts() {}
|
||
|
|
||
|
virtual void Init( void ) = 0;
|
||
|
virtual void Shutdown( void ) = 0;
|
||
|
virtual void LevelInit() = 0;
|
||
|
virtual void LevelShutdown() = 0;
|
||
|
|
||
|
virtual void Update( void ) = 0;
|
||
|
virtual void Clear( void ) = 0;
|
||
|
|
||
|
virtual C_LocalTempEntity *FindTempEntByID( int nID, int nSubID ) = 0;
|
||
|
|
||
|
virtual void BloodSprite( const Vector &org, int r, int g, int b, int a, int modelIndex, int modelIndex2, float size ) = 0;
|
||
|
virtual void RicochetSprite( const Vector &pos, model_t *pmodel, float duration, float scale ) = 0;
|
||
|
virtual void MuzzleFlash( int type, ClientEntityHandle_t hEntity, int attachmentIndex, bool firstPerson ) = 0;
|
||
|
virtual void MuzzleFlash( const Vector &pos1, const QAngle &angles, int type, ClientEntityHandle_t hEntity, bool firstPerson ) = 0;
|
||
|
virtual void EjectBrass( const Vector& pos1, const QAngle& angles, const QAngle& gunAngles, int type ) = 0;
|
||
|
virtual C_LocalTempEntity *SpawnTempModel( const model_t *pModel, const Vector &vecOrigin, const QAngle &vecAngles, const Vector &vecVelocity, float flLifeTime, int iFlags ) = 0;
|
||
|
virtual void BreakModel( const Vector &pos, const QAngle &angles, const Vector &size, const Vector &dir, float random, float life, int count, int modelIndex, char flags) = 0;
|
||
|
virtual void Bubbles( const Vector &mins, const Vector &maxs, float height, int modelIndex, int count, float speed ) = 0;
|
||
|
virtual void BubbleTrail( const Vector &start, const Vector &end, float flWaterZ, int modelIndex, int count, float speed ) = 0;
|
||
|
virtual void Sprite_Explode( C_LocalTempEntity *pTemp, float scale, int flags ) = 0;
|
||
|
virtual void FizzEffect( C_BaseEntity *pent, int modelIndex, int density, int current ) = 0;
|
||
|
virtual C_LocalTempEntity *DefaultSprite( const Vector &pos, int spriteIndex, float framerate ) = 0;
|
||
|
virtual void Sprite_Smoke( C_LocalTempEntity *pTemp, float scale ) = 0;
|
||
|
virtual C_LocalTempEntity *TempSprite( const Vector &pos, const Vector &dir, float scale, int modelIndex, int rendermode, int renderfx, float a, float life, int flags, const Vector &normal = vec3_origin ) = 0;
|
||
|
virtual void AttachTentToPlayer( int client, int modelIndex, float zoffset, float life ) = 0;
|
||
|
virtual void KillAttachedTents( int client ) = 0;
|
||
|
virtual void Sprite_Spray( const Vector &pos, const Vector &dir, int modelIndex, int count, int speed, int iRand ) = 0;
|
||
|
virtual void Sprite_Trail( const Vector &vecStart, const Vector &vecEnd, int modelIndex, int nCount, float flLife, float flSize, float flAmplitude, int nRenderamt, float flSpeed ) = 0;
|
||
|
virtual void RocketFlare( const Vector& pos ) = 0;
|
||
|
virtual void HL1EjectBrass( const Vector &vecPosition, const QAngle &angAngles, const Vector &vecVelocity, int nType ) = 0;
|
||
|
virtual void CSEjectBrass( const Vector &vecPosition, const QAngle &angVelocity, int nType, int nShellType, CBasePlayer *pShooter ) = 0;
|
||
|
|
||
|
virtual void PlaySound ( C_LocalTempEntity *pTemp, float damp ) = 0;
|
||
|
virtual void PhysicsProp( int modelindex, int skin, const Vector& pos, const QAngle &angles, const Vector& vel, int flags, int effects = 0 ) = 0;
|
||
|
virtual C_LocalTempEntity *ClientProjectile( const Vector& vecOrigin, const Vector& vecVelocity, const Vector& vecAccel, int modelindex, int lifetime, CBaseEntity *pOwner, const char *pszImpactEffect = NULL, const char *pszParticleEffect = NULL ) = 0;
|
||
|
};
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Default implementation of the temp entity interface
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CTempEnts : public ITempEnts
|
||
|
{
|
||
|
// Construction
|
||
|
public:
|
||
|
CTempEnts( void );
|
||
|
virtual ~CTempEnts( void );
|
||
|
// Exposed interface
|
||
|
public:
|
||
|
virtual void Init( void );
|
||
|
virtual void Shutdown( void );
|
||
|
|
||
|
virtual void LevelInit();
|
||
|
|
||
|
virtual void LevelShutdown();
|
||
|
|
||
|
virtual void Update( void );
|
||
|
virtual void Clear( void );
|
||
|
|
||
|
virtual C_LocalTempEntity *FindTempEntByID( int nID, int nSubID );
|
||
|
|
||
|
// Legacy temp entities still supported
|
||
|
virtual void BloodSprite( const Vector &org, int r, int g, int b, int a, int modelIndex, int modelIndex2, float size );
|
||
|
virtual void RicochetSprite( const Vector &pos, model_t *pmodel, float duration, float scale );
|
||
|
|
||
|
virtual void MuzzleFlash( int type, ClientEntityHandle_t hEntity, int attachmentIndex, bool firstPerson );
|
||
|
virtual void MuzzleFlash( const Vector &pos1, const QAngle &angles, int type, ClientEntityHandle_t hEntity, bool firstPerson = false );
|
||
|
|
||
|
virtual void BreakModel(const Vector &pos, const QAngle &angles, const Vector &size, const Vector &dir, float random, float life, int count, int modelIndex, char flags);
|
||
|
virtual void Bubbles( const Vector &mins, const Vector &maxs, float height, int modelIndex, int count, float speed );
|
||
|
virtual void BubbleTrail( const Vector &start, const Vector &end, float height, int modelIndex, int count, float speed );
|
||
|
virtual void Sprite_Explode( C_LocalTempEntity *pTemp, float scale, int flags );
|
||
|
virtual void FizzEffect( C_BaseEntity *pent, int modelIndex, int density, int current );
|
||
|
virtual C_LocalTempEntity *DefaultSprite( const Vector &pos, int spriteIndex, float framerate );
|
||
|
virtual void Sprite_Smoke( C_LocalTempEntity *pTemp, float scale );
|
||
|
virtual C_LocalTempEntity *TempSprite( const Vector &pos, const Vector &dir, float scale, int modelIndex, int rendermode, int renderfx, float a, float life, int flags, const Vector &normal = vec3_origin );
|
||
|
virtual void AttachTentToPlayer( int client, int modelIndex, float zoffset, float life );
|
||
|
virtual void KillAttachedTents( int client );
|
||
|
virtual void Sprite_Spray( const Vector &pos, const Vector &dir, int modelIndex, int count, int speed, int iRand );
|
||
|
void Sprite_Trail( const Vector &vecStart, const Vector &vecEnd, int modelIndex, int nCount, float flLife, float flSize, float flAmplitude, int nRenderamt, float flSpeed );
|
||
|
|
||
|
virtual void PlaySound ( C_LocalTempEntity *pTemp, float damp );
|
||
|
virtual void EjectBrass( const Vector &pos1, const QAngle &angles, const QAngle &gunAngles, int type );
|
||
|
virtual C_LocalTempEntity *SpawnTempModel( const model_t *pModel, const Vector &vecOrigin, const QAngle &vecAngles, const Vector &vecVelocity, float flLifeTime, int iFlags );
|
||
|
void RocketFlare( const Vector& pos );
|
||
|
void HL1EjectBrass( const Vector &vecPosition, const QAngle &angAngles, const Vector &vecVelocity, int nType );
|
||
|
void CSEjectBrass( const Vector &vecPosition, const QAngle &angAngles, int nType, int nShellType, CBasePlayer *pShooter );
|
||
|
void PhysicsProp( int modelindex, int skin, const Vector& pos, const QAngle &angles, const Vector& vel, int flags, int effects = 0 );
|
||
|
C_LocalTempEntity *ClientProjectile( const Vector& vecOrigin, const Vector& vecVelocity, const Vector& vecAcceleration, int modelindex, int lifetime, CBaseEntity *pOwner, const char *pszImpactEffect = NULL, const char *pszParticleEffect = NULL );
|
||
|
|
||
|
// Data
|
||
|
public:
|
||
|
enum
|
||
|
{
|
||
|
MAX_TEMP_ENTITIES = 500,
|
||
|
MAX_TEMP_ENTITY_SPRITES = 200,
|
||
|
MAX_TEMP_ENTITY_STUDIOMODEL = 50,
|
||
|
};
|
||
|
|
||
|
private:
|
||
|
// Global temp entity pool
|
||
|
CClassMemoryPool< C_LocalTempEntity > m_TempEntsPool;
|
||
|
CUtlLinkedList< C_LocalTempEntity *, unsigned short > m_TempEnts;
|
||
|
|
||
|
// Muzzle flash sprites
|
||
|
struct model_t *m_pSpriteMuzzleFlash[10];
|
||
|
struct model_t *m_pSpriteAR2Flash[4];
|
||
|
struct model_t *m_pShells[3];
|
||
|
struct model_t *m_pSpriteCombineFlash[2];
|
||
|
|
||
|
#if defined( HL1_CLIENT_DLL )
|
||
|
struct model_t *m_pHL1Shell;
|
||
|
struct model_t *m_pHL1ShotgunShell;
|
||
|
#endif
|
||
|
|
||
|
#if defined( CSTRIKE_DLL ) || defined ( SDK_DLL )
|
||
|
struct model_t *m_pCS_9MMShell;
|
||
|
struct model_t *m_pCS_57Shell;
|
||
|
struct model_t *m_pCS_12GaugeShell;
|
||
|
struct model_t *m_pCS_556Shell;
|
||
|
struct model_t *m_pCS_762NATOShell;
|
||
|
struct model_t *m_pCS_338MAGShell;
|
||
|
#endif
|
||
|
|
||
|
// Internal methods also available to children
|
||
|
protected:
|
||
|
C_LocalTempEntity *TempEntAlloc( const Vector& org, const model_t *model );
|
||
|
C_LocalTempEntity *TempEntAllocHigh( const Vector& org, const model_t *model );
|
||
|
|
||
|
// Material handle caches
|
||
|
private:
|
||
|
|
||
|
inline void CacheMuzzleFlashes( void );
|
||
|
PMaterialHandle m_Material_MuzzleFlash_Player[4];
|
||
|
PMaterialHandle m_Material_MuzzleFlash_NPC[4];
|
||
|
PMaterialHandle m_Material_Combine_MuzzleFlash_Player[2];
|
||
|
PMaterialHandle m_Material_Combine_MuzzleFlash_NPC[2];
|
||
|
|
||
|
// Internal methods
|
||
|
private:
|
||
|
CTempEnts( const CTempEnts & );
|
||
|
|
||
|
void TempEntFree( int index );
|
||
|
C_LocalTempEntity *TempEntAlloc();
|
||
|
bool FreeLowPriorityTempEnt();
|
||
|
|
||
|
int AddVisibleTempEntity( C_LocalTempEntity *pEntity );
|
||
|
|
||
|
// AR2
|
||
|
void MuzzleFlash_AR2_Player( const Vector &origin, const QAngle &angles, ClientEntityHandle_t hEntity );
|
||
|
void MuzzleFlash_AR2_NPC( const Vector &origin, const QAngle &angles, ClientEntityHandle_t hEntity );
|
||
|
|
||
|
// SMG1
|
||
|
void MuzzleFlash_SMG1_Player( ClientEntityHandle_t hEntity, int attachmentIndex );
|
||
|
void MuzzleFlash_SMG1_NPC( ClientEntityHandle_t hEntity, int attachmentIndex );
|
||
|
|
||
|
// Shotgun
|
||
|
void MuzzleFlash_Shotgun_Player( ClientEntityHandle_t hEntity, int attachmentIndex );
|
||
|
void MuzzleFlash_Shotgun_NPC( ClientEntityHandle_t hEntity, int attachmentIndex );
|
||
|
|
||
|
// Pistol
|
||
|
void MuzzleFlash_Pistol_Player( ClientEntityHandle_t hEntity, int attachmentIndex );
|
||
|
void MuzzleFlash_Pistol_NPC( ClientEntityHandle_t hEntity, int attachmentIndex );
|
||
|
|
||
|
// Combine
|
||
|
void MuzzleFlash_Combine_Player( ClientEntityHandle_t hEntity, int attachmentIndex );
|
||
|
void MuzzleFlash_Combine_NPC( ClientEntityHandle_t hEntity, int attachmentIndex );
|
||
|
|
||
|
// 357
|
||
|
void MuzzleFlash_357_Player( ClientEntityHandle_t hEntity, int attachmentIndex );
|
||
|
|
||
|
// RPG
|
||
|
void MuzzleFlash_RPG_NPC( ClientEntityHandle_t hEntity, int attachmentIndex );
|
||
|
};
|
||
|
|
||
|
|
||
|
extern ITempEnts *tempents;
|
||
|
|
||
|
|
||
|
#endif // C_TE_LEGACYTEMPENTS_H
|