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.
122 lines
3.3 KiB
122 lines
3.3 KiB
![]()
4 years ago
|
//========= 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 );
|
||
|
}
|