mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 18:13:46 +01:00
Craftitem aliases
This commit is contained in:
parent
8730dfb1f9
commit
829c632511
@ -94,6 +94,7 @@
|
||||
-- minetest.register_abm(abm definition)
|
||||
-- minetest.alias_node(name, convert_to)
|
||||
-- minetest.alias_tool(name, convert_to)
|
||||
-- minetest.alias_craftitem(name, convert_to)
|
||||
-- minetest.register_globalstep(func(dtime))
|
||||
-- minetest.register_on_placenode(func(pos, newnode, placer))
|
||||
-- minetest.register_on_dignode(func(pos, oldnode, digger))
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
#include "log.h"
|
||||
#include <sstream>
|
||||
#include "utility.h"
|
||||
#include <map>
|
||||
|
||||
CraftItemDefinition::CraftItemDefinition():
|
||||
imagename(""),
|
||||
@ -102,14 +103,14 @@ public:
|
||||
virtual bool registerCraftItem(std::string itemname, const CraftItemDefinition &def)
|
||||
{
|
||||
infostream<<"registerCraftItem: registering CraftItem \""<<itemname<<"\""<<std::endl;
|
||||
/*core::map<std::string, CraftItemDefinition*>::Node *n;
|
||||
n = m_item_definitions.find(itemname);
|
||||
if(n != NULL){
|
||||
errorstream<<"registerCraftItem: registering item \""<<toolname
|
||||
<<"\" failed: name is already registered"<<std::endl;
|
||||
return false;
|
||||
}*/
|
||||
m_item_definitions[itemname] = new CraftItemDefinition(def);
|
||||
|
||||
// Remove conflicting alias if it exists
|
||||
bool alias_removed = (m_aliases.erase(itemname) != 0);
|
||||
if(alias_removed)
|
||||
infostream<<"cidef: erased alias "<<itemname
|
||||
<<" because item was defined"<<std::endl;
|
||||
|
||||
return true;
|
||||
}
|
||||
virtual void clear()
|
||||
@ -120,6 +121,19 @@ public:
|
||||
delete i.getNode()->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 "<<name<<" -> "<<convert_to
|
||||
<<": "<<name<<" is already defined"<<std::endl;
|
||||
return;
|
||||
}
|
||||
infostream<<"nidef: setting alias "<<name<<" -> "<<convert_to
|
||||
<<std::endl;
|
||||
m_aliases[name] = convert_to;
|
||||
}
|
||||
virtual void serialize(std::ostream &os)
|
||||
{
|
||||
@ -138,6 +152,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)
|
||||
{
|
||||
@ -158,10 +180,21 @@ public:
|
||||
// Register
|
||||
registerCraftItem(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, CraftItemDefinition*> m_item_definitions;
|
||||
// Aliases
|
||||
std::map<std::string, std::string> m_aliases;
|
||||
};
|
||||
|
||||
IWritableCraftItemDefManager* createCraftItemDefManager()
|
||||
|
@ -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 <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;
|
||||
|
@ -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},
|
||||
|
Loading…
Reference in New Issue
Block a user