using System;
using System.IO;
using GameBase;
using TEngine;
using TEngine.Core.Network;
namespace GameLogic
{
///
/// 网络客户端状态。
///
public enum GameClientStatus
{
///
/// 初始化。
///
StatusInit,
///
/// 连接成功服务器。
///
StatusConnected,
///
/// 重新连接。
///
StatusReconnect,
///
/// 断开连接。
///
StatusClose,
///
/// 登录中。
///
StatusLogin,
///
/// AccountLogin成功,进入服务器了。
///
StatusEnter,
}
///
/// 网络客户端。
///
public class GameClient:Singleton
{
public readonly NetworkProtocolType ProtocolType = NetworkProtocolType.KCP;
public GameClientStatus Status { get; set; } = GameClientStatus.StatusInit;
public Scene Scene { private set; get; }
private string _lastAddress = String.Empty;
public GameClient()
{
Scene = GameApp.Instance.Scene;
}
public void Connect(string address, bool reconnect = false)
{
if (Status == GameClientStatus.StatusConnected || Status == GameClientStatus.StatusLogin || Status == GameClientStatus.StatusEnter)
{
return;
}
if (!reconnect)
{
// SetWatchReconnect(false);
}
if (reconnect)
{
// GameEvent.Get().ShowWaitUITip(WaitUISeq.LOGINWORLD_SEQID, G.R(TextDefine.ID_TIPS_RECONNECTING));
}
else
{
// GameEvent.Get().ShowWaitUI(WaitUISeq.LOGINWORLD_SEQID);
}
_lastAddress = address;
Status = reconnect ? GameClientStatus.StatusReconnect : GameClientStatus.StatusInit;
if (Scene.Session == null || Scene.Session.IsDisposed)
{
Scene.CreateSession(address, ProtocolType, OnConnectComplete, OnConnectFail, OnConnectDisconnect);
}
}
private void OnConnectComplete()
{
Status = GameClientStatus.StatusConnected;
Log.Info("Connect to server success");
}
private void OnConnectFail()
{
Status = GameClientStatus.StatusClose;
Log.Warning("Could not connect to server");
}
private void OnConnectDisconnect()
{
Status = GameClientStatus.StatusClose;
Log.Warning("OnConnectDisconnect server");
}
public virtual void Send(object message, uint rpcId = 0, long routeId = 0)
{
if (Scene.Session == null)
{
Log.Error("Send Message Failed Because Session Is Null");
return;
}
Scene.Session.Send(message,rpcId,routeId);
}
public virtual void Send(IRouteMessage routeMessage, uint rpcId = 0, long routeId = 0)
{
if (Scene.Session == null)
{
Log.Error("Send Message Failed Because Session Is Null");
return;
}
Scene.Session.Send(routeMessage,rpcId,routeId);
}
public virtual void Send(MemoryStream memoryStream, uint rpcId = 0, long routeTypeOpCode = 0, long routeId = 0)
{
if (Scene.Session == null)
{
Log.Error("Send Message Failed Because Session Is Null");
return;
}
Scene.Session.Send(memoryStream,rpcId,routeTypeOpCode,routeId);
}
public virtual async FTask Call(IRequest request, long routeId = 0)
{
if (Scene == null || Scene.Session == null)
{
return null;
}
var requestCallback = await Scene.Session.Call(request,routeId);
return requestCallback;
}
public void RegisterMsgHandler(uint protocolCode,Action ctx)
{
MessageDispatcherSystem.Instance.RegisterMsgHandler(protocolCode,ctx);
}
public void UnRegisterMsgHandler(uint protocolCode,Action ctx)
{
MessageDispatcherSystem.Instance.UnRegisterMsgHandler(protocolCode,ctx);
}
}
}