small.
This commit is contained in:
parent
bf2a4fdcfa
commit
03ba08341c
@ -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>
|
||||
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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()
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
user.block.title