]> git.lizzy.rs Git - minetest.git/blobdiff - src/server.cpp
Added debug log level setting
[minetest.git] / src / server.cpp
index 70f71e3fbf5fb84294ce2fa47fa51364cbdf5342..94a4787f88f27892831bc5639dfb43c2ffa4860f 100644 (file)
@@ -51,6 +51,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "sound.h" // dummySoundManager
 #include "event_manager.h"
 #include "hex.h"
+#include "serverlist.h"
 #include "util/string.h"
 #include "util/pointedthing.h"
 #include "util/mathconstants.h"
@@ -961,9 +962,11 @@ Server::Server(
 {
        m_liquid_transform_timer = 0.0;
        m_print_info_timer = 0.0;
+       m_masterserver_timer = 0.0;
        m_objectdata_timer = 0.0;
        m_emergethread_trigger_timer = 0.0;
        m_savemap_timer = 0.0;
+       m_clients_number = 0;
 
        m_env_mutex.Init();
        m_con_mutex.Init();
@@ -998,17 +1001,20 @@ Server::Server(
 
        ModConfiguration modconf(m_path_world);
        m_mods = modconf.getMods();
+       std::list<ModSpec> unsatisfied_mods = modconf.getUnsatisfiedMods();
        // complain about mods with unsatisfied dependencies
        if(!modconf.isConsistent())     
        {
-               errorstream << "The following mods have unsatisfied dependencies: ";
-               std::list<ModSpec> modlist = modconf.getUnsatisfiedMods();
-               for(std::list<ModSpec>::iterator it = modlist.begin();
-                       it != modlist.end(); ++it)
+               for(std::list<ModSpec>::iterator it = unsatisfied_mods.begin();
+                       it != unsatisfied_mods.end(); ++it)
                {
-                       errorstream << (*it).name << " ";
+                       ModSpec mod = *it;
+                       errorstream << "mod \"" << mod.name << "\" has unsatisfied dependencies: ";
+                       for(std::set<std::string>::iterator dep_it = mod.unsatisfied_depends.begin();
+                               dep_it != mod.unsatisfied_depends.end(); ++dep_it)
+                               errorstream << " \"" << *dep_it << "\"";
+                       errorstream << std::endl;
                }
-               errorstream << std::endl;
        }
 
        Settings worldmt_settings;
@@ -1033,12 +1039,15 @@ Server::Server(
        for(std::vector<ModSpec>::iterator it = m_mods.begin();
                it != m_mods.end(); ++it)
                load_mod_names.erase((*it).name);
+       for(std::list<ModSpec>::iterator it = unsatisfied_mods.begin();
+               it != unsatisfied_mods.end(); ++it)
+               load_mod_names.erase((*it).name);
        if(!load_mod_names.empty())
        {               
-               errorstream << "The following mods could not be found: ";
+               errorstream << "The following mods could not be found:";
                for(std::set<std::string>::iterator it = load_mod_names.begin();
                        it != load_mod_names.end(); ++it)
-                       errorstream << (*it) << " ";
+                       errorstream << " \"" << (*it) << "\"";
                errorstream << std::endl;
        }
 
@@ -1097,15 +1106,14 @@ Server::Server(
        // Add default biomes after nodedef had its aliases added
        m_biomedef->addDefaultBiomes();
 
-       // Initialize Environment
-       ServerMap *servermap = new ServerMap(path_world, this);
-       m_env = new ServerEnvironment(servermap, m_lua, this, this);
-
        // Create emerge manager
-       m_emerge = new EmergeManager(this, m_biomedef, servermap->getMapgenParams());
+       m_emerge = new EmergeManager(this, m_biomedef);
 
-       // Give map pointer to the emerge manager
-       servermap->setEmerge(m_emerge);
+       // Initialize Environment
+       ServerMap *servermap = new ServerMap(path_world, this, m_emerge);
+       m_env = new ServerEnvironment(servermap, m_lua, this, this);
+       
+       m_emerge->initMapgens(servermap->getMapgenParams());
 
        // Give environment reference to scripting api
        scriptapi_add_environment(m_lua, m_env);
@@ -1500,7 +1508,7 @@ void Server::AsyncRunStep()
                        counter = 0.0;
 
                        JMutexAutoLock lock2(m_con_mutex);
-
+                       m_clients_number = 0;
                        if(m_clients.size() != 0)
                                infostream<<"Players:"<<std::endl;
                        for(core::map<u16, RemoteClient*>::Iterator
@@ -1514,10 +1522,25 @@ void Server::AsyncRunStep()
                                        continue;
                                infostream<<"* "<<player->getName()<<"\t";
                                client->PrintInfo(infostream);
+                               ++m_clients_number;
                        }
                }
        }
 
+
+#if USE_CURL
+       // send masterserver announce
+       {
+               float &counter = m_masterserver_timer;
+               if((!counter || counter >= 300.0) && g_settings->getBool("server_announce") == true)
+               {
+                       ServerList::sendAnnounce(!counter ? "start" : "update", m_clients_number);
+                       counter = 0.01;
+               }
+               counter += dtime;
+       }
+#endif
+
        //if(g_settings->getBool("enable_experimental"))
        {
 
@@ -2345,6 +2368,9 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
                infostream<<"Server: Sending content to "
                                <<getPlayerName(peer_id)<<std::endl;
 
+               // Send player movement settings
+               SendMovement(m_con, peer_id);
+
                // Send item definitions
                SendItemDef(m_con, peer_id, m_itemdef);
 
@@ -3535,6 +3561,32 @@ void Server::deletingPeer(con::Peer *peer, bool timeout)
        Static send methods
 */
 
+void Server::SendMovement(con::Connection &con, u16 peer_id)
+{
+       DSTACK(__FUNCTION_NAME);
+       std::ostringstream os(std::ios_base::binary);
+
+       writeU16(os, TOCLIENT_MOVEMENT);
+       writeF1000(os, g_settings->getFloat("movement_acceleration_default"));
+       writeF1000(os, g_settings->getFloat("movement_acceleration_air"));
+       writeF1000(os, g_settings->getFloat("movement_acceleration_fast"));
+       writeF1000(os, g_settings->getFloat("movement_speed_walk"));
+       writeF1000(os, g_settings->getFloat("movement_speed_crouch"));
+       writeF1000(os, g_settings->getFloat("movement_speed_fast"));
+       writeF1000(os, g_settings->getFloat("movement_speed_climb"));
+       writeF1000(os, g_settings->getFloat("movement_speed_jump"));
+       writeF1000(os, g_settings->getFloat("movement_liquid_fluidity"));
+       writeF1000(os, g_settings->getFloat("movement_liquid_fluidity_smooth"));
+       writeF1000(os, g_settings->getFloat("movement_liquid_sink"));
+       writeF1000(os, g_settings->getFloat("movement_gravity"));
+
+       // Make data buffer
+       std::string s = os.str();
+       SharedBuffer<u8> data((u8*)s.c_str(), s.size());
+       // Send as reliable
+       con.Send(peer_id, 0, data, true);
+}
+
 void Server::SendHP(con::Connection &con, u16 peer_id, u8 hp)
 {
        DSTACK(__FUNCTION_NAME);
@@ -4879,7 +4931,7 @@ v3f findSpawnPos(ServerMap &map)
                        continue;
                }
 
-               nodepos = v3s16(nodepos2d.X, groundheight+1, nodepos2d.Y);
+               nodepos = v3s16(nodepos2d.X, groundheight-2, nodepos2d.Y);
                bool is_good = false;
                s32 air_count = 0;
                for(s32 i=0; i<10; i++){
@@ -5152,6 +5204,10 @@ void dedicated_server_loop(Server &server, bool &kill)
                if(server.getShutdownRequested() || kill)
                {
                        infostream<<"Dedicated server quitting"<<std::endl;
+#if USE_CURL
+                       if(g_settings->getBool("server_announce") == true)
+                               ServerList::sendAnnounce("delete");
+#endif
                        break;
                }