/* <107b1> ../cstrike/dlls/animating.cpp:136 */ void CBaseAnimating::DispatchAnimEvents(float flInterval) { MonsterEvent_t event; void *pmodel = GET_MODEL_PTR(ENT(pev)); if (!pmodel) { ALERT(at_aiconsole, "Gibbed monster is thinking!\n"); return; } // FIXME: I have to do this or some events get missed, and this is probably causing the problem below flInterval = 0.1f; // FIX: this still sometimes hits events twice float flStart = pev->frame + (m_flLastEventCheck - pev->animtime) * m_flFrameRate * pev->framerate; float flEnd = pev->frame + flInterval * m_flFrameRate * pev->framerate; m_fSequenceFinished = FALSE; m_flLastEventCheck = pev->animtime + flInterval; if (flEnd >= 256.0f || flEnd <= 0.0f) { m_fSequenceFinished = TRUE; } int index = 0; while ((index = GetAnimationEvent(pmodel, pev, &event, flStart, flEnd, index)) != 0) { HandleAnimEvent(&event); } }
void CAnimationLayer::DispatchAnimEvents( CBaseAnimating *eventHandler, CBaseAnimating *pOwner ) { animevent_t event; CStudioHdr *pstudiohdr = pOwner->GetModelPtr( ); if ( !pstudiohdr ) { Assert(!"CBaseAnimating::DispatchAnimEvents: model missing"); return; } if ( !pstudiohdr->SequencesAvailable() ) { return; } if ( m_nSequence >= pstudiohdr->GetNumSeq() ) return; // don't fire if here are no events if ( pstudiohdr->pSeqdesc( m_nSequence ).numevents == 0 ) { return; } // look from when it last checked to some short time in the future float flCycleRate = pOwner->GetSequenceCycleRate( m_nSequence ) * m_flPlaybackRate; float flStart = m_flLastEventCheck; float flEnd = m_flCycle; if (!m_bLooping) { // fire off events early float flLastVisibleCycle = 1.0f - (pstudiohdr->pSeqdesc( m_nSequence ).fadeouttime) * flCycleRate; if (flEnd >= flLastVisibleCycle || flEnd < 0.0) { m_bSequenceFinished = true; flEnd = 1.01f; } } m_flLastEventCheck = flEnd; /* if (pOwner->m_debugOverlays & OVERLAY_NPC_SELECTED_BIT) { Msg( "%s:%s : checking %.2f %.2f (%d)\n", STRING(pOwner->GetModelName()), pstudiohdr->pSeqdesc( m_nSequence ).pszLabel(), flStart, flEnd, m_bSequenceFinished ); } */ // FIXME: does not handle negative framerates! int index = 0; while ( (index = GetAnimationEvent( pstudiohdr, m_nSequence, &event, flStart, flEnd, index ) ) != 0 ) { event.pSource = pOwner; // calc when this event should happen if (flCycleRate > 0.0) { float flCycle = event.cycle; if (flCycle > m_flCycle) { flCycle = flCycle - 1.0; } event.eventtime = pOwner->m_flAnimTime + (flCycle - m_flCycle) / flCycleRate + pOwner->GetAnimTimeInterval(); } // Msg( "dispatch %d (%d : %.2f)\n", index - 1, event.event, event.eventtime ); event.m_bHandledByScript = eventHandler->HandleScriptedAnimEvent( &event ); if ( eventHandler->HandleBehaviorAnimEvent( &event ) ) { event.m_bHandledByScript = true; } eventHandler->HandleAnimEvent( &event ); } }