void CellStore::updateMergedRefs() { mMergedRefs.clear(); MergeVisitor visitor(mMergedRefs, mMovedHere, mMovedToAnotherCell); forEachInternal(visitor); visitor.merge(); }
void Headers::forEach(PassOwnPtr<HeadersForEachCallback> callback) { forEachInternal(callback, 0); }
void Headers::forEach(PassOwnPtr<HeadersForEachCallback> callback, ScriptValue& thisArg) { forEachInternal(callback, &thisArg); }
void CellStore::readReferences (ESM::ESMReader& reader, const std::map<int, int>& contentFileMap, GetCellStoreCallback* callback) { mHasState = true; while (reader.isNextSub ("OBJE")) { unsigned int unused; reader.getHT (unused); // load the RefID first so we know what type of object it is ESM::CellRef cref; cref.loadId(reader, true); int type = MWBase::Environment::get().getWorld()->getStore().find(cref.mRefID); if (type == 0) { std::cerr << "Dropping reference to '" << cref.mRefID << "' (object no longer exists)" << std::endl; reader.skipHSubUntil("OBJE"); continue; } switch (type) { case ESM::REC_ACTI: readReferenceCollection<ESM::ObjectState> (reader, mActivators, cref, contentFileMap); break; case ESM::REC_ALCH: readReferenceCollection<ESM::ObjectState> (reader, mPotions, cref, contentFileMap); break; case ESM::REC_APPA: readReferenceCollection<ESM::ObjectState> (reader, mAppas, cref, contentFileMap); break; case ESM::REC_ARMO: readReferenceCollection<ESM::ObjectState> (reader, mArmors, cref, contentFileMap); break; case ESM::REC_BOOK: readReferenceCollection<ESM::ObjectState> (reader, mBooks, cref, contentFileMap); break; case ESM::REC_CLOT: readReferenceCollection<ESM::ObjectState> (reader, mClothes, cref, contentFileMap); break; case ESM::REC_CONT: readReferenceCollection<ESM::ContainerState> (reader, mContainers, cref, contentFileMap); break; case ESM::REC_CREA: readReferenceCollection<ESM::CreatureState> (reader, mCreatures, cref, contentFileMap); break; case ESM::REC_DOOR: readReferenceCollection<ESM::DoorState> (reader, mDoors, cref, contentFileMap); break; case ESM::REC_INGR: readReferenceCollection<ESM::ObjectState> (reader, mIngreds, cref, contentFileMap); break; case ESM::REC_LEVC: readReferenceCollection<ESM::CreatureLevListState> (reader, mCreatureLists, cref, contentFileMap); break; case ESM::REC_LEVI: readReferenceCollection<ESM::ObjectState> (reader, mItemLists, cref, contentFileMap); break; case ESM::REC_LIGH: readReferenceCollection<ESM::ObjectState> (reader, mLights, cref, contentFileMap); break; case ESM::REC_LOCK: readReferenceCollection<ESM::ObjectState> (reader, mLockpicks, cref, contentFileMap); break; case ESM::REC_MISC: readReferenceCollection<ESM::ObjectState> (reader, mMiscItems, cref, contentFileMap); break; case ESM::REC_NPC_: readReferenceCollection<ESM::NpcState> (reader, mNpcs, cref, contentFileMap); break; case ESM::REC_PROB: readReferenceCollection<ESM::ObjectState> (reader, mProbes, cref, contentFileMap); break; case ESM::REC_REPA: readReferenceCollection<ESM::ObjectState> (reader, mRepairs, cref, contentFileMap); break; case ESM::REC_STAT: readReferenceCollection<ESM::ObjectState> (reader, mStatics, cref, contentFileMap); break; case ESM::REC_WEAP: readReferenceCollection<ESM::ObjectState> (reader, mWeapons, cref, contentFileMap); break; case ESM::REC_BODY: readReferenceCollection<ESM::ObjectState> (reader, mBodyParts, cref, contentFileMap); break; default: throw std::runtime_error ("unknown type in cell reference section"); } } // Do another update here to make sure objects referred to by MVRF tags can be found // This update is only needed for old saves that used the old copy&delete way of moving objects updateMergedRefs(); while (reader.isNextSub("MVRF")) { reader.cacheSubName(); ESM::RefNum refnum; ESM::CellId movedTo; refnum.load(reader, true, "MVRF"); movedTo.load(reader); // Search for the reference. It might no longer exist if its content file was removed. SearchByRefNumVisitor visitor(refnum); forEachInternal(visitor); if (!visitor.mFound) { std::cerr << "Dropping moved ref tag for " << refnum.mIndex << " (moved object no longer exists)" << std::endl; continue; } MWWorld::LiveCellRefBase* movedRef = visitor.mFound; CellStore* otherCell = callback->getCellStore(movedTo); if (otherCell == NULL) { std::cerr << "Dropping moved ref tag for " << movedRef->mRef.getRefId() << " (target cell " << movedTo.mWorldspace << " no longer exists). Reference moved back to its original location." << std::endl; // Note by dropping tag the object will automatically re-appear in its original cell, though potentially at inapproriate coordinates. // Restore original coordinates: movedRef->mData.setPosition(movedRef->mRef.getPosition()); continue; } if (otherCell == this) { // Should never happen unless someone's tampering with files. std::cerr << "Found invalid moved ref, ignoring" << std::endl; continue; } moveTo(MWWorld::Ptr(movedRef, this), otherCell); } }
void FontFaceSet::forEach(PassOwnPtr<FontFaceSetForEachCallback> callback) const { forEachInternal(callback, 0); }
void FontFaceSet::forEach(PassOwnPtr<FontFaceSetForEachCallback> callback, const ScriptValue& thisArg) const { forEachInternal(callback, &thisArg); }