]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/game.cpp
Use thread_local instead from some static settings (#5955)
[dragonfireclient.git] / src / game.cpp
index 640091de2d25896da9cee54c3ac8f9d03a92cf15..c32ab6f30d48dd4044a677f275bc06421cea39eb 100644 (file)
@@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <iomanip>
 #include "camera.h"
 #include "client.h"
+#include "client/inputhandler.h"
 #include "client/tile.h"     // For TextureSource
 #include "client/keys.h"
 #include "client/joystick_controller.h"
@@ -50,7 +51,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "quicktune_shortcutter.h"
 #include "server.h"
 #include "settings.h"
-#include "shader.h"          // For ShaderSource
 #include "sky.h"
 #include "subgame.h"
 #include "tool.h"
@@ -59,20 +59,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "util/pointedthing.h"
 #include "irrlicht_changes/static_text.h"
 #include "version.h"
-#include "minimap.h"
-#include "mapblock_mesh.h"
 #include "script/scripting_client.h"
 
-#include "sound.h"
-
 #if USE_SOUND
        #include "sound_openal.h"
 #endif
 
-#ifdef HAVE_TOUCHSCREENGUI
-       #include "touchscreengui.h"
-#endif
-
 extern Settings *g_settings;
 extern Profiler *g_profiler;
 
@@ -723,16 +715,19 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
                m_eye_position_pixel.set(eye_position_array, services);
                m_eye_position_vertex.set(eye_position_array, services);
 
-               float minimap_yaw_array[3];
-               v3f minimap_yaw = m_client->getMinimap()->getYawVec();
+               if (m_client->getMinimap()) {
+                       float minimap_yaw_array[3];
+                       v3f minimap_yaw = m_client->getMinimap()->getYawVec();
 #if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
-               minimap_yaw_array[0] = minimap_yaw.X;
-               minimap_yaw_array[1] = minimap_yaw.Y;
-               minimap_yaw_array[2] = minimap_yaw.Z;
+                       minimap_yaw_array[0] = minimap_yaw.X;
+                       minimap_yaw_array[1] = minimap_yaw.Y;
+                       minimap_yaw_array[2] = minimap_yaw.Z;
 #else
-               minimap_yaw.getAs3Values(minimap_yaw_array);
+                       minimap_yaw.getAs3Values(minimap_yaw_array);
 #endif
-               m_minimap_yaw.set(minimap_yaw_array, services);
+                       m_minimap_yaw.set(minimap_yaw_array, services);
+
+               }
 
                SamplerLayer_t base_tex = 0,
                                normal_tex = 1,
@@ -1038,7 +1033,7 @@ void KeyCache::populate()
        key[KeyType::SPECIAL1]     = getKeySetting("keymap_special1");
        key[KeyType::SNEAK]        = getKeySetting("keymap_sneak");
 
-       key[KeyType::AUTORUN]      = getKeySetting("keymap_autorun");
+       key[KeyType::AUTOFORWARD]  = getKeySetting("keymap_autoforward");
 
        key[KeyType::DROP]         = getKeySetting("keymap_drop");
        key[KeyType::INVENTORY]    = getKeySetting("keymap_inventory");
@@ -1243,7 +1238,7 @@ class Game {
        void toggleFast();
        void toggleNoClip();
        void toggleCinematic();
-       void toggleAutorun();
+       void toggleAutoforward();
 
        void toggleChat();
        void toggleHud();
@@ -1638,8 +1633,8 @@ void Game::run()
                        && client->checkPrivilege("fast");
 #endif
 
-       irr::core::dimension2d<u32> previous_screen_size(g_settings->getU16("screenW"),
-               g_settings->getU16("screenH"));
+       irr::core::dimension2d<u32> previous_screen_size(g_settings->getU16("screen_w"),
+               g_settings->getU16("screen_h"));
 
        while (device->run()
                        && !(*kill || g_gamecallback->shutdown_requested
@@ -1653,8 +1648,8 @@ void Game::run()
                if (previous_screen_size != current_screen_size &&
                                current_screen_size != irr::core::dimension2d<u32>(0,0) &&
                                g_settings->getBool("autosave_screensize")) {
-                       g_settings->setU16("screenW", current_screen_size.Width);
-                       g_settings->setU16("screenH", current_screen_size.Height);
+                       g_settings->setU16("screen_w", current_screen_size.Width);
+                       g_settings->setU16("screen_h", current_screen_size.Height);
                        previous_screen_size = current_screen_size;
                }
 
@@ -1706,6 +1701,8 @@ void Game::shutdown()
                driver->setRenderTarget(irr::video::ERT_STEREO_BOTH_BUFFERS);
        }
 #endif
+       if (current_formspec)
+               current_formspec->quitMenu();
 
        showOverlayMessage(wgettext("Shutting down..."), 0, 0, false);
 
@@ -1956,7 +1953,8 @@ bool Game::createClient(const std::string &playername,
        }
 
        mapper = client->getMinimap();
-       mapper->setMinimapMode(MINIMAP_MODE_OFF);
+       if (mapper)
+               mapper->setMinimapMode(MINIMAP_MODE_OFF);
 
        return true;
 }
@@ -2434,7 +2432,7 @@ void Game::updateStats(RunStats *stats, const FpsControl &draw_times,
 void Game::processUserInput(f32 dtime)
 {
        // Reset input if window not active or some menu is active
-       if (!device->isWindowActive() || !noMenuActive() || guienv->hasFocus(gui_chat_console)) {
+       if (!device->isWindowActive() || isMenuActive() || guienv->hasFocus(gui_chat_console)) {
                input->clear();
 #ifdef HAVE_TOUCHSCREENGUI
                g_touchscreengui->hide();
@@ -2475,8 +2473,8 @@ void Game::processKeyInput()
 {
        if (wasKeyDown(KeyType::DROP)) {
                dropSelectedItem();
-       } else if (wasKeyDown(KeyType::AUTORUN)) {
-               toggleAutorun();
+       } else if (wasKeyDown(KeyType::AUTOFORWARD)) {
+               toggleAutoforward();
        } else if (wasKeyDown(KeyType::INVENTORY)) {
                openInventory();
        } else if (wasKeyDown(KeyType::ESC) || input->wasKeyDown(CancelKey)) {
@@ -2757,15 +2755,15 @@ void Game::toggleCinematic()
        m_statustext = msg[cinematic];
 }
 
-// Add WoW-style autorun by toggling continuous forward.
-void Game::toggleAutorun()
+// Autoforward by toggling continuous forward.
+void Game::toggleAutoforward()
 {
-       static const wchar_t *msg[] = { L"autorun disabled", L"autorun enabled" };
-       bool autorun_enabled = !g_settings->getBool("continuous_forward");
-       g_settings->set("continuous_forward", bool_to_cstr(autorun_enabled));
+       static const wchar_t *msg[] = { L"autoforward disabled", L"autoforward enabled" };
+       bool autoforward_enabled = !g_settings->getBool("continuous_forward");
+       g_settings->set("continuous_forward", bool_to_cstr(autoforward_enabled));
 
        runData.statustext_time = 0;
-       m_statustext = msg[autorun_enabled ? 1 : 0];
+       m_statustext = msg[autoforward_enabled ? 1 : 0];
 }
 
 void Game::toggleChat()
@@ -2789,7 +2787,7 @@ void Game::toggleHud()
 
 void Game::toggleMinimap(bool shift_pressed)
 {
-       if (!flags.show_hud || !g_settings->getBool("enable_minimap"))
+       if (!mapper || !flags.show_hud || !g_settings->getBool("enable_minimap"))
                return;
 
        if (shift_pressed) {
@@ -2964,7 +2962,8 @@ void Game::toggleFullViewRange()
 
 void Game::updateCameraDirection(CameraOrientation *cam, float dtime)
 {
-       if ((device->isWindowActive() && noMenuActive()) || random_input) {
+       if ((device->isWindowActive() && device->isWindowFocused()
+                       && !isMenuActive()) || random_input) {
 
 #ifndef __ANDROID__
                if (!random_input) {
@@ -2989,8 +2988,7 @@ void Game::updateCameraDirection(CameraOrientation *cam, float dtime)
                        device->getCursorControl()->setVisible(true);
 #endif
 
-               if (!m_first_loop_after_window_activation)
-                       m_first_loop_after_window_activation = true;
+               m_first_loop_after_window_activation = true;
 
        }
 }
@@ -3233,8 +3231,7 @@ void Game::processClientEvents(CameraOrientation *cam)
                        {
                                HudElement *e = player->removeHud(event.hudrm.id);
 
-                               if (e != NULL)
-                                       delete e;
+                               delete e;
                        }
                        break;
 
@@ -3452,7 +3449,15 @@ void Game::updateSound(f32 dtime)
                              v3f(0, 0, 0), // velocity
                              camera->getDirection(),
                              camera->getCameraNode()->getUpVector());
-       sound->setListenerGain(g_settings->getFloat("sound_volume"));
+
+       // Check if volume is in the proper range, else fix it.
+       float old_volume = g_settings->getFloat("sound_volume");
+       float new_volume = rangelim(old_volume, 0.0f, 1.0f);
+       sound->setListenerGain(new_volume);
+
+       if (old_volume != new_volume) {
+               g_settings->setFloat("sound_volume", new_volume);
+       }
 
        LocalPlayer *player = client->getEnv().getLocalPlayer();
 
@@ -3591,7 +3596,7 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug)
        } else if (pointed.type == POINTEDTHING_NODE) {
                ToolCapabilities playeritem_toolcap =
                                playeritem.getToolCapabilities(itemdef_manager);
-               if (playeritem.name.empty()) {
+               if (playeritem.name.empty() && hand_def.tool_capabilities != NULL) {
                        playeritem_toolcap = *hand_def.tool_capabilities;
                }
                handlePointingAtNode(pointed, playeritem_def, playeritem_toolcap, dtime);
@@ -3632,7 +3637,7 @@ PointedThing Game::updatePointedThing(
        std::vector<aabb3f> *selectionboxes = hud->getSelectionBoxes();
        selectionboxes->clear();
        hud->setSelectedFaceNormal(v3f(0.0, 0.0, 0.0));
-       static const bool show_entity_selectionbox = g_settings->getBool(
+       static thread_local const bool show_entity_selectionbox = g_settings->getBool(
                "show_entity_selectionbox");
 
        ClientMap &map = client->getEnv().getClientMap();
@@ -3709,12 +3714,9 @@ PointedThing Game::updatePointedThing(
                float sin_r = 0.08 * sin(timerf);
                float sin_g = 0.08 * sin(timerf + irr::core::PI * 0.5);
                float sin_b = 0.08 * sin(timerf + irr::core::PI);
-               c.setRed(
-                       core::clamp(core::round32(c.getRed() * (0.8 + sin_r)), 0, 255));
-               c.setGreen(
-                       core::clamp(core::round32(c.getGreen() * (0.8 + sin_g)), 0, 255));
-               c.setBlue(
-                       core::clamp(core::round32(c.getBlue() * (0.8 + sin_b)), 0, 255));
+               c.setRed(core::clamp(core::round32(c.getRed() * (0.8 + sin_r)), 0, 255));
+               c.setGreen(core::clamp(core::round32(c.getGreen() * (0.8 + sin_g)), 0, 255));
+               c.setBlue(core::clamp(core::round32(c.getBlue() * (0.8 + sin_b)), 0, 255));
 
                // Set mesh final color
                hud->setSelectionMeshColor(c);
@@ -3743,6 +3745,13 @@ void Game::handlePointingAtNode(const PointedThing &pointed, const ItemDefinitio
        */
 
        ClientMap &map = client->getEnv().getClientMap();
+
+       if (runData.nodig_delay_timer <= 0.0 && isLeftPressed()
+                       && client->checkPrivilege("interact")) {
+               handleDigging(pointed, nodepos, playeritem_toolcap, dtime);
+       }
+
+       // This should be done after digging handling
        NodeMetadata *meta = map.getNodeMetadata(nodepos);
 
        if (meta) {
@@ -3756,11 +3765,6 @@ void Game::handlePointingAtNode(const PointedThing &pointed, const ItemDefinitio
                }
        }
 
-       if (runData.nodig_delay_timer <= 0.0 && isLeftPressed()
-                       && client->checkPrivilege("interact")) {
-               handleDigging(pointed, nodepos, playeritem_toolcap, dtime);
-       }
-
        if ((getRightClicked() ||
                        runData.repeat_rightclick_timer >= m_repeat_right_click_time) &&
                        client->checkPrivilege("interact")) {
@@ -3902,16 +3906,6 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos,
                        params = getDigParams(nodedef_manager->get(n).groups, tp);
        }
 
-       if (!runData.digging) {
-               infostream << "Started digging" << std::endl;
-               runData.dig_instantly = params.time == 0;
-               if (client->moddingEnabled() && client->getScript()->on_punchnode(nodepos, n))
-                       return;
-               client->interact(0, pointed);
-               runData.digging = true;
-               runData.ldown_for_dig = true;
-       }
-
        if (!params.diggable) {
                // I guess nobody will wait for this long
                runData.dig_time_complete = 10000000.0;
@@ -3926,6 +3920,16 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos,
                }
        }
 
+       if (!runData.digging) {
+               infostream << "Started digging" << std::endl;
+               runData.dig_instantly = runData.dig_time_complete == 0;
+               if (client->moddingEnabled() && client->getScript()->on_punchnode(nodepos, n))
+                       return;
+               client->interact(0, pointed);
+               runData.digging = true;
+               runData.ldown_for_dig = true;
+       }
+
        if (!runData.dig_instantly) {
                runData.dig_index = (float)crack_animation_length
                                * runData.dig_time
@@ -3976,10 +3980,9 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos,
                bool is_valid_position;
                MapNode wasnode = map.getNodeNoEx(nodepos, &is_valid_position);
                if (is_valid_position) {
-                       if (client->moddingEnabled()) {
-                               if (client->getScript()->on_dignode(nodepos, wasnode)) {
-                                       return;
-                               }
+                       if (client->moddingEnabled() &&
+                                       client->getScript()->on_dignode(nodepos, wasnode)) {
+                               return;
                        }
                        client->removeNode(nodepos);
                }
@@ -4183,7 +4186,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
                if (current_formspec->getReferenceCount() == 1) {
                        current_formspec->drop();
                        current_formspec = NULL;
-               } else if (!noMenuActive()) {
+               } else if (isMenuActive()) {
                        guiroot->bringToFront(current_formspec);
                }
        }
@@ -4197,7 +4200,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
        TimeTaker tt_draw("mainloop: draw");
        driver->beginScene(true, true, skycolor);
 
-       draw_scene(driver, smgr, *camera, *client, player, *hud, *mapper,
+       draw_scene(driver, smgr, *camera, *client, player, *hud, mapper,
                        guienv, screensize, skycolor, flags.show_hud,
                        flags.show_minimap);
 
@@ -4232,7 +4235,7 @@ void Game::updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
        /*
                Update minimap pos and rotation
        */
-       if (flags.show_minimap && flags.show_hud) {
+       if (mapper && flags.show_minimap && flags.show_hud) {
                mapper->setPos(floatToInt(player->getPosition(), BS));
                mapper->setAngle(player->getYaw());
        }
@@ -4553,10 +4556,10 @@ void Game::showPauseMenu()
                        GET_KEY_NAME(keymap_chat)
                        );
 
-#endif
-
        std::string control_text = std::string(control_text_buf);
        str_formspec_escape(control_text);
+#endif
+
        float ypos = simple_singleplayer_mode ? 0.7f : 0.1f;
        std::ostringstream os;