bool CUIDialogWnd::IR_OnKeyboardRelease(int dik) { if(!IR_process()) return false; //mouse click if(dik==MOUSE_1 || dik==MOUSE_2 || dik==MOUSE_3) { Fvector2 cp = GetUICursor()->GetPos(); EUIMessages action = (dik==MOUSE_1)?WINDOW_LBUTTON_UP :(dik==MOUSE_2)?WINDOW_RBUTTON_UP:WINDOW_CBUTTON_UP; if (OnMouse(cp.x, cp.y, action)) return true; } if (OnKeyboard(dik, WINDOW_KEY_RELEASED)) return true; if( !StopAnyMove() && g_pGameLevel ){ CObject* O = Level().CurrentEntity(); if( O ){ IInputReceiver* IR = smart_cast<IInputReceiver*>( smart_cast<CGameObject*>(O) ); if (!IR) return (false); IR->IR_OnKeyboardRelease(get_binded_action(dik)); } } return false; }
bool CUIDialogWnd::IR_OnKeyboardHold(int dik) { if(!IR_process()) return false; if (OnKeyboardHold(dik)) return true; if( !StopAnyMove() && g_pGameLevel ){ CObject* O = Level().CurrentEntity(); if( O ){ IInputReceiver* IR = smart_cast<IInputReceiver*>( smart_cast<CGameObject*>(O) ); if (!IR) return (false); IR->IR_OnKeyboardHold(get_binded_action(dik)); } } return false; }
bool CUIDialogWnd::IR_OnMouseMove(int dx, int dy) { if(!IR_process()) return false; if (GetUICursor()->IsVisible()) { GetUICursor()->MoveBy(float(dx), float(dy)); Fvector2 cPos = GetUICursor()->GetPos(); OnMouse(cPos.x, cPos.y , WINDOW_MOUSE_MOVE); } else if( !StopAnyMove() && g_pGameLevel ){ CObject* O = Level().CurrentEntity(); if( O ){ IInputReceiver* IR = smart_cast<IInputReceiver*>( smart_cast<CGameObject*>(O) ); if (!IR) return (false); IR->IR_OnMouseMove(dx,dy); } }; return true; }
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_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); }