diff --git a/builtin/builtin.lua b/builtin/builtin.lua index 7b39effb2..e529b7261 100644 --- a/builtin/builtin.lua +++ b/builtin/builtin.lua @@ -861,6 +861,14 @@ function minetest.get_connected_players() return list end +function minetest.hash_node_position(pos) + return (pos.z+32768)*65536*65536 + (pos.y+32768)*65536 + pos.x+32768 +end + +-- +-- Privileges +-- + minetest.registered_privileges = {} function minetest.register_privilege(name, description) minetest.registered_privileges[name] = description diff --git a/doc/lua_api.txt b/doc/lua_api.txt index e253d2a28..ba610da8b 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -542,6 +542,8 @@ minetest.after(time, func, param) Random: minetest.get_connected_players() -> list of ObjectRefs +minetest.hash_node_position({x=,y=,z=}) -> 48-bit integer +^ Gives a unique hash number for a node position (16+16+16=48bit) Global objects: minetest.env - environment reference @@ -768,6 +770,7 @@ Entity definition (register_entity) ABM (ActiveBlockModifier) definition (register_abm) { + -- In the following two fields, also group:groupname will work. nodenames = {"default:lava_source"}, neighbors = {"default:water_source", "default:water_flowing"}, -- (any of these) ^ If left out or empty, any neighbor will do diff --git a/src/environment.cpp b/src/environment.cpp index 0c6d829f5..001b53a40 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -646,27 +646,30 @@ public: = abm->getRequiredNeighbors(); for(std::set::iterator i = required_neighbors_s.begin(); - i != required_neighbors_s.end(); i++){ - content_t c = ndef->getId(*i); - if(c == CONTENT_IGNORE) - continue; - aabm.required_neighbors.insert(c); + i != required_neighbors_s.end(); i++) + { + ndef->getIds(*i, aabm.required_neighbors); } // Trigger contents std::set contents_s = abm->getTriggerContents(); for(std::set::iterator - i = contents_s.begin(); i != contents_s.end(); i++){ - content_t c = ndef->getId(*i); - if(c == CONTENT_IGNORE) - continue; - std::map >::iterator j; - j = m_aabms.find(c); - if(j == m_aabms.end()){ - std::list aabmlist; - m_aabms[c] = aabmlist; + i = contents_s.begin(); i != contents_s.end(); i++) + { + std::set ids; + ndef->getIds(*i, ids); + for(std::set::const_iterator k = ids.begin(); + k != ids.end(); k++) + { + content_t c = *k; + std::map >::iterator j; j = m_aabms.find(c); + if(j == m_aabms.end()){ + std::list aabmlist; + m_aabms[c] = aabmlist; + j = m_aabms.find(c); + } + j->second.push_back(aabm); } - j->second.push_back(aabm); } } } diff --git a/src/nodedef.cpp b/src/nodedef.cpp index 4b0c4b288..da74c8ce5 100644 --- a/src/nodedef.cpp +++ b/src/nodedef.cpp @@ -380,6 +380,25 @@ public: getId(name, id); return id; } + virtual void getIds(const std::string &name, std::set &result) + const + { + if(name.substr(0,6) != "group:"){ + content_t id = CONTENT_IGNORE; + if(getId(name, id)) + result.insert(id); + return; + } + std::string group = name.substr(6); + for(u16 id=0; id<=MAX_CONTENT; id++) + { + const ContentFeatures &f = m_content_features[id]; + if(f.name == "") // Quickly discard undefined nodes + continue; + if(itemgroup_get(f.groups, group) != 0) + result.insert(id); + } + } virtual const ContentFeatures& get(const std::string &name) const { content_t id = CONTENT_IGNORE; diff --git a/src/nodedef.h b/src/nodedef.h index a7ffa5a2e..753bea0ed 100644 --- a/src/nodedef.h +++ b/src/nodedef.h @@ -238,6 +238,9 @@ public: virtual const ContentFeatures& get(const MapNode &n) const=0; virtual bool getId(const std::string &name, content_t &result) const=0; virtual content_t getId(const std::string &name) const=0; + // Allows "group:name" in addition to regular node names + virtual void getIds(const std::string &name, std::set &result) + const=0; virtual const ContentFeatures& get(const std::string &name) const=0; virtual void serialize(std::ostream &os)=0; @@ -254,6 +257,9 @@ public: virtual const ContentFeatures& get(const MapNode &n) const=0; virtual bool getId(const std::string &name, content_t &result) const=0; virtual content_t getId(const std::string &name) const=0; + // Allows "group:name" in addition to regular node names + virtual void getIds(const std::string &name, std::set &result) + const=0; // If not found, returns the features of CONTENT_IGNORE virtual const ContentFeatures& get(const std::string &name) const=0;