/* Minetest-c55 Copyright (C) 2010 celeron55, Perttu Ahola 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 ============================== TODO: Move the default settings into some separate file */ #ifndef SERVER #ifdef _WIN32 #else #error "For a server build, SERVER must be defined globally" #endif #endif #ifdef UNITTEST_DISABLE #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 #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include #define sleep_ms(x) Sleep(x) #else #include #define sleep_ms(x) usleep(x*1000) #endif #include #include #include #include #include #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" // Dummy variable IrrlichtDevice *g_device = NULL; /* Settings. These are loaded from the config file. */ Settings g_settings; // Sets default settings void set_default_settings() { // Client stuff g_settings.setDefault("wanted_fps", "30"); g_settings.setDefault("fps_max", "60"); g_settings.setDefault("viewing_range_nodes_max", "300"); g_settings.setDefault("viewing_range_nodes_min", "35"); g_settings.setDefault("screenW", ""); g_settings.setDefault("screenH", ""); g_settings.setDefault("host_game", ""); g_settings.setDefault("port", ""); g_settings.setDefault("address", ""); g_settings.setDefault("name", ""); g_settings.setDefault("random_input", "false"); g_settings.setDefault("client_delete_unused_sectors_timeout", "1200"); g_settings.setDefault("enable_fog", "true"); // Server stuff g_settings.setDefault("creative_mode", "false"); g_settings.setDefault("heightmap_blocksize", "32"); g_settings.setDefault("height_randmax", "constant 50.0"); g_settings.setDefault("height_randfactor", "constant 0.6"); g_settings.setDefault("height_base", "linear 0 0 0"); g_settings.setDefault("plants_amount", "1.0"); g_settings.setDefault("ravines_amount", "1.0"); g_settings.setDefault("objectdata_interval", "0.2"); g_settings.setDefault("active_object_range", "2"); g_settings.setDefault("max_simultaneous_block_sends_per_client", "1"); g_settings.setDefault("max_simultaneous_block_sends_server_total", "4"); g_settings.setDefault("disable_water_climb", "true"); g_settings.setDefault("endless_water", "true"); g_settings.setDefault("max_block_send_distance", "5"); g_settings.setDefault("max_block_generate_distance", "4"); } /* Debug streams */ // Connection std::ostream *dout_con_ptr = &dummyout; std::ostream *derr_con_ptr = &dstream_no_stderr; // Server std::ostream *dout_server_ptr = &dstream; std::ostream *derr_server_ptr = &dstream; // Client std::ostream *dout_client_ptr = &dstream; std::ostream *derr_client_ptr = &dstream; /* Timestamp stuff */ JMutex g_timestamp_mutex; std::string getTimestamp() { if(g_timestamp_mutex.IsInitialized()==false) return ""; JMutexAutoLock lock(g_timestamp_mutex); time_t t = time(NULL); struct tm *tm = localtime(&t); char cs[20]; strftime(cs, 20, "%H:%M:%S", tm); return cs; } int main(int argc, char *argv[]) { /* Low-level initialization */ bool disable_stderr = false; #ifdef _WIN32 disable_stderr = true; #endif // Initialize debug streams debugstreams_init(disable_stderr, DEBUGFILE); // Initialize debug stacks debug_stacks_init(); DSTACK(__FUNCTION_NAME); try { /* Parse command line */ // List all allowed options core::map allowed_options; allowed_options.insert("help", ValueSpec(VALUETYPE_FLAG)); allowed_options.insert("config", ValueSpec(VALUETYPE_STRING, "Load configuration from specified file")); allowed_options.insert("port", ValueSpec(VALUETYPE_STRING)); allowed_options.insert("disable-unittests", ValueSpec(VALUETYPE_FLAG)); allowed_options.insert("enable-unittests", ValueSpec(VALUETYPE_FLAG)); Settings cmd_args; bool ret = cmd_args.parseCommandLine(argc, argv, allowed_options); if(ret == false || cmd_args.getFlag("help")) { dstream<<"Allowed options:"<::Iterator i = allowed_options.getIterator(); i.atEnd() == false; i++) { dstream<<" --"<getKey(); if(i.getNode()->getValue().type == VALUETYPE_FLAG) { } else { dstream<<" "; } dstream<getValue().help != NULL) { dstream<<" "<getValue().help <__| \\___ >____ > |__| "< list = server.getPlayerInfo(); core::list::Iterator i; static u32 sum_old = 0; u32 sum = PIChecksum(list); if(sum != sum_old) { std::cout<PrintLine(&std::cout); } } sum_old = sum; } } /* Update configuration file */ if(configpath != "") { g_settings.updateConfigFile(configpath.c_str()); } } //try catch(con::PeerNotFoundException &e) { dstream<