From 829c632511a99ceed423e72d1ff7b7644f121be1 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sun, 4 Dec 2011 00:39:20 +0200 Subject: Craftitem aliases --- src/craftitemdef.cpp | 47 ++++++++++++++++++++++++++++++++++++++++------- src/craftitemdef.h | 5 +++++ src/scriptapi.cpp | 19 +++++++++++++++++++ 3 files changed, 64 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/craftitemdef.cpp b/src/craftitemdef.cpp index b8f9d1d79..622c5c65f 100644 --- a/src/craftitemdef.cpp +++ b/src/craftitemdef.cpp @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "log.h" #include #include "utility.h" +#include CraftItemDefinition::CraftItemDefinition(): imagename(""), @@ -102,14 +103,14 @@ public: virtual bool registerCraftItem(std::string itemname, const CraftItemDefinition &def) { infostream<<"registerCraftItem: registering CraftItem \""<::Node *n; - n = m_item_definitions.find(itemname); - if(n != NULL){ - errorstream<<"registerCraftItem: registering item \""<getValue(); } m_item_definitions.clear(); + m_aliases.clear(); + } + virtual void setAlias(const std::string &name, + const std::string &convert_to) + { + if(getCraftItemDefinition(name) != NULL){ + infostream<<"nidef: not setting alias "< "< "<serialize(tmp_os); os<::const_iterator + i = m_aliases.begin(); i != m_aliases.end(); i++) + { + os<first); + os<second); + } } virtual void deSerialize(std::istream &is) { @@ -158,10 +180,21 @@ public: // Register registerCraftItem(name, def); } + + u16 num_aliases = readU16(is); + if(!is.eof()){ + for(u16 i=0; i m_item_definitions; + // Aliases + std::map m_aliases; }; IWritableCraftItemDefManager* createCraftItemDefManager() diff --git a/src/craftitemdef.h b/src/craftitemdef.h index 2f1a5bf83..ee3d97aec 100644 --- a/src/craftitemdef.h +++ b/src/craftitemdef.h @@ -63,6 +63,11 @@ public: virtual bool registerCraftItem(std::string itemname, const CraftItemDefinition &def)=0; virtual void clear()=0; + // Set an alias so that entries 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; virtual void serialize(std::ostream &os)=0; virtual void deSerialize(std::istream &is)=0; diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index ab9f89212..d7382b98b 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -1158,6 +1158,24 @@ static int l_alias_tool(lua_State *L) return 0; /* number of results */ } +// alias_craftitem(name, convert_to_name) +static int l_alias_craftitem(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 CraftItem definition manager from the server + IWritableCraftItemDefManager *craftitemdef = + server->getWritableCraftItemDefManager(); + + craftitemdef->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) { @@ -1312,6 +1330,7 @@ static const struct luaL_Reg minetest_f [] = { {"register_abm", l_register_abm}, {"alias_node", l_alias_node}, {"alias_tool", l_alias_tool}, + {"alias_craftitem", l_alias_craftitem}, {"setting_get", l_setting_get}, {"setting_getbool", l_setting_getbool}, {"chat_send_all", l_chat_send_all}, -- cgit v1.2.3