122 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //========= Copyright Valve Corporation, All rights reserved. ============//
 | |
| //
 | |
| // Purpose: NPC Puppet
 | |
| //
 | |
| //=============================================================================
 | |
| 
 | |
| #include "cbase.h"
 | |
| #include "ai_basenpc.h"
 | |
| 
 | |
| // Must be the last file included
 | |
| #include "memdbgon.h"
 | |
| 
 | |
| class CNPC_Puppet : public CAI_BaseNPC
 | |
| {
 | |
| 	DECLARE_CLASS( CNPC_Puppet, CAI_BaseNPC );
 | |
| public:
 | |
| 
 | |
| 	virtual void Spawn( void );
 | |
| 	virtual void Precache( void );
 | |
| 
 | |
| 	void	InputSetAnimationTarget( inputdata_t &inputdata );
 | |
| 
 | |
| private:
 | |
| 	
 | |
| 	string_t	m_sAnimTargetname;
 | |
| 	string_t	m_sAnimAttachmentName;
 | |
| 
 | |
| 	CNetworkVar( EHANDLE, m_hAnimationTarget );	// NPC that will drive what animation we're playing
 | |
| 	CNetworkVar( int, m_nTargetAttachment );	// Attachment point to match to on the target
 | |
| 
 | |
| 	DECLARE_DATADESC();
 | |
| 	DECLARE_SERVERCLASS();
 | |
| };
 | |
| 
 | |
| LINK_ENTITY_TO_CLASS( npc_puppet, CNPC_Puppet );
 | |
| 
 | |
| BEGIN_DATADESC( CNPC_Puppet )
 | |
| 	DEFINE_KEYFIELD( m_sAnimTargetname, FIELD_STRING,	"animationtarget" ),
 | |
| 	DEFINE_KEYFIELD( m_sAnimAttachmentName, FIELD_STRING,	"attachmentname" ),
 | |
| 
 | |
| 	DEFINE_FIELD( m_nTargetAttachment, FIELD_INTEGER ),
 | |
| 	DEFINE_FIELD( m_hAnimationTarget, FIELD_EHANDLE ),
 | |
| 	DEFINE_INPUTFUNC( FIELD_STRING, "SetAnimationTarget", InputSetAnimationTarget ),
 | |
| END_DATADESC()
 | |
| 
 | |
| IMPLEMENT_SERVERCLASS_ST( CNPC_Puppet, DT_NPC_Puppet )
 | |
| 	SendPropEHandle( SENDINFO( m_hAnimationTarget ) ),
 | |
| 	SendPropInt( SENDINFO( m_nTargetAttachment) ),
 | |
| END_SEND_TABLE()
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| // Purpose: 
 | |
| //-----------------------------------------------------------------------------
 | |
| void CNPC_Puppet::Precache( void )
 | |
| {
 | |
| 	BaseClass::Precache();
 | |
| 	PrecacheModel( STRING( GetModelName() ) );
 | |
| }
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| // Purpose: 
 | |
| //-----------------------------------------------------------------------------
 | |
| void CNPC_Puppet::Spawn( void )
 | |
| {
 | |
| 	BaseClass::Spawn();
 | |
| 
 | |
| 	Precache();
 | |
| 
 | |
| 	SetModel( STRING( GetModelName() ) );
 | |
| 	
 | |
| 	NPCInit();
 | |
| 
 | |
| 	SetHealth( 100 );
 | |
| 
 | |
| 	// Find our animation target
 | |
| 	CBaseEntity *pTarget = gEntList.FindEntityByName( NULL, m_sAnimTargetname );
 | |
| 	m_hAnimationTarget = pTarget;
 | |
| 	if ( pTarget )
 | |
| 	{
 | |
| 		CBaseAnimating *pAnimating = pTarget->GetBaseAnimating();
 | |
| 		if ( pAnimating )
 | |
| 		{
 | |
| 			m_nTargetAttachment = pAnimating->LookupAttachment( STRING( m_sAnimAttachmentName ) );
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// Always be scripted
 | |
| 	SetInAScript( true );
 | |
| }
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| // Purpose: 
 | |
| // Input  : &inputdata - 
 | |
| //-----------------------------------------------------------------------------
 | |
| void CNPC_Puppet::InputSetAnimationTarget( inputdata_t &inputdata )
 | |
| {
 | |
| 	// Take the new name
 | |
| 	m_sAnimTargetname = MAKE_STRING( inputdata.value.String() );
 | |
| 
 | |
| 	// Find our animation target
 | |
| 	CBaseEntity *pTarget = gEntList.FindEntityByName( NULL, m_sAnimTargetname );
 | |
| 	if ( pTarget == NULL )
 | |
| 	{
 | |
| 		Warning("Failed to find animation target %s for npc_puppet (%s)\n", STRING( m_sAnimTargetname ), STRING( GetEntityName() ) );
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	m_hAnimationTarget = pTarget;
 | |
| 	
 | |
| 	CBaseAnimating *pAnimating = pTarget->GetBaseAnimating();
 | |
| 	if ( pAnimating )
 | |
| 	{
 | |
| 		// Cache off our target attachment
 | |
| 		m_nTargetAttachment = pAnimating->LookupAttachment( STRING( m_sAnimAttachmentName ) );
 | |
| 	}
 | |
| 
 | |
| 	// Stuff us at the owner's core for visibility reasons
 | |
| 	SetParent( pTarget );
 | |
| 	SetLocalOrigin( vec3_origin );
 | |
| 	SetLocalAngles( vec3_angle );
 | |
| }
 |