void Map::visitEntities (IEntityVisitor *visitor, const EntityType& type) { if (type == EntityType::NONE || type == EntityTypes::PLAYER) { bool needUpdate = false; for (PlayerListIter i = _players.begin(); i != _players.end();) { Player* e = *i; if (visitor->visitEntity(e)) { debug(LOG_SERVER, String::format("remove player by visit %i: %s", e->getID(), e->getType().name.c_str())); GameEvent.removeEntity(e->getVisMask(), *e); delete *i; i = _players.erase(i); needUpdate = true; } else { ++i; } } if (needUpdate) { updateVisMask(); if (_players.empty()) { resetCurrentMap(); return; } } } // changing the entities list is not allowed here. Adding or removing // would invalidate the iterators for (Map::EntityListIter i = _entities.begin(); i != _entities.end();) { IEntity* e = *i; if (type.isNone() || e->getType() == type) { if (visitor->visitEntity(e)) { debug(LOG_SERVER, String::format("remove entity by visit %i: %s", e->getID(), e->getType().name.c_str())); GameEvent.removeEntity(e->getVisMask(), *e, EntityTypes::isNpcCave(e->getType())); (*i)->prepareRemoval(); delete *i; i = _entities.erase(i); } else { ++i; } } else { ++i; } } // now we will add the newly added entities to the list to not invalidate the iterators for (Map::EntityListIter i = _entitiesToAdd.begin(); i != _entitiesToAdd.end(); ++i) { _entities.push_back(*i); } _entitiesToAdd.clear(); }
void Map::visitEntities (IEntityVisitor *visitor, const EntityType& type) { if (type == EntityType::NONE || type == EntityTypes::PLAYER) { bool needUpdate = false; for (PlayerListIter i = _players.begin(); i != _players.end();) { Player* e = *i; if (visitor->visitEntity(e)) { debug(LOG_SERVER, String::format("remove player by visit %i: %s", e->getID(), e->getType().name.c_str())); removeEntity(ClientIdToClientMask(e->getClientId()), *e); delete *i; i = _players.erase(i); needUpdate = true; } else { ++i; } } if (needUpdate) { if (_players.empty()) { resetCurrentMap(); return; } } } // changing the entities list is not allowed here. Adding or removing // would invalidate the iterators for (Map::EntityListIter i = _entities.begin(); i != _entities.end();) { IEntity* e = *i; if (type.isNone() || e->getType() == type) { if (visitor->visitEntity(e)) { debug(LOG_SERVER, String::format("remove entity by visit %i: %s", e->getID(), e->getType().name.c_str())); removeEntity(0, *e); (*i)->remove(); delete *i; i = _entities.erase(i); } else { ++i; } } else { ++i; } } }