void CHelicopter::OnShot () { Fvector fire_pos,fire_dir; fire_pos = get_CurrentFirePoint(); fire_dir = m_fire_dir; float fire_trail_speed = 15.0f; clamp (fire_trail_speed,GetCurrVelocity(),300.0f); if(m_enemy.bUseFireTrail){ Fvector enemy_pos = m_enemy.destEnemyPos; float dt = Device.fTimeGlobal - m_enemy.fStartFireTime; VERIFY(dt>=0); float dist = m_enemy.fire_trail_length_curr - dt*fire_trail_speed; if(dist<0) { MGunFireEnd (); return ; } Fvector fp = fire_pos; fp.y = enemy_pos.y; Fvector fd; fd.sub(enemy_pos,fp).normalize_safe(); if(dist > (m_enemy.fire_trail_length_curr/2.0f) ){ fd.mul(-1.0f); dist = dist - (m_enemy.fire_trail_length_curr/2.0f); }else{ dist = (m_enemy.fire_trail_length_curr/2.0f) - dist; } static float fire_trace_width = pSettings->r_float(*cNameSect(),"fire_trace_width"); enemy_pos.mad(fd,dist); Fvector disp_dir; disp_dir.random_point(fire_trace_width); enemy_pos.add(disp_dir); fire_dir.sub(enemy_pos,fire_pos).normalize_safe(); }; FireBullet(fire_pos, fire_dir, fireDispersionBase, m_CurrentAmmo, ID(), ID(), OnServer()); StartShotParticles (); if(m_bLightShotEnabled) Light_Start (); StartFlameParticles (); StartSmokeParticles (fire_pos, zero_vel); OnShellDrop (fire_pos, zero_vel); HUD_SOUND_ITEM::PlaySound (m_sndShot, fire_pos, this, false); }
void CCarWeapon::OnShot() { FireBullet ( m_fire_pos, m_fire_dir, fireDispersionBase, *m_Ammo, m_object->ID(), m_object->ID(), SendHitAllowed(m_object)); StartShotParticles (); if(m_bLightShotEnabled) Light_Start (); StartFlameParticles (); StartSmokeParticles (m_fire_pos, zero_vel); // OnShellDrop (m_fire_pos, zero_vel); HUD_SOUND::PlaySound (m_sndShot, m_fire_pos, m_object, false); }
void CWeaponStatMgun::OnShot() { VERIFY(Owner()); FireBullet ( m_fire_pos, m_fire_dir, fireDispersionBase, *m_Ammo, Owner()->ID(),ID(), SendHitAllowed(Owner())); StartShotParticles (); if(m_bLightShotEnabled) Light_Start (); StartFlameParticles (); StartSmokeParticles (m_fire_pos, zero_vel); OnShellDrop (m_fire_pos, zero_vel); bool b_hud_mode = (Level().CurrentEntity() == smart_cast<CObject*>(Owner())); m_sounds.PlaySound ("sndShot", m_fire_pos, Owner(), b_hud_mode); AddShotEffector (); m_dAngle.set ( ::Random.randF(-fireDispersionBase,fireDispersionBase), ::Random.randF(-fireDispersionBase,fireDispersionBase)); }
void CWeapon::FireTrace (const Fvector& P, const Fvector& D) { VERIFY (m_magazine.size()); CCartridge &l_cartridge = m_magazine.back(); // Msg("ammo - %s", l_cartridge.m_ammoSect.c_str()); VERIFY (u16(-1) != l_cartridge.bullet_material_idx); //------------------------------------------------------------- l_cartridge.m_flags.set (CCartridge::cfTracer,(m_bHasTracers & !!l_cartridge.m_flags.test(CCartridge::cfTracer))); if (m_u8TracerColorID != u8(-1)) l_cartridge.param_s.u8ColorID = m_u8TracerColorID; //------------------------------------------------------------- //повысить изношенность оружия с учетом влияния конкретного патрона // float Deterioration = GetWeaponDeterioration(); // Msg("Deterioration = %f", Deterioration); ChangeCondition(-GetWeaponDeterioration()*l_cartridge.param_s.impair); float fire_disp = 0.f; CActor* tmp_actor = NULL; if (!IsGameTypeSingle()) { tmp_actor = smart_cast<CActor*>(Level().CurrentControlEntity()); if (tmp_actor) { CEntity::SEntityState state; tmp_actor->g_State(state); if (m_first_bullet_controller.is_bullet_first(state.fVelocity)) { fire_disp = m_first_bullet_controller.get_fire_dispertion(); m_first_bullet_controller.make_shot(); } } } if (fsimilar(fire_disp, 0.f)) { //CActor* tmp_actor = smart_cast<CActor*>(Level().CurrentControlEntity()); if (H_Parent() && (H_Parent() == tmp_actor)) { fire_disp = tmp_actor->GetFireDispertion(); } else { fire_disp = GetFireDispersion(true); } } bool SendHit = SendHitAllowed(H_Parent()); //выстерлить пулю (с учетом возможной стрельбы дробью) for(int i = 0; i < l_cartridge.param_s.buckShot; ++i) { FireBullet(P, D, fire_disp, l_cartridge, H_Parent()->ID(), ID(), SendHit); } StartShotParticles (); if(m_bLightShotEnabled) Light_Start (); // Ammo m_magazine.pop_back (); --iAmmoElapsed; VERIFY((u32)iAmmoElapsed == m_magazine.size()); }