X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fenvironment.cpp;h=66898f012f3573fe032201b8fcf53ba8d08bb29b;hb=56195dc2e45b85b7177cfa97aade77e92cff8805;hp=d068aa788a43100ae433ae69e8b59a13336ccac4;hpb=e491f8cd485f5602c056b8b6c5e0c8c395e4a633;p=oweals%2Fminetest.git diff --git a/src/environment.cpp b/src/environment.cpp index d068aa788..66898f012 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -455,13 +455,14 @@ Player *ServerEnvironment::loadPlayer(const std::string &playername) RemotePlayer testplayer(m_gamedef); std::string path = players_path + playername; - for (u32 i = 0; i < 1000; i++) { + for (u32 i = 0; i < PLAYER_FILE_ALTERNATE_TRIES; i++) { // Open file and deserialize std::ifstream is(path.c_str(), std::ios_base::binary); if (!is.good()) { return NULL; } testplayer.deSerialize(is, path); + is.close(); if (testplayer.getName() == playername) { *player = testplayer; found = true; @@ -507,38 +508,29 @@ void ServerEnvironment::loadMeta() // Open file and deserialize std::ifstream is(path.c_str(), std::ios_base::binary); - if(is.good() == false) - { - infostream<<"ServerEnvironment::loadMeta(): Failed to open " - <ndef(); MapNode n_old = m_map->getNodeNoEx(p); + // Call destructor - if(ndef->get(n_old).has_on_destruct) + if (ndef->get(n_old).has_on_destruct) m_script->node_on_destruct(p, n_old); + // Replace node - bool succeeded = m_map->addNodeWithEvent(p, n); - if(!succeeded) + if (!m_map->addNodeWithEvent(p, n)) return false; + + // Update active VoxelManipulator if a mapgen thread + m_map->updateVManip(p); + // Call post-destructor - if(ndef->get(n_old).has_after_destruct) + if (ndef->get(n_old).has_after_destruct) m_script->node_after_destruct(p, n_old); + // Call constructor - if(ndef->get(n).has_on_construct) + if (ndef->get(n).has_on_construct) m_script->node_on_construct(p, n); + return true; } @@ -797,24 +796,36 @@ bool ServerEnvironment::removeNode(v3s16 p) { INodeDefManager *ndef = m_gamedef->ndef(); MapNode n_old = m_map->getNodeNoEx(p); + // Call destructor - if(ndef->get(n_old).has_on_destruct) + if (ndef->get(n_old).has_on_destruct) m_script->node_on_destruct(p, n_old); + // Replace with air // This is slightly optimized compared to addNodeWithEvent(air) - bool succeeded = m_map->removeNodeWithEvent(p); - if(!succeeded) + if (!m_map->removeNodeWithEvent(p)) return false; + + // Update active VoxelManipulator if a mapgen thread + m_map->updateVManip(p); + // Call post-destructor - if(ndef->get(n_old).has_after_destruct) + if (ndef->get(n_old).has_after_destruct) m_script->node_after_destruct(p, n_old); + // Air doesn't require constructor return true; } bool ServerEnvironment::swapNode(v3s16 p, const MapNode &n) { - return m_map->addNodeWithEvent(p, n, false); + if (!m_map->addNodeWithEvent(p, n, false)) + return false; + + // Update active VoxelManipulator if a mapgen thread + m_map->updateVManip(p); + + return true; } std::set ServerEnvironment::getObjectsInsideRadius(v3f pos, float radius)