Exemplo n.º 1
0
 public void BroadcastStateUpdate(RoomInstance Instance)
 {
     if (mCachedDefinition.Type == ItemType.FloorItem)
     {
         Instance.BroadcastMessage(RoomFloorItemUpdateFlagsComposer.Compose(mId, mDisplayFlags));
     }
     else if (mCachedDefinition.Type == ItemType.WallItem)
     {
         Instance.BroadcastMessage(RoomWallItemMovedComposer.Compose(this));
     }
 }
Exemplo n.º 2
0
        public void SendInfoUpdate()
        {
            if (!Authenticated)
            {
                return;
            }

            SendData(UserInfoUpdateComposer.Compose(0, mCharacterInfo.Figure, mCharacterInfo.Gender, mCharacterInfo.Motto,
                                                    mCharacterInfo.Score));

            if (InRoom)
            {
                RoomInstance Instance = RoomManager.GetInstanceByRoomId(CurrentRoomId);

                if (Instance == null)
                {
                    return;
                }

                RoomActor Actor = Instance.GetActorByReferenceId(CharacterId);

                if (Actor == null)
                {
                    return;
                }

                Instance.BroadcastMessage(UserInfoUpdateComposer.Compose(Actor.Id, mCharacterInfo.Figure, mCharacterInfo.Gender,
                                                                         mCharacterInfo.Motto, mCharacterInfo.Score));
            }
        }
Exemplo n.º 3
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);
        }
Exemplo n.º 4
0
        private static bool HandleRoller(Session Session, Item Item, RoomInstance Instance, ItemEventType Event, int RequestData)
        {
            switch (Event)
            {
            case ItemEventType.UpdateTick:

                List <RoomActor> ActorsToMove = Instance.GetActorsOnPosition(Item.RoomPosition.GetVector2());
                List <Item>      ItemsToMove  = new List <Item>();

                if (ActorsToMove != null)
                {
                    foreach (RoomActor Actor in ActorsToMove)
                    {
                        if (Actor.IsMoving)
                        {
                            continue;
                        }

                        if (Instance.IsValidStep(Actor.Position.GetVector2(), Item.SquareInFront, true))
                        {
                            Actor.PositionToSet = Item.SquareInFront;
                            Instance.BroadcastMessage(RollerEventComposer.Compose(Actor.Position, new Vector3(
                                                                                      Actor.PositionToSet.X, Actor.PositionToSet.Y,
                                                                                      Instance.GetUserStepHeight(Actor.PositionToSet)), Item.Id, Actor.Id, 0));
                        }
                    }
                }

                goto case ItemEventType.InstanceLoaded;

            case ItemEventType.InstanceLoaded:
            case ItemEventType.Placed:

                Item.RequestUpdate(4);
                break;
            }

            return(true);
        }
Exemplo n.º 5
0
        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;
                }
            }
        }
Exemplo n.º 6
0
 public void BroadcastCurrentSongData(RoomInstance Instance)
 {
     Instance.BroadcastMessage(MusicPlayingComposer.Compose(mSong == null ? 0 : mSong.SongData.Id,
                                                            mSongQueuePosition, 0));
 }
Exemplo n.º 7
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);
        }
