|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "ai_default.h"
#include "ai_task.h"
#include "ai_schedule.h"
#include "ai_node.h"
#include "ai_hull.h"
#include "ai_hint.h"
#include "ai_squad.h"
#include "ai_senses.h"
#include "ai_navigator.h"
#include "ai_motor.h"
#include "ai_behavior.h"
#include "ai_baseactor.h"
#include "ai_behavior_lead.h"
#include "ai_behavior_follow.h"
#include "ai_behavior_standoff.h"
#include "ai_behavior_assault.h"
#include "npc_playercompanion.h"
#include "soundent.h"
#include "game.h"
#include "npcevent.h"
#include "entitylist.h"
#include "activitylist.h"
#include "vstdlib/random.h"
#include "engine/IEngineSound.h"
#include "sceneentity.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
#define FISHERMAN_MODEL "models/lostcoast/fisherman/fisherman.mdl"
//=========================================================
// Fisherman activities
//=========================================================
Activity ACT_FISHERMAN_HAT_UP; Activity ACT_FISHERMAN_HAT_DOWN;
//=========================================================
// animation events
//=========================================================
int AE_FISHERMAN_HAT_UP; int AE_FISHERMAN_HAT_DOWN; int AE_FISHERMAN_HAT_ON; int AE_FISHERMAN_HAT_OFF;
//---------------------------------------------------------
//
//---------------------------------------------------------
class CNPC_Fisherman : public CNPC_PlayerCompanion { public: DECLARE_CLASS( CNPC_Fisherman, CNPC_PlayerCompanion ); //DECLARE_SERVERCLASS();
DECLARE_DATADESC();
virtual void Precache() { // Prevents a warning
SelectModel( ); BaseClass::Precache();
PrecacheScriptSound( "NPC_Fisherman.FootstepLeft" ); PrecacheScriptSound( "NPC_Fisherman.FootstepRight" ); PrecacheScriptSound( "NPC_Fisherman.Die" );
PrecacheInstancedScene( "scenes/Expressions/FishermanIdle.vcd" ); PrecacheInstancedScene( "scenes/Expressions/FishermanAlert.vcd" ); PrecacheInstancedScene( "scenes/Expressions/FishermanCombat.vcd" ); }
virtual void Activate() { BaseClass::Activate();
if (m_iHatState == -1) { m_iHatState = ACT_FISHERMAN_HAT_DOWN; }
// allocate layer, start with the hat down
m_iHatLayer = AddGesture( (Activity)m_iHatState, false ); }
void Spawn( void ); void SelectModel(); Class_T Classify( void );
void HandleAnimEvent( animevent_t *pEvent );
bool ShouldLookForBetterWeapon() { return false; } virtual bool IgnorePlayerPushing( void ) { return true; } void DeathSound( const CTakeDamageInfo &info );
int m_iHatLayer; // overlay layer for hat, don't save/restore.
int m_iHatState; // hat state, persistant.
DEFINE_CUSTOM_AI; };
LINK_ENTITY_TO_CLASS( npc_fisherman, CNPC_Fisherman );
//---------------------------------------------------------
//
//---------------------------------------------------------
/*
IMPLEMENT_SERVERCLASS_ST(CNPC_Fisherman, DT_NPC_Fisherman) END_SEND_TABLE() */
//---------------------------------------------------------
// Save/Restore
//---------------------------------------------------------
BEGIN_DATADESC( CNPC_Fisherman )
// DEFINE_FIELD( m_iHatLayer, FIELD_INT ),
DEFINE_FIELD( m_iHatState, FIELD_INTEGER ),
END_DATADESC()
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CNPC_Fisherman::SelectModel() { SetModelName( AllocPooledString( FISHERMAN_MODEL ) ); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CNPC_Fisherman::Spawn( void ) { m_iHatLayer = -1; m_iHatState = -1;
Precache();
m_iHealth = 80;
// m_iszIdleExpression = MAKE_STRING("scenes/Expressions/FishermanIdle.vcd");
// m_iszAlertExpression = MAKE_STRING("scenes/Expressions/FishermanAlert.vcd");
// m_iszCombatExpression = MAKE_STRING("scenes/Expressions/FishermanCombat.vcd");
BaseClass::Spawn();
AddEFlags( EFL_NO_DISSOLVE | EFL_NO_MEGAPHYSCANNON_RAGDOLL | EFL_NO_PHYSCANNON_INTERACTION );
NPCInit(); }
//-----------------------------------------------------------------------------
// Purpose:
// Output :
//-----------------------------------------------------------------------------
Class_T CNPC_Fisherman::Classify( void ) { return CLASS_PLAYER_ALLY_VITAL; }
//---------------------------------------------------------
//---------------------------------------------------------
void CNPC_Fisherman::HandleAnimEvent( animevent_t *pEvent ) { if ( pEvent->event == NPC_EVENT_LEFTFOOT ) { EmitSound( "NPC_Fisherman.FootstepLeft", pEvent->eventtime ); } else if ( pEvent->event == NPC_EVENT_RIGHTFOOT ) { EmitSound( "NPC_Fisherman.FootstepRight", pEvent->eventtime ); } else if ( pEvent->event == AE_FISHERMAN_HAT_UP ) { if (m_iHatLayer != -1) { RemoveLayer( m_iHatLayer, 0.2, 0.2 ); m_iHatLayer = -1; }
m_iHatState = ACT_FISHERMAN_HAT_UP; m_iHatLayer = AddGesture( (Activity)m_iHatState, false ); } else if ( pEvent->event == AE_FISHERMAN_HAT_DOWN ) { if (m_iHatLayer != -1) { RemoveLayer( m_iHatLayer, 0.2, 0.2 ); m_iHatLayer = -1; }
m_iHatState = ACT_FISHERMAN_HAT_DOWN; m_iHatLayer = AddGesture( (Activity)m_iHatState, false ); } else if ( pEvent->event == AE_FISHERMAN_HAT_ON ) { m_iHatLayer = AddGesture( (Activity)m_iHatState, false ); } else if ( pEvent->event == AE_FISHERMAN_HAT_OFF ) { if (m_iHatLayer != -1) { RemoveLayer( m_iHatLayer, 0.2, 0.2 ); m_iHatLayer = -1; } } else { BaseClass::HandleAnimEvent( pEvent ); } }
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void CNPC_Fisherman::DeathSound( const CTakeDamageInfo &info ) { // Sentences don't play on dead NPCs
SentenceStop(); }
//-----------------------------------------------------------------------------
//
// Schedules
//
//-----------------------------------------------------------------------------
AI_BEGIN_CUSTOM_NPC( npc_fisherman, CNPC_Fisherman )
DECLARE_ACTIVITY( ACT_FISHERMAN_HAT_UP ) DECLARE_ACTIVITY( ACT_FISHERMAN_HAT_DOWN )
DECLARE_ANIMEVENT( AE_FISHERMAN_HAT_UP ) DECLARE_ANIMEVENT( AE_FISHERMAN_HAT_DOWN ) DECLARE_ANIMEVENT( AE_FISHERMAN_HAT_ON ) DECLARE_ANIMEVENT( AE_FISHERMAN_HAT_OFF )
AI_END_CUSTOM_NPC()
|