private static void GetUserBadges(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } Session TargetSession = SessionManager.GetSessionByCharacterId(Message.PopWiredUInt32()); if (TargetSession == null) { return; } Session.SendData(RoomUserBadgesComposer.Compose(TargetSession.CharacterId, TargetSession.BadgeCache.EquippedBadges)); }
private static void SetBadgeOrder(Session Session, ClientMessage Message) { int i = 0; Dictionary <int, Badge> NewSettings = new Dictionary <int, Badge>(); while (Message.RemainingLength > 0) { if (i > 5) { continue; } int SlotId = Message.PopWiredInt32(); string BadgeCode = Message.PopString(); Badge BadgeRef = new Badge(BadgeCode); if (BadgeRef == null || !Session.BadgeCache.ContainsCode(BadgeCode) || SlotId >= 6 || SlotId <= 0 || NewSettings.ContainsKey(SlotId)) { continue; } NewSettings.Add(SlotId, BadgeRef); i++; } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Session.BadgeCache.UpdateBadgeOrder(MySqlClient, NewSettings); } RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } Instance.BroadcastMessage(RoomUserBadgesComposer.Compose(Session.CharacterId, Session.BadgeCache.EquippedBadges)); QuestManager.ProgressUserQuest(Session, QuestType.PROFILE_BADGE); }
private static void OnPurchase(Session Session, ClientMessage Message) { int PageId = Message.PopWiredInt32(); uint ItemId = Message.PopWiredUInt32(); string Data = Message.PopString(); CatalogPage Page = CatalogManager.GetCatalogPage(PageId); if (Page == null || Page.DummyPage || !Page.Visible || (Page.RequiredRight.Length > 0 && !Session.HasRight(Page.RequiredRight))) { return; } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { switch (Page.Template) { default: CatalogItem Item = Page.GetItem(ItemId); if (Item == null || (Item.ClubRestriction == 1 && !Session.HasRight("club_regular")) || (Item.ClubRestriction == 2 && !Session.HasRight("club_vip"))) { return; } HandlePurchase(MySqlClient, Session, Item, Data); break; case "club_buy": CatalogClubOffer Offer = CatalogManager.GetClubOffer(ItemId); if (Offer == null || (Offer.Price > 0 && Session.CharacterInfo.CreditsBalance < Offer.Price) || (int)Offer.Level < (int)Session.SubscriptionManager.SubscriptionLevel) { return; } string BasicAchievement = "ACH_BasicClub"; string VipAchievement = "ACH_VipClub"; // Extend membership and take credits Session.CharacterInfo.UpdateCreditsBalance(MySqlClient, -Offer.Price); Session.SubscriptionManager.AddOrExtend((int)Offer.Level, Offer.LengthSeconds); // Check if we need to manually award basic/vip badges bool NeedsBasicUnlock = !Session.BadgeCache.ContainsCodeWith(BasicAchievement); bool NeedsVipUnlock = !Session.BadgeCache.ContainsCodeWith(VipAchievement); // Reload the badge cache (reactivating any disabled subscription badges) Session.BadgeCache.ReloadCache(MySqlClient, Session.AchievementCache); // Calculate progress int Progress = (int)Math.Ceiling((double)(Offer.LengthDays / 31)); if (Progress <= 0) { Progress = 1; } // Progress VIP achievement if (Offer.Level >= ClubSubscriptionLevel.VipClub) { NeedsVipUnlock = !AchievementManager.ProgressUserAchievement(MySqlClient, Session, VipAchievement, Progress) && NeedsVipUnlock; } else { NeedsVipUnlock = false; } // Progress basic achievement NeedsBasicUnlock = !AchievementManager.ProgressUserAchievement(MySqlClient, Session, BasicAchievement, Progress) && NeedsBasicUnlock; // Virtually unlock the basic achievement without reward if needed if (NeedsBasicUnlock) { Achievement Achievement = AchievementManager.GetAchievement(BasicAchievement); if (Achievement != null) { UserAchievement UserAchievement = Session.AchievementCache.GetAchievementData( BasicAchievement); if (UserAchievement != null) { Session.SendData(AchievementUnlockedComposer.Compose(Achievement, UserAchievement.Level, 0, 0)); } } } // Virtually unlock the VIP achievement without reward if needed if (NeedsVipUnlock) { Achievement Achievement = AchievementManager.GetAchievement(VipAchievement); if (Achievement != null) { UserAchievement UserAchievement = Session.AchievementCache.GetAchievementData( VipAchievement); if (UserAchievement != null) { Session.SendData(AchievementUnlockedComposer.Compose(Achievement, UserAchievement.Level, 0, 0)); } } } // Disable any VIP badges if they still aren't valid if (Session.SubscriptionManager.SubscriptionLevel < ClubSubscriptionLevel.VipClub) { Session.BadgeCache.DisableSubscriptionBadge(VipAchievement); } // Synchronize equipped badges if the user has unlocked anything if (NeedsVipUnlock || NeedsBasicUnlock) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance != null) { Instance.BroadcastMessage(RoomUserBadgesComposer.Compose(Session.CharacterId, Session.BadgeCache.EquippedBadges)); } } // Clear catalog cache for user (in case of changes) CatalogManager.ClearCacheGroup(Session.CharacterId); // Send new data to client Session.SendData(CatalogPurchaseResultComposer.Compose(Offer)); Session.SendData(CreditsBalanceComposer.Compose(Session.CharacterInfo.CreditsBalance)); Session.SendData(FuseRightsListComposer.Compose(Session)); Session.SendData(SubscriptionStatusComposer.Compose(Session.SubscriptionManager, true)); //Session.SendData(ClubGiftReadyComposer.Compose(1)); break; } } }
public static bool ProgressUserAchievement(SqlDatabaseClient MySqlClient, Session Session, string AchievementGroup, int ProgressAmount) { if (!mAchievements.ContainsKey(AchievementGroup)) { return(false); } Achievement AchievementData = null; lock (mSyncRoot) { AchievementData = mAchievements[AchievementGroup]; } UserAchievement UserData = Session.AchievementCache.GetAchievementData(AchievementGroup); 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 = (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; Badge BadgeData = RightsManager.GetBadgeByCode(AchievementGroup + TargetLevel); if (NewTarget > TotalLevels) { NewTarget = TotalLevels; } Session.BadgeCache.UpdateAchievementBadge(MySqlClient, AchievementGroup, BadgeData); Session.NewItemsCache.MarkNewItem(MySqlClient, 4, BadgeData.Id); Session.SendData(InventoryNewItemsComposer.Compose(4, BadgeData.Id)); Session.CharacterInfo.UpdateActivityPointsBalance(MySqlClient, TargetLevelData.PixelReward); Session.SendData(ActivityPointsBalanceComposer.Compose(Session.CharacterInfo.ActivityPointsBalance, TargetLevelData.PixelReward)); Session.SendData(AchievementUnlockedComposer.Compose(AchievementData, TargetLevel, TargetLevelData.PointsReward, TargetLevelData.PixelReward)); Session.AchievementCache.AddOrUpdateData(MySqlClient, AchievementGroup, NewLevel, NewProgress); Session.CharacterInfo.UpdateScore(MySqlClient, TargetLevelData.PointsReward); Session.SendData(AchievementScoreUpdateComposer.Compose(Session.CharacterInfo.Score)); AchievementLevel NewLevelData = AchievementData.Levels[NewTarget]; Session.SendData(AchievementProgressComposer.Compose(AchievementData, NewTarget, NewLevelData, TotalLevels, Session.AchievementCache.GetAchievementData(AchievementGroup))); Session.SendInfoUpdate(); Session.MessengerFriendCache.BroadcastToFriends(MessengerFriendEventComposer.Compose(Session.CharacterId, MessengerFriendEventType.AchievementUnlocked, BadgeData.Code)); RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance != null) { Instance.BroadcastMessage(RoomUserBadgesComposer.Compose(Session.CharacterId, Session.BadgeCache.EquippedBadges)); } if (ProgressRemainder > 0) { ProgressUserAchievement(MySqlClient, Session, AchievementGroup, ProgressRemainder); } return(true); } Session.AchievementCache.AddOrUpdateData(MySqlClient, AchievementGroup, NewLevel, NewProgress); Session.SendData(AchievementProgressComposer.Compose(AchievementData, TargetLevel, TargetLevelData, TotalLevels, Session.AchievementCache.GetAchievementData(AchievementGroup))); return(false); }
private void ProcessData(byte[] Data) { if (Data.Length == 0) { return; } ASCIIEncoding enc = new ASCIIEncoding(); String command = enc.GetString(Data); command = command.Replace("\r\n", "").Trim(); String[] bits = command.Split(Convert.ToChar(1)); command = bits[0]; Session Target = null; switch (command) { case "status": SendData("1"); break; case "human": is_human = true; SendData("Welcome. To get a list of commands type commands."); break; case "close": case "exit": SendData("Bye"); stop(mId); break; case "ha": if (bits.Length < 2) { SendData("Command must be ha <message>"); break; } string Alert = UserInputFilter.FilterString(bits[1]); SessionManager.BroadcastPacket(UserAlertModernComposer.Compose("Important notice from Hotel Management", Alert)); break; case "update_catalog": using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { CatalogManager.RefreshCatalogData(MySqlClient); } break; case "update_items": using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { ItemDefinitionManager.Initialize(MySqlClient); } break; case "premium": if (bits.Length < 3 || (bits[1] != "enable" && bits[1] != "disable")) { SendData("Command must be premium (enable|disable) <userid>"); break; } Target = SessionManager.GetSessionByCharacterId(Convert.ToUInt32(bits[2])); if (Target == null) { SendData("User not online"); break; } if (bits[1] == "enable" && !Target.CharacterInfo.IsPremium) { Target.CharacterInfo.IsPremium = true; Target.SendData(UserAlertModernComposer.Compose("Premium", "Your premium was activated")); ServerMessage Welcome = new ServerMessage(575); Welcome.AppendInt32(1); Welcome.AppendInt32(0); Welcome.AppendInt32(1); Target.SendData(Welcome); } else if (bits[1] == "disable" && Target.CharacterInfo.IsPremium) { ServerMessage Welcome = new ServerMessage(575); Welcome.AppendInt32(0); Welcome.AppendInt32(1); Welcome.AppendInt32(0); Target.SendData(Welcome); Target.CharacterInfo.IsPremium = false; Target.SendData(UserAlertModernComposer.Compose("Premium", "Your premium was deactivated")); } Target.SendData(CatalogUpdatedNotificationComposer.Compose()); SendData("OK"); break; case "update_badges": if (bits.Length < 2) { SendData("Command must be update_badges <userid>"); break; } Target = SessionManager.GetSessionByCharacterId(Convert.ToUInt32(bits[1])); if (Target == null) { SendData("User not online"); break; } using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Target.AchievementCache.ReloadCache(MySqlClient); Target.BadgeCache.ReloadCache(MySqlClient, Target.AchievementCache); RoomInstance Instance = RoomManager.GetInstanceByRoomId(Target.CurrentRoomId); if (Instance != null) { Instance.BroadcastMessage(RoomUserBadgesComposer.Compose(Target.CharacterId, Target.BadgeCache.EquippedBadges)); } } SendData("OK"); break; case "": break; default: SendData("Unknown Command."); break; } if (!is_human) { stop(mId); } }