Heroes_of_Hiis/Assets/Project Files/Scripts/JonasB/PortalTeleporter.cs

202 lines
6.2 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class PortalTeleporter : MonoBehaviour
{
//public Transform player;
[SerializeField] private PortalTeleporter linkedPortal;
[SerializeField] private bool interScenePortal;
[SerializeField] private string sceneName;
private Transform linkedPortalTransform;
private float _portalCooldown = 2.5f;
private bool _travellerIsOverlapping = false;
private bool _portalCanBeUsed;
private bool _enabled;
private float _lastUsed;
private bool _justUsed;
private Transform traveller;
public AudioClip TeleportSound;
// poopy code, can be done much more efficient if this class is rewritten and attached to Portal parent object
private AudioSource audioSource;
private GameObject vfx_gameobject;
private void Start()
{
if (linkedPortal == null && !interScenePortal)
{
DisablePortal();
}
else if (interScenePortal)
{
_portalCanBeUsed = true;
vfx_gameobject = transform.parent.Find("PortalFX").gameObject;
audioSource = transform.parent.GetComponent<AudioSource>();
audioSource.mute = true;
if (_enabled)
{
vfx_gameobject.SetActive(true);
}
else
{
vfx_gameobject.SetActive(false);
}
}
else
{
linkedPortalTransform = linkedPortal.transform;
_portalCanBeUsed = true;
vfx_gameobject = transform.parent.Find("PortalFX").gameObject;
audioSource = transform.parent.GetComponent<AudioSource>();
audioSource.mute = true;
if (_enabled)
{
vfx_gameobject.SetActive(true);
}
else
{
vfx_gameobject.SetActive(false);
}
}
}
void OnTriggerEnter(Collider other)
{
if (interScenePortal)
{
if (other.tag == "Player")
{
SceneManager.LoadScene(sceneName);
}
}
else
{
traveller = other.gameObject.transform;
Debug.Log(_enabled);
if (_portalCanBeUsed && !_justUsed && _enabled)
{
if (other.name.StartsWith("Holster") || other.tag.Contains("Holster"))
{
Debug.Log("holster");
}
else
{
linkedPortal._portalCanBeUsed = false;
_travellerIsOverlapping = true;
if (other.tag == "Throwable")
{
Debug.Log("Portal entered by throwable");
HandleThrowable();
}
else if (other.tag == "Player")
{
Debug.Log("Portal entered by player");
HandlePlayer();
}
}
}
}
}
// Enable/Disable portal if selected item is in a socket.
public void EnablePortal()
{
Debug.Log("enabled");
_enabled = true;
if (!interScenePortal)
{
linkedPortal._enabled = true;
linkedPortal.vfx_gameobject.SetActive(true);
}
vfx_gameobject.SetActive(true);
audioSource.mute = false;
}
public void DisablePortal()
{
Debug.Log("disabled");
_enabled = false;
if (interScenePortal)
{
linkedPortal._enabled = false;
linkedPortal.vfx_gameobject.SetActive(false);
}
vfx_gameobject.SetActive(false);
audioSource.mute = true;
}
private void HandlePlayer()
{
Vector3 portalToTraveller = traveller.position - transform.position;
float dotProduct = Vector3.Dot(transform.up, portalToTraveller);
// If true player is on right side of portal
if (dotProduct < 0f)
{
// teleport player
float rotationDiff = -Quaternion.Angle(transform.rotation, linkedPortalTransform.rotation);
rotationDiff += 180;
traveller.Rotate(Vector3.up, rotationDiff);
Vector3 positionOffset = Quaternion.Euler(0f, rotationDiff, 0f) * portalToTraveller;
// Teleport
traveller.position = linkedPortalTransform.position + positionOffset;
AudioSource.PlayClipAtPoint(TeleportSound, traveller.position, 1);
_travellerIsOverlapping = false;
_portalCanBeUsed = false;
_lastUsed = Time.time;
_justUsed = true;
}
}
private void HandleThrowable()
{
Vector3 portalToTraveller = traveller.position - transform.position;
float dotProduct = Vector3.Dot(transform.up, portalToTraveller);
// If true player is on right side of portal
if (dotProduct < 0f)
{
// teleport player
AudioSource.PlayClipAtPoint(TeleportSound, this.transform.position, 1);
float rotationDiff = -Quaternion.Angle(transform.rotation, linkedPortalTransform.rotation);
rotationDiff += 180;
traveller.Rotate(Vector3.up, rotationDiff);
Vector3 positionOffset = Quaternion.Euler(0f, rotationDiff, 0f) * portalToTraveller;
traveller.position = linkedPortalTransform.position + positionOffset;
_travellerIsOverlapping = false;
_portalCanBeUsed = false;
_lastUsed = Time.time;
_justUsed = true;
}
}
private void OnTriggerExit(Collider other)
{
if (other.tag == "Player" || other.tag == "Throwable")
{
_travellerIsOverlapping = false;
}
}
// Update is called once per frame
void Update()
{
if (_justUsed)
{
if (_lastUsed + _portalCooldown < Time.time)
{
_justUsed = false;
_portalCanBeUsed = true;
if (!interScenePortal)
{
linkedPortal._portalCanBeUsed = true;
}
}
}
}
}