From 2c472a66d1d605eefb167f51529c287f868ffa9b Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Wed, 2 Jan 2013 23:17:52 +0200 Subject: Add ServerEnvironment::setNode()/removeNode() to allow setting nodes from the C++ side with proper script-defined initialization/destruction --- src/environment.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'src/environment.cpp') 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 ServerEnvironment::getObjectsInsideRadius(v3f pos, float radius) { std::set objects; -- cgit v1.2.3