Exemplo n.º 8
0
        public void ExecuteActions(Item Item, RoomActor Actor)
        {
            Random rnd = new Random();

            foreach (Item ActionItem in mInstance.GetItemsOnPosition(Item.RoomPosition.GetVector2()))
            {
                if (ActionItem.Definition.Behavior == ItemBehavior.WiredEffect)
                {
                    ActionItem.DisplayFlags = "1";
                    ActionItem.BroadcastStateUpdate(mInstance);
                    ActionItem.DisplayFlags = "2";
                    ActionItem.RequestUpdate(4);

                    switch (WiredTypesUtil.EffectFromInt(ActionItem.Definition.BehaviorData))
                    {
                        #region show_message
                    case WiredEffectTypes.show_message:
                        if (Actor == null)
                        {
                            continue;
                        }
                        Actor.Whisper(mWired [ActionItem.Id].Data1, 0, true);
                        break;

                        #endregion
                        #region move_rotate
                    case WiredEffectTypes.move_rotate:
                        if (ActionItem.WiredData.Data2 == 0 && ActionItem.WiredData.Data3 == 0)
                        {
                            continue;
                        }
                        String[] ItemsToMove = ActionItem.WiredData.Data1.Split('|');
                        foreach (String toMove in ItemsToMove)
                        {
                            uint ItemId;
                            uint.TryParse(toMove, out ItemId);
                            Item Move = mInstance.GetItem(ItemId);
                            if (Move == null)
                            {
                                continue;
                            }
                            Vector2 NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y);

                            switch (ActionItem.WiredData.Data2)
                            {
                            case 1:
                                switch (rnd.Next(1, 5))
                                {
                                case 1:
                                    NewPosition = new Vector2(Move.RoomPosition.X - 1, Move.RoomPosition.Y);
                                    break;

                                case 2:
                                    NewPosition = new Vector2(Move.RoomPosition.X + 1, Move.RoomPosition.Y);
                                    break;


                                case 3:
                                    NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y + 1);
                                    break;


                                case 4:
                                    NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y - 1);
                                    break;
                                }
                                break;

                            case 2:
                                if (rnd.Next(0, 2) == 1)
                                {
                                    NewPosition = new Vector2(Move.RoomPosition.X - 1, Move.RoomPosition.Y);
                                }
                                else
                                {
                                    NewPosition = new Vector2(Move.RoomPosition.X + 1, Move.RoomPosition.Y);
                                }

                                break;

                            case 3:
                                if (rnd.Next(0, 2) == 1)
                                {
                                    NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y - 1);
                                }
                                else
                                {
                                    NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y + 1);
                                }

                                break;

                            case 4:
                                NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y - 1);
                                break;

                            case 5:
                                NewPosition = new Vector2(Move.RoomPosition.X + 1, Move.RoomPosition.Y);
                                break;

                            case 6:
                                NewPosition = new Vector2(Move.RoomPosition.X, Move.RoomPosition.Y + 1);
                                break;

                            case 7:
                                NewPosition = new Vector2(Move.RoomPosition.X - 1, Move.RoomPosition.Y);
                                break;
                            }

                            int NewRotation = Move.RoomRotation;

                            switch (ActionItem.WiredData.Data3)
                            {
                            case 1:
                                NewRotation = NewRotation + 2;
                                if (NewRotation == 8)
                                {
                                    NewRotation = 0;
                                }
                                break;

                            case 2:
                                NewRotation = (NewRotation - 2);
                                if (NewRotation == -2)
                                {
                                    NewRotation = 6;
                                }
                                break;

                            case 3:
                                if (rnd.Next(0, 2) == 1)
                                {
                                    goto case 1;
                                }
                                else
                                {
                                    goto case 2;
                                }
                            }



                            bool    IsRotationOnly    = (ActionItem.WiredData.Data2 == 0);
                            Vector3 FinalizedPosition = mInstance.SetFloorItem(null, Move, NewPosition, NewRotation);

                            if (FinalizedPosition != null)
                            {
                                Move.MoveToRoom(null, mInstance.RoomId, FinalizedPosition, NewRotation, "");
                                RoomManager.MarkWriteback(Move, false);

                                mInstance.RegenerateRelativeHeightmap();
                                mInstance.BroadcastMessage(RoomItemUpdatedComposer.Compose(Move));

                                ItemEventDispatcher.InvokeItemEventHandler(null, Move, mInstance, ItemEventType.Moved, IsRotationOnly ? 1 : 0);
                            }
                        }
                        break;

                        #endregion
                        #region match_to_sshot
                    case WiredEffectTypes.match_to_sshot:
                        String[] Selected = ActionItem.WiredData.Data5.Split('+');
                        foreach (String FullData in Selected)
                        {
                            if (!FullData.Contains('#'))
                            {
                                continue;
                            }

                            String[] Data = FullData.Split('#');
                            if (Data.Length != 4)
                            {
                                continue;
                            }

                            uint     Id       = uint.Parse(Data [0]);
                            String[] Position = Data [1].Split('|');
                            int      Rotation = int.Parse(Data [2]);
                            String   Flags    = Data [3];

                            int  X = int.Parse(Position [0]);
                            int  Y = int.Parse(Position [1]);
                            uint Z = uint.Parse(Position [2]);

                            Item AffectedItem = mInstance.GetItem(Id);

                            if (AffectedItem == null)
                            {
                                continue;
                            }

                            Boolean IsRotationOnly = (X == AffectedItem.RoomPosition.X && Y == AffectedItem.RoomPosition.Y && Z == AffectedItem.RoomPosition.Z);

                            Vector2 NewPosition = new Vector2(X, Y);

                            if (ActionItem.WiredData.Data2 == 1)
                            {
                                AffectedItem.Flags        = Flags;
                                AffectedItem.DisplayFlags = Item.Flags;
                                AffectedItem.BroadcastStateUpdate(mInstance);
                            }

                            if (ActionItem.WiredData.Data3 == 0)
                            {
                                Rotation = AffectedItem.RoomRotation;
                            }

                            if (ActionItem.WiredData.Data4 == 0)
                            {
                                NewPosition = AffectedItem.RoomPosition.GetVector2();
                            }

                            if (ActionItem.WiredData.Data4 == 1 || ActionItem.WiredData.Data3 == 1)
                            {
                                Vector3 FinalizedPosition = mInstance.SetFloorItem(null, AffectedItem, NewPosition, Rotation);
                                AffectedItem.MoveToRoom(null, mInstance.RoomId, FinalizedPosition, Rotation, "");

                                RoomManager.MarkWriteback(AffectedItem, false);

                                mInstance.RegenerateRelativeHeightmap();
                                mInstance.BroadcastMessage(RoomItemUpdatedComposer.Compose(AffectedItem));

                                ItemEventDispatcher.InvokeItemEventHandler(null, AffectedItem, mInstance, ItemEventType.Moved, IsRotationOnly ? 1 : 0);
                            }
                            else if (ActionItem.WiredData.Data2 == 1)
                            {
                                RoomManager.MarkWriteback(AffectedItem, true);
                            }
                        }
                        break;

                        #endregion
                    case WiredEffectTypes.teleport_to:
                        if (Actor == null)
                        {
                            continue;
                        }

                        String[] Selected2 = ActionItem.WiredData.Data1.Split('|');
                        String   ItemIdS   = Actor.FurniOnId.ToString();

                        while (Actor.FurniOnId.ToString() == ItemIdS)
                        {
                            ItemIdS = Selected2 [rnd.Next(0, Selected2.Length)];
                        }

                        uint ItemId2;
                        uint.TryParse(ItemIdS, out ItemId2);
                        Item AffectedItem2 = mInstance.GetItem(ItemId2);
                        if (AffectedItem2 == null)
                        {
                            continue;
                        }

                        Actor.PositionToSet = AffectedItem2.RoomPosition.GetVector2();
                        Actor.UpdateNeeded  = true;
                        break;

                    case WiredEffectTypes.toggle_state:
                        String[] Selected3 = ActionItem.WiredData.Data1.Split('|');

                        foreach (String ItemIdS2 in Selected3)
                        {
                            uint ItemId3;
                            uint.TryParse(ItemIdS2, out ItemId3);
                            Item AffectedItem3 = mInstance.GetItem(ItemId3);
                            if (AffectedItem3 == null)
                            {
                                continue;
                            }

                            int CurrentState = 0;
                            int.TryParse(AffectedItem3.Flags, out CurrentState);

                            int NewState = CurrentState + 1;

                            if (CurrentState < 0 || CurrentState >= (AffectedItem3.Definition.BehaviorData - 1))
                            {
                                NewState = 0;
                            }

                            if (CurrentState != NewState)
                            {
                                AffectedItem3.Flags        = NewState.ToString();
                                AffectedItem3.DisplayFlags = AffectedItem3.Flags;

                                RoomManager.MarkWriteback(AffectedItem3, true);

                                AffectedItem3.BroadcastStateUpdate(mInstance);
                            }
                        }
                        break;
                    }
                }
            }
        }
