diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/BuildersClubRoomSupport.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/BuildersClubRoomSupport.java index 9d2ac676..c0227618 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/BuildersClubRoomSupport.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/BuildersClubRoomSupport.java @@ -27,8 +27,8 @@ public class BuildersClubRoomSupport { private static final Logger LOGGER = LoggerFactory.getLogger(BuildersClubRoomSupport.class); public static final int DEFAULT_TRIAL_FURNI_LIMIT = 50; - // Uses the built-in system account row so Builders Club furni have a valid foreign-key owner in `items`, - // while still being treated as virtual / non-user-owned everywhere else in the BC flow. + // Runtime-only owner marker used to display Builders Club furni as virtual/non-user-owned in-room. + // The actual DB owner for persistence/FK purposes is tracked separately on the item instance. public static final int VIRTUAL_OWNER_ID = 1; public static final String DISPLAY_OWNER_NAME = "Builders Club"; diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/RoomItemManager.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/RoomItemManager.java index e6f991f1..bc330fe1 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/RoomItemManager.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/rooms/RoomItemManager.java @@ -628,7 +628,7 @@ public class RoomItemManager { } if (BuildersClubRoomSupport.isTrackedItem(item.getId()) && item.getUserId() != BuildersClubRoomSupport.VIRTUAL_OWNER_ID) { - item.setUserId(BuildersClubRoomSupport.VIRTUAL_OWNER_ID); + item.setVirtualUserId(BuildersClubRoomSupport.VIRTUAL_OWNER_ID); item.needsUpdate(true); } diff --git a/Emulator/src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java b/Emulator/src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java index 9a8849fd..ec9ed53e 100644 --- a/Emulator/src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java +++ b/Emulator/src/main/java/com/eu/habbo/habbohotel/users/HabboItem.java @@ -45,6 +45,7 @@ public abstract class HabboItem implements Runnable, IEventTriggers { private int id; private int userId; + private int databaseUserId; private int roomId; private Item baseItem; private String wallPosition; @@ -62,6 +63,7 @@ public abstract class HabboItem implements Runnable, IEventTriggers { public HabboItem(ResultSet set, Item baseItem) throws SQLException { this.id = set.getInt("id"); this.userId = set.getInt("user_id"); + this.databaseUserId = this.userId; this.roomId = set.getInt("room_id"); this.baseItem = baseItem; this.wallPosition = set.getString("wall_pos"); @@ -81,6 +83,7 @@ public abstract class HabboItem implements Runnable, IEventTriggers { public HabboItem(int id, int userId, Item item, String extradata, int limitedStack, int limitedSells) { this.id = id; this.userId = userId; + this.databaseUserId = userId; this.roomId = 0; this.baseItem = item; this.wallPosition = ""; @@ -169,6 +172,11 @@ public abstract class HabboItem implements Runnable, IEventTriggers { public void setUserId(int userId) { this.userId = userId; + this.databaseUserId = userId; + } + + public void setVirtualUserId(int userId) { + this.userId = userId; } public int getRoomId() { @@ -275,7 +283,7 @@ public abstract class HabboItem implements Runnable, IEventTriggers { } } else if (this.needsUpdate) { try (PreparedStatement statement = connection.prepareStatement("UPDATE items SET user_id = ?, room_id = ?, wall_pos = ?, x = ?, y = ?, z = ?, rot = ?, extra_data = ?, limited_data = ? WHERE id = ?")) { - statement.setInt(1, this.userId); + statement.setInt(1, this.databaseUserId); statement.setInt(2, this.roomId); statement.setString(3, this.wallPosition); statement.setInt(4, this.x); diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/BuildersClubPlaceRoomItemEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/BuildersClubPlaceRoomItemEvent.java index 622677c3..4684147b 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/BuildersClubPlaceRoomItemEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/BuildersClubPlaceRoomItemEvent.java @@ -76,13 +76,15 @@ public class BuildersClubPlaceRoomItemEvent extends MessageHandler { return; } - HabboItem item = Emulator.getGameEnvironment().getItemManager().createItem(BuildersClubRoomSupport.VIRTUAL_OWNER_ID, baseItem, 0, 0, (extraData != null && !extraData.isEmpty()) ? extraData : catalogItem.getExtradata()); + HabboItem item = Emulator.getGameEnvironment().getItemManager().createItem(placementUserId, baseItem, 0, 0, (extraData != null && !extraData.isEmpty()) ? extraData : catalogItem.getExtradata()); if (item == null) { this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNITURE_PLACEMENT_ERROR.key, FurnitureMovementError.INVALID_MOVE.errorCode)); return; } + item.setVirtualUserId(BuildersClubRoomSupport.VIRTUAL_OWNER_ID); + FurnitureMovementError error = room.canPlaceFurnitureAt(item, this.client.getHabbo(), tile, rotation); if (!error.equals(FurnitureMovementError.NONE)) { diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/BuildersClubPlaceWallItemEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/BuildersClubPlaceWallItemEvent.java index 96b29a7c..6c2822cf 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/BuildersClubPlaceWallItemEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/catalog/BuildersClubPlaceWallItemEvent.java @@ -66,13 +66,15 @@ public class BuildersClubPlaceWallItemEvent extends MessageHandler { return; } - HabboItem item = Emulator.getGameEnvironment().getItemManager().createItem(BuildersClubRoomSupport.VIRTUAL_OWNER_ID, baseItem, 0, 0, (extraData != null && !extraData.isEmpty()) ? extraData : catalogItem.getExtradata()); + HabboItem item = Emulator.getGameEnvironment().getItemManager().createItem(placementUserId, baseItem, 0, 0, (extraData != null && !extraData.isEmpty()) ? extraData : catalogItem.getExtradata()); if (item == null) { this.client.sendResponse(new BubbleAlertComposer(BubbleAlertKeys.FURNITURE_PLACEMENT_ERROR.key, FurnitureMovementError.INVALID_MOVE.errorCode)); return; } + item.setVirtualUserId(BuildersClubRoomSupport.VIRTUAL_OWNER_ID); + FurnitureMovementError error = room.placeWallFurniAt(item, wallPosition, this.client.getHabbo()); if (!error.equals(FurnitureMovementError.NONE)) { diff --git a/Emulator/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPlaceItemEvent.java b/Emulator/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPlaceItemEvent.java index 7c51b179..1b23813b 100644 --- a/Emulator/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPlaceItemEvent.java +++ b/Emulator/src/main/java/com/eu/habbo/messages/incoming/rooms/items/RoomPlaceItemEvent.java @@ -126,7 +126,7 @@ public class RoomPlaceItemEvent extends MessageHandler { trackedUserId = this.client.getHabbo().getHabboInfo().getId(); } - item.setUserId(BuildersClubRoomSupport.VIRTUAL_OWNER_ID); + item.setVirtualUserId(BuildersClubRoomSupport.VIRTUAL_OWNER_ID); BuildersClubRoomSupport.trackPlacedItem(item.getId(), trackedUserId, room.getId()); BuildersClubRoomSupport.SyncResult syncResult = BuildersClubRoomSupport.syncRoom(room);