[CSM] Add `on_dignode` callback (#5140)
[oweals/minetest.git] / src / client / clientlauncher.cpp
index be6426627bef449b1cd9c78e3c9a5d1975dfa8cb..2adac53c2d55d8e79275423abb7596d87da8a4d8 100644 (file)
@@ -32,7 +32,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "guiEngine.h"
 #include "player.h"
 #include "fontengine.h"
+#include "joystick_controller.h"
 #include "clientlauncher.h"
+#include "version.h"
 
 /* mainmenumanager.h
  */
@@ -112,6 +114,8 @@ bool ClientLauncher::run(GameParams &game_params, const Settings &cmd_args)
 
        porting::setXorgClassHint(video_driver->getExposedVideoData(), PROJECT_NAME_C);
 
+       porting::setXorgWindowIcon(device);
+
        /*
                This changes the minimum allowed number of vertices in a VBO.
                Default is 500.
@@ -184,7 +188,9 @@ bool ClientLauncher::run(GameParams &game_params, const Settings &cmd_args)
        {
                // Set the window caption
                const wchar_t *text = wgettext("Main Menu");
-               device->setWindowCaption((utf8_to_wide(PROJECT_NAME_C) + L" [" + text + L"]").c_str());
+               device->setWindowCaption((utf8_to_wide(PROJECT_NAME_C) +
+                       L" " + utf8_to_wide(g_version_hash) +
+                       L" [" + text + L"]").c_str());
                delete[] text;
 
                try {   // This is used for catching disconnects
@@ -201,6 +207,9 @@ bool ClientLauncher::run(GameParams &game_params, const Settings &cmd_args)
                        bool game_has_run = launch_game(error_message, reconnect_requested,
                                game_params, cmd_args);
 
+                       // Reset the reconnect_requested flag
+                       reconnect_requested = false;
+
                        // If skip_main_menu, we only want to startup once
                        if (skip_main_menu && !first_loop)
                                break;
@@ -336,6 +345,7 @@ bool ClientLauncher::launch_game(std::string &error_message,
        MainMenuData menudata;
        menudata.address                         = address;
        menudata.name                            = playername;
+       menudata.password                        = password;
        menudata.port                            = itos(game_params.socket_port);
        menudata.script_data.errormessage        = error_message;
        menudata.script_data.reconnect_requested = reconnect_requested;
@@ -393,15 +403,14 @@ bool ClientLauncher::launch_game(std::string &error_message,
                return false;
        }
 
-       if (menudata.name == "")
-               menudata.name = std::string("Guest") + itos(myrand_range(1000, 9999));
-       else
-               playername = menudata.name;
+       if (menudata.name == "" && !simple_singleplayer_mode) {
+               error_message = gettext("Please choose a name!");
+               return false;
+       }
 
+       playername = menudata.name;
        password = menudata.password;
 
-       g_settings->set("name", playername);
-
        current_playername = playername;
        current_password   = password;
        current_address    = address;
@@ -414,13 +423,16 @@ bool ClientLauncher::launch_game(std::string &error_message,
                current_password = "";
                current_address = "";
                current_port = myrand_range(49152, 65535);
-       } else if (address != "") {
-               ServerListSpec server;
-               server["name"] = menudata.servername;
-               server["address"] = menudata.address;
-               server["port"] = menudata.port;
-               server["description"] = menudata.serverdescription;
-               ServerList::insert(server);
+       } else {
+               g_settings->set("name", playername);
+               if (address != "") {
+                       ServerListSpec server;
+                       server["name"] = menudata.servername;
+                       server["address"] = menudata.address;
+                       server["port"] = menudata.port;
+                       server["description"] = menudata.serverdescription;
+                       ServerList::insert(server);
+               }
        }
 
        infostream << "Selected world: " << worldspec.name
@@ -495,7 +507,8 @@ void ClientLauncher::main_menu(MainMenuData *menudata)
 #endif
 
        /* show main menu */
-       GUIEngine mymenu(device, guiroot, &g_menumgr, smgr, menudata, *kill);
+       GUIEngine mymenu(device, &input->joystick, guiroot,
+               &g_menumgr, smgr, menudata, *kill);
 
        smgr->clear();  /* leave scene manager in a clean state */
 }
@@ -544,6 +557,7 @@ bool ClientLauncher::create_engine_device()
        params.Vsync         = vsync;
        params.EventReceiver = receiver;
        params.HighPrecisionFPU = g_settings->getBool("high_precision_fpu");
+       params.ZBufferBits   = 24;
 #ifdef __ANDROID__
        params.PrivateData = porting::app_global;
        params.OGLES2ShaderPath = std::string(porting::path_user + DIR_DELIM +
@@ -553,6 +567,22 @@ bool ClientLauncher::create_engine_device()
        device = createDeviceEx(params);
 
        if (device) {
+               if (g_settings->getBool("enable_joysticks")) {
+                       irr::core::array<irr::SJoystickInfo> infos;
+                       std::vector<irr::SJoystickInfo> joystick_infos;
+                       // Make sure this is called maximum once per
+                       // irrlicht device, otherwise it will give you
+                       // multiple events for the same joystick.
+                       if (device->activateJoysticks(infos)) {
+                               infostream << "Joystick support enabled" << std::endl;
+                               joystick_infos.reserve(infos.size());
+                               for (u32 i = 0; i < infos.size(); i++) {
+                                       joystick_infos.push_back(infos[i]);
+                               }
+                       } else {
+                               errorstream << "Could not activate joystick support." << std::endl;
+                       }
+               }
                porting::initIrrlicht(device);
        }