diff --git a/Common/Data/ResourceManager.cs b/Common/Data/ResourceManager.cs index 2129d532..be53a787 100644 --- a/Common/Data/ResourceManager.cs +++ b/Common/Data/ResourceManager.cs @@ -16,6 +16,7 @@ namespace EggLink.DanhengServer.Data; public class ResourceManager { public static Logger Logger { get; } = new("ResourceManager"); + public static bool IsLoaded { get; set; } public static void LoadGameData() { diff --git a/Common/Internationalization/Message/LanguageCHS.cs b/Common/Internationalization/Message/LanguageCHS.cs index 506ace6b..dc75c665 100644 --- a/Common/Internationalization/Message/LanguageCHS.cs +++ b/Common/Internationalization/Message/LanguageCHS.cs @@ -124,6 +124,7 @@ public class CommandTextCHS /// public class WebTextCHS { + public string Maintain => "服务器正在维修,请稍后尝试。"; } /// diff --git a/Common/Internationalization/Message/LanguageCHT.cs b/Common/Internationalization/Message/LanguageCHT.cs index 227433e4..41a973a4 100644 --- a/Common/Internationalization/Message/LanguageCHT.cs +++ b/Common/Internationalization/Message/LanguageCHT.cs @@ -124,6 +124,7 @@ public class CommandTextCHT /// public class WebTextCHT { + public string Maintain => "服务器正在维修,请稍后尝试。"; } /// diff --git a/Common/Internationalization/Message/LanguageEN.cs b/Common/Internationalization/Message/LanguageEN.cs index 39f74b9b..feaf09cb 100644 --- a/Common/Internationalization/Message/LanguageEN.cs +++ b/Common/Internationalization/Message/LanguageEN.cs @@ -124,6 +124,7 @@ public class CommandTextEN /// public class WebTextEN { + public string Maintain => "The server is undergoing maintenance, please try again later."; } /// diff --git a/GameServer/Server/Packet/Recv/Player/HandlerPlayerGetTokenCsReq.cs b/GameServer/Server/Packet/Recv/Player/HandlerPlayerGetTokenCsReq.cs index d505f2b2..af4ebb9f 100644 --- a/GameServer/Server/Packet/Recv/Player/HandlerPlayerGetTokenCsReq.cs +++ b/GameServer/Server/Packet/Recv/Player/HandlerPlayerGetTokenCsReq.cs @@ -1,4 +1,5 @@ -using EggLink.DanhengServer.Database; +using EggLink.DanhengServer.Data; +using EggLink.DanhengServer.Database; using EggLink.DanhengServer.Database.Account; using EggLink.DanhengServer.Database.Player; using EggLink.DanhengServer.GameServer.Game.Player; @@ -19,8 +20,13 @@ public class HandlerPlayerGetTokenCsReq : Handler var account = DatabaseHelper.Instance?.GetInstance(int.Parse(req.AccountUid)); if (account == null) { - await connection.SendPacket(new PacketPlayerGetTokenScRsp()); - await connection.SendPacket(new PacketPlayerKickOutScNotify()); + await connection.SendPacket(new PacketPlayerGetTokenScRsp(0, Retcode.RetNotInWhiteList)); + return; + } + + if (!ResourceManager.IsLoaded) + { + // resource manager not loaded, return return; } @@ -32,13 +38,13 @@ public class HandlerPlayerGetTokenCsReq : Handler } connection.State = SessionStateEnum.WAITING_FOR_LOGIN; + var pd = DatabaseHelper.Instance?.GetInstance(int.Parse(req.AccountUid)); - if (pd == null) - connection.Player = new PlayerInstance(int.Parse(req.AccountUid)); - else - connection.Player = new PlayerInstance(pd); + connection.Player = pd == null ? new PlayerInstance(int.Parse(req.AccountUid)) : new PlayerInstance(pd); + connection.DebugFile = Path.Combine(ConfigManager.Config.Path.LogPath, "Debug/", $"{req.AccountUid}/", $"Debug-{DateTime.Now:yyyy-MM-dd HH-mm-ss}.log"); + await connection.Player.OnGetToken(); connection.Player.Connection = connection; await connection.SendPacket(new PacketPlayerGetTokenScRsp(connection)); diff --git a/GameServer/Server/Packet/Send/Player/PacketPlayerGetTokenScRsp.cs b/GameServer/Server/Packet/Send/Player/PacketPlayerGetTokenScRsp.cs index 73259af0..009b2335 100644 --- a/GameServer/Server/Packet/Send/Player/PacketPlayerGetTokenScRsp.cs +++ b/GameServer/Server/Packet/Send/Player/PacketPlayerGetTokenScRsp.cs @@ -16,11 +16,14 @@ public class PacketPlayerGetTokenScRsp : BasePacket SetData(rsp); } - public PacketPlayerGetTokenScRsp() : base(CmdIds.PlayerGetTokenScRsp) + public PacketPlayerGetTokenScRsp(uint uid, Retcode ret, BlackInfo? black = null, string msg = "") : base(CmdIds.PlayerGetTokenScRsp) { var rsp = new PlayerGetTokenScRsp { - Retcode = 0 + Retcode = (uint)ret, + BlackInfo = black ?? new BlackInfo(), + Msg = msg, + Uid = uid }; SetData(rsp); diff --git a/GameServer/Server/Packet/Send/Player/PacketPlayerKickOutScNotify.cs b/GameServer/Server/Packet/Send/Player/PacketPlayerKickOutScNotify.cs index 59cc6294..2de34ac9 100644 --- a/GameServer/Server/Packet/Send/Player/PacketPlayerKickOutScNotify.cs +++ b/GameServer/Server/Packet/Send/Player/PacketPlayerKickOutScNotify.cs @@ -13,4 +13,19 @@ public class PacketPlayerKickOutScNotify : BasePacket }; SetData(proto); } + + public PacketPlayerKickOutScNotify(KickType type, BlackInfo? info = null) : base(CmdIds.PlayerKickOutScNotify) + { + var proto = new PlayerKickOutScNotify + { + KickType = type + }; + + if (info != null) + { + proto.BlackInfo = info; + } + + SetData(proto); + } } \ No newline at end of file diff --git a/Program/Program/EntryPoint.cs b/Program/Program/EntryPoint.cs index ac49a671..41623a25 100644 --- a/Program/Program/EntryPoint.cs +++ b/Program/Program/EntryPoint.cs @@ -82,20 +82,6 @@ public class EntryPoint return; } - // Load the game data - Logger.Info(I18NManager.Translate("Server.ServerInfo.LoadingItem", I18NManager.Translate("Word.GameData"))); - try - { - ResourceManager.LoadGameData(); - } - catch (Exception e) - { - Logger.Error( - I18NManager.Translate("Server.ServerInfo.FailedToLoadItem", I18NManager.Translate("Word.GameData")), e); - Console.ReadLine(); - return; - } - // Initialize the database try { @@ -113,6 +99,31 @@ public class EntryPoint return; } + HandlerManager.Init(); + + WebProgram.Main([], GetConfig().HttpServer.Port, GetConfig().HttpServer.GetBindDisplayAddress()); + Logger.Info(I18NManager.Translate("Server.ServerInfo.ServerRunning", I18NManager.Translate("Word.Dispatch"), + GetConfig().HttpServer.GetDisplayAddress())); + + DanhengListener.BaseConnection = typeof(Connection); + DanhengListener.StartListener(); + + GenerateLogMap(); + + // Load the game data + Logger.Info(I18NManager.Translate("Server.ServerInfo.LoadingItem", I18NManager.Translate("Word.GameData"))); + try + { + ResourceManager.LoadGameData(); + } + catch (Exception e) + { + Logger.Error( + I18NManager.Translate("Server.ServerInfo.FailedToLoadItem", I18NManager.Translate("Word.GameData")), e); + Console.ReadLine(); + return; + } + // Register the command handlers try { @@ -200,23 +211,15 @@ public class EntryPoint // generate the handbook HandbookGenerator.Generate(); - HandlerManager.Init(); - - WebProgram.Main([], GetConfig().HttpServer.Port, GetConfig().HttpServer.GetBindDisplayAddress()); - Logger.Info(I18NManager.Translate("Server.ServerInfo.ServerRunning", I18NManager.Translate("Word.Dispatch"), - GetConfig().HttpServer.GetDisplayAddress())); - - DanhengListener.BaseConnection = typeof(Connection); - DanhengListener.StartListener(); - var elapsed = DateTime.Now - time; Logger.Info(I18NManager.Translate("Server.ServerInfo.ServerStarted", Math.Round(elapsed.TotalSeconds, 2).ToString(CultureInfo.InvariantCulture))); - GenerateLogMap(); - if (GetConfig().ServerOption.EnableMission) Logger.Warn(I18NManager.Translate("Server.ServerInfo.MissionEnabled")); + + ResourceManager.IsLoaded = true; + CommandManager.Start(); } diff --git a/WebServer/Controllers/MuipServerRoutes.cs b/WebServer/Controllers/MuipServerRoutes.cs index df0b7a9c..8108df79 100644 --- a/WebServer/Controllers/MuipServerRoutes.cs +++ b/WebServer/Controllers/MuipServerRoutes.cs @@ -45,6 +45,18 @@ public class MuipServerRoutes return new JsonResult(resp); } + + [HttpGet("/server/type")] + public IActionResult DanhengVerify() + { + return new ContentResult + { + Content = + "{\"serverType\": \"DanhengServer\"}", + ContentType = "application/json" + }; + } + [HttpPost("/muip/server_information")] public IActionResult GetServerInformationPost([FromBody] ServerInformationRequest req) { diff --git a/WebServer/Handler/QueryGatewayHandler.cs b/WebServer/Handler/QueryGatewayHandler.cs index fd8b1a2e..33dd606a 100644 --- a/WebServer/Handler/QueryGatewayHandler.cs +++ b/WebServer/Handler/QueryGatewayHandler.cs @@ -1,4 +1,6 @@ -using EggLink.DanhengServer.Proto; +using EggLink.DanhengServer.Data; +using EggLink.DanhengServer.Internationalization; +using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Util; using Google.Protobuf; @@ -20,7 +22,7 @@ internal class QueryGatewayHandler RegionName = config.GameServer.GameServerId, Ip = config.GameServer.PublicAddress, Port = config.GameServer.Port, - Msg = "Access verification failed. Please check if you have logged in to the correct account and server.", + Msg = I18NManager.Translate("Server.Web.Maintain"), Unk1 = true, Unk2 = true, Unk3 = true, @@ -30,6 +32,11 @@ internal class QueryGatewayHandler Unk7 = true }; + if (!ResourceManager.IsLoaded) + { + gateServer.Retcode = 2; + } + if (urlData.AssetBundleUrl != null && urlData.AssetBundleUrl.Length > 0) gateServer.AssetBundleUrl = urlData.AssetBundleUrl;