using System.Collections; using BitStrap; using UnityEngine; using uNature.Core.Seekers; public class UnderwaterCamera : MonoBehaviour { [ReadOnly] public bool isTurnedOn; [HideInInspector] public Transform cameraParent; [HideInInspector] public FishingPlayer fishingPlayer; [HideInInspector] public Camera camera; private LayerMask ufpsCameraLayerMask = 0; private LayerMask weaponCameraLayerMask = 0; [Header("Lines")] public float underwaterLineScale = 0.0003f; public MeshRenderer lineUnderwater; public MeshRenderer lineUnderwaterFloat; public MeshRenderer lineUnderwaterLeader; public float lineUnderwaterRotateSpeed = 666f; [ReadOnly] public Quaternion targetLineRotation = Quaternion.identity; [ReadOnly] public Quaternion currentLineRotation = Quaternion.identity; public float lineRotationSpeed = 666f; private float floatRopeRadius = -1f; [HideInInspector] public AudioObject underwaterAudioObject; [ReadOnly] public bool isChanging; [ReadOnly] public bool hasProperHeight; [Header("Camera Properties")] public bool updateLookAt = true; public float updateLookAtThreshold = 10f; public float farClipDistance = 100f; public float farClipDistanceOverWater = 1000f; public float DistanceAway; public float underwaterDistanceMultiplier = 2f; public Vector2 DistanceAwayHook = Vector2.one; [ReadOnly] public float currentDistanceAway; public float DistanceUp; public float currentDistanceUp; public float DistanceUpCollision = 0.5f; public float camPositionParameter = 0.5f; public Vector2 smoothNormal = new Vector2(99f, 10f); public Vector2 smoothCollision = new Vector2(0f, 999f); public Vector2 smoothFight = new Vector2(10f, 999f); public bool maxSmoothInVR = true; [ReadOnly] public float smoothCurrent; [ReadOnly] public Vector2 smoothTarget = Vector2.zero; public float lookAtSpeed = 10f; [Space(10f)] [ReadOnly] public float rotateAround; public float rotateAroundOffset = -35f; [Header("Player to follow")] public Transform target; [Header("Layer(s) to include")] public LayerMask CamOcclusion; public LayerMask collisionLayers; public float overlapSphereRadius = 1f; public Vector2 ignoreCollisionDistance = Vector2.one; [ReadOnly] public Collider[] results = new Collider[0]; [ReadOnly] public SphereCollider sphereCollider; private RaycastHit hit; private float cameraHeight = 55f; private float cameraPan; private float camRotateSpeed = 180f; private Vector3 camPosition; private Vector3 camMask; private Vector3 followMask; private float sunShaftsIntencity = 1.5f; public float vrStartCameraRotation; public float vrCameraWaterLevel = 0.3f; public float vrCameraGroundLevel = 1f; private RaycastHit vrHit = default(RaycastHit); private void Start() { cameraParent = base.transform.parent; camera = GetComponent(); camera.enabled = false; currentDistanceAway = DistanceAway; sphereCollider = GetComponent(); underwaterAudioObject = AudioController.Play("Ambient_Underwater_01"); if ((bool)underwaterAudioObject) { underwaterAudioObject.Pause(); } currentDistanceUp = DistanceUp; GetComponent().enabled = false; base.gameObject.SetActive(false); } private void Update() { if (isTurnedOn) { if (fishingPlayer.currentHands.bait == null || fishingPlayer.currentHands.bait.ropeRigidbody == null) { Debug.LogError("no bait or bait.rigidbody"); } if (!fishingPlayer.fish && ((!fishingPlayer.gameController.iceLevel && target.position.y > ((!VRManager.IsVROn()) ? 0.3f : 0.1f)) || (fishingPlayer.gameController.iceLevel && !HasProperHeight()))) { StartCoroutine(TurnOn(false, true)); fishingPlayer.gameController.hudManager.UpdateControls(); } if (fishingPlayer.IsFishOnCurrentRod() && (!fishingPlayer.currentHands.fishingFloat || fishingPlayer.fish.isJerked)) { target = fishingPlayer.fish.transform; } else { target = fishingPlayer.currentHands.bait.transform; } if (cameraParent.position.y < -0.05f) { camera.farClipPlane = farClipDistance; } else { camera.farClipPlane = farClipDistanceOverWater; } } } private void LateUpdate() { if (!isTurnedOn || lineUnderwater == null) { return; } if (!fishingPlayer.IsFishOnCurrentRod()) { if ((bool)fishingPlayer.junk) { currentDistanceAway = fishingPlayer.junk.weight * 0.2f; } else if (!fishingPlayer.fish) { currentDistanceAway = Mathf.Lerp(DistanceAwayHook.x, DistanceAwayHook.y, (float)fishingPlayer.currentHands.bait.hookSize / 16f); if (fishingPlayer.currentHands.isGroundRig) { currentDistanceAway *= 2f; } } else { currentDistanceAway = DistanceAway; } } if (VRManager.IsVROn() && !fishingPlayer.IsFishOnCurrentRod()) { currentDistanceAway *= underwaterDistanceMultiplier; } Vector3 a = target.position - fishingPlayer.transform.position; a.y = 0f; float num = PosNegAngle(a, Vector3.forward, Vector3.up); num = ((!(num < 0f)) ? (360f - num) : (0f - num)); num += rotateAroundOffset; rotateAround = num; Vector3 targetFollow = new Vector3(target.position.x, target.position.y, target.position.z); Quaternion quaternion = Quaternion.Euler(cameraHeight, rotateAround, cameraPan); Vector3 one = Vector3.one; Vector3 vector = quaternion * one; currentDistanceUp = Mathf.MoveTowards(currentDistanceUp, DistanceUp, Time.deltaTime * ((!fishingPlayer.IsFishOnCurrentRod() || fishingPlayer.fish.isTryingBait) ? 0.05f : 1f)); camPosition = targetFollow + Vector3.up * currentDistanceUp - vector * currentDistanceAway; camMask = targetFollow + Vector3.up * DistanceUpCollision - vector * currentDistanceAway; int num2 = Physics.OverlapSphereNonAlloc(target.position, overlapSphereRadius, results, collisionLayers); Collider[] array = Physics.OverlapSphere(target.position, overlapSphereRadius, collisionLayers); if (fishingPlayer.IsFishOnCurrentRod() && (!fishingPlayer.currentHands.isGroundRig || fishingPlayer.fish.isJerked)) { sphereCollider.enabled = false; DistanceUp = 0f; smoothTarget = smoothFight; } else if (array.Length > 0 && Vector3.Distance(cameraParent.position, target.position) < ignoreCollisionDistance.x) { sphereCollider.enabled = true; DistanceUp = ((!fishingPlayer.currentHands.fishingFloat) ? 0.25f : 0.2f); smoothTarget = smoothCollision; } else { sphereCollider.enabled = true; DistanceUp = ((!fishingPlayer.currentHands.fishingFloat) ? 0.25f : 0.2f); smoothTarget = smoothNormal; occludeRay(ref targetFollow); } if (VRManager.IsVROn()) { sphereCollider.enabled = false; } smoothCamMethod(); Vector3 vectorAngles180Range = Utilities.GetVectorAngles180Range(cameraParent.localEulerAngles); if (updateLookAt) { cameraParent.LookAt(target); } Vector3 vector2 = Utilities.GetVectorAngles180Range(cameraParent.localEulerAngles); if (VRManager.IsVROn()) { vector2 = new Vector3(vector2.x, vector2.y - vrStartCameraRotation, vector2.z); } float num3 = Vector3.Distance(vectorAngles180Range, vector2); if (num3 > 180f || num3 < -180f) { if (vector2.y >= 0f) { vector2.y -= 360f; } else if (vector2.y <= 0f) { vector2.y += 360f; } num3 = Vector3.Distance(vectorAngles180Range, vector2); Utilities.LogError(string.Concat(string.Empty, num3, " oldRotation: ", vectorAngles180Range, " newRotation: ", vector2), "cyan"); } if (num3 > updateLookAtThreshold) { cameraParent.localEulerAngles = Vector3.MoveTowards(vectorAngles180Range, vector2, num3 * lookAtSpeed * Time.deltaTime); } else { cameraParent.localEulerAngles = vectorAngles180Range; } if (VRManager.IsVROn()) { cameraParent.localEulerAngles = new Vector3(0f, cameraParent.localEulerAngles.y, 0f); } currentLineRotation = lineUnderwater.transform.parent.rotation; if (!GameController.Instance.iceLevel) { lineUnderwater.transform.parent.LookAt(fishingPlayer.currentHands.fishingRod.ropeStartPosition); } else { lineUnderwater.transform.parent.LookAt(fishingPlayer.currentHands.fakeLineIceTarget.transform); } if (lineRotationSpeed > -1f) { targetLineRotation = lineUnderwater.transform.parent.rotation; lineUnderwater.transform.parent.rotation = Quaternion.RotateTowards(currentLineRotation, targetLineRotation, lineRotationSpeed); } lineUnderwaterLeader.enabled = fishingPlayer.currentHands.isFlyRig; if (fishingPlayer.currentHands.isFlyRig) { lineUnderwaterLeader.transform.localScale = new Vector3(lineUnderwaterLeader.transform.localScale.x, fishingPlayer.currentHands.fishingRod.GetThrowObjectDistance() - fishingPlayer.currentHands.lineLeaderLength, lineUnderwaterLeader.transform.localScale.z); } lineUnderwater.transform.localScale = new Vector3(lineUnderwater.transform.localScale.x, fishingPlayer.currentHands.fishingRod.GetThrowObjectDistance(), lineUnderwater.transform.localScale.z); if ((bool)fishingPlayer.currentHands.fishingFloat) { lineUnderwaterFloat.transform.parent.LookAt(fishingPlayer.currentHands.fishingFloat.ropeBaitRigidbody.transform); lineUnderwaterFloat.transform.localScale = new Vector3(lineUnderwaterFloat.transform.localScale.x, Vector3.Distance(lineUnderwaterFloat.transform.position, fishingPlayer.currentHands.fishingFloat.ropeBaitRigidbody.transform.position), lineUnderwaterFloat.transform.localScale.z); } } public IEnumerator TurnOn(bool turnOn, bool fromReset = false) { if (isTurnedOn == turnOn || isChanging) { yield break; } isChanging = true; if (!VRManager.IsVROn()) { fishingPlayer.gameController.hudManager.FadeDark(1f, (!fromReset) ? 0.1f : 0f); yield return new WaitForSeconds((!fromReset) ? 0.1f : 0.1f); } isTurnedOn = turnOn; if (turnOn) { camera.enabled = false; base.gameObject.SetActive(true); } HUDManager.Instance.UpdateControls(); if (turnOn) { Utilities.SetLayerRecursively(base.gameObject, LayerMask.NameToLayer("Default")); base.gameObject.layer = LayerMask.NameToLayer("Float"); target = fishingPlayer.currentHands.bait.transform; cameraParent.position = target.position; cameraParent.LookAt(target); smoothTarget = smoothNormal; smoothCurrent = smoothTarget.x; ufpsCameraLayerMask = fishingPlayer.ufpsCamera.GetComponent().cullingMask; weaponCameraLayerMask = fishingPlayer.ufpsWeaponCamera.GetComponent().cullingMask; camera.cullingMask = ufpsCameraLayerMask; if (VRManager.IsVROn()) { camera.cullingMask = Utilities.RemoveFromLayerMask(camera.cullingMask, "Weapon"); vrStartCameraRotation = fishingPlayer.ufpsCamera.transform.localEulerAngles.y; if (vrStartCameraRotation > 180f) { vrStartCameraRotation -= 360f; } else if (vrStartCameraRotation < -180f) { vrStartCameraRotation += 360f; } } fishingPlayer.ufpsCamera.GetComponent().cullingMask = 0; fishingPlayer.ufpsWeaponCamera.GetComponent().cullingMask = 0; fishingPlayer.ufpsCamera.GetComponent().clearFlags = CameraClearFlags.Depth; fishingPlayer.depthOfField.enabled = false; fishingPlayer.beautify.enabled = false; MeshRenderer meshRenderer = lineUnderwater; Material lineMaterialOpaque = fishingPlayer.currentHands.fishingLine.lineMaterialOpaque; lineUnderwaterFloat.material = lineMaterialOpaque; meshRenderer.material = lineMaterialOpaque; lineUnderwater.transform.localScale = new Vector3(underwaterLineScale, 1f, underwaterLineScale); if (fishingPlayer.currentHands.isFlyRig) { lineUnderwater.transform.localScale *= 9f; } lineUnderwaterFloat.transform.localScale = new Vector3(underwaterLineScale * 0.9f, 1f, underwaterLineScale * 0.9f); lineUnderwaterLeader.transform.localScale = new Vector3(underwaterLineScale, 1f, underwaterLineScale); if ((bool)fishingPlayer.currentHands.fishingFloat) { lineUnderwater.transform.parent.parent = fishingPlayer.currentHands.fishingFloat.ropeBaitRigidbody.transform; } else { lineUnderwater.transform.parent.parent = target; } lineUnderwaterFloat.transform.parent.parent = target; lineUnderwaterFloat.gameObject.SetActive(fishingPlayer.currentHands.fishingFloat); lineUnderwater.transform.parent.localPosition = Vector3.zero; lineUnderwaterFloat.transform.parent.localPosition = Vector3.zero; if (fishingPlayer.currentHands.isFlyRig) { lineUnderwater.transform.localPosition = lineUnderwaterLeader.transform.localPosition + Vector3.forward * fishingPlayer.currentHands.lineLeaderLength; } else { lineUnderwater.transform.localPosition = Vector3.zero; } if ((bool)underwaterAudioObject) { underwaterAudioObject.Unpause(0.3f); } if ((bool)fishingPlayer.currentHands.fishingFloat) { } if ((bool)fishingPlayer.sunShafts) { sunShaftsIntencity = fishingPlayer.sunShafts.sunShaftIntensity; fishingPlayer.sunShafts.sunShaftIntensity = 0f; } } else { fishingPlayer.ufpsCamera.GetComponent().cullingMask = ufpsCameraLayerMask.value; fishingPlayer.ufpsWeaponCamera.GetComponent().cullingMask = weaponCameraLayerMask.value; camera.cullingMask = 0; fishingPlayer.ufpsCamera.GetComponent().clearFlags = CameraClearFlags.Skybox; if (!VRManager.IsVROn()) { fishingPlayer.depthOfField.enabled = true; fishingPlayer.beautify.enabled = true; } lineUnderwater.transform.parent.parent = base.transform; lineUnderwaterFloat.transform.parent.parent = base.transform; if ((bool)underwaterAudioObject) { underwaterAudioObject.Pause(0.3f); } if ((bool)fishingPlayer.currentHands.fishingFloat) { } if ((bool)fishingPlayer.sunShafts) { fishingPlayer.sunShafts.sunShaftIntensity = sunShaftsIntencity; } } GameController.Instance.ShowIceBottom(turnOn); fishingPlayer.maskCamera.transform.parent = ((!turnOn) ? fishingPlayer.ufpsCamera.transform : base.transform); fishingPlayer.maskCamera.transform.localPosition = Vector3.zero; fishingPlayer.maskCamera.transform.localEulerAngles = Vector3.zero; fishingPlayer.maskCamera.ChangeCamera((!turnOn) ? fishingPlayer.ufpsCamera.GetComponent() : camera); if (GameController.Instance.iceLevel) { fishingPlayer.currentHands.currentRope.gameObject.layer = LayerMask.NameToLayer((!turnOn) ? "Default" : "Weapon"); fishingPlayer.currentHands.fakeIceLine.gameObject.layer = LayerMask.NameToLayer((!turnOn) ? "Default" : "Weapon"); } GameController.Instance.CheckBehaviorDistanceQuick(); fishingPlayer.currentHands.UpdateFloatWeightPosition(turnOn); if ((bool)fishingPlayer.currentHands.feeder) { fishingPlayer.currentHands.feeder.UpdateFeederPosition(turnOn); } sphereCollider.enabled = true; if (!VRManager.IsVROn()) { yield return new WaitForSeconds(0.3f); } fishingPlayer.GetComponent().enabled = !turnOn; GetComponent().enabled = turnOn; if (!GameController.Instance.iceLevel) { } fishingPlayer.baitIndicatorCamera.transform.parent = ((!turnOn) ? fishingPlayer.ufpsCamera.transform : fishingPlayer.underwaterCamera.transform); fishingPlayer.baitIndicatorCamera.transform.localPosition = Vector3.zero; fishingPlayer.baitIndicatorCamera.transform.localEulerAngles = Vector3.zero; fishingPlayer.baitIndicator.underwaterBackground.enabled = turnOn; fishingPlayer.ufpsCamera.GetComponent().enabled = !turnOn; camera.enabled = turnOn; if (fishingPlayer.unSeeker.enabled) { fishingPlayer.unSeeker.isGrassReceiver = !turnOn; } if (camera.GetComponent().enabled) { camera.GetComponent().isGrassReceiver = turnOn; } fishingPlayer.currentWaterDropPro = ((!turnOn) ? fishingPlayer.waterDropPro : fishingPlayer.waterDropProUnderwater); fishingPlayer.waterDropProUnderwater.enabled = false; fishingPlayer.RefreshInputSettings(); fishingPlayer.rain.gameObject.layer = LayerMask.NameToLayer((!turnOn) ? "Weapon" : "TransparentFX"); fishingPlayer.snow.gameObject.layer = LayerMask.NameToLayer((!turnOn) ? "Default" : "TransparentFX"); AudioController.SetCategoryVolume("Overwater", (!turnOn) ? 1f : 0f); AudioController.SetCategoryVolume("Underwater", (!turnOn) ? 0f : 1f); GameController.Instance.waterParameters.SetReflectionColor(turnOn); GameController.Instance.waterParameters.SetCausticIntensity(turnOn); GameController.Instance.UpdateTerrainTile(); if (VRManager.IsVROn() && (bool)GlobalSettings.Instance) { GlobalSettings.Instance.renderSettings.RefreshAntialiasing(); } if (turnOn) { cameraParent.LookAt(target); } if (!VRManager.IsVROn()) { fishingPlayer.gameController.hudManager.FadeDark(0f, 0.1f); yield return new WaitForSeconds(0.1f); } fishingPlayer.waterSimulationSpace.transform.parent = ((!turnOn) ? fishingPlayer.transform : base.transform); fishingPlayer.waterSimulationSpace.transform.localPosition = Vector3.zero; fishingPlayer.waterSimulationSpace.transform.localScale = ((!turnOn) ? new Vector3(4f, 1f, 4f) : new Vector3(1f, 1f, 1f)); fishingPlayer.waterSimulationSpace.Refresh(); isChanging = false; cameraParent.parent = ((!turnOn) ? fishingPlayer.transform : GameController.Instance.transform); GameController.Instance.weatherLevelManager.UpdateWaterProfiles(); if (!turnOn) { base.gameObject.SetActive(false); } } public void SetDistanceAway(float distance, float duration) { Debug.Log("UnderwaterCamera SetDistanceAway: " + distance); if (!base.gameObject.activeSelf || duration == 0f) { currentDistanceAway = distance; if (VRManager.IsVROn()) { currentDistanceAway *= underwaterDistanceMultiplier; } return; } LeanTween.value(currentDistanceAway, distance, duration).setEaseInOutQuad().setOnUpdate(delegate(float val) { currentDistanceAway = val; if (VRManager.IsVROn()) { currentDistanceAway *= underwaterDistanceMultiplier; } }); } public bool HasProperHeight() { return hasProperHeight; } public void UpdateProperHeight() { if (!fishingPlayer || !fishingPlayer.currentHands) { hasProperHeight = false; return; } bool flag = false; flag = ((!fishingPlayer.gameController.iceLevel) ? (fishingPlayer.currentHands.bait.transform.position.y < 0.1f) : (!(fishingPlayer.drillingController.currentHole == null) && fishingPlayer.currentHands.bait.transform.position.y < ((!VRManager.IsVROn()) ? (-0.2f) : (-0.8f)))); if (flag != hasProperHeight) { hasProperHeight = flag; fishingPlayer.gameController.hudManager.UpdateControls(); } } private void smoothCamMethod() { float num = ((!GameController.Instance.iceLevel) ? (-0.2f) : (GameController.Instance.iceBottom.transform.position.y - 0.1f)); if (fishingPlayer.IsFishOnCurrentRod() && !GameController.Instance.iceLevel) { num = -0.4f; } if (camPosition.y > num && (!fishingPlayer.currentHands.fishingFloat || (fishingPlayer.IsFishOnCurrentRod() && fishingPlayer.fish.isJerked))) { DistanceUp = ((!fishingPlayer.fish || fishingPlayer.fish.isTryingBait) ? 0.35f : 0.65f); } smoothCurrent = Mathf.MoveTowards(smoothCurrent, smoothTarget.x, Time.deltaTime * smoothTarget.y); cameraParent.position = Vector3.Lerp(cameraParent.position, camPosition, Time.deltaTime * smoothCurrent); if (maxSmoothInVR && VRManager.IsVROn()) { cameraParent.position = camPosition; } if (GameController.Instance.iceLevel && cameraParent.position.y > GameController.Instance.iceBottom.transform.position.y - sphereCollider.radius) { cameraParent.position = new Vector3(cameraParent.position.x, GameController.Instance.iceBottom.transform.position.y - sphereCollider.radius, cameraParent.position.z); } else if ((bool)fishingPlayer.fish && fishingPlayer.fish.isJumping && cameraParent.position.y > 0f) { cameraParent.position = new Vector3(cameraParent.position.x, 0f, cameraParent.position.z); } else if (!GameController.Instance.iceLevel && !(cameraParent.position.y > -0.2f)) { } if (VRManager.IsVROn()) { float value = target.position.y - camera.transform.localPosition.y; if (target.position.y > 0f - vrCameraWaterLevel) { value = 0f - target.position.y - vrCameraWaterLevel - camera.transform.localPosition.y; } else if (Physics.Raycast(new Vector3(camera.transform.position.x, 0f, camera.transform.position.z), -Vector3.up, out vrHit, 100f, LayerMask.GetMask("Terrain", "Default")) && target.position.y - vrHit.point.y < vrCameraGroundLevel) { value = vrHit.point.y + vrCameraGroundLevel - camera.transform.localPosition.y; } value = Mathf.Clamp(value, -9999f, 0f - vrCameraWaterLevel - camera.transform.localPosition.y); cameraParent.position = new Vector3(cameraParent.position.x, value, cameraParent.position.z); } else { camera.transform.localPosition = Vector3.zero; camera.transform.localEulerAngles = Vector3.zero; } } private void occludeRay(ref Vector3 targetFollow) { RaycastHit hitInfo = default(RaycastHit); if (Physics.Linecast(targetFollow, camMask, out hitInfo, CamOcclusion)) { camPosition = new Vector3(hitInfo.point.x + hitInfo.normal.x * camPositionParameter, hitInfo.point.y + hitInfo.normal.y * camPositionParameter, hitInfo.point.z + hitInfo.normal.z * camPositionParameter); } } public static float PosNegAngle(Vector3 a1, Vector3 a2, Vector3 normal) { float num = Vector3.Angle(a1, a2); float num2 = Mathf.Sign(Vector3.Dot(normal, Vector3.Cross(a1, a2))); return num * num2; } }