Fix >5 year old PlayerSAO deletion bug
authorsfan5 <sfan5@live.de>
Wed, 15 Feb 2017 16:36:47 +0000 (17:36 +0100)
committersfan5 <sfan5@live.de>
Wed, 15 Feb 2017 16:36:47 +0000 (17:36 +0100)
force_delete=true is usually set at shutdown in order to
also remove PlayerSAOs, however when too many objects
per block are detected force_delete is also set to true.
This was intended only for the current loop iteration but
obviously persisted to the next iterations thereby
deleting all other remaining SAOs.

src/serverenvironment.cpp

index 8d86a4e0a994d6b6e0452ba6bdd282d1b3667861..61faaace7214ca6702201e39bd873aa72961576d 100644 (file)
@@ -1941,11 +1941,14 @@ void ServerEnvironment::activateObjects(MapBlock *block, u32 dtime_s)
 
        If block wasn't generated (not in memory or on disk),
 */
-void ServerEnvironment::deactivateFarObjects(bool force_delete)
+void ServerEnvironment::deactivateFarObjects(bool _force_delete)
 {
        std::vector<u16> objects_to_remove;
        for(ActiveObjectMap::iterator i = m_active_objects.begin();
                i != m_active_objects.end(); ++i) {
+               // force_delete might be overriden per object
+               bool force_delete = _force_delete;
+
                ServerActiveObject* obj = i->second;
                assert(obj);
 
@@ -2147,13 +2150,6 @@ void ServerEnvironment::deactivateFarObjects(bool force_delete)
                        continue;
                }
 
-               if (!force_delete && obj->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
-                       warningstream << "ServerEnvironment::deactivateFarObjects(): "
-                               << "Trying to delete player object, THIS SHOULD NEVER HAPPEN!"
-                               << std::endl;
-                       continue;
-               }
-
                verbosestream<<"ServerEnvironment::deactivateFarObjects(): "
                        <<"object id="<<id<<" is not known by clients"
                        <<"; deleting"<<std::endl;