using System;
using NitroxClient.GameLogic;
using NitroxClient.Unity.Helper;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace NitroxClient.MonoBehaviours.Gui.HUD;
public class RemotePlayerVitals : MonoBehaviour
{
private static readonly Color OXYGEN_BAR_COLOR = new(0.168f, 0.666f, 0.60f, 1.0f);
private static readonly Color OXYGEN_BAR_BORDER_COLOR = new(0.227f, 0.949f, 0.969f, 1.0f);
private static readonly Color HEALTH_BAR_COLOR = new(0.859f, 0.373f, 0.251f, 1.0f);
private static readonly Color HEALTH_BAR_BORDER_COLOR = new(0.824f, 0.651f, 0.424f, 1.0f);
private static readonly Color FOOD_BAR_COLOR = new(0.965f, 0.655f, 0.149f, 1.0f);
private static readonly Color FOOD_BAR_BORDER_COLOR = new(0.957f, 0.914f, 0.251f, 1.0f);
private static readonly Color WATER_BAR_COLOR = new(0.212f, 0.663f, 0.855f, 1.0f);
private static readonly Color WATER_BAR_BORDER_COLOR = new(0.227f, 0.949f, 0.969f, 1.0f);
private Canvas canvas;
private Bar foodBar;
private Bar healthBar;
private Bar oxygenBar;
private string playerName;
private Bar waterBar;
///
/// Creates a player vitals UI elements for the player id.
///
/// Unique player id to create the vitals UI elements for.
public static RemotePlayerVitals CreateForPlayer(RemotePlayer remotePlayer)
{
RemotePlayerVitals vitals = new GameObject("RemotePlayerVitals").AddComponent();
try
{
vitals.canvas = vitals.CreateCanvas(remotePlayer.Body.transform);
vitals.playerName = remotePlayer.PlayerName;
vitals.CreatePlayerName(vitals.canvas);
vitals.CreateStats(vitals.canvas);
} catch (Exception ex)
{
Log.Error(ex, $"Encountered an error while creating vitals for player {remotePlayer.PlayerId}, destroying them.");
Destroy(vitals.gameObject);
return null;
}
return vitals;
}
public void SetStatsVisible(bool visible)
{
oxygenBar.SetVisible(visible);
healthBar.SetVisible(visible);
foodBar.SetVisible(visible);
waterBar.SetVisible(visible);
}
public void SetOxygen(float oxygen, float maxOxygen)
{
oxygenBar.SetTargetValue(oxygen);
oxygenBar.SetMaxValue(maxOxygen);
}
public void SetHealth(float health)
{
healthBar.SetTargetValue(health);
}
public void SetFood(float food)
{
foodBar.SetTargetValue(food);
}
public void SetWater(float water)
{
waterBar.SetTargetValue(water);
}
public void LateUpdate()
{
oxygenBar.UpdateVisual();
healthBar.UpdateVisual();
foodBar.UpdateVisual();
waterBar.UpdateVisual();
// Make canvas face camera.
Camera camera = Camera.main;
if (canvas && camera)
{
canvas.transform.forward = camera.transform.forward;
}
}
private Canvas CreateCanvas(Transform playerTransform)
{
// Canvas
transform.SetParent(playerTransform, false);
transform.localPosition = new Vector3(0, 0, 0);
Canvas vitalsCanvas = gameObject.AddComponent