- Markers now become entirely vertical when dropped by non-VR players. - Created more music loops.
185 lines
4.0 KiB
C#
185 lines
4.0 KiB
C#
|
|
using UdonSharp;
|
|
using UnityEngine;
|
|
using VRC.SDK3.Components;
|
|
using VRC.SDK3.Data;
|
|
using VRC.SDKBase;
|
|
|
|
|
|
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
|
|
public class FloorMapMarker : UdonSharpBehaviour
|
|
{
|
|
[UdonSynced, SerializeField, FieldChangeCallback(nameof(LocationFindingEnabled))] public bool _LocationFindingEnabled = false;
|
|
[UdonSynced, FieldChangeCallback(nameof(IsGrabbed))] private bool _IsGrabbed = false;
|
|
|
|
[SerializeField] private GameManagerRound3 _GameManager;
|
|
|
|
private DataList _CollidingLocations = new DataList();
|
|
private int _CollisionCheckCounter = 0;
|
|
|
|
private const int MAX_REPEAT_COLLISION_CHECKS = 3;
|
|
private const float TIME_BETWEEN_REPEAT_COLLISION_CHECKS = 0.15f;
|
|
|
|
|
|
public void OnTriggerEnter(Collider OtherCollider)
|
|
{
|
|
FloorMapLocation Location = OtherCollider.GetComponent<FloorMapLocation>();
|
|
if (Location != null)
|
|
{
|
|
_CollidingLocations.Add(Location);
|
|
_CollisionCheckCounter = 0;
|
|
if (!IsGrabbed) CheckCollisions();
|
|
}
|
|
}
|
|
|
|
public void OnTriggerExit(Collider OtherCollider)
|
|
{
|
|
FloorMapLocation Location = OtherCollider.GetComponent<FloorMapLocation>();
|
|
if (Location != null)
|
|
{
|
|
_CollidingLocations.Remove(Location);
|
|
_CollisionCheckCounter = 0;
|
|
}
|
|
}
|
|
|
|
public override void OnPickup()
|
|
{
|
|
Rigidbody Body;
|
|
if (Body = GetComponent<Rigidbody>())
|
|
{
|
|
Body.constraints = RigidbodyConstraints.None;
|
|
}
|
|
|
|
LocationFindingEnabled = true;
|
|
IsGrabbed = true;
|
|
_CollidingLocations.Clear();
|
|
|
|
base.OnPickup();
|
|
}
|
|
|
|
public override void OnDrop()
|
|
{
|
|
IsGrabbed = false;
|
|
|
|
VRCPlayerApi Owner = Networking.GetOwner(gameObject);
|
|
if (!Owner.IsUserInVR())
|
|
{
|
|
transform.eulerAngles = new Vector3(0.0f, transform.eulerAngles.y, 0.0f);
|
|
}
|
|
|
|
CheckCollisions();
|
|
|
|
base.OnDrop();
|
|
}
|
|
|
|
|
|
public void CheckCollisions()
|
|
{
|
|
if (!LocationFindingEnabled) return;
|
|
|
|
if (_CollidingLocations.Count > 0 && IsUpright() && !IsGrabbed)
|
|
{
|
|
for (int i = 0; i < _CollidingLocations.Count; i++)
|
|
{
|
|
FloorMapLocation Location = (FloorMapLocation)_CollidingLocations[i].Reference;
|
|
if (Location != null)
|
|
{
|
|
bool FoundCorrectResponse = ConfirmChoice(Location.Country, Location.City);
|
|
if (FoundCorrectResponse)
|
|
{
|
|
DisableMovementCompletely(Location);
|
|
_GameManager.CorrectResponse();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
// We should make sure to only reach here if we don't get a correct
|
|
// response from the previous loop.
|
|
if (_CollisionCheckCounter < MAX_REPEAT_COLLISION_CHECKS)
|
|
{
|
|
SendCustomEventDelayedSeconds(nameof(CheckCollisions), TIME_BETWEEN_REPEAT_COLLISION_CHECKS);
|
|
}
|
|
else
|
|
{
|
|
DisableMovementCompletely();
|
|
|
|
_GameManager.IncorrectResponse();
|
|
|
|
_CollisionCheckCounter = 0;
|
|
_CollidingLocations.Clear();
|
|
}
|
|
_CollisionCheckCounter++;
|
|
}
|
|
else
|
|
{
|
|
// If the marker isn't sitting mostly upright and is not grabbed,
|
|
// don't check collisions until later, in case it becomes upright.
|
|
SendCustomEventDelayedSeconds(nameof(CheckCollisions), TIME_BETWEEN_REPEAT_COLLISION_CHECKS);
|
|
}
|
|
}
|
|
|
|
|
|
public bool ConfirmChoice(string Country, string City)
|
|
{
|
|
if (Country == _GameManager.GetCurrentCountry() &&
|
|
City == _GameManager.GetCurrentCity())
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public void EnablePickup(bool Enable)
|
|
{
|
|
VRCPickup Pickup;
|
|
if (Pickup = GetComponent<VRCPickup>())
|
|
{
|
|
Pickup.pickupable = Enable;
|
|
}
|
|
}
|
|
|
|
|
|
public void DisableMovementCompletely(FloorMapLocation CorrectLocation = null)
|
|
{
|
|
Rigidbody Body;
|
|
if (Body = GetComponent<Rigidbody>())
|
|
{
|
|
Body.constraints = RigidbodyConstraints.FreezeAll;
|
|
}
|
|
transform.eulerAngles = new Vector3(0.0f, transform.eulerAngles.y, 0.0f);
|
|
|
|
LocationFindingEnabled = false;
|
|
|
|
if (CorrectLocation != null)
|
|
{
|
|
transform.position = CorrectLocation.transform.position;
|
|
}
|
|
}
|
|
|
|
private bool IsUpright()
|
|
{
|
|
return (Vector3.Dot(transform.up, Vector3.up) >= 0.85f);
|
|
}
|
|
|
|
|
|
public bool LocationFindingEnabled
|
|
{
|
|
set
|
|
{
|
|
_LocationFindingEnabled = value;
|
|
}
|
|
get => _LocationFindingEnabled;
|
|
}
|
|
|
|
public bool IsGrabbed
|
|
{
|
|
set
|
|
{
|
|
_IsGrabbed = value;
|
|
}
|
|
get => _IsGrabbed;
|
|
}
|
|
}
|