]> git.lizzy.rs Git - minetest.git/blobdiff - src/client/client.cpp
content_cao: Do not expire visuals for texture updates
[minetest.git] / src / client / client.cpp
index 94b483802c5d184ee822faf593593b926610b9ee..c03c062c6635a95803c721c48a4cd214c8b2c06e 100644 (file)
@@ -60,6 +60,28 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 extern gui::IGUIEnvironment* guienv;
 
+/*
+       Utility classes
+*/
+
+u32 PacketCounter::sum() const
+{
+       u32 n = 0;
+       for (const auto &it : m_packets)
+               n += it.second;
+       return n;
+}
+
+void PacketCounter::print(std::ostream &o) const
+{
+       for (const auto &it : m_packets) {
+               auto name = it.first >= TOCLIENT_NUM_MSG_TYPES ? "?"
+                       : toClientCommandTable[it.first].name;
+               o << "cmd " << it.first << " (" << name << ") count "
+                       << it.second << std::endl;
+       }
+}
+
 /*
        Client
 */
@@ -164,7 +186,7 @@ void Client::loadMods()
                infostream << mod.name << " ";
        infostream << std::endl;
 
-       // Load and run "mod" scripts
+       // Load "mod" scripts
        for (const ModSpec &mod : m_mods) {
                if (!string_allowed(mod.name, MODNAME_ALLOWED_CHARS)) {
                        throw ModError("Error loading mod \"" + mod.name +
@@ -174,7 +196,7 @@ void Client::loadMods()
                scanModIntoMemory(mod.name, mod.path);
        }
 
-       // Load and run "mod" scripts
+       // Run them
        for (const ModSpec &mod : m_mods)
                m_script->loadModFromMemory(mod.name);
 
@@ -183,10 +205,14 @@ void Client::loadMods()
 
        // Run a callback when mods are loaded
        m_script->on_mods_loaded();
+
+       // Create objects if they're ready
        if (m_state == LC_Ready)
                m_script->on_client_ready(m_env.getLocalPlayer());
        if (m_camera)
                m_script->on_camera_ready(m_camera);
+       if (m_minimap)
+               m_script->on_minimap_ready(m_minimap);
 }
 
 bool Client::checkBuiltinIntegrity()
@@ -336,12 +362,14 @@ void Client::step(float dtime)
        {
                float &counter = m_packetcounter_timer;
                counter -= dtime;
-               if(counter <= 0.0)
+               if(counter <= 0.0f)
                {
-                       counter = 20.0;
+                       counter = 30.0f;
+                       u32 sum = m_packetcounter.sum();
+                       float avg = sum / counter;
 
-                       infostream << "Client packetcounter (" << m_packetcounter_timer
-                                       << "):"<<std::endl;
+                       infostream << "Client packetcounter (" << counter << "s): "
+                                       << "sum=" << sum << " avg=" << avg << "/s" << std::endl;
                        m_packetcounter.print(infostream);
                        m_packetcounter.clear();
                }
@@ -621,14 +649,17 @@ void Client::step(float dtime)
 
        m_mod_storage_save_timer -= dtime;
        if (m_mod_storage_save_timer <= 0.0f) {
-               verbosestream << "Saving registered mod storages." << std::endl;
                m_mod_storage_save_timer = g_settings->getFloat("server_map_save_interval");
+               int n = 0;
                for (std::unordered_map<std::string, ModMetadata *>::const_iterator
                                it = m_mod_storages.begin(); it != m_mod_storages.end(); ++it) {
                        if (it->second->isModified()) {
                                it->second->save(getModStoragePath());
+                               n++;
                        }
                }
+               if (n > 0)
+                       infostream << "Saved " << n << " modified mod storages." << std::endl;
        }
 
        // Write server map
@@ -653,8 +684,8 @@ bool Client::loadMedia(const std::string &data, const std::string &filename)
        };
        name = removeStringEnd(filename, image_ext);
        if (!name.empty()) {
-               verbosestream<<"Client: Attempting to load image "
-               <<"file \""<<filename<<"\""<<std::endl;
+               TRACESTREAM(<< "Client: Attempting to load image "
+                       << "file \"" << filename << "\"" << std::endl);
 
                io::IFileSystem *irrfs = RenderingEngine::get_filesystem();
                video::IVideoDriver *vdrv = RenderingEngine::get_video_driver();
@@ -687,10 +718,9 @@ bool Client::loadMedia(const std::string &data, const std::string &filename)
        };
        name = removeStringEnd(filename, sound_ext);
        if (!name.empty()) {
-               verbosestream<<"Client: Attempting to load sound "
-               <<"file \""<<filename<<"\""<<std::endl;
-               m_sound->loadSoundData(name, data);
-               return true;
+               TRACESTREAM(<< "Client: Attempting to load sound "
+                       << "file \"" << filename << "\"" << std::endl);
+               return m_sound->loadSoundData(name, data);
        }
 
        const char *model_ext[] = {
@@ -714,9 +744,9 @@ bool Client::loadMedia(const std::string &data, const std::string &filename)
        };
        name = removeStringEnd(filename, translate_ext);
        if (!name.empty()) {
-               verbosestream << "Client: Loading translation: "
-                               << "\"" << filename << "\"" << std::endl;
-               g_translations->loadTranslation(data);
+               TRACESTREAM(<< "Client: Loading translation: "
+                               << "\"" << filename << "\"" << std::endl);
+               g_client_translations->loadTranslation(data);
                return true;
        }
 
@@ -1106,7 +1136,7 @@ void Client::sendRemovedSounds(std::vector<s32> &soundList)
 
        pkt << (u16) (server_ids & 0xFFFF);
 
-       for (int sound_id : soundList)
+       for (s32 sound_id : soundList)
                pkt << sound_id;
 
        Send(&pkt);
@@ -1722,8 +1752,11 @@ void Client::afterContentReceived()
        text = wgettext("Initializing nodes...");
        RenderingEngine::draw_load_screen(text, guienv, m_tsrc, 0, 72);
        m_nodedef->updateAliases(m_itemdef);
-       for (const auto &path : getTextureDirs())
-               m_nodedef->applyTextureOverrides(path + DIR_DELIM + "override.txt");
+       for (const auto &path : getTextureDirs()) {
+               TextureOverrideSource override_source(path + DIR_DELIM + "override.txt");
+               m_nodedef->applyTextureOverrides(override_source.getNodeTileOverrides());
+               m_itemdef->applyTextureOverrides(override_source.getItemTextureOverrides());
+       }
        m_nodedef->setNodeRegistrationStatus(true);
        m_nodedef->runNodeResolveCallbacks();
        delete[] text;
@@ -1780,13 +1813,24 @@ void Client::makeScreenshot()
        char timetstamp_c[64];
        strftime(timetstamp_c, sizeof(timetstamp_c), "%Y%m%d_%H%M%S", tm);
 
-       std::string filename_base = g_settings->get("screenshot_path")
+       std::string screenshot_dir;
+
+       if (fs::IsPathAbsolute(g_settings->get("screenshot_path")))
+               screenshot_dir = g_settings->get("screenshot_path");
+       else
+               screenshot_dir = porting::path_user + DIR_DELIM + g_settings->get("screenshot_path");
+
+       std::string filename_base = screenshot_dir
                        + DIR_DELIM
                        + std::string("screenshot_")
                        + std::string(timetstamp_c);
        std::string filename_ext = "." + g_settings->get("screenshot_format");
        std::string filename;
 
+       // Create the directory if it doesn't already exist.
+       // Otherwise, saving the screenshot would fail.
+       fs::CreateDir(screenshot_dir);
+
        u32 quality = (u32)g_settings->getS32("screenshot_quality");
        quality = MYMIN(MYMAX(quality, 0), 100) / 100.0 * 255;
 
@@ -1860,7 +1904,7 @@ ITextureSource* Client::getTextureSource()
 {
        return m_tsrc;
 }
-IShaderSource* Client::getShaderSource()
+IWritableShaderSource* Client::getShaderSource()
 {
        return m_shsrc;
 }