public async Task Handle(WorldClient client, SelectCharacterPacket packet) { var character = await _characterFactory.CreateCharacter(client.UserId, packet.CharacterId); if (character is null) { _packetFactory.SendCharacterSelected(client, false, 0); return; } var ok = _gameWorld.TryLoadPlayer(character); if (!ok) { _packetFactory.SendCharacterSelected(client, false, 0); return; } _packetFactory.SendCharacterSelected(client, true, character.Id); _packetFactory.SendWorldDay(client); // TODO: why do we need it? _packetFactory.SendGuildList(client, await _guildManager.GetAllGuilds(_countryProvider.Country == CountryType.Light ? Fraction.Light : Fraction.Dark)); var online = new List <DbCharacter>(); var notOnline = new List <DbCharacter>(); foreach (var m in _guildManager.GuildMembers) { if (_gameWorld.Players.ContainsKey(m.Id)) { online.Add(m); } else { notOnline.Add(m); } } _packetFactory.SendGuildMembersOnline(client, online, true); _packetFactory.SendGuildMembersOnline(client, notOnline, false); _packetFactory.SendDetails(client, character); _packetFactory.SendAdditionalStats(client, character); _packetFactory.SendCurrentHitpoints(client, character.HealthManager.CurrentHP, character.HealthManager.CurrentMP, character.HealthManager.CurrentSP); _packetFactory.SendInventoryItems(client, character.InventoryManager.InventoryItems.Values); // WARNING: some servers expanded invetory to 6 bags(os is 5 bags), if you send item in 6 bag, client will crash! foreach (var item in character.InventoryManager.InventoryItems.Values.Where(i => i.ExpirationTime != null)) { _packetFactory.SendItemExpiration(client, item); } _packetFactory.SendLearnedSkills(client, character); _packetFactory.SendOpenQuests(client, character.QuestsManager.Quests.Where(q => !q.IsFinished)); _packetFactory.SendFinishedQuests(client, character.QuestsManager.Quests.Where(q => q.IsFinished)); _packetFactory.SendActiveBuffs(client, character.BuffsManager.ActiveBuffs); _packetFactory.SendFriends(client, character.FriendsManager.Friends.Values); _packetFactory.SendBlessAmount(client, character.CountryProvider.Country, character.CountryProvider.Country == CountryType.Light ? Bless.Instance.LightAmount : Bless.Instance.DarkAmount, Bless.Instance.RemainingTime); _packetFactory.SendBankItems(client, character.BankManager.BankItems.Values); _packetFactory.SendWarehouseItems(client, character.WarehouseManager.Items.Values); _packetFactory.SendTeleportSavedPositions(client, character.TeleportationManager.SavedPositions); if (character.GuildManager.HasGuild) { _packetFactory.SendGuildNpcs(client, await character.GuildManager.GetGuildNpcs()); } _packetFactory.SendAutoStats(client, _statsManager.AutoStr, _statsManager.AutoDex, _statsManager.AutoRec, _statsManager.AutoInt, _statsManager.AutoWis, _statsManager.AutoLuc); #if !EP8_V2 _packetFactory.SendAccountPoints(client, character.AdditionalInfoManager.Points); // WARNING: This is necessary if you have an in-game item mall. #endif _packetFactory.SendSkillBar(client, character.QuickItems); // Should be always the last! Changes packet encryption to xor! client.CryptoManager.UseExpandedKey = true; }