From 06f6ff78f20279db49a28870b1404a9f0c97bd3a Mon Sep 17 00:00:00 2001 From: ephphatha Date: Sun, 7 May 2023 22:34:52 +1000 Subject: [PATCH] Extract common logic for a player dropping an item The other class of use appears to be items spawned from NPCs or being dropped on death which shouldn't consider the CornerStone. Need to sort those later --- Source/inv.cpp | 51 ++++++++++++-------------------------------------- 1 file changed, 12 insertions(+), 39 deletions(-) diff --git a/Source/inv.cpp b/Source/inv.cpp index 258d0b062..9c3e9dd41 100644 --- a/Source/inv.cpp +++ b/Source/inv.cpp @@ -1743,14 +1743,8 @@ bool CanPut(Point position) return true; } -int InvPutItem(const Player &player, Point position, const Item &item) +int PlaceItemInWorld(const Item &item, WorldTilePosition position) { - std::optional itemTile = FindAdjacentPositionForItem(player.position.tile, GetDirection(player.position.tile, position)); - if (!itemTile) - return -1; - - Point position = *itemTile; - int ii = AllocateItem(); dItem[position.x][position.y] = ii + 1; @@ -1769,6 +1763,15 @@ int InvPutItem(const Player &player, Point position, const Item &item) return ii; } +int InvPutItem(const Player &player, Point position, const Item &item) +{ + std::optional itemTile = FindAdjacentPositionForItem(player.position.tile, GetDirection(player.position.tile, position)); + if (!itemTile) + return -1; + + return PlaceItemInWorld(item, *itemTile); +} + int SyncDropItem(Point position, _item_indexes idx, uint16_t icreateinfo, int iseed, int id, int dur, int mdur, int ch, int mch, int ivalue, uint32_t ibuff, int toHit, int maxDam, int minStr, int minMag, int minDex, int ac) { if (ActiveItemCount >= MAXITEMS) @@ -1791,22 +1794,7 @@ int SyncDropItem(Point position, _item_indexes idx, uint16_t icreateinfo, int is item._iAC = ac; item.dwBuff = ibuff; - int ii = AllocateItem(); - - dItem[position.x][position.y] = ii + 1; - auto &item_ = Items[ii]; - item_ = item; - item_.position = position; - RespawnItem(item_, true); - - if (CornerStone.isAvailable() && position == CornerStone.position) { - CornerStone.item = item_; - InitQTextMsg(TEXT_CORNSTN); - Quests[Q_CORNSTN]._qlog = false; - Quests[Q_CORNSTN]._qactive = QUEST_DONE; - } - - return ii; + return PlaceItemInWorld(item, position); } int SyncDropEar(Point position, uint16_t icreateinfo, uint32_t iseed, uint8_t cursval, string_view heroname) @@ -1817,22 +1805,7 @@ int SyncDropEar(Point position, uint16_t icreateinfo, uint32_t iseed, uint8_t cu Item item; RecreateEar(item, icreateinfo, iseed, cursval, heroname); - int ii = AllocateItem(); - - dItem[position.x][position.y] = ii + 1; - auto &item_ = Items[ii]; - item_ = item; - item_.position = position; - RespawnItem(item_, true); - - if (CornerStone.isAvailable() && position == CornerStone.position) { - CornerStone.item = item_; - InitQTextMsg(TEXT_CORNSTN); - Quests[Q_CORNSTN]._qlog = false; - Quests[Q_CORNSTN]._qactive = QUEST_DONE; - } - - return ii; + return PlaceItemInWorld(item, position); } int8_t CheckInvHLight()