Move the code for meta formspec into bool Game::nodePlacement(const ItemDefinition...
authorDS-Minetest <vorunbekannt75@web.de>
Thu, 19 Sep 2019 17:50:15 +0000 (19:50 +0200)
committersfan5 <sfan5@live.de>
Sun, 22 Sep 2019 20:12:49 +0000 (22:12 +0200)
src/client/game.cpp

index 042b61a78cb48d520748c5e267100f4c6ebfc7ed..722e6d0ad23ed696e3136b4e723fe6f220b584e5 100644 (file)
@@ -802,7 +802,8 @@ private:
        void updateChat(f32 dtime, const v2u32 &screensize);
 
        bool nodePlacement(const ItemDefinition &selected_def, const ItemStack &selected_item,
-               const v3s16 &nodepos, const v3s16 &neighbourpos, const PointedThing &pointed);
+               const v3s16 &nodepos, const v3s16 &neighbourpos, const PointedThing &pointed,
+               const NodeMetadata *meta);
        static const ClientEventHandler clientEventHandler[CLIENTEVENT_MAX];
 
        InputHandler *input = nullptr;
@@ -3199,50 +3200,26 @@ void Game::handlePointingAtNode(const PointedThing &pointed,
                runData.repeat_rightclick_timer = 0;
                infostream << "Ground right-clicked" << std::endl;
 
-               if (meta && !meta->getString("formspec").empty() && !random_input
-                               && !isKeyDown(KeyType::SNEAK)) {
-                       // Report right click to server
-                       if (nodedef_manager->get(map.getNode(nodepos)).rightclickable) {
-                               client->interact(INTERACT_PLACE, pointed);
-                       }
-
-                       infostream << "Launching custom inventory view" << std::endl;
+               camera->setDigging(1);  // right click animation (always shown for feedback)
 
-                       InventoryLocation inventoryloc;
-                       inventoryloc.setNodeMeta(nodepos);
+               soundmaker->m_player_rightpunch_sound = SimpleSoundSpec();
 
-                       NodeMetadataFormSource *fs_src = new NodeMetadataFormSource(
-                               &client->getEnv().getClientMap(), nodepos);
-                       TextDest *txt_dst = new TextDestNodeMetadata(nodepos, client);
-
-                       auto *&formspec = m_game_ui->updateFormspec("");
-                       GUIFormSpecMenu::create(formspec, client, &input->joystick, fs_src,
-                               txt_dst, client->getFormspecPrepend());
-
-                       formspec->setFormSpec(meta->getString("formspec"), inventoryloc);
-               } else {
-                       // Report right click to server
+               // If the wielded item has node placement prediction,
+               // make that happen
+               // And also set the sound and send the interact
+               // But first check for meta formspec and rightclickable
+               auto &def = selected_item.getDefinition(itemdef_manager);
+               bool placed = nodePlacement(def, selected_item, nodepos, neighbourpos,
+                       pointed, meta);
 
-                       camera->setDigging(1);  // right click animation (always shown for feedback)
-
-                       soundmaker->m_player_rightpunch_sound = SimpleSoundSpec();
-
-                       // If the wielded item has node placement prediction,
-                       // make that happen
-                       // And also set the sound and send the interact
-                       auto &def = selected_item.getDefinition(itemdef_manager);
-                       bool placed = nodePlacement(def, selected_item, nodepos, neighbourpos,
-                               pointed);
-
-                       if (placed && client->modsLoaded())
-                               client->getScript()->on_placenode(pointed, def);
-               }
+               if (placed && client->modsLoaded())
+                       client->getScript()->on_placenode(pointed, def);
        }
 }
 
 bool Game::nodePlacement(const ItemDefinition &selected_def,
        const ItemStack &selected_item, const v3s16 &nodepos, const v3s16 &neighbourpos,
-       const PointedThing &pointed)
+       const PointedThing &pointed, const NodeMetadata *meta)
 {
        std::string prediction = selected_def.node_placement_prediction;
        const NodeDefManager *nodedef = client->ndef();
@@ -3256,6 +3233,31 @@ bool Game::nodePlacement(const ItemDefinition &selected_def,
                return false;
        }
 
+       // formspec in meta
+       if (meta && !meta->getString("formspec").empty() && !random_input
+                       && !isKeyDown(KeyType::SNEAK)) {
+               // on_rightclick callbacks are called anyway
+               if (nodedef_manager->get(map.getNode(nodepos)).rightclickable)
+                       client->interact(INTERACT_PLACE, pointed);
+
+               infostream << "Launching custom inventory view" << std::endl;
+
+               InventoryLocation inventoryloc;
+               inventoryloc.setNodeMeta(nodepos);
+
+               NodeMetadataFormSource *fs_src = new NodeMetadataFormSource(
+                       &client->getEnv().getClientMap(), nodepos);
+               TextDest *txt_dst = new TextDestNodeMetadata(nodepos, client);
+
+               auto *&formspec = m_game_ui->updateFormspec("");
+               GUIFormSpecMenu::create(formspec, client, &input->joystick, fs_src,
+                       txt_dst, client->getFormspecPrepend());
+
+               formspec->setFormSpec(meta->getString("formspec"), inventoryloc);
+               return false;
+       }
+
+       // on_rightclick callback
        if (prediction.empty() || (nodedef->get(node).rightclickable &&
                        !isKeyDown(KeyType::SNEAK))) {
                // Report to server