/// <summary> /// Composes the specified session. /// </summary> /// <param name="session">The session.</param> /// <param name="quest">The quest.</param> /// <returns>ServerMessage.</returns> internal static ServerMessage Compose(GameClient session, Quest quest) { var amountOfQuestsInCategory = Azure.GetGame().GetQuestManager().GetAmountOfQuestsInCategory(quest.Category); var i = (quest == null) ? amountOfQuestsInCategory : quest.Number; var i2 = (quest == null) ? 0 : session.GetHabbo().GetQuestProgress(quest.Id); var serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("QuestCompletedMessageComposer")); serverMessage.AppendString(quest.Category); serverMessage.AppendInteger(i); serverMessage.AppendInteger(quest.Name.Contains("xmas2012") ? 1 : amountOfQuestsInCategory); serverMessage.AppendInteger((quest == null) ? 3 : quest.RewardType); serverMessage.AppendInteger((quest == null) ? 0u : quest.Id); serverMessage.AppendBool(quest != null && session.GetHabbo().CurrentQuestId == quest.Id); serverMessage.AppendString((quest == null) ? string.Empty : quest.ActionName); serverMessage.AppendString((quest == null) ? string.Empty : quest.DataBit); serverMessage.AppendInteger((quest == null) ? 0 : quest.Reward); serverMessage.AppendString((quest == null) ? string.Empty : quest.Name); serverMessage.AppendInteger(i2); serverMessage.AppendInteger((quest == null) ? 0u : quest.GoalData); serverMessage.AppendInteger((quest == null) ? 0 : quest.TimeUnlock); serverMessage.AppendString(""); serverMessage.AppendString(""); serverMessage.AppendBool(true); serverMessage.AppendBool(true); return serverMessage; }
/// <summary> /// Composes the index. /// </summary> /// <param name="rank">The rank.</param> /// <param name="type">The type.</param> /// <returns>ServerMessage.</returns> internal static ServerMessage ComposeIndex(uint rank, string type) { IEnumerable<CatalogPage> pages = Azure.GetGame().GetCatalog().Categories.Values.OfType<CatalogPage>().ToList(); var sortedPages = pages.Where(x => x.ParentId == -2 && x.MinRank <= rank).OrderBy(x => x.OrderNum); if (type == "NORMAL") sortedPages = pages.Where(x => x.ParentId == -1 && x.MinRank <= rank).OrderBy(x => x.OrderNum); var message = new ServerMessage(LibraryParser.OutgoingRequest("CatalogueIndexMessageComposer")); message.AppendBool(true); message.AppendInteger(0); message.AppendInteger(-1); message.AppendString("root"); message.AppendString(string.Empty); message.AppendInteger(0); message.AppendInteger(sortedPages.Count()); foreach (var cat in sortedPages) { message.AppendBool(cat.Visible); message.AppendInteger(cat.IconImage); message.AppendInteger(cat.PageId); message.AppendString(cat.CodeName); message.AppendString(cat.Caption); message.AppendInteger(cat.FlatOffers.Count); foreach (var i in cat.FlatOffers.Keys) message.AppendInteger(i); var sortedSubPages = pages.Where(x => x.ParentId == cat.PageId && x.MinRank <= rank).OrderBy(x => x.OrderNum); message.AppendInteger(sortedSubPages.Count()); foreach (var subCat in sortedSubPages) { message.AppendBool(subCat.Visible); message.AppendInteger(subCat.IconImage); message.AppendInteger(subCat.PageId); message.AppendString(subCat.CodeName); message.AppendString(subCat.Caption); message.AppendInteger(subCat.FlatOffers.Count); foreach (var i2 in subCat.FlatOffers.Keys) message.AppendInteger(i2); message.AppendInteger(0); } } message.AppendBool(false); message.AppendString(type); return message; }
/// <summary> /// Searializes the specified reply. /// </summary> /// <param name="reply">The reply.</param> internal void Searialize(ServerMessage reply) { reply.AppendInteger(UserId); reply.AppendString(UserName); reply.AppendString(Motto); reply.AppendBool(AzureEmulator.GetGame().GetClientManager().GetClient(UserId) != null); reply.AppendBool(false); reply.AppendString(string.Empty); reply.AppendInteger(0); reply.AppendString(Look); reply.AppendString(LastOnline); }
/// <summary> /// Composes the club purchase page. /// </summary> /// <param name="session">The session.</param> /// <param name="windowId">The window identifier.</param> /// <returns>ServerMessage.</returns> internal static ServerMessage ComposeClubPurchasePage(GameClient session, int windowId) { var message = new ServerMessage(LibraryParser.OutgoingRequest("CatalogueClubPageMessageComposer")); var habboClubItems = AzureEmulator.GetGame().GetCatalog().HabboClubItems; message.AppendInteger(habboClubItems.Count); foreach (var item in habboClubItems) { message.AppendInteger(item.Id); message.AppendString(item.Name); message.AppendBool(false); message.AppendInteger(item.CreditsCost); if (item.DiamondsCost > 0) { message.AppendInteger(item.DiamondsCost); message.AppendInteger(105); } else { message.AppendInteger(item.DucketsCost); message.AppendInteger(0); } message.AppendBool(true); var fuckingArray = item.Name.Split('_'); double dayTime = 31; if (item.Name.Contains("DAY")) dayTime = int.Parse(fuckingArray[3]); else if (item.Name.Contains("MONTH")) { var monthTime = int.Parse(fuckingArray[3]); dayTime = monthTime * 31; } else if (item.Name.Contains("YEAR")) { var yearTimeOmg = int.Parse(fuckingArray[3]); dayTime = yearTimeOmg * 31 * 12; } var newExpiryDate = DateTime.Now.AddDays(dayTime); if (session.GetHabbo().GetSubscriptionManager().HasSubscription) newExpiryDate = AzureEmulator.UnixToDateTime(session.GetHabbo().GetSubscriptionManager().GetSubscription().ExpireTime) .AddDays(dayTime); message.AppendInteger((int)dayTime / 31); message.AppendInteger((int)dayTime); message.AppendBool(false);// can gift message.AppendInteger((int)dayTime); message.AppendInteger(newExpiryDate.Year); message.AppendInteger(newExpiryDate.Month); message.AppendInteger(newExpiryDate.Day); } message.AppendInteger(windowId); return message; }
/// <summary> /// Serializes the search result list flatcats. /// </summary> /// <param name="flatCatId">The flat cat identifier.</param> /// <param name="direct">if set to <c>true</c> [direct].</param> /// <param name="message">The message.</param> internal static void SerializeSearchResultListFlatcats(int flatCatId, bool direct, ServerMessage message) { var flatCat = Azure.GetGame().GetNavigator().GetFlatCat(flatCatId); if (flatCat == null) return; message.AppendString($"category__{flatCat.Caption}"); message.AppendString(flatCat.Caption); message.AppendInteger(0); message.AppendBool(true); message.AppendInteger(-1); try { var rooms = Azure.GetGame().GetRoomManager().GetActiveRooms(); Azure.GetGame() .GetNavigator() .SerializeNavigatorPopularRoomsNews(ref message, rooms, flatCatId, direct); } catch { message.AppendInteger(0); } }
/// <summary> /// Composes the specified session. /// </summary> /// <param name="session">The session.</param> /// <param name="achievements">The achievements.</param> /// <returns>ServerMessage.</returns> internal static ServerMessage Compose(GameClient session, List<Achievement> achievements) { var serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("AchievementListMessageComposer")); serverMessage.AppendInteger(achievements.Count); foreach (var achievement in achievements) { var achievementData = session.GetHabbo().GetAchievementData(achievement.GroupName); var i = achievementData?.Level + 1 ?? 1; var count = achievement.Levels.Count; if (i > count) i = count; var achievementLevel = achievement.Levels[i]; var oldLevel = (achievement.Levels.ContainsKey(i - 1)) ? achievement.Levels[i - 1] : achievementLevel; serverMessage.AppendInteger(achievement.Id); serverMessage.AppendInteger(i); serverMessage.AppendString($"{achievement.GroupName}{i}"); serverMessage.AppendInteger(oldLevel.Requirement); serverMessage.AppendInteger(achievementLevel.Requirement); serverMessage.AppendInteger(achievementLevel.RewardPoints); serverMessage.AppendInteger(0); serverMessage.AppendInteger(achievementData?.Progress ?? 0); if (achievementData == null) serverMessage.AppendBool(false); else if (achievementData.Value.Level >= count) serverMessage.AppendBool(true); else serverMessage.AppendBool(false); serverMessage.AppendString(achievement.Category); serverMessage.AppendString(string.Empty); serverMessage.AppendInteger(count); serverMessage.AppendInteger(0); } serverMessage.AppendString(string.Empty); return serverMessage; }
internal void Serialize(ref ServerMessage message) { var habbo = Azure.GetHabboById(UserId); message.AppendInteger(Azure.DifferenceInMilliSeconds(TimeStamp, DateTime.Now)); message.AppendInteger(UserId); message.AppendString(habbo == null ? "*User not found*" : habbo.UserName); message.AppendString(Message); message.AppendBool(GlobalMessage); }
/// <summary> /// Composes the specified session. /// </summary> /// <param name="session">The session.</param> /// <param name="quests">The quests.</param> /// <param name="send">if set to <c>true</c> [send].</param> /// <returns>ServerMessage.</returns> internal static ServerMessage Compose(GameClient session, List<Quest> quests, bool send) { var dictionary = new Dictionary<string, int>(); var dictionary2 = new Dictionary<string, Quest>(); foreach (var current in quests) { if (!current.Category.Contains("xmas2012")) { if (!dictionary.ContainsKey(current.Category)) { dictionary.Add(current.Category, 1); dictionary2.Add(current.Category, null); } if (current.Number >= dictionary[current.Category]) { var questProgress = session.GetHabbo().GetQuestProgress(current.Id); if (session.GetHabbo().CurrentQuestId != current.Id && questProgress >= current.GoalData) { dictionary[current.Category] = (current.Number + 1); } } } } foreach (var current2 in quests) { foreach (var current3 in dictionary) { if (!current2.Category.Contains("xmas2012") && current2.Category == current3.Key && current2.Number == current3.Value) { dictionary2[current3.Key] = current2; break; } } } var serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("QuestListMessageComposer")); serverMessage.AppendInteger(dictionary2.Count); foreach (var current4 in dictionary2) { if (current4.Value != null) { SerializeQuest(serverMessage, session, current4.Value, current4.Key); } } foreach (var current5 in dictionary2) { if (current5.Value == null) { SerializeQuest(serverMessage, session, current5.Value, current5.Key); } } serverMessage.AppendBool(send); return serverMessage; }
public override bool Execute(GameClient session, string[] pms) { session.GetHabbo().NewNavigator = !session.GetHabbo().NewNavigator; var msg = new ServerMessage(LibraryParser.OutgoingRequest("SendPerkAllowancesMessageComposer")); msg.AppendInteger(1); msg.AppendString("NAVIGATOR_PHASE_TWO_2014"); msg.AppendString(""); msg.AppendBool(session.GetHabbo().NewNavigator); session.SendMessage(msg); return true; }
/// <summary> /// Composes the specified session. /// </summary> /// <param name="Session">The session.</param> /// <param name="Achievements">The achievements.</param> /// <returns>ServerMessage.</returns> internal static ServerMessage Compose(GameClient Session, List<Achievement> Achievements) { var serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("AchievementListMessageComposer")); serverMessage.AppendInteger(Achievements.Count); foreach (Achievement achievement in Achievements) { UserAchievement achievementData = Session.GetHabbo().GetAchievementData(achievement.GroupName); int i = achievementData != null ? (achievementData.Level + 1) : 1; int count = achievement.Levels.Count; if (i > count) i = count; AchievementLevel achievementLevel = achievement.Levels[i]; AchievementLevel oldLevel = (achievement.Levels.ContainsKey(i - 1)) ? achievement.Levels[i - 1] : achievementLevel; serverMessage.AppendInteger(achievement.Id); serverMessage.AppendInteger(i); serverMessage.AppendString(string.Format("{0}{1}", achievement.GroupName, i)); serverMessage.AppendInteger(oldLevel.Requirement); serverMessage.AppendInteger(achievementLevel.Requirement); serverMessage.AppendInteger(achievementLevel.RewardPoints); serverMessage.AppendInteger(0); serverMessage.AppendInteger(achievementData != null ? achievementData.Progress : 0); if (achievementData == null) serverMessage.AppendBool(false); else if (achievementData.Level >= count) serverMessage.AppendBool(true); else serverMessage.AppendBool(false); serverMessage.AppendString(achievement.Category); serverMessage.AppendString(string.Empty); serverMessage.AppendInteger(count); serverMessage.AppendInteger(0); } serverMessage.AppendString(""); return serverMessage; }
/// <summary> /// Gets the packet. /// </summary> /// <returns>ServerMessage.</returns> internal ServerMessage GetPacket() { var serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("EffectsInventoryMessageComposer")); serverMessage.AppendInteger(_effects.Count); foreach (var current in _effects) { serverMessage.AppendInteger(current.EffectId); serverMessage.AppendInteger(current.Type); // type (0 : normal - 1 : costume) serverMessage.AppendInteger(current.TotalDuration); serverMessage.AppendInteger(0); // count (0 : 1 - 1 : 2 ...) serverMessage.AppendInteger(current.TimeLeft); serverMessage.AppendBool(current.TotalDuration == -1); // permanent } return serverMessage; }
/// <summary> /// Composes the specified achievement. /// </summary> /// <param name="Achievement">The achievement.</param> /// <param name="TargetLevel">The target level.</param> /// <param name="TargetLevelData">The target level data.</param> /// <param name="TotalLevels">The total levels.</param> /// <param name="UserData">The user data.</param> /// <returns>ServerMessage.</returns> internal static ServerMessage Compose(Achievement Achievement, int TargetLevel, AchievementLevel TargetLevelData, int TotalLevels, UserAchievement UserData) { var serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("AchievementProgressMessageComposer")); serverMessage.AppendInteger(Achievement.Id); serverMessage.AppendInteger(TargetLevel); serverMessage.AppendString(string.Format("{0}{1}", Achievement.GroupName, TargetLevel)); serverMessage.AppendInteger(TargetLevelData.Requirement); serverMessage.AppendInteger(TargetLevelData.Requirement); serverMessage.AppendInteger(TargetLevelData.RewardPixels); serverMessage.AppendInteger(0); serverMessage.AppendInteger(UserData != null ? UserData.Progress : 0); serverMessage.AppendBool(UserData != null && UserData.Level >= TotalLevels); serverMessage.AppendString(Achievement.Category); serverMessage.AppendString(string.Empty); serverMessage.AppendInteger(TotalLevels); serverMessage.AppendInteger(0); return serverMessage; }
/// <summary> /// Composes the specified achievement. /// </summary> /// <param name="achievement">The achievement.</param> /// <param name="level">The level.</param> /// <param name="pointReward">The point reward.</param> /// <param name="pixelReward">The pixel reward.</param> /// <returns>ServerMessage.</returns> internal static ServerMessage Compose(Achievement achievement, int level, int pointReward, int pixelReward) { var serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("UnlockAchievementMessageComposer")); serverMessage.AppendInteger(achievement.Id); serverMessage.AppendInteger(level); serverMessage.AppendInteger(144); serverMessage.AppendString($"{achievement.GroupName}{level}"); serverMessage.AppendInteger(pointReward); serverMessage.AppendInteger(pixelReward); serverMessage.AppendInteger(0); serverMessage.AppendInteger(10); serverMessage.AppendInteger(21); serverMessage.AppendString(level > 1 ? $"{achievement.GroupName}{(level - 1)}" : string.Empty); serverMessage.AppendString(achievement.Category); serverMessage.AppendBool(true); return serverMessage; }
/// <summary> /// Serializes the promotions result list flatcats. /// </summary> /// <param name="flatCatId">The flat cat identifier.</param> /// <param name="direct">if set to <c>true</c> [direct].</param> /// <param name="message">The message.</param> internal static void SerializePromotionsResultListFlatcats(int flatCatId, bool direct, ServerMessage message) { var flatCat = AzureEmulator.GetGame().GetNavigator().GetFlatCat(flatCatId); message.AppendString("new_ads"); message.AppendString(flatCat.Caption); message.AppendInteger(0); message.AppendBool(true); message.AppendInteger(-1); try { var rooms = AzureEmulator.GetGame().GetRoomManager().GetEventRooms(); AzureEmulator.GetGame() .GetNavigator() .SerializeNavigatorPopularRoomsNews(ref message, rooms, flatCatId, direct); } catch { message.AppendInteger(0); } }
/// <summary> /// Composes the specified achievement. /// </summary> /// <param name="achievement">The achievement.</param> /// <param name="targetLevel">The target level.</param> /// <param name="targetLevelData">The target level data.</param> /// <param name="totalLevels">The total levels.</param> /// <param name="userData">The user data.</param> /// <returns>ServerMessage.</returns> internal static ServerMessage Compose(Achievement achievement, int targetLevel, AchievementLevel targetLevelData, int totalLevels, UserAchievement userData) { var serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("AchievementProgressMessageComposer")); serverMessage.AppendInteger(achievement.Id); serverMessage.AppendInteger(targetLevel); serverMessage.AppendString($"{achievement.GroupName}{targetLevel}"); serverMessage.AppendInteger(targetLevelData.Requirement); serverMessage.AppendInteger(targetLevelData.Requirement); serverMessage.AppendInteger(targetLevelData.RewardPixels); serverMessage.AppendInteger(0); serverMessage.AppendInteger(userData.Progress); serverMessage.AppendBool(userData.Level >= totalLevels); serverMessage.AppendString(achievement.Category); serverMessage.AppendString(string.Empty); serverMessage.AppendInteger(totalLevels); serverMessage.AppendInteger(0); return serverMessage; }
/// <summary> /// Serializes the promoted. /// </summary> /// <param name="session">The session.</param> /// <param name="mode">The mode.</param> /// <returns>ServerMessage.</returns> public static ServerMessage SerializePromoted(GameClient session, int mode) { var reply = new ServerMessage(LibraryParser.OutgoingRequest("NavigatorListingsMessageComposer")); reply.AppendInteger(mode); reply.AppendString(string.Empty); try { var rooms = AzureEmulator.GetGame().GetRoomManager().GetEventRooms(); SerializeNavigatorPopularRooms(ref reply, rooms); if (rooms != null) Array.Clear(rooms, 0, rooms.Length); rooms = null; } catch { reply.AppendInteger(0); reply.AppendBool(false); } return reply; }
/// <summary> /// Serializes the navigator rooms. /// </summary> /// <param name="reply">The reply.</param> /// <param name="rooms">The rooms.</param> private static void SerializeNavigatorRooms(ref ServerMessage reply, ICollection<KeyValuePair<RoomData, int>> rooms) { reply.AppendString(string.Empty); if (rooms == null || !rooms.Any()) { reply.AppendInteger(0); reply.AppendBool(false); return; } reply.AppendInteger(rooms.Count); foreach (KeyValuePair<RoomData, int> pair in rooms) pair.Key.Serialize(reply, false); reply.AppendBool(false); }
/// <summary> /// Serializes the recent rooms. /// </summary> /// <param name="session">The session.</param> /// <returns>ServerMessage.</returns> internal ServerMessage SerializeRecentRooms(GameClient session) { ServerMessage serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("NavigatorListingsMessageComposer")); serverMessage.AppendInteger(7); serverMessage.AppendString(string.Empty); serverMessage.StartArray(); foreach ( RoomData roomData in session.GetHabbo() .RecentlyVisitedRooms.Select( current => AzureEmulator.GetGame().GetRoomManager().GenerateRoomData(current))) { roomData.Serialize(serverMessage, false); serverMessage.SaveArray(); } serverMessage.EndArray(); serverMessage.AppendBool(false); return serverMessage; }
/// <summary> /// Serializes the promotion categories. /// </summary> /// <returns>ServerMessage.</returns> internal ServerMessage SerializePromotionCategories() { ServerMessage categories = new ServerMessage(LibraryParser.OutgoingRequest("CatalogPromotionGetCategoriesMessageComposer")); categories.AppendInteger(PromoCategories.Count); //count foreach (PromoCat cat in PromoCategories.Values) { categories.AppendInteger(cat.Id); categories.AppendString(cat.Caption); categories.AppendBool(cat.Visible); } return categories; }
/// <summary> /// Serializes the navigator. /// </summary> /// <param name="session">The session.</param> /// <param name="mode">The mode.</param> /// <returns>ServerMessage.</returns> internal ServerMessage SerializeNavigator(GameClient session, int mode) { if (mode >= 0) return SerializeActiveRooms(mode); var reply = new ServerMessage(LibraryParser.OutgoingRequest("NavigatorListingsMessageComposer")); switch (mode) { case -6: { reply.AppendInteger(14); List<RoomData> activeGRooms = new List<RoomData>(); KeyValuePair<RoomData, uint>[] rooms = AzureEmulator.GetGame().GetRoomManager().GetActiveRooms(); if (rooms != null && rooms.Any()) { activeGRooms.AddRange(from rd in rooms where rd.Key.GroupId != 0 select rd.Key); activeGRooms = activeGRooms.OrderByDescending(p => p.UsersNow).ToList(); } SerializeNavigatorRooms(ref reply, activeGRooms); return reply; } case -5: case -4: { reply.AppendInteger(mode * (-1)); List<RoomData> activeFriends = session.GetHabbo() .GetMessenger() .GetActiveFriendsRooms() .OrderByDescending(p => p.UsersNow) .ToList(); SerializeNavigatorRooms(ref reply, activeFriends); return reply; } case -3: { reply.AppendInteger(5); SerializeNavigatorRooms(ref reply, session.GetHabbo().UsersRooms); return reply; } case -2: { reply.AppendInteger(2); try { var rooms = AzureEmulator.GetGame().GetRoomManager().GetVotedRooms(); SerializeNavigatorRooms(ref reply, rooms); if (rooms != null) Array.Clear(rooms, 0, rooms.Length); rooms = null; } catch (Exception e) { Console.WriteLine(e); reply.AppendString(""); reply.AppendInteger(0); } return reply; } case -1: { reply.AppendInteger(1); reply.AppendString("-1"); try { var rooms = AzureEmulator.GetGame().GetRoomManager().GetActiveRooms(); SerializeNavigatorPopularRooms(ref reply, rooms); if (rooms != null) Array.Clear(rooms, 0, rooms.Length); rooms = null; } catch { reply.AppendInteger(0); reply.AppendBool(false); } return reply; } } return reply; }
/// <summary> /// Serializes the flat categories. /// </summary> /// <param name="session">The session.</param> /// <returns>ServerMessage.</returns> internal ServerMessage SerializeFlatCategories(GameClient session) { ServerMessage serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("FlatCategoriesMessageComposer")); serverMessage.StartArray(); foreach (FlatCat flatCat in PrivateCategories.Values) { serverMessage.Clear(); if (flatCat == null) continue; serverMessage.AppendInteger(flatCat.Id); serverMessage.AppendString(flatCat.Caption); serverMessage.AppendBool(flatCat.MinRank <= session.GetHabbo().Rank); serverMessage.AppendBool(false); serverMessage.AppendString("NONE"); serverMessage.AppendString(string.Empty); serverMessage.AppendBool(false); serverMessage.SaveArray(); } serverMessage.EndArray(); return serverMessage; }
/// <summary> /// Serializes the favorite rooms. /// </summary> /// <param name="session">The session.</param> /// <returns>ServerMessage.</returns> internal ServerMessage SerializeFavoriteRooms(GameClient session) { ServerMessage serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("NavigatorListingsMessageComposer")); serverMessage.AppendInteger(6); serverMessage.AppendString(string.Empty); serverMessage.AppendInteger(session.GetHabbo().FavoriteRooms.Count); uint[] array = session.GetHabbo().FavoriteRooms.ToArray(); foreach ( RoomData roomData in array .Select(roomId => AzureEmulator.GetGame().GetRoomManager().GenerateRoomData(roomId)) .Where(roomData => roomData != null)) roomData.Serialize(serverMessage, false); serverMessage.AppendBool(false); return serverMessage; }
/// <summary> /// Enables the new navigator. /// </summary> /// <param name="session">The session.</param> internal void EnableNewNavigator(GameClient session) { ServerMessage navigatorMetaDataParser = new ServerMessage(LibraryParser.OutgoingRequest("NavigatorMetaDataComposer")); navigatorMetaDataParser.AppendInteger(4); navigatorMetaDataParser.AppendString("official_view"); navigatorMetaDataParser.AppendInteger(0); navigatorMetaDataParser.AppendString("hotel_view"); navigatorMetaDataParser.AppendInteger(0); navigatorMetaDataParser.AppendString("roomads_view"); navigatorMetaDataParser.AppendInteger(0); navigatorMetaDataParser.AppendString("myworld_view"); navigatorMetaDataParser.AppendInteger(0); session.SendMessage(navigatorMetaDataParser); ServerMessage navigatorLiftedRoomsParser = new ServerMessage(LibraryParser.OutgoingRequest("NavigatorLiftedRoomsComposer")); navigatorLiftedRoomsParser.AppendInteger(_navigatorHeaders.Count); foreach (NavigatorHeader navHeader in _navigatorHeaders) { navigatorLiftedRoomsParser.AppendInteger(navHeader.RoomId); navigatorLiftedRoomsParser.AppendInteger(0); navigatorLiftedRoomsParser.AppendString(navHeader.Image); navigatorLiftedRoomsParser.AppendString(navHeader.Caption); } session.SendMessage(navigatorLiftedRoomsParser); ServerMessage collapsedCategoriesMessageParser = new ServerMessage(LibraryParser.OutgoingRequest("NavigatorCategorys")); collapsedCategoriesMessageParser.AppendInteger(FlatCatsCount + 4); foreach (FlatCat flat in PrivateCategories.Values) collapsedCategoriesMessageParser.AppendString(string.Format("category__{0}", flat.Caption)); collapsedCategoriesMessageParser.AppendString("recommended"); collapsedCategoriesMessageParser.AppendString("new_ads"); collapsedCategoriesMessageParser.AppendString("staffpicks"); collapsedCategoriesMessageParser.AppendString("official"); session.SendMessage(collapsedCategoriesMessageParser); ServerMessage searches = new ServerMessage(LibraryParser.OutgoingRequest("NavigatorSavedSearchesComposer")); searches.AppendInteger(session.GetHabbo().NavigatorLogs.Count); foreach (NaviLogs navi in session.GetHabbo().NavigatorLogs.Values) { searches.AppendInteger(navi.Id); searches.AppendString(navi.Value1); searches.AppendString(navi.Value2); searches.AppendString(""); } session.SendMessage(searches); //session.SendMessage(SerlializeNewNavigator("official", "", session)); ServerMessage packetName = new ServerMessage(LibraryParser.OutgoingRequest("NewNavigatorSizeMessageComposer")); UserPreferences pref = session.GetHabbo().Preferences; packetName.AppendInteger(pref.NewnaviX); packetName.AppendInteger(pref.NewnaviY); packetName.AppendInteger(pref.NewnaviWidth); packetName.AppendInteger(pref.NewnaviHeight); packetName.AppendBool(false); packetName.AppendInteger(1); session.SendMessage(packetName); }
/// <summary> /// Removes all furniture. /// </summary> /// <param name="session">The session.</param> /// <returns>List<RoomItem>.</returns> internal List<RoomItem> RemoveAllFurniture(GameClient session) { var items = new List<RoomItem>(); var roomGamemap = _room.GetGameMap(); foreach (var item in FloorItems.Values.ToArray()) { item.Interactor.OnRemove(session, item); roomGamemap.RemoveSpecialItem(item); var serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("PickUpFloorItemMessageComposer")); serverMessage.AppendString(item.Id.ToString()); serverMessage.AppendBool(false); //expired serverMessage.AppendInteger(item.UserId); //pickerId serverMessage.AppendInteger(0); // delay _room.SendMessage(serverMessage); if (item.IsBuilder) { using (var queryReactor = Azure.GetDatabaseManager().GetQueryReactor()) { queryReactor.RunFastQuery($"DELETE FROM items_rooms WHERE id='{item.Id}'"); } continue; } items.Add(item); } foreach (var item in WallItems.Values.ToArray()) { item.Interactor.OnRemove(session, item); var serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("PickUpWallItemMessageComposer")); serverMessage.AppendString(item.Id.ToString()); serverMessage.AppendInteger(item.UserId); _room.SendMessage(serverMessage); if (item.IsBuilder) { using (var queryReactor = Azure.GetDatabaseManager().GetQueryReactor()) { queryReactor.RunFastQuery($"DELETE FROM items_rooms WHERE id='{item.Id}'"); } continue; } items.Add(item); } _removedItems.Clear(); _updatedItems.Clear(); WallItems.Clear(); FloorItems.Clear(); Rollers.Clear(); using (var queryReactor = Azure.GetDatabaseManager().GetQueryReactor()) { queryReactor.RunFastQuery($"UPDATE items_rooms SET room_id='0' WHERE room_id='{_room.RoomId}'"); } _room.GetGameMap().GenerateMaps(); _room.GetRoomUserManager().OnUserUpdateStatus(); return items; }
/// <summary> /// Serializes the specified message. /// </summary> /// <param name="message">The message.</param> internal void Serialize(ServerMessage message) { try { message.AppendInteger(Id); message.AppendString(Caption); message.AppendString(Description); message.AppendInteger(Type); message.AppendString(Caption); message.AppendString(Image); message.AppendInteger(ParentId); message.AppendInteger(RoomInfo != null ? RoomInfo.UsersNow : 0); message.AppendInteger((ItemType == PublicItemType.None) ? 0 : ((ItemType == PublicItemType.Tag) ? 1 : ((ItemType == PublicItemType.Flat) ? 2 : ((ItemType == PublicItemType.PublicFlat) ? 2 : ((ItemType != PublicItemType.Category) ? 0 : 4))))); switch (ItemType) { case PublicItemType.Tag: { message.AppendString(TagsToSearch); break; } case PublicItemType.Category: { message.AppendBool(false); break; } case PublicItemType.Flat: { RoomInfo.Serialize(message, false); break; } case PublicItemType.PublicFlat: { RoomInfo.Serialize(message, false); break; } default: { break; } } } catch (Exception ex) { Console.WriteLine("Exception on publicitems composing: {0}", ex); } }
/// <summary> /// Composes the item. /// </summary> /// <param name="item">The item.</param> /// <param name="message">The message.</param> internal static void ComposeItem(CatalogItem item, ServerMessage message) { message.AppendInteger(item.Id); message.AppendString(item.Name, true); message.AppendBool(false); message.AppendInteger(item.CreditsCost); if (item.DiamondsCost > 0) { message.AppendInteger(item.DiamondsCost); message.AppendInteger(105); } else { message.AppendInteger(item.DucketsCost); message.AppendInteger(0); } message.AppendBool(item.GetFirstBaseItem().AllowGift); switch (item.Name) { case "g0 group_product": message.AppendInteger(0); break; case "room_ad_plus_badge": message.AppendInteger(1); message.AppendString("b"); message.AppendString("RADZZ"); break; default: if (item.Name.StartsWith("builders_club_addon_") || item.Name.StartsWith("builders_club_time_")) message.AppendInteger(0); else if (item.Badge == "") message.AppendInteger(item.Items.Count); else { message.AppendInteger(item.Items.Count + 1); message.AppendString("b"); message.AppendString(item.Badge); } break; } foreach (var baseItem in item.Items.Keys) { if (item.Name == "g0 group_product" || item.Name.StartsWith("builders_club_addon_") || item.Name.StartsWith("builders_club_time_")) break; if (item.Name == "room_ad_plus_badge") { message.AppendString(""); message.AppendInteger(0); } else { message.AppendString(baseItem.Type.ToString()); message.AppendInteger(baseItem.SpriteId); if (item.Name.Contains("wallpaper_single") || item.Name.Contains("floor_single") || item.Name.Contains("landscape_single")) { var array = item.Name.Split('_'); message.AppendString(array[2]); } else if (item.Name.StartsWith("bot_") || baseItem.InteractionType == Interaction.MusicDisc || item.GetFirstBaseItem().Name == "poster") message.AppendString(item.ExtraData); else if (item.Name.StartsWith("poster_")) { var array2 = item.Name.Split('_'); message.AppendString(array2[1]); } else if (item.Name.StartsWith("poster ")) { var array3 = item.Name.Split(' '); message.AppendString(array3[1]); } else if (item.SongId > 0u && baseItem.InteractionType == Interaction.MusicDisc) message.AppendString(item.ExtraData); else message.AppendString(string.Empty); message.AppendInteger(item.Items[baseItem]); message.AppendBool(item.IsLimited); if (!item.IsLimited) continue; message.AppendInteger(item.LimitedStack); message.AppendInteger(item.LimitedStack - item.LimitedSelled); } } message.AppendInteger(item.ClubOnly ? 1 : 0); if (item.IsLimited || item.FirstAmount != 1) { message.AppendBool(false); return; } message.AppendBool(item.HaveOffer && !item.IsLimited); }
/// <summary> /// Removes the room item. /// </summary> /// <param name="item">The item.</param> /// <param name="wasPicked">if set to <c>true</c> [was picked].</param> internal void RemoveRoomItem(RoomItem item, bool wasPicked) { if (item.IsWallItem) { var serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("PickUpWallItemMessageComposer")); serverMessage.AppendString(item.Id.ToString()); serverMessage.AppendInteger(wasPicked ? item.UserId : 0); _room.SendMessage(serverMessage); } else if (item.IsFloorItem) { var serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("PickUpFloorItemMessageComposer")); serverMessage.AppendString(item.Id.ToString()); serverMessage.AppendBool(false); //expired serverMessage.AppendInteger(wasPicked ? item.UserId : 0); //pickerId serverMessage.AppendInteger(0); // delay _room.SendMessage(serverMessage); } RoomItem junkItem; if (item.IsWallItem) { WallItems.TryRemove(item.Id, out junkItem); } else { FloorItems.TryRemove(item.Id, out junkItem); _room.GetGameMap().RemoveFromMap(item); } RemoveItem(item.Id); _room.GetRoomUserManager().OnUserUpdateStatus(item.X, item.Y); }
/// <summary> /// Composes the page. /// </summary> /// <param name="page">The page.</param> /// <returns>ServerMessage.</returns> internal static ServerMessage ComposePage(CatalogPage page) { var message = new ServerMessage(LibraryParser.OutgoingRequest("CataloguePageMessageComposer")); message.AppendInteger(page.PageId); switch (page.Layout) { case "frontpage": message.AppendString("NORMAL"); message.AppendString("frontpage4"); message.AppendInteger(2); message.AppendString(page.LayoutHeadline); message.AppendString(page.LayoutTeaser); message.AppendInteger(2); message.AppendString(page.Text1); message.AppendString(page.Text2); message.AppendInteger(0); message.AppendInteger(-1); message.AppendBool(false); break; case "roomads": message.AppendString("NORMAL"); message.AppendString("roomads"); message.AppendInteger(2); message.AppendString("events_header"); message.AppendString(""); message.AppendInteger(2); message.AppendString(page.Text1); message.AppendString(""); break; case "builders_club_frontpage_normal": message.AppendString("NORMAL"); message.AppendString("builders_club_frontpage"); message.AppendInteger(0); message.AppendInteger(1); message.AppendString(page.LayoutHeadline); message.AppendInteger(3); message.AppendInteger(8554); message.AppendString("builders_club_1_month"); message.AppendString(""); message.AppendInteger(2560000); message.AppendInteger(2560000); message.AppendInteger(1024); message.AppendInteger(0); message.AppendInteger(0); message.AppendBool(false); message.AppendInteger(8606); message.AppendString("builders_club_14_days"); message.AppendString(""); message.AppendInteger(2560000); message.AppendInteger(2560000); message.AppendInteger(1024); message.AppendInteger(0); message.AppendInteger(0); message.AppendBool(false); message.AppendInteger(8710); message.AppendString("builders_club_31_days"); message.AppendString(""); message.AppendInteger(2560000); message.AppendInteger(2560000); message.AppendInteger(1024); message.AppendInteger(0); message.AppendInteger(0); message.AppendBool(false); break; case "bots": message.AppendString("NORMAL"); message.AppendString("bots"); message.AppendInteger(2); message.AppendString(page.LayoutHeadline); message.AppendString(page.LayoutTeaser); message.AppendInteger(3); message.AppendString(page.Text1); message.AppendString(page.Text2); message.AppendString(page.TextDetails); break; case "badge_display": message.AppendString("NORMAL"); message.AppendString("badge_display"); message.AppendInteger(2); message.AppendString(page.LayoutHeadline); message.AppendString(page.LayoutTeaser); message.AppendInteger(3); message.AppendString(page.Text1); message.AppendString(page.Text2); message.AppendString(page.TextDetails); break; case "info_loyalty": case "info_duckets": message.AppendString("NORMAL"); message.AppendString(page.Layout); message.AppendInteger(1); message.AppendString(page.LayoutHeadline); message.AppendInteger(1); message.AppendString(page.Text1); break; case "sold_ltd_items": message.AppendString("NORMAL"); message.AppendString("sold_ltd_items"); message.AppendInteger(2); message.AppendString(page.LayoutHeadline); message.AppendString(page.LayoutTeaser); message.AppendInteger(3); message.AppendString(page.Text1); message.AppendString(page.Text2); message.AppendString(page.TextDetails); break; case "recycler_info": message.AppendString("NORMAL"); message.AppendString(page.Layout); message.AppendInteger(2); message.AppendString(page.LayoutHeadline); message.AppendString(page.LayoutTeaser); message.AppendInteger(3); message.AppendString(page.Text1); message.AppendString(page.Text2); message.AppendString(page.TextDetails); break; case "recycler_prizes": message.AppendString("NORMAL"); message.AppendString("recycler_prizes"); message.AppendInteger(1); message.AppendString("catalog_recycler_headline3"); message.AppendInteger(1); message.AppendString(page.Text1); break; case "spaces_new": case "spaces": message.AppendString("NORMAL"); message.AppendString("spaces_new"); message.AppendInteger(1); message.AppendString(page.LayoutHeadline); message.AppendInteger(1); message.AppendString(page.Text1); break; case "recycler": message.AppendString("NORMAL"); message.AppendString("recycler"); message.AppendInteger(2); message.AppendString(page.LayoutHeadline); message.AppendString(page.LayoutTeaser); message.AppendInteger(1); message.AppendString(page.Text1); break; case "trophies": message.AppendString("NORMAL"); message.AppendString("trophies"); message.AppendInteger(1); message.AppendString(page.LayoutHeadline); message.AppendInteger(2); message.AppendString(page.Text1); message.AppendString(page.TextDetails); break; case "pets": case "pets2": case "pets3": message.AppendString("NORMAL"); message.AppendString(page.Layout); message.AppendInteger(2); message.AppendString(page.LayoutHeadline); message.AppendString(page.LayoutTeaser); message.AppendInteger(4); message.AppendString(page.Text1); message.AppendString(page.Text2); message.AppendString(page.TextDetails); message.AppendString(page.TextTeaser); break; case "soundmachine": message.AppendString("NORMAL"); message.AppendString(page.Layout); message.AppendInteger(2); message.AppendString(page.LayoutHeadline); message.AppendString(page.LayoutTeaser); message.AppendInteger(2); message.AppendString(page.Text1); message.AppendString(page.TextDetails); break; case "vip_buy": message.AppendString("NORMAL"); message.AppendString(page.Layout); message.AppendInteger(2); message.AppendString(page.LayoutHeadline); message.AppendString(page.LayoutTeaser); message.AppendInteger(0); break; case "guild_custom_furni": message.AppendString("NORMAL"); message.AppendString("guild_custom_furni"); message.AppendInteger(3); message.AppendString(page.LayoutHeadline); message.AppendString(""); message.AppendString(""); message.AppendInteger(3); message.AppendString(page.Text1); message.AppendString(page.TextDetails); message.AppendString(page.Text2); break; case "guild_frontpage": message.AppendString("NORMAL"); message.AppendString("guild_frontpage"); message.AppendInteger(2); message.AppendString(page.LayoutHeadline); message.AppendString(page.LayoutTeaser); message.AppendInteger(3); message.AppendString(page.Text1); message.AppendString(page.TextDetails); message.AppendString(page.Text2); break; case "guild_forum": message.AppendString("NORMAL"); message.AppendString("guild_forum"); message.AppendInteger(0); message.AppendInteger(2); message.AppendString(page.Text1); message.AppendString(page.Text2); break; case "club_gifts": message.AppendString("NORMAL"); message.AppendString("club_gifts"); message.AppendInteger(1); message.AppendString(page.LayoutHeadline); message.AppendInteger(1); message.AppendString(page.Text1); break; case "default_3x3": message.AppendString("NORMAL"); message.AppendString(page.Layout); message.AppendInteger(3); message.AppendString(page.LayoutHeadline); message.AppendString(page.LayoutTeaser); message.AppendString(page.LayoutSpecial); message.AppendInteger(3); message.AppendString(page.Text1); message.AppendString(page.TextDetails); message.AppendString(page.TextTeaser); break; default: message.AppendString("NORMAL"); message.AppendString(page.Layout); message.AppendInteger(3); message.AppendString(page.LayoutHeadline); message.AppendString(page.LayoutTeaser); message.AppendString(page.LayoutSpecial); message.AppendInteger(4); message.AppendString(page.Text1); message.AppendString(page.Text2); message.AppendString(page.TextTeaser); message.AppendString(page.TextDetails); break; case "builders_3x3": message.AppendString("BUILDERS_CLUB"); message.AppendString("default_3x3"); message.AppendInteger(3); message.AppendString(page.LayoutHeadline); message.AppendString(page.LayoutTeaser); message.AppendString(page.LayoutSpecial); message.AppendInteger(3); message.AppendString(page.Text1); message.AppendString(page.TextDetails.Replace("[10]", Convert.ToChar(10).ToString()) .Replace("[13]", Convert.ToChar(13).ToString())); message.AppendString(page.TextTeaser.Replace("[10]", Convert.ToChar(10).ToString()) .Replace("[13]", Convert.ToChar(13).ToString())); break; case "builders_3x3_color": message.AppendString("BUILDERS_CLUB"); message.AppendString("default_3x3_color_grouping"); message.AppendInteger(3); message.AppendString(page.LayoutHeadline); message.AppendString(page.LayoutTeaser); message.AppendString(page.LayoutSpecial); message.AppendInteger(3); message.AppendString(page.Text1); message.AppendString(page.TextDetails.Replace("[10]", Convert.ToChar(10).ToString()) .Replace("[13]", Convert.ToChar(13).ToString())); message.AppendString(page.TextTeaser.Replace("[10]", Convert.ToChar(10).ToString()) .Replace("[13]", Convert.ToChar(13).ToString())); break; case "builders_club_frontpage": message.AppendString("BUILDERS_CLUB"); message.AppendString("builders_club_frontpage"); message.AppendInteger(0); message.AppendInteger(1); message.AppendString(page.LayoutHeadline); message.AppendInteger(3); message.AppendInteger(8554); message.AppendString("builders_club_1_month"); message.AppendString(""); message.AppendInteger(2560000); message.AppendInteger(2560000); message.AppendInteger(1024); message.AppendInteger(0); message.AppendInteger(0); message.AppendBool(false); message.AppendInteger(8606); message.AppendString("builders_club_14_days"); message.AppendString(""); message.AppendInteger(2560000); message.AppendInteger(2560000); message.AppendInteger(1024); message.AppendInteger(0); message.AppendInteger(0); message.AppendBool(false); message.AppendInteger(8710); message.AppendString("builders_club_31_days"); message.AppendString(""); message.AppendInteger(2560000); message.AppendInteger(2560000); message.AppendInteger(1024); message.AppendInteger(0); message.AppendInteger(0); message.AppendBool(false); break; case "builders_club_addons": message.AppendString("BUILDERS_CLUB"); message.AppendString("builders_club_addons"); message.AppendInteger(0); message.AppendInteger(1); message.AppendString(page.LayoutHeadline); break; case "builders_club_addons_normal": message.AppendString("NORMAL"); message.AppendString("builders_club_addons"); message.AppendInteger(0); message.AppendInteger(1); message.AppendString(page.LayoutHeadline); break; } if (page.Layout.StartsWith("frontpage") || page.Layout == "vip_buy" || page.Layout == "recycler") { message.AppendInteger(0); } else { message.AppendInteger(page.Items.Count); foreach (CatalogItem item in page.Items.Values) ComposeItem(item, message); } message.AppendInteger(-1); message.AppendBool(false); return message; }
/// <summary> /// Forums the data message. /// </summary> /// <param name="requesterId">The requester identifier.</param> /// <returns>ServerMessage.</returns> internal ServerMessage ForumDataMessage(uint requesterId) { string string1 = string.Empty, string2 = string.Empty, string3 = string.Empty, string4 = string.Empty; ServerMessage message = new ServerMessage(LibraryParser.OutgoingRequest("GroupForumDataMessageComposer")); message.AppendInteger(Id); message.AppendString(Name); message.AppendString(Description); message.AppendString(Badge); message.AppendInteger(0); message.AppendInteger(0); message.AppendInteger(ForumMessagesCount); message.AppendInteger(0); message.AppendInteger(0); message.AppendInteger(ForumLastPosterId); message.AppendString(ForumLastPosterName); message.AppendInteger(ForumLastPostTime); message.AppendInteger(WhoCanRead); message.AppendInteger(WhoCanPost); message.AppendInteger(WhoCanThread); message.AppendInteger(WhoCanMod); if (WhoCanRead == 1 && !Members.ContainsKey(requesterId)) string1 = "not_member"; if (WhoCanRead == 2 && !Admins.ContainsKey(requesterId)) string1 = "not_admin"; if (WhoCanPost == 1 && !Members.ContainsKey(requesterId)) string2 = "not_member"; if (WhoCanPost == 2 && !Admins.ContainsKey(requesterId)) string2 = "not_admin"; if (WhoCanPost == 3 && requesterId != CreatorId) string2 = "not_owner"; if (WhoCanThread == 1 && !Members.ContainsKey(requesterId)) string3 = "not_member"; if (WhoCanThread == 2 && !Admins.ContainsKey(requesterId)) string3 = "not_admin"; if (WhoCanThread == 3 && requesterId != CreatorId) string3 = "not_owner"; if (WhoCanMod == 2 && !Admins.ContainsKey(requesterId)) string4 = "not_admin"; if (WhoCanMod == 3 && requesterId != CreatorId) string4 = "not_owner"; message.AppendString(string1); message.AppendString(string2); message.AppendString(string3); message.AppendString(string4); message.AppendString(string.Empty); message.AppendBool(requesterId == CreatorId); message.AppendBool(true); return message; }
/// <summary> /// Serializes the search results. /// </summary> /// <param name="searchQuery">The search query.</param> /// <returns>ServerMessage.</returns> public static ServerMessage SerializeSearchResults(string searchQuery) { bool containsOwner = false, containsGroup = false; string originalQuery = searchQuery; if (searchQuery.StartsWith("owner:")) { searchQuery = searchQuery.Replace("owner:", string.Empty); containsOwner = true; } else if (searchQuery.StartsWith("group:")) { searchQuery = searchQuery.Replace("group:", string.Empty); containsGroup = true; } List<RoomData> rooms = new List<RoomData>(); if (!containsOwner) { bool initForeach = false; KeyValuePair<RoomData, uint>[] activeRooms = AzureEmulator.GetGame().GetRoomManager().GetActiveRooms(); try { if (activeRooms != null && activeRooms.Any()) initForeach = true; } catch { initForeach = false; } if (initForeach) { foreach (KeyValuePair<RoomData, uint> rms in activeRooms) { if (rms.Key.Name.ToLower().Contains(searchQuery.ToLower()) && rooms.Count <= 50) rooms.Add(rms.Key); else break; } } } if (rooms.Count < 50 || containsOwner || containsGroup) { DataTable dTable; using (IQueryAdapter dbClient = AzureEmulator.GetDatabaseManager().GetQueryReactor()) { if (containsOwner) { dbClient.SetQuery( "SELECT * FROM rooms_data WHERE owner = @query AND roomtype = 'private' LIMIT 50"); dbClient.AddParameter("query", searchQuery); dTable = dbClient.GetTable(); } else if (containsGroup) { dbClient.SetQuery( "SELECT * FROM rooms_data JOIN groups_data ON rooms_data.id = groups_data.room_id WHERE groups_data.name LIKE @query AND roomtype = 'private' LIMIT 50"); dbClient.AddParameter("query", "%" + searchQuery + "%"); dTable = dbClient.GetTable(); } else { dbClient.SetQuery( "SELECT * FROM rooms_data WHERE caption = @query AND roomtype = 'private' LIMIT " + (50 - rooms.Count)); dbClient.AddParameter("query", searchQuery); dTable = dbClient.GetTable(); } } if (dTable != null) { foreach (RoomData rData in dTable.Rows.Cast<DataRow>().Select(row => AzureEmulator.GetGame() .GetRoomManager() .FetchRoomData(Convert.ToUInt32(row["id"]), row)).Where(rData => !rooms.Contains(rData))) rooms.Add(rData); } } ServerMessage message = new ServerMessage(LibraryParser.OutgoingRequest("NavigatorListingsMessageComposer")); message.AppendInteger(8); message.AppendString(originalQuery); message.AppendInteger(rooms.Count); foreach (RoomData room in rooms) room.Serialize(message, false); message.AppendBool(false); return message; }