/// <summary> /// Handles the purchase. /// </summary> /// <param name="session">The session.</param> /// <param name="pageId">The page identifier.</param> /// <param name="itemId">The item identifier.</param> /// <param name="extraData">The extra data.</param> /// <param name="priceAmount">The price amount.</param> /// <param name="isGift">if set to <c>true</c> [is gift].</param> /// <param name="giftUser">The gift user.</param> /// <param name="giftMessage">The gift message.</param> /// <param name="giftSpriteId">The gift sprite identifier.</param> /// <param name="giftLazo">The gift lazo.</param> /// <param name="giftColor">Color of the gift.</param> /// <param name="undef">if set to <c>true</c> [undef].</param> /// <param name="theGroup">The theGroup.</param> internal void HandlePurchase(GameClient session, uint pageId, uint itemId, string extraData, uint priceAmount, bool isGift, string giftUser, string giftMessage, int giftSpriteId, int giftLazo, int giftColor, bool undef, uint theGroup) { priceAmount = priceAmount < 1 || priceAmount > 100 ? 1 : priceAmount; uint totalPrice = priceAmount, limitedId = 0, limtot = 0; if (priceAmount >= 6) totalPrice -= Convert.ToUInt32(Math.Ceiling(Convert.ToDouble(priceAmount)/6))*2 - 1; if (!Categories.Contains(pageId)) return; CatalogPage catalogPage = GetPage(pageId); if (catalogPage == null || !catalogPage.Enabled || !catalogPage.Visible || session?.GetHabbo() == null || catalogPage.MinRank > session.GetHabbo().Rank || catalogPage.Layout == "sold_ltd_items") return; CatalogItem item = catalogPage.GetItem(itemId); if (item == null || session.GetHabbo().Credits < item.CreditsCost || session.GetHabbo().Duckets < item.DucketsCost || session.GetHabbo().Diamonds < item.DiamondsCost || item.Name == "room_ad_plus_badge") return; #region Habbo Club Purchase if (catalogPage.Layout == "vip_buy" || catalogPage.Layout == "club_buy" || HabboClubItems.Contains(item)) { string[] array = item.Name.Split('_'); double dayLength = 31; if (item.Name.Contains("DAY")) dayLength = double.Parse(array[3]); else if (item.Name.Contains("MONTH")) dayLength = Math.Ceiling(double.Parse(array[3])*31 - 0.205); else if (item.Name.Contains("YEAR")) dayLength = double.Parse(array[3])*31*12; session.GetHabbo().GetSubscriptionManager().AddSubscription(dayLength); if (item.CreditsCost > 0) { session.GetHabbo().Credits -= item.CreditsCost*totalPrice; session.GetHabbo().UpdateCreditsBalance(); } if (item.DucketsCost > 0) { session.GetHabbo().Duckets -= item.DucketsCost*totalPrice; session.GetHabbo().UpdateActivityPointsBalance(); } if (item.DiamondsCost > 0) { session.GetHabbo().Diamonds -= item.DiamondsCost*totalPrice; session.GetHabbo().UpdateSeasonalCurrencyBalance(); } return; } #endregion #region Is Only for Habbo Club users Check if (item.ClubOnly && !session.GetHabbo().GetSubscriptionManager().HasSubscription) { ServerMessage serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("CatalogPurchaseNotAllowedMessageComposer")); serverMessage.AppendInteger(1); session.SendMessage(serverMessage); return; } #endregion #region Limited Items Purchase if (item.IsLimited) { totalPrice = 1; priceAmount = 1; if (item.LimitedSelled >= item.LimitedStack) { session.SendMessage(new ServerMessage(LibraryParser.OutgoingRequest("CatalogLimitedItemSoldOutMessageComposer"))); return; } item.LimitedSelled++; using (IQueryAdapter queryReactor = Yupi.GetDatabaseManager().GetQueryReactor()) { queryReactor.RunFastQuery(string.Concat("UPDATE catalog_items SET limited_sells = ", item.LimitedSelled, " WHERE id = ", item.Id)); limitedId = item.LimitedSelled; limtot = item.LimitedStack; } } else if (isGift && priceAmount > 1) { totalPrice = 1; priceAmount = 1; } #endregion uint toUserId = 0u; if (session.GetHabbo().Credits < item.CreditsCost*totalPrice || session.GetHabbo().Duckets < item.DucketsCost * totalPrice || session.GetHabbo().Diamonds < item.DiamondsCost * totalPrice) return; #region Decrease User Balance with Item Cost if (!isGift) { if (item.CreditsCost > 0) { session.GetHabbo().Credits -= item.CreditsCost*totalPrice; session.GetHabbo().UpdateCreditsBalance(); } if (item.DucketsCost > 0) { session.GetHabbo().Duckets -= item.DucketsCost*totalPrice; session.GetHabbo().UpdateActivityPointsBalance(); } if (item.DiamondsCost > 0) { session.GetHabbo().Diamonds -= item.DiamondsCost*totalPrice; session.GetHabbo().UpdateSeasonalCurrencyBalance(); } } #endregion foreach (Item baseItem in item.Items.Keys) { #region Stack if Gift if (isGift) { if ((DateTime.Now - session.GetHabbo().LastGiftPurchaseTime).TotalSeconds <= 15.0) { session.SendNotif(Yupi.GetLanguage().GetVar("user_send_gift")); return; } if (!baseItem.AllowGift) return; DataRow row; using (IQueryAdapter queryreactor3 = Yupi.GetDatabaseManager().GetQueryReactor()) { queryreactor3.SetQuery("SELECT id FROM users WHERE username = @gift_user"); queryreactor3.AddParameter("gift_user", giftUser); row = queryreactor3.GetRow(); } if (row == null) { session.GetMessageHandler().GetResponse().Init(LibraryParser.OutgoingRequest("GiftErrorMessageComposer")); session.GetMessageHandler().GetResponse().AppendString(giftUser); session.GetMessageHandler().SendResponse(); return; } toUserId = (uint) row["id"]; if (toUserId == 0u) { session.GetMessageHandler().GetResponse().Init(LibraryParser.OutgoingRequest("GiftErrorMessageComposer")); session.GetMessageHandler().GetResponse().AppendString(giftUser); session.GetMessageHandler().SendResponse(); return; } if (item.CreditsCost > 0) { session.GetHabbo().Credits -= item.CreditsCost*totalPrice; session.GetHabbo().UpdateCreditsBalance(); } if (item.DucketsCost > 0) { session.GetHabbo().Duckets -= item.DucketsCost*totalPrice; session.GetHabbo().UpdateActivityPointsBalance(); } if (item.DiamondsCost > 0) { session.GetHabbo().Diamonds -= item.DiamondsCost*totalPrice; session.GetHabbo().UpdateSeasonalCurrencyBalance(); } if (baseItem.Type == 'e') { session.SendNotif(Yupi.GetLanguage().GetVar("user_send_gift_effect")); return; } } #endregion #region Item is Builders Club Addon if (item.Name.StartsWith("builders_club_addon_")) { int furniAmount = int.Parse(item.Name.Replace("builders_club_addon_", string.Empty).Replace("furnis", string.Empty)); session.GetHabbo().BuildersItemsMax += furniAmount; ServerMessage update = new ServerMessage(LibraryParser.OutgoingRequest("BuildersClubMembershipMessageComposer")); update.AppendInteger(session.GetHabbo().BuildersExpire); update.AppendInteger(session.GetHabbo().BuildersItemsMax); update.AppendInteger(2); session.SendMessage(update); using (IQueryAdapter queryReactor = Yupi.GetDatabaseManager().GetQueryReactor()) { queryReactor.SetQuery("UPDATE users SET builders_items_max = @max WHERE id = @userId"); queryReactor.AddParameter("max", session.GetHabbo().BuildersItemsMax); queryReactor.AddParameter("userId", session.GetHabbo().Id); queryReactor.RunQuery(); } session.SendMessage(CatalogPageComposer.PurchaseOk(item, item.Items)); session.SendNotif("${notification.builders_club.membership_extended.message}", "${notification.builders_club.membership_extended.title}", "builders_club_membership_extended"); return; } #endregion #region Item is Builders Club Upgrade if (item.Name.StartsWith("builders_club_time_")) { int timeAmount = int.Parse(item.Name.Replace("builders_club_time_", string.Empty).Replace("seconds", string.Empty)); session.GetHabbo().BuildersExpire += timeAmount; ServerMessage update = new ServerMessage(LibraryParser.OutgoingRequest("BuildersClubMembershipMessageComposer")); update.AppendInteger(session.GetHabbo().BuildersExpire); update.AppendInteger(session.GetHabbo().BuildersItemsMax); update.AppendInteger(2); session.SendMessage(update); using (IQueryAdapter queryReactor = Yupi.GetDatabaseManager().GetQueryReactor()) { queryReactor.SetQuery("UPDATE users SET builders_expire = @max WHERE id = @userId"); queryReactor.AddParameter("max", session.GetHabbo().BuildersExpire); queryReactor.AddParameter("userId", session.GetHabbo().Id); queryReactor.RunQuery(); } session.SendMessage(CatalogPageComposer.PurchaseOk(item, item.Items)); session.SendNotif("${notification.builders_club.membership_extended.message}", "${notification.builders_club.membership_extended.title}", "builders_club_membership_extended"); return; } #endregion string text = string.Empty; #region Interaction Type Selection Interaction interactionType = baseItem.InteractionType; switch (interactionType) { case Interaction.None: case Interaction.Gate: case Interaction.Bed: case Interaction.PressurePadBed: case Interaction.Guillotine: case Interaction.HcGate: case Interaction.ScoreBoard: case Interaction.VendingMachine: case Interaction.Alert: case Interaction.OneWayGate: case Interaction.LoveShuffler: case Interaction.HabboWheel: case Interaction.Dice: case Interaction.Bottle: case Interaction.Hopper: case Interaction.Teleport: case Interaction.QuickTeleport: case Interaction.Pet: case Interaction.Pool: case Interaction.Roller: break; case Interaction.PostIt: extraData = "FFFF33"; break; case Interaction.RoomEffect: double number = string.IsNullOrEmpty(extraData) ? 0.0 : double.Parse(extraData, Yupi.CultureInfo); extraData = number.ToString(CultureInfo.InvariantCulture).Replace(',', '.'); break; case Interaction.Dimmer: extraData = "1,1,1,#000000,255"; break; case Interaction.Trophy: extraData = string.Concat(session.GetHabbo().UserName, Convert.ToChar(9), DateTime.Now.Day.ToString("00"), "-", DateTime.Now.Month.ToString("00"), "-", DateTime.Now.Year, Convert.ToChar(9), extraData); break; case Interaction.Rentals: extraData = item.ExtraData; break; case Interaction.PetDog: case Interaction.PetCat: case Interaction.PetCrocodile: case Interaction.PetTerrier: case Interaction.PetBear: case Interaction.PetPig: case Interaction.PetLion: case Interaction.PetRhino: case Interaction.PetSpider: case Interaction.PetTurtle: case Interaction.PetChick: case Interaction.PetFrog: case Interaction.PetDragon: case Interaction.PetHorse: case Interaction.PetMonkey: case Interaction.PetGnomo: case Interaction.PetMonsterPlant: case Interaction.PetWhiteRabbit: case Interaction.PetEvilRabbit: case Interaction.PetLoveRabbit: case Interaction.PetCafeRabbit: case Interaction.PetPigeon: case Interaction.PetEvilPigeon: case Interaction.PetDemonMonkey: string[] data = extraData.Split('\n'); string petName = data[0]; string race = data[1]; string color = data[2]; if (!CheckPetName(petName) || (race.Length != 1 && race.Length != 2) || color.Length != 6) return; break; case Interaction.Mannequin: extraData = string.Concat("m", Convert.ToChar(5), "lg-270-82.ch-210-66", Convert.ToChar(5), "Mannequin"); break; case Interaction.VipGate: case Interaction.MysteryBox: case Interaction.YoutubeTv: case Interaction.TileStackMagic: case Interaction.Tent: case Interaction.BedTent: break; case Interaction.BadgeDisplay: if (!session.GetHabbo().GetBadgeComponent().HasBadge(extraData)) extraData = "UMAD"; extraData = $"{extraData}|{session.GetHabbo().UserName}|{DateTime.Now.Day.ToString("00")}-{DateTime.Now.Month.ToString("00")}-{DateTime.Now.Year}"; break; case Interaction.FootballGate: extraData = "hd-99999-99999.lg-270-62;hd-99999-99999.ch-630-62.lg-695-62"; break; case Interaction.LoveLock: extraData = "0"; break; case Interaction.Pinata: case Interaction.RunWaySage: case Interaction.Shower: extraData = "0"; break; case Interaction.GroupForumTerminal: case Interaction.GuildItem: case Interaction.GuildGate: case Interaction.GuildForum: case Interaction.Poster: break; case Interaction.Moplaseed: extraData = new Random().Next(0, 12).ToString(); break; case Interaction.RareMoplaSeed: extraData = new Random().Next(10, 12).ToString(); break; case Interaction.MusicDisc: SongData song = SoundMachineSongManager.GetSongById(item.SongId); extraData = string.Empty; if (song == null) break; extraData = string.Concat(session.GetHabbo().UserName, '\n', DateTime.Now.Year, '\n', DateTime.Now.Month, '\n', DateTime.Now.Day, '\n', song.LengthSeconds, '\n', song.Name); text = song.CodeName; break; default: extraData = item.ExtraData; break; } #endregion session.GetMessageHandler().GetResponse().Init(LibraryParser.OutgoingRequest("UpdateInventoryMessageComposer")); session.GetMessageHandler().SendResponse(); session.SendMessage(CatalogPageComposer.PurchaseOk(item, item.Items)); if (isGift) { Item itemBySprite = Yupi.GetGame().GetItemManager().GetItemBySpriteId(giftSpriteId); if (itemBySprite == null) return; uint insertId; using (IQueryAdapter queryReactor = Yupi.GetDatabaseManager().GetQueryReactor()) { queryReactor.SetQuery("INSERT INTO items_rooms (item_name,user_id) VALUES (" + itemBySprite.Name + ", " + toUserId + ")"); insertId = (uint) queryReactor.InsertQuery(); queryReactor.SetQuery( string.Concat( "INSERT INTO users_gifts (gift_id,item_id,extradata,giver_name,Message,ribbon,color,gift_sprite,show_sender,rare_id) VALUES (", insertId, ", ", baseItem.ItemId, ",@extradata, @name, @Message,", giftLazo, ",", giftColor, ",", giftSpriteId, ",", undef ? 1 : 0, ",", limitedId, ")")); queryReactor.AddParameter("extradata", extraData); queryReactor.AddParameter("name", giftUser); queryReactor.AddParameter("message", giftMessage); queryReactor.RunQuery(); if (session.GetHabbo().Id != toUserId) { Yupi.GetGame() .GetAchievementManager() .ProgressUserAchievement(session, "ACH_GiftGiver", 1, true); queryReactor.RunFastQuery( "UPDATE users_stats SET gifts_given = gifts_given + 1 WHERE id = " + session.GetHabbo().Id + ";UPDATE users_stats SET gifts_received = gifts_received + 1 WHERE id = " + toUserId); } } GameClient clientByUserId = Yupi.GetGame().GetClientManager().GetClientByUserId(toUserId); if (clientByUserId != null) { clientByUserId.GetHabbo() .GetInventoryComponent() .AddNewItem(insertId, itemBySprite.Name, string.Concat(session.GetHabbo().Id, (char) 9, giftMessage, (char) 9, giftLazo, (char) 9, giftColor, (char) 9, undef ? "1" : "0", (char) 9, session.GetHabbo().UserName, (char) 9, session.GetHabbo().Look, (char) 9, item.Name), 0u, false, false, 0, 0); if (clientByUserId.GetHabbo().Id != session.GetHabbo().Id) Yupi.GetGame() .GetAchievementManager() .ProgressUserAchievement(clientByUserId, "ACH_GiftReceiver", 1, true); } session.GetHabbo().LastGiftPurchaseTime = DateTime.Now; continue; } session.GetMessageHandler() .GetResponse() .Init(LibraryParser.OutgoingRequest("NewInventoryObjectMessageComposer")); session.GetMessageHandler().GetResponse().AppendInteger(1); int i = 1; if (baseItem.Type == 's') i = InteractionTypes.AreFamiliar(GlobalInteractions.Pet, baseItem.InteractionType) ? 3 : 1; session.GetMessageHandler().GetResponse().AppendInteger(i); List<UserItem> list = DeliverItems(session, baseItem, priceAmount*item.Items[baseItem], extraData, limitedId, limtot, text); session.GetMessageHandler().GetResponse().AppendInteger(list.Count); foreach (UserItem current3 in list) session.GetMessageHandler().GetResponse().AppendInteger(current3.Id); session.GetMessageHandler().SendResponse(); session.GetHabbo().GetInventoryComponent().UpdateItems(false); if (InteractionTypes.AreFamiliar(GlobalInteractions.Pet, baseItem.InteractionType)) session.SendMessage(session.GetHabbo().GetInventoryComponent().SerializePetInventory()); } if (item.Badge.Length >= 1) session.GetHabbo().GetBadgeComponent().GiveBadge(item.Badge, true, session); }
/// <summary> /// Removes the user from room. /// </summary> /// <param name="session">The session.</param> /// <param name="notifyClient">if set to <c>true</c> [notify client].</param> /// <param name="notifyKick">if set to <c>true</c> [notify kick].</param> internal void RemoveUserFromRoom(GameClient session, bool notifyClient, bool notifyKick) { try { if (session == null || session.GetHabbo() == null || _userRoom == null) return; uint userId = session.GetHabbo().Id; session.GetHabbo().GetAvatarEffectsInventoryComponent().OnRoomExit(); //using (var queryReactor = Yupi.GetDatabaseManager().GetQueryReactor()) // queryReactor.RunFastQuery("UPDATE users_rooms_visits SET exit_timestamp = '" + Yupi.GetUnixTimeStamp() + "' WHERE room_id = '" + _room.RoomId + "' AND user_id = '" + session.GetHabbo().Id + "' ORDER BY entry_timestamp DESC LIMIT 1"); RoomUser roomUserByHabbo = GetRoomUserByHabbo(userId); if (roomUserByHabbo == null) return; if (notifyKick) { Room room = Yupi.GetGame().GetRoomManager().GetRoom(roomUserByHabbo.RoomId); DynamicRoomModel model = room.GetGameMap().Model; roomUserByHabbo.MoveTo(model.DoorX, model.DoorY); roomUserByHabbo.CanWalk = false; session.GetMessageHandler() .GetResponse() .Init(LibraryParser.OutgoingRequest("RoomErrorMessageComposer")); session.GetMessageHandler().GetResponse().AppendInteger(4008); session.GetMessageHandler().SendResponse(); session.GetMessageHandler() .GetResponse() .Init(LibraryParser.OutgoingRequest("OutOfRoomMessageComposer")); session.GetMessageHandler().GetResponse().AppendShort(2); session.GetMessageHandler().SendResponse(); } else if (notifyClient) { ServerMessage serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("UserIsPlayingFreezeMessageComposer")); serverMessage.AppendBool(roomUserByHabbo.Team != Team.None); roomUserByHabbo.GetClient().SendMessage(serverMessage); session.GetMessageHandler() .GetResponse() .Init(LibraryParser.OutgoingRequest("OutOfRoomMessageComposer")); session.GetMessageHandler().GetResponse().AppendShort(2); session.GetMessageHandler().SendResponse(); } if (roomUserByHabbo.Team != Team.None) { _userRoom.GetTeamManagerForBanzai().OnUserLeave(roomUserByHabbo); _userRoom.GetTeamManagerForFreeze().OnUserLeave(roomUserByHabbo); } if (roomUserByHabbo.RidingHorse) { roomUserByHabbo.RidingHorse = false; RoomUser horse = GetRoomUserByVirtualId((int) roomUserByHabbo.HorseId); if (horse != null) { horse.RidingHorse = false; horse.HorseId = 0u; } } if (roomUserByHabbo.IsLyingDown || roomUserByHabbo.IsSitting) { roomUserByHabbo.IsSitting = false; roomUserByHabbo.IsLyingDown = false; } RemoveRoomUser(roomUserByHabbo); if (session.GetHabbo() != null && !roomUserByHabbo.IsSpectator) { if (roomUserByHabbo.CurrentItemEffect != ItemEffectType.None) roomUserByHabbo.GetClient().GetHabbo().GetAvatarEffectsInventoryComponent().CurrentEffect = -1; if (session.GetHabbo() != null) { if (_userRoom.HasActiveTrade(session.GetHabbo().Id)) _userRoom.TryStopTrade(session.GetHabbo().Id); session.GetHabbo().CurrentRoomId = 0; if (session.GetHabbo().GetMessenger() != null) session.GetHabbo().GetMessenger().OnStatusChanged(true); } using (IQueryAdapter queryreactor2 = Yupi.GetDatabaseManager().GetQueryReactor()) if (session.GetHabbo() != null) queryreactor2.RunFastQuery(string.Concat( "UPDATE users_rooms_visits SET exit_timestamp = '", Yupi.GetUnixTimeStamp(), "' WHERE room_id = '", _userRoom.RoomId, "' AND user_id = '", userId, "' ORDER BY exit_timestamp DESC LIMIT 1")); } UsersByUserId.Remove(roomUserByHabbo.UserId); if (session.GetHabbo() != null) UsersByUserName.Remove(session.GetHabbo().UserName.ToLower()); roomUserByHabbo.Dispose(); } catch (Exception ex) { ServerLogManager.LogCriticalException($"Error during removing user from room:{ex}"); } }
public override void OnTrigger(GameClient session, RoomItem item, int request, bool hasRights) { if (!item.ExtraData.Contains(Convert.ToChar(5).ToString())) return; string[] array = item.ExtraData.Split(Convert.ToChar(5)); session.GetHabbo().Gender = array[0].ToUpper() == "F" ? "F" : "M"; Dictionary<string, string> dictionary = new Dictionary<string, string>(); dictionary.Clear(); string[] array2 = array[1].Split('.'); foreach (string text in array2) { string[] array3 = session.GetHabbo().Look.Split('.'); foreach (string text2 in array3) { if (text2.Split('-')[0] == text.Split('-')[0]) { if (dictionary.ContainsKey(text2.Split('-')[0]) && !dictionary.ContainsValue(text)) { dictionary.Remove(text2.Split('-')[0]); dictionary.Add(text2.Split('-')[0], text); } else { if (!dictionary.ContainsKey(text2.Split('-')[0]) && !dictionary.ContainsValue(text)) dictionary.Add(text2.Split('-')[0], text); } } else { if (!dictionary.ContainsKey(text2.Split('-')[0])) dictionary.Add(text2.Split('-')[0], text2); } } } string text3 = dictionary.Values.Aggregate("", (current1, current) => $"{current1}{current}."); session.GetHabbo().Look = text3.TrimEnd('.'); using (IQueryAdapter commitableQueryReactor = Yupi.GetDatabaseManager().GetQueryReactor()) { commitableQueryReactor.SetQuery( $"UPDATE users SET look = @look, gender = @gender WHERE id = {session.GetHabbo().Id}"); commitableQueryReactor.AddParameter("look", session.GetHabbo().Look); commitableQueryReactor.AddParameter("gender", session.GetHabbo().Gender); commitableQueryReactor.RunQuery(); } session.GetMessageHandler() .GetResponse() .Init(LibraryParser.OutgoingRequest("UpdateUserDataMessageComposer")); session.GetMessageHandler().GetResponse().AppendInteger(-1); session.GetMessageHandler().GetResponse().AppendString(session.GetHabbo().Look); session.GetMessageHandler().GetResponse().AppendString(session.GetHabbo().Gender.ToLower()); session.GetMessageHandler().GetResponse().AppendString(session.GetHabbo().Motto); session.GetMessageHandler().GetResponse().AppendInteger(session.GetHabbo().AchievementPoints); session.GetMessageHandler().SendResponse(); RoomUser roomUserByHabbo = item.GetRoom().GetRoomUserManager().GetRoomUserByHabbo(session.GetHabbo().Id); ServerMessage serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("UpdateUserDataMessageComposer")); serverMessage.AppendInteger(roomUserByHabbo.VirtualId); serverMessage.AppendString(session.GetHabbo().Look); serverMessage.AppendString(session.GetHabbo().Gender.ToLower()); serverMessage.AppendString(session.GetHabbo().Motto); serverMessage.AppendInteger(session.GetHabbo().AchievementPoints); session.GetHabbo().CurrentRoom.SendMessage(serverMessage); }
/// <summary> /// Progresses the user achievement. /// </summary> /// <param name="session">The session.</param> /// <param name="achievementGroup">The achievement group.</param> /// <param name="progressAmount">The progress amount.</param> /// <param name="fromZero">if set to <c>true</c> [from zero].</param> /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns> internal bool ProgressUserAchievement(GameClient session, string achievementGroup, uint progressAmount, bool fromZero = false) { if (Achievements.ContainsKey(achievementGroup) && session?.GetHabbo() != null) { Achievement achievement = Achievements[achievementGroup]; Habbo user = session.GetHabbo(); // Get UserAchievementData, if the user doesn't has the Achievement, create a new. UserAchievement userAchievement = user.Achievements.ContainsKey(achievementGroup) ? user.GetAchievementData(achievementGroup) : new UserAchievement(achievementGroup, 0, 0); // If is a New Achievement is fromZero if (!user.Achievements.ContainsKey(achievementGroup)) fromZero = true; // If user hasn't the Achievement, after created the new, Must add in Collections. if (!user.Achievements.ContainsKey(achievementGroup)) user.Achievements.Add(achievementGroup, userAchievement); // Get Achievement userAchievement = user.Achievements[achievementGroup]; // Total Levels from this Achievement uint achievementLevelsCount = (uint) achievement.Levels.Count; // Get User Achievement Level uint achievementCurrentLevel = userAchievement.Level; // Get User Achievement Progress uint achievementCurrentProgress = userAchievement.Progress; // If the next Level is the last level must set to Levels.Count (Ex: 38 Levels => .Count = 37 (Max Level in the Array, but .Count 37 == 38, Soo need put Level - 1) uint achievementNextLevel = achievementCurrentLevel + 1 > achievementLevelsCount ? achievementLevelsCount : achievementCurrentLevel + 1; // Set Achievement Progress uint achievementProgress = achievementCurrentProgress + progressAmount; // If he has already the Max, something is wrong. if (achievementCurrentLevel == achievementLevelsCount) return false; // Get Next Level Data AchievementLevel achievementNextLevelData = achievement.Levels[achievementNextLevel]; // if progress isn't sufficient or, isn't new Achievement if (achievementProgress < achievementNextLevelData.Requirement || achievementCurrentLevel >= 1) fromZero = false; // If progress is sufficient to next level, or is new Achievement if (achievementProgress >= achievementNextLevelData.Requirement || (achievementCurrentLevel < 1)) fromZero = true; // if is a new level (but level isn't 0) if (achievementProgress >= achievementNextLevelData.Requirement) achievementProgress = 0; // If is new Level if (fromZero) { // Set Level userAchievement.SetLevel(achievementNextLevel); // Set Progress userAchievement.SetProgress(achievementProgress); // Give Reward Points user.AchievementPoints += achievementNextLevelData.RewardPoints; user.NotifyNewPixels(achievementNextLevelData.RewardPixels); user.Duckets += achievementNextLevelData.RewardPixels; // Update Points Balance user.UpdateActivityPointsBalance(); // Remove old Badge - (Is not problem if is First Level Badge, because if the user hasn't the badg, simply, will not remove. user.GetBadgeComponent() .RemoveBadge(Convert.ToString($"{achievementGroup}{achievementNextLevel - 1}"), session); // Give new Badge user.GetBadgeComponent().GiveBadge($"{achievementGroup}{achievementNextLevel}", true, session); // Update in Database using (IQueryAdapter queryReactor = Yupi.GetDatabaseManager().GetQueryReactor()) queryReactor.RunFastQuery( $"REPLACE INTO users_achievements VALUES ('{user.Id}', '{achievementGroup}', '{achievementNextLevel}', '{achievementProgress}')"); // Send Unlocked Composer session.SendMessage(AchievementUnlockedComposer.Compose(achievement, achievementNextLevel, achievementNextLevelData.RewardPoints, achievementNextLevelData.RewardPixels)); // Send Score Composer session.SendMessage(AchievementScoreUpdateComposer.Compose(user.AchievementPoints)); // Send Progress Composer session.SendMessage(AchievementProgressComposer.Compose(achievement, achievementNextLevel, achievementNextLevelData, achievementLevelsCount, userAchievement)); // Set Talent if ( Yupi.GetGame() .GetTalentManager() .Talents.Values.Any(talent => talent.AchievementGroup == achievementGroup)) Yupi.GetGame() .GetTalentManager() .CompleteUserTalent(session, Yupi.GetGame().GetTalentManager().GetTalentData(achievementGroup)); } else { // Get Current Level Data AchievementLevel achievementCurrentLevelData = achievement.Levels[achievementCurrentLevel]; // It's the Same Level userAchievement.SetLevel(achievementCurrentLevel); // But increase Progress userAchievement.SetProgress(achievementProgress); // Update in Database using (IQueryAdapter queryReactor = Yupi.GetDatabaseManager().GetQueryReactor()) queryReactor.RunFastQuery( $"REPLACE INTO users_achievements VALUES ('{user.Id}', '{achievementGroup}', '{achievementCurrentLevel}', '{achievementProgress}')"); // Compose Current Data session.SendMessage(AchievementProgressComposer.Compose(achievement, achievementCurrentLevel, achievementCurrentLevelData, achievementLevelsCount, userAchievement)); } // Send User New Data GameClientMessageHandler messageHandler = session.GetMessageHandler(); messageHandler.GetResponse().Init(LibraryParser.OutgoingRequest("UpdateUserDataMessageComposer")); messageHandler.GetResponse().AppendInteger(-1); messageHandler.GetResponse().AppendString(user.Look); messageHandler.GetResponse().AppendString(user.Gender.ToLower()); messageHandler.GetResponse().AppendString(user.Motto); messageHandler.GetResponse().AppendInteger(user.AchievementPoints); messageHandler.SendResponse(); return true; } return false; }
public override bool Execute(GameClient session, string[] pms) { session.GetMessageHandler().Sit(); return true; }