Allow group:groupname in ABM definition and implement minetest.hash_node_position()
authorPerttu Ahola <celeron55@gmail.com>
Sat, 31 Mar 2012 09:30:11 +0000 (12:30 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sat, 31 Mar 2012 09:30:11 +0000 (12:30 +0300)
builtin/builtin.lua
doc/lua_api.txt
src/environment.cpp
src/nodedef.cpp
src/nodedef.h

index 7b39effb2a76b088bf91135735bd9d34143302a3..e529b7261069dc587f612d07dd2f8dc399dd42de 100644 (file)
@@ -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
index e253d2a28c1ee48a289c8c0761b88d7af65a729a..ba610da8bc76b3394318314c33c48c0653542468 100644 (file)
@@ -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
index 0c6d829f5b44b557676fec9ed66d1f6f0b2201f6..001b53a40f659e22fd77c34a4c160066c14b6c9f 100644 (file)
@@ -646,27 +646,30 @@ public:
                                        = abm->getRequiredNeighbors();
                        for(std::set<std::string>::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<std::string> contents_s = abm->getTriggerContents();
                        for(std::set<std::string>::iterator
-                                       i = contents_s.begin(); i != contents_s.end(); i++){
-                               content_t c = ndef->getId(*i);
-                               if(c == CONTENT_IGNORE)
-                                       continue;
-                               std::map<content_t, std::list<ActiveABM> >::iterator j;
-                               j = m_aabms.find(c);
-                               if(j == m_aabms.end()){
-                                       std::list<ActiveABM> aabmlist;
-                                       m_aabms[c] = aabmlist;
+                                       i = contents_s.begin(); i != contents_s.end(); i++)
+                       {
+                               std::set<content_t> ids;
+                               ndef->getIds(*i, ids);
+                               for(std::set<content_t>::const_iterator k = ids.begin();
+                                               k != ids.end(); k++)
+                               {
+                                       content_t c = *k;
+                                       std::map<content_t, std::list<ActiveABM> >::iterator j;
                                        j = m_aabms.find(c);
+                                       if(j == m_aabms.end()){
+                                               std::list<ActiveABM> aabmlist;
+                                               m_aabms[c] = aabmlist;
+                                               j = m_aabms.find(c);
+                                       }
+                                       j->second.push_back(aabm);
                                }
-                               j->second.push_back(aabm);
                        }
                }
        }
index 4b0c4b28844f4d16043b091997823898ea032103..da74c8ce58af7f40b215624d71361da737bd68cb 100644 (file)
@@ -380,6 +380,25 @@ public:
                getId(name, id);
                return id;
        }
+       virtual void getIds(const std::string &name, std::set<content_t> &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;
index a7ffa5a2ee44073969a7785b018f0783b4e43bd8..753bea0ed1ff0550ce5e2c8429b0c3bb50827f1c 100644 (file)
@@ -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<content_t> &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<content_t> &result)
+                       const=0;
        // If not found, returns the features of CONTENT_IGNORE
        virtual const ContentFeatures& get(const std::string &name) const=0;