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.
201 lines
6.2 KiB
201 lines
6.2 KiB
//========= 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(); |
|
} |