Fix builders club virtual owner persistence

This commit is contained in:
Lorenzune
2026-04-07 16:56:57 +02:00
parent ece0a16612
commit cf90ab2bf0
6 changed files with 19 additions and 7 deletions
@@ -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";
@@ -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);
}
@@ -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);
@@ -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)) {
@@ -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)) {
@@ -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);