Пример #1
0
        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);
            }
        }