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.
121 lines
3.3 KiB
121 lines
3.3 KiB
//========= 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 ); |
|
}
|
|
|