bool CActor::CanSprint () { bool can_Sprint = CanAccelerate() && !conditions().IsCantSprint() && Game().PlayerCanSprint(this) && CanRun() && !(mstate_real&mcLStrafe || mstate_real&mcRStrafe) && InventoryAllowSprint() ; return can_Sprint; }
void CActor::g_cl_CheckControls(u32 mstate_wf, Fvector &vControlAccel, float &Jump, float dt) { mstate_old = mstate_real; vControlAccel.set (0,0,0); if (!(mstate_real&mcFall) && (character_physics_support()->movement()->Environment()==CPHMovementControl::peInAir)) { m_fFallTime -= dt; if (m_fFallTime<=0.f){ m_fFallTime = s_fFallTime; mstate_real |= mcFall; mstate_real &=~ mcJump; } } if(!CanMove()) { if(mstate_wf&mcAnyMove) { StopAnyMove(); mstate_wf &= ~mcAnyMove; mstate_wf &= ~mcJump; } //character_physics_support()->movement()->EnableCharacter(); //return; } // update player accel if (mstate_wf&mcFwd) vControlAccel.z += 1; if (mstate_wf&mcBack) vControlAccel.z += -1; if (mstate_wf&mcLStrafe) vControlAccel.x += -1; if (mstate_wf&mcRStrafe) vControlAccel.x += 1; if (character_physics_support()->movement()->Environment()==CPHMovementControl::peOnGround || character_physics_support()->movement()->Environment()==CPHMovementControl::peAtWall ) { // crouch if ((0==(mstate_real&mcCrouch))&&(mstate_wf&mcCrouch)) { if(mstate_real&mcClimb) { mstate_wf&=~mcCrouch; } else { character_physics_support()->movement()->EnableCharacter(); bool Crouched = false; if (isActorAccelerated(mstate_wf, IsZoomAimingMode())) Crouched = character_physics_support()->movement()->ActivateBoxDynamic(1); else Crouched = character_physics_support()->movement()->ActivateBoxDynamic(2); if (Crouched) mstate_real |= mcCrouch; } } // jump m_fJumpTime -= dt; if ( CanJump() && (mstate_wf&mcJump) ) { mstate_real |= mcJump; m_bJumpKeyPressed = TRUE; Jump = m_fJumpSpeed; m_fJumpTime = s_fJumpTime; //уменьшить силу игрока из-за выполненого прыжка if (!GodMode()) conditions().ConditionJump(inventory().TotalWeight() / MaxCarryWeight()); } /* if(m_bJumpKeyPressed) Jump = m_fJumpSpeed; */ // mask input into "real" state u32 move = mcAnyMove|mcAccel; if (((mstate_real&mcCrouch))) { if (!isActorAccelerated(mstate_real, IsZoomAimingMode()) && isActorAccelerated(mstate_wf, IsZoomAimingMode())) { character_physics_support()->movement()->EnableCharacter(); if(!character_physics_support()->movement()->ActivateBoxDynamic(1))move &=~mcAccel; } if (isActorAccelerated(mstate_real, IsZoomAimingMode()) && !isActorAccelerated(mstate_wf, IsZoomAimingMode())) { character_physics_support()->movement()->EnableCharacter(); if(character_physics_support()->movement()->ActivateBoxDynamic(2))mstate_real &=~mcAccel; } } if ((mstate_wf&mcSprint) && !CanSprint()) { mstate_wf &= ~mcSprint; } mstate_real &= (~move); mstate_real |= (mstate_wf & move); if(mstate_wf&mcSprint) mstate_real|=mcSprint; else mstate_real&=~mcSprint; if(!(mstate_real&(mcFwd|mcLStrafe|mcRStrafe))||mstate_real&(mcCrouch|mcClimb)|| !isActorAccelerated(mstate_wf, IsZoomAimingMode())) { mstate_real&=~mcSprint; mstate_wishful&=~mcSprint; } // check player move state if (mstate_real&mcAnyMove) { BOOL bAccelerated = isActorAccelerated(mstate_real, IsZoomAimingMode())&&CanAccelerate(); // correct "mstate_real" if opposite keys pressed if (_abs(vControlAccel.z)<EPS) mstate_real &= ~(mcFwd+mcBack ); if (_abs(vControlAccel.x)<EPS) mstate_real &= ~(mcLStrafe+mcRStrafe); // normalize and analyze crouch and run float scale = vControlAccel.magnitude(); if (scale>EPS) { scale = m_fWalkAccel/scale; if (bAccelerated) if (mstate_real&mcBack) scale *= m_fRunBackFactor; else scale *= m_fRunFactor; else if (mstate_real&mcBack) scale *= m_fWalkBackFactor; if (mstate_real&mcCrouch) scale *= m_fCrouchFactor; if (mstate_real&mcClimb) scale *= m_fClimbFactor; if (mstate_real&mcSprint) scale *= m_fSprintFactor; if (mstate_real&(mcLStrafe|mcRStrafe) && !(mstate_real&mcCrouch)) { if (bAccelerated) scale *= m_fRun_StrafeFactor; else scale *= m_fWalk_StrafeFactor; } vControlAccel.mul (scale); }else{ // mstate_real &= ~mcAnyMove; } } }else{ // mstate_real &=~ mcAnyMove; } //------------------------------------------------------------------------------- //transform local dir to world dir Fmatrix mOrient; mOrient.rotateY (-r_model_yaw); mOrient.transform_dir(vControlAccel); //XFORM().transform_dir(vControlAccel); /* if(mstate_real&mcClimb&&mstate_real&mcAnyMove&& inventory().ActiveItem()&&inventory().ActiveItem()->HandDependence()==hd2Hand) { //inventory().ActiveItem()->Deactivate(); inventory().Activate(NO_ACTIVE_SLOT); } */ }
void CActor::g_cl_ValidateMState(float dt, u32 mstate_wf) { // Lookout if (mstate_wf&mcLookout) mstate_real |= mstate_wf&mcLookout; else mstate_real &= ~mcLookout; if (mstate_real&(mcJump|mcFall|mcLanding|mcLanding2)) mstate_real &= ~mcLookout; // закончить приземление if (mstate_real&(mcLanding|mcLanding2)){ m_fLandingTime -= dt; if (m_fLandingTime<=0.f){ mstate_real &=~ (mcLanding|mcLanding2); mstate_real &=~ (mcFall|mcJump); } } // закончить падение if (character_physics_support()->movement()->gcontact_Was){ if (mstate_real&mcFall){ if (character_physics_support()->movement()->GetContactSpeed()>4.f){ if (fis_zero(character_physics_support()->movement()->gcontact_HealthLost)){ m_fLandingTime = s_fLandingTime1; mstate_real |= mcLanding; }else{ m_fLandingTime = s_fLandingTime2; mstate_real |= mcLanding2; } } } m_bJumpKeyPressed = TRUE; m_fJumpTime = s_fJumpTime; mstate_real &=~ (mcFall|mcJump); } if ((mstate_wf&mcJump)==0) m_bJumpKeyPressed = FALSE; // Зажало-ли меня/уперся - не двигаюсь if (((character_physics_support()->movement()->GetVelocityActual()<0.2f)&&(!(mstate_real&(mcFall|mcJump)))) || character_physics_support()->movement()->bSleep) { mstate_real &=~ mcAnyMove; } if (character_physics_support()->movement()->Environment()==CPHMovementControl::peOnGround || character_physics_support()->movement()->Environment()==CPHMovementControl::peAtWall) { // если на земле гарантированно снимать флажок Jump if (((s_fJumpTime-m_fJumpTime)>s_fJumpGroundTime)&&(mstate_real&mcJump)) { mstate_real &=~ mcJump; m_fJumpTime = s_fJumpTime; } } if(character_physics_support()->movement()->Environment()==CPHMovementControl::peAtWall) { if(!(mstate_real & mcClimb)) { mstate_real |=mcClimb; mstate_real &=~mcSprint; cam_SetLadder(); } } else { if (mstate_real & mcClimb) { cam_UnsetLadder(); } mstate_real &=~mcClimb; }; if (mstate_wf != mstate_real){ if ((mstate_real&mcCrouch)&&((0==(mstate_wf&mcCrouch)) || mstate_real&mcClimb)){ if (character_physics_support()->movement()->ActivateBoxDynamic(0)){ mstate_real &= ~mcCrouch; } } } if(!CanAccelerate()&&isActorAccelerated(mstate_real, IsZoomAimingMode())) { mstate_real ^=mcAccel; }; if (this == Level().CurrentControlEntity()) { bool bOnClimbNow = !!(mstate_real&mcClimb); bool bOnClimbOld = !!(mstate_old&mcClimb); if (bOnClimbNow != bOnClimbOld ) { SetWeaponHideState (INV_STATE_LADDER, bOnClimbNow ); }; /* if ((mstate_real&mcSprint) != (mstate_old&mcSprint)) { CHudItem* pHudItem = smart_cast<CHudItem*>(inventory().ActiveItem()); if (pHudItem) pHudItem->onMovementChanged(mcSprint); }; */ }; };
void CActor::g_cl_CheckControls(u32 mstate_wf, Fvector &vControlAccel, float &Jump, float dt) { float cam_eff_factor = 0.0f; mstate_old = mstate_real; vControlAccel.set (0,0,0); if (!(mstate_real&mcFall) && (character_physics_support()->movement()->Environment()==CPHMovementControl::peInAir)) { m_fFallTime -= dt; if (m_fFallTime<=0.f) { m_fFallTime = s_fFallTime; mstate_real |= mcFall; mstate_real &=~ mcJump; } } if(!CanMove()) { if(mstate_wf&mcAnyMove) { StopAnyMove(); mstate_wf &= ~mcAnyMove; mstate_wf &= ~mcJump; } } // update player accel if (mstate_wf&mcFwd) vControlAccel.z += 1; if (mstate_wf&mcBack) vControlAccel.z += -1; if (mstate_wf&mcLStrafe) vControlAccel.x += -1; if (mstate_wf&mcRStrafe) vControlAccel.x += 1; CPHMovementControl::EEnvironment curr_env = character_physics_support()->movement()->Environment(); if(curr_env==CPHMovementControl::peOnGround || curr_env==CPHMovementControl::peAtWall) { // crouch if ((0==(mstate_real&mcCrouch))&&(mstate_wf&mcCrouch)) { if(mstate_real&mcClimb) { mstate_wf&=~mcCrouch; } else { character_physics_support()->movement()->EnableCharacter(); bool Crouched = false; if(isActorAccelerated(mstate_wf, IsZoomAimingMode())) Crouched = character_physics_support()->movement()->ActivateBoxDynamic(1); else Crouched = character_physics_support()->movement()->ActivateBoxDynamic(2); if(Crouched) mstate_real |= mcCrouch; } } // jump m_fJumpTime -= dt; if( CanJump() && (mstate_wf&mcJump) ) { mstate_real |= mcJump; m_bJumpKeyPressed = TRUE; Jump = m_fJumpSpeed; m_fJumpTime = s_fJumpTime; //уменьшить силу игрока из-за выполненого прыжка if (!GodMode()) conditions().ConditionJump(inventory().TotalWeight() / MaxCarryWeight()); } // mask input into "real" state u32 move = mcAnyMove|mcAccel; if(mstate_real&mcCrouch) { if (!isActorAccelerated(mstate_real, IsZoomAimingMode()) && isActorAccelerated(mstate_wf, IsZoomAimingMode())) { character_physics_support()->movement()->EnableCharacter(); if(!character_physics_support()->movement()->ActivateBoxDynamic(1))move &=~mcAccel; } if (isActorAccelerated(mstate_real, IsZoomAimingMode()) && !isActorAccelerated(mstate_wf, IsZoomAimingMode())) { character_physics_support()->movement()->EnableCharacter(); if(character_physics_support()->movement()->ActivateBoxDynamic(2))mstate_real &=~mcAccel; } } if ((mstate_wf&mcSprint) && !CanSprint()) mstate_wf &= ~mcSprint; mstate_real &= (~move); mstate_real |= (mstate_wf & move); if(mstate_wf&mcSprint) mstate_real|=mcSprint; else mstate_real&=~mcSprint; if(!(mstate_real&(mcFwd|mcLStrafe|mcRStrafe))||mstate_real&(mcCrouch|mcClimb)|| !isActorAccelerated(mstate_wf, IsZoomAimingMode())) { mstate_real&=~mcSprint; mstate_wishful&=~mcSprint; } // check player move state if(mstate_real&mcAnyMove) { BOOL bAccelerated = isActorAccelerated(mstate_real, IsZoomAimingMode())&&CanAccelerate(); // correct "mstate_real" if opposite keys pressed if (_abs(vControlAccel.z)<EPS) mstate_real &= ~(mcFwd+mcBack ); if (_abs(vControlAccel.x)<EPS) mstate_real &= ~(mcLStrafe+mcRStrafe); // normalize and analyze crouch and run float scale = vControlAccel.magnitude(); if(scale>EPS) { scale = m_fWalkAccel/scale; if (bAccelerated) if (mstate_real&mcBack) scale *= m_fRunBackFactor; else scale *= m_fRunFactor; else if (mstate_real&mcBack) scale *= m_fWalkBackFactor; if (mstate_real&mcCrouch) scale *= m_fCrouchFactor; if (mstate_real&mcClimb) scale *= m_fClimbFactor; if (mstate_real&mcSprint) scale *= m_fSprintFactor; if (mstate_real&(mcLStrafe|mcRStrafe) && !(mstate_real&mcCrouch)) { if (bAccelerated) scale *= m_fRun_StrafeFactor; else scale *= m_fWalk_StrafeFactor; } vControlAccel.mul (scale); cam_eff_factor = scale; }//scale>EPS }//(mstate_real&mcAnyMove) }//peOnGround || peAtWall if(IsGameTypeSingle() && cam_eff_factor>EPS) { LPCSTR state_anm = NULL; if(mstate_real&mcSprint && !(mstate_old&mcSprint) ) state_anm = "sprint"; else if(mstate_real&mcLStrafe && !(mstate_old&mcLStrafe) ) state_anm = "strafe_left"; else if(mstate_real&mcRStrafe && !(mstate_old&mcRStrafe) ) state_anm = "strafe_right"; else if(mstate_real&mcFwd && !(mstate_old&mcFwd) ) state_anm = "move_fwd"; else if(mstate_real&mcBack && !(mstate_old&mcBack) ) state_anm = "move_back"; if(state_anm) { //play moving cam effect CActor* control_entity = static_cast_checked<CActor*>(Level().CurrentControlEntity()); R_ASSERT2 (control_entity, "current control entity is NULL"); CEffectorCam* ec = control_entity->Cameras().GetCamEffector(eCEActorMoving); if(NULL==ec) { string_path eff_name; xr_sprintf (eff_name, sizeof(eff_name), "%s.anm", state_anm); string_path ce_path; string_path anm_name; strconcat (sizeof(anm_name), anm_name, "camera_effects\\actor_move\\", eff_name); if (FS.exist( ce_path, "$game_anims$", anm_name)) { CAnimatorCamLerpEffectorConst* e = xr_new<CAnimatorCamLerpEffectorConst>(); float max_scale = 70.0f; float factor = cam_eff_factor/max_scale; e->SetFactor (factor); e->SetType (eCEActorMoving); e->SetHudAffect (false); e->SetCyclic (false); e->Start (anm_name); control_entity->Cameras().AddCamEffector(e); } } } } //transform local dir to world dir Fmatrix mOrient; mOrient.rotateY (-r_model_yaw); mOrient.transform_dir(vControlAccel); }