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,
|
}
|