Fix alias handling of get_content_id (#9712)
authorsfan5 <sfan5@live.de>
Sun, 19 Apr 2020 17:07:54 +0000 (19:07 +0200)
committerGitHub <noreply@github.com>
Sun, 19 Apr 2020 17:07:54 +0000 (19:07 +0200)
fixes #9632

src/itemdef.cpp
src/script/lua_api/l_item.cpp

index a13b3f7d4bd77b06088f6af8642108a59bcadac1..8e049282739000b2763f4ec5f3609eaaf6f918c1 100644 (file)
@@ -270,17 +270,16 @@ public:
                // Convert name according to possible alias
                std::string name = getAlias(name_);
                // Get the definition
-               std::map<std::string, ItemDefinition*>::const_iterator i;
-               i = m_item_definitions.find(name);
-               if(i == m_item_definitions.end())
+               auto i = m_item_definitions.find(name);
+               if (i == m_item_definitions.cend())
                        i = m_item_definitions.find("unknown");
-               assert(i != m_item_definitions.end());
+               assert(i != m_item_definitions.cend());
                return *(i->second);
        }
        virtual const std::string &getAlias(const std::string &name) const
        {
-               StringMap::const_iterator it = m_aliases.find(name);
-               if (it != m_aliases.end())
+               auto it = m_aliases.find(name);
+               if (it != m_aliases.cend())
                        return it->second;
                return name;
        }
@@ -300,8 +299,7 @@ public:
                // Convert name according to possible alias
                std::string name = getAlias(name_);
                // Get the definition
-               std::map<std::string, ItemDefinition*>::const_iterator i;
-               return m_item_definitions.find(name) != m_item_definitions.end();
+               return m_item_definitions.find(name) != m_item_definitions.cend();
        }
 #ifndef SERVER
 public:
@@ -443,11 +441,9 @@ public:
        }
        void clear()
        {
-               for(std::map<std::string, ItemDefinition*>::const_iterator
-                               i = m_item_definitions.begin();
-                               i != m_item_definitions.end(); ++i)
+               for (auto &i : m_item_definitions)
                {
-                       delete i->second;
+                       delete i.second;
                }
                m_item_definitions.clear();
                m_aliases.clear();
@@ -520,10 +516,8 @@ public:
                u16 count = m_item_definitions.size();
                writeU16(os, count);
 
-               for (std::map<std::string, ItemDefinition *>::const_iterator
-                               it = m_item_definitions.begin();
-                               it != m_item_definitions.end(); ++it) {
-                       ItemDefinition *def = it->second;
+               for (const auto &it : m_item_definitions) {
+                       ItemDefinition *def = it.second;
                        // Serialize ItemDefinition and write wrapped in a string
                        std::ostringstream tmp_os(std::ios::binary);
                        def->serialize(tmp_os, protocol_version);
@@ -532,11 +526,9 @@ public:
 
                writeU16(os, m_aliases.size());
 
-               for (StringMap::const_iterator
-                               it = m_aliases.begin();
-                               it != m_aliases.end(); ++it) {
-                       os << serializeString(it->first);
-                       os << serializeString(it->second);
+               for (const auto &it : m_aliases) {
+                       os << serializeString(it.first);
+                       os << serializeString(it.second);
                }
        }
        void deSerialize(std::istream &is)
index 9f12d3ac79a84baedf34b355b486f559d6d170f3..0a403acbd7b8ceb625c750e0193162c1ad170167 100644 (file)
@@ -609,10 +609,21 @@ int ModApiItemMod::l_get_content_id(lua_State *L)
        NO_MAP_LOCK_REQUIRED;
        std::string name = luaL_checkstring(L, 1);
 
+       const IItemDefManager *idef = getGameDef(L)->getItemDefManager();
        const NodeDefManager *ndef = getGameDef(L)->getNodeDefManager();
+
+       // If this is called at mod load time, NodeDefManager isn't aware of
+       // aliases yet, so we need to handle them manually
+       std::string alias_name = idef->getAlias(name);
+
        content_t content_id;
-       if (!ndef->getId(name, content_id))
+       if (alias_name != name) {
+               if (!ndef->getId(alias_name, content_id))
+                       throw LuaError("Unknown node: " + alias_name +
+                                       " (from alias " + name + ")");
+       } else if (!ndef->getId(name, content_id)) {
                throw LuaError("Unknown node: " + name);
+       }
 
        lua_pushinteger(L, content_id);
        return 1; /* number of results */