You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

133 lines
4.0 KiB

/*
Sog 游戏基础库
2016 by zouwei
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Sog;
using ProtoCSStruct;
using Sog.IO;
namespace Game
{
public static class StopServerSvc
{
private static int STOP_SERVER_TIME_NOTICE = 15;
private static long m_gmStartStopServerTime = 0;
private static long m_gmStopServerTime = 0;
private static int m_lastNoticeMintue = 0;
private static long m_lastTimeForCheckAllDataSaveToQuit;
public static void StartStopServer(int stopAfterMintue)
{
if(m_gmStartStopServerTime != 0)
{
TraceLog.Debug("StopServerSvc.StartStopServer already stop server at {0}"
, AppTime.ConvertUnixTimeToDateTime(m_gmStartStopServerTime*1000));
return;
}
var notify = new SSGmStopServerNotify();
GameServerUtils.GetPacketSender().SendToWorldServer((int)SSGameMsgID.GmStopServerNotify, ref notify, 0);
GameServerUtils.GetApp().PrepareStop();
STOP_SERVER_TIME_NOTICE = stopAfterMintue;
m_gmStartStopServerTime = GameServerUtils.GetTimeSecond();
// 正式停服时间
m_gmStopServerTime = m_gmStartStopServerTime + STOP_SERVER_TIME_NOTICE * 60 - 1;
TraceLog.Debug("StopServerSvc.StartStopServer stop server after {0} mintue, at {1}"
, STOP_SERVER_TIME_NOTICE, AppTime.ConvertUnixTimeToDateTime(m_gmStopServerTime * 1000));
m_lastNoticeMintue = STOP_SERVER_TIME_NOTICE;
AddNotice(m_lastNoticeMintue);
}
private static void AddNotice(int mintue)
{
SSSysNoticeLamp notify = new SSSysNoticeLamp();
notify.Id = 1;
notify.Params.Add(mintue.ToString());
GameServerUtils.GetPacketSender().SendToWorldServer((int)SSGameMsgID.SysNoticeLamp, ref notify, 0);
}
public static void Tick(long nowMs)
{
TickGmCmdStopCommand(nowMs);
TickCheckAllDataSaveToExit(nowMs);
}
private static void TickGmCmdStopCommand(long nowMs)
{
if(m_gmStartStopServerTime == 0)
{
return;
}
int leftMintue = (int)(m_gmStopServerTime - GameServerUtils.GetTimeSecond()) / 60 + 1;
if(leftMintue < m_lastNoticeMintue && leftMintue > 0)
{
m_lastNoticeMintue = leftMintue;
AddNotice(m_lastNoticeMintue);
}
//执行停服,延迟1秒
if(GameServerUtils.GetTimeSecond() >= m_gmStopServerTime + 1
&& GameServerUtils.GetApp().CurrStopStage != ServerStopStage.stopping)
{
TraceLog.Debug("StopServerSvc.TickGmCmdStopCommand do stop server now");
GameServerUtils.GetApp().StopServer();
}
}
private static void TickCheckAllDataSaveToExit(long nowMs)
{
//没有停服
if (GameServerUtils.GetApp().CurrStopStage != ServerStopStage.stopping)
{
return;
}
//1秒检查一次
if (nowMs - m_lastTimeForCheckAllDataSaveToQuit < 1000)
{
return;
}
m_lastTimeForCheckAllDataSaveToQuit = nowMs;
if (IsAllPlayerSaveSuccess())
{
TraceLog.Debug("StopServerSvc:TickCheckAllDataSaveToQuit all player data save success");
GameServerUtils.GetApp().SetStopSuccess();
//保存文件数据库
ServerDataFileDbSvc.SaveDataToFile();
}
}
private static bool IsAllPlayerSaveSuccess()
{
int iPlayerCount = GameServerUtils.GetPlayerTableOp().Table.m_uidTable.Count;
TraceLog.Trace("StopServerSvc:IsAllPlayerSaveSuccess player object count {0}", iPlayerCount);
return iPlayerCount == 0;
}
}
}