diff options
Diffstat (limited to 'game/server/hl2/npc_fisherman.cpp')
| -rw-r--r-- | game/server/hl2/npc_fisherman.cpp | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/game/server/hl2/npc_fisherman.cpp b/game/server/hl2/npc_fisherman.cpp new file mode 100644 index 0000000..4530f26 --- /dev/null +++ b/game/server/hl2/npc_fisherman.cpp @@ -0,0 +1,245 @@ +//========= 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() |