//----------------------------------------------------------------------------- // Purpose: All events are leading edge triggered // Input : currenttime - // *event - //----------------------------------------------------------------------------- void C_SceneEntity::StartEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ) { Assert( event ); if ( !Q_stricmp( event->GetName(), "NULL" ) ) { Scene_Printf( "%s : %8.2f: ignored %s\n", GetSceneFileName(), currenttime, event->GetDescription() ); return; } C_BaseFlex *pActor = NULL; CChoreoActor *actor = event->GetActor(); if ( actor ) { pActor = FindNamedActor( actor ); if ( NULL == pActor ) { // This can occur if we haven't been networked an actor yet... we need to queue it so that we can // fire off the start event as soon as we have the actor resident on the client. QueueStartEvent( currenttime, scene, event ); return; } } Scene_Printf( "%s : %8.2f: start %s\n", GetSceneFileName(), currenttime, event->GetDescription() ); switch ( event->GetType() ) { case CChoreoEvent::FLEXANIMATION: { if ( pActor ) { DispatchStartFlexAnimation( scene, pActor, event ); } } break; case CChoreoEvent::EXPRESSION: { if ( pActor ) { DispatchStartExpression( scene, pActor, event ); } } break; default: break; } }
void C_SceneEntity::ClearSceneEvents( CChoreoScene *scene, bool canceled ) { if ( !m_pScene ) return; Scene_Printf( "%s : %8.2f: clearing events\n", GetSceneFileName(), m_flCurrentTime ); int i; for ( i = 0 ; i < m_pScene->GetNumActors(); i++ ) { C_BaseFlex *pActor = FindNamedActor( m_pScene->GetActor( i ) ); if ( !pActor ) continue; // Clear any existing expressions pActor->ClearSceneEvents( scene, canceled ); } WipeQueuedEvents(); }
//----------------------------------------------------------------------------- // Purpose: // Input : currenttime - // *event - //----------------------------------------------------------------------------- void C_SceneEntity::EndEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ) { Assert( event ); if ( !Q_stricmp( event->GetName(), "NULL" ) ) { return; } C_BaseFlex *pActor = NULL; CChoreoActor *actor = event->GetActor(); if ( actor ) { pActor = FindNamedActor( actor ); } Scene_Printf( "%s : %8.2f: finish %s\n", GetSceneFileName(), currenttime, event->GetDescription() ); switch ( event->GetType() ) { case CChoreoEvent::FLEXANIMATION: { if ( pActor ) { DispatchEndFlexAnimation( scene, pActor, event ); } } break; case CChoreoEvent::EXPRESSION: { if ( pActor ) { DispatchEndExpression( scene, pActor, event ); } } break; default: break; } }
//----------------------------------------------------------------------------- // Purpose: All events are leading edge triggered // Input : currenttime - // *event - //----------------------------------------------------------------------------- void C_SceneEntity::StartEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ) { Assert( event ); if ( !Q_stricmp( event->GetName(), "NULL" ) ) { Scene_Printf( "%s : %8.2f: ignored %s\n", GetSceneFileName(), currenttime, event->GetDescription() ); return; } C_BaseFlex *pActor = NULL; CChoreoActor *actor = event->GetActor(); if ( actor ) { pActor = FindNamedActor( actor ); if ( NULL == pActor ) { // This can occur if we haven't been networked an actor yet... we need to queue it so that we can // fire off the start event as soon as we have the actor resident on the client. QueueStartEvent( currenttime, scene, event ); return; } } Scene_Printf( "%s : %8.2f: start %s\n", GetSceneFileName(), currenttime, event->GetDescription() ); switch ( event->GetType() ) { case CChoreoEvent::FLEXANIMATION: { if ( pActor ) { DispatchStartFlexAnimation( scene, pActor, event ); } } break; case CChoreoEvent::EXPRESSION: { if ( pActor ) { DispatchStartExpression( scene, pActor, event ); } } break; case CChoreoEvent::GESTURE: { // Verify data. Assert( m_bMultiplayer ); Assert( scene != NULL ); Assert( event != NULL ); if ( pActor ) { DispatchStartGesture( scene, pActor, event ); } } break; case CChoreoEvent::SEQUENCE: { // Verify data. Assert( m_bMultiplayer ); Assert( scene != NULL ); Assert( event != NULL ); if ( pActor ) { DispatchStartSequence( scene, pActor, event ); } } break; case CChoreoEvent::LOOP: { // Verify data. Assert( m_bMultiplayer ); Assert( scene != NULL ); Assert( event != NULL ); DispatchProcessLoop( scene, event ); } case CChoreoEvent::SPEAK: { if ( IsClientOnly() && pActor ) { // FIXME: dB hack. soundlevel needs to be moved into inside of wav? soundlevel_t iSoundlevel = SNDLVL_TALKING; if ( event->GetParameters2() ) { iSoundlevel = (soundlevel_t)atoi( event->GetParameters2() ); if ( iSoundlevel == SNDLVL_NONE ) { iSoundlevel = SNDLVL_TALKING; } } DispatchStartSpeak( scene, pActor, event, iSoundlevel ); } } break; default: break; } event->m_flPrevTime = currenttime; }