void C_BaseAnimatingOverlay::SetNumAnimOverlays( int num ) { if ( m_AnimOverlay.Count() < num ) { int nCountToAdd = num - m_AnimOverlay.Count(); for ( int i = 0; i < nCountToAdd; ++i ) { int j = m_AnimOverlay.AddToTail( ); m_AnimOverlay[j].SetOwner( this ); } } else if ( m_AnimOverlay.Count() > num ) { m_AnimOverlay.RemoveMultiple( num, m_AnimOverlay.Count() - num ); InvalidatePhysicsRecursive( BOUNDS_CHANGED ); } // Ensure capacity m_AnimOverlay.EnsureCapacity( C_BaseAnimatingOverlay::MAX_OVERLAYS ); int nNumAllocated = m_AnimOverlay.NumAllocated(); // This is important to do because EnsureCapacity doesn't actually call the constructors // on the elements, but we need them to be initialized, otherwise it'll have out-of-range // values which will piss off the datatable encoder. UtlVector_InitializeAllocatedElements( m_AnimOverlay.Base() + m_AnimOverlay.Count(), nNumAllocated - m_AnimOverlay.Count() ); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CTileBase::Spawn( void ) { BaseClass::Spawn(); SetSolid( SOLID_BBOX ); SetMoveType( MOVETYPE_NONE ); #ifndef CLIENT_DLL AddFlag( FL_STATICPROP ); #else InvalidatePhysicsRecursive( POSITION_CHANGED | ANGLES_CHANGED | VELOCITY_CHANGED ); UpdatePartitionListEntry(); UpdateVisibility(); // CreateShadow() // TODO: Seems bugged // Reset interpolation history, so it doesn't contains shit // -> shouldn't do anything for client side created entities... // Apparently it does do something, since it f***s up the angles of all tiles. // ResetLatched() #endif // CLIENT_DLL }
void C_BaseAnimatingOverlay::CheckForLayerPhysicsInvalidate( void ) { // When the layers interpolate they may change the animation or bbox so we // have them accumulate the changes and call InvalidatePhysicsRecursive if any // changes are needed. int nInvalidatePhysicsChangeBits = 0; int nLayerCount = m_AnimOverlay.Count(); for ( int i = 0; i < nLayerCount; ++i ) { int nChangeBits = m_AnimOverlay[ i ].m_nInvalidatePhysicsBits; if ( nChangeBits ) { nInvalidatePhysicsChangeBits |= nChangeBits; continue; } } if ( nInvalidatePhysicsChangeBits ) { InvalidatePhysicsRecursive( nInvalidatePhysicsChangeBits ); } }
//----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- bool CObjectSentrygun::MoveTurret( void ) { bool bMoved = false; int iBaseTurnRate = GetBaseTurnRate(); // any x movement? if ( m_vecCurAngles.x != m_vecGoalAngles.x ) { float flDir = m_vecGoalAngles.x > m_vecCurAngles.x ? 1 : -1 ; m_vecCurAngles.x += SENTRY_THINK_DELAY * ( iBaseTurnRate * 5 ) * flDir; // if we started below the goal, and now we're past, peg to goal if ( flDir == 1 ) { if (m_vecCurAngles.x > m_vecGoalAngles.x) m_vecCurAngles.x = m_vecGoalAngles.x; } else { if (m_vecCurAngles.x < m_vecGoalAngles.x) m_vecCurAngles.x = m_vecGoalAngles.x; } SetPoseParameter( m_iPitchPoseParameter, -m_vecCurAngles.x ); bMoved = true; } if ( m_vecCurAngles.y != m_vecGoalAngles.y ) { float flDir = m_vecGoalAngles.y > m_vecCurAngles.y ? 1 : -1 ; float flDist = fabs( m_vecGoalAngles.y - m_vecCurAngles.y ); bool bReversed = false; if ( flDist > 180 ) { flDist = 360 - flDist; flDir = -flDir; bReversed = true; } if ( m_hEnemy.Get() == NULL ) { if ( flDist > 30 ) { if ( m_flTurnRate < iBaseTurnRate * 10 ) { m_flTurnRate += iBaseTurnRate; } } else { // Slow down if ( m_flTurnRate > (iBaseTurnRate * 5) ) m_flTurnRate -= iBaseTurnRate; } } else { // When tracking enemies, move faster and don't slow if ( flDist > 30 ) { if (m_flTurnRate < iBaseTurnRate * 30) { m_flTurnRate += iBaseTurnRate * 3; } } } m_vecCurAngles.y += SENTRY_THINK_DELAY * m_flTurnRate * flDir; // if we passed over the goal, peg right to it now if (flDir == -1) { if ( (bReversed == false && m_vecGoalAngles.y > m_vecCurAngles.y) || (bReversed == true && m_vecGoalAngles.y < m_vecCurAngles.y) ) { m_vecCurAngles.y = m_vecGoalAngles.y; } } else { if ( (bReversed == false && m_vecGoalAngles.y < m_vecCurAngles.y) || (bReversed == true && m_vecGoalAngles.y > m_vecCurAngles.y) ) { m_vecCurAngles.y = m_vecGoalAngles.y; } } if ( m_vecCurAngles.y < 0 ) { m_vecCurAngles.y += 360; } else if ( m_vecCurAngles.y >= 360 ) { m_vecCurAngles.y -= 360; } if ( flDist < ( SENTRY_THINK_DELAY * 0.5 * iBaseTurnRate ) ) { m_vecCurAngles.y = m_vecGoalAngles.y; } QAngle angles = GetAbsAngles(); float flYaw = m_vecCurAngles.y - angles.y; SetPoseParameter( m_iYawPoseParameter, -flYaw ); InvalidatePhysicsRecursive( ANIMATION_CHANGED ); bMoved = true; } if ( !bMoved || m_flTurnRate <= 0 ) { m_flTurnRate = iBaseTurnRate * 5; } return bMoved; }