Exemplo n.º 9
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);
            }
        }
Exemplo n.º 10
0
        public static bool HandleCommand(Session Session, string Input)
        {
            Input = Input.Substring(1, Input.Length - 1);
            string[] Bits = Input.Split(' ');

            RoomInstance Instance      = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId);
            RoomActor    Actor         = (Instance == null ? null : Instance.GetActorByReferenceId(Session.CharacterId));
            Session      TargetSession = null;
            RoomActor    TargetActor   = null;
            String       TargetName    = "";

            switch (Bits[0].ToLower())
            {
                #region users
                #region misc
            case "commands":
            {
                Session.SendData(NotificationMessageComposer.Compose(Localization.GetValue("command.commands.info") + ":\n\n:commands\n:online\n:about\n:pickall"));
                return(true);
            }

            case "online":
            {
                List <string> OnlineUsers = SessionManager.ConnectedUserData.Values.ToList();
                StringBuilder MessageText = new StringBuilder(Localization.GetValue("command.online", OnlineUsers.Count.ToString()) + "\n");

                foreach (string OnlineUser in OnlineUsers)
                {
                    MessageText.Append('\n');
                    MessageText.Append("- " + OnlineUser);
                }

                Session.SendData(NotificationMessageComposer.Compose(MessageText.ToString()));
                return(true);
            }

            case "about":

                Session.SendData(UserAlertModernComposer.Compose("Powered by Snowlight", "This hotel is proudly powered by Snowlight,\nedited by flx5. \nCredits to Meth0d."));
                return(true);

                #endregion
                #region furni
            case "empty":
            case "emptyinv":

                if (Bits.Length > 2)
                {
                    return(false);
                }

                if (!Session.HasRight("hotel_admin") && Bits.Length == 2)
                {
                    return(false);
                }

                Session Targetuser = Session;

                if (Bits.Length == 2)
                {
                    uint userid = CharacterResolverCache.GetUidFromName(Bits[1]);
                    Targetuser = SessionManager.GetSessionByCharacterId(userid);
                }

                Targetuser.PetInventoryCache.ClearAndDeleteAll();
                Targetuser.InventoryCache.ClearAndDeleteAll();
                Targetuser.SendData(InventoryRefreshComposer.Compose());
                Targetuser.SendData(NotificationMessageComposer.Compose(Localization.GetValue("command.emptyinv.sucess")));
                return(true);

            case "pickall":

                if (!Instance.CheckUserRights(Session, true))
                {
                    Session.SendData(NotificationMessageComposer.Compose(Localization.GetValue("command.pickall.error")));
                    return(true);
                }
                Instance.PickAllToUserInventory(Session);
                return(true);

                #endregion
                #region extra
            case "moonwalk":
                if (!Session.CharacterInfo.IsPremium)
                {
                    return(false);
                }

                Actor.WalkingBackwards = !Actor.WalkingBackwards;
                Actor.Dance(Actor.WalkingBackwards ? 4 : 0);
                Session.SendData(RoomChatComposer.Compose(Actor.Id, "TEST " + Actor.WalkingBackwards, 0, ChatType.Whisper));
                return(true);

                #region push
            case "push":
                if (!Session.CharacterInfo.IsPremium || Bits.Length != 2)
                {
                    return(false);
                }
                TargetName  = UserInputFilter.FilterString(Bits[1].Trim());
                TargetActor = Instance.GetActorByReferenceId(CharacterResolverCache.GetUidFromName(TargetName));

                if (TargetActor == null || TargetActor.IsMoving)
                {
                    return(false);
                }



                if ((TargetActor.Position.X == Actor.Position.X - 1) || (TargetActor.Position.X == Actor.Position.X + 1) || (TargetActor.Position.Y == Actor.Position.Y - 1) || (TargetActor.Position.Y == Actor.Position.Y + 1))
                {
                    Vector2 Newposition = null;

                    if (TargetActor.Position.X == Actor.Position.X - 1 && TargetActor.Position.Y == Actor.Position.Y)
                    {
                        Newposition = new Vector2(TargetActor.Position.X - 1, TargetActor.Position.Y);
                    }

                    if (TargetActor.Position.X == Actor.Position.X + 1 && TargetActor.Position.Y == Actor.Position.Y)
                    {
                        Newposition = new Vector2(TargetActor.Position.X + 1, TargetActor.Position.Y);
                    }

                    if (TargetActor.Position.X == Actor.Position.X && TargetActor.Position.Y == Actor.Position.Y + 1)
                    {
                        Newposition = new Vector2(TargetActor.Position.X, TargetActor.Position.Y + 1);
                    }

                    if (TargetActor.Position.X == Actor.Position.X && TargetActor.Position.Y == Actor.Position.Y - 1)
                    {
                        Newposition = new Vector2(TargetActor.Position.X, TargetActor.Position.Y - 1);
                    }

                    if (TargetActor.Position.X == Actor.Position.X + 1 && TargetActor.Position.Y == Actor.Position.Y + 1)
                    {
                        Newposition = new Vector2(TargetActor.Position.X + 1, TargetActor.Position.Y + 1);
                    }

                    if (TargetActor.Position.X == Actor.Position.X - 1 && TargetActor.Position.Y == Actor.Position.Y - 1)
                    {
                        Newposition = new Vector2(TargetActor.Position.X - 1, TargetActor.Position.Y - 1);
                    }

                    if (TargetActor.Position.X == Actor.Position.X - 1 && TargetActor.Position.Y == Actor.Position.Y + 1)
                    {
                        Newposition = new Vector2(TargetActor.Position.X - 1, TargetActor.Position.Y + 1);
                    }

                    if (TargetActor.Position.X == Actor.Position.X + 1 && TargetActor.Position.Y == Actor.Position.Y - 1)
                    {
                        Newposition = new Vector2(TargetActor.Position.X + 1, TargetActor.Position.Y - 1);
                    }

                    if (Newposition == null || !Instance.IsValidPosition(Newposition) || (Instance.Model.DoorPosition.GetVector2().X == Newposition.X && Instance.Model.DoorPosition.GetVector2().Y == Newposition.Y))
                    {
                        return(false);
                    }

                    TargetActor.MoveTo(Newposition);
                    Actor.Chat("*" + Session.CharacterInfo.Username + " pushes " + Bits[1] + "*");
                    return(true);
                }
                else
                {
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, Bits[1] + " is not in your area.", 0, ChatType.Whisper));
                    return(false);
                }

                #endregion

            case "pull":
                if (!Session.CharacterInfo.IsPremium || Bits.Length != 2)
                {
                    return(false);
                }

                TargetName  = UserInputFilter.FilterString(Bits[1].Trim());
                TargetActor = Instance.GetActorByReferenceId(CharacterResolverCache.GetUidFromName(TargetName));

                if (TargetActor == null || TargetActor.IsMoving)
                {
                    return(false);
                }

                if ((TargetActor.Position.X > Actor.Position.X - 10) && (TargetActor.Position.X < Actor.Position.X + 10) && (TargetActor.Position.Y > Actor.Position.Y - 10) && (TargetActor.Position.Y < Actor.Position.Y + 10) && (Instance.Model.DoorPosition.GetVector2().X == Actor.SquareInFront.X && Instance.Model.DoorPosition.GetVector2().Y == Actor.SquareInFront.Y))
                {
                    TargetActor.MoveTo(Actor.SquareInFront);
                    Actor.Chat("*" + Session.CharacterInfo.Username + " pulls " + Bits[1] + "*");
                    return(true);
                }

                Session.SendData(RoomChatComposer.Compose(Actor.Id, Bits[1] + " is not in your area.", 0, ChatType.Whisper));
                return(false);

                #endregion
                #endregion

                #region debugging
                #region items
            case "update_catalog":
            {
                if (!Session.HasRight("hotel_admin"))
                {
                    return(false);
                }
                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    Snowlight.Game.Catalog.CatalogManager.RefreshCatalogData(MySqlClient);
                }
                Session.SendData(NotificationMessageComposer.Compose(Localization.GetValue("command.updatecatalog.success")));
                return(true);
            }

            case "update_items":
            {
                if (!Session.HasRight("hotel_admin"))
                {
                    return(false);
                }
                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    Snowlight.Game.Items.ItemDefinitionManager.Initialize(MySqlClient);
                }
                Session.SendData(NotificationMessageComposer.Compose("Items reloaded"));
                return(true);
            }

                #endregion
                #region rooms
            case "unload":
                if (!Session.HasRight("hotel_admin"))
                {
                    return(false);
                }
                Instance.BroadcastMessage(NotificationMessageComposer.Compose("This room was unloaded!"));
                Instance.Unload();
                return(true);

            case "t":

                if (!Session.HasRight("hotel_admin"))
                {
                    return(false);
                }

                Session.SendData(NotificationMessageComposer.Compose("Position: " + Actor.Position.ToString() + ", Rotation: " + Actor.BodyRotation));
                return(true);

                #endregion

            case "update_rights":
                if (!Session.HasRight("hotel_admin"))
                {
                    return(false);
                }

                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    RightsManager.RebuildCache(MySqlClient);
                }

                return(true);

            case "effect":

                if (!Session.HasRight("hotel_admin"))
                {
                    return(false);
                }

                if (Bits.Length < 1)
                {
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, "Invalid syntax - :effect <id>", 0, ChatType.Whisper));
                    return(true);
                }

                int effectID;

                if (int.TryParse(Bits[1], out effectID))
                {
                    Actor.ApplyEffect(effectID);
                    Session.CurrentEffect = 0;
                }
                else
                {
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, "Invalid syntax - :effect <id>", 0, ChatType.Whisper));
                }

                return(true);

            case "clipping":

                if (!Session.HasRight("hotel_admin"))
                {
                    return(false);
                }

                Actor.OverrideClipping = !Actor.OverrideClipping;
                Actor.ApplyEffect(Actor.ClippingEnabled ? 0 : 23);
                Session.CurrentEffect = 0;
                return(true);

                #endregion

                #region moderation
                #region kick
            case "superkick":      // Kick User out of the Hotel
            {
                if (!Session.HasRight("hotel_admin"))
                {
                    return(false);
                }

                if (Bits.Length < 2)
                {
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.invalidsyntax") + " - :kick <username>", 0, ChatType.Whisper));
                    return(true);
                }

                TargetName    = UserInputFilter.FilterString(Bits[1].Trim());
                TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(TargetName));

                if (TargetSession == null || TargetSession.HasRight("moderation_tool") || !TargetSession.InRoom)
                {
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.targetuser") + " '" + TargetName + "' is offline or cannot be kicked.", 0, ChatType.Whisper));
                    return(true);
                }

                SessionManager.StopSession(TargetSession.Id);

                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    ModerationLogs.LogModerationAction(MySqlClient, Session, "Superkicked user from server (chat command)",
                                                       "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ").");
                }

                return(true);
            }

            case "kick":     //kick User out of Room
            {
                if (!Session.HasRight("moderation_tool"))
                {
                    return(false);
                }

                if (Bits.Length < 2)
                {
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.invalidsyntax") + " - :kick <username>", 0, ChatType.Whisper));
                    return(true);
                }

                TargetName    = UserInputFilter.FilterString(Bits[1].Trim());
                TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(TargetName));

                if (TargetSession == null || TargetSession.HasRight("moderation_tool") || !TargetSession.InRoom)
                {
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.targetuser") + " '" + TargetName + "' is offline, not in a room, or cannot be kicked.", 0, ChatType.Whisper));
                    return(true);
                }

                RoomManager.RemoveUserFromRoom(TargetSession, true);
                TargetSession.SendData(NotificationMessageComposer.Compose(Localization.GetValue("command.kick.success")));

                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    ModerationLogs.LogModerationAction(MySqlClient, Session, "Kicked user from room (chat command)",
                                                       "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ").");
                }

                return(true);
            }

                #endregion
                #region mute
            case "roomunmute":
            {
                if (!Session.HasRight("mute"))
                {
                    return(false);
                }

                if (Instance.RoomMuted)
                {
                    Instance.RoomMuted = false;
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.roomunmute.success"), 0, ChatType.Whisper));
                }
                else
                {
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.roomunmute.error"), 0, ChatType.Whisper));
                }

                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    ModerationLogs.LogModerationAction(MySqlClient, Session, "Unmuted room", "Room '"
                                                       + Instance.Info.Name + "' (ID " + Instance.RoomId + ")");
                }

                return(true);
            }

            case "roommute":
            {
                if (!Session.HasRight("mute"))
                {
                    return(false);
                }

                if (!Instance.RoomMuted)
                {
                    Instance.RoomMuted = true;
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.roommute.success"), 0, ChatType.Whisper));
                }
                else
                {
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.roommute.error"), 0, ChatType.Whisper));
                }

                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    ModerationLogs.LogModerationAction(MySqlClient, Session, "Muted room", "Room '"
                                                       + Instance.Info.Name + "' (ID " + Instance.RoomId + ")");
                }

                return(true);
            }

            case "unmute":
            {
                if (!Session.HasRight("mute"))
                {
                    return(false);
                }

                if (Bits.Length < 2)
                {
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.invalidsyntax") + " - :unmute <username>", 0, ChatType.Whisper));
                    return(true);
                }

                TargetName = UserInputFilter.FilterString(Bits[1].Trim());

                TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(TargetName));

                if (TargetSession == null)
                {
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.targetuser") + " '" + TargetName + "' " + Localization.GetValue("command.cannotproceedcmd3"), 0, ChatType.Whisper));
                    return(true);
                }

                if (!TargetSession.CharacterInfo.IsMuted)
                {
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.targetuser") + " '" + TargetName + "' " + Localization.GetValue("command.unmute.error"), 0, ChatType.Whisper));
                    return(true);
                }

                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    TargetSession.CharacterInfo.Unmute(MySqlClient);
                }

                TargetSession.SendData(NotificationMessageComposer.Compose(Localization.GetValue("command.unmute.sucess")));
                Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.targetuser") + " '" + TargetName + "' " + Localization.GetValue("command.unmute.sucess2"), 0, ChatType.Whisper));

                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    ModerationLogs.LogModerationAction(MySqlClient, Session, "Unmuted user",
                                                       "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ").");
                }

                return(true);
            }

            case "mute":
            {
                if (!Session.HasRight("mute"))
                {
                    return(false);
                }

                if (Bits.Length < 2)
                {
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.invalidsyntax") + " - :mute <username> [length in seconds]", 0, ChatType.Whisper));
                    return(true);
                }

                TargetName = UserInputFilter.FilterString(Bits[1].Trim());
                int TimeToMute = 0;

                if (Bits.Length >= 3)
                {
                    int.TryParse(Bits[2], out TimeToMute);
                }

                if (TimeToMute <= 0)
                {
                    TimeToMute = 300;
                }

                if (TimeToMute > 3600)
                {
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.mute.error"), 0, ChatType.Whisper));
                    return(true);
                }

                TargetSession = SessionManager.GetSessionByCharacterId(CharacterResolverCache.GetUidFromName(TargetName));

                if (TargetSession == null || TargetSession.HasRight("mute"))
                {
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.targetuser") + " '" + TargetName + "' " + Localization.GetValue("command.cannotproceedcmd4"), 0, ChatType.Whisper));
                    return(true);
                }

                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    TargetSession.CharacterInfo.Mute(MySqlClient, TimeToMute);
                    ModerationLogs.LogModerationAction(MySqlClient, Session, "Muted user",
                                                       "User '" + TargetSession.CharacterInfo.Username + "' (ID " + TargetSession.CharacterId + ") for " + TimeToMute + " seconds.");
                }

                TargetSession.SendData(RoomMutedComposer.Compose(TimeToMute));
                Session.SendData(RoomChatComposer.Compose(Actor.Id, Localization.GetValue("command.mute.sucess.part1") + " '" + TargetName + "' " + Localization.GetValue("command.mute.sucess.part2") + " " + TimeToMute + " seconds.", 0, ChatType.Whisper));
                return(true);
            }

                #endregion
                #region credits
            case "coins":
            case "credits":
                using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
                {
                    if (!Session.HasRight("hotel_admin"))
                    {
                        return(false);
                    }
                    if (Bits.Length < 2)
                    {
                        Session.SendData(RoomChatComposer.Compose(Actor.Id, "Invalid syntax - :" + Bits[0].ToLower() + " <user> <amount>", 0, ChatType.Whisper));
                        return(false);
                    }
                    int Valor;
                    if (!Int32.TryParse(Bits[2], out Valor))
                    {
                        Session.SendData(RoomChatComposer.Compose(Actor.Id, "Amount must be numeric!", 0, ChatType.Whisper));
                        return(false);
                    }

                    TargetName = UserInputFilter.FilterString(Bits[1].Trim());
                    uint UserID = CharacterResolverCache.GetUidFromName(TargetName);

                    if (UserID == 0)
                    {
                        Session.SendData(RoomChatComposer.Compose(Actor.Id, "User not found!", 0, ChatType.Whisper));
                        return(false);
                    }
                    Session TargetUser = SessionManager.GetSessionByCharacterId(UserID);
                    if (TargetUser == null)
                    {
                        Session.SendData(RoomChatComposer.Compose(Actor.Id, "User not online!", 0, ChatType.Whisper));
                        return(false);
                    }
                    TargetUser.CharacterInfo.UpdateCreditsBalance(MySqlClient, (int)Valor);
                    TargetUser.SendData(RoomChatComposer.Compose(TargetUser.Id, "You received " + Valor + " coins!", 0, ChatType.Whisper));
                    Session.SendData(RoomChatComposer.Compose(Actor.Id, TargetName + " received " + Valor + " coins!", 0, ChatType.Whisper));
                    TargetUser.SendData(CreditsBalanceComposer.Compose(TargetUser.CharacterInfo.CreditsBalance));

                    return(true);
                }

                #endregion
                #region messages
            case "ha":
            {
                if (!Session.HasRight("hotel_admin"))
                {
                    return(false);
                }
                string Alert = UserInputFilter.FilterString(MergeInputs(Bits, 1));
                SessionManager.BroadcastPacket(UserAlertModernComposer.Compose("Important notice from Hotel Management", Alert));
                return(true);
            }
                #endregion
                #endregion
            }


            return(false);
        }
