1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-03 22:15:34 +00:00

Fix crash when moving npcs to an inactive cell

This commit is contained in:
scrawl 2013-04-04 16:51:22 +02:00
parent 48a88f1917
commit 2e7d5377f4
4 changed files with 28 additions and 16 deletions

View file

@ -235,7 +235,7 @@ void RenderingManager::cellAdded (MWWorld::Ptr::CellStore *store)
mObjects.buildStaticGeometry (*store);
mDebugging->cellAdded(store);
if (store->mCell->isExterior())
mTerrainManager->cellAdded(store);
mTerrainManager->cellAdded(store);
waterAdded(store);
}

View file

@ -304,7 +304,7 @@ namespace MWScript
}
MWBase::Environment::get().getWorld()->rotateObject(ptr,ax,ay,zRot);
MWBase::Environment::get().getWorld()->adjustPosition(ptr);
MWWorld::Class::get(ptr).adjustPosition(ptr);
}
else
{
@ -343,7 +343,7 @@ namespace MWScript
zRot = zRot/60.;
}
MWBase::Environment::get().getWorld()->rotateObject(ptr,ax,ay,zRot);
MWBase::Environment::get().getWorld()->adjustPosition(ptr);
MWWorld::Class::get(ptr).adjustPosition(ptr);
}
};

View file

@ -115,11 +115,6 @@ namespace MWWorld
if(result.second)
{
/// \todo rescale depending on the state of a new GMST
insertCell (*cell, true);
mRendering.cellAdded (cell);
float verts = ESM::Land::LAND_SIZE;
float worldsize = ESM::Land::REAL_SIZE;
@ -142,6 +137,11 @@ namespace MWWorld
}
}
/// \todo rescale depending on the state of a new GMST
insertCell (*cell, true);
mRendering.cellAdded (cell);
mRendering.configureAmbient(*cell);
mRendering.requestMap(cell);
mRendering.configureAmbient(*cell);
@ -166,7 +166,7 @@ namespace MWWorld
float z = Ogre::Radian(pos.rot[2]).valueDegrees();
world->rotateObject(player, x, y, z);
world->adjustPosition(player);
MWWorld::Class::get(player).adjustPosition(player);
}
MWBase::MechanicsManager *mechMgr =
@ -358,7 +358,7 @@ namespace MWWorld
float z = Ogre::Radian(position.rot[2]).valueDegrees();
world->rotateObject(world->getPlayer().getPlayer(), x, y, z);
world->adjustPosition(world->getPlayer().getPlayer());
MWWorld::Class::get(world->getPlayer().getPlayer()).adjustPosition(world->getPlayer().getPlayer());
return;
}

View file

@ -706,6 +706,7 @@ namespace MWWorld
void World::moveObject(const Ptr &ptr, CellStore &newCell, float x, float y, float z)
{
ESM::Position &pos = ptr.getRefData().getPosition();
pos.pos[0] = x;
pos.pos[1] = y;
pos.pos[2] = z;
@ -718,7 +719,7 @@ namespace MWWorld
if (*currCell != newCell)
{
removeContainerScripts(ptr);
removeContainerScripts(ptr);
if (isPlayer)
{
@ -750,7 +751,7 @@ namespace MWWorld
else
{
MWWorld::Ptr copy =
MWWorld::Class::get(ptr).copyToCell(ptr, newCell);
MWWorld::Class::get(ptr).copyToCell(ptr, newCell, pos);
mRendering->updateObjectCell(ptr, copy);
@ -780,12 +781,14 @@ namespace MWWorld
bool World::moveObjectImp(const Ptr& ptr, float x, float y, float z)
{
CellStore *cell = ptr.getCell();
if (cell->isExterior()) {
int cellX, cellY;
positionToIndex(x, y, cellX, cellY);
cell = getExterior(cellX, cellY);
}
moveObject(ptr, *cell, x, y, z);
return cell != ptr.getCell();
@ -827,6 +830,19 @@ namespace MWWorld
{
Ogre::Vector3 pos (ptr.getRefData().getPosition().pos[0], ptr.getRefData().getPosition().pos[1], ptr.getRefData().getPosition().pos[2]);
if(!ptr.getRefData().getBaseNode())
{
// will be adjusted when Ptr's cell becomes active
return;
}
float terrainHeight = mRendering->getTerrainHeightAt(pos);
if (pos.z < terrainHeight)
pos.z = terrainHeight+400; // place slightly above. will snap down to ground with code below
ptr.getRefData().getPosition().pos[2] = pos.z;
if (!isFlying(ptr))
{
Ogre::Vector3 traced = mPhysics->traceDown(ptr);
@ -834,10 +850,6 @@ namespace MWWorld
pos.z = traced.z;
}
float terrainHeight = mRendering->getTerrainHeightAt(pos);
if (pos.z < terrainHeight)
pos.z = terrainHeight;
moveObject(ptr, pos.x, pos.y, pos.z);
}