using UnityEngine; using UnityEngine.UI; using UnityEngine.InputSystem; using TMPro; using NeonTea.Quakeball.Networking; using NeonTea.Quakeball.Game; using System.Collections.Generic; namespace NeonTea.Quakeball.Interface { public class StatScreen : MonoBehaviour { [Header("General")] public Color RowColor = new Color(); public RectTransform BackroundPanel; public GameObject RowPrefab; public RectTransform Header; public RectTransform DescriptorRow; public bool ForceOpen; [Header("Player Team name colors")] public Color SunColor = new Color(); public Color MoonColor = new Color(); private bool Open; private float HeaderOffset; private InputAction OpenStatScreenAction; private List Rows = new List(); private bool LastRowIsDark = true; private Color DarkColor; private int LastRowAmount = 0; private float LastUpdate; public void Start() { OpenStatScreenAction = new InputAction("Open stats", binding: "/tab"); OpenStatScreenAction.Enable(); DarkColor = new Color(0, 0, 0, 0); DarkColor.a = RowColor.a; BackroundPanel.gameObject.SetActive(false); HeaderOffset = Header.rect.height + DescriptorRow.rect.height; } public void Update() { if (OpenStatScreenAction.ReadValue() > 0 || ForceOpen) { Open = true; } else { Open = false; } BackroundPanel.gameObject.SetActive(Open); if (Open && (Time.time - LastUpdate) > 0.5f && Net.Singleton.Instance != null) { UpdateRows(); LastUpdate = Time.time; } } public void UpdateRows() { int rowAmount = Net.Singleton.Instance.PlayerList.Count; if (rowAmount != LastRowAmount) { UpdateRowAmount(); LastRowAmount = rowAmount; } for (int i = 0; i < rowAmount; i++) { NetPlayer player = Net.Singleton.Instance.PlayerList[i]; Color playerColor = new Color(1, 1, 1, 1); switch (player.Team) { case Team.Sun: playerColor = SunColor; break; case Team.Moon: playerColor = MoonColor; break; } TMP_Text NickText = Rows[i].GetChild(0).GetComponent(); NickText.color = playerColor; NickText.text = player.Nick; int ping = (int)(player.Ping * 1000); Rows[i].GetChild(1).GetComponent().text = $"{ping} ms"; } } public void UpdateRowAmount() { int rowAmount = Net.Singleton.Instance.PlayerList.Count; while (Rows.Count < rowAmount) { AddRow(); } while (Rows.Count > rowAmount) { RemoveRow(); } } public void AddRow() { GameObject rowobj = GameObject.Instantiate(RowPrefab); rowobj.transform.SetParent(BackroundPanel, false); RectTransform row = rowobj.GetComponent(); Rows.Add(row); Vector2 offsetMin = row.offsetMin; offsetMin.x = 0; row.offsetMin = offsetMin; Vector2 offsetMax = row.offsetMax; offsetMax.x = 0; row.offsetMax = offsetMax; Vector2 pos = row.anchoredPosition; pos.y = 20 - (row.rect.height * Rows.Count) - HeaderOffset; row.anchoredPosition = pos; Image rowImage = row.GetComponent(); if (LastRowIsDark) { rowImage.color = RowColor; } else { rowImage.color = DarkColor; } LastRowIsDark = !LastRowIsDark; } public void RemoveRow() { if (Rows.Count > 0) { GameObject.Destroy(Rows[Rows.Count - 1].gameObject); Rows.RemoveAt(Rows.Count - 1); LastRowIsDark = !LastRowIsDark; } } } }