Skip to content

Commit 08d259c

Browse files
committedDec 28, 2014
Set fallback content if resolving content vector requires everything
1 parent b67f37f commit 08d259c

File tree

4 files changed

+47
-24
lines changed

4 files changed

+47
-24
lines changed
 

‎src/mg_schematic.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ bool Schematic::loadSchematicFromFile(const char *filename,
248248
nri->nodenames.push_back(name);
249249
}
250250

251-
nri->nodename_sizes.push_back(nidmapcount);
251+
nri->nodelistinfo.push_back(NodeListInfo(nidmapcount, CONTENT_AIR));
252252
ndef->pendNodeResolve(nri);
253253

254254
size_t nodecount = size.X * size.Y * size.Z;

‎src/nodedef.cpp

+21-18
Original file line numberDiff line numberDiff line change
@@ -1308,8 +1308,7 @@ bool CNodeDefManager::getIdFromResolveInfo(NodeResolveInfo *nri,
13081308
{
13091309
if (nri->nodenames.empty()) {
13101310
result = c_fallback;
1311-
errorstream << "CNodeDefManager::getIdFromResolveInfo: empty "
1312-
"nodenames list" << std::endl;
1311+
errorstream << "Resolver empty nodename list" << std::endl;
13131312
return false;
13141313
}
13151314

@@ -1324,8 +1323,8 @@ bool CNodeDefManager::getIdFromResolveInfo(NodeResolveInfo *nri,
13241323
}
13251324

13261325
if (!success) {
1327-
errorstream << "CNodeDefManager::getIdFromResolveInfo: Failed to "
1328-
"resolve node name '" << name << "'." << std::endl;
1326+
errorstream << "Resolver: Failed to resolve node name '" << name
1327+
<< "'." << std::endl;
13291328
c = c_fallback;
13301329
}
13311330

@@ -1337,31 +1336,35 @@ bool CNodeDefManager::getIdFromResolveInfo(NodeResolveInfo *nri,
13371336
bool CNodeDefManager::getIdsFromResolveInfo(NodeResolveInfo *nri,
13381337
std::vector<content_t> &result)
13391338
{
1340-
if (nri->nodename_sizes.empty()) {
1341-
errorstream << "CNodeDefManager::getIdsFromResolveInfo: empty "
1342-
"nodename_sizes list" << std::endl;
1339+
bool success = true;
1340+
1341+
if (nri->nodelistinfo.empty()) {
1342+
errorstream << "Resolver: Empty nodelistinfo list" << std::endl;
13431343
return false;
13441344
}
13451345

1346-
size_t nitems = nri->nodename_sizes.front();
1347-
nri->nodename_sizes.pop_front();
1346+
NodeListInfo listinfo = nri->nodelistinfo.front();
1347+
nri->nodelistinfo.pop_front();
13481348

1349-
while (nitems--) {
1349+
while (listinfo.length--) {
13501350
if (nri->nodenames.empty()) {
1351-
errorstream << "" << std::endl;
1351+
errorstream << "Resolver: Empty nodename list" << std::endl;
13521352
return false;
13531353
}
13541354

13551355
content_t c;
1356-
if (getId(nri->nodenames.front(), c)) {
1356+
std::string name = nri->nodenames.front();
1357+
nri->nodenames.pop_front();
1358+
1359+
if (getId(name, c)) {
13571360
result.push_back(c);
1358-
} else {
1359-
errorstream << "CNodeDefManager::getIdsFromResolveInfo: empty "
1360-
"nodenames list" << std::endl;
1361+
} else if (listinfo.all_required) {
1362+
errorstream << "Resolver: Failed to resolve node name '" << name
1363+
<< "'." << std::endl;
1364+
result.push_back(listinfo.c_fallback);
1365+
success = false;
13611366
}
1362-
1363-
nri->nodenames.pop_front();
13641367
}
13651368

1366-
return true;
1369+
return success;
13671370
}

‎src/nodedef.h

+21-1
Original file line numberDiff line numberDiff line change
@@ -285,14 +285,34 @@ struct ContentFeatures
285285
class NodeResolver;
286286
class INodeDefManager;
287287

288+
struct NodeListInfo {
289+
NodeListInfo(u32 len)
290+
{
291+
length = len;
292+
all_required = false;
293+
c_fallback = CONTENT_IGNORE;
294+
}
295+
296+
NodeListInfo(u32 len, content_t fallback)
297+
{
298+
length = len;
299+
all_required = true;
300+
c_fallback = fallback;
301+
}
302+
303+
u32 length;
304+
bool all_required;
305+
content_t c_fallback;
306+
};
307+
288308
struct NodeResolveInfo {
289309
NodeResolveInfo(NodeResolver *nr)
290310
{
291311
resolver = nr;
292312
}
293313

294314
std::list<std::string> nodenames;
295-
std::list<size_t> nodename_sizes;
315+
std::list<NodeListInfo> nodelistinfo;
296316
NodeResolver *resolver;
297317
};
298318

‎src/script/lua_api/l_mapgen.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ int ModApiMapgen::l_register_decoration(lua_State *L)
508508
//// Get node name(s) to place decoration on
509509
std::vector<const char *> place_on_names;
510510
getstringlistfield(L, index, "place_on", place_on_names);
511-
nri->nodename_sizes.push_back(place_on_names.size());
511+
nri->nodelistinfo.push_back(NodeListInfo(place_on_names.size()));
512512
for (size_t i = 0; i != place_on_names.size(); i++)
513513
nri->nodenames.push_back(place_on_names[i]);
514514

@@ -585,7 +585,7 @@ bool ModApiMapgen::regDecoSimple(lua_State *L,
585585
"defined" << std::endl;
586586
return false;
587587
}
588-
nri->nodename_sizes.push_back(deco_names.size());
588+
nri->nodelistinfo.push_back(NodeListInfo(deco_names.size()));
589589
for (size_t i = 0; i != deco_names.size(); i++)
590590
nri->nodenames.push_back(deco_names[i]);
591591

@@ -596,7 +596,7 @@ bool ModApiMapgen::regDecoSimple(lua_State *L,
596596
" but num_spawn_by specified" << std::endl;
597597
return false;
598598
}
599-
nri->nodename_sizes.push_back(spawnby_names.size());
599+
nri->nodelistinfo.push_back(NodeListInfo(spawnby_names.size()));
600600
for (size_t i = 0; i != spawnby_names.size(); i++)
601601
nri->nodenames.push_back(spawnby_names[i]);
602602

@@ -691,7 +691,7 @@ int ModApiMapgen::l_register_ore(lua_State *L)
691691

692692
std::vector<const char *> wherein_names;
693693
getstringlistfield(L, index, "wherein", wherein_names);
694-
nri->nodename_sizes.push_back(wherein_names.size());
694+
nri->nodelistinfo.push_back(NodeListInfo(wherein_names.size()));
695695
for (size_t i = 0; i != wherein_names.size(); i++)
696696
nri->nodenames.push_back(wherein_names[i]);
697697

0 commit comments

Comments
 (0)
Please sign in to comment.