diff --git a/Source/items.h b/Source/items.h index 76c60f75e..6e014ef0d 100644 --- a/Source/items.h +++ b/Source/items.h @@ -367,6 +367,11 @@ struct Item { return IsScroll() && _iSpell == spellId; } + [[nodiscard]] bool KeyAttributesMatch(int32_t seed, _item_indexes itemIndex, uint16_t createInfo) + { + return _iSeed == seed && IDidx == itemIndex && _iCreateInfo == createInfo; + } + UiFlags getTextColor() const { switch (_iMagical) { diff --git a/Source/msg.cpp b/Source/msg.cpp index 2563328d3..1803cfa2c 100644 --- a/Source/msg.cpp +++ b/Source/msg.cpp @@ -707,7 +707,18 @@ DWORD OnRequestGetItem(const TCmd *pCmd, Player &player) if (gbBufferMsgs != 1 && IOwnLevel(player.plrlevel) && IsGItemValid(message)) { const Point position { message.x, message.y }; if (GetItemRecord(message.dwSeed, message.wCI, message.wIndx)) { - int ii = FindGetItem(message.wIndx, message.wCI, message.dwSeed); + int ii = -1; + if (InDungeonBounds(position)) { + ii = abs(dItem[position.x][position.y]) - 1; + if (ii >= 0 && !Items[ii].KeyAttributesMatch(message.dwSeed, static_cast<_item_indexes>(message.wIndx), message.wCI)) { + ii = -1; + } + } + + if (ii == -1) { // No item at the target position or the key attributes don't match, so try find a matching item. + ii = FindGetItem(message.wIndx, message.wCI, message.dwSeed); + } + if (ii != -1) { NetSendCmdGItem2(false, CMD_GETITEM, MyPlayerId, message.bPnum, message); if (message.bPnum != MyPlayerId)