private void UpdateMovementInput(GameTime gt) { if (!_allowMovementInput) { Player.Movement.UpdateHeading(Vector3.Zero); return; } var moveVector = Vector3.Zero; var now = DateTime.UtcNow; if (Player.CanFly) { if (InputManager.IsPressed(InputCommand.ToggleCameraFree)) { Player.IsFlying = !Player.IsFlying; } else if (InputManager.IsDown(InputCommand.MoveUp) || InputManager.IsDown(InputCommand.Jump)) { if ((InputManager.IsBeginPress(InputCommand.MoveUp) || InputManager.IsBeginPress(InputCommand.Jump)) && now.Subtract(_lastUp).TotalMilliseconds <= 125) { Player.IsFlying = !Player.IsFlying; } _lastUp = now; } } //float speedFactor = (float)Player.CalculateMovementSpeed(); if (InputManager.IsDown(InputCommand.MoveForwards)) { moveVector.Z += 1; if (!Player.IsSprinting && Player.CanSprint) { if (InputManager.IsBeginPress(InputCommand.MoveForwards) && now.Subtract(_lastForward).TotalMilliseconds <= 125) { Player.IsSprinting = true; } } _lastForward = now; } else { if (Player.IsSprinting) { Player.IsSprinting = false; } } if (InputManager.IsDown(InputCommand.MoveBackwards)) { moveVector.Z -= 1; } if (InputManager.IsDown(InputCommand.MoveLeft)) { moveVector.X += 1; } if (InputManager.IsDown(InputCommand.MoveRight)) { moveVector.X -= 1; } if (Player.IsFlying) { //speedFactor *= 1f + (float)Player.FlyingSpeed; //speedFactor *= 2.5f; if (InputManager.IsDown(InputCommand.MoveUp)) { moveVector.Y += 1; } if (InputManager.IsDown(InputCommand.MoveDown)) { moveVector.Y -= 1; Player.IsSneaking = true; } else { Player.IsSneaking = false; } } else { if (Player.FeetInWater && InputManager.IsDown(InputCommand.MoveUp)) { Player.Velocity = new Vector3(Player.Velocity.X, 1f, Player.Velocity.Z); } else if (!Player.IsInWater && Player.KnownPosition.OnGround && (InputManager.IsDown(InputCommand.Jump) || InputManager.IsDown(InputCommand.MoveUp))) { if (Player.Velocity.Y <= 0.00001f && Player.Velocity.Y >= -0.00001f && Math.Abs(LastVelocity.Y - Player.Velocity.Y) < 0.0001f) { // moveVector.Y += 42f; // Player.Velocity += new Vector3(0f, 4.65f, 0f); // //, 0); Player.Jump(); } } if (!Player.IsInWater) //Sneaking in water is not a thing. { if (InputManager.IsDown(InputCommand.MoveDown) || InputManager.IsDown(InputCommand.Sneak)) { Player.IsSneaking = true; } else //if (_prevKeyState.IsKeyDown(KeyBinds.Down)) { Player.IsSneaking = false; } } } WasInWater = Player.FeetInWater; Player.Movement.UpdateHeading(moveVector); // LastSpeedFactor = speedFactor; if (IgnoreNextUpdate) { IgnoreNextUpdate = false; } else { var checkMouseInput = true; if (GamePadInputListener != null && GamePadInputListener.IsConnected) { var inputValue = GamePadInputListener.GetCursorPosition(); if (inputValue != Vector2.Zero) { checkMouseInput = false; var look = (new Vector2((inputValue.X), (inputValue.Y)) * (float)GamepadSensitivity) * (float)(gt.ElapsedGameTime.TotalSeconds); look = -look; Player.KnownPosition.HeadYaw -= look.X; Player.KnownPosition.Pitch -= look.Y; Player.KnownPosition.HeadYaw = MathUtils.NormDeg(Player.KnownPosition.HeadYaw); Player.KnownPosition.Pitch = MathHelper.Clamp(Player.KnownPosition.Pitch, -89.9f, 89.9f); } } if (checkMouseInput) { var e = MouseInputListener.GetCursorPosition(); if (e.X < 10 || e.X > Graphics.Viewport.Width - 10 || e.Y < 10 || e.Y > Graphics.Viewport.Height - 10) { CenterCursor(); IgnoreNextUpdate = true; } else { var mouseDelta = _previousMousePosition - e; //this.GlobalInputManager.CursorInputListener.GetCursorPositionDelta(); var look = (new Vector2((-mouseDelta.X), (mouseDelta.Y)) * (float)CursorSensitivity) * (float)(gt.ElapsedGameTime.TotalSeconds); look = -look; Player.KnownPosition.HeadYaw -= look.X; Player.KnownPosition.Pitch -= look.Y; Player.KnownPosition.HeadYaw = MathUtils.NormDeg(Player.KnownPosition.HeadYaw); Player.KnownPosition.Pitch = MathHelper.Clamp(Player.KnownPosition.Pitch, -89.9f, 89.9f); //Player.KnownPosition.Pitch = MathHelper.Clamp(Player.KnownPosition.Pitch + look.Y, -89.9f, 89.9f); // Player.KnownPosition.Yaw = (Player.KnownPosition.Yaw + look.X) % 360f; // Player.KnownPosition.Yaw %= 360f; _previousMousePosition = e; } } } LastVelocity = Player.Velocity; }
private void UpdateMovementInput(GameTime gt) { if (!_allowMovementInput) { return; } var moveVector = Vector3.Zero; var now = DateTime.UtcNow; if (Player.CanFly) { if (InputManager.IsPressed(InputCommand.ToggleCameraFree)) { Player.IsFlying = !Player.IsFlying; } else if (InputManager.IsDown(InputCommand.MoveUp)) { if (InputManager.IsBeginPress(InputCommand.MoveUp) && now.Subtract(_lastUp).TotalMilliseconds <= 125) { Player.IsFlying = !Player.IsFlying; } _lastUp = now; } } float modifier = (Player.IsFlying ? (float)Player.FlyingSpeed : (float)Player.MovementSpeed) * 10f; if (Player.IsInWater || (WasInWater && Player.AboveWater)) { modifier = 0.3f; } else if (Player.IsSprinting && !Player.IsSneaking) { modifier = 1.29997683577f; //speedFactor *= 0.2806f; } else if (Player.IsSneaking && !Player.IsSprinting) { modifier = 0.29997683576f; } // float speedFactor = (((float) Player.MovementSpeed) * modifier); float speedFactor = (float)(Player.BaseMovementSpeed * modifier); if (InputManager.IsDown(InputCommand.MoveForwards)) { moveVector.Z += 1; if (!Player.IsSprinting && Player.CanSprint) { if (InputManager.IsBeginPress(InputCommand.MoveForwards) && now.Subtract(_lastForward).TotalMilliseconds <= 125) { Player.IsSprinting = true; } } _lastForward = now; } else { if (Player.IsSprinting) { Player.IsSprinting = false; } } if (InputManager.IsDown(InputCommand.MoveBackwards)) { moveVector.Z -= 1; } if (InputManager.IsDown(InputCommand.MoveLeft)) { moveVector.X += 1; } if (InputManager.IsDown(InputCommand.MoveRight)) { moveVector.X -= 1; } if (Player.IsFlying) { //speedFactor *= 1f + (float)Player.FlyingSpeed; //speedFactor *= 2.5f; if (InputManager.IsDown(InputCommand.MoveUp)) { moveVector.Y += 1; } if (InputManager.IsDown(InputCommand.MoveDown)) { moveVector.Y -= 1; Player.IsSneaking = true; } else { Player.IsSneaking = false; } } else { if (Player.FeetInWater && InputManager.IsDown(InputCommand.MoveUp)) { Player.Velocity = new Vector3(Player.Velocity.X, 1f * speedFactor, Player.Velocity.Z); } else if (!Player.IsInWater && Player.KnownPosition.OnGround && InputManager.IsDown(InputCommand.MoveUp)) { if (Player.Velocity.Y <= 0.00001f && Player.Velocity.Y >= -0.00001f && Math.Abs(LastVelocity.Y - Player.Velocity.Y) < 0.0001f) { // moveVector.Y += 42f; // Player.Velocity += new Vector3(0f, 4.65f, 0f); // //, 0); Player.Jump(); } } if (!Player.IsInWater) //Sneaking in water is not a thing. { if (InputManager.IsDown(InputCommand.MoveDown)) { Player.IsSneaking = true; } else //if (_prevKeyState.IsKeyDown(KeyBinds.Down)) { Player.IsSneaking = false; } } } WasInWater = Player.FeetInWater; // if (moveVector != Vector3.Zero) { var velocity = moveVector * speedFactor; velocity = Vector3.Transform(velocity, Matrix.CreateRotationY(-MathHelper.ToRadians(Player.KnownPosition.HeadYaw))); if (Player.IsFlying) { if ((Player.Velocity * new Vector3(1, 1, 1)).Length() < velocity.Length()) { var old = Player.Velocity; Player.Velocity += new Vector3(velocity.X - old.X, velocity.Y - old.Y, velocity.Z - old.Z); } else { Player.Velocity = new Vector3(velocity.X, velocity.Y, velocity.Z); } } else { var old = Player.Velocity; var oldLength = (Player.Velocity * new Vector3(1, 0, 1)).Length(); if (oldLength < velocity.Length()) { Player.Velocity += new Vector3(velocity.X - old.X, 0, velocity.Z - old.Z); } else { Player.Velocity = new Vector3(MathF.Abs(old.X) < 0.0001f ? velocity.X : old.X, Player.Velocity.Y, MathF.Abs(old.Z) < 0.0001f ? velocity.Z : old.Z); } } //speedFactor *= 20; //Player.Velocity += (moveVector * speedFactor);// new Vector3(moveVector.X * speedFactor, moveVector.Y * (speedFactor), moveVector.Z * speedFactor); } LastSpeedFactor = speedFactor; if (IgnoreNextUpdate) { IgnoreNextUpdate = false; } else { var e = this.GlobalInputManager.CursorInputListener.GetCursorPosition(); var centerX = Graphics.Viewport.Width / 2; var centerY = Graphics.Viewport.Height / 2; if (e.X < 10 || e.X > Graphics.Viewport.Width - 10 || e.Y < 10 || e.Y > Graphics.Viewport.Height - 10) { _previousMousePosition = new Vector2(centerX, centerY); Mouse.SetPosition(centerX, centerY); IgnoreNextUpdate = true; } else { var mouseDelta = _previousMousePosition - e; //this.GlobalInputManager.CursorInputListener.GetCursorPositionDelta(); var look = new Vector2((-mouseDelta.X), (mouseDelta.Y)) * (float)(gt.ElapsedGameTime.TotalSeconds * CursorSensitivity); look = -look; Player.KnownPosition.HeadYaw -= look.X; Player.KnownPosition.Pitch -= look.Y; Player.KnownPosition.HeadYaw = MathUtils.NormDeg(Player.KnownPosition.HeadYaw); Player.KnownPosition.Pitch = MathHelper.Clamp(Player.KnownPosition.Pitch, -89.9f, 89.9f); //Player.KnownPosition.Pitch = MathHelper.Clamp(Player.KnownPosition.Pitch + look.Y, -89.9f, 89.9f); // Player.KnownPosition.Yaw = (Player.KnownPosition.Yaw + look.X) % 360f; // Player.KnownPosition.Yaw %= 360f; _previousMousePosition = e; } } LastVelocity = Player.Velocity; }