//----------------------------------------------------------------------------- // Purpose: Calculate m_vecVelocity and m_flNextThink to reach vecDest from // GetLocalOrigin() traveling at flSpeed. Just like LinearMove, but rotational. // Input : vecDestAngle - // flSpeed - //----------------------------------------------------------------------------- void CBaseToggle::AngularMove( const QAngle &vecDestAngle, float flSpeed ) { ASSERTSZ(flSpeed != 0, "AngularMove: no speed is defined!"); m_vecFinalAngle = vecDestAngle; m_movementType = MOVE_TOGGLE_ANGULAR; // Already there? if (vecDestAngle == GetLocalAngles()) { MoveDone(); return; } // set destdelta to the vector needed to move QAngle vecDestDelta = vecDestAngle - GetLocalAngles(); // divide by speed to get time to reach dest float flTravelTime = vecDestDelta.Length() / flSpeed; const float MinTravelTime = 0.01f; if ( flTravelTime < MinTravelTime ) { // If we only travel for a short time, we can fail WillSimulateGamePhysics() flTravelTime = MinTravelTime; flSpeed = vecDestDelta.Length() / flTravelTime; } // set m_flNextThink to trigger a call to AngularMoveDone when dest is reached SetMoveDoneTime( flTravelTime ); // scale the destdelta vector by the time spent traveling to get velocity SetLocalAngularVelocity( vecDestDelta * (1.0 / flTravelTime) ); }
//----------------------------------------------------------------------------- // Purpose: Calculate m_vecVelocity and m_flNextThink to reach vecDest from // GetOrigin() traveling at flSpeed. // Input : Vector vecDest - // flSpeed - //----------------------------------------------------------------------------- void CBaseToggle::LinearMove( const Vector &vecDest, float flSpeed ) { ASSERTSZ(flSpeed != 0, "LinearMove: no speed is defined!"); m_vecFinalDest = vecDest; m_movementType = MOVE_TOGGLE_LINEAR; // Already there? if (vecDest == GetLocalOrigin()) { MoveDone(); return; } // set destdelta to the vector needed to move Vector vecDestDelta = vecDest - GetLocalOrigin(); // divide vector length by speed to get time to reach dest float flTravelTime = vecDestDelta.Length() / flSpeed; // set m_flNextThink to trigger a call to LinearMoveDone when dest is reached SetMoveDoneTime( flTravelTime ); // scale the destdelta vector by the time spent traveling to get velocity SetLocalVelocity( vecDestDelta / flTravelTime ); }
void CMomentaryDoor :: Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { m_hActivator = pActivator; if( IsLockedByMaster( pActivator )) return; if( useType == USE_RESET ) { // stop moving immediately MoveDone(); return; } float speed = 0.0f; // allow on-off mode that simulate standard door if( FBitSet( pev->spawnflags, SF_DOOR_ONOFF_MODE )) { if( useType == USE_ON ) { useType = USE_SET; value = 1.0f; } else if( useType == USE_OFF ) { useType = USE_SET; value = 0.0f; } } // momentary buttons will pass down a float in here if( useType != USE_SET ) return; value = bound( 0.0f, value, 1.0f ); Vector move = m_vecPosition1 + (value * ( m_vecPosition2 - m_vecPosition1 )); // NOTE: historically momentary_door is completely ignore pev->speed // and get local speed that based on distance between new and current position // with interval 0.1 secs. This flag is allow constant speed like for func_door if( FBitSet( pev->spawnflags, SF_DOOR_CONSTANT_SPEED )) { speed = pev->speed; } else { // classic Valve method to determine speed Vector delta = move - GetLocalOrigin(); speed = delta.Length() * 10; } if( move != g_vecZero ) { // This entity only thinks when it moves, so if it's thinking, it's in the process of moving // play the sound when it starts moving if( m_iState == STATE_OFF ) EMIT_SOUND( edict(), CHAN_STATIC, STRING( pev->noise ), 1, ATTN_NORM ); m_iState = STATE_ON; // we are "in-moving" // clear think (that stops sounds) SetThink( NULL ); LinearMove( move, speed ); } }