bool CWeaponMagazinedWGrenade::Detach(LPCSTR item_section_name, bool b_spawn_item) { if (ALife::eAddonAttachable == m_eGrenadeLauncherStatus && 0 != (m_flagsAddOnState&CSE_ALifeItemWeapon::eWeaponAddonGrenadeLauncher) && !xr_strcmp(*m_sGrenadeLauncherName, item_section_name)) { m_flagsAddOnState &= ~CSE_ALifeItemWeapon::eWeaponAddonGrenadeLauncher; if(m_bGrenadeMode) { UnloadMagazine(); PerformSwitchGL(); } UpdateAddonsVisibility(); if(GetState()==eIdle) PlayAnimIdle (); return CInventoryItemObject::Detach(item_section_name, b_spawn_item); } else return inherited::Detach(item_section_name, b_spawn_item); }
void CWeaponMagazined::ReloadMagazine() { m_dwAmmoCurrentCalcFrame = 0; //устранить осечку при перезарядке if (IsMisfire()) bMisfire = false; //переменная блокирует использование //только разных типов патронов // static bool l_lockType = false; if (!m_bLockType) { m_ammoName = NULL; m_pAmmo = NULL; } if (!m_pCurrentInventory) return; if (m_set_next_ammoType_on_reload != u32(-1)){ m_ammoType = m_set_next_ammoType_on_reload; m_set_next_ammoType_on_reload = u32(-1); } if (!unlimited_ammo()) { //попытаться найти в инвентаре патроны текущего типа #if defined(AMMO_FROM_BELT) if (ParentIsActor()) m_pAmmo = smart_cast<CWeaponAmmo*>(m_pCurrentInventory->GetAmmoOnBelt(*m_ammoTypes[m_ammoType])); else m_pAmmo = smart_cast<CWeaponAmmo*>(m_pCurrentInventory->GetAny(*m_ammoTypes[m_ammoType])); #else m_pAmmo = smart_cast<CWeaponAmmo*>(m_pCurrentInventory->GetAny(*m_ammoTypes[m_ammoType])); #endif if (!m_pAmmo && !m_bLockType) { for (u32 i = 0; i < m_ammoTypes.size(); ++i) { //проверить патроны всех подходящих типов #if defined(AMMO_FROM_BELT) if (ParentIsActor()) m_pAmmo = smart_cast<CWeaponAmmo*>(m_pCurrentInventory->GetAmmoOnBelt(*m_ammoTypes[i])); else m_pAmmo = smart_cast<CWeaponAmmo*>(m_pCurrentInventory->GetAny(*m_ammoTypes[i])); #else m_pAmmo = smart_cast<CWeaponAmmo*>(m_pCurrentInventory->GetAny(*m_ammoTypes[i])); #endif if (m_pAmmo) { m_ammoType = i; break; } } } } else m_ammoType = m_ammoType; //нет патронов для перезарядки if (!m_pAmmo && !unlimited_ammo()) return; //разрядить магазин, если загружаем патронами другого типа if (!m_bLockType && !m_magazine.empty() && (!m_pAmmo || xr_strcmp(m_pAmmo->cNameSect(), *m_magazine.back().m_ammoSect))) UnloadMagazine(); VERIFY((u32)iAmmoElapsed == m_magazine.size()); if (m_DefaultCartridge.m_LocalAmmoType != m_ammoType) m_DefaultCartridge.Load(*m_ammoTypes[m_ammoType], u8(m_ammoType)); CCartridge l_cartridge = m_DefaultCartridge; while (iAmmoElapsed < iMagazineSize) { if (!unlimited_ammo()) { if (!m_pAmmo->Get(l_cartridge)) break; } ++iAmmoElapsed; l_cartridge.m_LocalAmmoType = u8(m_ammoType); m_magazine.push_back(l_cartridge); } m_ammoName = (m_pAmmo) ? m_pAmmo->m_nameShort : NULL; VERIFY((u32)iAmmoElapsed == m_magazine.size()); //выкинуть коробку патронов, если она пустая if (m_pAmmo && !m_pAmmo->m_boxCurr && OnServer()) m_pAmmo->SetDropManual(TRUE); if (iMagazineSize > iAmmoElapsed) { m_bLockType = true; ReloadMagazine(); m_bLockType = false; } VERIFY((u32)iAmmoElapsed == m_magazine.size()); }