//--------------------------------------------------------------------------------- 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; }
//--------------------------------------------------------- bool CWeapon::OnActionReload(EntityId actorId, const ActionId& actionId, int activationMode, float value) { bool playerCanStartReload = false; if (activationMode == eAAM_OnPress && (CheckPickupInteraction(this) == false)) playerCanStartReload = true; // this condition results from the interaction between reload and item pickups. If on front on an item and press reload/pick button but not for long enought, // then the player should still reload the weapon instead of picking up the item. else if(activationMode == eAAM_OnRelease && CheckPickupInteraction(this) == true) playerCanStartReload = true; float currentTime = gEnv->pTimer->GetCurrTime(); if (!playerCanStartReload && activationMode == eAAM_OnPress) m_reloadButtonTimeStamp = currentTime; else if (activationMode == eAAM_OnRelease && playerCanStartReload && currentTime > m_reloadButtonTimeStamp+g_pGameCVars->pl_useItemHoldTime) playerCanStartReload = false; if (!playerCanStartReload) return true; if (!IsBusy() && !AreAnyItemFlagsSet(eIF_Modifying)) { ReloadWeapon(); } else if (!IsReloading() && activationMode == eAAM_OnPress) { SetInputFlag(eWeaponAction_Reload); } return true; }
void CHeavyMountedWeapon::OnFireWhenOutOfAmmo() { BaseClass::OnFireWhenOutOfAmmo(); if (!IsReloading()) { s_ripOffPromptIsVisible = false; } }
void CWeapon::NetUpdateFireMode(SEntityUpdateContext& ctx) { // CGunTurret and CVehicleWeapon overide NetAllowUpdate to perform their own checks. if(NetAllowUpdate(true)) { m_netNextShot -= ctx.fFrameTime; if(IsReloading()) return; // reloading, bail if((!m_isFiringStarted) && (m_isFiring || m_shootCounter > 0)) { m_isFiringStarted = true; m_netNextShot = 0.f; NetStartFire(); EnableUpdate(true, eIUS_FireMode); } if(m_fm) { if(m_shootCounter > 0 && m_netNextShot <= 0.0f) { // Aside from the prediction handle, needed for the server, NetShoot/Ex parameters // are no longer used, these will need removing when the client->server RMI's are tided up m_fm->NetShoot(Vec3(0.f, 0.f, 0.f), 0); m_shootCounter--; //if fireRate == 0.0f, set m_netNextShot to 0.0f, otherwise increment by 60.f / fireRate. // fres used to avoid microcoded instructions, fsel to avoid branching - Rich S const float fRawFireRate = m_fm->GetFireRate(); const float fFireRateSelect = -fabsf(fRawFireRate); const float fFireRateForDiv = (float)__fsel(fFireRateSelect, 1.0f, fRawFireRate); const float fNextShot = (float)__fsel(fFireRateSelect, 0.0f, m_netNextShot + (60.f * __fres(fFireRateForDiv))); m_netNextShot = fNextShot; } } if(m_isFiringStarted && !m_isFiring && m_shootCounter <= 0) { m_isFiringStarted = false; NetStopFire(); EnableUpdate(false, eIUS_FireMode); } // this needs to happen here, or NetStopFire interrupts the animation if(m_doMelee && m_melee) { m_melee->NetAttack(); m_doMelee= false; } } }
void CWeapon::ClSetReloadState(int state) { assert(!gEnv->bServer); if(m_fm) { IActor *pActor = GetOwnerActor(); bool ownerIsLocal = pActor && pActor->IsClient(); switch(state) { case eNRS_NoReload: { if(IsReloading()) m_fm->NetEndReload(); m_reloadState = state; break; } case eNRS_StartReload: { if(!IsReloading(false)) { m_fm->Reload(m_zm ? m_zm->GetCurrentStep() : 0); } m_reloadState = eNRS_StartReload; break; } case eNRS_EndReload: { if(ownerIsLocal) { m_fm->NetEndReload(); } m_reloadState = eNRS_NoReload; break; } case eNRS_CancelReload: { if(!ownerIsLocal) { m_fm->CancelReload(); } else { m_fm->NetEndReload(); } m_reloadState = eNRS_NoReload; break; } default: { break; } } } }
bool CASW_Weapon::ShouldMarineMoveSlow() { return (IsReloading() || IsFiring()); }
void cNoSpread::HUD_PostRunCmd(struct local_state_s *from, struct local_state_s *to, struct usercmd_s *cmd, int runfuncs, double time, unsigned int random_seed) { static int prevammo = 0, curammo; int i, index, Id; if(!me.alive) return; if(!from || !to || !cmd); if(runfuncs) { me.spread.random_seed = random_seed; me.spread.gtime = time; me.prcflags = to->client.flags; Id = to->client.m_iId; if (Id >= 0 && Id < MAX_WEAPONS) { me.spread.WeaponState = to->weapondata[Id].m_iWeaponState; } if (cmd->buttons & IN_ATTACK && CanCurWeaponAttack()) // catch case when pistol and IN_ATTACK is always on and not firing { PrimaryAttack(); } else if (!(cmd->buttons & (IN_ATTACK | IN_ATTACK2))) { if (me.spread.firing) { me.spread.firing = false; if (me.spread.recoil > 15) me.spread.recoil = 15; me.spread.recoiltime = time + 0.4f; } if (IsCurWeaponSec()) { me.spread.recoil = 0; } else if (me.spread.recoil > 0) { if (me.spread.recoiltime <= time) { me.spread.recoiltime = me.spread.recoiltime + 0.0225f; me.spread.recoil--; } } } for (i=0;i<WeaponList.size();i++) { if (WeaponList[i].Id == to->client.m_iId) { if (!WeaponList[i].CurWeapon) // FIX: This doesn't catch when you have a weapon and you buy the same weapon { prevammo = 0; me.spread.recoil = 0; me.spread.prevtime = 0; DefaultSpreadVar(WeaponList[i].Id); me.spread.recoiltime = time; me.spread.firing = true; if(cvar.zoomall && *pFOV != 90.0f) { *pFOV = 90.0f; } } WeaponList[i].CurWeapon = true; me.weapon = GetCurWeapon(); } else WeaponList[i].CurWeapon = false; } for (i=0;i<MAX_WEAPONS;i++) { // this assumes (i == wd[i].m_iId) index = GetWeaponIndexByID(i); if (index == -1) continue; if (to->weapondata[i].m_iId) memcpy(&WeaponList[index].weapondata, &to->weapondata[i], sizeof(weapon_data_t)); else memset(&WeaponList[index].weapondata, 0, sizeof(weapon_data_t)); } if (IsReloading()) { Id = GetCurWeaponId(); me.spread.recoil = 0; me.spread.prevtime = 0; DefaultSpreadVar(Id); me.spread.recoiltime = time; me.spread.firing = false; if(cvar.zoomall && *pFOV != 90.0f) { *pFOV = 90.0f; } } if (Id >= 0 && Id < MAX_WEAPONS) { if(to->weapondata[Id].m_flNextPrimaryAttack <= 0) { me.spread.burst = 0; } } } }
//------------------------------------------------------------------------- bool CWeapon::OnActionModify(EntityId actorId, const ActionId& actionId, int activationMode, float value) { if (IsZoomed() || IsZoomingInOrOut()) return false; if (CanModify() && ((!IsReloading() && !IsBusy()) || AreAnyItemFlagsSet(eIF_Modifying))) { if (m_fm) m_fm->StopFire(); if (AreAnyItemFlagsSet(eIF_Modifying)) { m_enterModifyAction = 0; PlayAction(GetFragmentIds().leave_modify, 0); s_dofSpeed = fres(-g_pGameCVars->i_weapon_customisation_transition_time); s_dofValue = 1.0f; s_focusValue = -1.0f; GetScheduler()->TimerAction(g_pGameCVars->i_weapon_customisation_transition_time, CSchedulerAction<ScheduleLayer_Leave>::Create(this), false); SetItemFlags( eIF_Transitioning ); ClearItemFlags( eIF_Modifying ); GetGameObject()->InvokeRMI(CItem::SvRequestLeaveModify(), CItem::EmptyParams(), eRMI_ToServer); } else { gEnv->p3DEngine->SetPostEffectParam("Dof_Active", 1.0f); gEnv->p3DEngine->SetPostEffectParam("Dof_UseMask", 0.f); gEnv->p3DEngine->SetPostEffectParam("Dof_FocusRange", -1.f); gEnv->p3DEngine->SetPostEffectParam("Dof_FocusMin", 0.5f); gEnv->p3DEngine->SetPostEffectParam("Dof_FocusMax", 1.0f); gEnv->p3DEngine->SetPostEffectParam("Dof_FocusLimit", 1.5f); gEnv->p3DEngine->SetPostEffectParam("Dof_FocusMinZ", 0.0f); gEnv->p3DEngine->SetPostEffectParam("Dof_FocusMinZScale", 0.0f); m_itemLowerMode = eILM_Raised; TagState tagState = TAG_STATE_EMPTY; m_enterModifyAction = new CItemAction(PP_PlayerAction, GetFragmentIds().enter_modify, tagState); PlayFragment(m_enterModifyAction); s_dofSpeed = fres(g_pGameCVars->i_weapon_customisation_transition_time); s_dofValue = 0.0f; SetItemFlags(eIF_Transitioning); GetScheduler()->TimerAction(g_pGameCVars->i_weapon_customisation_transition_time, CSchedulerAction<ScheduleLayer_Enter>::Create(this), false); SetItemFlags(eIF_Modifying); CPlayer *pPlayer = static_cast<CPlayer*>(GetOwnerActor()); if (pPlayer) { SPlayerStats *pStats = static_cast<SPlayerStats*>(pPlayer->GetActorStats()); assert(pStats); pStats->bIgnoreSprinting = true; } GetGameObject()->InvokeRMI(CItem::SvRequestEnterModify(), CItem::EmptyParams(), eRMI_ToServer); } } return true; }
bool CASW_Weapon_Assault_Shotgun::ShouldMarineMoveSlow() { return m_fSlowTime > gpGlobals->curtime || IsReloading(); }