Fix >5 year old PlayerSAO deletion bug

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.
This commit is contained in:
sfan5 2017-02-15 17:36:47 +01:00
parent eb49009d02
commit a5e4273575
1 changed files with 4 additions and 8 deletions

View 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;