/* ============ After rotating, set angle to exact final angle, call "move done" function ============ */ void CBaseToggle :: AngularMoveDoneNow( void ) { // ALERT(at_console, "AngularMoveDone %f\n", pev->ltime); UTIL_SetAvelocity(this, g_vecZero); if (m_pMoveWith) { UTIL_SetAngles(this, m_vecFinalAngle + m_pMoveWith->pev->angles); } else { UTIL_SetAngles(this, m_vecFinalAngle); } DontThink(); if ( m_pfnCallWhenMoveDone ) (this->*m_pfnCallWhenMoveDone)(); }
void UTIL_AssignAngles(CBaseEntity *pEntity, const Vector vecAngles, BOOL bInitiator) { Vector vecDiff = vecAngles - pEntity->pev->angles; if (vecDiff.Length() > 0.01 && CVAR_GET_FLOAT("sohl_mwdebug")) ALERT(at_debug, "SetAngles %s %s: (%f %f %f) goes to (%f %f %f)\n", STRING(pEntity->pev->classname), STRING(pEntity->pev->targetname), pEntity->pev->angles.x, pEntity->pev->angles.y, pEntity->pev->angles.z, vecAngles.x, vecAngles.y, vecAngles.z); // UTIL_SetDesiredAngles(pEntity, vecAngles); UTIL_SetAngles(pEntity, vecAngles); if (bInitiator && pEntity->m_pMoveWith) { pEntity->m_vecOffsetAngles = vecAngles - pEntity->m_pMoveWith->pev->angles; } if (pEntity->m_pChildMoveWith) // now I've moved pEntity, does anything else have to move with it? { CBaseEntity* pChild = pEntity->m_pChildMoveWith; Vector vecTemp; while (pChild) { if (pChild->pev->avelocity == pEntity->pev->avelocity) // if the child isn't turning under its own power { UTIL_AssignAngles(pChild, vecAngles + pChild->m_vecOffsetAngles, FALSE); } else { vecTemp = vecDiff + pChild->pev->angles; UTIL_AssignAngles(pChild, vecTemp, FALSE); } //ALERT(at_console," child origin becomes (%f %f %f)\n",pChild->pev->origin.x,pChild->pev->origin.y,pChild->pev->origin.z); //ALERT(at_console,"ent %p has sibling %p\n",pChild,pChild->m_pSiblingMoveWith); pChild = pChild->m_pSiblingMoveWith; } } }
void CPendulum :: StopThink( void ) { UTIL_SetAngles(this, m_start); //LRC //pev->angles = m_start; pev->speed = 0; DontThink(); UTIL_SetAvelocity(this, g_vecZero); //LRC //pev->avelocity = g_vecZero; }
void CPendulum :: SwingThink( void ) { float delta, dt; delta = CBaseToggle :: AxisDelta( pev->spawnflags, pev->angles, m_center ); dt = gpGlobals->time - m_time; // How much time has passed? m_time = gpGlobals->time; // Remember the last time called if ( delta > 0 && m_accel > 0 ) pev->speed -= m_accel * dt; // Integrate velocity else pev->speed += m_accel * dt; if ( pev->speed > m_maxSpeed ) pev->speed = m_maxSpeed; else if ( pev->speed < -m_maxSpeed ) pev->speed = -m_maxSpeed; // scale the destdelta vector by the time spent traveling to get velocity UTIL_SetAvelocity(this, pev->speed * pev->movedir); //LRC //pev->avelocity = pev->speed * pev->movedir; // ALERT(at_console, "m_damp %f, m_dampSpeed %f\n", m_damp, m_dampSpeed); // ALERT(at_console, "SwingThink: delta %f, dt %f, speed %f, avel %f %f %f\n", delta, dt, pev->speed, pev->avelocity.x, pev->avelocity.y, pev->avelocity.z); // Call this again SetNextThink(0.1); SetThink(&CPendulum ::SwingThink); // if (m_pMoveWith) // correct MoveWith problems associated with fast-thinking entities // UTIL_AssignOrigin(this, m_vecMoveWithOffset + m_pMoveWith->pev->origin); if ( m_damp ) { m_dampSpeed -= m_damp * m_dampSpeed * dt; if ( m_dampSpeed < 30.0 ) { UTIL_SetAngles(this, m_center); //LRC //pev->angles = m_center; pev->speed = 0; ALERT(at_debug, "**CANCELLING pendulum think!\n"); DontThink(); UTIL_SetAvelocity(this, g_vecZero); //LRC //pev->avelocity = g_vecZero; } else if ( pev->speed > m_dampSpeed ) pev->speed = m_dampSpeed; else if ( pev->speed < -m_dampSpeed ) pev->speed = -m_dampSpeed; } }