//------------------------------------------------------------------------ void CWeapon::RequestFireMode(int fmId) { if(fmId==GetCurrentFireMode()) return; CActor *pActor=GetOwnerActor(); if (gEnv->IsClient() && pActor && pActor->IsClient()) { float animationTime = GetCurrentAnimationTime(eIGS_Owner)/1000.0f; m_switchFireModeTimeStap = gEnv->pTimer->GetCurrTime() + animationTime; if(gEnv->bServer) { SetCurrentFireMode(fmId); } else { if(m_fm) { m_fm->Activate(false); } GetGameObject()->InvokeRMI(SvRequestFireMode(), SvRequestFireModeParams(fmId), eRMI_ToServer); } StartVerificationSample(gEnv->pTimer->GetAsyncCurTime()); SHUDEvent event(eHUDEvent_OnWeaponFireModeChanged); event.AddData(SHUDEventData(fmId)); CHUDEventDispatcher::CallEvent(event); } }
void CWeaponMagazined::OnPrevFireMode() { if (!m_bHasDifferentFireModes) return; if (GetState() != eIdle) return; m_iCurFireMode = (m_iCurFireMode - 1 + m_aFireModes.size()) % m_aFireModes.size(); SetQueueSize(GetCurrentFireMode()); };
//------------------------------------------------------------------------ bool CC4::CanSelect() const { bool canSelect = (CWeapon::CanSelect() && !OutOfAmmo(false)); //Check for remaining projectiles to detonate if(!canSelect) { CActor *pOwner = GetOwnerActor(); if(!pOwner) return false; EntityId detonatorId = pOwner->GetInventory()?pOwner->GetInventory()->GetItemByClass(CItem::sDetonatorClass):0; //Do not re-select detonator again if(detonatorId && (detonatorId==pOwner->GetCurrentItemId())) return false; IFireMode *pFM = GetFireMode(GetCurrentFireMode()); if(pFM) { //CC4::Select will select the detonator in this case EntityId projectileId = pFM->GetProjectileId(); if(projectileId && g_pGame->GetWeaponSystem()->GetProjectile(projectileId)) return true; } } return canSelect; };
void CHeavyMountedWeapon::SwitchToRippedOffFireMode() { if(GetCurrentFireMode() != 1) { RequestFireMode(1); } }
//--------------------------------------------------------------------------------- bool CWeapon::OnActionFiremode(EntityId actorId, const ActionId& actionId, int activationMode, float value) { CActor* pOwner = GetOwnerActor(); CPlayer* pPlayer = pOwner && pOwner->IsPlayer() ? static_cast<CPlayer*>(pOwner) : 0; if (pPlayer && (pPlayer->IsCinematicFlagActive(SPlayerStats::eCinematicFlag_LowerWeapon) || pPlayer->IsCinematicFlagActive(SPlayerStats::eCinematicFlag_LowerWeaponMP)) ) return true; bool incompatibleZommMode = (m_secondaryZmId != 0 && (IsZoomed() || IsZoomingInOrOut())); if (AreAnyItemFlagsSet(eIF_BlockActions) || incompatibleZommMode) { return true; } if (activationMode == eAAM_OnPress) { IFireMode* pNewFiremode = GetFireMode(GetNextFireMode(GetCurrentFireMode())); if (pNewFiremode == m_fm) { if(pPlayer && pPlayer->CanSwitchItems()) { pPlayer->SwitchToWeaponWithAccessoryFireMode(); } } else if (!IsReloading()) { StartChangeFireMode(); } } return true; }
void CWeaponMagazined::net_Import(NET_Packet& P) { // if (Level().IsDemoPlay()) // Msg("CWeapon::net_Import [%d]", ID()); inherited::net_Import(P); m_iCurFireMode = P.r_u8(); SetQueueSize(GetCurrentFireMode()); }
void CWeaponMagazined::OnH_A_Chield() { if (m_bHasDifferentFireModes) { CActor *actor = smart_cast<CActor*>(H_Parent()); if (!actor) SetQueueSize(-1); else SetQueueSize(GetCurrentFireMode()); }; inherited::OnH_A_Chield(); };
//------------------------------------------------------------------------ IMPLEMENT_RMI(CWeapon, SvStartedCharging) { CHECK_OWNER_REQUEST(); if(CFireMode* pFireMode = static_cast<CFireMode*>(GetFireMode(GetCurrentFireMode()))) { pFireMode->NetSetCharging(true); CHANGED_NETWORK_STATE(this, ASPECT_CHARGING); } return true; }
bool CNoWeapon::UpdateAimAnims(SParams_WeaponFPAiming &aimAnimParams) { if (m_sharedparams->params.hasAimAnims) { IFireMode* pFireMode = GetFireMode(GetCurrentFireMode()); aimAnimParams.shoulderLookParams = pFireMode ? &static_cast<CFireMode*>(pFireMode)->GetShared()->aimLookParams : &m_sharedparams->params.aimLookParams; return true; } return false; }
bool CHeavyMountedWeapon::UpdateAimAnims( SParams_WeaponFPAiming &aimAnimParams) { if (!m_rippedOff && !m_rippingOff) { IFireMode* pFireMode = GetFireMode(GetCurrentFireMode()); aimAnimParams.shoulderLookParams = pFireMode ? &static_cast<CFireMode*>(pFireMode)->GetShared()->aimLookParams : &m_sharedparams->params.aimLookParams; return true; } return BaseClass::UpdateAimAnims(aimAnimParams); }
//----------------------------------------------------------------------- bool CC4::OnActionSelectDetonator(EntityId actorId, const ActionId& actionId, int activationMode, float value) { if(activationMode == eAAM_OnPress) { bool projectile = false; IFireMode* pFM = GetFireMode(GetCurrentFireMode()); if(pFM) { EntityId projectileId = pFM->GetProjectileId(); if(projectileId && g_pGame->GetWeaponSystem()->GetProjectile(projectileId)) projectile = true; } //If there is some projectile we can switch if(projectile) SelectDetonator(); } return true; }
//------------------------------------------------------------------------ void CC4::Select(bool select) { if(select) { bool outOfAmmo = OutOfAmmo(false); bool projectile = false; IFireMode *pFM = GetFireMode(GetCurrentFireMode()); if(pFM) { EntityId projectileId = pFM->GetProjectileId(); if(projectileId && g_pGame->GetWeaponSystem()->GetProjectile(projectileId)) projectile = true; } if(outOfAmmo && projectile) { SelectDetonator(); return; } else if(outOfAmmo) { Select(false); CActor *pOwner=GetOwnerActor(); if(!pOwner) return; EntityId fistsId = pOwner->GetInventory()?pOwner->GetInventory()->GetItemByClass(CItem::sFistsClass):0; if(fistsId) pOwner->SelectItem(fistsId,true); return; } } CWeapon::Select(select); }
//------------------------------------------------------------------------ void CWeapon::OnStartReload(EntityId shooterId, IEntityClass* pAmmoType) { BROADCAST_WEAPON_EVENT(OnStartReload, (this, shooterId, pAmmoType)); if (CActor *pActor = GetOwnerActor()) { if (IAIObject *pAIObject=pActor->GetEntity()->GetAI()) if (gEnv->pAISystem) gEnv->pAISystem->SendSignal( SIGNALFILTER_SENDER, 1, "OnReload", pAIObject); if(pActor->IsClient()) { if (gEnv->bMultiplayer && pActor->IsCloaked()) { CPersistantStats::GetInstance()->IncrementClientStats(EIPS_CloakedReloads); } if(m_weaponsharedparams->bulletBeltParams.numBullets > 0) { const uint32 refillTime = (uint32)(GetCurrentAnimationTime(eIGS_Owner) * m_weaponsharedparams->bulletBeltParams.beltRefillReloadFraction); GetScheduler()->TimerAction(refillTime, CSchedulerAction<RefillBeltAction>::Create(RefillBeltAction(this)), false); } } } IFireMode *pFireMode = GetFireMode(GetCurrentFireMode()); if (pFireMode) { if(GetInventoryAmmoCount(pAmmoType) < pFireMode->GetClipSize()) { BATTLECHATTER(BC_LowAmmo, shooterId); } else { BATTLECHATTER(BC_Reloading, shooterId); } } }
float CWeaponMagazined::GetWeaponDeterioration() { if (!m_bHasDifferentFireModes || m_iPrefferedFireMode == -1 || u32(GetCurrentFireMode()) <= u32(m_iPrefferedFireMode)) return inherited::GetWeaponDeterioration(); return m_iShotNum*conditionDecreasePerShot; };
//------------------------------------------------------------------------ void CWeapon::OnShoot(EntityId shooterId, EntityId ammoId, IEntityClass* pAmmoType, const Vec3 &pos, const Vec3 &dir, const Vec3&vel) { BROADCAST_WEAPON_EVENT(OnShoot, (this, shooterId, ammoId, pAmmoType, pos, dir, vel)); //FIXME:quick temporary solution CActor *pActor = static_cast<CActor*> (g_pGame->GetIGameFramework()->GetIActorSystem()->GetActor(shooterId)); if (pActor) pActor->HandleEvent(SGameObjectEvent(eCGE_OnShoot,eGOEF_ToExtensions)); IActor *pClientActor=m_pGameFramework->GetClientActor(); if (pActor && pActor->GetActorClass() == CPlayer::GetActorClassType() && IsServer()) { if (pActor == pClientActor) { if (IAIObject *pAIObject=pActor->GetEntity()->GetAI()) gEnv->pAISystem->SendSignal(SIGNALFILTER_LEADER, 1, "OnEnableFire", pAIObject, 0); } CPlayer *pPlayer=static_cast<CPlayer *>(pActor); CNanoSuit *pSuit=pPlayer->GetNanoSuit(); if(m_fm && strcmp(m_fm->GetType(), "Repair")) { if(pSuit) { if (pSuit->GetMode() == NANOMODE_STRENGTH && !IsMounted()) pSuit->SetSuitEnergy(pSuit->GetSuitEnergy()-g_pGameCVars->g_suitRecoilEnergyCost); else if(pSuit->GetMode() == NANOMODE_CLOAK) pSuit->SetSuitEnergy(0.0f); } } if (gEnv->bServer && pSuit && pSuit->IsInvulnerable()) pSuit->SetInvulnerability(false); } if (pClientActor && m_fm && strcmp(m_fm->GetType(), "Thrown")) { // inform the HUDRadar about the sound event Vec3 vPlayerPos=pClientActor->GetEntity()->GetWorldPos(); float fDist2=(vPlayerPos-pos).len2(); if (fDist2<250.0f*250.0f) { //if (pClientActor->GetEntityId() != shooterId) // pHUD->ShowSoundOnRadar(pos); if(gEnv->bMultiplayer) { CGameRules *pGameRules = g_pGame->GetGameRules(); if(pGameRules->GetTeamCount() < 2 || (pGameRules->GetTeam(shooterId) != pGameRules->GetTeam(pClientActor->GetEntityId()))) { //Small workaround for patch2... IFireMode* pFM = GetFireMode(GetCurrentFireMode()); bool grenade = pFM?(pFM->GetAmmoType()==CItem::sScarGrenadeClass):false; //~... if (!IsSilencerAttached() || grenade) { SAFE_HUD_FUNC(GetRadar()->AddEntityTemporarily(shooterId, 5.0f)); } else if(fDist2<5.0f*5.0f) { //Silencer attached SAFE_HUD_FUNC(GetRadar()->AddEntityTemporarily(shooterId, 5.0f)); } } } if ((!IsSilencerAttached()) && fDist2<sqr(SAFE_HUD_FUNC_RET(GetBattleRange()))) SAFE_HUD_FUNC(TickBattleStatus(1.0f)); } } }