346 lines
12 KiB
C++
346 lines
12 KiB
C++
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
#ifndef SCENEENTITY_CLASS_H
|
|
#define SCENEENTITY_CLASS_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "ichoreoeventcallback.h"
|
|
|
|
class CSceneListManager;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: FIXME, need to deal with save/restore
|
|
//-----------------------------------------------------------------------------
|
|
class CSceneEntity : public CPointEntity, public IChoreoEventCallback
|
|
{
|
|
friend class CInstancedSceneEntity;
|
|
public:
|
|
|
|
enum
|
|
{
|
|
SCENE_ACTION_UNKNOWN = 0,
|
|
SCENE_ACTION_CANCEL,
|
|
SCENE_ACTION_RESUME,
|
|
};
|
|
|
|
enum
|
|
{
|
|
SCENE_BUSYACTOR_DEFAULT = 0,
|
|
SCENE_BUSYACTOR_WAIT,
|
|
SCENE_BUSYACTOR_INTERRUPT,
|
|
SCENE_BUSYACTOR_INTERRUPT_CANCEL,
|
|
};
|
|
|
|
|
|
|
|
|
|
DECLARE_CLASS( CSceneEntity, CPointEntity );
|
|
DECLARE_SERVERCLASS();
|
|
|
|
CSceneEntity( void );
|
|
~CSceneEntity( void );
|
|
|
|
// From IChoreoEventCallback
|
|
virtual void StartEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event );
|
|
virtual void EndEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event );
|
|
virtual void ProcessEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event );
|
|
virtual bool CheckEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event );
|
|
|
|
|
|
virtual int UpdateTransmitState();
|
|
virtual int ShouldTransmit( const CCheckTransmitInfo *pInfo );
|
|
|
|
void SetRecipientFilter( IRecipientFilter *filter );
|
|
|
|
virtual void Activate();
|
|
|
|
virtual void Precache( void );
|
|
virtual void Spawn( void );
|
|
virtual void UpdateOnRemove( void );
|
|
|
|
virtual void OnRestore();
|
|
virtual void OnLoaded();
|
|
|
|
virtual int DrawDebugTextOverlays();
|
|
|
|
DECLARE_DATADESC();
|
|
|
|
virtual void OnSceneFinished( bool canceled, bool fireoutput );
|
|
|
|
virtual void DoThink( float frametime );
|
|
virtual void PauseThink( void );
|
|
|
|
bool IsPlayingBack() const { return m_bIsPlayingBack; }
|
|
bool IsPaused() const { return m_bPaused; }
|
|
bool IsMultiplayer() const { return m_bMultiplayer; }
|
|
|
|
bool IsInterruptable();
|
|
virtual void ClearInterrupt();
|
|
virtual void CheckInterruptCompletion();
|
|
|
|
virtual bool InterruptThisScene( CSceneEntity *otherScene );
|
|
void RequestCompletionNotification( CSceneEntity *otherScene );
|
|
|
|
virtual void NotifyOfCompletion( CSceneEntity *interruptor );
|
|
|
|
void AddListManager( CSceneListManager *pManager );
|
|
|
|
void ClearActivatorTargets( void );
|
|
|
|
void SetBreakOnNonIdle( bool bBreakOnNonIdle ) { m_bBreakOnNonIdle = bBreakOnNonIdle; }
|
|
bool ShouldBreakOnNonIdle( void ) { return m_bBreakOnNonIdle; }
|
|
|
|
// Inputs
|
|
void InputStartPlayback( inputdata_t &inputdata );
|
|
void InputPausePlayback( inputdata_t &inputdata );
|
|
void InputResumePlayback( inputdata_t &inputdata );
|
|
void InputCancelPlayback( inputdata_t &inputdata );
|
|
void InputCancelAtNextInterrupt( inputdata_t &inputdata );
|
|
void InputPitchShiftPlayback( inputdata_t &inputdata );
|
|
void InputTriggerEvent( inputdata_t &inputdata );
|
|
|
|
// If the scene is playing, finds an actor in the scene who can respond to the specified concept token
|
|
void InputInterjectResponse( inputdata_t &inputdata );
|
|
|
|
// If this scene is waiting on an actor, give up and quit trying.
|
|
void InputStopWaitingForActor( inputdata_t &inputdata );
|
|
|
|
virtual void StartPlayback( void );
|
|
virtual void PausePlayback( void );
|
|
virtual void ResumePlayback( void );
|
|
virtual void CancelPlayback( void );
|
|
virtual void PitchShiftPlayback( float fPitch );
|
|
virtual void QueueResumePlayback( void );
|
|
|
|
bool ValidScene() const;
|
|
|
|
// Scene load/unload
|
|
static CChoreoScene *LoadScene( const char *filename, IChoreoEventCallback *pCallback );
|
|
|
|
void UnloadScene( void );
|
|
|
|
struct SpeakEventSound_t
|
|
{
|
|
CUtlSymbol m_Symbol;
|
|
float m_flStartTime;
|
|
};
|
|
|
|
static bool SpeakEventSoundLessFunc( const SpeakEventSound_t& lhs, const SpeakEventSound_t& rhs );
|
|
|
|
bool GetSoundNameForPlayer( CChoreoEvent *event, CBasePlayer *player, char *buf, size_t buflen );
|
|
|
|
void BuildSortedSpeakEventSoundsPrefetchList(
|
|
CChoreoScene *scene,
|
|
CUtlSymbolTable& table,
|
|
CUtlRBTree< SpeakEventSound_t >& soundnames,
|
|
float timeOffset );
|
|
void PrefetchSpeakEventSounds( CUtlSymbolTable& table, CUtlRBTree< SpeakEventSound_t >& soundnames );
|
|
|
|
// Event handlers
|
|
virtual void DispatchStartExpression( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
virtual void DispatchEndExpression( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
virtual void DispatchStartFlexAnimation( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
virtual void DispatchEndFlexAnimation( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
virtual void DispatchStartGesture( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
virtual void DispatchEndGesture( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
virtual void DispatchStartLookAt( CChoreoScene *scene, CBaseFlex *actor, CBaseEntity *actor2, CChoreoEvent *event );
|
|
virtual void DispatchEndLookAt( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
virtual void DispatchStartMoveTo( CChoreoScene *scene, CBaseFlex *actor, CBaseEntity *actor2, CChoreoEvent *event );
|
|
virtual void DispatchEndMoveTo( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
virtual void DispatchStartSpeak( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event, soundlevel_t iSoundlevel );
|
|
virtual void DispatchEndSpeak( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
virtual void DispatchStartFace( CChoreoScene *scene, CBaseFlex *actor, CBaseEntity *actor2, CChoreoEvent *event );
|
|
virtual void DispatchEndFace( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
virtual void DispatchStartSequence( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
virtual void DispatchEndSequence( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
virtual void DispatchStartSubScene( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
virtual void DispatchStartInterrupt( CChoreoScene *scene, CChoreoEvent *event );
|
|
virtual void DispatchEndInterrupt( CChoreoScene *scene, CChoreoEvent *event );
|
|
virtual void DispatchStartGeneric( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
virtual void DispatchEndGeneric( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
|
|
// NPC can play interstitial vcds (such as responding to the player doing something during a scene)
|
|
virtual void DispatchStartPermitResponses( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
virtual void DispatchEndPermitResponses( CChoreoScene *scene, CBaseFlex *actor, CChoreoEvent *event );
|
|
|
|
|
|
// Global events
|
|
virtual void DispatchProcessLoop( CChoreoScene *scene, CChoreoEvent *event );
|
|
virtual void DispatchPauseScene( CChoreoScene *scene, const char *parameters );
|
|
virtual void DispatchStopPoint( CChoreoScene *scene, const char *parameters );
|
|
|
|
virtual float EstimateLength( void );
|
|
|
|
void CancelIfSceneInvolvesActor( CBaseEntity *pActor );
|
|
bool InvolvesActor( CBaseEntity *pActor ); // NOTE: returns false if scene hasn't loaded yet
|
|
|
|
void GenerateSoundScene( CBaseFlex *pActor, const char *soundname );
|
|
|
|
virtual float GetPostSpeakDelay() { return 1.0; }
|
|
|
|
bool HasUnplayedSpeech( void );
|
|
bool HasFlexAnimation( void );
|
|
|
|
void SetCurrentTime( float t, bool forceClientSync );
|
|
|
|
void InputScriptPlayerDeath( inputdata_t &inputdata );
|
|
|
|
// Data
|
|
public:
|
|
string_t m_iszSceneFile;
|
|
|
|
string_t m_iszResumeSceneFile;
|
|
EHANDLE m_hWaitingForThisResumeScene;
|
|
bool m_bWaitingForResumeScene;
|
|
|
|
string_t m_iszTarget1;
|
|
string_t m_iszTarget2;
|
|
string_t m_iszTarget3;
|
|
string_t m_iszTarget4;
|
|
string_t m_iszTarget5;
|
|
string_t m_iszTarget6;
|
|
string_t m_iszTarget7;
|
|
string_t m_iszTarget8;
|
|
|
|
EHANDLE m_hTarget1;
|
|
EHANDLE m_hTarget2;
|
|
EHANDLE m_hTarget3;
|
|
EHANDLE m_hTarget4;
|
|
EHANDLE m_hTarget5;
|
|
EHANDLE m_hTarget6;
|
|
EHANDLE m_hTarget7;
|
|
EHANDLE m_hTarget8;
|
|
|
|
CNetworkVar( bool, m_bIsPlayingBack );
|
|
CNetworkVar( bool, m_bPaused );
|
|
CNetworkVar( bool, m_bMultiplayer );
|
|
CNetworkVar( float, m_flForceClientTime );
|
|
|
|
float m_flCurrentTime;
|
|
float m_flFrameTime;
|
|
bool m_bCancelAtNextInterrupt;
|
|
|
|
float m_fPitch;
|
|
|
|
bool m_bAutomated;
|
|
int m_nAutomatedAction;
|
|
float m_flAutomationDelay;
|
|
float m_flAutomationTime;
|
|
|
|
// A pause from an input requires another input to unpause (it's a hard pause)
|
|
bool m_bPausedViaInput;
|
|
|
|
// Waiting for the actor to be able to speak.
|
|
bool m_bWaitingForActor;
|
|
|
|
// Waiting for a point at which we can interrupt our actors
|
|
bool m_bWaitingForInterrupt;
|
|
bool m_bInterruptedActorsScenes;
|
|
|
|
bool m_bBreakOnNonIdle;
|
|
|
|
public:
|
|
virtual CBaseFlex *FindNamedActor( int index );
|
|
virtual CBaseFlex *FindNamedActor( CChoreoActor *pChoreoActor );
|
|
virtual CBaseFlex *FindNamedActor( const char *name );
|
|
virtual CBaseEntity *FindNamedEntity( const char *name, CBaseEntity *pActor = NULL, bool bBaseFlexOnly = false, bool bUseClear = false );
|
|
virtual CBaseEntity *FindNamedEntityFallback( const char *name, CBaseEntity *pActor = NULL, bool bBaseFlexOnly = false, bool bUseClear = false );
|
|
CBaseEntity *FindNamedTarget( string_t iszTarget, bool bBaseFlexOnly = false );
|
|
virtual CBaseEntity *FindNamedEntityClosest( const char *name, CBaseEntity *pActor = NULL, bool bBaseFlexOnly = false, bool bUseClear = false, const char *pszSecondary = NULL );
|
|
|
|
EOZ_Hacks::ResponseFollowup m_followup;
|
|
|
|
private:
|
|
|
|
CUtlVector< CHandle< CBaseFlex > > m_hActorList;
|
|
CUtlVector< CHandle< CBaseEntity > > m_hRemoveActorList;
|
|
|
|
private:
|
|
|
|
inline void SetRestoring( bool bRestoring );
|
|
|
|
// Prevent derived classed from using this!
|
|
virtual void Think( void ) {};
|
|
|
|
|
|
void ClearSceneEvents( CChoreoScene *scene, bool canceled );
|
|
void ClearSchedules( CChoreoScene *scene );
|
|
|
|
float GetSoundSystemLatency( void );
|
|
void PrecacheScene( CChoreoScene *scene );
|
|
|
|
CChoreoScene *GenerateSceneForSound( CBaseFlex *pFlexActor, const char *soundname );
|
|
|
|
bool CheckActors();
|
|
|
|
void PrefetchAnimBlocks( CChoreoScene *scene );
|
|
|
|
bool ShouldNetwork() const;
|
|
// Set if we tried to async the scene but the FS returned that the data was not loadable
|
|
bool m_bSceneMissing;
|
|
|
|
CChoreoScene *m_pScene;
|
|
CNetworkVar( int, m_nSceneStringIndex );
|
|
|
|
const ConVar *m_pcvSndMixahead;
|
|
|
|
COutputEvent m_OnStart;
|
|
COutputEvent m_OnCompletion;
|
|
COutputEvent m_OnCanceled;
|
|
COutputEvent m_OnTrigger1;
|
|
COutputEvent m_OnTrigger2;
|
|
COutputEvent m_OnTrigger3;
|
|
COutputEvent m_OnTrigger4;
|
|
COutputEvent m_OnTrigger5;
|
|
COutputEvent m_OnTrigger6;
|
|
COutputEvent m_OnTrigger7;
|
|
COutputEvent m_OnTrigger8;
|
|
COutputEvent m_OnTrigger9;
|
|
COutputEvent m_OnTrigger10;
|
|
COutputEvent m_OnTrigger11;
|
|
COutputEvent m_OnTrigger12;
|
|
COutputEvent m_OnTrigger13;
|
|
COutputEvent m_OnTrigger14;
|
|
COutputEvent m_OnTrigger15;
|
|
COutputEvent m_OnTrigger16;
|
|
|
|
int m_nInterruptCount;
|
|
bool m_bInterrupted;
|
|
CHandle< CSceneEntity > m_hInterruptScene;
|
|
|
|
bool m_bCompletedEarly;
|
|
|
|
bool m_bInterruptSceneFinished;
|
|
CUtlVector< CHandle< CSceneEntity > > m_hNotifySceneCompletion;
|
|
CUtlVector< CHandle< CSceneListManager > > m_hListManagers;
|
|
|
|
bool m_bRestoring;
|
|
|
|
bool m_bGenerated;
|
|
string_t m_iszSoundName;
|
|
CHandle< CBaseFlex > m_hActor;
|
|
|
|
EHANDLE m_hActivator;
|
|
|
|
int m_BusyActor;
|
|
|
|
int m_iPlayerDeathBehavior;
|
|
|
|
CRecipientFilter *m_pRecipientFilter;
|
|
|
|
public:
|
|
void SetBackground( bool bIsBackground );
|
|
bool IsBackground( void );
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif // SCENEENTITY_CLASS_H
|