#include "materials.h"
#include "config.h"
#include "mineral.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
/*
Settings.
These are loaded from the config file.
*/
+Settings main_settings;
+Settings *g_settings = &main_settings;
-Settings g_settings;
-
-extern void set_default_settings();
-
-// A dummy thing
-ITextureSource *g_texturesource = NULL;
+// Global profiler
+Profiler main_profiler;
+Profiler *g_profiler = &main_profiler;
/*
Debug streams
// Connection
std::ostream *dout_con_ptr = &dummyout;
-std::ostream *derr_con_ptr = &dstream_no_stderr;
+std::ostream *derr_con_ptr = &verbosestream;
// Server
-std::ostream *dout_server_ptr = &dstream;
-std::ostream *derr_server_ptr = &dstream;
+std::ostream *dout_server_ptr = &infostream;
+std::ostream *derr_server_ptr = &errorstream;
// Client
-std::ostream *dout_client_ptr = &dstream;
-std::ostream *derr_client_ptr = &dstream;
-
+std::ostream *dout_client_ptr = &infostream;
+std::ostream *derr_client_ptr = &errorstream;
/*
gettime.h implementation
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
*/
disable_stderr = true;
#endif
+ porting::signal_handler_init();
+ bool &kill = *porting::signal_handler_killstatus();
+
+ // Initialize porting::path_data and porting::path_userdata
+ porting::initializePaths();
+
+ // Create user data directory
+ fs::CreateDir(porting::path_userdata);
+
// Initialize debug streams
- debugstreams_init(disable_stderr, DEBUGFILE);
+#ifdef RUN_IN_PLACE
+ std::string debugfile = DEBUGFILE;
+#else
+ std::string debugfile = porting::path_userdata+DIR_DELIM+DEBUGFILE;
+#endif
+ debugstreams_init(disable_stderr, debugfile.c_str());
// Initialize debug stacks
debug_stacks_init();
DSTACK(__FUNCTION_NAME);
- porting::initializePaths();
-
- initializeMaterialProperties();
+ // Init material properties table
+ //initializeMaterialProperties();
+ // Debug handler
BEGIN_DEBUG_EXCEPTION_HANDLER
// Print startup message
- dstream<<DTIME<<"minetest-c55"
+ actionstream<<PROJECT_NAME<<
" with SER_FMT_VER_HIGHEST="<<(int)SER_FMT_VER_HIGHEST
<<", "<<BUILD_INFO
<<std::endl;
allowed_options.insert("disable-unittests", ValueSpec(VALUETYPE_FLAG));
allowed_options.insert("enable-unittests", ValueSpec(VALUETYPE_FLAG));
allowed_options.insert("map-dir", ValueSpec(VALUETYPE_STRING));
+ allowed_options.insert("info-on-stderr", ValueSpec(VALUETYPE_FLAG));
Settings cmd_args;
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();
+ set_default_settings(g_settings);
- // 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");
-
// Initialize sockets
sockets_init();
atexit(sockets_cleanup);
- /*
- Initialization
- */
-
/*
Read config file
*/
if(cmd_args.exists("config"))
{
- bool r = g_settings.readConfigFile(cmd_args.get("config").c_str());
+ bool r = g_settings->readConfigFile(cmd_args.get("config").c_str());
if(r == false)
{
- dstream<<"Could not read configuration from \""
+ errorstream<<"Could not read configuration from \""
<<cmd_args.get("config")<<"\""<<std::endl;
return 1;
}
else
{
core::array<std::string> filenames;
- filenames.push_back(porting::path_userdata + "/minetest.conf");
+ filenames.push_back(porting::path_userdata +
+ DIR_DELIM + "minetest.conf");
#ifdef RUN_IN_PLACE
- filenames.push_back(porting::path_userdata + "/../minetest.conf");
+ filenames.push_back(porting::path_userdata +
+ DIR_DELIM + ".." + DIR_DELIM + "minetest.conf");
#endif
for(u32 i=0; i<filenames.size(); i++)
{
- bool r = g_settings.readConfigFile(filenames[i].c_str());
+ bool r = g_settings->readConfigFile(filenames[i].c_str());
if(r)
{
configpath = filenames[i];
srand(time(0));
mysrand(time(0));
+ // Initialize stuff
+
+ init_mineral();
+
/*
Run unit tests
*/
run_tests();
}
- // Initialize stuff
-
- init_mapnode();
- init_mineral();
-
/*
Check parameters
*/
{
port = cmd_args.getU16("port");
}
- else if(g_settings.exists("port") && g_settings.getU16("port") != 0)
+ else if(g_settings->exists("port") && g_settings->getU16("port") != 0)
{
- port = g_settings.getU16("port");
+ port = g_settings->getU16("port");
}
else
{
}
// Figure out path to map
- std::string map_dir = porting::path_userdata+"/map";
+ std::string map_dir = porting::path_userdata+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 if(g_settings->exists("map-dir"))
+ map_dir = g_settings->get("map-dir");
// Create server
- Server server(map_dir.c_str());
+ Server server(map_dir.c_str(), configpath);
server.start(port);
-
+
// Run server
- dedicated_server_loop(server);
+ dedicated_server_loop(server, kill);
} //try
catch(con::PeerNotFoundException &e)
{
- dstream<<DTIME<<"Connection timed out."<<std::endl;
+ errorstream<<"Connection timed out."<<std::endl;
}
- END_DEBUG_EXCEPTION_HANDLER
+ END_DEBUG_EXCEPTION_HANDLER(errorstream)
debugstreams_deinit();