576 lines
14 KiB
C#

using System;
using UnityEngine;
[Serializable]
public class CameraVehicle : MonoBehaviour
{
public GUILayer guiLayer;
public Transform arrow;
public Vector3 lastDir;
public float lastY;
public float sensitivityX;
public float sensitivityY;
public float rotationX;
public float rotationY;
public float heightBoost;
public float targetHeight;
public Quaternion gyroTation;
public Quaternion wr;
// /*unused*/ private bool underwater;
public RaycastHit hit;
public MotionBlur mb;
public GlowEffect glowEffect;
public ColorCorrectionEffect colorEffect;
public float worldTime;
public GameObject camTarget;
public Vehicle camTargetVeh;
public CameraVehicle()
{
lastDir = new Vector3(1f, 1f, 1f);
sensitivityX = 15f;
sensitivityY = 15f;
rotationX = 10f;
rotationY = 10f;
//underwater = false;
worldTime = 0f;
}
public void Start()
{
Time.timeScale = 1f;
Quaternion trot = transform.rotation;
Vector3 ea = trot.eulerAngles;
ea.x = 270.01f;
trot.eulerAngles = ea;
transform.rotation = trot;
}
public void LateUpdate()
{
if (
!Game.Player ||
!Game.PlayerVeh ||
!Game.PlayerVeh.ridePos
)
{
return;
}
//QuarryCam
camTarget = Game.Player;
camTargetVeh = Game.PlayerVeh;
if (
Game.Settings.quarryCam &&
(bool)Game.QuarryVeh &&
(bool)Game.QuarryVeh.ridePos)
{
camTarget = Game.QuarryVeh.gameObject;
camTargetVeh = Game.QuarryVeh;
}
//Blur
if (mb.enabled)
{
mb.blurAmount -= Time.deltaTime * 0.13f;
if (mb.blurAmount < 0f)
{
mb.enabled = false;
}
}
//Audio
if (Game.Settings.useHypersound == 1)
{
Game.Settings.gameMusic.pitch = Mathf.Clamp(
-0.5f + camTarget.rigidbody.velocity.magnitude / 15f,
0.8f,
1.5f
);
}
//Cursor Locking
if (
Game.Settings.camMode == 0 ||
Input.GetButton("Fire2") ||
(Input.GetButton("Snipe") && !Game.Messaging.chatting)
)
{
Screen.lockCursor = true;
}
else
{
Screen.lockCursor = false;
}
//Snipe Zooming
if (Input.GetButton("Snipe") && !Game.Messaging.chatting)
{
if (Camera.main.fieldOfView == 60f)
{
Camera.main.fieldOfView = 10f;
}
Camera.main.fieldOfView = Camera.main.fieldOfView + Input.GetAxis("Mouse ScrollWheel") * -1f;
if (Camera.main.fieldOfView > 50f)
{
Camera.main.fieldOfView = 50f;
}
else if (Camera.main.fieldOfView < 1.5f)
{
Camera.main.fieldOfView = 1.5f;
}
}
else if (Camera.main.fieldOfView != 60f)
{
Camera.main.fieldOfView = 60f;
}
//Green Arrow
Vector3 targetPos = transform.InverseTransformPoint(camera.ScreenToWorldPoint(new Vector3(
camera.pixelWidth - 30f - 65f,
30f,
camera.nearClipPlane + 0.05f
)));
if (Vector3.Distance(targetPos, arrow.localPosition) < 0.002f)
{
arrow.localPosition = Vector3.Lerp(
arrow.localPosition,
targetPos,
Time.deltaTime * 0.005f
);
}
else
{
arrow.localPosition = targetPos;
}
arrow.rotation = Quaternion.Lerp(
arrow.rotation,
Quaternion.LookRotation(
((camTargetVeh.isIt != 0 || !Game.QuarryVeh) ?
World.baseTF :
Game.QuarryVeh.gameObject.transform
).position - camTarget.transform.position
),
Time.deltaTime * 15f
);
arrow.localScale = Vector3.one * Mathf.Lerp(
0.03f,
1f,
Camera.main.fieldOfView / 60f
);
//HotKeys
if (Input.GetKeyDown(KeyCode.Escape) && Game.Settings.camMode == 0)
{ // Unlock Cursor
Game.Settings.camMode = 1;
PlayerPrefs.SetInt("cam", 1);
}
if (!Game.Messaging.chatting)
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
Game.Settings.camMode = 0;
PlayerPrefs.SetInt("cam", 0);
}
else if (Input.GetKeyDown(KeyCode.Alpha2))
{
Game.Settings.camMode = 1;
PlayerPrefs.SetInt("cam", 1);
}
else if (Input.GetKeyDown(KeyCode.Alpha3))
{
Game.Settings.camDist = 0f;
PlayerPrefs.SetFloat("camDist", 0f);
}
else if (Input.GetKeyDown(KeyCode.Alpha4))
{
Game.Settings.camDist = 20f;
PlayerPrefs.SetFloat("camDist", 20f);
}
else if (Input.GetKeyDown(KeyCode.Alpha5))
{
Game.Settings.camMode = 2;
PlayerPrefs.SetInt("cam", 2);
}
else if (Input.GetKeyDown(KeyCode.Alpha6))
{
Game.Settings.camMode = 3;
PlayerPrefs.SetInt("cam", 3);
}
else if (Input.GetKeyDown(KeyCode.Alpha7))
{
Game.Settings.gyroCam = (Game.Settings.gyroCam ? false : true);
PlayerPrefs.SetInt("gyroCam", (Game.Settings.gyroCam ? 1 : 0));
}
}
//Constants
float camDist = (float)camTargetVeh.camOffset + Game.Settings.camDist;
//World Entry Effect
if (worldTime < 7f)
{
worldTime = Time.time - Game.Controller.worldLoadTime;
transform.position = Vector3.Lerp(
transform.position,
camTarget.transform.position,
Time.deltaTime * 1f
);
wr = Quaternion.LookRotation(
camTarget.transform.position - transform.position,
Vector3.up
);
if (worldTime > 1f)
{
transform.rotation = Quaternion.Slerp(
transform.rotation,
wr,
Time.deltaTime * 0.5f * Mathf.Min(1f, (worldTime - 1f) * 0.5f)
);
}
}
//Ride
else if (
Game.Settings.camMode == 0 ||
Input.GetButton("Fire2") ||
(Input.GetButton("Snipe") && !Game.Messaging.chatting)
)
{
transform.position = camTargetVeh.ridePos.position;
if (Input.GetButtonDown("Fire2") || Input.GetKeyDown(KeyCode.Alpha1))
{
rotationX = 0f;
rotationY = 0f;
if (Game.Settings.gyroCam)
{
gyroTation = Quaternion.Euler(
0f,
camTargetVeh.ridePos.rotation.eulerAngles.y,
0f
);
}
}
if (Game.Settings.gyroCam)
{
transform.rotation = gyroTation;
}
else
{
transform.rotation = camTargetVeh.ridePos.rotation;
}
rotationX += Input.GetAxis("Mouse X") * (Input.GetButton("Snipe") ? 0.5f : 2f);
rotationY += Input.GetAxis("Mouse Y") * (Input.GetButton("Snipe") ? 0.5f : 2f);
if (rotationX < -360f)
{
rotationX += 360f;
}
else if (rotationX > 360f)
{
rotationX -= 360f;
}
if (rotationY < -360f)
{
rotationY += 360f;
}
else if (rotationY > 360f)
{
rotationY -= 360f;
}
rotationX = Mathf.Clamp(rotationX, -360f, 360f);
if (Game.Settings.gyroCam)
{
rotationY = Mathf.Clamp(rotationY, -100f, 100f);
}
else
{
rotationY = Mathf.Clamp(rotationY, -20f, 100f);
}
transform.localRotation *= Quaternion.AngleAxis(rotationX, Vector3.up);
transform.localRotation *= Quaternion.AngleAxis(rotationY, Vector3.left);
}
//Chase
else if (Game.Settings.camMode == 1)
{
//Smooth
if (Game.Settings.camChase == 0)
{
transform.position = Vector3.Lerp(
transform.position,
camTarget.transform.position - Vector3.Normalize(
camTarget.transform.position - transform.position
) * camDist + Vector3.one * (camTargetVeh.camSmooth ?
0f :
Mathf.Lerp(0f, 15f, camDist / 30f)
),
Time.deltaTime * 3.5f
);
transform.rotation = Quaternion.Slerp(
transform.rotation,
Quaternion.LookRotation(
camTarget.transform.position - transform.position,
(Game.Settings.flightCam ?
camTarget.transform.up :
Vector3.up
)
),
Time.deltaTime * 4f
);
if (Physics.Linecast(
transform.position + Vector3.up * 50f,
transform.position + Vector3.down * 1f, out hit,
1 << 8
) &&
hit.collider.GetType() != typeof(TerrainCollider)
)
{
Vector3 tpos = transform.position;
float y = tpos.y + 51 - hit.distance;
tpos.y = y;
transform.position = tpos;
}
}
//Agile
else if (Game.Settings.camChase == 1)
{
if (
(bool)camTarget.transform.gameObject.rigidbody &&
camTarget.transform.gameObject.rigidbody.velocity.sqrMagnitude > 0.1f &&
camTarget.transform.gameObject.rigidbody.velocity.normalized.y < 0.8f &&
camTarget.transform.gameObject.rigidbody.velocity.normalized.y > -0.8f
)
{
lastDir = Vector3.Lerp(
lastDir,
camTarget.transform.gameObject.rigidbody.velocity.normalized,
0.1f
);
}
else
{
Vector3.Lerp(
lastDir,
new Vector3(lastDir.x, 0f, lastDir.z),
0.1f
);
}
Vector3 newPos = (
camTarget.transform.position +
lastDir * -(camDist) +
Vector3.up * (camDist / 3f)
);
Vector3 tpos = transform.position;
float y = tpos.y + (camTarget.transform.position.y - lastY) * Time.deltaTime;
tpos.y = y;
transform.position = tpos;
transform.position = Vector3.Lerp(
transform.position,
newPos,
Time.deltaTime * 4f
);
lastY = camTarget.transform.position.y;
transform.rotation = Quaternion.Slerp(
transform.rotation,
Quaternion.LookRotation(
camTarget.transform.position - transform.position,
(Game.Settings.flightCam ?
camTarget.transform.up :
Vector3.up
)
),
Time.deltaTime * 4f
);
if (
Physics.Linecast(
transform.position + Vector3.up * 50f,
transform.position + Vector3.down,
out hit,
1 << 8
) &&
hit.collider.GetType() != typeof(TerrainCollider)
)
{
Vector3 trapos = transform.position;
float vecy = trapos.y + 51 - hit.distance;
trapos.y = vecy;
transform.position = trapos;
}
}
//Arcade
else if (
Game.Settings.camChase == 2 &&
camTarget.transform.rigidbody.velocity.magnitude > 0f
)
{
float heightDamping = 3f;
float rotationDamping = 3f;
float wantedRotationAngle = Quaternion.LookRotation(
camTarget.transform.rigidbody.velocity
).eulerAngles.y;
wantedRotationAngle += Mathf.Lerp(
30f,
10f,
camDist / 30f
) * Input.GetAxis("Horizontal");
float wantedHeight = (
camTarget.transform.position.y +
Mathf.Lerp(0.1f, 15f, camDist / 30f) +
heightBoost
);
targetHeight = Mathf.Lerp(0.5f, 3f, camDist / 30f);
float currentRotationAngle = transform.eulerAngles.y;
float currentHeight = transform.position.y;
currentRotationAngle = Mathf.LerpAngle(
currentRotationAngle,
wantedRotationAngle,
rotationDamping * Time.deltaTime
);
currentHeight = Mathf.Lerp(
currentHeight,
wantedHeight,
heightDamping * Time.deltaTime
);
Quaternion currentRotation = Quaternion.Euler(
0f,
currentRotationAngle,
0f
);
Vector3 pos = camTarget.transform.position;
pos.y += targetHeight; //Look ABOVE the target
transform.position = pos;
transform.position -= currentRotation * Vector3.forward * camDist;
Vector3 tpos = transform.position;
tpos.y = currentHeight;
transform.position = tpos;
//Terrain Avoidance
RaycastHit hit = default(RaycastHit);
if (
Physics.Raycast(
transform.position + Vector3.up * 49.4f,
Vector3.down,
out hit,
50f,
1 << 8
) &&
hit.collider.GetType() != typeof(TerrainCollider)
)
{ //We are under terrain
Physics.Linecast( //Determine how far forward we need to go to be out of it
transform.position,
camTarget.transform.position + Vector3.up * currentHeight,
out hit,
1 << 8
);
transform.position += currentRotation * Vector3.forward * hit.distance;
heightBoost = hit.distance * 0.7f;
}
else
{
heightBoost = 0f;
}
transform.LookAt(pos);
}
}
//Soar
else if (Game.Settings.camMode == 2)
{
transform.position = Vector3.Lerp(
transform.position,
camTarget.transform.position + Vector3.up * 40f,
Time.deltaTime * 0.3f
);
wr = Quaternion.LookRotation(
camTarget.transform.position - transform.position,
Vector3.up
);
transform.rotation = Quaternion.Slerp(
transform.rotation,
wr,
Time.deltaTime * 2f
);
}
//Spectate
else if (Game.Settings.camMode == 3)
{
transform.rotation = Quaternion.Slerp(
transform.rotation,
Quaternion.LookRotation(camTarget.transform.position - transform.position),
Time.deltaTime * 1.5f
);
transform.Translate(new Vector3(
Input.GetAxis("camX") * Time.deltaTime * 50f,
Input.GetAxis("camY") * Time.deltaTime * 40f,
Input.GetAxis("camZ") * Time.deltaTime * 50f
));
}
//Roam
else if (Game.Settings.camMode == 4)
{
Vector3 tpos = transform.position;
tpos.x += Input.GetAxis("camX") * Time.deltaTime * 50;
tpos.y += Input.GetAxis("camY") * Time.deltaTime * 50;
tpos.z += Input.GetAxis("camZ") * Time.deltaTime * 50;
transform.position = tpos;
rotationX += Input.GetAxis("Mouse X") * sensitivityX;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
transform.localRotation = Quaternion.AngleAxis(rotationX, Vector3.up);
transform.localRotation *= Quaternion.AngleAxis(rotationY, Vector3.left);
}
}
public void OnPreRender()
{
if (Game.Settings.fogColor == Color.clear)
{
//Game has just initialized - don't start adding effects yet...
return;
}
if (
transform.position.y < Game.Settings.lavaAlt ||
Physics.Raycast(
transform.position + Vector3.up * 200f,
Vector3.up * -1f,
200f,
1 << 4
)
)
{
RenderSettings.fogColor = World.seaFogColor;
RenderSettings.fogDensity = Game.Settings.lavaFog;
glowEffect.enabled = Game.Settings.renderLevel > 2;
glowEffect.glowTint = World.seaGlowColor;
Camera.main.clearFlags = CameraClearFlags.SolidColor;
}
else
{
RenderSettings.fogColor = Game.Settings.fogColor;
RenderSettings.fogDensity = Game.Settings.worldFog;
glowEffect.enabled = false;
Camera.main.clearFlags = ((Camera.main.farClipPlane > 2000f) ?
CameraClearFlags.Skybox :
CameraClearFlags.SolidColor
);
}
colorEffect.enabled = glowEffect.enabled;
Camera.main.backgroundColor = RenderSettings.fogColor;
}
}