virtual void UpdateBehavior( float timeDelta ) { IGameObject* pGameObject = 0; IObjectUtils::GetObject( &pGameObject, m_pBBCommon->enemy_collision_objectid ); m_pBBCommon->time_to_next_attack -= timeDelta; if ( m_pBBCommon->time_to_next_attack <= 0.0f ) { m_pBBCommon->time_to_next_attack += m_pGameObjectParams->attack_speed; if (pGameObject && pGameObject->GetBehavior()) { float enemyHealth = pGameObject->GetBehavior()->ReceiveDamage( m_pGameObjectParams->attack_damage ); if ( enemyHealth <= 0.0f && pGameObject->GetGameObjectType() == EGO_RBC ) { ConsumeRBC(); pGameObject = 0; } } } if (!pGameObject || pGameObject->GetGameTeam() == EGT_INFECTION) { m_pBBCommon->enemy_collision_objectid.SetInvalid(); } }
void CheckForCollisions( IGameObject* pGameObject, AUVec3f& desiredPosition, float frameDelta ) { const AUVec3f& refPos = pGameObject->GetEntity()->GetPosition(); const float refDist = pGameObject->GetCollisionRadius(); for (int i=0; i<EGT_COUNT; ++i) { TGameObjects& data = m_Objects[i]; TGameObjects::iterator it = data.begin(); TGameObjects::iterator itEnd = data.end(); while (it != itEnd) { IGameObject* pTestObject = *it; if (pTestObject != pGameObject) { const AUVec3f& testObjectPos = pTestObject->GetEntity()->GetPosition(); float distSqr = (refPos - testObjectPos).MagnitudeSqr(); float minAllowedDist = refDist + pTestObject->GetCollisionRadius(); if ( (distSqr <= minAllowedDist * minAllowedDist) && (pGameObject->GetGameTeam() != pTestObject->GetGameTeam()) ) { // Set desired position to edge of collision radii AUVec3f dir = (refPos - testObjectPos).GetNormalised(); desiredPosition = testObjectPos + dir * minAllowedDist; pTestObject->OnCollision( pGameObject ); pGameObject->OnCollision( pTestObject ); } } ++it; } } }