void CRecoil::RecoilShoot(bool firstShot, float maxRecoil) { float attack = firstShot ? m_recoilParams.first_attack : m_recoilParams.attack; attack = (float)__fsel(attack, attack, m_recoilParams.attack); m_attack = attack; m_recoil_time = m_recoilParams.recoil_time; if (m_recoil_time == 0.0f) m_recoil = clamp(m_recoil + m_attack, 0.0f, maxRecoil); Vec2 direction = Vec2(ZERO); const int recoilHintsCount = m_pRecoilHints ? m_pRecoilHints->hints.size() : 0; if (recoilHintsCount > 0) { direction = m_pRecoilHints->hints[m_recoil_dir_idx]; m_recoil_dir_idx = (m_recoil_dir_idx+1) % recoilHintsCount; } const Vec3 randomDirectionAdd = Vec3( Random(m_recoilParams.randomness), BiRandom(m_recoilParams.randomness), Random(m_recoilParams.tilt)); m_recoil_dir = direction.GetNormalized() + randomDirectionAdd; CRecoilDebugDraw::AddRecoilPoint(m_recoil_dir, m_recoil); }
//------------------------------------------------------------------------ bool CProjectile::SetAspectProfile( EEntityAspects aspect, uint8 profile ) { //if (m_pAmmoParams->physicalizationType == ePT_None) //return true; if (aspect == eEA_Physics) { Vec3 spin(m_pAmmoParams->spin); Vec3 spinRandom(BiRandom(m_pAmmoParams->spinRandom.x), BiRandom(m_pAmmoParams->spinRandom.y), BiRandom(m_pAmmoParams->spinRandom.z)); spin += spinRandom; spin = DEG2RAD(spin); switch (profile) { case ePT_Particle: { if (m_pAmmoParams->pParticleParams) { m_pAmmoParams->pParticleParams->wspin = spin; if (!m_initial_dir.IsZero() && !gEnv->bServer) m_pAmmoParams->pParticleParams->heading=m_initial_dir; } SEntityPhysicalizeParams params; params.type = PE_PARTICLE; params.mass = m_pAmmoParams->mass; if (m_pAmmoParams->pParticleParams) params.pParticle = m_pAmmoParams->pParticleParams; GetEntity()->Physicalize(params); } break; case ePT_Rigid: { SEntityPhysicalizeParams params; params.type = PE_RIGID; params.mass = m_pAmmoParams->mass; params.nSlot = 0; GetEntity()->Physicalize(params); pe_action_set_velocity velocity; m_pPhysicalEntity = GetEntity()->GetPhysics(); velocity.w = spin; m_pPhysicalEntity->Action(&velocity); if (m_pAmmoParams->pSurfaceType) { int sfid = m_pAmmoParams->pSurfaceType->GetId(); pe_params_part part; part.ipart = 0; GetEntity()->GetPhysics()->GetParams(&part); for (int i=0; i<part.nMats; i++) part.pMatMapping[i] = sfid; } } break; case ePT_Static: { SEntityPhysicalizeParams params; params.type = PE_STATIC; params.nSlot = 0; GetEntity()->Physicalize(params); if (m_pAmmoParams->pSurfaceType) { int sfid = m_pAmmoParams->pSurfaceType->GetId(); pe_params_part part; part.ipart = 0; if (GetEntity()->GetPhysics()->GetParams(&part)) if (!is_unused(part.pMatMapping)) for (int i=0; i<part.nMats; i++) part.pMatMapping[i] = sfid; } } break; case ePT_None: case ePT_StuckToEntity: { SEntityPhysicalizeParams params; params.type = PE_NONE; params.nSlot = 0; GetEntity()->Physicalize(params); } break; } m_pPhysicalEntity = GetEntity()->GetPhysics(); if (m_pPhysicalEntity) { pe_simulation_params simulation; simulation.maxLoggedCollisions = m_pAmmoParams->maxLoggedCollisions; pe_params_flags flags; flags.flagsOR = pef_log_collisions|(m_pAmmoParams->traceable?pef_traceable:0); pe_params_part colltype; colltype.flagsAND=~geom_colltype_explosion; m_pPhysicalEntity->SetParams(&simulation); m_pPhysicalEntity->SetParams(&flags); m_pPhysicalEntity->SetParams(&colltype); } } return true; }