| using UnityEngine;  | 
| using System;  | 
| using System.Collections;  | 
| using System.Collections.Generic;  | 
| using vnxbqy.UI;  | 
|   | 
|   | 
| public class GameNetSystem : Singleton<GameNetSystem>  | 
| {  | 
|     NetUpdateBehaviour m_NetUpdateBehaviour;  | 
|     NeverConnectState neverConnectState;  | 
|     AccountLoginState accountLoginState;  | 
|     CreateOrSelectRoleState createOrSelectRoleState;  | 
|     RoleLoginState roleLoginState;  | 
|     ConnectedState connectedState;  | 
|     DisconnectState disconnectState;  | 
|   | 
|     NetState m_NetState;  | 
|     public NetState netState  | 
|     {  | 
|         get { return this.m_NetState; }  | 
|         set  | 
|         {  | 
|             if (this.m_NetState != value)  | 
|             {  | 
|                 switch (m_NetState)  | 
|                 {  | 
|                     case NetState.NerverConnect:  | 
|                         neverConnectState.OnExit();  | 
|                         break;  | 
|                     case NetState.AccountLogin:  | 
|                         accountLoginState.OnExit();  | 
|                         break;  | 
|                     case NetState.CreateOrSelectRole:  | 
|                         createOrSelectRoleState.OnExit();  | 
|                         break;  | 
|                     case NetState.RoleLogin:  | 
|                         roleLoginState.OnExit();  | 
|                         break;  | 
|                     case NetState.Connected:  | 
|                         connectedState.OnExit();  | 
|                         break;  | 
|                     case NetState.DisConnected:  | 
|                         disconnectState.OnExit();  | 
|                         break;  | 
|                 }  | 
|   | 
|                 this.m_NetState = value;  | 
|                 switch (m_NetState)  | 
|                 {  | 
|                     case NetState.NerverConnect:  | 
|                         neverConnectState.OnEnter();  | 
|                         break;  | 
|                     case NetState.AccountLogin:  | 
|                         accountLoginState.OnEnter();  | 
|                         break;  | 
|                     case NetState.CreateOrSelectRole:  | 
|                         createOrSelectRoleState.OnEnter();  | 
|                         break;  | 
|                     case NetState.RoleLogin:  | 
|                         roleLoginState.OnEnter();  | 
|                         break;  | 
|                     case NetState.Connected:  | 
|                         connectedState.OnEnter();  | 
|                         break;  | 
|                     case NetState.DisConnected:  | 
|                         disconnectState.OnEnter();  | 
|                         break;  | 
|                 }  | 
|             }  | 
|         }  | 
|     }  | 
|   | 
|     private ClientSocket mainSocket;  | 
|     public bool mainSocketConnected { get { return mainSocket == null ? false : mainSocket.connected; } }  | 
|   | 
|     public float timeSinceMainSocketLastProtocol  | 
|     {  | 
|         get { return mainSocket == null ? Time.time : (float)(DateTime.Now - mainSocket.lastPackageTime).TotalSeconds; }  | 
|     }  | 
|   | 
|     public bool crossServerConnected_Loigc { get; set; }  | 
|     private ClientSocket crossServerSocket;  | 
|     public bool crossServerSocketConnected { get { return crossServerConnected_Loigc && (crossServerSocket == null ? false : crossServerSocket.connected); } }  | 
|   | 
|     public float timeSinceCrossServerSocketLastProtocol  | 
|     {  | 
|         get { return crossServerSocket == null ? Time.time : (float)(DateTime.Now - crossServerSocket.lastPackageTime).TotalSeconds; }  | 
|     }  | 
|   | 
|     Queue<GameNetPackBasic> mainProtocolQueue = new Queue<GameNetPackBasic>();  | 
|     Queue<GameNetPackBasic> crossSeverProtocolQueue = new Queue<GameNetPackBasic>();  | 
|   | 
|     public CrossServerData crossServerData { get; private set; }  | 
|   | 
|     public GameNetSystem()  | 
|     {  | 
|         var gameObject = new GameObject("NetUpdateBehaviour");  | 
|         GameObject.DontDestroyOnLoad(gameObject);  | 
|         m_NetUpdateBehaviour = gameObject.AddComponent<NetUpdateBehaviour>();  | 
|         m_NetUpdateBehaviour.RegisterUpdateCallBack(OnUpdate);  | 
|   | 
|         neverConnectState = gameObject.AddComponent<NeverConnectState>();  | 
|         accountLoginState = gameObject.AddComponent<AccountLoginState>();  | 
|         createOrSelectRoleState = gameObject.AddComponent<CreateOrSelectRoleState>();  | 
|         roleLoginState = gameObject.AddComponent<RoleLoginState>();  | 
|         connectedState = gameObject.AddComponent<ConnectedState>();  | 
|         disconnectState = gameObject.AddComponent<DisconnectState>();  | 
|   | 
|         netState = NetState.NerverConnect;  | 
|     }  | 
|   | 
|     public void BeginConnectGameServer(string ip, int port, Action<bool> onConnected)  | 
|     {  | 
|         try  | 
|         {  | 
|             if (mainSocketConnected)  | 
|             {  | 
|                 mainSocket.CloseConnect();  | 
|             }  | 
|         }  | 
|         catch (System.Exception ex)  | 
|         {  | 
|             DebugEx.Log(ex);  | 
|         }  | 
|   | 
|         mainSocket = new ClientSocket(ServerType.Main);  | 
|         mainProtocolQueue.Clear();  | 
|   | 
|         mainSocket.Connect(ip, port, (bool ok) =>  | 
|         {  | 
|             if (onConnected != null)  | 
|             {  | 
|                 onConnected(ok);  | 
|             }  | 
|         });  | 
|     }  | 
|   | 
|     public void BeginConnectCrossServer(string ip, int port, Action<bool> onConnected)  | 
|     {  | 
|         try  | 
|         {  | 
|             crossServerConnected_Loigc = false;  | 
|             if (crossServerSocketConnected)  | 
|             {  | 
|                 crossServerSocket.CloseConnect();  | 
|             }  | 
|         }  | 
|         catch (System.Exception ex)  | 
|         {  | 
|             DebugEx.Log(ex);  | 
|         }  | 
|   | 
|         crossServerSocket = new ClientSocket(ServerType.CrossSever);  | 
|         crossSeverProtocolQueue.Clear();  | 
|         this.crossServerSocket.Connect(ip, port, (bool ok) =>  | 
|         {  | 
|             if (onConnected != null)  | 
|             {  | 
|                 onConnected(ok);  | 
|             }  | 
|         });  | 
|     }  | 
|   | 
|     public void UpdateCrossServerData(string ip, int port, byte state)  | 
|     {  | 
|         this.crossServerData = new CrossServerData(ip, port, state);  | 
|         if (this.crossServerData.crossState == 0)  | 
|         {  | 
|             crossServerConnected_Loigc = false;  | 
|         }  | 
|     }  | 
|   | 
|     public void SendInfo(GameNetPackBasic protocol)  | 
|     {  | 
|         if (mainSocket != null)  | 
|         {  | 
|             mainSocket.SendInfo(protocol);  | 
|             DebugPkgCache.Push(protocol);  | 
|         }  | 
|     }  | 
|   | 
|     public void SendInfo(byte[] vBytes)  | 
|     {  | 
|         if (mainSocket != null)  | 
|         {  | 
|             mainSocket.SendInfo(vBytes);  | 
|         }  | 
|     }  | 
|   | 
|     public void SendToCrossServer(GameNetPackBasic protocol)  | 
|     {  | 
|         if (crossServerSocket != null)  | 
|         {  | 
|             protocol.socketType = ServerType.CrossSever;  | 
|             crossServerSocket.SendInfo(protocol);  | 
|             DebugPkgCache.Push(protocol);  | 
|         }  | 
|     }  | 
|   | 
|     public void PushPackage(GameNetPackBasic protocol, ServerType type)  | 
|     {  | 
|         lock (this)  | 
|         {  | 
|             if (protocol == null)  | 
|             {  | 
|                 return;  | 
|             }  | 
|   | 
|             if (PackageRegedit.Contain(protocol.cmd))  | 
|             {  | 
|                 switch (type)  | 
|                 {  | 
|                     case ServerType.Main:  | 
|                         mainProtocolQueue.Enqueue(protocol);  | 
|                         break;  | 
|                     case ServerType.CrossSever:  | 
|                         crossSeverProtocolQueue.Enqueue(protocol);  | 
|                         break;  | 
|                     default:  | 
|                         break;  | 
|                 }  | 
|   | 
|                 DebugPkgCache.Push(protocol);  | 
|             }  | 
|             else  | 
|             {  | 
|                 DebugEx.LogErrorFormat("数据包(cmd:{0})未登记!", protocol.cmd);  | 
|             }  | 
|         }  | 
|     }  | 
|   | 
|     public void Disconnect()  | 
|     {  | 
|         try  | 
|         {  | 
|             if (mainSocket != null)  | 
|             {  | 
|                 mainSocket.CloseConnect();  | 
|             }  | 
|   | 
|             if (crossServerSocket != null)  | 
|             {  | 
|                 crossServerSocket.CloseConnect();  | 
|             }  | 
|   | 
|             mainProtocolQueue.Clear();  | 
|             crossSeverProtocolQueue.Clear();  | 
|         }  | 
|         catch (Exception ex)  | 
|         {  | 
|             Debug.Log(ex);  | 
|         }  | 
|         finally  | 
|         {  | 
|             netState = NetState.DisConnected;  | 
|             var loginModel = ModelCenter.Instance.GetModel<LoginModel>();  | 
|             loginModel.busy = false;  | 
|             CrossServerLogin.Instance.busy = false;  | 
|         }  | 
|     }  | 
|   | 
|     public void DisconnectCrossServer()  | 
|     {  | 
|         try  | 
|         {  | 
|             if (crossServerSocket != null)  | 
|             {  | 
|                 crossServerSocket.CloseConnect();  | 
|             }  | 
|   | 
|             crossSeverProtocolQueue.Clear();  | 
|         }  | 
|         catch (Exception ex)  | 
|         {  | 
|             Debug.Log(ex);  | 
|         }  | 
|         finally  | 
|         {  | 
|             CrossServerLogin.Instance.busy = false;  | 
|         }  | 
|     }  | 
|   | 
|     public void Reconnect()  | 
|     {  | 
|         try  | 
|         {  | 
|             if (mainSocket != null)  | 
|             {  | 
|                 mainSocket.CloseConnect();  | 
|             }  | 
|   | 
|             if (crossServerSocket != null)  | 
|             {  | 
|                 crossServerSocket.CloseConnect();  | 
|             }  | 
|   | 
|             mainProtocolQueue.Clear();  | 
|             crossSeverProtocolQueue.Clear();  | 
|         }  | 
|         catch (Exception ex)  | 
|         {  | 
|             Debug.Log(ex);  | 
|         }  | 
|         finally  | 
|         {  | 
|             netState = NetState.AccountLogin;  | 
|             CrossServerLogin.Instance.busy = false;  | 
|             var loginModel = ModelCenter.Instance.GetModel<LoginModel>();  | 
|             loginModel.busy = false;  | 
|             loginModel.ReAccountLogin();  | 
|         }  | 
|     }  | 
|   | 
|     public void LoginOut()  | 
|     {  | 
|         if (CameraController.Instance != null)  | 
|             CameraController.Instance.SetInGame(false);  | 
|         DTC0102_tagCDBPlayer.isAfterPlayerDataInitialize = false;  | 
|   | 
|         try  | 
|         {  | 
|             ynmbxxjUtil.Instance.RoleLoginOut();  | 
|             crossServerConnected_Loigc = false;  | 
|   | 
|             if (mainSocket != null)  | 
|             {  | 
|                 mainSocket.CloseConnect();  | 
|             }  | 
|   | 
|             if (crossServerSocket != null)  | 
|             {  | 
|                 crossServerSocket.CloseConnect();  | 
|             }  | 
|   | 
|             mainProtocolQueue.Clear();  | 
|             crossSeverProtocolQueue.Clear();  | 
|         }  | 
|         catch (Exception ex)  | 
|         {  | 
|             Debug.Log(ex);  | 
|         }  | 
|         finally  | 
|         {  | 
|             netState = NetState.NerverConnect;  | 
|             CrossServerLogin.Instance.busy = false;  | 
|             //ArenaManager.isArenaClient = false;  | 
|             var loginModel = ModelCenter.Instance.GetModel<LoginModel>();  | 
|             loginModel.busy = false;  | 
|             WindowJumpMgr.Instance.ClearJumpData();  | 
|   | 
|             StageLoad.Instance.PushSceneLoadCommand(new StageLoad.StageLoadCommand()  | 
|             {  | 
|                 toMapId = 1,  | 
|                 toLineId = 0,  | 
|                 needEmpty = false,  | 
|                 needLoadResource = true,  | 
|                 serverType = ServerType.Main,  | 
|                 isClientLoadMap = true  | 
|             });  | 
|             //CameraManager.uiCamera.clearFlags = CameraClearFlags.SolidColor;  | 
|             //GameObject obj = GameObject.Find("NormalCanvas"); | 
|             //int count = obj.transform.childCount;  | 
|             //for (int i = count - 1; i >= 0; --i)  | 
|             //{  | 
|             //    //Debug.LogError(obj.transform.GetChild(i).name);  | 
|             //    GameObject.Destroy(obj.transform.GetChild(i).gameObject);  | 
|             //}  | 
|             //SceneManager.LoadScene("Empty");  | 
|             NetLinkWin.Hide();  | 
|             DTC0403_tagPlayerLoginLoadOK.neverLoginOk = true;  | 
|         }  | 
|     }  | 
|   | 
|     public void OnAccountLogin()  | 
|     {  | 
|         netState = NetState.AccountLogin;  | 
|     }  | 
|   | 
|     public void OnEnterWorld()  | 
|     {  | 
|         netState = NetState.RoleLogin;  | 
|     }  | 
|   | 
|     void OnUpdate()  | 
|     {  | 
|         lock (this)  | 
|         {  | 
|             while (mainProtocolQueue.Count > 0)  | 
|             {  | 
|                 var package = mainProtocolQueue.Dequeue();  | 
|                 if (package != null)  | 
|                 {  | 
|                     PackageRegedit.Distribute(package);  | 
|                 }  | 
|             }  | 
|             while (crossSeverProtocolQueue.Count > 0)  | 
|             {  | 
|                 var package = crossSeverProtocolQueue.Dequeue();  | 
|                 if (package != null)  | 
|                 {  | 
|                     PackageRegedit.Distribute(package);  | 
|                 }  | 
|             }  | 
|         }  | 
|   | 
|     }  | 
|   | 
|     public enum NetState  | 
|     {  | 
|         NerverConnect = 1,  | 
|         AccountLogin = 2,  | 
|         CreateOrSelectRole = 3,  | 
|         RoleLogin = 4,  | 
|         Connected = 5,  | 
|         DisConnected = 6,  | 
|     }  | 
|   | 
|     public struct CrossServerData  | 
|     {  | 
|         public string ip;  | 
|         public int port;  | 
|         public CrossServerState crossState;  | 
|   | 
|         public CrossServerData(string ip, int port, byte state)  | 
|         {  | 
|             this.ip = ip;  | 
|             this.port = port;  | 
|             this.crossState = (CrossServerState)state;  | 
|         }  | 
|     }  | 
|   | 
|     public enum CrossServerState  | 
|     {  | 
|         No = 0,  | 
|         Yes = 1,  | 
|         Error = 2,  | 
|     }  | 
|   | 
| }  | 
|   | 
| public enum ServerType  | 
| {  | 
|     Main = 1,  | 
|     CrossSever = 2,  | 
| }  |