Modernize client code (#6250)
[oweals/minetest.git] / src / game.cpp
index 88ae9c2b766c6a3c29bb7328190dcd9b675bcac4..4588e21e0cf992b4d62197636ff9dd5e56507471 100644 (file)
@@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "game.h"
 
 #include <iomanip>
+#include <cmath>
 #include "client/renderingengine.h"
 #include "camera.h"
 #include "client.h"
@@ -976,8 +977,7 @@ static void updateChat(Client &client, f32 dtime, bool show_debug,
        }
 
        // Get new messages from client
-       std::wstring message;
-
+       std::wstring message = L"";
        while (client.getChatMessage(message)) {
                chat_backend.addUnparsedMessage(message);
        }
@@ -996,7 +996,7 @@ static void updateChat(Client &client, f32 dtime, bool show_debug,
        s32 chat_y = 5;
 
        if (show_debug)
-               chat_y += 2 * line_height;
+               chat_y += 3 * line_height;
 
        // first pass to calculate height of text to be set
        const v2u32 &window_size = RenderingEngine::get_instance()->getWindowSize();
@@ -1107,6 +1107,11 @@ void KeyCache::populate()
 
        key[KeyType::DEBUG_STACKS]   = getKeySetting("keymap_print_debug_stacks");
 
+       for (int i = 0; i < 23; i++) {
+               std::string slot_key_name = "keymap_slot" + std::to_string(i + 1);
+               key[KeyType::SLOT_1 + i] = getKeySetting(slot_key_name.c_str());
+       }
+
        if (handler) {
                // First clear all keys, then re-add the ones we listen for
                handler->dontListenForKeys();
@@ -1115,9 +1120,6 @@ void KeyCache::populate()
                }
                handler->listenForKey(EscapeKey);
                handler->listenForKey(CancelKey);
-               for (size_t i = 0; i < 10; i++) {
-                       handler->listenForKey(NumberKey[i]);
-               }
        }
 }
 
@@ -1429,6 +1431,7 @@ private:
         */
        gui::IGUIStaticText *guitext;          // First line of debug text
        gui::IGUIStaticText *guitext2;         // Second line of debug text
+       gui::IGUIStaticText *guitext3;         // Third line of debug text
        gui::IGUIStaticText *guitext_info;     // At the middle of the screen
        gui::IGUIStaticText *guitext_status;
        gui::IGUIStaticText *guitext_chat;         // Chat text
@@ -2001,6 +2004,12 @@ bool Game::initGui()
                        core::rect<s32>(0, 0, 0, 0),
                        false, false, guiroot);
 
