This commit is contained in:
Lucca (Droppy) 2024-04-29 06:04:43 +00:00
parent bf2a4fdcfa
commit 03ba08341c
4 changed files with 101 additions and 85 deletions

View File

@ -50,6 +50,11 @@ namespace DiIiS_NA.Core.Logging
return Loggers[name]; // return the newly created logger.
}
public static Logger CreateLogger<T>([CallerFilePath] string filePath = "")
{
return CreateLogger(typeof(T).Name, filePath);
}
/// <summary>
/// Attachs a new log target.
/// </summary>

View File

@ -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));
}
}
}
}

View File

@ -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<GameUpdateManager>();
private static List<GameUpdateThread> UpdateWorkers = new List<GameUpdateThread>();
private static readonly List<GameUpdateThread> _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();
}
}
}

View File

@ -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<Game> Games = new List<Game>();
private object _lock = new object();
public ulong CPUAffinity = 0;
public ulong CPUAffinity { get; }
public void Run()
{