1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-01 03:21:41 +00:00

moveObject() has side effects that might invalidate iterators from mActors. Instead of iterating over mActors, make a copy of needed data and iterate over the copies.

This commit is contained in:
Frederic Chardon 2021-09-06 11:47:21 +02:00
parent 0b2b0e93ff
commit 7b26058fa5

View File

@ -813,12 +813,20 @@ namespace MWPhysics
{
auto* player = getActor(MWMechanics::getPlayer());
auto* world = MWBase::Environment::get().getWorld();
for (auto& [ptr, physicActor] : mActors)
// copy new ptr position in temporary vector. player is handled separately as its movement might change active cell.
std::vector<std::pair<MWWorld::Ptr, osg::Vec3f>> newPositions;
newPositions.reserve(mActors.size() - 1);
for (const auto& [ptr, physicActor] : mActors)
{
if (physicActor.get() == player)
continue;
world->moveObject(physicActor->getPtr(), physicActor->getSimulationPosition(), false, false);
newPositions.emplace_back(physicActor->getPtr(), physicActor->getSimulationPosition());
}
for (auto& [ptr, pos] : newPositions)
world->moveObject(ptr, pos, false, false);
world->moveObject(player->getPtr(), player->getSimulationPosition(), false, false);
}