bool CWeaponMagazined::TryReload() { if (m_pCurrentInventory) { if (TryToGetAmmo(m_ammoType) || unlimited_ammo() || (IsMisfire() && iAmmoElapsed)) { m_bPending = true; SwitchState(eReload); return true; } for (u32 i = 0; i < m_ammoTypes.size(); ++i) { if (TryToGetAmmo(i)) { m_ammoType = i; m_bPending = true; SwitchState(eReload); return true; } } } SwitchState(eIdle); return false; }
bool CWeaponMagazined::Action(s32 cmd, u32 flags) { if(inherited::Action(cmd, flags)) return true; //если оружие чем-то занято, то ничего не делать if(IsPending()) return false; switch(cmd) { case kWPN_RELOAD: { if(flags&CMD_START) if(iAmmoElapsed < iMagazineSize || IsMisfire()) Reload(); } return true; case kWPN_FIREMODE_PREV: { if(flags&CMD_START) { OnPrevFireMode(); return true; }; }break; case kWPN_FIREMODE_NEXT: { if(flags&CMD_START) { OnNextFireMode(); return true; }; }break; } return false; }
bool CWeapon::ready_to_kill () const { return ( !IsMisfire() && ((GetState() == eIdle) || (GetState() == eFire) || (GetState() == eFire2)) && GetAmmoElapsed() ); }
bool CWeaponMagazined::Action(s32 cmd, u32 flags) { if (inherited::Action(cmd, flags)) return true; //если оружие чем-то занято, то ничего не делать if (IsPending()) return false; switch (cmd) { case kWPN_RELOAD: { #if defined(LOCK_RELOAD_IN_SPRINT) if (!ParentIsActor() || !(g_actor->get_state() & mcSprint) ) #endif if (flags&CMD_START) if (iAmmoElapsed < iMagazineSize || IsMisfire()) Reload(); } return true; case kWPN_FIREMODE_PREV: { if (flags&CMD_START) { OnPrevFireMode(); return true; }; }break; case kWPN_FIREMODE_NEXT: { if (flags&CMD_START) { OnNextFireMode(); return true; }; }break; } return false; }
bool CWeaponMagazined::TryReload() { if(m_pInventory) { m_pAmmo = smart_cast<CWeaponAmmo*>(m_pInventory->GetAny(*m_ammoTypes[m_ammoType] )); if(IsMisfire() && iAmmoElapsed) { m_bPending = true; SwitchState(eReload); return true; } if(m_pAmmo || unlimited_ammo()) { m_bPending = true; SwitchState(eReload); return true; } else for(u32 i = 0; i < m_ammoTypes.size(); ++i) { m_pAmmo = smart_cast<CWeaponAmmo*>(m_pInventory->GetAny( *m_ammoTypes[i] )); if(m_pAmmo) { m_ammoType = i; m_bPending = true; SwitchState(eReload); return true; } } } SwitchState(eIdle); return false; }
void CWeaponMagazined::FireStart() { if (IsValid() && !IsMisfire()) { if (!IsWorking() || AllowFireWhileWorking()) { if (GetState() == eReload) return; if (GetState() == eShowing) return; if (GetState() == eHiding) return; if (GetState() == eMisfire) return; inherited::FireStart(); if (iAmmoElapsed == 0) OnMagazineEmpty(); else SwitchState(eFire); } } else { if (eReload != GetState() && eMisfire != GetState()) OnMagazineEmpty(); } }
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()); }