diff options
-rw-r--r-- | src/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/main.cpp | 268 | ||||
-rw-r--r-- | src/servermain.cpp | 388 |
3 files changed, 147 insertions, 511 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d72128e01..e11c0f345 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -184,7 +184,7 @@ set(minetest_SRCS # Server sources set(minetestserver_SRCS ${common_SRCS} - servermain.cpp + main.cpp ) include_directories( diff --git a/src/main.cpp b/src/main.cpp index 46fe4715d..e78d4441c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -373,13 +373,14 @@ Doing currently: #endif #ifdef _MSC_VER +#ifndef SERVER // Dedicated server isn't linked with Irrlicht #pragma comment(lib, "Irrlicht.lib") - //#pragma comment(lib, "jthread.lib") - #pragma comment(lib, "zlibwapi.lib") - #pragma comment(lib, "Shell32.lib") // This would get rid of the console window //#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") #endif + #pragma comment(lib, "zlibwapi.lib") + #pragma comment(lib, "Shell32.lib") +#endif #include "irrlicht.h" // createDevice @@ -421,13 +422,30 @@ Profiler main_profiler; Profiler *g_profiler = &main_profiler; /* - Random stuff + Debug streams */ +// Connection +std::ostream *dout_con_ptr = &dummyout; +std::ostream *derr_con_ptr = &verbosestream; +//std::ostream *dout_con_ptr = &infostream; +//std::ostream *derr_con_ptr = &errorstream; + +// Server +std::ostream *dout_server_ptr = &infostream; +std::ostream *derr_server_ptr = &errorstream; + +// Client +std::ostream *dout_client_ptr = &infostream; +std::ostream *derr_client_ptr = &errorstream; + +#ifndef SERVER /* - mainmenumanager.h + Random stuff */ +/* mainmenumanager.h */ + gui::IGUIEnvironment* guienv = NULL; gui::IGUIStaticText *guiroot = NULL; MainMenuManager g_menumgr; @@ -439,28 +457,21 @@ bool noMenuActive() // Passed to menus to allow disconnecting and exiting MainGameCallback *g_gamecallback = NULL; +#endif /* - Debug streams + gettime.h implementation */ -// Connection -std::ostream *dout_con_ptr = &dummyout; -std::ostream *derr_con_ptr = &verbosestream; -//std::ostream *dout_con_ptr = &infostream; -//std::ostream *derr_con_ptr = &errorstream; - -// Server -std::ostream *dout_server_ptr = &infostream; -std::ostream *derr_server_ptr = &errorstream; +#ifdef SERVER -// Client -std::ostream *dout_client_ptr = &infostream; -std::ostream *derr_client_ptr = &errorstream; +u32 getTimeMs() +{ + /* Use imprecise system calls directly (from porting.h) */ + return porting::getTimeMs(); +} -/* - gettime.h implementation -*/ +#else // A small helper class class TimeGetter @@ -506,6 +517,30 @@ u32 getTimeMs() return g_timegetter->getTime(); } +#endif + +class StderrLogOutput: public ILogOutput +{ +public: + /* line: Full line with timestamp, level and thread */ + void printLog(const std::string &line) + { + std::cerr<<line<<std::endl; + } +} main_stderr_log_out; + +class DstreamNoStderrLogOutput: public ILogOutput +{ +public: + /* line: Full line with timestamp, level and thread */ + void printLog(const std::string &line) + { + dstream_no_stderr<<line<<std::endl; + } +} main_dstream_no_stderr_log_out; + +#ifndef SERVER + /* Event handler for Irrlicht @@ -897,6 +932,55 @@ private: bool rightreleased; }; +void drawMenuBackground(video::IVideoDriver* driver) +{ + core::dimension2d<u32> screensize = driver->getScreenSize(); + + video::ITexture *bgtexture = + driver->getTexture(getTexturePath("menubg.png").c_str()); + if(bgtexture) + { + s32 texturesize = 128; + s32 tiled_y = screensize.Height / texturesize + 1; + s32 tiled_x = screensize.Width / texturesize + 1; + + for(s32 y=0; y<tiled_y; y++) + for(s32 x=0; x<tiled_x; x++) + { + core::rect<s32> rect(0,0,texturesize,texturesize); + rect += v2s32(x*texturesize, y*texturesize); + driver->draw2DImage(bgtexture, rect, + core::rect<s32>(core::position2d<s32>(0,0), + core::dimension2di(bgtexture->getSize())), + NULL, NULL, true); + } + } + + video::ITexture *logotexture = + driver->getTexture(getTexturePath("menulogo.png").c_str()); + if(logotexture) + { + v2s32 logosize(logotexture->getOriginalSize().Width, + logotexture->getOriginalSize().Height); + logosize *= 4; + + video::SColor bgcolor(255,50,50,50); + core::rect<s32> bgrect(0, screensize.Height-logosize.Y-20, + screensize.Width, screensize.Height); + driver->draw2DRectangle(bgcolor, bgrect, NULL); + + core::rect<s32> rect(0,0,logosize.X,logosize.Y); + rect += v2s32(screensize.Width/2,screensize.Height-10-logosize.Y); + rect -= v2s32(logosize.X/2, 0); + driver->draw2DImage(logotexture, rect, + core::rect<s32>(core::position2d<s32>(0,0), + core::dimension2di(logotexture->getSize())), + NULL, NULL, true); + } +} + +#endif + // These are defined global so that they're not optimized too much. // Can't change them to volatile. s16 temp16; @@ -909,7 +993,7 @@ std::string tempstring2; void SpeedTests() { { - dstream<<"The following test should take around 20ms."<<std::endl; + infostream<<"The following test should take around 20ms."<<std::endl; TimeTaker timer("Testing std::string speed"); const u32 jj = 10000; for(u32 j=0; j<jj; j++) @@ -928,7 +1012,7 @@ void SpeedTests() } } - dstream<<"All of the following tests should take around 100ms each." + infostream<<"All of the following tests should take around 100ms each." <<std::endl; { @@ -971,7 +1055,7 @@ void SpeedTests() } { - dstream<<"Around 5000/ms should do well here."<<std::endl; + infostream<<"Around 5000/ms should do well here."<<std::endl; TimeTaker timer("Testing mutex speed"); JMutex m; @@ -990,78 +1074,11 @@ void SpeedTests() u32 dtime = timer.stop(); u32 per_ms = n / dtime; - dstream<<"Done. "<<dtime<<"ms, " + infostream<<"Done. "<<dtime<<"ms, " <<per_ms<<"/ms"<<std::endl; } } -void drawMenuBackground(video::IVideoDriver* driver) -{ - core::dimension2d<u32> screensize = driver->getScreenSize(); - - video::ITexture *bgtexture = - driver->getTexture(getTexturePath("menubg.png").c_str()); - if(bgtexture) - { - s32 texturesize = 128; - s32 tiled_y = screensize.Height / texturesize + 1; - s32 tiled_x = screensize.Width / texturesize + 1; - - for(s32 y=0; y<tiled_y; y++) - for(s32 x=0; x<tiled_x; x++) - { - core::rect<s32> rect(0,0,texturesize,texturesize); - rect += v2s32(x*texturesize, y*texturesize); - driver->draw2DImage(bgtexture, rect, - core::rect<s32>(core::position2d<s32>(0,0), - core::dimension2di(bgtexture->getSize())), - NULL, NULL, true); - } - } - - video::ITexture *logotexture = - driver->getTexture(getTexturePath("menulogo.png").c_str()); - if(logotexture) - { - v2s32 logosize(logotexture->getOriginalSize().Width, - logotexture->getOriginalSize().Height); - logosize *= 4; - - video::SColor bgcolor(255,50,50,50); - core::rect<s32> bgrect(0, screensize.Height-logosize.Y-20, - screensize.Width, screensize.Height); - driver->draw2DRectangle(bgcolor, bgrect, NULL); - - core::rect<s32> rect(0,0,logosize.X,logosize.Y); - rect += v2s32(screensize.Width/2,screensize.Height-10-logosize.Y); - rect -= v2s32(logosize.X/2, 0); - driver->draw2DImage(logotexture, rect, - core::rect<s32>(core::position2d<s32>(0,0), - core::dimension2di(logotexture->getSize())), - NULL, NULL, true); - } -} - -class StderrLogOutput: public ILogOutput -{ -public: - /* line: Full line with timestamp, level and thread */ - void printLog(const std::string &line) - { - std::cerr<<line<<std::endl; - } -} main_stderr_log_out; - -class DstreamNoStderrLogOutput: public ILogOutput -{ -public: - /* line: Full line with timestamp, level and thread */ - void printLog(const std::string &line) - { - dstream_no_stderr<<line<<std::endl; - } -} main_dstream_no_stderr_log_out; - int main(int argc, char *argv[]) { /* @@ -1086,29 +1103,28 @@ int main(int argc, char *argv[]) core::map<std::string, ValueSpec> allowed_options; allowed_options.insert("help", ValueSpec(VALUETYPE_FLAG, "Show allowed options")); - allowed_options.insert("server", ValueSpec(VALUETYPE_FLAG, - "Run server directly")); allowed_options.insert("config", ValueSpec(VALUETYPE_STRING, "Load configuration from specified file")); allowed_options.insert("port", ValueSpec(VALUETYPE_STRING, - "Set network port to connect to")); - allowed_options.insert("address", ValueSpec(VALUETYPE_STRING, - "Address to connect to")); - allowed_options.insert("random-input", ValueSpec(VALUETYPE_FLAG, - "Enable random user input, for testing")); + "Set network port (UDP) to use")); allowed_options.insert("disable-unittests", ValueSpec(VALUETYPE_FLAG, "Disable unit tests")); allowed_options.insert("enable-unittests", ValueSpec(VALUETYPE_FLAG, "Enable unit tests")); allowed_options.insert("map-dir", ValueSpec(VALUETYPE_STRING, "Map directory (where everything in the world is stored)")); -#ifdef _WIN32 - allowed_options.insert("dstream-on-stderr", ValueSpec(VALUETYPE_FLAG)); -#endif - allowed_options.insert("speedtests", ValueSpec(VALUETYPE_FLAG, - "Run speed tests")); allowed_options.insert("info-on-stderr", ValueSpec(VALUETYPE_FLAG, "Print debug information to console")); +#ifndef SERVER + allowed_options.insert("speedtests", ValueSpec(VALUETYPE_FLAG, + "Run speed tests")); + allowed_options.insert("address", ValueSpec(VALUETYPE_STRING, + "Address to connect to")); + allowed_options.insert("random-input", ValueSpec(VALUETYPE_FLAG, + "Enable random user input, for testing")); + allowed_options.insert("server", ValueSpec(VALUETYPE_FLAG, + "Run server directly")); +#endif Settings cmd_args; @@ -1145,13 +1161,7 @@ int main(int argc, char *argv[]) Low-level initialization */ - bool disable_stderr = false; -#ifdef _WIN32 - if(cmd_args.getFlag("dstream-on-stderr") == false) - disable_stderr = true; -#endif - - if(cmd_args.getFlag("info-on-stderr")) + if(cmd_args.getFlag("info-on-stderr") || cmd_args.getFlag("speedtests")) log_add_output(&main_stderr_log_out, LMT_INFO); porting::signal_handler_init(); @@ -1170,6 +1180,7 @@ int main(int argc, char *argv[]) #else std::string debugfile = porting::path_user+DIR_DELIM+DEBUGFILE; #endif + bool disable_stderr = false; debugstreams_init(disable_stderr, debugfile.c_str()); // Initialize debug stacks debug_stacks_init(); @@ -1261,13 +1272,6 @@ int main(int argc, char *argv[]) run_tests(); } - /*for(s16 y=-100; y<100; y++) - for(s16 x=-100; x<100; x++) - { - std::cout<<noise2d_gradient((double)x/10,(double)y/10, 32415)<<std::endl; - } - return 0;*/ - /* Game parameters */ @@ -1298,25 +1302,43 @@ int main(int argc, char *argv[]) map_dir = legacy_map_dir; } } - - // Run dedicated server if asked to - if(cmd_args.getFlag("server")) + + // Run dedicated server if asked to or no other option +#ifdef SERVER + bool run_dedicated_server = true; +#else + bool run_dedicated_server = cmd_args.getFlag("server"); +#endif + if(run_dedicated_server) { DSTACK("Dedicated server branch"); - // Create time getter + // Create time getter if built with Irrlicht +#ifndef SERVER g_timegetter = new SimpleTimeGetter(); +#endif // Create server Server server(map_dir, configpath, "mesetint"); server.start(port); + // ASCII art for the win! + dstream<<std::endl + <<" .__ __ __ "<<std::endl + <<" _____ |__| ____ _____/ |_ ____ _______/ |_ "<<std::endl + <<" / \\| |/ \\_/ __ \\ __\\/ __ \\ / ___/\\ __\\"<<std::endl + <<"| Y Y \\ | | \\ ___/| | \\ ___/ \\___ \\ | | "<<std::endl + <<"|__|_| /__|___| /\\___ >__| \\___ >____ > |__| "<<std::endl + <<" \\/ \\/ \\/ \\/ \\/ "<<std::endl + <<std::endl; + // Run server dedicated_server_loop(server, kill); return 0; } +#ifndef SERVER // Exclude from dedicated server build /* More parameters @@ -1679,6 +1701,8 @@ int main(int argc, char *argv[]) In the end, delete the Irrlicht device. */ device->drop(); + +#endif // !SERVER END_DEBUG_EXCEPTION_HANDLER(errorstream) diff --git a/src/servermain.cpp b/src/servermain.cpp deleted file mode 100644 index 9be0c80ae..000000000 --- a/src/servermain.cpp +++ /dev/null @@ -1,388 +0,0 @@ -/* -Minetest-c55 -Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com> - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -/* -=============================== NOTES ============================== - - -*/ - -#ifndef SERVER - #ifdef _WIN32 - #pragma error ("For a server build, SERVER must be defined globally") - #else - #error "For a server build, SERVER must be defined globally" - #endif -#endif - -#ifdef NDEBUG - #ifdef _WIN32 - #pragma message ("Disabling unit tests") - #else - #warning "Disabling unit tests" - #endif - // Disable unit tests - #define ENABLE_TESTS 0 -#else - // Enable unit tests - #define ENABLE_TESTS 1 -#endif - -#ifdef _MSC_VER -#pragma comment(lib, "jthread.lib") -#pragma comment(lib, "zlibwapi.lib") -#endif - -#include <iostream> -#include <fstream> -#include <time.h> -#include <jmutexautolock.h> -#include <locale.h> -#include "common_irrlicht.h" -#include "debug.h" -#include "map.h" -#include "player.h" -#include "main.h" -#include "test.h" -#include "environment.h" -#include "server.h" -#include "serialization.h" -#include "constants.h" -#include "strfnd.h" -#include "porting.h" -#include "config.h" -#include "filesys.h" -#include "defaultsettings.h" -#include "settings.h" -#include "profiler.h" -#include "log.h" -#include "nodedef.h" // For init_contentfeatures -#include "content_mapnode.h" // For content_mapnode_init -#include "mods.h" - -/* - Settings. - These are loaded from the config file. -*/ -Settings main_settings; -Settings *g_settings = &main_settings; - -// Global profiler -Profiler main_profiler; -Profiler *g_profiler = &main_profiler; - -/* - Debug streams -*/ - -// Connection -std::ostream *dout_con_ptr = &dummyout; -std::ostream *derr_con_ptr = &verbosestream; - -// Server -std::ostream *dout_server_ptr = &infostream; -std::ostream *derr_server_ptr = &errorstream; - -// Client -std::ostream *dout_client_ptr = &infostream; -std::ostream *derr_client_ptr = &errorstream; - -/* - gettime.h implementation -*/ - -u32 getTimeMs() -{ - /* - Use imprecise system calls directly (from porting.h) - */ - return porting::getTimeMs(); -} - -class StderrLogOutput: public ILogOutput -{ -public: - /* line: Full line with timestamp, level and thread */ - void printLog(const std::string &line) - { - std::cerr<<line<<std::endl; - } -} main_stderr_log_out; - -class DstreamNoStderrLogOutput: public ILogOutput -{ -public: - /* line: Full line with timestamp, level and thread */ - void printLog(const std::string &line) - { - dstream_no_stderr<<line<<std::endl; - } -} main_dstream_no_stderr_log_out; - -int main(int argc, char *argv[]) -{ - /* - Initialization - */ - - log_add_output_maxlev(&main_stderr_log_out, LMT_ACTION); - log_add_output_all_levs(&main_dstream_no_stderr_log_out); - - log_register_thread("main"); - - // Set locale. This is for forcing '.' as the decimal point. - std::locale::global(std::locale("C")); - // This enables printing all characters in bitmap font - setlocale(LC_CTYPE, "en_US"); - - /* - Low-level initialization - */ - - bool disable_stderr = false; -#ifdef _WIN32 - disable_stderr = true; -#endif - - porting::signal_handler_init(); - bool &kill = *porting::signal_handler_killstatus(); - - porting::initializePaths(); - - // Create user data directory - fs::CreateDir(porting::path_user); - - // Initialize debug streams -#ifdef RUN_IN_PLACE - std::string debugfile = DEBUGFILE; -#else - std::string debugfile = porting::path_user+DIR_DELIM+DEBUGFILE; -#endif - debugstreams_init(disable_stderr, debugfile.c_str()); - // Initialize debug stacks - debug_stacks_init(); - - DSTACK(__FUNCTION_NAME); - - // Init material properties table - //initializeMaterialProperties(); - - // Debug handler - BEGIN_DEBUG_EXCEPTION_HANDLER - - // Print startup message - actionstream<<PROJECT_NAME<< - " with SER_FMT_VER_HIGHEST="<<(int)SER_FMT_VER_HIGHEST - <<", "<<BUILD_INFO - <<std::endl; - - try - { - - /* - Parse command line - */ - - // List all allowed options - core::map<std::string, ValueSpec> allowed_options; - allowed_options.insert("help", ValueSpec(VALUETYPE_FLAG, - "Show allowed options")); - allowed_options.insert("config", ValueSpec(VALUETYPE_STRING, - "Load configuration from specified file")); - allowed_options.insert("port", ValueSpec(VALUETYPE_STRING, - "Set network port (UDP) to use")); - allowed_options.insert("disable-unittests", ValueSpec(VALUETYPE_FLAG, - "Disable unit tests")); - allowed_options.insert("enable-unittests", ValueSpec(VALUETYPE_FLAG, - "Enable unit tests")); - allowed_options.insert("map-dir", ValueSpec(VALUETYPE_STRING, - "Map directory (where everything in the world is stored)")); - allowed_options.insert("info-on-stderr", ValueSpec(VALUETYPE_FLAG, - "Print debug information to console")); - - Settings cmd_args; - - bool ret = cmd_args.parseCommandLine(argc, argv, allowed_options); - - if(ret == false || cmd_args.getFlag("help")) - { - dstream<<"Allowed options:"<<std::endl; - for(core::map<std::string, ValueSpec>::Iterator - i = allowed_options.getIterator(); - i.atEnd() == false; i++) - { - dstream<<" --"<<i.getNode()->getKey(); - if(i.getNode()->getValue().type == VALUETYPE_FLAG) - { - } - else - { - dstream<<" <value>"; - } - dstream<<std::endl; - - if(i.getNode()->getValue().help != NULL) - { - dstream<<" "<<i.getNode()->getValue().help - <<std::endl; - } - } - - return cmd_args.getFlag("help") ? 0 : 1; - } - - if(cmd_args.getFlag("info-on-stderr")) - log_add_output(&main_stderr_log_out, LMT_INFO); - - /* - Basic initialization - */ - - // Initialize default settings - set_default_settings(g_settings); - - // Initialize sockets - sockets_init(); - atexit(sockets_cleanup); - - /* - Read config file - */ - - // Path of configuration file in use - std::string configpath = ""; - - if(cmd_args.exists("config")) - { - bool r = g_settings->readConfigFile(cmd_args.get("config").c_str()); - if(r == false) - { - errorstream<<"Could not read configuration from \"" - <<cmd_args.get("config")<<"\""<<std::endl; - return 1; - } - configpath = cmd_args.get("config"); - } - else - { - core::array<std::string> filenames; - filenames.push_back(porting::path_user + - DIR_DELIM + "minetest.conf"); - // Legacy configuration file location - filenames.push_back(porting::path_user + - DIR_DELIM + ".." + DIR_DELIM + "minetest.conf"); -#ifdef RUN_IN_PLACE - // Try also from a lower level (to aid having the same configuration - // for many RUN_IN_PLACE installs) - filenames.push_back(porting::path_user + - DIR_DELIM + ".." + DIR_DELIM + ".." + DIR_DELIM + "minetest.conf"); -#endif - - for(u32 i=0; i<filenames.size(); i++) - { - bool r = g_settings->readConfigFile(filenames[i].c_str()); - if(r) - { - configpath = filenames[i]; - break; - } - } - } - - // Initialize random seed - srand(time(0)); - mysrand(time(0)); - - /* - Run unit tests - */ - if((ENABLE_TESTS && cmd_args.getFlag("disable-unittests") == false) - || cmd_args.getFlag("enable-unittests") == true) - { - run_tests(); - } - - /* - Check parameters - */ - - std::cout<<std::endl<<std::endl; - - std::cout - <<" .__ __ __ "<<std::endl - <<" _____ |__| ____ _____/ |_ ____ _______/ |_ "<<std::endl - <<" / \\| |/ \\_/ __ \\ __\\/ __ \\ / ___/\\ __\\"<<std::endl - <<"| Y Y \\ | | \\ ___/| | \\ ___/ \\___ \\ | | "<<std::endl - <<"|__|_| /__|___| /\\___ >__| \\___ >____ > |__| "<<std::endl - <<" \\/ \\/ \\/ \\/ \\/ "<<std::endl - <<std::endl; - - std::cout<<std::endl; - - // Port? - u16 port = 30000; - if(cmd_args.exists("port") && cmd_args.getU16("port") != 0) - port = cmd_args.getU16("port"); - else if(g_settings->exists("port") && g_settings->getU16("port") != 0) - port = g_settings->getU16("port"); - - // Map directory - std::string map_dir = porting::path_user + DIR_DELIM + "server" + DIR_DELIM + "worlds" + DIR_DELIM + "world"; - if(cmd_args.exists("map-dir")) - map_dir = cmd_args.get("map-dir"); - else if(g_settings->exists("map-dir")) - map_dir = g_settings->get("map-dir"); - else{ - // No map-dir option was specified. - // Check if the world is found from the default directory, and if - // not, see if the legacy world directory exists. - std::string legacy_map_dir = porting::path_user+DIR_DELIM+".."+DIR_DELIM+"world"; - if(!fs::PathExists(map_dir) && fs::PathExists(legacy_map_dir)){ - errorstream<<"Warning: Using legacy world directory \"" - <<legacy_map_dir<<"\""<<std::endl; - map_dir = legacy_map_dir; - } - } - - - // Create server - Server server(map_dir, configpath, "mesetint"); - server.start(port); - - // Run server - dedicated_server_loop(server, kill); - - } //try - catch(con::PeerNotFoundException &e) - { - errorstream<<"Connection timed out."<<std::endl; - } - catch(ModError &e) - { - errorstream<<e.what()<<std::endl; - } - - END_DEBUG_EXCEPTION_HANDLER(errorstream) - - debugstreams_deinit(); - - return 0; -} - -//END |