using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro; public class RegionManager : MonoBehaviour { public static RegionManager instance; [SerializeField] public static RegionServerData selectedServer; [SerializeField] public List servers = new List(); public Button btn_auto; public TMP_Text[] selectedServerTxts; void Start() { UpdateServerData(); UpdateSelectedRegion(); foreach(RegionServerData server in servers){ if(PlayerPrefs.HasKey("regionOverride")){ if(PlayerPrefs.GetString("regionOverride") == server.name){ selectedServer = server; } } server.btn_select.onClick.AddListener(()=>{SetRegionOverride(server.name);}); } btn_auto.onClick.AddListener(()=>{ SetRegionOverride(""); }); } public void UpdateServerData(){ StartCoroutine(updatePing()); } IEnumerator updatePing(){ for(int i=0;i < servers.Count;i++){ WaitForSeconds f = new WaitForSeconds(0.05f); Ping p = new Ping(servers[i].ip); while (p.isDone == false) { yield return f; } if(p.time<=2){continue;} servers[i].ping = p.time; foreach(TMPro.TMP_Text pingTxt in servers[i].pingTxts){ pingTxt.text = p.time + " ms"; pingTxt.color = (p.time < 90) ? Color.green : (p.time < 140) ? Color.yellow : Color.red; } if(selectedServer == null || (!PlayerPrefs.HasKey("regionOverride") && selectedServer.ping > p.time)){ // <-- Auto select best server selectedServer = servers[i]; } } yield return new WaitForSeconds(2); StartCoroutine(updatePing()); UpdateSelectedRegion(); } public void SetRegionOverride(string region){ Debug.Log("Setting region override to " + region); foreach(RegionServerData server in servers){ if(server.name == region){ PlayerPrefs.SetString("regionOverride", region); PlayerPrefs.Save(); selectedServer = server; UpdateSelectedRegion(); return; } } //No server found for the said region PlayerPrefs.DeleteKey("regionOverride"); PlayerPrefs.Save(); UpdateSelectedRegion(); } void UpdateSelectedRegion(){ btn_auto.interactable = PlayerPrefs.HasKey("regionOverride"); foreach(RegionServerData server in servers){ server.btn_select.interactable = PlayerPrefs.HasKey("regionOverride") ? (server.name != PlayerPrefs.GetString("regionOverride")): true; } foreach(TMP_Text selectedServerTxt in selectedServerTxts){ selectedServerTxt.text = PlayerPrefs.HasKey("regionOverride") ? PlayerPrefs.GetString("regionOverride") : "Auto - " + (selectedServer == null ? "/" : selectedServer.name); } } } [System.Serializable] public class RegionServerData{ public string name; public string ip; public int ping; public TMPro.TMP_Text[] pingTxts; public Button btn_select; }