protected override void Update(float deltaTime)
        {
            if (StateInfo != null)
            {
                // Get user input
                bool inputM1        = AllowUserInput && Input.GetControlDown("PrimaryFire");
                bool inputM1Held    = AllowUserInput && Input.GetControl("PrimaryFire");
                bool inputM2        = AllowUserInput && Input.GetControlDown("SecondaryFire");
                bool inputM2Held    = AllowUserInput && Input.GetControl("SecondaryFire");
                bool inputReload    = AllowUserInput && Input.GetControlDown("Reload");
                bool inputJump      = AllowUserInput && Input.GetControl("Jump");
                bool inputSprint    = AllowUserInput && Input.GetControl("Sprint");
                bool inputWalk      = AllowUserInput && Input.GetControl("Walk");
                bool inputCrouch    = AllowUserInput && Input.GetControl("Crouch");
                bool inputCrouchUp  = AllowUserInput && Input.GetControlUp("Crouch");
                bool inputDropIntel = AllowUserInput && Input.GetControlDown("DropIntel");

                // Check if aiming
                IsAiming = ItemManager.SelectedItem != null &&
                           (ItemManager.SelectedItem.Type.HasFlag(ItemType.Gun) ||
                            ItemManager.SelectedItem.Type.HasFlag(ItemType.MelonLauncher)) &&
                           ItemManager.SelectedItem.CanSecondaryFire()
                    ? inputM2Held : false;

                IsSprinting = CharacterController.IsMoving && CharacterController.DeltaPosition.Length > 0 && !IsAiming &&
                              !CharacterController.IsCrouching && !inputWalk && inputSprint;

                // Update the selected item
                ItemManager.Update(inputM1, inputM1Held, inputM2, inputM2Held, inputReload, deltaTime);

                // Move the character
                Vector3 move = Vector3.Zero;
                if (AllowUserInput)
                {
                    if (Input.GetControl("MoveForward"))
                    {
                        move.Z -= 1;
                    }
                    if (Input.GetControl("MoveBackward"))
                    {
                        move.Z += 1;
                    }
                    if (Input.GetControl("MoveLeft"))
                    {
                        move.X -= 1;
                    }
                    if (Input.GetControl("MoveRight"))
                    {
                        move.X += 1;
                    }
                }

                UpdateMoveVector(move, inputJump, inputSprint, IsWalking = inputWalk);

                if (inputCrouch)
                {
                    CharacterController.IsCrouching = true;
                }
                else if (inputCrouchUp || !inputCrouch && CharacterController.IsCrouching)
                {
                    CharacterController.TryUncrouch(World);
                }

                // Toggle the mouse and flashlight
                if (AllowUserInput)
                {
                    if (Input.GetControlDown("ToggleFlashlight"))
                    {
                        flashlight.Visible = !flashlight.Visible;
                        flashlightAudioSource?.Play();
                    }
                }

                // Handle landing
                if (CharacterController.IsGrounded && !lastGrounded)
                {
                    landAudioSource?.Play();
                }

                // Handle walking/running
                walkingAudioSource.IsPlaying       = CharacterController.IsGrounded && CharacterController.IsMoving && !IsSprinting;
                walkingAudioSource.IterationLength = (1f / Viewbob.GetSpeed()) * 2f;
                walkingAudioSource.Update(deltaTime);

                runningAudioSource.IsPlaying       = CharacterController.IsGrounded && CharacterController.IsMoving && IsSprinting;
                runningAudioSource.IterationLength = (1f / Viewbob.GetSpeed()) * 2f;
                runningAudioSource.Update(deltaTime);

                // Update viewbob
                Viewbob.Update(deltaTime);

                // Ensure camera firstperson offset is accurate (changes when crouched)
                Camera.Active.FirstPersonLockOffset = new Vector3(0, Size.Y / 2f - 1.1f, 0);

                // Update the camera effects
                camfx.Update(deltaTime);

                // Update flashlight transformation
                flashlight.Position = IsRenderingThirdperson
                    ? Transform.Position + Camera.Active.FirstPersonLockOffset
                    : Camera.Active.Position;
                flashlight.Direction = -Camera.Active.LookVector;

                // Update the snapshot
                ClientSnapshot.X        = Transform.Position.X;
                ClientSnapshot.Y        = Transform.Position.Y;
                ClientSnapshot.Z        = Transform.Position.Z;
                ClientSnapshot.CamYaw   = camera.Yaw;
                ClientSnapshot.CamPitch = camera.Pitch;

                ClientSnapshot.IsFlashlightVisible = flashlight.Visible;
                ClientSnapshot.Reload    = inputReload || ClientSnapshot.Reload;
                ClientSnapshot.DropIntel = inputDropIntel || ClientSnapshot.DropIntel;

                ClientSnapshot.IsCrouching = CharacterController.IsCrouching;
                ClientSnapshot.IsSprinting = IsSprinting;
                ClientSnapshot.IsMoving    = CharacterController.IsMoving;
                ClientSnapshot.IsAiming    = IsAiming;
                ClientSnapshot.IsGrounded  = CharacterController.IsGrounded;
                ClientSnapshot.Jump        = jumped || ClientSnapshot.Jump;

                ClientSnapshot.SelectedItem = (byte)ItemManager.SelectedItemIndex;

                if (ItemManager.SelectedItem is BlockItem blockItem)
                {
                    ClientSnapshot.ColorR = blockItem.BlockColor.R;
                    ClientSnapshot.ColorG = blockItem.BlockColor.G;
                    ClientSnapshot.ColorB = blockItem.BlockColor.B;
                }
            }

            lastGrounded = CharacterController.IsGrounded;
            jumped       = false;

            base.Update(deltaTime);
        }
