using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using BrewMonster.Network; using CSNetwork.Protocols; using CSNetwork.Protocols.RPCData; using TMPro; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; namespace BrewMonster.UI { /// /// Login Flow: /// 1. Enter username and password /// 2. Click login button /// 3. Login success, get the list of characters /// 4. Open the select character screen /// public class LoginScreenUI : MonoBehaviour { [SerializeField] private TMP_InputField _usernameInputField; [SerializeField] private TMP_InputField _passwordInputField; [SerializeField] private Button _loginButton; [SerializeField] private SelecScreenCharacter _selectCharacterScreen; private List _roleInfos; bool isDoneWorldRender = false; bool isDoneNPCRender = false; private SynchronizationContext context; void Start() { _loginButton.onClick.AddListener(OnLoginButtonClicked); context = SynchronizationContext.Current; _usernameInputField.text = PlayerPrefs.GetString("username", ""); _passwordInputField.text = PlayerPrefs.GetString("password", ""); } // Update is called once per frame void Update() { if (_roleInfos != null) { _selectCharacterScreen.InitScreen(_roleInfos, OnClickSelectCharacter); _roleInfos = null; } #if UNITY_EDITOR if (Input.GetKeyUp(KeyCode.LeftAlt)) { _usernameInputField.text = "test004"; _passwordInputField.text = "123456"; } if (Input.GetKeyUp(KeyCode.Tab)) { _usernameInputField.text = "test002"; _passwordInputField.text = "123456"; OnLoginButtonClicked(); } #endif } public async void OnLoginButtonClicked() { BMLogger.Log("OnLoginButtonClicked"); string username = _usernameInputField.text; string password = _passwordInputField.text; UnityGameSession.SetConnectionInfo("103.182.22.52", 29000); PlayerPrefs.SetString("username", username); PlayerPrefs.SetString("password", password); PlayerPrefs.Save(); await UnityGameSession.Login(username, password, OnLoginComplete); _selectCharacterScreen.gameObject.SetActive(true); } /// /// Callback when the login is complete. /// Then get the list of characters /// private void OnLoginComplete(bool result) { if (!result) { BMLogger.LogError("Login failed"); return; } UnityGameSession.GetRoleListAsync(OnGetRoleListComplete); } /// /// Callback when the list of characters is retrieved. /// Then move to the select character screen /// private void OnGetRoleListComplete(List roleInfos) { BMLogger.Log($"OnGetRoleListComplete {roleInfos.Count}"); _roleInfos = roleInfos; } private void OnClickSelectCharacter(RoleInfo roleInfo) { BMLogger.Log($"OnClickSelectCharacter {roleInfo.name}"); UnityGameSession.SelectRoleAsync(roleInfo, OnSelectRoleComplete); } private void OnSelectRoleComplete(RoleInfo roleInfo) { context.Post(_ => { isDoneWorldRender = false; isDoneNPCRender = false; Action actLoadChar = () => { if (!isDoneNPCRender || !isDoneWorldRender) { return; } }; #if TESTFAST string nameScene = "LoginScene"; SceneManager.UnloadSceneAsync(nameScene); nameScene = "NPCRender"; UnityGameSession.Instance.LoadScene(nameScene, LoadSceneMode.Additive, (value) => { isDoneNPCRender = value; isDoneWorldRender = value; actLoadChar?.Invoke(); UnityGameSession.EnterWorldAsync(roleInfo, OnEnterWorldComplete); }); #else string nameScene = "NPCRender"; UnityGameSession.Instance.LoadScene(nameScene, LoadSceneMode.Single, (value) => { isDoneNPCRender = value; actLoadChar?.Invoke(); }); nameScene = "a61"; UnityGameSession.Instance.LoadScene(nameScene, LoadSceneMode.Additive, (value) => { isDoneWorldRender = value; actLoadChar?.Invoke(); UnityGameSession.EnterWorldAsync(roleInfo, OnEnterWorldComplete); }); #endif }, null); } private async void OnEnterWorldComplete() { await Task.Delay(2000); // Request all known packages: 0=Inventory,1=Equipment,2=Task UnityGameSession.RequestAllInventoriesAsync(() => { /*BMLogger.Log("Sent Inventory Detail Requests (all packs)");*/ }, 0, 1, 2); UnityGameSession.RequestCheckSecurityPassWd(""); UnityGameSession.RequesrQueryPlayerCash(); await Task.Delay(2000); UnityGameSession.c2s_CmdGetAllData(true, true, false); EC_Game.Init(); } //private void OnInventoryReceived(List inventoryData) //{ // _inventoryUI.DisplayInventory(inventoryData); //} #if UNITY_EDITOR private void OnValidate() { if (_usernameInputField == null) { // find childrend with name "username" _usernameInputField = transform.Find("username").GetComponent(); } if (_passwordInputField == null) { // find childrend with name "password" _passwordInputField = transform.Find("password").GetComponent(); } if (_loginButton == null) { // find childrend with name "LoginBtn" _loginButton = transform.Find("LoginBtn").GetComponent