private static void AddToPlaylist(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || !Instance.CheckUserRights(Session, true) || Instance.MusicController == null || Instance.MusicController.PlaylistSize >= Instance.MusicController.PlaylistCapacity) { return; } Item DiskItem = Session.InventoryCache.GetItem(Message.PopWiredUInt32()); if (DiskItem == null || DiskItem.Definition.Behavior != ItemBehavior.MusicDisk) { return; } int NewOrder = Instance.MusicController.AddDisk(DiskItem); if (NewOrder < 0) { return; } Session.InventoryCache.RemoveItem(DiskItem.Id); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { DiskItem.MoveToSoundManager(MySqlClient, Instance.MusicController.LinkedItemId, NewOrder); } Session.SendData(InventoryItemRemovedComposer.Compose(DiskItem.Id)); Session.SendData(JukeboxPlaylistComposer.Compose(Instance.MusicController.PlaylistCapacity, Instance.MusicController.Playlist.Values.ToList())); }
private static void RecycleItems(Session Session, ClientMessage Message) { if (!mEnabled) { Session.SendData(NotificationMessageComposer.Compose("The recycler is temporarily disabled. Please check back later.")); return; } int Amount = Message.PopWiredInt32(); RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || Amount != 5) { return; } ItemDefinition Reward = ItemDefinitionManager.GetDefinition(GetRandomReward()); if (Reward == null) { return; } List <Item> ItemsToRecycle = new List <Item>(); for (int i = 0; i < 5; i++) { Item Item = Session.InventoryCache.GetItem(Message.PopWiredUInt32()); if (Item == null || !Item.Definition.AllowRecycle || ItemsToRecycle.Contains(Item)) { return; } ItemsToRecycle.Add(Item); } Item NewItem = null; using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { foreach (Item Item in ItemsToRecycle) { Session.InventoryCache.RemoveItem(Item.Id); Item.RemovePermanently(MySqlClient); Session.SendData(InventoryItemRemovedComposer.Compose(Item.Id)); } NewItem = ItemFactory.CreateItem(MySqlClient, Reward.Id, Session.CharacterId, string.Empty, string.Empty, 0); } Session.InventoryCache.Add(NewItem); Session.SendData(RecyclerResultComposer.Compose(true, NewItem.Id)); Session.SendData(InventoryItemAddedComposer.Compose(NewItem)); }
private static void ApplyDecoration(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || !Instance.CheckUserRights(Session, true)) { return; } Item Item = Session.InventoryCache.GetItem(Message.PopWiredUInt32()); if (Item == null) { return; } string DecorationKey = string.Empty; switch (Item.Definition.Behavior) { case ItemBehavior.Floor: QuestManager.ProgressUserQuest(Session, QuestType.FURNI_DECORATION_FLOOR); DecorationKey = "floor"; break; case ItemBehavior.Wallpaper: QuestManager.ProgressUserQuest(Session, QuestType.FURNI_DECORATION_WALL); DecorationKey = "wallpaper"; break; case ItemBehavior.Landscape: DecorationKey = "landscape"; break; } if (DecorationKey.Length == 0) { return; } Session.InventoryCache.RemoveItem(Item.Id); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Item.RemovePermanently(MySqlClient); Instance.Info.ApplyDecoration(MySqlClient, DecorationKey, Item.Flags); } Instance.BroadcastMessage(RoomDecorationComposer.Compose(DecorationKey, Item.Flags)); Session.SendData(InventoryItemRemovedComposer.Compose(Item.Id)); }
private static void PlaceItem(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null) { return; } uint ItemId = 0; string[] Data = null; if (Message.Id == OpcodesIn.ROOM_ITEM_PLACE_STICKY) { ItemId = Message.PopWiredUInt32(); string RawData = Message.PopString(); string[] TmpData = RawData.Split(' '); Data = new string[TmpData.Length + 1]; Data[0] = string.Empty; Data[1] = TmpData[0]; Data[2] = TmpData[1]; Data[3] = TmpData[2]; } else { string RawData = Message.PopString(); Data = RawData.Split(' '); uint.TryParse(Data[0], out ItemId); } Item Item = Session.InventoryCache.GetItem(ItemId); if (Item == null) { return; } bool HasPlacementRights = Instance.CheckUserRights(Session); bool IsPlacingGuestStickie = false; if (Item.Definition.Behavior == ItemBehavior.StickyNote && !HasPlacementRights && Instance.GuestsCanPlaceStickies) { IsPlacingGuestStickie = true; } else if (!HasPlacementRights) { Session.SendData(RoomItemPlacementErrorComposer.Compose(RoomItemPlacementErrorCode.InsufficientRights)); return; } if (Item.PendingExpiration && Item.ExpireTimeLeft <= 0) { using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Item.RemovePermanently(MySqlClient); } Session.InventoryCache.RemoveItem(Item.Id); Session.SendData(InventoryItemRemovedComposer.Compose(Item.Id)); return; } switch (Item.Definition.Type) { default: case ItemType.FloorItem: if (Data.Length != 4) { return; } int X = 0; int Y = 0; int Rotation = 0; int.TryParse(Data[1], out X); int.TryParse(Data[2], out Y); int.TryParse(Data[3], out Rotation); Vector3 FinalizedPosition = Instance.SetFloorItem(Session, Item, new Vector2(X, Y), Rotation); if (FinalizedPosition != null) { using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Item.MoveToRoom(MySqlClient, Instance.RoomId, FinalizedPosition, Rotation); } Instance.RegenerateRelativeHeightmap(); Session.InventoryCache.RemoveItem(Item.Id); Session.SendData(InventoryItemRemovedComposer.Compose(Item.Id)); ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Placed); Instance.BroadcastMessage(RoomFloorItemPlacedComposer.Compose(Item)); QuestManager.ProgressUserQuest(Session, QuestType.FURNI_PLACE); if (FinalizedPosition.Z > Instance.Model.Heightmap.FloorHeight[FinalizedPosition.X, FinalizedPosition.Y]) { QuestManager.ProgressUserQuest(Session, QuestType.FURNI_STACK); } } break; case ItemType.WallItem: string[] CorrectedData = new string[Data.Length - 1]; for (int i = 1; i < Data.Length; i++) { CorrectedData[i - 1] = Data[i]; } string WallPos = Instance.SetWallItem(Session, CorrectedData, Item); if (WallPos.Length > 0) { using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Item.MoveToRoom(MySqlClient, Instance.RoomId, new Vector3(0, 0, 0), 0, WallPos); } Session.InventoryCache.RemoveItem(Item.Id); Session.SendData(InventoryItemRemovedComposer.Compose(Item.Id)); ItemEventDispatcher.InvokeItemEventHandler(Session, Item, Instance, ItemEventType.Placed); Instance.BroadcastMessage(RoomWallItemPlacedComposer.Compose(Item)); if (IsPlacingGuestStickie) { Instance.GiveTemporaryStickieRights(Item.Id, Session.CharacterId); Session.SendData(StickyDataComposer.Compose(Item)); } } break; } }