//--------------------------------------------------------- bool CWeapon::OnActionReload(EntityId actorId, const ActionId& actionId, int activationMode, float value) { if(activationMode==eAAM_OnPress) { COffHand * offHandWeapon = NULL; bool isOffHandSelected = false; GetOffHandInfo(this,isOffHandSelected,&offHandWeapon); if (!IsBusy() && !m_modifying && !isOffHandSelected) { bool isDualWield = false; CWeapon *dualWield = NULL; GetDualWieldInfo(this,isDualWield,&dualWield); if(IsWeaponRaised() && m_fm && m_fm->CanReload()) RaiseWeapon(false); Reload(); if (isDualWield) { if(dualWield->IsWeaponRaised() && dualWield->CanReload()) dualWield->RaiseWeapon(false); dualWield->Reload(); } } } return true; }
//--------------------------------------------------------------------------------- bool CWeapon::OnActionFiremode(EntityId actorId, const ActionId& actionId, int activationMode, float value) { if (activationMode==eAAM_OnPress) { bool isDualWield = false; CWeapon *dualWield = NULL; GetDualWieldInfo(this,isDualWield,&dualWield); if (isDualWield) { if(IsWeaponRaised()) RaiseWeapon(false,true); if(dualWield->IsWeaponRaised()) dualWield->RaiseWeapon(false,true); StartChangeFireMode(); } else { if(m_weaponRaised) RaiseWeapon(false,true); StartChangeFireMode(); } } return true; }
bool CWeapon::OnActionAttackSecondary(EntityId actorId, const ActionId& actionId, int activationMode, float value) { if(!m_modifying) { bool isDualWield = false; CWeapon *dualWield = NULL; GetDualWieldInfo(this,isDualWield,&dualWield); if (isDualWield) { COffHand * offHandWeapon = NULL; bool isOffHandSelected = false; GetOffHandInfo(this,isOffHandSelected,&offHandWeapon); if (activationMode == eAAM_OnPress) { if(!PreActionAttack(true)) { m_fire_alternation = false; if(!IsWeaponRaised())// && CanFire()) { StartFire(); } /*else if(OutOfAmmo(false)) Reload();*/ m_requestedFire = true; } } else if (activationMode == eAAM_OnRelease) { PreActionAttack(false); // Don't stop slave!!! if (m_fm) m_fm->StopFire(); //StopFire(actorId); m_requestedFire = false; } } else if (m_fm && activationMode == eAAM_OnPress) { m_fm->StartSecondaryFire(actorId); } } return true; }
//----------------------------------------------------------------------- void CFists::PostFilterView(SViewParams &viewParams) { CWeapon::PostFilterView(viewParams); if(m_camerastats.animating && IsWeaponRaised()) { viewParams.nearplane = 0.1f; } }
//----------------------------------------- //Just a timeout to change to "Relaxed" state void CFists::UpdateAnimState(float frameTime) { //Only if selected if(!IsSelected() || m_frozen || IsWeaponRaised() || m_underWater || m_inFreeFall) return; if(m_timeOut>=0.0f && m_currentAnimState == eFAS_FIGHT) m_timeOut -= frameTime; if(m_timeOut<0.0f) RequestAnimState(eFAS_RELAXED); }
//------------------------------------------------------ void CWeapon::ForcePendingActions() { CItem::ForcePendingActions(); CActor* pOwner = GetOwnerActor(); if(!pOwner || !pOwner->IsClient()) return; //Force start firing, if needed and possible /*if(m_requestedFire) { if(!IsDualWield() && !IsWeaponRaised()) { m_requestedFire = false; if(IsTargetOn() || (m_fm && !m_fm->AllowZoom())) return; OnAction(GetOwnerId(),"attack1",eAAM_OnPress,0.0f); } else if(IsDualWield() && IsDualWieldMaster()) { IItem *slave = GetDualWieldSlave(); if(!IsWeaponRaised()) { m_requestedFire = false; OnAction(GetOwnerId(),"attack1",eAAM_OnPress,0.0f); } else if(slave && slave->GetIWeapon()) { CWeapon* dualwield = static_cast<CWeapon*>(slave); if(!dualwield->IsWeaponRaised()) { m_requestedFire = false; OnAction(GetOwnerId(),"attack1",eAAM_OnPress,0.0f); } } } }*/ // EXP 1: Rewritten dual wield handling if(m_requestedFire && !IsWeaponRaised()) { m_requestedFire = false; if(IsTargetOn() || (m_fm && !m_fm->AllowZoom())) return; if (!IsDualWield() || IsDualWieldSlave()) OnAction(GetOwnerId(),"attack1",eAAM_OnPress,0.0f); else OnAction(GetOwnerId(),"attack2",eAAM_OnPress,0.0f); } }
//------------------------------------------------------ void CWeapon::ForcePendingActions(uint8 blockedActions) { CItem::ForcePendingActions(blockedActions); CActor* pOwner = GetOwnerActor(); if(!pOwner || !pOwner->IsClient()) return; //Force start firing, if needed and possible if(m_requestedFire) { if(!IsDualWield() && !IsWeaponRaised()) { m_requestedFire = false; OnAction(GetOwnerId(),"attack1",eAAM_OnPress,0.0f); } else if(IsDualWield() && IsDualWieldMaster()) { IItem *slave = GetDualWieldSlave(); if(!IsWeaponRaised()) { m_requestedFire = false; OnAction(GetOwnerId(),"attack1",eAAM_OnPress,0.0f); } else if(slave && slave->GetIWeapon()) { CWeapon* dualwield = static_cast<CWeapon*>(slave); if(!dualwield->IsWeaponRaised()) { m_requestedFire = false; OnAction(GetOwnerId(),"attack1",eAAM_OnPress,0.0f); } } } } }
//------------------------------------------------------------------------------ bool CWeapon::OnActionZoomXI(EntityId actorId, const ActionId& actionId, int activationMode, float value) { COffHand * offHandWeapon = NULL; bool isOffHandSelected = false; GetOffHandInfo(this,isOffHandSelected,&offHandWeapon); if (!m_modifying && !isOffHandSelected && !IsWeaponRaised()) { bool isDualWield = false; CWeapon *dualWield = NULL; GetDualWieldInfo(this,isDualWield,&dualWield); if (m_useViewMode) { if (activationMode == eAAM_OnPress) IncrementViewmode(); } else if (g_pGameCVars->hud_ctrlZoomMode) { if (activationMode == eAAM_OnPress) { if (!isDualWield) { if(m_fm && !m_fm->IsReloading()) { // The zoom code includes the aim assistance if (m_fm->AllowZoom()) StartZoom(actorId,1); else m_fm->Cancel(); } } else { // If the view does not zoom, we need to force aim assistance AssistAiming(1, true); } } else if (activationMode == eAAM_OnRelease) { if (!isDualWield) { if(m_fm && !m_fm->IsReloading()) StopZoom(actorId); } } } else { if (activationMode == eAAM_OnPress && m_fm && !m_fm->IsReloading()) { if (!isDualWield) { if (m_fm->AllowZoom()) StartZoom(actorId,1); else m_fm->Cancel(); } else { // If the view does not zoom, we need to force aim assistance AssistAiming(1, true); } } } } return true; }
//-------------------------------------------------------------------- bool CWeapon::OnActionAttack(EntityId actorId, const ActionId& actionId, int activationMode, float value) { if(!m_modifying) { if(IsTwoHand()) { COffHand * offHandWeapon = NULL; bool isOffHandSelected = false; GetOffHandInfo(this,isOffHandSelected,&offHandWeapon); if(offHandWeapon && (offHandWeapon->GetOffHandState()&(eOHS_HOLDING_GRENADE|eOHS_SWITCHING_GRENADE|eOHS_PICKING_ITEM))) return false; } if (activationMode == eAAM_OnPress) { if(PreActionAttack(true)) return true; bool isDualWield = false; CWeapon *dualWield = NULL; GetDualWieldInfo(this,isDualWield,&dualWield); if (isDualWield) { m_fire_alternation = !m_fire_alternation; m_requestedFire = true; if (m_fire_alternation || !dualWield->CanFire()) { if(!IsWeaponRaised() && CanFire()) StartFire(); else if(!dualWield->IsWeaponRaised()) dualWield->StartFire(); } else if (dualWield->CanFire()) { if(!dualWield->IsWeaponRaised() && dualWield->CanFire()) dualWield->StartFire(); else if(!IsWeaponRaised()) StartFire(); } else if(OutOfAmmo(false)) { Reload(); dualWield->Reload(); } } else { if(!m_weaponRaised) StartFire(); m_requestedFire = true; } } else if (activationMode == eAAM_OnRelease) { PreActionAttack(false); StopFire(); m_requestedFire = false; } } return true; }
void CFists::RaiseWeapon(bool raise, bool faster /*= false*/) { //Only when colliding something while running if(raise && (GetCurrentAnimState()==eFAS_RUNNING || GetCurrentAnimState()==eFAS_JUMPING) && !IsWeaponRaised()) { if((m_fm && m_fm->IsFiring())||(m_melee && m_melee->IsFiring())) return; PlayAction(g_pItemStrings->raise); SetDefaultIdleAnimation( eIGS_FirstPerson,g_pItemStrings->idle_relaxed); SetWeaponRaised(true); //Also give the player some impulse into the opposite direction CActor *pPlayer = GetOwnerActor(); Vec3 pos; if(pPlayer) { IPhysicalEntity* playerPhysics = pPlayer->GetEntity()->GetPhysics(); if(playerPhysics) { IMovementController *pMC = pPlayer->GetMovementController(); if(pMC) { SMovementState state; pMC->GetMovementState(state); pe_action_impulse impulse; impulse.iApplyTime = 1; impulse.impulse = -state.eyeDirection*600.0f; playerPhysics->Action(&impulse); pos = state.eyePosition + state.eyeDirection*0.5f; } } } GetScheduler()->TimerAction(GetCurrentAnimationTime(eIGS_FirstPerson), CSchedulerAction<EndRaiseWeaponAction>::Create(EndRaiseWeaponAction(this)), true); //Sound and FX feedback CollisionFeeback(pos,m_currentAnimState); } else if(!raise) SetWeaponRaised(false); }
//------------------------------------------ //CFists::RequestAnimState(EFistAnimState eFAS) // //This method changes (if possible) the current animation for the fists // eFAS - Requested anim state void CFists::RequestAnimState(EFistAnimState eFAS, bool force /*=false*/) { //Only if selected if(!IsSelected() || m_frozen || IsWeaponRaised()) return; if(!m_underWater) { switch(eFAS) { case eFAS_NOSTATE: m_currentAnimState = eFAS_NOSTATE; m_timeOut = TIMEOUT; break; case eFAS_RELAXED: if(m_currentAnimState!=eFAS_NOSTATE && m_currentAnimState!=eFAS_RELAXED) { m_currentAnimState = eFAS_RELAXED; m_timeOut = TIMEOUT; PlayAction(g_pItemStrings->deselect); SetDefaultIdleAnimation( eIGS_FirstPerson,g_pItemStrings->idle_relaxed); } break; case eFAS_FIGHT: //if(m_currentAnimState!=eFAS_RUNNING) { SetDefaultIdleAnimation( eIGS_FirstPerson,g_pItemStrings->idle); m_currentAnimState = eFAS_FIGHT; m_timeOut = TIMEOUT; } break; case eFAS_RUNNING: if(m_currentAnimState==eFAS_RELAXED || CanMeleeAttack()) { PlayAction(g_pItemStrings->run_forward,0,true); m_currentAnimState = eFAS_RUNNING; } break; case eFAS_JUMPING: if(m_currentAnimState==eFAS_RUNNING) { PlayAction(g_pItemStrings->jump_start); SetDefaultIdleAnimation( eIGS_FirstPerson,g_pItemStrings->jump_idle); m_currentAnimState = eFAS_JUMPING; } break; case eFAS_LANDING: if(m_currentAnimState==eFAS_JUMPING) { PlayAction(g_pItemStrings->jump_end); SetDefaultIdleAnimation( eIGS_FirstPerson,g_pItemStrings->idle_relaxed); m_currentAnimState = eFAS_RELAXED; } break; case eFAS_CRAWL: if(m_currentAnimState!=eFAS_CRAWL) { PlayAction(g_pItemStrings->crawl,0,true); //SetDefaultIdleAnimation( eIGS_FirstPerson,g_pItemStrings->crawl); m_currentAnimState = eFAS_CRAWL; } break; } } else { switch(eFAS) { case eFAS_SWIM_IDLE: if(m_currentAnimState!=eFAS_SWIM_IDLE) { m_currentAnimState = eFAS_SWIM_IDLE; PlayAction(g_pItemStrings->swim_idle,0,true,eIPAF_Default|eIPAF_CleanBlending); //SetDefaultIdleAnimation( eIGS_FirstPerson,g_pItemStrings->swim_idle); } break; case eFAS_SWIM_FORWARD: if(m_currentAnimState!=eFAS_SWIM_FORWARD) { m_currentAnimState = eFAS_SWIM_FORWARD; PlayAction(g_pItemStrings->swim_forward,0,true,eIPAF_Default|eIPAF_CleanBlending); //SetDefaultIdleAnimation( eIGS_FirstPerson,g_pItemStrings->swim_forward); } break; case eFAS_SWIM_BACKWARD: if(m_currentAnimState!=eFAS_SWIM_BACKWARD) { m_currentAnimState = eFAS_SWIM_BACKWARD; PlayAction(g_pItemStrings->swim_backward,0,true,eIPAF_Default|eIPAF_CleanBlending); //SetDefaultIdleAnimation( eIGS_FirstPerson,g_pItemStrings->swim_backward); } break; case eFAS_SWIM_SPEED: if(m_currentAnimState!=eFAS_SWIM_SPEED) { m_currentAnimState = eFAS_SWIM_SPEED; PlayAction(g_pItemStrings->speed_swim,0,true,eIPAF_Default|eIPAF_CleanBlending); //SetDefaultIdleAnimation( eIGS_FirstPerson,g_pItemStrings->speed_swim); } break; case eFAS_SWIM_FORWARD_S: if(m_currentAnimState!=eFAS_SWIM_FORWARD_S) { m_currentAnimState = eFAS_SWIM_FORWARD_S; PlayAction(g_pItemStrings->swim_forward_2,0,true,eIPAF_Default|eIPAF_CleanBlending); //SetDefaultIdleAnimation( eIGS_FirstPerson,g_pItemStrings->swim_forward_2); } break; } } }