void CBaseToggle :: AngularMoveNow() { // ALERT(at_console, "AngularMoveNow %f\n", pev->ltime); Vector vecDestAngle; if (m_pMoveWith) vecDestAngle = m_vecFinalAngle + m_pMoveWith->pev->angles; else vecDestAngle = m_vecFinalAngle; // Already there? if (vecDestAngle == pev->angles) { AngularMoveDone(); return; } // set destdelta to the vector needed to move Vector vecDestDelta = vecDestAngle - pev->angles; // divide by speed to get time to reach dest float flTravelTime = vecDestDelta.Length() / m_flAngularMoveSpeed; // set nextthink to trigger a call to AngularMoveDone when dest is reached SetNextThink( flTravelTime, TRUE ); SetThink(&CBaseToggle :: AngularMoveDone ); // scale the destdelta vector by the time spent traveling to get velocity UTIL_SetAvelocity(this, vecDestDelta / flTravelTime ); }
/* ============= AngularMove calculate pev->velocity and pev->nextthink to reach vecDest from pev->origin traveling at flSpeed Just like LinearMove, but rotational. =============== */ void CBaseToggle :: AngularMove( Vector vecDestAngle, float flSpeed ) { ASSERTSZ(flSpeed != 0, "AngularMove: no speed is defined!"); // ASSERTSZ(m_pfnCallWhenMoveDone != NULL, "AngularMove: no post-move function defined"); m_vecFinalAngle = vecDestAngle; // Already there? if (vecDestAngle == pev->angles) { AngularMoveDone(); return; } // set destdelta to the vector needed to move Vector vecDestDelta = vecDestAngle - pev->angles; // divide by speed to get time to reach dest float flTravelTime = vecDestDelta.Length() / flSpeed; if( flTravelTime < 0.1f ) { pev->avelocity = g_vecZero; pev->nextthink = pev->ltime + 0.1f; return; } // set nextthink to trigger a call to AngularMoveDone when dest is reached pev->nextthink = pev->ltime + flTravelTime; SetThink( &CBaseToggle::AngularMoveDone ); // scale the destdelta vector by the time spent traveling to get velocity pev->avelocity = vecDestDelta / flTravelTime; }
void CBaseToggle::MoveDone( void ) { switch ( m_movementType ) { case MOVE_TOGGLE_LINEAR: LinearMoveDone(); break; case MOVE_TOGGLE_ANGULAR: AngularMoveDone(); break; } m_movementType = MOVE_TOGGLE_NONE; BaseClass::MoveDone(); }
void CBaseToggle::AngularMove(Vector vecDestAngle, float flSpeed) { m_vecFinalAngle = vecDestAngle; if (vecDestAngle == pev->angles) { AngularMoveDone(); return; } Vector vecDestDelta = vecDestAngle - pev->angles; float flTravelTime = vecDestDelta.Length() / flSpeed; pev->nextthink = pev->ltime + flTravelTime; SetThink(&CBaseToggle::AngularMoveDone); pev->avelocity = vecDestDelta / flTravelTime; }