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:
parent
eb49009d02
commit
a5e4273575
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue