diff options
Diffstat (limited to 'game/server/tf2/env_fallingrocks.cpp')
| -rw-r--r-- | game/server/tf2/env_fallingrocks.cpp | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/game/server/tf2/env_fallingrocks.cpp b/game/server/tf2/env_fallingrocks.cpp new file mode 100644 index 0000000..00b1634 --- /dev/null +++ b/game/server/tf2/env_fallingrocks.cpp @@ -0,0 +1,201 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// +#include "cbase.h" + +#define MAX_ROCK_MODELS 6 + +// Rock models +char *sRockModels[ MAX_ROCK_MODELS ] = +{ + "models/props/cliffside/inhibitor_rocks/inhibitor_rock12.mdl", + "models/props/cliffside/inhibitor_rocks/inhibitor_rock13.mdl", + "models/props/cliffside/inhibitor_rocks/inhibitor_rock14.mdl", + "models/props/cliffside/inhibitor_rocks/inhibitor_rock19.mdl", + "models/props/cliffside/inhibitor_rocks/inhibitor_rock20.mdl", + "models/props/cliffside/inhibitor_rocks/inhibitor_rock21.mdl", +}; + +//----------------------------------------------------------------------------- +// Purpose: A falling rock entity +//----------------------------------------------------------------------------- +class CFallingRock : public CBaseAnimating +{ + DECLARE_CLASS( CFallingRock, CBaseAnimating ); +public: + DECLARE_DATADESC(); + + CFallingRock( void ); + virtual void Spawn( void ); + virtual void VPhysicsUpdate( IPhysicsObject *pPhysics ); + static CFallingRock *Create( const Vector &vecOrigin, const QAngle &vecAngles, const Vector &vecVelocity, const AngularImpulse &vecRotationSpeed ); + + void RockTouch( CBaseEntity *pOther ); +public: +}; + +BEGIN_DATADESC( CFallingRock ) + + // functions + DEFINE_FUNCTION( RockTouch ), + +END_DATADESC() +LINK_ENTITY_TO_CLASS( fallingrock, CFallingRock ); + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CFallingRock::CFallingRock( void ) +{ +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CFallingRock::Spawn( void ) +{ + SetModel( sRockModels[ random->RandomInt(0,MAX_ROCK_MODELS-1) ] ); + SetMoveType( MOVETYPE_NONE ); + m_takedamage = DAMAGE_NO; + + // Create the object in the physics system + VPhysicsInitNormal( SOLID_BBOX, 0, false ); + UTIL_SetSize( this, Vector(-4,-4,-4), Vector(4,4,4) ); + + SetTouch( RockTouch ); + SetThink( SUB_Remove ); + SetNextThink( gpGlobals->curtime + random->RandomFloat( 20.0, 30.0 ) ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CFallingRock::VPhysicsUpdate( IPhysicsObject *pPhysics ) +{ + BaseClass::VPhysicsUpdate( pPhysics ); +} + +//----------------------------------------------------------------------------- +// Purpose: Create a falling rock +//----------------------------------------------------------------------------- +CFallingRock *CFallingRock::Create( const Vector &vecOrigin, const QAngle &vecAngles, const Vector &vecVelocity, const AngularImpulse &vecRotationSpeed ) +{ + CFallingRock *pRock = (CFallingRock*)CreateEntityByName("fallingrock"); + + UTIL_SetOrigin( pRock, vecOrigin ); + pRock->SetLocalAngles( vecAngles ); + pRock->Spawn(); + + IPhysicsObject *pPhysicsObject = pRock->VPhysicsGetObject(); + if ( pPhysicsObject ) + { + pPhysicsObject->AddVelocity( &vecVelocity, &vecRotationSpeed ); + } + + return pRock; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CFallingRock::RockTouch( CBaseEntity *pOther ) +{ +} + + + + + + +//----------------------------------------------------------------------------- +// Purpose: A falling rock spawner entity +//----------------------------------------------------------------------------- +class CEnv_FallingRocks : public CPointEntity +{ + DECLARE_CLASS( CEnv_FallingRocks, CPointEntity ); +public: + DECLARE_DATADESC(); + + virtual void Spawn( void ); + virtual void Precache( void ); + void RockThink( void ); + void InputSpawnRock( inputdata_t &inputdata ); + +public: + float m_flFallStrength; + float m_flRotationSpeed; + float m_flMinSpawnTime; + float m_flMaxSpawnTime; + COutputEvent m_pOutputRockSpawned; +}; + +BEGIN_DATADESC( CEnv_FallingRocks ) + + // Fields + DEFINE_KEYFIELD( m_flFallStrength, FIELD_FLOAT, "FallSpeed"), + DEFINE_KEYFIELD( m_flRotationSpeed, FIELD_FLOAT, "RotationSpeed"), + DEFINE_KEYFIELD( m_flMinSpawnTime, FIELD_FLOAT, "MinSpawnTime"), + DEFINE_KEYFIELD( m_flMaxSpawnTime, FIELD_FLOAT, "MaxSpawnTime"), + + // Inputs + DEFINE_INPUTFUNC( FIELD_VOID, "SpawnRock", InputSpawnRock ), + + // Outputs + DEFINE_OUTPUT( m_pOutputRockSpawned, "OnRockSpawned" ), + + // Functions + DEFINE_FUNCTION( RockThink ), + +END_DATADESC() +LINK_ENTITY_TO_CLASS( env_fallingrocks, CEnv_FallingRocks ); + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEnv_FallingRocks::Spawn( void ) +{ + Precache(); + SetThink( RockThink ); + SetNextThink( gpGlobals->curtime + random->RandomFloat( m_flMinSpawnTime, m_flMaxSpawnTime ) ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEnv_FallingRocks::Precache( void ) +{ + for (int i = 0; i < MAX_ROCK_MODELS; i++ ) + { + PrecacheModel( sRockModels[i] ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CEnv_FallingRocks::RockThink( void ) +{ + // Spawn a rock + // Make it aim a little around the angle supplied + QAngle angFire = GetAbsAngles(); + angFire.y += random->RandomFloat( -10, 10 ); + Vector vecForward; + AngleVectors( angFire, &vecForward ); + CFallingRock::Create( GetAbsOrigin(), GetAbsAngles(), (vecForward * m_flFallStrength), AngularImpulse(0,0,m_flRotationSpeed) ); + + // Fire our output + m_pOutputRockSpawned.FireOutput( NULL,this ); + + SetNextThink( gpGlobals->curtime + random->RandomFloat( m_flMinSpawnTime, m_flMaxSpawnTime ) ); +} + +//------------------------------------------------------------------------------ +// Purpose: +//------------------------------------------------------------------------------ +void CEnv_FallingRocks::InputSpawnRock( inputdata_t &inputdata ) +{ + RockThink(); +}
\ No newline at end of file |