/// <inheritdoc /> public void RemovePlayer(int characterId) { Character player; if (Players.TryRemove(characterId, out player)) { _logger.LogDebug($"Player {characterId} left game world"); TradeManagers.TryRemove(characterId, out var tradeManager); tradeManager.Dispose(); PartyManagers.TryRemove(characterId, out var partyManager); partyManager.Dispose(); DuelManagers.TryRemove(characterId, out var duelManager); duelManager.Dispose(); player.Client.OnPacketArrived -= Client_OnPacketArrived; var map = Maps[player.MapId]; map.UnloadPlayer(player); player.Dispose(); } else { // 0 means, that connection with client was lost, when he was in character selection screen. if (characterId != 0) { _logger.LogError($"Couldn't remove player {characterId} from game world"); } } }
/// <inheritdoc /> public async Task <Character> LoadPlayer(int characterId, WorldClient client) { using var database = DependencyContainer.Instance.Resolve <IDatabase>(); var dbCharacter = await database.Characters.Include(c => c.Skills).ThenInclude(cs => cs.Skill) .Include(c => c.Items).ThenInclude(ci => ci.Item) .Include(c => c.ActiveBuffs).ThenInclude(cb => cb.Skill) .Include(c => c.Friends).ThenInclude(cf => cf.Friend) .Include(c => c.Quests) .Include(c => c.QuickItems) .Include(c => c.User) .FirstOrDefaultAsync(c => c.Id == characterId); var newPlayer = Character.FromDbCharacter(dbCharacter, DependencyContainer.Instance.Resolve <ILogger <Character> >(), this, _characterConfig, _taskQueue, _databasePreloader, DependencyContainer.Instance.Resolve <IChatManager>(), DependencyContainer.Instance.Resolve <ILinkingManager>(), DependencyContainer.Instance.Resolve <IDyeingManager>()); newPlayer.Client = client; Players.TryAdd(newPlayer.Id, newPlayer); TradeManagers.TryAdd(newPlayer.Id, new TradeManager(this, newPlayer)); PartyManagers.TryAdd(newPlayer.Id, new PartyManager(this, newPlayer)); DuelManagers.TryAdd(newPlayer.Id, new DuelManager(this, newPlayer)); _logger.LogDebug($"Player {newPlayer.Id} connected to game world"); newPlayer.Client.OnPacketArrived += Client_OnPacketArrived; return(newPlayer); }
/// <inheritdoc /> public void RemovePlayer(int characterId) { Character player; if (Players.TryRemove(characterId, out player)) { _logger.LogDebug($"Player {characterId} left game world"); TradeManagers.TryRemove(characterId, out var tradeManager); tradeManager.Dispose(); PartyManagers.TryRemove(characterId, out var partyManager); partyManager.Dispose(); DuelManagers.TryRemove(characterId, out var duelManager); duelManager.Dispose(); player.Client.OnPacketArrived -= Client_OnPacketArrived; IMap map = null; // Try find player's map. if (Maps.ContainsKey(player.MapId)) { map = Maps[player.MapId]; } else if (player.Party != null && PartyMaps.ContainsKey(player.Party.Id)) { map = PartyMaps[player.Party.Id]; } else if (PartyMaps.ContainsKey(player.PreviousPartyId)) { map = PartyMaps[player.PreviousPartyId]; } if (map is null) { _logger.LogError($"Couldn't find character's {characterId} map {player.MapId}."); } else { map.UnloadPlayer(player); } player.Dispose(); } else { // 0 means, that connection with client was lost, when he was in character selection screen. if (characterId != 0) { _logger.LogError($"Couldn't remove player {characterId} from game world"); } } }
/// <inheritdoc /> public async Task <Character> LoadPlayer(int characterId, WorldClient client) { var newPlayer = await _characterFactory.CreateCharacter(characterId, client); if (newPlayer is null) { return(null); } Players.TryAdd(newPlayer.Id, newPlayer); TradeManagers.TryAdd(newPlayer.Id, new TradeManager(this, newPlayer)); PartyManagers.TryAdd(newPlayer.Id, new PartyManager(this, newPlayer)); DuelManagers.TryAdd(newPlayer.Id, new DuelManager(this, newPlayer)); _logger.LogDebug($"Player {newPlayer.Id} connected to game world"); newPlayer.Client.OnPacketArrived += Client_OnPacketArrived; return(newPlayer); }