Exemplo n.º 11
0
        private static bool HandleRoller(Session Session, Item Item, RoomInstance Instance, ItemEventType Event, int RequestData, uint Opcode)
        {
            switch (Event)
            {
            case ItemEventType.UpdateTick:

                List <RoomActor> ActorsToMove = Instance.GetActorsOnPosition(Item.RoomPosition.GetVector2());
                List <Item>      ItemsToMove  = new List <Item>();
                ItemsToMove.AddRange(Instance.GetItemsOnPosition(Item.RoomPosition.GetVector2()));

                if (ActorsToMove != null)
                {
                    foreach (RoomActor Actor in ActorsToMove)
                    {
                        if (Actor.IsMoving)
                        {
                            continue;
                        }

                        if (Instance.IsValidStep(Actor.Position.GetVector2(), Item.SquareInFront, true))
                        {
                            Actor.PositionToSet = Item.SquareInFront;
                            Instance.BroadcastMessage(RollerEventComposer.Compose(Actor.Position, new Vector3(
                                                                                      Actor.PositionToSet.X, Actor.PositionToSet.Y,
                                                                                      Instance.GetUserStepHeight(Actor.PositionToSet)), Item.Id, Actor.Id, 0));
                        }
                    }
                }
                if (ItemsToMove.Count != 0)
                {
                    foreach (Item item in ItemsToMove)
                    {
                        if (item == Item)
                        {
                            continue;
                        }

                        if (Item.RoomPosition.X == item.RoomPosition.X && Item.RoomPosition.Y == item.RoomPosition.Y)
                        {
                            Vector2 NewPosition       = new Vector2(Item.SquareInFront.X, Item.SquareInFront.Y);
                            int     NewRotation       = item.RoomRotation;
                            Vector3 FinalizedPosition = Instance.SetFloorItem(Session, item, NewPosition, NewRotation);
                            Vector3 oldpos            = item.RoomPosition;

                            if (FinalizedPosition != null)
                            {
                                item.MoveToRoom(null, Instance.RoomId, FinalizedPosition, NewRotation, string.Empty);
                                RoomManager.MarkWriteback(item, false);

                                Instance.RegenerateRelativeHeightmap();
                                Instance.BroadcastMessage(RoomItemUpdatedComposer.Compose(item));

                                ItemEventDispatcher.InvokeItemEventHandler(Session, item, Instance, ItemEventType.Moved, 0);
                                Instance.BroadcastMessage(RollerEventComposer.Compose(oldpos, FinalizedPosition, Item.Id, 0, item.Id));
                            }
                        }
                    }
                }


                goto case ItemEventType.InstanceLoaded;

            case ItemEventType.InstanceLoaded:
            case ItemEventType.Placed:

                Item.RequestUpdate(4);
                break;
            }

            return(true);
        }