summaryrefslogtreecommitdiff
path: root/game/server/tf2/env_fallingrocks.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/tf2/env_fallingrocks.cpp')
-rw-r--r--game/server/tf2/env_fallingrocks.cpp201
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