private static void PlacePet(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || (!Instance.CheckUserRights(Session, true) && !Instance.Info.AllowPets)) { return; } Pet Pet = Session.PetInventoryCache.GetPet(Message.PopWiredUInt32()); if (Pet == null) { return; } Vector2 DesiredPosition = new Vector2(Message.PopWiredInt32(), Message.PopWiredInt32()); if (!Instance.IsValidPosition(DesiredPosition)) { return; } Bot BotDefinition = BotManager.GetHandlerDefinitionForPetType(Pet.Type); if (BotDefinition == null) { Session.SendData(NotificationMessageComposer.Compose("This pet cannot be placed right now. Please try again later.")); return; } if (!Instance.CanPlacePet(Instance.CheckUserRights(Session, true))) { Session.SendData(RoomItemPlacementErrorComposer.Compose(RoomItemPlacementErrorCode.PetLimitReached)); return; } Vector3 Position = new Vector3(DesiredPosition.X, DesiredPosition.Y, Instance.GetUserStepHeight(DesiredPosition)); Pet.MoveToRoom(Instance.RoomId, Position); Instance.AddBotToRoom(BotManager.CreateNewInstance(BotDefinition, Instance.RoomId, Position, Pet)); using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient()) { Pet.SynchronizeDatabase(MySqlClient); } Session.SendData(InventoryPetRemovedComposer.Compose(Pet.Id)); }
public Vector3 SetFloorItem(Session Session, Item Item, Vector2 Position, int Rotation) { bool AlreadyContained = mItems.ContainsKey(Item.Id); int TotalLimitCount = AlreadyContained ? mItems.Count - 1 : mItems.Count; int SpecificLimitCount = mItemLimitCache.ContainsKey(Item.Definition.Behavior) ? (AlreadyContained ? mItemLimitCache[Item.Definition.Behavior] - 1 : mItemLimitCache[Item.Definition.Behavior]) : 0; if (Item.Definition.RoomLimit > 0 && SpecificLimitCount >= Item.Definition.RoomLimit) { Session.SendData(NotificationMessageComposer.Compose("This room cannot hold any more furniture of this type.")); return(null); } if (TotalLimitCount >= (int)ConfigManager.GetValue("rooms.limit.furni")) { Session.SendData(RoomItemPlacementErrorComposer.Compose(RoomItemPlacementErrorCode.FurniLimitReached)); return(null); } bool IsRotationOnly = (Item.RoomId == RoomId && Item.RoomPosition.X == Position.X && Item.RoomPosition.Y == Position.Y && Rotation != Item.RoomRotation); if (!IsValidItemRotation(Rotation)) { return(null); } List <Vector2> AffectedTiles = CalculateAffectedTiles(Item, Position, Rotation); double PlacementHeight = GetItemPlacementHeight(Item, AffectedTiles, IsRotationOnly); if (PlacementHeight < 0) { return(null); } lock (mItemSyncRoot) { if (!mItems.ContainsKey(Item.Id)) { mItems.Add(Item.Id, Item); IncrecementFurniLimitCache(Item.Definition.Behavior); } } return(new Vector3(Position.X, Position.Y, PlacementHeight)); }
public string SetWallItem(Session Session, string[] Data, Item Item) { bool AlreadyContained = mItems.ContainsKey(Item.Id); int TotalLimitCount = AlreadyContained ? mItems.Count - 1 : mItems.Count; int SpecificLimitCount = mItemLimitCache.ContainsKey(Item.Definition.Behavior) ? (AlreadyContained ? mItemLimitCache[Item.Definition.Behavior] - 1 : mItemLimitCache[Item.Definition.Behavior]) : 0; if (Item.Definition.RoomLimit > 0 && SpecificLimitCount >= Item.Definition.RoomLimit) { Session.SendData(NotificationMessageComposer.Compose("This room cannot hold any more furniture of this type.")); return(string.Empty); } if (TotalLimitCount >= (int)ConfigManager.GetValue("rooms.limit.furni")) { Session.SendData(RoomItemPlacementErrorComposer.Compose(RoomItemPlacementErrorCode.FurniLimitReached)); return(string.Empty); } if (Data.Length != 3 || !Data[0].StartsWith(":w=") || !Data[1].StartsWith("l=") || (Data[2] != "r" && Data[2] != "l")) { return(string.Empty); } string wBit = Data[0].Substring(3, Data[0].Length - 3); string lBit = Data[1].Substring(2, Data[1].Length - 2); if (!wBit.Contains(",") || !lBit.Contains(",")) { return(string.Empty); } int w1 = 0; int w2 = 0; int l1 = 0; int l2 = 0; int.TryParse(wBit.Split(',')[0], out w1); int.TryParse(wBit.Split(',')[1], out w2); int.TryParse(lBit.Split(',')[0], out l1); int.TryParse(lBit.Split(',')[1], out l2); if (!Session.HasRight("hotel_admin") && (w1 < 0 || w2 < 0 || l1 < 0 || l2 < 0 || w1 > 200 || w2 > 200 || l1 > 200 || l2 > 200)) { return(string.Empty); } string WallPos = ":w=" + w1 + "," + w2 + " l=" + l1 + "," + l2 + " " + Data[2]; lock (mItemSyncRoot) { if (!mItems.ContainsKey(Item.Id)) { mItems.Add(Item.Id, Item); IncrecementFurniLimitCache(Item.Definition.Behavior); } } return(WallPos); }
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; } }