158 lines
4.9 KiB
C#
158 lines
4.9 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class PortalTeleporter : MonoBehaviour
|
|
{
|
|
//public Transform player;
|
|
[SerializeField] private PortalTeleporter linkedPortal;
|
|
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()
|
|
{
|
|
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)
|
|
{
|
|
traveller = other.gameObject.transform;
|
|
Debug.Log(_enabled);
|
|
if (_portalCanBeUsed && !_justUsed && _enabled)
|
|
{
|
|
if (other.name.StartsWith("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;
|
|
linkedPortal._enabled = true;
|
|
vfx_gameobject.SetActive(true);
|
|
linkedPortal.vfx_gameobject.SetActive(true);
|
|
audioSource.mute = false;
|
|
}
|
|
|
|
public void DisablePortal()
|
|
{
|
|
Debug.Log("disabled");
|
|
_enabled = false;
|
|
linkedPortal._enabled = false;
|
|
vfx_gameobject.SetActive(false);
|
|
linkedPortal.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;
|
|
linkedPortal._portalCanBeUsed = true;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|