summaryrefslogtreecommitdiff
path: root/src/environment.cpp
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2013-01-02 23:17:52 +0200
committerPerttu Ahola <celeron55@gmail.com>2013-01-02 23:18:14 +0200
commit2c472a66d1d605eefb167f51529c287f868ffa9b (patch)
tree8096b69ac4810fa083a7a823457af01995cd1418 /src/environment.cpp
parent69bd803a3221bf02672431390e672b0510695254 (diff)
downloadminetest-2c472a66d1d605eefb167f51529c287f868ffa9b.tar.gz
minetest-2c472a66d1d605eefb167f51529c287f868ffa9b.tar.bz2
minetest-2c472a66d1d605eefb167f51529c287f868ffa9b.zip
Add ServerEnvironment::setNode()/removeNode() to allow setting nodes from the C++ side with proper script-defined initialization/destruction
Diffstat (limited to 'src/environment.cpp')
-rw-r--r--src/environment.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/environment.cpp b/src/environment.cpp
index 5bf127a17..020d2b433 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -819,6 +819,45 @@ void ServerEnvironment::addActiveBlockModifier(ActiveBlockModifier *abm)
m_abms.push_back(ABMWithState(abm));
}
+bool ServerEnvironment::setNode(v3s16 p, const MapNode &n)
+{
+ INodeDefManager *ndef = m_gamedef->ndef();
+ MapNode n_old = m_map->getNodeNoEx(p);
+ // Call destructor
+ if(ndef->get(n_old).has_on_destruct)
+ scriptapi_node_on_destruct(m_lua, p, n_old);
+ // Replace node
+ bool succeeded = m_map->addNodeWithEvent(p, n);
+ if(!succeeded)
+ return false;
+ // Call post-destructor
+ if(ndef->get(n_old).has_after_destruct)
+ scriptapi_node_after_destruct(m_lua, p, n_old);
+ // Call constructor
+ if(ndef->get(n).has_on_construct)
+ scriptapi_node_on_construct(m_lua, p, n);
+ return true;
+}
+
+bool ServerEnvironment::removeNode(v3s16 p)
+{
+ INodeDefManager *ndef = m_gamedef->ndef();
+ MapNode n_old = m_map->getNodeNoEx(p);
+ // Call destructor
+ if(ndef->get(n_old).has_on_destruct)
+ scriptapi_node_on_destruct(m_lua, p, n_old);
+ // Replace with air
+ // This is slightly optimized compared to addNodeWithEvent(air)
+ bool succeeded = m_map->removeNodeWithEvent(p);
+ if(!succeeded)
+ return false;
+ // Call post-destructor
+ if(ndef->get(n_old).has_after_destruct)
+ scriptapi_node_after_destruct(m_lua, p, n_old);
+ // Air doesn't require constructor
+ return true;
+}
+
std::set<u16> ServerEnvironment::getObjectsInsideRadius(v3f pos, float radius)
{
std::set<u16> objects;