Skip to content

Commit 338195f

Browse files
authoredApr 19, 2020
Fix alias handling of get_content_id (#9712)
fixes #9632
1 parent cdbe3c5 commit 338195f

File tree

2 files changed

+25
-22
lines changed

2 files changed

+25
-22
lines changed
 

‎src/itemdef.cpp

+13-21
Original file line numberDiff line numberDiff line change
@@ -270,17 +270,16 @@ class CItemDefManager: public IWritableItemDefManager
270270
// Convert name according to possible alias
271271
std::string name = getAlias(name_);
272272
// Get the definition
273-
std::map<std::string, ItemDefinition*>::const_iterator i;
274-
i = m_item_definitions.find(name);
275-
if(i == m_item_definitions.end())
273+
auto i = m_item_definitions.find(name);
274+
if (i == m_item_definitions.cend())
276275
i = m_item_definitions.find("unknown");
277-
assert(i != m_item_definitions.end());
276+
assert(i != m_item_definitions.cend());
278277
return *(i->second);
279278
}
280279
virtual const std::string &getAlias(const std::string &name) const
281280
{
282-
StringMap::const_iterator it = m_aliases.find(name);
283-
if (it != m_aliases.end())
281+
auto it = m_aliases.find(name);
282+
if (it != m_aliases.cend())
284283
return it->second;
285284
return name;
286285
}
@@ -300,8 +299,7 @@ class CItemDefManager: public IWritableItemDefManager
300299
// Convert name according to possible alias
301300
std::string name = getAlias(name_);
302301
// Get the definition
303-
std::map<std::string, ItemDefinition*>::const_iterator i;
304-
return m_item_definitions.find(name) != m_item_definitions.end();
302+
return m_item_definitions.find(name) != m_item_definitions.cend();
305303
}
306304
#ifndef SERVER
307305
public:
@@ -443,11 +441,9 @@ class CItemDefManager: public IWritableItemDefManager
443441
}
444442
void clear()
445443
{
446-
for(std::map<std::string, ItemDefinition*>::const_iterator
447-
i = m_item_definitions.begin();
448-
i != m_item_definitions.end(); ++i)
444+
for (auto &i : m_item_definitions)
449445
{
450-
delete i->second;
446+
delete i.second;
451447
}
452448
m_item_definitions.clear();
453449
m_aliases.clear();
@@ -520,10 +516,8 @@ class CItemDefManager: public IWritableItemDefManager
520516
u16 count = m_item_definitions.size();
521517
writeU16(os, count);
522518

523-
for (std::map<std::string, ItemDefinition *>::const_iterator
524-
it = m_item_definitions.begin();
525-
it != m_item_definitions.end(); ++it) {
526-
ItemDefinition *def = it->second;
519+
for (const auto &it : m_item_definitions) {
520+
ItemDefinition *def = it.second;
527521
// Serialize ItemDefinition and write wrapped in a string
528522
std::ostringstream tmp_os(std::ios::binary);
529523
def->serialize(tmp_os, protocol_version);
@@ -532,11 +526,9 @@ class CItemDefManager: public IWritableItemDefManager
532526

533527
writeU16(os, m_aliases.size());
534528

535-
for (StringMap::const_iterator
536-
it = m_aliases.begin();
537-
it != m_aliases.end(); ++it) {
538-
os << serializeString(it->first);
539-
os << serializeString(it->second);
529+
for (const auto &it : m_aliases) {
530+
os << serializeString(it.first);
531+
os << serializeString(it.second);
540532
}
541533
}
542534
void deSerialize(std::istream &is)

‎src/script/lua_api/l_item.cpp

+12-1
Original file line numberDiff line numberDiff line change
@@ -609,10 +609,21 @@ int ModApiItemMod::l_get_content_id(lua_State *L)
609609
NO_MAP_LOCK_REQUIRED;
610610
std::string name = luaL_checkstring(L, 1);
611611

612+
const IItemDefManager *idef = getGameDef(L)->getItemDefManager();
612613
const NodeDefManager *ndef = getGameDef(L)->getNodeDefManager();
614+
615+
// If this is called at mod load time, NodeDefManager isn't aware of
616+
// aliases yet, so we need to handle them manually
617+
std::string alias_name = idef->getAlias(name);
618+
613619
content_t content_id;
614-
if (!ndef->getId(name, content_id))
620+
if (alias_name != name) {
621+
if (!ndef->getId(alias_name, content_id))
622+
throw LuaError("Unknown node: " + alias_name +
623+
" (from alias " + name + ")");
624+
} else if (!ndef->getId(name, content_id)) {
615625
throw LuaError("Unknown node: " + name);
626+
}
616627

617628
lua_pushinteger(L, content_id);
618629
return 1; /* number of results */

0 commit comments

Comments
 (0)
Please sign in to comment.