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
5 years ago
|
//========= 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();
|
||
|
}
|