using System.Collections.Generic;
using UnityEngine;
namespace XRMultiplayer.MiniGames
{
///
/// Represents a climbing mini-game.
///
public class MiniGame_Climber : MiniGameBase
{
[SerializeField] SubTrigger[] m_FinishBells;
[SerializeField, ColorUsage(true, true)] Color m_BellStartColor;
[SerializeField, ColorUsage(true, true)] Color m_BellCompleteColor;
List m_BellRenderers = new();
protected float m_LocalPlayerTimer = 0.0f;
///
public override void Start()
{
base.Start();
m_LocalPlayerTimer = 0.0f;
m_CurrentTimer = m_GameLength;
foreach (var bell in m_FinishBells)
{
bell.subTriggerCollider.enabled = false;
var rend = bell.GetComponent();
bell.OnTriggerAction += (Collider c, bool b) => { HitBell(c, b, rend); };
m_BellRenderers.Add(rend);
}
}
////
void OnDestroy()
{
foreach (var bell in m_FinishBells)
{
bell.OnTriggerAction -= (Collider c, bool b) => { HitBell(c, b, bell.GetComponent()); };
}
}
public override void SetupGame()
{
base.SetupGame();
foreach (var rend in m_BellRenderers)
{
rend.material.color = m_BellStartColor;
rend.material.SetColor("_EmissionColor", m_BellStartColor);
}
}
///
public override void StartGame()
{
base.StartGame();
foreach (var bell in m_FinishBells)
{
bell.subTriggerCollider.enabled = true;
}
foreach (var rend in m_BellRenderers)
{
rend.material.color = m_BellStartColor;
rend.material.SetColor("_EmissionColor", m_BellStartColor);
}
m_LocalPlayerTimer = 0.0f;
m_CurrentTimer = m_GameLength;
}
///
public override void UpdateGame(float deltaTime)
{
base.UpdateGame(deltaTime);
if (!m_Finished)
{
m_LocalPlayerTimer += Time.deltaTime;
}
m_MiniGameManager.UpdatePlayerScores();
}
///
public override void FinishGame(bool submitScore = true)
{
base.FinishGame(submitScore);
foreach (var bells in m_FinishBells)
{
bells.subTriggerCollider.enabled = false;
}
if (submitScore)
m_MiniGameManager.SubmitScoreServerRpc(m_LocalPlayerTimer, XRINetworkPlayer.LocalPlayer.OwnerClientId, true);
}
void HitBell(Collider collider, bool isTriggered, Renderer bell)
{
if (isTriggered && collider.CompareTag("PlayerHand"))
{
XRINetworkPlayer player = collider.gameObject.GetComponentInParent();
if (player.IsLocalPlayer & !m_Finished)
{
bell.material.color = m_BellCompleteColor;
bell.material.SetColor("_EmissionColor", m_BellCompleteColor);
var particle = bell.GetComponentInChildren();
if (particle != null)
{
particle.Play();
}
FinishGame();
}
}
}
}
}