diff --git a/src/DiIiS-NA/Core/Logging/LogManager.cs b/src/DiIiS-NA/Core/Logging/LogManager.cs index 6bca5c9..dbb1f1d 100644 --- a/src/DiIiS-NA/Core/Logging/LogManager.cs +++ b/src/DiIiS-NA/Core/Logging/LogManager.cs @@ -50,6 +50,11 @@ namespace DiIiS_NA.Core.Logging return Loggers[name]; // return the newly created logger. } + public static Logger CreateLogger([CallerFilePath] string filePath = "") + { + return CreateLogger(typeof(T).Name, filePath); + } + /// /// Attachs a new log target. /// diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/GameManager.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/GameManager.cs index f703915..27cbcc4 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/GameManager.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/GameManager.cs @@ -20,8 +20,8 @@ namespace DiIiS_NA.GameServer.GSSystem.GameSystem public static Game CreateGame(int gameId, int initialLevel) { - if (Games.ContainsKey(gameId)) - return Games[gameId]; + if (Games.TryGetValue(gameId, out var createdGame)) + return createdGame; var game = new Game(gameId, initialLevel); Games.Add(gameId, game); @@ -35,84 +35,98 @@ namespace DiIiS_NA.GameServer.GSSystem.GameSystem public static int GetIdByGame(Game game) { - return !Games.ContainsValue(game) ? -1 : Games.Keys.Where(g => Games[g] == game).First(); + return !Games.ContainsValue(game) ? -1 : Games.Keys.First(g => Games[g] == game); } public static void RemovePlayerFromGame(GameClient gameClient) { - try - { - if (gameClient == null) - { - Logger.Error("RemovePlayerFromGame() gameClient is null!"); - return; - } + try + { + if (gameClient == null) + { + Logger.Error("RemovePlayerFromGame() gameClient is null!"); + return; + } - foreach (var player in gameClient.Game.Players.Keys) - { - if (player == gameClient) - player.SendMessage(new QuitGameMessage() - { - PlayerIndex = gameClient.Player.PlayerIndex, - }); - else - player.SendMessage(new PlayerIndexMessage(Opcodes.PlayerLeaveGameMessage) //PlayerLeaveGameMessage - { - PlayerIndex = gameClient.Player.PlayerIndex, - }); - } + foreach (var player in gameClient.Game.Players.Keys) + { + if (player == gameClient) + player.SendMessage(new QuitGameMessage() + { + PlayerIndex = gameClient.Player.PlayerIndex, + }); + else + player.SendMessage( + new PlayerIndexMessage(Opcodes.PlayerLeaveGameMessage) //PlayerLeaveGameMessage + { + PlayerIndex = gameClient.Player.PlayerIndex, + }); + } - if (gameClient.Game != null) - { - var gameId = gameClient.Game.GameId; - if (!Games.ContainsKey(gameId)) return; + if (gameClient.Game != null) + { + var gameId = gameClient.Game.GameId; + if (!Games.ContainsKey(gameId)) return; - var game = Games[gameId]; - if (!game.Players.ContainsKey(gameClient)) return; + var game = Games[gameId]; + if (!game.Players.ContainsKey(gameClient)) return; - Player p = null; - if (!game.Players.TryRemove(gameClient, out p)) - { - Logger.Error("Can't remove player ({0}) from game with id: {1}", gameClient.Player.Toon.Name, gameId); - return; - } + Player p = null; + if (!game.Players.TryRemove(gameClient, out p)) + { + Logger.Error("Can't remove player ({0}) from game with id: {1}", gameClient.Player.Toon.Name, + gameId); + return; + } - if (p != null) - { + if (p != null) + { - //TODO: Move this inside player OnLeave event - var toon = p.Toon; - toon.TimePlayed += (int)(DateTimeExtensions.ToUnixTime(DateTime.UtcNow) - toon.LoginTime); - toon.ExperienceNext = p.ExperienceNext; + //TODO: Move this inside player OnLeave event + var toon = p.Toon; + toon.TimePlayed += (int)(DateTime.UtcNow.ToUnixTime() - toon.LoginTime); + toon.ExperienceNext = p.ExperienceNext; - ClientSystem.GameServer.GSBackend.PlayerLeft(gameId); + ClientSystem.GameServer.GSBackend.PlayerLeft(gameId); - if (p.InGameClient != null) - { - var minions = p.Followers.Keys.ToList(); - foreach (var minion in minions) - p.DestroyFollowerById(minion); - p.World.Leave(p); - } + if (p.InGameClient != null) + { + var minions = p.Followers.Keys.ToList(); + foreach (var minion in minions) + p.DestroyFollowerById(minion); + p.World.Leave(p); + } - if (gameClient.BnetClient != null) - { - gameClient.BnetClient.Account.GameAccount.ScreenStatus = D3.PartyMessage.ScreenStatus.CreateBuilder().SetScreen(1).SetStatus(0).Build(); - gameClient.BnetClient.Account.GameAccount.NotifyUpdate(); - - } - else - { - try { ClientSystem.GameServer.GSBackend.UpdateClient(toon.GameAccount.PersistentID, toon.Level, 1); } catch { Logger.Warn("Exception on RemovePlayerFromGame()"); } - } - } - } - else - { - Logger.Error("RemovePlayerFromGame() gameClient.Game is null!"); - } - } - catch { } + if (gameClient.BnetClient != null) + { + gameClient.BnetClient.Account.GameAccount.ScreenStatus = D3.PartyMessage.ScreenStatus + .CreateBuilder().SetScreen(1).SetStatus(0).Build(); + gameClient.BnetClient.Account.GameAccount.NotifyUpdate(); + + } + else + { + try + { + ClientSystem.GameServer.GSBackend.UpdateClient(toon.GameAccount.PersistentID, + toon.Level, 1); + } + catch + { + Logger.Warn("Exception on RemovePlayerFromGame()"); + } + } + } + } + else + { + Logger.Error("RemovePlayerFromGame() gameClient.Game is null!"); + } + } + catch (Exception ex) + { + Logger.ErrorException(ex, nameof(RemovePlayerFromGame)); + } } } } diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/GameUpdateManager.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/GameUpdateManager.cs index 082d777..482d137 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/GameUpdateManager.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/GameUpdateManager.cs @@ -6,11 +6,12 @@ using DiIiS_NA.Core.Logging; namespace DiIiS_NA.GameServer.GSSystem.GameSystem { - public static class GameUpdateManager - { - private static readonly Logger Logger = LogManager.CreateLogger("ThreadSystem"); + [Obsolete("Doesn't seem to be used anywhere, and may use more resources.")] + public class GameUpdateManager + { + private static readonly Logger Logger = LogManager.CreateLogger(); - private static List UpdateWorkers = new List(); + private static readonly List _updateWorkers = new(); static GameUpdateManager() { @@ -21,18 +22,20 @@ namespace DiIiS_NA.GameServer.GSSystem.GameSystem int CPUCount = Environment.ProcessorCount; for (int coreId = 0; coreId < CPUCount; coreId++) { - var thread = new GameUpdateThread(); - thread.CPUAffinity = (1UL << coreId); - UpdateWorkers.Add(thread); + var thread = new GameUpdateThread + { + CPUAffinity = (1UL << coreId) + }; + _updateWorkers.Add(thread); var loopThread = new Thread(thread.Run) { Name = "UpdateWorkerThread", IsBackground = true }; ; // create the game update thread. loopThread.Start(); } - Logger.Info("Запущено {0} потоков", CPUCount); + Logger.Info("Using {0} worker threads for game updates.", CPUCount); } public static GameUpdateThread FindWorker() { - return UpdateWorkers.OrderBy(t => t.Games.Count).First(); + return _updateWorkers.OrderBy(t => t.Games.Count).First(); } } } diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/GameUpdateThread.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/GameUpdateThread.cs index 53a1867..81ff062 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/GameUpdateThread.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/GameUpdateThread.cs @@ -20,20 +20,14 @@ namespace DiIiS_NA.GameServer.GSSystem.GameSystem [DllImport("libc.so.6")] private static extern int sched_setaffinity(int pid, IntPtr cpusetsize, ref ulong cpuset); - private int CurrentTId - { - get - { - return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? GetCurrentThreadId() : getpid(); - } - } + private int CurrentTId => RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? GetCurrentThreadId() : getpid(); - private static readonly Logger Logger = LogManager.CreateLogger(); + private static readonly Logger Logger = LogManager.CreateLogger(); public List Games = new List(); private object _lock = new object(); - public ulong CPUAffinity = 0; + public ulong CPUAffinity { get; } public void Run() {