User:MLSTRM/Modelentity with modelchoice
NOTE:the entity is called CPropRandomMotion, change it to change the name of the entity
//Random Motion entity for VR; Origin :MLSTRM
- include "cbase.h"
class CPropRandomMotion : public CBaseAnimating { public: DECLARE_CLASS( CPropRandomMotion, CBaseAnimating ); DECLARE_DATADESC();
CPropRandomMotion() { m_bActive = false; }
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( prop_random_motion, CPropRandomMotion );
// Start of our data description for the class BEGIN_DATADESC( CPropRandomMotion )
// 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()
//lets you chose a model
void CPropRandomMotion::Precache( void )
{
if ( GetModelName() == NULL_STRING )
{
Msg( "%s at (%.3f, %.3f, %.3f) has no model name!\n", GetClassname(), GetAbsOrigin().x, GetAbsOrigin().y, GetAbsOrigin().z );
SetModelName( AllocPooledString( "models/error.mdl" ) );
}
PrecacheModel( STRING( GetModelName() ) );
BaseClass::Precache(); }
//----------------------------------------------------------------------------- // Purpose: Sets up the entity's initial state //----------------------------------------------------------------------------- void CPropRandomMotion::Spawn( void ) { char *szModel = (char *)STRING( GetModelName() ); if (!szModel || !*szModel) { Warning( "prop at %.0f %.0f %0.f missing modelname\n", GetAbsOrigin().x, GetAbsOrigin().y, GetAbsOrigin().z ); UTIL_Remove( this ); return; }
PrecacheModel( szModel ); Precache(); SetModel( szModel ); } //----------------------------------------------------------------------------- // Purpose: Think function to randomly move the entity //----------------------------------------------------------------------------- void CPropRandomMotion::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 CPropRandomMotion::InputToggle( inputdata_t &inputData ) { // Toggle our active state if ( !m_bActive ) { // Start thinking SetThink( &CPropRandomMotion::MoveThink );
SetNextThink( gpGlobals->curtime + 0.05f );
// Start moving SetMoveType( MOVETYPE_FLY );
// Force MoveThink() to choose a new speed and direction immediately m_flNextChangeTime = gpGlobals->curtime;
// Update m_bActive to reflect our new state m_bActive = true; } else { // Stop thinking SetThink( NULL );
// Stop moving SetAbsVelocity( vec3_origin );
SetMoveType( MOVETYPE_NONE );
m_bActive = false; } }