| using UnityEngine; | 
| using System; | 
| using System.Collections; | 
| using System.Collections.Generic; | 
|   | 
|   | 
| 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) | 
|         { | 
|             Debug.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) | 
|         { | 
|             Debug.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 | 
|             { | 
|                 Debug.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; | 
|             // TODO YYL | 
|   | 
|             // 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, | 
| } |