Fix unit test if there isn't a localhost address (for example FreeBSD jails), second...
[oweals/minetest.git] / src / nodedef.cpp
index bf97ff6d89b6ef0d24eddf21fc22b9957eb13a0c..bcf51a072e1429e9f75d8c93b6e1e1786564fa6b 100644 (file)
@@ -227,7 +227,6 @@ void ContentFeatures::reset()
        liquid_alternative_source = "";
        liquid_viscosity = 0;
        liquid_renewable = true;
-       freezemelt = "";
        liquid_range = LIQUID_LEVEL_MAX+1;
        drowning = 0;
        light_source = 0;
@@ -403,6 +402,9 @@ public:
        void serialize(std::ostream &os, u16 protocol_version);
        void deSerialize(std::istream &is);
 
+       inline virtual bool getNodeRegistrationStatus() const;
+       inline virtual void setNodeRegistrationStatus(bool completed);
+
        virtual void pendNodeResolve(NodeResolveInfo *nri);
        virtual void cancelNodeResolve(NodeResolver *resolver);
        virtual void runNodeResolverCallbacks();
@@ -442,6 +444,9 @@ private:
 
        // List of node strings and node resolver callbacks to perform
        std::list<NodeResolveInfo *> m_pending_node_lookups;
+
+       // True when all nodes have been registered
+       bool m_node_registration_complete;
 };
 
 
@@ -473,6 +478,14 @@ void CNodeDefManager::clear()
        m_group_to_items.clear();
        m_next_id = 0;
 
+       m_node_registration_complete = false;
+       for (std::list<NodeResolveInfo *>::iterator
+                       it = m_pending_node_lookups.begin();
+                       it != m_pending_node_lookups.end();
+                       ++it)
+               delete *it;
+       m_pending_node_lookups.clear();
+
        u32 initial_length = 0;
        initial_length = MYMAX(initial_length, CONTENT_UNKNOWN + 1);
        initial_length = MYMAX(initial_length, CONTENT_AIR + 1);
@@ -1269,10 +1282,28 @@ void ContentFeatures::deSerializeOld(std::istream &is, int version)
 }
 
 
+inline bool CNodeDefManager::getNodeRegistrationStatus() const
+{
+       return m_node_registration_complete;
+}
+
+
+inline void CNodeDefManager::setNodeRegistrationStatus(bool completed)
+{
+       m_node_registration_complete = completed;
+}
+
+
 void CNodeDefManager::pendNodeResolve(NodeResolveInfo *nri)
 {
        nri->resolver->m_ndef = this;
-       m_pending_node_lookups.push_back(nri);
+       if (m_node_registration_complete) {
+               nri->resolver->resolveNodeNames(nri);
+               nri->resolver->m_lookup_done = true;
+               delete nri;
+       } else {
+               m_pending_node_lookups.push_back(nri);
+       }
 }
 
 
@@ -1308,8 +1339,7 @@ bool CNodeDefManager::getIdFromResolveInfo(NodeResolveInfo *nri,
 {
        if (nri->nodenames.empty()) {
                result = c_fallback;
-               errorstream << "CNodeDefManager::getIdFromResolveInfo: empty "
-                       "nodenames list" << std::endl;
+               errorstream << "Resolver empty nodename list" << std::endl;
                return false;
        }
 
@@ -1324,8 +1354,8 @@ bool CNodeDefManager::getIdFromResolveInfo(NodeResolveInfo *nri,
        }
 
        if (!success) {
-               errorstream << "CNodeDefManager::getIdFromResolveInfo: Failed to "
-                       "resolve node name '" << name << "'." << std::endl;
+               errorstream << "Resolver: Failed to resolve node name '" << name
+                       << "'." << std::endl;
                c = c_fallback;
        }
 
@@ -1337,31 +1367,43 @@ bool CNodeDefManager::getIdFromResolveInfo(NodeResolveInfo *nri,
 bool CNodeDefManager::getIdsFromResolveInfo(NodeResolveInfo *nri,
        std::vector<content_t> &result)
 {
-       if (nri->nodename_sizes.empty()) {
-               errorstream << "CNodeDefManager::getIdsFromResolveInfo: empty "
-                       "nodename_sizes list" << std::endl;
+       bool success = true;
+
+       if (nri->nodelistinfo.empty()) {
+               errorstream << "Resolver: Empty nodelistinfo list" << std::endl;
                return false;
        }
 
-       size_t nitems = nri->nodename_sizes.front();
-       nri->nodename_sizes.pop_front();
+       NodeListInfo listinfo = nri->nodelistinfo.front();
+       nri->nodelistinfo.pop_front();
 
-       while (nitems--) {
+       while (listinfo.length--) {
                if (nri->nodenames.empty()) {
-                       errorstream << "" << std::endl;
+                       errorstream << "Resolver: Empty nodename list" << std::endl;
                        return false;
                }
 
                content_t c;
-               if (getId(nri->nodenames.front(), c)) {
-                       result.push_back(c);
+               std::string name = nri->nodenames.front();
+               nri->nodenames.pop_front();
+
+               if (name.substr(0,6) != "group:") {
+                       if (getId(name, c)) {
+                               result.push_back(c);
+                       } else if (listinfo.all_required) {
+                               errorstream << "Resolver: Failed to resolve node name '" << name
+                                       << "'." << std::endl;
+                               result.push_back(listinfo.c_fallback);
+                               success = false;
+                       }
                } else {
-                       errorstream << "CNodeDefManager::getIdsFromResolveInfo: empty "
-                               "nodenames list" << std::endl;
+                       std::set<content_t> cids;
+                       std::set<content_t>::iterator it;
+                       getIds(name, cids);
+                       for (it = cids.begin(); it != cids.end(); ++it)
+                               result.push_back(*it);
                }
-
-               nri->nodenames.pop_front();
        }
 
-       return true;
+       return success;
 }