Пример #1
0
        /// <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");
                }
            }
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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");
                }
            }
        }
Пример #4
0
        /// <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);
        }