public AchievementProgressedComposer(Achievement Achievement, int TargetLevel, AchievementLevel TargetLevelData,int TotalLevels, UserAchievement UserData) : base(ServerPacketHeader.AchievementProgressedMessageComposer) { base.WriteInteger(Achievement.Id); // Unknown (ID?) base.WriteInteger(TargetLevel); // Target level base.WriteString(Achievement.GroupName + TargetLevel); // Target name/desc/badge base.WriteInteger(1); // Progress req/target base.WriteInteger(TargetLevelData.Requirement); // Reward in Pixels base.WriteInteger(TargetLevelData.RewardPixels); // Reward Ach Score base.WriteInteger(0); // ? base.WriteInteger(UserData != null ? UserData.Progress : 0); // Current progress base.WriteBoolean(UserData != null ? (UserData.Level >= TotalLevels) : false); // Set 100% completed(??) base.WriteString(Achievement.Category); // Category base.WriteString(string.Empty); base.WriteInteger(TotalLevels); // Total amount of levels base.WriteInteger(0); }
public bool ProgressAchievement(GameClient Session, string AchievementGroup, int ProgressAmount, bool FromZero = false) { if (!_achievements.ContainsKey(AchievementGroup) || Session == null) return false; Achievement AchievementData = null; AchievementData = _achievements[AchievementGroup]; UserAchievement UserData = Session.GetHabbo().GetAchievementData(AchievementGroup); if (UserData == null) { UserData = new UserAchievement(AchievementGroup, 0, 0); Session.GetHabbo().Achievements.TryAdd(AchievementGroup, UserData); } int TotalLevels = AchievementData.Levels.Count; if (UserData != null && UserData.Level == TotalLevels) return false; // done, no more. int TargetLevel = (UserData != null ? UserData.Level + 1 : 1); if (TargetLevel > TotalLevels) TargetLevel = TotalLevels; AchievementLevel TargetLevelData = AchievementData.Levels[TargetLevel]; int NewProgress = 0; if (FromZero) NewProgress = ProgressAmount; else NewProgress = (UserData != null ? UserData.Progress + ProgressAmount : ProgressAmount); int NewLevel = (UserData != null ? UserData.Level : 0); int NewTarget = NewLevel + 1; if (NewTarget > TotalLevels) NewTarget = TotalLevels; if (NewProgress >= TargetLevelData.Requirement) { NewLevel++; NewTarget++; int ProgressRemainder = NewProgress - TargetLevelData.Requirement; NewProgress = 0; if (TargetLevel == 1) Session.GetHabbo().GetBadgeComponent().GiveBadge(AchievementGroup + TargetLevel, true, Session); else { Session.GetHabbo().GetBadgeComponent().RemoveBadge(Convert.ToString(AchievementGroup + (TargetLevel - 1))); Session.GetHabbo().GetBadgeComponent().GiveBadge(AchievementGroup + TargetLevel, true, Session); } if (NewTarget > TotalLevels) { NewTarget = TotalLevels; } Session.SendMessage(new AchievementUnlockedComposer(AchievementData, TargetLevel, TargetLevelData.RewardPoints, TargetLevelData.RewardPixels)); Session.GetHabbo().GetMessenger().BroadcastAchievement(Session.GetHabbo().Id, Users.Messenger.MessengerEventTypes.ACHIEVEMENT_UNLOCKED, AchievementGroup + TargetLevel); using (IQueryAdapter dbClient = PlusEnvironment.GetDatabaseManager().GetQueryReactor()) { dbClient.SetQuery("REPLACE INTO `user_achievements` VALUES ('" + Session.GetHabbo().Id + "', @group, '" + NewLevel + "', '" + NewProgress + "')"); dbClient.AddParameter("group", AchievementGroup); dbClient.RunQuery(); } UserData.Level = NewLevel; UserData.Progress = NewProgress; Session.GetHabbo().Duckets += TargetLevelData.RewardPixels; Session.GetHabbo().GetStats().AchievementPoints += TargetLevelData.RewardPoints; Session.SendMessage(new HabboActivityPointNotificationComposer(Session.GetHabbo().Duckets, TargetLevelData.RewardPixels)); Session.SendMessage(new AchievementScoreComposer(Session.GetHabbo().GetStats().AchievementPoints)); AchievementLevel NewLevelData = AchievementData.Levels[NewTarget]; Session.SendMessage(new AchievementProgressedComposer(AchievementData, NewTarget, NewLevelData, TotalLevels, Session.GetHabbo().GetAchievementData(AchievementGroup))); return true; } else { UserData.Level = NewLevel; UserData.Progress = NewProgress; using (IQueryAdapter dbClient = PlusEnvironment.GetDatabaseManager().GetQueryReactor()) { dbClient.SetQuery("REPLACE INTO `user_achievements` VALUES ('" + Session.GetHabbo().Id + "', @group, '" + NewLevel + "', '" + NewProgress + "')"); dbClient.AddParameter("group", AchievementGroup); dbClient.RunQuery(); } Session.SendMessage(new AchievementProgressedComposer(AchievementData, TargetLevel, TargetLevelData, TotalLevels, Session.GetHabbo().GetAchievementData(AchievementGroup))); } return false; }