diff options
author | Perttu Ahola <celeron55@gmail.com> | 2011-12-04 00:22:34 +0200 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2011-12-04 00:22:34 +0200 |
commit | 8addbc9655f60e0a2673e8df83ebb0d78e2a6aec (patch) | |
tree | e799829cde69f67e8f6371a105949faeac982eb8 /src | |
parent | 658d1a72351e178282f2a09f30f05050ac89e862 (diff) | |
download | minetest-8addbc9655f60e0a2673e8df83ebb0d78e2a6aec.tar.gz minetest-8addbc9655f60e0a2673e8df83ebb0d78e2a6aec.tar.bz2 minetest-8addbc9655f60e0a2673e8df83ebb0d78e2a6aec.zip |
Tool aliases
Diffstat (limited to 'src')
-rw-r--r-- | src/scriptapi.cpp | 19 | ||||
-rw-r--r-- | src/tooldef.cpp | 57 | ||||
-rw-r--r-- | src/tooldef.h | 5 |
3 files changed, 73 insertions, 8 deletions
diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp index c5574dd8e..ab9f89212 100644 --- a/src/scriptapi.cpp +++ b/src/scriptapi.cpp @@ -1140,6 +1140,24 @@ static int l_alias_node(lua_State *L) return 0; /* number of results */ } +// alias_tool(name, convert_to_name) +static int l_alias_tool(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 tool definition manager from the server + IWritableToolDefManager *tooldef = + server->getWritableToolDefManager(); + + tooldef->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) { @@ -1293,6 +1311,7 @@ static const struct luaL_Reg minetest_f [] = { {"register_craft", l_register_craft}, {"register_abm", l_register_abm}, {"alias_node", l_alias_node}, + {"alias_tool", l_alias_tool}, {"setting_get", l_setting_get}, {"setting_getbool", l_setting_getbool}, {"chat_send_all", l_chat_send_all}, diff --git a/src/tooldef.cpp b/src/tooldef.cpp index 45193f46b..6733dfff0 100644 --- a/src/tooldef.cpp +++ b/src/tooldef.cpp @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "log.h" #include <sstream> #include "utility.h" +#include <map> ToolDiggingProperties::ToolDiggingProperties(float full_punch_interval_, float a, float b, float c, float d, float e, @@ -92,8 +93,16 @@ public: { clear(); } - virtual const ToolDefinition* getToolDefinition(const std::string &toolname) const + virtual const ToolDefinition* getToolDefinition(const std::string &toolname_) const { + // Convert name according to possible alias + std::string toolname = toolname_; + std::map<std::string, std::string>::const_iterator i; + i = m_aliases.find(toolname); + if(i != m_aliases.end()){ + toolname = i->second; + } + // Get the definition core::map<std::string, ToolDefinition*>::Node *n; n = m_tool_definitions.find(toolname); if(n == NULL) @@ -124,14 +133,14 @@ public: virtual bool registerTool(std::string toolname, const ToolDefinition &def) { infostream<<"registerTool: registering tool \""<<toolname<<"\""<<std::endl; - /*core::map<std::string, ToolDefinition*>::Node *n; - n = m_tool_definitions.find(toolname); - if(n != NULL){ - errorstream<<"registerTool: registering tool \""<<toolname - <<"\" failed: name is already registered"<<std::endl; - return false; - }*/ m_tool_definitions[toolname] = new ToolDefinition(def); + + // Remove conflicting alias if it exists + bool alias_removed = (m_aliases.erase(toolname) != 0); + if(alias_removed) + infostream<<"tdef: erased alias "<<toolname + <<" because node was defined"<<std::endl; + return true; } virtual void clear() @@ -142,6 +151,19 @@ public: delete i.getNode()->getValue(); } m_tool_definitions.clear(); + m_aliases.clear(); + } + virtual void setAlias(const std::string &name, + const std::string &convert_to) + { + if(getToolDefinition(name) != NULL){ + infostream<<"tdef: not setting alias "<<name<<" -> "<<convert_to + <<": "<<name<<" is already defined"<<std::endl; + return; + } + infostream<<"tdef: setting alias "<<name<<" -> "<<convert_to + <<std::endl; + m_aliases[name] = convert_to; } virtual void serialize(std::ostream &os) { @@ -160,6 +182,14 @@ public: def->serialize(tmp_os); os<<serializeString(tmp_os.str()); } + + writeU16(os, m_aliases.size()); + for(std::map<std::string, std::string>::const_iterator + i = m_aliases.begin(); i != m_aliases.end(); i++) + { + os<<serializeString(i->first); + os<<serializeString(i->second); + } } virtual void deSerialize(std::istream &is) { @@ -180,10 +210,21 @@ public: // Register registerTool(name, def); } + + u16 num_aliases = readU16(is); + if(!is.eof()){ + for(u16 i=0; i<num_aliases; i++){ + std::string name = deSerializeString(is); + std::string convert_to = deSerializeString(is); + m_aliases[name] = convert_to; + } + } } private: // Key is name core::map<std::string, ToolDefinition*> m_tool_definitions; + // Aliases for loading legacy crap + std::map<std::string, std::string> m_aliases; }; IWritableToolDefManager* createToolDefManager() diff --git a/src/tooldef.h b/src/tooldef.h index aa4cb6931..e28935e43 100644 --- a/src/tooldef.h +++ b/src/tooldef.h @@ -85,6 +85,11 @@ public: virtual bool registerTool(std::string toolname, const ToolDefinition &def)=0; virtual void clear()=0; + // Set an alias so that entries named <name> will load as <convert_to>. + // Alias is not set if <name> has already been defined. + // Alias will be removed if <name> 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; |