diff --git a/src/environment.cpp b/src/environment.cpp index 9748f6b71..81021ad83 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -741,8 +741,12 @@ void ServerEnvironment::clearAllObjects() obj->m_removed = true; continue; } + + // Tell the object about removal + obj->removingFromEnvironment(); // Deregister in scripting api scriptapi_rm_object_reference(m_lua, obj); + // Delete active object delete obj; // Id to be removed from m_active_objects @@ -1395,6 +1399,8 @@ void ServerEnvironment::removeRemovedObjects() if(obj->m_known_by_count > 0) continue; + // Tell the object about removal + obj->removingFromEnvironment(); // Deregister in scripting api scriptapi_rm_object_reference(m_lua, obj); @@ -1680,6 +1686,8 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete) <<"object id="<removingFromEnvironment(); // Deregister in scripting api scriptapi_rm_object_reference(m_lua, obj); diff --git a/src/serverobject.cpp b/src/serverobject.cpp index 428ad6484..344ae406a 100644 --- a/src/serverobject.cpp +++ b/src/serverobject.cpp @@ -37,10 +37,6 @@ ServerActiveObject::~ServerActiveObject() { } -void ServerActiveObject::addedToEnvironment() -{ -} - ServerActiveObject* ServerActiveObject::create(u8 type, ServerEnvironment *env, u16 id, v3f pos, const std::string &data) diff --git a/src/serverobject.h b/src/serverobject.h index 9e9513a7c..b901cbf4d 100644 --- a/src/serverobject.h +++ b/src/serverobject.h @@ -54,8 +54,10 @@ public: ServerActiveObject(ServerEnvironment *env, v3f pos); virtual ~ServerActiveObject(); - // Call after id has been set and has been inserted in environment - virtual void addedToEnvironment(); + // Called after id has been set and has been inserted in environment + virtual void addedToEnvironment(){}; + // Called before removing from environment + virtual void removingFromEnvironment(){}; // Create a certain type of ServerActiveObject static ServerActiveObject* create(u8 type, @@ -111,6 +113,11 @@ public: the data is the static form) */ virtual std::string getStaticData(){return "";} + /* + Return false in here to never save and instead remove object + on unload. getStaticData() will not be called in that case. + */ + virtual bool isStaticAllowed(){return true;} virtual void punch(ServerActiveObject *puncher){} virtual void rightClick(ServerActiveObject *clicker){}