//----------------------------------------------------------------------------- // Purpose: Starts the rotator if it is still, stops it if it is spinning. //----------------------------------------------------------------------------- void CFuncRotating::InputToggle( inputdata_t &inputdata ) { if (m_flSpeed > 0) { SetTargetSpeed( 0 ); } else { SetTargetSpeed( m_flMaxSpeed ); } }
//========================================================= // Rotating Use - when a rotating brush is triggered //========================================================= void CFuncRotating :: Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { if( IsLockedByMaster( pActivator )) return; m_bStopAtStartPos = false; if( useType == USE_SET ) { if( value != 0 ) { // never toggle direction from momentary entities if( pCaller && !FClassnameIs( pCaller, "momentary_rot_button" ) && !FClassnameIs( pCaller, "momentary_rot_door" )) pev->impulse = (value < 0) ? true : false; value = fabs( value ); SetTargetSpeed( bound( 0, value, 1 ) * m_flMaxSpeed ); } else { SetTargetSpeed( 0 ); } return; } // a liitle easter egg if( useType == USE_RESET ) { if( value == 0.0f ) { if( m_iState == STATE_OFF ) pev->impulse = !pev->impulse; return; } if( m_iState == STATE_OFF ) { // apply angular impulse (XashXT feature) SetLocalAvelocity( pev->movedir * (bound( -1, value, 1 ) * m_flMaxSpeed )); SetMoveDone( RotateFriction ); pev->friction = 1.0f; RotateFriction(); } return; } if( pev->speed != 0 ) SetTargetSpeed( 0 ); else SetTargetSpeed( m_flMaxSpeed ); }
//----------------------------------------------------------------------------- // Purpose: Think function. Called while rotating at a constant angular velocity. //----------------------------------------------------------------------------- void CFuncRotating::RotateMove( void ) { SetMoveDoneTime( 10 ); if ( m_bStopAtStartPos ) { SetMoveDoneTime( GetNextMoveInterval() ); int checkAxis = 2; // See if we got close to the starting orientation if ( m_vecMoveAng[0] != 0 ) { checkAxis = 0; } else if ( m_vecMoveAng[1] != 0 ) { checkAxis = 1; } float angDelta = anglemod( GetLocalAngles()[ checkAxis ] - m_angStart[ checkAxis ] ); if ( angDelta > 180.0f ) angDelta -= 360.0f; QAngle avel = GetLocalAngularVelocity(); // Delta per tick QAngle avelpertick = avel * TICK_INTERVAL; if ( fabs( angDelta ) < fabs( avelpertick[ checkAxis ] ) ) { SetTargetSpeed( 0 ); SetLocalAngles( m_angStart ); m_bStopAtStartPos = false; } } }
//----------------------------------------------------------------------------- // Purpose: Input handler for setting the speed of the rotator. // Input : Float target angular velocity as a ratio of maximum speed [0, 1]. //----------------------------------------------------------------------------- void CFuncRotating::InputSetSpeed( inputdata_t &inputdata ) { m_bStopAtStartPos = false; float flSpeed = inputdata.value.Float(); m_bReversed = flSpeed < 0 ? true : false; flSpeed = fabs(flSpeed); SetTargetSpeed( clamp( flSpeed, 0, 1 ) * m_flMaxSpeed ); }
//----------------------------------------------------------------------------- // Purpose: Called when a rotating brush is used by the player. // Input : pActivator - // pCaller - // useType - // value - //----------------------------------------------------------------------------- void CFuncRotating::RotatingUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { // // If the rotator is spinning, stop it. // if ( m_flSpeed != 0 ) { SetTargetSpeed( 0 ); } // // Rotator is not moving, so start it. // else { SetTargetSpeed( m_flMaxSpeed ); } }
//----------------------------------------------------------------------------- // Purpose: Think function for reversing directions. Spins down to zero, then // starts spinning up to the target speed. //----------------------------------------------------------------------------- void CFuncRotating::ReverseMove( void ) { if ( SpinDown( 0 ) ) { // We've reached zero - spin back up to the target speed. SetTargetSpeed( m_flTargetSpeed ); } else { SetMoveDoneTime( GetNextMoveInterval() ); } }
void CFuncRotating :: Rotate( void ) { // NOTE: only full speed moving set state to "On" if( fabs( pev->speed ) == fabs( m_flMaxSpeed )) m_iState = STATE_ON; SetMoveDoneTime( 0.1f ); if( m_bStopAtStartPos ) { SetMoveDoneTime( GetNextMoveInterval() ); int checkAxis = 2; // see if we got close to the starting orientation if( pev->movedir[0] != 0 ) { checkAxis = 0; } else if( pev->movedir[1] != 0 ) { checkAxis = 1; } float angDelta = anglemod( GetLocalAngles()[checkAxis] - m_angStart[checkAxis] ); if( angDelta > 180.0f ) angDelta -= 360.0f; Vector avel = GetLocalAvelocity(); // delta per tick Vector avelpertick = avel * gpGlobals->frametime; if( fabs( angDelta ) < fabs( avelpertick[checkAxis] )) { SetTargetSpeed( 0 ); SetLocalAngles( m_angStart ); m_bStopAtStartPos = false; } } }
//----------------------------------------------------------------------------- // Purpose: // Input : &inputdata - //----------------------------------------------------------------------------- void CFuncRotating::InputStopAtStartPos( inputdata_t &inputdata ) { m_bStopAtStartPos = true; SetTargetSpeed( 0 ); SetMoveDoneTime( GetNextMoveInterval() ); }
//----------------------------------------------------------------------------- // Purpose: Input handler to stop the rotator from spinning. //----------------------------------------------------------------------------- void CFuncRotating::InputStop( inputdata_t &inputdata ) { m_bStopAtStartPos = false; SetTargetSpeed( 0 ); }
//----------------------------------------------------------------------------- // Purpose: Input handler to start the rotator spinning. //----------------------------------------------------------------------------- void CFuncRotating::InputStartBackward( inputdata_t &inputdata ) { m_bStopAtStartPos = false; m_bReversed = true; SetTargetSpeed( m_flMaxSpeed ); }
//----------------------------------------------------------------------------- // Purpose: Input handler to start the rotator spinning. //----------------------------------------------------------------------------- void CFuncRotating::InputStartForward( inputdata_t &inputdata ) { m_bReversed = false; SetTargetSpeed( m_flMaxSpeed ); }
//----------------------------------------------------------------------------- // Purpose: Input handler that reverses the direction of rotation. //----------------------------------------------------------------------------- void CFuncRotating::InputReverse( inputdata_t &inputdata ) { m_bStopAtStartPos = false; m_bReversed = !m_bReversed; SetTargetSpeed( m_flSpeed ); }