BOOL CWeaponMagazinedWGrenade::net_Spawn(CSE_Abstract* DC) { CSE_ALifeItemWeapon* const weapon = smart_cast<CSE_ALifeItemWeapon*>(DC); R_ASSERT (weapon); if ( IsGameTypeSingle() ) { inherited::net_Spawn_install_upgrades (weapon->m_upgrades); } BOOL l_res = inherited::net_Spawn(DC); UpdateGrenadeVisibility(!!iAmmoElapsed); SetPending (FALSE); iAmmoElapsed2 = weapon->a_elapsed_grenades.grenades_count; m_ammoType2 = weapon->a_elapsed_grenades.grenades_type; m_DefaultCartridge2.Load(*m_ammoTypes2[m_ammoType2], u8(m_ammoType2)); if (!IsGameTypeSingle()) { if (!m_bGrenadeMode && IsGrenadeLauncherAttached() && !getRocketCount() && iAmmoElapsed2) { m_magazine2.push_back(m_DefaultCartridge2); shared_str grenade_name = m_DefaultCartridge2.m_ammoSect; shared_str fake_grenade_name = pSettings->r_string(grenade_name, "fake_grenade_name"); CRocketLauncher::SpawnRocket(*fake_grenade_name, this); } }else { xr_vector<CCartridge>* pM = NULL; bool b_if_grenade_mode = (m_bGrenadeMode && iAmmoElapsed && !getRocketCount()); if(b_if_grenade_mode) pM = &m_magazine; bool b_if_simple_mode = (!m_bGrenadeMode && m_magazine2.size() && !getRocketCount()); if(b_if_simple_mode) pM = &m_magazine2; if(b_if_grenade_mode || b_if_simple_mode) { shared_str fake_grenade_name = pSettings->r_string(pM->back().m_ammoSect, "fake_grenade_name"); CRocketLauncher::SpawnRocket(*fake_grenade_name, this); } } return l_res; }
void CHelicopter::startRocket(u16 idx) { if((getRocketCount()>=1)&&m_use_rocket_on_attack) { CExplosiveRocket* pGrenade = smart_cast<CExplosiveRocket*>(getCurrentRocket()); VERIFY(pGrenade); pGrenade->SetInitiator(this->ID()); Fmatrix rocketXFORM; (idx==1)?rocketXFORM=m_left_rocket_bone_xform:rocketXFORM=m_right_rocket_bone_xform; Fvector vel; Fvector dir; dir.sub(m_enemy.destEnemyPos, rocketXFORM.c ).normalize_safe(); vel.mul(dir,CRocketLauncher::m_fLaunchSpeed); Fmatrix xform; xform.identity(); xform.k.set(dir); Fvector::generate_orthonormal_basis(xform.k,xform.j,xform.i); xform.c = rocketXFORM.c; VERIFY2(_valid(xform),"CHelicopter::startRocket. Invalid xform"); LaunchRocket(xform, vel, zero_vel); NET_Packet P; u_EventGen(P,GE_LAUNCH_ROCKET,ID()); P.w_u16(u16( getCurrentRocket()->ID())); u_EventSend(P); dropCurrentRocket(); m_last_launched_rocket = idx; HUD_SOUND_ITEM::PlaySound(m_sndShotRocket, xform.c, this, false); } }
void CWeaponRPG7::ReloadMagazine() { inherited::ReloadMagazine(); if(iAmmoElapsed && !getRocketCount()) CRocketLauncher::SpawnRocket(m_sRocketSection.c_str(), this); }
void CWeaponRPG7::switch2_Fire() { m_iShotNum = 0; m_bFireSingleShot = true; bWorking = false; if(GetState()==eFire && getRocketCount()) { Fvector p1, d1, p; Fvector p2, d2, d; p1.set (get_LastFP()); d1.set (get_LastFD()); p = p1; d = d1; CEntity* E = smart_cast<CEntity*> (H_Parent()); if(E) { E->g_fireParams (this, p2,d2); p = p2; d = d2; if(IsHudModeNow()) { Fvector p0; float dist = HUD().GetCurrentRayQuery().range; p0.mul (d2,dist); p0.add (p1); p = p1; d.sub (p0,p1); d.normalize_safe(); } } Fmatrix launch_matrix; launch_matrix.identity (); launch_matrix.k.set (d); Fvector::generate_orthonormal_basis(launch_matrix.k, launch_matrix.j, launch_matrix.i); launch_matrix.c.set (p); d.normalize (); d.mul (m_fLaunchSpeed); CRocketLauncher::LaunchRocket (launch_matrix, d, zero_vel); CExplosiveRocket* pGrenade = smart_cast<CExplosiveRocket*>(getCurrentRocket()); VERIFY (pGrenade); pGrenade->SetInitiator (H_Parent()->ID()); if (OnServer()) { NET_Packet P; u_EventGen (P,GE_LAUNCH_ROCKET,ID()); P.w_u16 (u16(getCurrentRocket()->ID())); u_EventSend (P); } } }
void CWeaponMagazinedWGrenade::ReloadMagazine() { inherited::ReloadMagazine(); //перезарядка подствольного гранатомета if(iAmmoElapsed && !getRocketCount() && m_bGrenadeMode) { shared_str fake_grenade_name = pSettings->r_string(m_ammoTypes[m_ammoType].c_str(), "fake_grenade_name"); CRocketLauncher::SpawnRocket(*fake_grenade_name, this); } }
void CHelicopter::shedule_Update(u32 time_delta) { if (!getEnabled()) return; inherited::shedule_Update (time_delta); if(CPHDestroyable::Destroyed())CPHDestroyable::SheduleUpdate(time_delta); else CPHSkeleton::Update(time_delta); if(state() != CHelicopter::eDead) { for(u32 i=getRocketCount(); i<4; ++i) CRocketLauncher::SpawnRocket(*m_sRocketSection, this); } if(m_ready_explode)ExplodeHelicopter(); }
void CWeaponMagazinedWGrenade::LaunchGrenade() { if(!getRocketCount()) return; R_ASSERT (m_bGrenadeMode); { Fvector p1, d; p1.set (get_LastFP2()); d.set (get_LastFD()); CEntity* E = smart_cast<CEntity*>(H_Parent()); if (E){ CInventoryOwner* io = smart_cast<CInventoryOwner*>(H_Parent()); if(NULL == io->inventory().ActiveItem()) { Log("current_state", GetState() ); Log("next_state", GetNextState()); Log("item_sect", cNameSect().c_str()); Log("H_Parent", H_Parent()->cNameSect().c_str()); } E->g_fireParams (this, p1,d); } if (IsGameTypeSingle()) p1.set (get_LastFP2()); Fmatrix launch_matrix; launch_matrix.identity (); launch_matrix.k.set (d); Fvector::generate_orthonormal_basis(launch_matrix.k, launch_matrix.j, launch_matrix.i); launch_matrix.c.set (p1); if(IsZoomed() && smart_cast<CActor*>(H_Parent())) { H_Parent()->setEnabled (FALSE); setEnabled (FALSE); collide::rq_result RQ; BOOL HasPick = Level().ObjectSpace.RayPick(p1, d, 300.0f, collide::rqtStatic, RQ, this); setEnabled (TRUE); H_Parent()->setEnabled (TRUE); if(HasPick) { Fvector Transference; Transference.mul (d, RQ.range); Fvector res[2]; #ifdef DEBUG //. DBG_OpenCashedDraw(); //. DBG_DrawLine(p1,Fvector().add(p1,d),D3DCOLOR_XRGB(255,0,0)); #endif u8 canfire0 = TransferenceAndThrowVelToThrowDir(Transference, CRocketLauncher::m_fLaunchSpeed, EffectiveGravity(), res); #ifdef DEBUG //. if(canfire0>0)DBG_DrawLine(p1,Fvector().add(p1,res[0]),D3DCOLOR_XRGB(0,255,0)); //. if(canfire0>1)DBG_DrawLine(p1,Fvector().add(p1,res[1]),D3DCOLOR_XRGB(0,0,255)); //. DBG_ClosedCashedDraw(30000); #endif if (canfire0 != 0) { d = res[0]; }; } }; d.normalize (); d.mul (CRocketLauncher::m_fLaunchSpeed); VERIFY2 (_valid(launch_matrix),"CWeaponMagazinedWGrenade::SwitchState. Invalid launch_matrix!"); CRocketLauncher::LaunchRocket (launch_matrix, d, zero_vel); CExplosiveRocket* pGrenade = smart_cast<CExplosiveRocket*>(getCurrentRocket()); VERIFY (pGrenade); pGrenade->SetInitiator (H_Parent()->ID()); if (Local() && OnServer()) { VERIFY (m_magazine.size()); m_magazine.pop_back (); --iAmmoElapsed; VERIFY((u32)iAmmoElapsed == m_magazine.size()); NET_Packet P; u_EventGen (P,GE_LAUNCH_ROCKET,ID()); P.w_u16 (getCurrentRocket()->ID()); u_EventSend (P); }; } }