source-engine/game/server/episodic/npc_puppet.cpp

122 lines
3.3 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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 );
}