nri->nodenames.push_back(name);
}
- nri->nodename_sizes.push_back(nidmapcount);
+ nri->nodelistinfo.push_back(NodeListInfo(nidmapcount, CONTENT_AIR));
ndef->pendNodeResolve(nri);
size_t nodecount = size.X * size.Y * size.Z;
{
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)) {
+ std::string name = nri->nodenames.front();
+ nri->nodenames.pop_front();
+
+ if (getId(name, c)) {
result.push_back(c);
- } else {
- errorstream << "CNodeDefManager::getIdsFromResolveInfo: empty "
- "nodenames list" << std::endl;
+ } else if (listinfo.all_required) {
+ errorstream << "Resolver: Failed to resolve node name '" << name
+ << "'." << std::endl;
+ result.push_back(listinfo.c_fallback);
+ success = false;
}
-
- nri->nodenames.pop_front();
}
- return true;
+ return success;
}
class NodeResolver;
class INodeDefManager;
+struct NodeListInfo {
+ NodeListInfo(u32 len)
+ {
+ length = len;
+ all_required = false;
+ c_fallback = CONTENT_IGNORE;
+ }
+
+ NodeListInfo(u32 len, content_t fallback)
+ {
+ length = len;
+ all_required = true;
+ c_fallback = fallback;
+ }
+
+ u32 length;
+ bool all_required;
+ content_t c_fallback;
+};
+
struct NodeResolveInfo {
NodeResolveInfo(NodeResolver *nr)
{
}
std::list<std::string> nodenames;
- std::list<size_t> nodename_sizes;
+ std::list<NodeListInfo> nodelistinfo;
NodeResolver *resolver;
};
//// Get node name(s) to place decoration on
std::vector<const char *> place_on_names;
getstringlistfield(L, index, "place_on", place_on_names);
- nri->nodename_sizes.push_back(place_on_names.size());
+ nri->nodelistinfo.push_back(NodeListInfo(place_on_names.size()));
for (size_t i = 0; i != place_on_names.size(); i++)
nri->nodenames.push_back(place_on_names[i]);
"defined" << std::endl;
return false;
}
- nri->nodename_sizes.push_back(deco_names.size());
+ nri->nodelistinfo.push_back(NodeListInfo(deco_names.size()));
for (size_t i = 0; i != deco_names.size(); i++)
nri->nodenames.push_back(deco_names[i]);
" but num_spawn_by specified" << std::endl;
return false;
}
- nri->nodename_sizes.push_back(spawnby_names.size());
+ nri->nodelistinfo.push_back(NodeListInfo(spawnby_names.size()));
for (size_t i = 0; i != spawnby_names.size(); i++)
nri->nodenames.push_back(spawnby_names[i]);
std::vector<const char *> wherein_names;
getstringlistfield(L, index, "wherein", wherein_names);
- nri->nodename_sizes.push_back(wherein_names.size());
+ nri->nodelistinfo.push_back(NodeListInfo(wherein_names.size()));
for (size_t i = 0; i != wherein_names.size(); i++)
nri->nodenames.push_back(wherein_names[i]);