diff --git a/Source/dapi/Server.cpp b/Source/dapi/Server.cpp index baaf8c55d..6edc078aa 100644 --- a/Source/dapi/Server.cpp +++ b/Source/dapi/Server.cpp @@ -2206,10 +2206,15 @@ void Server::dropCursorItem() { if (!isOnScreen(devilution::Players[devilution::MyPlayerId].position.tile.x, devilution::Players[devilution::MyPlayerId].position.tile.y)) return; - - if (12 <= devilution::pcurs) { - devilution::NetSendCmdPItem(true, devilution::_cmd_id::CMD_PUTITEM, devilution::Point { devilution::Players[devilution::MyPlayerId].position.tile.x, devilution::Players[devilution::MyPlayerId].position.tile.y }, devilution::MyPlayer->HoldItem); - devilution::NewCursor(devilution::cursor_id::CURSOR_HAND); + else if (!devilution::MyPlayer->HoldItem.isEmpty()) { + if (!devilution::TryOpenDungeonWithMouse()) { + const devilution::Point currentPosition = devilution::MyPlayer->position.tile; + std::optional itemTile = FindAdjacentPositionForItem(currentPosition, GetDirection(currentPosition, devilution::MyPlayer->position.tile)); + if (itemTile) { + NetSendCmdPItem(true, devilution::_cmd_id::CMD_PUTITEM, *itemTile, devilution::MyPlayer->HoldItem); + devilution::NewCursor(devilution::cursor_id::CURSOR_HAND); + } + } } } diff --git a/Source/diablo.cpp b/Source/diablo.cpp index 122fab27e..a707b2480 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -320,23 +320,6 @@ void LeftMouseCmd(bool bShift) } } -bool TryOpenDungeonWithMouse() -{ - if (leveltype != DTYPE_TOWN) - return false; - - const Item &holdItem = MyPlayer->HoldItem; - if (holdItem.IDidx == IDI_RUNEBOMB && OpensHive(cursPosition)) - OpenHive(); - else if (holdItem.IDidx == IDI_MAPOFDOOM && OpensGrave(cursPosition)) - OpenGrave(); - else - return false; - - NewCursor(CURSOR_HAND); - return true; -} - void LeftMouseDown(uint16_t modState) { LastPlayerAction = PlayerActionType::None; @@ -3508,4 +3491,21 @@ void PrintScreen(SDL_Keycode vkey) ReleaseKey(vkey); } +bool TryOpenDungeonWithMouse() +{ + if (leveltype != DTYPE_TOWN) + return false; + + const Item &holdItem = MyPlayer->HoldItem; + if (holdItem.IDidx == IDI_RUNEBOMB && OpensHive(cursPosition)) + OpenHive(); + else if (holdItem.IDidx == IDI_MAPOFDOOM && OpensGrave(cursPosition)) + OpenGrave(); + else + return false; + + NewCursor(CURSOR_HAND); + return true; +} + } // namespace devilution diff --git a/Source/diablo.h b/Source/diablo.h index c977e252b..65cb86b6a 100644 --- a/Source/diablo.h +++ b/Source/diablo.h @@ -102,6 +102,7 @@ void DisableInputEventHandler(const SDL_Event &event, uint16_t modState); tl::expected LoadGameLevel(bool firstflag, lvl_entry lvldir); bool IsDiabloAlive(bool playSFX); void PrintScreen(SDL_Keycode vkey); +bool TryOpenDungeonWithMouse(); /** * @param bStartup Process additional ticks before returning