private static void MoveFloorItem(Session Session, ClientMessage Message) { RoomInstance Instance = RoomManager.GetInstanceByRoomId(Session.CurrentRoomId); if (Instance == null || !Instance.CheckUserRights(Session)) { return; } Item Item = Instance.GetItem(Message.PopWiredUInt32()); if (Item == null || Item.Definition.Type != ItemType.FloorItem) { return; } Vector2 NewPosition = new Vector2(Message.PopWiredInt32(), Message.PopWiredInt32()); int NewRotation = Message.PopWiredInt32(); bool IsRotationOnly = (Item.RoomId == Instance.RoomId && Item.RoomPosition.X == NewPosition.X && Item.RoomPosition.Y == NewPosition.Y && NewRotation != Item.RoomRotation); Vector3 FinalizedPosition = Instance.SetFloorItem(Session, Item, NewPosition, NewRotation); 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, IsRotationOnly ? 1 : 0); QuestManager.ProgressUserQuest(Session, IsRotationOnly ? QuestType.FURNI_ROTATE : QuestType.FURNI_MOVE); if (FinalizedPosition.Z > Instance.Model.Heightmap.FloorHeight[FinalizedPosition.X, FinalizedPosition.Y]) { QuestManager.ProgressUserQuest(Session, QuestType.FURNI_STACK); } } }
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; }
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; } }