From de76ec1d85bc5ff9655110dcdafcfffad85cef19 Mon Sep 17 00:00:00 2001 From: NiteKat Date: Mon, 22 Dec 2025 20:00:21 -0500 Subject: [PATCH] Fix API Item Dropping Fixes an issue that started after updating to newer commit. Moves TryOpenDungeonWithMouse() to devilution namespace for access in the API and copies part of the left click code with slight modification to handle dropping items, and sets me up for implementing API opening hellfire areas. --- Source/dapi/Server.cpp | 13 +++++++++---- Source/diablo.cpp | 34 +++++++++++++++++----------------- Source/diablo.h | 1 + 3 files changed, 27 insertions(+), 21 deletions(-) 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