aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/environment.cpp33
-rw-r--r--src/nodedef.cpp19
-rw-r--r--src/nodedef.h6
3 files changed, 43 insertions, 15 deletions
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<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);
}
}
}
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<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;
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<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;