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:
parent
48a88f1917
commit
2e7d5377f4
4 changed files with 28 additions and 16 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue