From 4b00d4d9d2158fc65da39179448c03390f094987 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 3 Dec 2011 23:50:31 +0200 Subject: Node definition aliases --- src/nodedef.cpp | 35 ++++++++++++++++++++++++++++++++++- src/nodedef.h | 5 +++++ src/scriptapi.cpp | 19 +++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 9f2d4f0af..e2e5616f1 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -398,8 +398,18 @@ public: { return get(n.getContent()); } - virtual bool getId(const std::string &name, content_t &result) const + virtual bool getId(const std::string &name_, content_t &result) const { + std::string name = name_; + // Convert name according to possible alias + std::map::const_iterator i; + i = m_aliases.find(name); + if(i != m_aliases.end()){ + /*infostream<<"ndef: alias active: "< "<second + <second; + } + // Get id return m_name_id_mapping.getId(name, result); } virtual content_t getId(const std::string &name) const @@ -438,6 +448,12 @@ public: m_content_features[c] = def; if(def.name != "") m_name_id_mapping.set(c, def.name); + + // Remove conflicting alias if it exists + bool alias_removed = (m_aliases.erase(def.name) != 0); + if(alias_removed) + infostream<<"ndef: erased alias "< "< "< m_aliases; }; IWritableNodeDefManager* createNodeDefManager() diff --git a/src/nodedef.h b/src/nodedef.h index e0b5c864c..f69b66c9f 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -279,6 +279,11 @@ public: const ContentFeatures &def)=0; // If returns CONTENT_IGNORE, could not allocate id virtual content_t allocateDummy(const std::string &name)=0; + // Set an alias so that nodes named will load as . + // Alias is not set if has already been defined. + // Alias will be removed if is defined at a later point of time. + virtual void setAlias(const std::string &name, + const std::string &convert_to)=0; /* Update tile textures to latest return values of TextueSource. diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index 624ca5d85..c5574dd8e 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -1122,6 +1122,24 @@ static int l_register_node(lua_State *L) return 0; /* number of results */ } +// alias_node(name, convert_to_name) +static int l_alias_node(lua_State *L) +{ + std::string name = luaL_checkstring(L, 1); + std::string convert_to = luaL_checkstring(L, 2); + + // Get server from registry + lua_getfield(L, LUA_REGISTRYINDEX, "minetest_server"); + Server *server = (Server*)lua_touserdata(L, -1); + // And get the writable node definition manager from the server + IWritableNodeDefManager *nodedef = + server->getWritableNodeDefManager(); + + nodedef->setAlias(name, convert_to); + + return 0; /* number of results */ +} + // register_craft({output=item, recipe={{item00,item10},{item01,item11}}) static int l_register_craft(lua_State *L) { @@ -1274,6 +1292,7 @@ static const struct luaL_Reg minetest_f [] = { {"register_node", l_register_node}, {"register_craft", l_register_craft}, {"register_abm", l_register_abm}, + {"alias_node", l_alias_node}, {"setting_get", l_setting_get}, {"setting_getbool", l_setting_getbool}, {"chat_send_all", l_chat_send_all}, -- cgit v1.2.3