private void FromUserCmdToFsmInput(IUserCmd cmd, PlayerEntity player, Contexts contexts) { if (player.hasGamePlay && player.gamePlay.IsObserving()) { return; } //Logger.InfoFormat("horzontal val:{0}, vertical val:{1}", cmd.MoveHorizontal, cmd.MoveVertical); // 根据WSAD生成FsmInput bool IsSprint = false; bool IsVariant = IsVariantFilter(player); if (CompareUtility.IsApproximatelyEqual(cmd.MoveHorizontal, 0, EPS) && CompareUtility.IsApproximatelyEqual(cmd.MoveVertical, 0, EPS) && !player.playerMove.IsAutoRun) { // WSAD均未按下 SetCommand(FsmInput.Idle); } else { if (!CompareUtility.IsApproximatelyEqual(cmd.MoveHorizontal, 0, EPS)) { SetCommand(cmd.MoveHorizontal > 0 ? FsmInput.Right : FsmInput.Left, cmd.MoveHorizontal); } if (!CompareUtility.IsApproximatelyEqual(cmd.MoveVertical, 0, EPS)) { SetCommand(cmd.MoveVertical > 0 ? FsmInput.Forth : FsmInput.Back, cmd.MoveVertical); } if (PlayerStateUtil.HasPlayerState(EPlayerGameState.UseItem, player.gamePlay) || player.IsAiming() || player.StateInteractController().GetCurrStates().Contains(EPlayerState.RunDebuff)) { SetCommand(FsmInput.Walk); } else { if (player.playerMove.IsAutoRun) { if (IsVariant && player.hasStateInterface && player.stateInterface.State.GetCurrentPostureState() == PostureInConfig.Crouch) { SetCommand(FsmInput.Forth, InputValueLimit.MaxAxisValue); SetCommand(FsmInput.Run); } else { SetCommand(FsmInput.Forth, InputValueLimit.MaxAxisValue); SetCommand(FsmInput.Sprint); } } // 冲刺 IsSprint = (cmd.MoveVertical > 0 && cmd.MoveVertical >= Math.Abs(cmd.MoveHorizontal)); if (cmd.IsRun && IsCanSprint(cmd, player)) { // 冲刺只有前向90度 if (IsSprint) { if (!(player.hasStateInterface && player.stateInterface.State.GetCurrentPostureState() == PostureInConfig.Crouch && IsVariantFilter(player))) { SetCommand(FsmInput.Sprint); } } else { SetCommand(FsmInput.Run); } } // 静走 静走不被限制 else if (cmd.FilteredInput.IsInput(EPlayerInput.IsSlightWalk)) { if (IsVariant) { SetCommand(FsmInput.Run); } else { SetCommand(FsmInput.Walk); } } else if (IsCanRun(cmd)) { SetCommand(FsmInput.Run); } //不能冲刺跑步,就切换为静走 else if (cmd.FilteredInput.IsInput(EPlayerInput.IsSlightWalk)) { SetCommand(FsmInput.Walk); } } } if (!CompareUtility.IsApproximatelyEqual(cmd.MoveUpDown, 0, EPS)) { SetCommand(cmd.MoveUpDown > 0 ? FsmInput.Up : FsmInput.Down, cmd.MoveUpDown); } if (CompareUtility.IsApproximatelyEqual(cmd.MoveHorizontal, 0, EPS) && CompareUtility.IsApproximatelyEqual(cmd.MoveVertical, 0, EPS) && CompareUtility.IsApproximatelyEqual(cmd.MoveUpDown, 0, EPS)) { SetCommand(FsmInput.DiveIdle); } else { SetCommand(FsmInput.DiveMove); } if (cmd.IsPeekLeft && !cmd.IsPeekRight && cmd.FilteredInput.IsInput(XmlConfig.EPlayerInput.IsPeekLeft)) { CheckConditionAndSetCommand(cmd, XmlConfig.EPlayerInput.IsPeekLeft, FsmInput.PeekLeft); } else if (cmd.IsPeekRight && !cmd.IsPeekLeft && cmd.FilteredInput.IsInput(XmlConfig.EPlayerInput.IsPeekRight)) { CheckConditionAndSetCommand(cmd, XmlConfig.EPlayerInput.IsPeekRight, FsmInput.PeekRight); } else { SetCommand(FsmInput.NoPeek); } if (cmd.IsJump) { CheckConditionAndSetCommand(cmd, XmlConfig.EPlayerInput.IsJump, FsmInput.Jump); } bool runInterrupt = (cmd.IsRun && IsSprint && IsVariant && player.hasStateInterface && player.stateInterface.State.GetCurrentPostureState() == PostureInConfig.Crouch); UserCmd.SetInterrupt(UserCmdEnum.IsRun, runInterrupt ? UserCmdHandle.Interrupt : UserCmdHandle.None); if (cmd.IsCrouch) { bool autoRunSynchronous = (player.playerMove.IsAutoRun && IsVariant); UserCmd.SetInterrupt(UserCmdEnum.IsRun, autoRunSynchronous ? UserCmdHandle.Synchronous : UserCmdHandle.None); UserCmd.SetInterrupt(UserCmdEnum.IsSwitchAutoRun, autoRunSynchronous ? UserCmdHandle.Synchronous : UserCmdHandle.None); CheckConditionAndSetCommand(cmd, XmlConfig.EPlayerInput.IsCrouch, FsmInput.Crouch); } if (cmd.IsCDown) { SetCommand(FsmInput.BigJump); } if (cmd.IsProne && !IsVariant) { CheckConditionAndSetCommand(cmd, XmlConfig.EPlayerInput.IsProne, FsmInput.Prone); } }