Ejemplo n.º 2
0
        protected override void Update(float deltaTime)
        {
            if (Input.GetControlDown("DropIntel"))
            {
                DropIntel();
            }

            // Check if aiming
            IsAiming = AllowUserInput && ItemManager.SelectedItem != null &&
                       (ItemManager.SelectedItem.Type.HasFlag(ItemType.Gun) ||
                        ItemManager.SelectedItem.Type.HasFlag(ItemType.MelonLauncher)) &&
                       ItemManager.SelectedItem.CanSecondaryFire()
                ? Input.GetControl("SecondaryFire") : false;

            IsSprinting = AllowUserInput && CharacterController.IsMoving && CharacterController.DeltaPosition.Length > 0 &&
                          !IsAiming && !CharacterController.IsCrouching && !Input.GetControl("Walk") && Input.GetControl("Sprint");

            // Update the currently selected item
            if (AllowUserInput)
            {
                ItemManager.Update(
                    Input.GetControlDown("PrimaryFire"), Input.GetControl("PrimaryFire"),
                    Input.GetControlDown("SecondaryFire"), Input.GetControl("SecondaryFire"),
                    Input.GetControlDown("Reload"), deltaTime);
            }
            else
            {
                ItemManager.Update(false, false, false, false, false, deltaTime);
            }

            // Move the player
            Vector3 move = Vector3.Zero;

            if (AllowUserInput)
            {
                if (Input.GetControl("MoveForward"))
                {
                    move.Z -= 1;
                }
                if (Input.GetControl("MoveBackward"))
                {
                    move.Z += 1;
                }
                if (Input.GetControl("MoveLeft"))
                {
                    move.X -= 1;
                }
                if (Input.GetControl("MoveRight"))
                {
                    move.X += 1;
                }

                UpdateMoveVector(move, Input.GetControl("Jump"), Input.GetControl("Sprint"), IsWalking = Input.GetControl("Walk"));
            }
            else
            {
                UpdateMoveVector(move, false, false, false);
            }

            if (Input.GetControlDown("Crouch") && AllowUserInput)
            {
                CharacterController.IsCrouching = true;
            }
            else if (Input.GetControlUp("Crouch") ||
                     (!Input.GetControl("Crouch") && AllowUserInput) && CharacterController.IsCrouching)
            {
                CharacterController.TryUncrouch(World);
            }

            // Toggle thirdperson, mouse, and flashlight
            if (AllowUserInput)
            {
                if (Input.GetKeyDown(Key.C))
                {
                    IsRenderingThirdperson = !IsRenderingThirdperson;
                }

                if (Input.GetControlDown("ToggleFlashlight"))
                {
                    flashlight.Visible = !flashlight.Visible;
                    flashlightAudioSource?.Play();
                }
            }

            // Handle landing
            if (CharacterController.IsGrounded && !lastGrounded)
            {
                landAudioSource?.Play();
            }

            // Handle walking/running
            walkingAudioSource.IsPlaying       = CharacterController.IsGrounded && CharacterController.IsMoving && !IsSprinting;
            walkingAudioSource.IterationLength = (1f / Viewbob.GetSpeed()) * 2f;
            walkingAudioSource.Update(deltaTime);

            runningAudioSource.IsPlaying       = CharacterController.IsGrounded && CharacterController.IsMoving && IsSprinting;
            runningAudioSource.IterationLength = (1f / Viewbob.GetSpeed()) * 2f;
            runningAudioSource.Update(deltaTime);

            // Ensure the firstperson offset is correct (this changes when crouching)
            camera.FirstPersonLockOffset = new Vector3(0, Size.Y / 2f - 1.1f, 0);

            // Update the flashlight
            flashlight.Position = IsRenderingThirdperson
                ? Transform.Position + Camera.Active.FirstPersonLockOffset
                : camera.Position;
            flashlight.Direction = -camera.LookVector;

            // Store grounded state
            lastGrounded = CharacterController.IsGrounded;

            // Process refresh cooldown
            if (refreshCooldown > 0)
            {
                refreshCooldown -= deltaTime;
            }

            base.Update(deltaTime);

            // Update camera effects
            camfx.Update(deltaTime);

            // Update the viewbob
            Viewbob.Update(deltaTime);

            if (Transform.Position.Y < -200)
            {
                Transform.Position = startLocation;
            }
        }