Node definition aliases

This commit is contained in:
Perttu Ahola 2011-12-03 23:50:31 +02:00
parent 6a5829788e
commit 4b00d4d9d2
5 changed files with 108 additions and 2 deletions

@ -107,10 +107,19 @@
-- minetest.chat_send_all(text) -- minetest.chat_send_all(text)
-- minetest.chat_send_player(name, text) -- minetest.chat_send_player(name, text)
-- minetest.get_player_privs(name) -> set of privs -- minetest.get_player_privs(name) -> set of privs
--
-- stackstring_take_item(stackstring) -> stackstring, item -- stackstring_take_item(stackstring) -> stackstring, item
-- stackstring_put_item(stackstring, item) -> stackstring, success -- stackstring_put_item(stackstring, item) -> stackstring, success
-- stackstring_put_stackstring(stackstring, stackstring) -> stackstring, success -- stackstring_put_stackstring(stackstring, stackstring) -> stackstring, success
-- --
-- minetest.digprop_constanttime(time)
-- minetest.digprop_stonelike(toughness)
-- minetest.digprop_dirtlike(toughness)
-- minetest.digprop_gravellike(toughness)
-- minetest.digprop_woodlike(toughness)
-- minetest.digprop_leaveslike(toughness)
-- minetest.digprop_glasslike(toughness)
--
-- Global objects: -- Global objects:
-- minetest.env - environment reference -- minetest.env - environment reference
-- --

@ -1,6 +1,46 @@
-- legacy (Minetest 0.4 mod) -- legacy (Minetest 0.4 mod)
-- Provides as much backwards-compatibility as feasible -- Provides as much backwards-compatibility as feasible
minetest.alias_node("stone", "default:stone")
minetest.alias_node("dirt_with_grass", "default:dirt_with_grass")
minetest.alias_node("dirt_with_grass_footsteps", "default:dirt_with_grass_footsteps")
minetest.alias_node("dirt", "default:dirt")
minetest.alias_node("sand", "default:sand")
minetest.alias_node("gravel", "default:gravel")
minetest.alias_node("sandstone", "default:sandstone")
minetest.alias_node("clay", "default:clay")
minetest.alias_node("brick", "default:brick")
minetest.alias_node("tree", "default:tree")
minetest.alias_node("jungletree", "default:jungletree")
minetest.alias_node("junglegrass", "default:junglegrass")
minetest.alias_node("leaves", "default:leaves")
minetest.alias_node("cactus", "default:cactus")
minetest.alias_node("papyrus", "default:papyrus")
minetest.alias_node("bookshelf", "default:bookshelf")
minetest.alias_node("glass", "default:glass")
minetest.alias_node("wooden_fence", "default:fence_wood")
minetest.alias_node("rail", "default:rail")
minetest.alias_node("ladder", "default:ladder")
minetest.alias_node("wood", "default:wood")
minetest.alias_node("mese", "default:mese")
minetest.alias_node("cloud", "default:cloud")
minetest.alias_node("water_flowing", "default:water_flowing")
minetest.alias_node("water_source", "default:water_source")
minetest.alias_node("lava_flowing", "default:lava_flowing")
minetest.alias_node("lava_source", "default:lava_source")
minetest.alias_node("torch", "default:torch")
minetest.alias_node("sign_wall", "default:sign_wall")
minetest.alias_node("chest", "default:chest")
minetest.alias_node("locked_chest", "default:chest_locked")
minetest.alias_node("cobble", "default:cobble")
minetest.alias_node("mossycobble", "default:mossycobble")
minetest.alias_node("steelblock", "default:steelblock")
minetest.alias_node("nyancat", "default:nyancat")
minetest.alias_node("nyancat_rainbow", "default:nyancat_rainbow")
minetest.alias_node("sapling", "default:sapling")
minetest.alias_node("apple", "default:apple")
--[[
WATER_ALPHA = 160 WATER_ALPHA = 160
WATER_VISC = 1 WATER_VISC = 1
LAVA_VISC = 7 LAVA_VISC = 7
@ -1016,5 +1056,5 @@ function on_dignode(p, node)
nodeupdate(p) nodeupdate(p)
end end
minetest.register_on_dignode(on_dignode) minetest.register_on_dignode(on_dignode)
--]]
-- END -- END

