float CGameRulesMPDamageHandling::CalculateFriendlyFireRatio(EntityId entityId1, EntityId entityId2) { CGameRules *pGameRules = m_pGameRules; if (entityId1 != entityId2 && pGameRules->GetTeamCount() > 1) { int team1 = pGameRules->GetTeam(entityId1); if( team1 == pGameRules->GetTeam(entityId2) ) { return pGameRules->GetFriendlyFireRatio(); } } //Not on same team so full damage return 1.f; }
bool CCannonBall::ShouldSpawnBackSideEffect(IEntity* pHitTarget) { if(m_backSideEffectsDisabled) return false; if(m_ownerIsPlayer && pHitTarget) { IActor* pTarget = g_pGame->GetIGameFramework()->GetIActorSystem()->GetActor(pHitTarget->GetId()); if(pTarget) { CGameRules* pGameRules = g_pGame->GetGameRules(); if (pGameRules && pGameRules->GetFriendlyFireRatio() <= 0.f) { //if friendly fire is off don't spawn blood effect on teammates return !pTarget->IsFriendlyEntity(m_ownerId); } } } return true; }
float CGameRulesMPDamageHandling::ProcessActorKickedVehicle(IActor* victimActor, EntityId victimId, EntityId kickerId, EntityId vehicleId, float damage, const CGameRules::SCollisionHitInfo& collisionHitInfo) { float angSpeedSq = 0.f; const IEntity* pVehicleEntity = gEnv->pEntitySystem->GetEntity(vehicleId); if (pVehicleEntity) { IPhysicalEntity* pent = pVehicleEntity->GetPhysics(); if (pent) { pe_status_dynamics psd; if (pent->GetStatus(&psd)) { angSpeedSq = psd.w.GetLengthSquared(); } } } const Vec3& actorVelocity = collisionHitInfo.velocity; const Vec3& vehicleVelocity = collisionHitInfo.target_velocity; const float vehicleSpeedSq = vehicleVelocity.GetLengthSquared() + angSpeedSq; if (vehicleSpeedSq < 1.5f) return 0.f; float damageScale = 1.f; if (g_pGameCVars->g_mpKickableCars) { if (kickerId==victimId || FindKickableCarRecord(vehicleId, victimId)) return 0.f; CGameRules *pGameRules = g_pGame->GetGameRules(); if (pGameRules->GetTeamCount() > 1) { int kickerTeamId = pGameRules->GetTeam(kickerId); int victimTeamId = pGameRules->GetTeam(victimId); if (kickerTeamId==victimTeamId) // Friendly fire { float friendlyFireRatio = pGameRules->GetFriendlyFireRatio(); if (friendlyFireRatio>0.f) { damageScale = friendlyFireRatio; } else { return 0.f; } } } InsertKickableCarRecord(vehicleId, victimId); } // Damage, for now, is based purely on vehicle speed const float vehicleKillSpeed = m_vehicleDamageSettings.killSpeed; const float invVehicleKillSpeed = 1.f/(vehicleKillSpeed+0.01f); const float maxActorHealth = victimActor->GetMaxHealth(); damage = 0.1f + sqrtf(vehicleSpeedSq+0.04f) * invVehicleKillSpeed; damage = min(damage, 1.f) * maxActorHealth * damageScale; return damage; }