예제 #1
0
        /*
         *
         * Logic for Scope should only occur when
         */
        public override void ApplyBehavior(ref Vector3 cameraTarget, ref Vector3 lookAtTarget, LivPlayerEntity player, bool isCameraAlreadyPlaced)
        {
            Vector3 averageHandPosition = player.handAverage;
            Vector3 handDirection;

            if (pluginSettings.rightHandDominant)
            {
                handDirection = (player.leftHand.position - player.rightHand.position).normalized;
            }
            else
            {
                handDirection = (player.rightHand.position - player.leftHand.position).normalized;
            }

            // If Hands close enough, and aligned, then do the thing, if not then
            float handDistance               = Vector3.Distance(player.rightHand.position, player.leftHand.position);
            bool  isWithinTwoHandedUse       = handDistance > pluginSettings.cameraGunMinTwoHandedDistance && handDistance < pluginSettings.cameraGunMaxTwoHandedDistance;
            bool  isHeadWithinAimingDistance = Vector3.Distance(averageHandPosition, player.head.position) < pluginSettings.cameraGunHeadDistanceTrigger;
            bool  isAimingTwoHandedForward   = Mathf.Rad2Deg * PluginUtility.GetConeAngle(player.head.position, averageHandPosition + handDirection * 4f, player.head.right) <
                                               pluginSettings.cameraGunHeadAlignAngleTrigger;

            if (!pluginSettings.disableGunCamera && Mathf.Abs(player.headRRadialDelta.x) < pluginSettings.controlMovementThreshold / 2 &&
                isWithinTwoHandedUse && isHeadWithinAimingDistance && isAimingTwoHandedForward)
            {
                ironSightsEnabled = true;
                // Should have a smooth transition between Iron Sights and non iron sights.
                sightsCamera.ApplyBehavior(ref cameraTarget, ref lookAtTarget, player, isCameraAlreadyPlaced);
                blend += (pluginSettings.cameraGunSmoothing / 2) * Time.deltaTime;
            }
            else
            {
                ironSightsEnabled = false;
                cameraTarget      = player.head.TransformPoint(offset);
                lookAtTarget      = player.head.TransformPoint(lookAtOffset);


                blend -= 1 / (pluginSettings.cameraGunSmoothing / 2) * Time.deltaTime;
            }

            blend = Mathf.Clamp(blend, 0, 1.0f);
        }
예제 #2
0
        public void SelectCamera()
        {
            player.CalculateInfo();
            if (timerHelper.controllerTimer >= CONTROLLER_THROTTLE)
            {
                // TODO: Take account movements of hands as well

                /* If user swining alot, an sample from x amount of time could tell if user is swinginig their hands in multiple directions
                 * (indicating meelee) or if they are steady
                 * Or if they have a rapid back and forth motion.
                 *
                 * Current Logic:
                 *
                 * While Aiming Forwards:
                 * If user turns their head to Right,  the direction left of the camera is true.
                 * the Left Angle, the controllers should be reverse of where the user is looking at.
                 * If looking completely down, user is most likely interacting with their inventory so show fps or full body
                 * If Looking up they are about to do something, so
                 */
                bool canSwapCamera = (timerHelper.globalTimer > pluginSettings.cameraSwapTimeLock);

                Vector3 averageHandPosition = player.handAverage;
                Vector3 handDirection;
                if (pluginSettings.rightHandDominant)
                {
                    handDirection = (player.leftHand.position - player.rightHand.position).normalized;
                }
                else
                {
                    handDirection = (player.rightHand.position - player.leftHand.position).normalized;
                }

                Vector3 headForwardPosition      = player.head.TransformPoint(Vector3.up * 0.05f);
                bool    areHandsAboveThreshold   = (headForwardPosition.y) > player.leftHand.position.y || (headForwardPosition.y) > player.rightHand.position.y;
                bool    isAimingTwoHandedForward = Mathf.Rad2Deg *
                                                   PluginUtility.GetConeAngle(player.head.position, averageHandPosition + handDirection * 4f, player.head.right) <
                                                   pluginSettings.cameraGunHeadAlignAngleTrigger * 1.2f;

                // player is looking down sights.
                if (!pluginSettings.disableGunCamera && areHandsAboveThreshold &&
                    Mathf.Abs(player.headRRadialDelta.x) < pluginSettings.controlMovementThreshold &&
                    Mathf.Abs(player.headRRadialDelta.y) < pluginSettings.controlVerticalMovementThreshold &&
                    isAimingTwoHandedForward && (canSwapCamera || pluginSettings.FPSCameraOverride) && !inGunMode)
                {
                    SetCamera(FPSCamera, true);
                    inGunMode = true;
                    SnapCamera(currentCamera);
                    timerHelper.ResetCameraGunTimer();
                    PluginLog.Log("ActionCameraDirector", "In FPS Override (two handed forward)");
                }
                else if (inGunMode && canSwapCamera)
                {
                    if (!(isAimingTwoHandedForward))
                    {
                        SnapCamera(lastCamera, true);
                        SetCamera(lastCamera);
                        PluginLog.Log("ActionCameraDirector", "Returning Back to earlier");
                        // Should actually just snap to the new positions instead, so
                    }
                    timerHelper.ResetCameraGunTimer();
                }
                else if (PluginUtility.AverageCosAngleOfControllers(player.rightHand, player.leftHand, player.headBelowDirection) < 45 &&
                         player.headRRadialDelta.y < -pluginSettings.controlVerticalMovementThreshold &&
                         !pluginSettings.disableFBTCamera && canSwapCamera)
                {
                    PluginLog.Log("ActionCameraDirector", "Pointing Down FullBody");

                    SetCamera(FullBodyActionCamera);
                }
                else if (PluginUtility.AverageCosAngleOfControllers(player.rightHand, player.leftHand, player.headAboveDirection) < 45 &&
                         player.headRRadialDelta.y > pluginSettings.controlVerticalMovementThreshold &&
                         !(pluginSettings.disableTopCamera && pluginSettings.disableFBTCamera) && canSwapCamera)
                {
                    // Hands Are Pointing up-ish, while head is moving up (probably checking on something, wrist, etc.)

                    PluginLog.Log("ActionCameraDirector", "Pointing Up, Moving Head Up: Tactical or FullBody");
                    if (randomizer.Next(0, 100) > 80 && !pluginSettings.disableTopCamera || pluginSettings.disableFBTCamera)
                    {
                        SetCamera(TacticalCamera);
                    }
                    else
                    {
                        SetCamera(FullBodyActionCamera);
                    }
                }
                // Looking Side to Side while pointing forwards. Action is ahead.
                else if ((PluginUtility.AverageCosAngleOfControllers(player.rightHand, player.leftHand, player.headForwardDirection) < 80) &&
                         Mathf.Abs(player.headRRadialDelta.x) > pluginSettings.controlMovementThreshold && canSwapCamera)
                {
                    PluginLog.Log("ActionCameraDirector", "Moving on Side, Shoulder");
                    SetCamera(OverShoulderCamera);
                }

                timerHelper.ResetControllerTimer();
            }
            HandleCameraView();
        }