@ -398,8 +398,18 @@ public:
{ {
return get(n.getContent()); 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<std::string, std::string>::const_iterator i;
i = m_aliases.find(name);
if(i != m_aliases.end()){
/*infostream<<"ndef: alias active: "<<name<<" -> "<<i->second
<<std::endl;*/
name = i->second;
}
// Get id
return m_name_id_mapping.getId(name, result); return m_name_id_mapping.getId(name, result);
} }
virtual content_t getId(const std::string &name) const virtual content_t getId(const std::string &name) const
@ -438,6 +448,12 @@ public:
m_content_features[c] = def; m_content_features[c] = def;
if(def.name != "") if(def.name != "")
m_name_id_mapping.set(c, 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 "<<def.name
<<" because node was defined"<<std::endl;
} }
virtual content_t set(const std::string &name, virtual content_t set(const std::string &name,
const ContentFeatures &def) const ContentFeatures &def)
@ -476,6 +492,19 @@ public:
f.material.diggability = DIGGABLE_NORMAL; f.material.diggability = DIGGABLE_NORMAL;
return set(name, f); return set(name, f);
} }
virtual void setAlias(const std::string &name,
const std::string &convert_to)
{
content_t id;
if(getId(name, id)){
infostream<<"ndef: not setting alias "<<name<<" -> "<<convert_to
<<": "<<name<<" is already defined"<<std::endl;
return;
}
infostream<<"ndef: setting alias "<<name<<" -> "<<convert_to
<<std::endl;
m_aliases[name] = convert_to;
}
virtual void updateTextures(ITextureSource *tsrc) virtual void updateTextures(ITextureSource *tsrc)
{ {
#ifndef SERVER #ifndef SERVER
@ -639,8 +668,12 @@ public:
} }
} }
private: private:
// Features indexed by id
ContentFeatures m_content_features[MAX_CONTENT+1]; ContentFeatures m_content_features[MAX_CONTENT+1];
// A mapping for fast converting back and forth between names and ids
NameIdMapping m_name_id_mapping; NameIdMapping m_name_id_mapping;
// Aliases for loading legacy crap
std::map<std::string, std::string> m_aliases;
}; };
IWritableNodeDefManager* createNodeDefManager() IWritableNodeDefManager* createNodeDefManager()

@ -279,6 +279,11 @@ public:
const ContentFeatures &def)=0; const ContentFeatures &def)=0;
// If returns CONTENT_IGNORE, could not allocate id // If returns CONTENT_IGNORE, could not allocate id
virtual content_t allocateDummy(const std::string &name)=0; virtual content_t allocateDummy(const std::string &name)=0;
// Set an alias so that nodes 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;
/* /*
Update tile textures to latest return values of TextueSource. Update tile textures to latest return values of TextueSource.

@ -1122,6 +1122,24 @@ static int l_register_node(lua_State *L)
return 0; /* number of results */ 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}}) // register_craft({output=item, recipe={{item00,item10},{item01,item11}})
static int l_register_craft(lua_State *L) 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_node", l_register_node},
{"register_craft", l_register_craft}, {"register_craft", l_register_craft},
{"register_abm", l_register_abm}, {"register_abm", l_register_abm},
{"alias_node", l_alias_node},
{"setting_get", l_setting_get}, {"setting_get", l_setting_get},
{"setting_getbool", l_setting_getbool}, {"setting_getbool", l_setting_getbool},
{"chat_send_all", l_chat_send_all}, {"chat_send_all", l_chat_send_all},