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.
128 lines
3.4 KiB
128 lines
3.4 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: Simple model entity that randomly moves and changes direction |
|
// when activated. |
|
// |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
|
|
class CMyModelEntity : public CBaseAnimating |
|
{ |
|
public: |
|
DECLARE_CLASS( CMyModelEntity, CBaseAnimating ); |
|
DECLARE_DATADESC(); |
|
|
|
void Spawn( void ); |
|
void Precache( void ); |
|
|
|
void MoveThink( void ); |
|
|
|
// Input function |
|
void InputToggle( inputdata_t &inputData ); |
|
|
|
private: |
|
|
|
bool m_bActive; |
|
float m_flNextChangeTime; |
|
}; |
|
|
|
LINK_ENTITY_TO_CLASS( my_model_entity, CMyModelEntity ); |
|
|
|
// Start of our data description for the class |
|
BEGIN_DATADESC( CMyModelEntity ) |
|
|
|
// Save/restore our active state |
|
DEFINE_FIELD( m_bActive, FIELD_BOOLEAN ), |
|
DEFINE_FIELD( m_flNextChangeTime, FIELD_TIME ), |
|
|
|
// Links our input name from Hammer to our input member function |
|
DEFINE_INPUTFUNC( FIELD_VOID, "Toggle", InputToggle ), |
|
|
|
// Declare our think function |
|
DEFINE_THINKFUNC( MoveThink ), |
|
|
|
END_DATADESC() |
|
|
|
// Name of our entity's model |
|
#define ENTITY_MODEL "models/gibs/airboat_broken_engine.mdl" |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Precache assets used by the entity |
|
//----------------------------------------------------------------------------- |
|
void CMyModelEntity::Precache( void ) |
|
{ |
|
PrecacheModel( ENTITY_MODEL ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Sets up the entity's initial state |
|
//----------------------------------------------------------------------------- |
|
void CMyModelEntity::Spawn( void ) |
|
{ |
|
Precache(); |
|
|
|
SetModel( ENTITY_MODEL ); |
|
SetSolid( SOLID_BBOX ); |
|
UTIL_SetSize( this, -Vector(20,20,20), Vector(20,20,20) ); |
|
|
|
m_bActive = false; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Think function to randomly move the entity |
|
//----------------------------------------------------------------------------- |
|
void CMyModelEntity::MoveThink( void ) |
|
{ |
|
// See if we should change direction again |
|
if ( m_flNextChangeTime < gpGlobals->curtime ) |
|
{ |
|
// Randomly take a new direction and speed |
|
Vector vecNewVelocity = RandomVector( -64.0f, 64.0f ); |
|
SetAbsVelocity( vecNewVelocity ); |
|
|
|
// Randomly change it again within one to three seconds |
|
m_flNextChangeTime = gpGlobals->curtime + random->RandomFloat( 1.0f, 3.0f ); |
|
} |
|
|
|
// Snap our facing to where we're heading |
|
Vector velFacing = GetAbsVelocity(); |
|
QAngle angFacing; |
|
VectorAngles( velFacing, angFacing ); |
|
SetAbsAngles( angFacing ); |
|
|
|
// Think every 20Hz |
|
SetNextThink( gpGlobals->curtime + 0.05f ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Toggle the movement of the entity |
|
//----------------------------------------------------------------------------- |
|
void CMyModelEntity::InputToggle( inputdata_t &inputData ) |
|
{ |
|
// Toggle our active state |
|
if ( !m_bActive ) |
|
{ |
|
// Start thinking |
|
SetThink( &CMyModelEntity::MoveThink ); |
|
SetNextThink( gpGlobals->curtime + 0.05f ); |
|
|
|
// Start flying |
|
SetMoveType( MOVETYPE_FLY ); |
|
|
|
// Set our next time for changing our speed and direction |
|
m_flNextChangeTime = gpGlobals->curtime; |
|
m_bActive = true; |
|
} |
|
else |
|
{ |
|
// Stop thinking |
|
SetThink( NULL ); |
|
|
|
// Stop moving |
|
SetAbsVelocity( vec3_origin ); |
|
SetMoveType( MOVETYPE_NONE ); |
|
|
|
m_bActive = false; |
|
} |
|
}
|
|
|