public bool MoveWallItemOnRoom(GameClient session, RoomItem item, WallCoordinate newCoords) { this.AddedAndMovedRoomItems.AddOrUpdate(item.ID, item, (key, oldValue) => item); this.RoomItemStateUpdated.TryRemove(item.ID, out RoomItem item_); item.WallCoordinate = newCoords; item.UpdateState(false, true); item.OnMove(session); return(true); }
public bool MoveFloorItemOnRoom(GameClient session, RoomItem item, int x, int y, int rotation, double height = -1.0, bool sendPacket = true, params RoomItem[] ignore) { int forceRotation = session != null?session.GetHabbo().GetRoomSession().GetRoomUser().ForceRotate : -1; if (forceRotation != -1) { rotation = forceRotation; } HashSet <AffectedTile> oldTiles = new HashSet <AffectedTile>(item.AffectedTiles) { new AffectedTile(item.X, item.Y, item.Rot) }; HashSet <AffectedTile> newTiles = new HashSet <AffectedTile>(ItemUtilies.AffectedTiles(item.BaseItem.Lenght, item.BaseItem.Width, x, y, rotation).Values) { new AffectedTile(x, y, rotation) }; if (height == -1.0) { foreach (AffectedTile tile in newTiles) { if (!this.CanPlaceItemAt(item, tile.X, tile.Y)) { return(false); } RoomTile tile_ = this.Room.RoomGamemapManager.GetTile(tile.X, tile.Y); if (ignore.Length <= 0) { if (tile_.HigestRoomItem?.ID != item.ID) { height = tile_.GetZ(true); } else { height = tile_.GetZ(false); } } else { RoomItem higestItem = tile_.GetHigestItem(ignore); if (higestItem != null) { if (higestItem.ID != item.ID) { height = higestItem.ActiveHeight; } else { height = higestItem.Z; } } else { height = tile_.ModelZ; } } } } this.AddedAndMovedRoomItems.AddOrUpdate(item.ID, item, (key, oldValue) => item); this.RoomItemStateUpdated.TryRemove(item.ID, out RoomItem item_); double forceHeight = session != null?session.GetHabbo().GetRoomSession().GetRoomUser().ForceHeight : -1.0; int forceState = session != null?session.GetHabbo().GetRoomSession().GetRoomUser().ForceState : -1; if (forceState != -1) { if (item.GetBaseItem().InteractionType == "default") { int mode = forceState; if (mode > item.GetBaseItem().InteractionModeCounts - 1) { mode = 0; } item.ExtraData = mode.ToString(); } } item.Rot = rotation; if (forceHeight != -1.0) { item.SetLocation(x, y, forceHeight); } else { item.SetLocation(x, y, height); } foreach (AffectedTile tile in oldTiles) { this.Room.RoomGamemapManager.GetTile(tile.X, tile.Y).RemoveItemFromTile(item); } foreach (AffectedTile tile in newTiles) { this.Room.RoomGamemapManager.GetTile(tile.X, tile.Y).AddItemToTile(item); } if (sendPacket) { item.TryChangeUpdateState(RoomItem.UpdateStatus.MOVE); this.RequireUpdateClientSide.TryAdd(item.ID, item); } foreach (RoomUnitUser user in this.Room.RoomUserManager.GetRealUsers()) { foreach (AffectedTile tile in oldTiles.Concat(newTiles)) { if (user.X == tile.X && user.Y == tile.Y) { user.UpdateState(); break; } } } item.OnMove(session); return(true); }