mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-08 09:49:36 +00:00
1
This commit is contained in:
@@ -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();
|
||||
}
|
||||
Reference in New Issue
Block a user