liquid_alternative_source = "";
liquid_viscosity = 0;
liquid_renewable = true;
- freezemelt = "";
liquid_range = LIQUID_LEVEL_MAX+1;
drowning = 0;
light_source = 0;
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();
// 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;
};
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);
}
+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);
+ }
}
{
if (nri->nodenames.empty()) {
result = c_fallback;
- errorstream << "CNodeDefManager::getIdFromResolveInfo: empty "
- "nodenames list" << std::endl;
+ errorstream << "Resolver empty nodename list" << std::endl;
return false;
}
}
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;
}
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;
}