diff options
author | Perttu Ahola <celeron55@gmail.com> | 2013-01-02 23:17:52 +0200 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2013-01-02 23:18:14 +0200 |
commit | 2c472a66d1d605eefb167f51529c287f868ffa9b (patch) | |
tree | 8096b69ac4810fa083a7a823457af01995cd1418 /src/environment.cpp | |
parent | 69bd803a3221bf02672431390e672b0510695254 (diff) | |
download | minetest-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.cpp | 39 |
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; |