diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 340c0373893fb5546813f81372eb96fbb6179b30..51af760ae14e74eeabbaa758cc4ba5e0bc15660c 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -484,6 +484,12 @@ void LLViewerObject::markDead() LLFollowCamMgr::removeFollowCamParams(mID); } + // And finally mark the region as null to prevent invalid calls while object is dead but not cleaned up + if (mRegionp) + { + mRegionp = nullptr; + } + sNumZombieObjects++; } } @@ -4082,7 +4088,7 @@ LLNameValue *LLViewerObject::getNVPair(const std::string& name) const void LLViewerObject::updatePositionCaches() const { // If region is removed from the list it is also deleted. - if(mRegionp && LLWorld::instance().isRegionListed(mRegionp)) + if(mRegionp) { if (!isRoot()) { @@ -4100,7 +4106,7 @@ void LLViewerObject::updatePositionCaches() const const LLVector3d LLViewerObject::getPositionGlobal() const { // If region is removed from the list it is also deleted. - if(mRegionp && LLWorld::instance().isRegionListed(mRegionp)) + if(mRegionp) { LLVector3d position_global = mRegionp->getPosGlobalFromRegion(getPositionRegion()); @@ -4120,7 +4126,7 @@ const LLVector3d LLViewerObject::getPositionGlobal() const const LLVector3 &LLViewerObject::getPositionAgent() const { // If region is removed from the list it is also deleted. - if(mRegionp && LLWorld::instance().isRegionListed(mRegionp)) + if(mRegionp) { if (mDrawable.notNull() && (!mDrawable->isRoot() && getParent())) { diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 244b18e1a9b7fa233471f5fb11c9339e277844b6..90b78d2af4504800ac53b457dc8c9b3d957ce3b2 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -1399,13 +1399,9 @@ BOOL LLViewerObjectList::killObject(LLViewerObject *objectp) void LLViewerObjectList::killObjects(LLViewerRegion *regionp) { - LLViewerObject *objectp; - - for (auto& object : mObjects) + for (LLViewerObject* objectp : mObjects) { - objectp = object; - if (objectp->mRegionp == regionp) { killObject(objectp); @@ -1419,11 +1415,8 @@ void LLViewerObjectList::killObjects(LLViewerRegion *regionp) void LLViewerObjectList::killAllObjects() { // Used only on global destruction. - LLViewerObject *objectp; - - for (auto& object : mObjects) + for (LLViewerObject* objectp : mObjects) { - objectp = object; killObject(objectp); // Object must be dead, or it's the LLVOAvatarSelf which never dies. llassert((objectp == gAgentAvatarp) || objectp->isDead());