diff --git a/doc/lua_api.md b/doc/lua_api.md index ca3a5fee7..b0b548753 100644 --- a/doc/lua_api.md +++ b/doc/lua_api.md @@ -6872,9 +6872,10 @@ Formspec * `core.show_formspec(playername, formname, formspec)` * `playername`: name of player to show formspec * `formname`: name passed to `on_player_receive_fields` callbacks. - It should follow the `"modname:"` naming convention. - * `formname` must not be empty, unless you want to reshow - the inventory formspec without updating it for future opens. + * It should follow the `"modname:"` naming convention. + * If empty: Reshows the inventory formspec. Servers and + clients >= 5.13.0 will update the inventory formspec + (`ObjectRef:set_inventory_formspec`) for future opens. * `formspec`: formspec to display * `core.close_formspec(playername, formname)` * `playername`: name of player to close formspec diff --git a/src/client/game.cpp b/src/client/game.cpp index f9a52c43f..96832b4ed 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -2714,11 +2714,21 @@ void Game::handleClientEvent_DeathscreenLegacy(ClientEvent *event, CameraOrienta void Game::handleClientEvent_ShowFormSpec(ClientEvent *event, CameraOrientation *cam) { - m_game_formspec.showFormSpec(*event->show_formspec.formspec, - *event->show_formspec.formname); + auto &fs = event->show_formspec; - delete event->show_formspec.formspec; - delete event->show_formspec.formname; + if (fs.formname->empty() && !fs.formspec->empty()) { + // Overwrite the inventory formspec + LocalPlayer *player = client->getEnv().getLocalPlayer(); + player->inventory_formspec = *fs.formspec; + + m_game_formspec.showPlayerInventory(); + } else { + m_game_formspec.showFormSpec(*fs.formspec, + *fs.formname); + } + + delete fs.formspec; + delete fs.formname; } void Game::handleClientEvent_ShowCSMFormSpec(ClientEvent *event, CameraOrientation *cam) diff --git a/src/server.cpp b/src/server.cpp index 89bba75fb..338068d96 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -3397,6 +3397,11 @@ bool Server::showFormspec(const char *playername, const std::string &formspec, if (!player) return false; + if (formname.empty() && !formspec.empty()) { + // Overwrite the inventory formspec + player->inventory_formspec = formspec; + } + SendShowFormspecMessage(player->getPeerId(), formspec, formname); return true; }