diff --git a/src/game/game.cpp b/src/game/game.cpp index 1c63d32bdbb..fdf5bbae693 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -1298,7 +1298,7 @@ void Game::playerMoveItem(Player* player, const Position &fromPos, uint16_t item } // check if we can move this item - if (ReturnValue ret = checkMoveItemToCylinder(player, fromCylinder, toCylinder, item); ret != RETURNVALUE_NOERROR) { + if (ReturnValue ret = checkMoveItemToCylinder(player, fromCylinder, toCylinder, item, toPos); ret != RETURNVALUE_NOERROR) { player->sendCancelMessage(ret); return; } @@ -1442,13 +1442,22 @@ bool Game::isTryingToStow(const Position &toPos, Cylinder* toCylinder) const { return toCylinder->getContainer() && toCylinder->getItem()->getID() == ITEM_LOCKER && toPos.getZ() == ITEM_SUPPLY_STASH_INDEX; } -ReturnValue Game::checkMoveItemToCylinder(Player* player, Cylinder* fromCylinder, Cylinder* toCylinder, Item* item) { +ReturnValue Game::checkMoveItemToCylinder(Player* player, Cylinder* fromCylinder, Cylinder* toCylinder, Item* item, Position toPos) { if (!player || !toCylinder || !item) { return RETURNVALUE_NOTPOSSIBLE; } - if (toCylinder->getContainer()) { - auto containerID = toCylinder->getContainer()->getID(); + if (Container* toCylinderContainer = toCylinder->getContainer()) { + auto containerID = toCylinderContainer->getID(); + + // check the store inbox index if gold pouch forces it as containerID + if (containerID == ITEM_STORE_INBOX) { + Item* cylinderItem = toCylinderContainer->getItemByIndex(toPos.getZ()); + + if (cylinderItem && cylinderItem->getID() == ITEM_GOLD_POUCH) { + containerID = ITEM_GOLD_POUCH; + } + } if (containerID == ITEM_GOLD_POUCH) { bool allowAnything = g_configManager().getBoolean(TOGGLE_GOLD_POUCH_ALLOW_ANYTHING); @@ -1457,10 +1466,15 @@ ReturnValue Game::checkMoveItemToCylinder(Player* player, Cylinder* fromCylinder return RETURNVALUE_CONTAINERNOTENOUGHROOM; } + // prevent move up + if (!item->isStoreItem() && fromCylinder->getContainer() && fromCylinder->getContainer()->getID() == ITEM_GOLD_POUCH) { + return RETURNVALUE_CONTAINERNOTENOUGHROOM; + } + return RETURNVALUE_NOERROR; } - const Container* topParentContainer = toCylinder->getContainer()->getRootContainer(); + const Container* topParentContainer = toCylinderContainer->getRootContainer(); if (!item->isStoreItem() && (containerID == ITEM_STORE_INBOX || topParentContainer->getParent() && topParentContainer->getParent()->getContainer() && topParentContainer->getParent()->getContainer()->getID() == ITEM_STORE_INBOX)) { return RETURNVALUE_CONTAINERNOTENOUGHROOM; @@ -1472,7 +1486,7 @@ ReturnValue Game::checkMoveItemToCylinder(Player* player, Cylinder* fromCylinder return RETURNVALUE_NOTPOSSIBLE; } - if (containerID == ITEM_STORE_INBOX || containerID == ITEM_DEPOT || toCylinder->getContainer()->isDepotChest()) { + if (containerID == ITEM_STORE_INBOX || containerID == ITEM_DEPOT || toCylinderContainer->isDepotChest()) { isValidMoveItem = true; } diff --git a/src/game/game.h b/src/game/game.h index 901d4d5efe8..2f900446f1a 100644 --- a/src/game/game.h +++ b/src/game/game.h @@ -178,7 +178,7 @@ class Game { ReturnValue internalMoveCreature(Creature* creature, Direction direction, uint32_t flags = 0); ReturnValue internalMoveCreature(Creature &creature, Tile &toTile, uint32_t flags = 0); - ReturnValue checkMoveItemToCylinder(Player* player, Cylinder* fromCylinder, Cylinder* toCylinder, Item* item); + ReturnValue checkMoveItemToCylinder(Player* player, Cylinder* fromCylinder, Cylinder* toCylinder, Item* item, Position toPos); ReturnValue internalMoveItem(Cylinder* fromCylinder, Cylinder* toCylinder, int32_t index, Item* item, uint32_t count, Item** internalMoveItem, uint32_t flags = 0, Creature* actor = nullptr, Item* tradeItem = nullptr); ReturnValue internalAddItem(Cylinder* toCylinder, Item* item, int32_t index = INDEX_WHEREEVER, uint32_t flags = 0, bool test = false);