From 9d792871aedeb17ace958e35f8d7b1d473300f7b Mon Sep 17 00:00:00 2001 From: Eduardo Dantas Date: Sat, 25 Jan 2025 16:21:43 -0300 Subject: [PATCH] fix: house transfer item to owner (#3258) This fixes an issue with the house item transfer system during server startup. Specifically, the `getPlayerByGUID` function was not passing `true` to retrieve offline players, which caused items belonging to offline players to be removed instead of being correctly transferred to their inbox. Additionally, the logic for handling ownership of items was improved to ensure the correct transfer of items to their respective owners, even when no players are online during server startup. --- src/map/house/house.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/map/house/house.cpp b/src/map/house/house.cpp index b3054616bff..7bac1dd0b39 100644 --- a/src/map/house/house.cpp +++ b/src/map/house/house.cpp @@ -315,21 +315,25 @@ bool House::transferToDepot(const std::shared_ptr &player, const std::sh std::unordered_set> playersToSave = { player }; for (const auto &item : moveItemList) { - g_logger().debug("[{}] moving item '{}' to depot", __FUNCTION__, item->getName()); - auto targetPlayer = player; + std::shared_ptr targetPlayer = player; + if (item->hasOwner() && !item->isOwner(targetPlayer)) { - targetPlayer = g_game().getPlayerByGUID(item->getOwnerId()); - if (!targetPlayer) { - g_game().internalRemoveItem(item, item->getItemCount()); + const auto &itemOwner = g_game().getPlayerByGUID(item->getOwnerId(), true); + if (itemOwner) { + targetPlayer = itemOwner; + playersToSave.insert(targetPlayer); + } else { + g_logger().warn("[{}] owner of item '{}' (GUID: {}) not found, skipping transfer", __FUNCTION__, item->getName(), item->getOwnerId()); continue; } - playersToSave.insert(targetPlayer); } + g_game().internalMoveItem(item->getParent(), targetPlayer->getInbox(), INDEX_WHEREEVER, item, item->getItemCount(), nullptr, FLAG_NOLIMIT); } for (const auto &playerToSave : playersToSave) { g_saveManager().savePlayer(playerToSave); } + return true; }