Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 25 additions & 35 deletions src/game/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3348,6 +3348,10 @@ uint64_t Game::getItemMarketPrice(const std::map<uint16_t, uint64_t> &itemMap, b
}

std::shared_ptr<Item> searchForItem(const std::shared_ptr<Container> &container, uint16_t itemId, bool hasTier /* = false*/, uint8_t tier /* = 0*/) {
if (!container) {
return nullptr;
}

for (ContainerIterator it = container->iterator(); it.hasNext(); it.advance()) {
if ((*it)->getID() == itemId && (!hasTier || (*it)->getTier() == tier)) {
return *it;
Expand Down Expand Up @@ -3425,27 +3429,18 @@ void Game::playerEquipItem(uint32_t playerId, uint16_t itemId, bool hasTier /* =
}

const auto &item = player->getInventoryItem(CONST_SLOT_BACKPACK);
if (!item) {
return;
}

const std::shared_ptr<Container> &backpack = item->getContainer();
if (!backpack) {
return;
}

if (player->getFreeBackpackSlots() == 0) {
player->sendCancelMessage(RETURNVALUE_NOTENOUGHROOM);
return;
}
const auto &backpack = item ? item->getContainer() : nullptr;

const auto &slotItem = player->getInventoryItem(slot);
const auto &equipItem = searchForItem(backpack, it.id, hasTier, tier);
auto equipItem = searchForItem(backpack, it.id, hasTier, tier);
if (!equipItem) {
const auto &lootPouch = player->getLootPouch();
equipItem = searchForItem(lootPouch, it.id, hasTier, tier);
}
ReturnValue ret = RETURNVALUE_NOERROR;

if (slotItem && slotItem->getID() == it.id && (!it.stackable || slotItem->getItemCount() == slotItem->getStackSize() || !equipItem)) {
ret = internalMoveItem(slotItem->getParent(), player, CONST_SLOT_WHEREEVER, slotItem, slotItem->getItemCount(), nullptr);
g_logger().debug("Item {} was unequipped", slotItem->getName());
ret = internalCollectManagedItems(player, slotItem, getObjectCategory(slotItem), false);
} else if (equipItem) {
// Shield slot item
const auto &rightItem = player->getInventoryItem(CONST_SLOT_RIGHT);
Expand Down Expand Up @@ -3475,9 +3470,7 @@ void Game::playerEquipItem(uint32_t playerId, uint16_t itemId, bool hasTier /* =
if (slot == CONST_SLOT_RIGHT && rightItem && rightItem->isQuiver() && it.isQuiver()) {
// Replace the existing quiver with the new one
ret = internalMoveItem(rightItem->getParent(), player, INDEX_WHEREEVER, rightItem, rightItem->getItemCount(), nullptr);
if (ret == RETURNVALUE_NOERROR) {
g_logger().debug("Quiver {} was unequipped to equip new quiver", rightItem->getName());
} else {
if (ret != RETURNVALUE_NOERROR) {
player->sendCancelMessage(ret);
return;
}
Expand All @@ -3486,24 +3479,22 @@ void Game::playerEquipItem(uint32_t playerId, uint16_t itemId, bool hasTier /* =
if (slot == CONST_SLOT_RIGHT && leftItem && leftItem->getSlotPosition() & SLOTP_TWO_HAND) {
// Unequip the two-handed weapon from the left slot
ret = internalMoveItem(leftItem->getParent(), player, INDEX_WHEREEVER, leftItem, leftItem->getItemCount(), nullptr);
if (ret == RETURNVALUE_NOERROR) {
g_logger().debug("Two-handed weapon {} was unequipped to equip shield", leftItem->getName());
} else {
if (ret != RETURNVALUE_NOERROR) {
player->sendCancelMessage(ret);
return;
}
}
}

if (slotItem) {
ret = internalMoveItem(slotItem->getParent(), player, INDEX_WHEREEVER, slotItem, slotItem->getItemCount(), nullptr);
g_logger().debug("Item {} was moved back to player", slotItem->getName());
ret = internalCollectManagedItems(player, slotItem, getObjectCategory(slotItem), false);
// If the item is not collected, move it to any available container slot
if (ret != RETURNVALUE_NOERROR) {
ret = internalMoveItem(slotItem->getParent(), player, INDEX_WHEREEVER, slotItem, slotItem->getItemCount(), nullptr);
}
}

ret = internalMoveItem(equipItem->getParent(), player, slot, equipItem, equipItem->getItemCount(), nullptr);
if (ret == RETURNVALUE_NOERROR) {
g_logger().debug("Item {} was equipped", equipItem->getName());
}
}
}

Expand Down Expand Up @@ -4049,14 +4040,13 @@ void Game::playerUseWithCreature(uint32_t playerId, const Position &fromPos, uin
return;
}

if (g_configManager().getBoolean(ONLY_INVITED_CAN_MOVE_HOUSE_ITEMS)) {
if (std::shared_ptr<HouseTile> houseTile = std::dynamic_pointer_cast<HouseTile>(item->getTile())) {
const auto &house = houseTile->getHouse();
if (house && item->getRealParent() && item->getRealParent() != player && (!house->isInvited(player) || house->getHouseAccessLevel(player) == HOUSE_GUEST)) {
player->sendCancelMessage(RETURNVALUE_CANNOTUSETHISOBJECT);
return;
}
}
bool canUseHouseItem = !g_configManager().getBoolean(ONLY_INVITED_CAN_MOVE_HOUSE_ITEMS) || InternalGame::playerCanUseItemOnHouseTile(player, item);
if (!canUseHouseItem && item->hasOwner() && !item->isOwner(player)) {
player->sendCancelMessage(RETURNVALUE_ITEMISNOTYOURS);
return;
} else if (!canUseHouseItem) {
player->sendCancelMessage(RETURNVALUE_ITEMCANNOTBEMOVEDTHERE);
return;
}

const ItemType &it = Item::items[item->getID()];
Expand Down