+       // Third line of debug text
+       guitext3 = addStaticText(guienv,
+                       L"",
+                       core::rect<s32>(0, 0, 0, 0),
+                       false, false, guiroot);
+
        // At the middle of the screen
        // Object infos are shown in this
        guitext_info = addStaticText(guienv,
@@ -2632,16 +2641,10 @@ void Game::processItemSelection(u16 *new_playeritem)
                *new_playeritem = *new_playeritem > 0 ? *new_playeritem - 1 : max_item;
        // else dir == 0
 
-       /* Item selection using keyboard
+       /* Item selection using hotbar slot keys
         */
-       for (u16 i = 0; i < 10; i++) {
-               static const KeyPress *item_keys[10] = {
-                       NumberKey + 1, NumberKey + 2, NumberKey + 3, NumberKey + 4,
-                       NumberKey + 5, NumberKey + 6, NumberKey + 7, NumberKey + 8,
-                       NumberKey + 9, NumberKey + 0,
-               };
-
-               if (input->wasKeyDown(*item_keys[i])) {
+       for (u16 i = 0; i < 23; i++) {
+               if (wasKeyDown((GameKeyType) (KeyType::SLOT_1 + i))) {
                        if (i < PLAYER_INVENTORY_SIZE && i < player->hud_hotbar_itemcount) {
                                *new_playeritem = i;
                                infostream << "Selected item: " << new_playeritem << std::endl;
@@ -2977,8 +2980,8 @@ void Game::decreaseViewRange()
 void Game::toggleFullViewRange()
 {
        static const wchar_t *msg[] = {
-               L"Disabled full viewing range",
-               L"Enabled full viewing range"
+               L"Normal view range",
+               L"Infinite view range"
        };
 
        draw_control->range_all = !draw_control->range_all;
@@ -3796,6 +3799,11 @@ void Game::handlePointingAtNode(const PointedThing &pointed,
 
                if (meta && meta->getString("formspec") != "" && !random_input
                                && !isKeyDown(KeyType::SNEAK)) {
+                       // Report right click to server
+                       if (nodedef_manager->get(map.getNodeNoEx(nodepos)).rightclickable) {
+                               client->interact(3, pointed);
+                       }
+
                        infostream << "Launching custom inventory view" << std::endl;
 
                        InventoryLocation inventoryloc;
@@ -4118,7 +4126,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
                                                .getInterpolated(video::SColor(255, 0, 0, 0), 0.9);
                                sky->overrideColors(clouds_dark, clouds->getColor());
                                sky->setBodiesVisible(false);
-                               runData.fog_range = 20.0f * BS;
+                               runData.fog_range = std::fmin(runData.fog_range * 0.5f, 32.0f * BS);
                                // do not draw clouds after all
                                clouds->setVisible(false);
                        }
@@ -4308,21 +4316,20 @@ void Game::updateGui(const RunStats &stats, f32 dtime, const CameraOrientation &
        if (flags.show_debug) {
                static float drawtime_avg = 0;
                drawtime_avg = drawtime_avg * 0.95 + stats.drawtime * 0.05;
-
                u16 fps = 1.0 / stats.dtime_jitter.avg;
 
                std::ostringstream os(std::ios_base::binary);
                os << std::fixed
                   << PROJECT_NAME_C " " << g_version_hash
-                  << "; " << fps << " FPS"
-                  << ", (R: range_all=" << draw_control->range_all << ")"
+                  << ", FPS = " << fps
+                  << ", range_all = " << draw_control->range_all
                   << std::setprecision(0)
                   << ", drawtime = " << drawtime_avg << " ms"
                   << std::setprecision(1)
                   << ", dtime_jitter = "
                   << (stats.dtime_jitter.max_fraction * 100.0) << " %"
                   << std::setprecision(1)
-                  << ", v_range = " << draw_control->wanted_range
+                  << ", view_range = " << draw_control->wanted_range
                   << std::setprecision(3)
                   << ", RTT = " << client->getRTT() << " s";
                setStaticText(guitext, utf8_to_wide(os.str()).c_str());
@@ -4342,38 +4349,51 @@ void Game::updateGui(const RunStats &stats, f32 dtime, const CameraOrientation &
        if (flags.show_debug) {
                std::ostringstream os(std::ios_base::binary);
                os << std::setprecision(1) << std::fixed
-                  << "(" << (player_position.X / BS)
+                  << "pos = (" << (player_position.X / BS)
                   << ", " << (player_position.Y / BS)
                   << ", " << (player_position.Z / BS)
-                  << ") (yaw=" << (wrapDegrees_0_360(cam.camera_yaw)) << "°"
+                  << "), yaw = " << (wrapDegrees_0_360(cam.camera_yaw)) << "°"
                   << " " << yawToDirectionString(cam.camera_yaw)
-                  << ") (seed = " << ((u64)client->getMapSeed())
-                  << ")";
-
-               if (runData.pointed_old.type == POINTEDTHING_NODE) {
-                       ClientMap &map = client->getEnv().getClientMap();
-                       const INodeDefManager *nodedef = client->getNodeDefManager();
-                       MapNode n = map.getNodeNoEx(runData.pointed_old.node_undersurface);
-                       if (n.getContent() != CONTENT_IGNORE && nodedef->get(n).name != "unknown") {
-                               const ContentFeatures &features = nodedef->get(n);
-                               os << " (pointing_at = \"" << nodedef->get(n).name
-                                  << "\", param1 = " << (u64) n.getParam1()
-                                  << ", param2 = " << (u64) n.getParam2()
-                                  << ", tiledef[0] = \"" << features.tiledef[0].name.c_str()
-                                  << "\")";
-                       }
-               }
-
+                  << ", seed = " << ((u64)client->getMapSeed());
                setStaticText(guitext2, utf8_to_wide(os.str()).c_str());
                guitext2->setVisible(true);
+       } else {
+               guitext2->setVisible(false);
+       }
 
+       if (guitext2->isVisible()) {
                core::rect<s32> rect(
                                5,             5 + g_fontengine->getTextHeight(),
                                screensize.X,  5 + g_fontengine->getTextHeight() * 2
                );
                guitext2->setRelativePosition(rect);
+       }
+
+       if (flags.show_debug && runData.pointed_old.type == POINTEDTHING_NODE) {
+               ClientMap &map = client->getEnv().getClientMap();
+               const INodeDefManager *nodedef = client->getNodeDefManager();
+               MapNode n = map.getNodeNoEx(runData.pointed_old.node_undersurface);
+
+               if (n.getContent() != CONTENT_IGNORE && nodedef->get(n).name != "unknown") {
+                       std::ostringstream os(std::ios_base::binary);
+                       os << "pointing_at = (" << nodedef->get(n).name
+                          << ", param2 = " << (u64) n.getParam2()
+                          << ")";
+                       setStaticText(guitext3, utf8_to_wide(os.str()).c_str());
+                       guitext3->setVisible(true);
+               } else {
+                       guitext3->setVisible(false);
+               }
        } else {
-               guitext2->setVisible(false);
+               guitext3->setVisible(false);
+       }
+
+       if (guitext3->isVisible()) {
+               core::rect<s32> rect(
+                               5,             5 + g_fontengine->getTextHeight() * 2,
+                               screensize.X,  5 + g_fontengine->getTextHeight() * 3
+               );
+               guitext3->setRelativePosition(rect);
        }
 
        setStaticText(guitext_info, infotext.c_str());