Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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

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();
}