mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-07 16:45:10 +00:00
166 lines
4.3 KiB
C#
166 lines
4.3 KiB
C#
using TEngine;
|
|
|
|
namespace GameLogic
|
|
{
|
|
public enum ClientConnectWatcherStatus
|
|
{
|
|
StatusInit,
|
|
StatusReconnectAuto,
|
|
StatusReconnectConfirm,
|
|
StatusWaitExit
|
|
}
|
|
|
|
public class ClientConnectWatcher
|
|
{
|
|
private readonly GameClient _client;
|
|
private ClientConnectWatcherStatus _status;
|
|
private float _statusTime;
|
|
private int _reconnectCnt = 0;
|
|
private int _disconnectReason = 0;
|
|
|
|
private bool _enable = false;
|
|
|
|
public bool Enable
|
|
{
|
|
get => _enable;
|
|
set
|
|
{
|
|
if (_enable != value)
|
|
{
|
|
_enable = value;
|
|
if (_enable)
|
|
{
|
|
OnEnable();
|
|
}
|
|
else
|
|
{
|
|
OnDisable();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private ClientConnectWatcherStatus Status
|
|
{
|
|
get => _status;
|
|
set
|
|
{
|
|
if (_status == value) return;
|
|
_status = value;
|
|
_statusTime = NowTime;
|
|
}
|
|
}
|
|
|
|
private float NowTime => GameTime.unscaledTime;
|
|
|
|
public ClientConnectWatcher(GameClient client)
|
|
{
|
|
_client = client;
|
|
_statusTime = NowTime;
|
|
_status = ClientConnectWatcherStatus.StatusInit;
|
|
}
|
|
|
|
public void Update()
|
|
{
|
|
if (!_enable)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (_client.IsEntered)
|
|
{
|
|
return;
|
|
}
|
|
|
|
switch (_status)
|
|
{
|
|
case ClientConnectWatcherStatus.StatusInit:
|
|
UpdateOnInitStatus();
|
|
break;
|
|
case ClientConnectWatcherStatus.StatusReconnectAuto:
|
|
UpdateOnReconnectAuto();
|
|
break;
|
|
case ClientConnectWatcherStatus.StatusReconnectConfirm:
|
|
UpdateOnReconnectConfirm();
|
|
break;
|
|
case ClientConnectWatcherStatus.StatusWaitExit:
|
|
UpdateOnWaitExit();
|
|
break;
|
|
}
|
|
}
|
|
|
|
public void OnReConnect()
|
|
{
|
|
if (_status == ClientConnectWatcherStatus.StatusReconnectConfirm)
|
|
{
|
|
Status = ClientConnectWatcherStatus.StatusReconnectAuto;
|
|
}
|
|
}
|
|
|
|
void UpdateOnInitStatus()
|
|
{
|
|
int autoReconnectMaxCount = 4;
|
|
if (_reconnectCnt <= autoReconnectMaxCount)
|
|
{
|
|
if (_reconnectCnt == 0)
|
|
{
|
|
_disconnectReason = _client.LastNetErrCode;
|
|
}
|
|
|
|
Status = ClientConnectWatcherStatus.StatusReconnectAuto;
|
|
_reconnectCnt++;
|
|
|
|
//重连
|
|
_client.Reconnect();
|
|
}
|
|
else
|
|
{
|
|
Status = ClientConnectWatcherStatus.StatusReconnectConfirm;
|
|
_reconnectCnt++;
|
|
// UISys.Mgr.ShowUI(GAME_UI_TYPE.Tip_NetDisconn, UISys.Mgr.GetUIWindowParam().SetParam("errCode", m_disconnectReason));
|
|
}
|
|
}
|
|
|
|
void UpdateOnReconnectAuto()
|
|
{
|
|
if (_client.IsEntered)
|
|
{
|
|
Status = ClientConnectWatcherStatus.StatusInit;
|
|
_reconnectCnt = 0;
|
|
return;
|
|
}
|
|
|
|
float nowTime = NowTime;
|
|
var timeoutTime = 10f;
|
|
|
|
if (_statusTime + timeoutTime < nowTime)
|
|
{
|
|
Log.Error("UpdateOnReconnectAuto timeout: {0}", timeoutTime);
|
|
|
|
//切换到默认的,下一帧继续判断是否需要自动还是手动
|
|
Status = ClientConnectWatcherStatus.StatusInit;
|
|
}
|
|
}
|
|
|
|
void UpdateOnReconnectConfirm()
|
|
{
|
|
|
|
}
|
|
|
|
void UpdateOnWaitExit()
|
|
{
|
|
}
|
|
|
|
private void OnDisable()
|
|
{
|
|
Status = ClientConnectWatcherStatus.StatusInit;
|
|
_reconnectCnt = 0;
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
Status = ClientConnectWatcherStatus.StatusInit;
|
|
_reconnectCnt = 0;
|
|
}
|
|
}
|
|
} |