UPF/Assets/Game/Scripts/RegionManager.cs
2022-09-20 00:16:35 +05:30

98 lines
3.2 KiB
C#

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<RegionServerData> servers = new List<RegionServerData>();
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;
}
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;
}