Example #1
0
        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));
        }
Example #2
0
        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;
                }
            }
        }
Example #4
0
        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);
        }
Example #5
0
        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);
            }
        }