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