Something went wrong. Try again.
OpenMW is an open implementation of the Morrowind engine
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869#include "bodypartcheck.hpp"
#include <string>
#include <apps/opencs/model/doc/messages.hpp>#include <apps/opencs/model/prefs/category.hpp>#include <apps/opencs/model/prefs/setting.hpp>#include <apps/opencs/model/world/idcollection.hpp>#include <apps/opencs/model/world/record.hpp>#include <apps/opencs/model/world/resources.hpp>#include <apps/opencs/model/world/universalid.hpp>
#include <components/esm3/loadbody.hpp>
#include "../prefs/state.hpp"
CSMTools::BodyPartCheckStage::BodyPartCheckStage(const CSMWorld::IdCollection<ESM::BodyPart>& bodyParts, const CSMWorld::Resources& meshes, const CSMWorld::IdCollection<ESM::Race>& races) : mBodyParts(bodyParts) , mMeshes(meshes) , mRaces(races){ mIgnoreBaseRecords = false;}
int CSMTools::BodyPartCheckStage::setup(){ mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue();
return mBodyParts.getSize();}
void CSMTools::BodyPartCheckStage::perform(int stage, CSMDoc::Messages& messages){ const CSMWorld::Record<ESM::BodyPart>& record = mBodyParts.getRecord(stage);
// Skip "Base" records (setting!) and "Deleted" records if ((mIgnoreBaseRecords && record.mState == CSMWorld::RecordBase::State_BaseOnly) || record.isDeleted()) return;
const ESM::BodyPart& bodyPart = record.get();
CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_BodyPart, bodyPart.mId);
// Check BYDT if (bodyPart.mData.mPart >= ESM::BodyPart::MP_Count) messages.add(id, "Invalid part", "", CSMDoc::Message::Severity_Error);
if (bodyPart.mData.mType > ESM::BodyPart::MT_Armor) messages.add(id, "Invalid type", "", CSMDoc::Message::Severity_Error);
// Check MODL if (bodyPart.mModel.getOriginal().empty()) messages.add(id, "Model is missing", "", CSMDoc::Message::Severity_Error); else if (mMeshes.searchId(bodyPart.mModel.getOriginal()) == -1) messages.add(id, std::format("Model '{}' does not exist", bodyPart.mModel.getOriginal()), "", CSMDoc::Message::Severity_Error);
// Check FNAM for skin body parts (for non-skin body parts it's meaningless) if (bodyPart.mData.mType == ESM::BodyPart::MT_Skin) { if (bodyPart.mRace.empty()) messages.add(id, "Race is missing", "", CSMDoc::Message::Severity_Error); else if (mRaces.searchId(bodyPart.mRace) == -1) messages.add(id, "Race '" + bodyPart.mRace.getRefIdString() + "' does not exist", "", CSMDoc::Message::Severity_Error); }}