diff --git a/CHANGELOG.md b/CHANGELOG.md index fbc6c30adb..38f20124b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ Bug #6993: Shooting your last round of ammunition causes the attack animation to cancel Bug #7009: Falling actors teleport to the ground without receiving any damage on cell loading Bug #7034: Misc items defined in one content file are not treated as keys if another content file uses them as such + Bug #7044: Changing a class' services does not affect autocalculated NPCs Feature #6933: Support high-resolution cursor textures Feature #6945: Support S3TC-compressed and BGR/BGRA NiPixelData Feature #6979: Add support of loading and displaying LOD assets purely based on their filename extension diff --git a/apps/esmtool/record.cpp b/apps/esmtool/record.cpp index 78b14d4894..1d58993588 100644 --- a/apps/esmtool/record.cpp +++ b/apps/esmtool/record.cpp @@ -607,7 +607,7 @@ namespace EsmTool std::cout << " Name: " << mData.mName << std::endl; std::cout << " Description: " << mData.mDescription << std::endl; std::cout << " Playable: " << mData.mData.mIsPlayable << std::endl; - std::cout << " AutoCalc: " << mData.mData.mCalc << std::endl; + std::cout << " AI Services: " << Misc::StringUtils::format("0x%08X", mData.mData.mServices) << std::endl; std::cout << " Attribute1: " << attributeLabel(mData.mData.mAttribute[0]) << " (" << mData.mData.mAttribute[0] << ")" << std::endl; std::cout << " Attribute2: " << attributeLabel(mData.mData.mAttribute[1]) << " (" << mData.mData.mAttribute[1] diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index 7d279084ec..bfb64d974d 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -1274,7 +1274,14 @@ namespace MWClass int Npc::getServices(const MWWorld::ConstPtr& actor) const { - return actor.get()->mBase->mAiData.mServices; + const ESM::NPC* npc = actor.get()->mBase; + if (npc->mFlags & ESM::NPC::Autocalc) + { + const ESM::Class* class_ + = MWBase::Environment::get().getWorld()->getStore().get().find(npc->mClass); + return class_->mData.mServices; + } + return npc->mAiData.mServices; } std::string_view Npc::getSoundIdFromSndGen(const MWWorld::Ptr& ptr, std::string_view name) const diff --git a/components/esm3/loadclas.cpp b/components/esm3/loadclas.cpp index ba03fda771..e74ecdf018 100644 --- a/components/esm3/loadclas.cpp +++ b/components/esm3/loadclas.cpp @@ -96,7 +96,7 @@ namespace ESM mData.mAttribute[0] = mData.mAttribute[1] = 0; mData.mSpecialization = 0; mData.mIsPlayable = 0; - mData.mCalc = 0; + mData.mServices = 0; for (int i = 0; i < 5; ++i) for (int i2 = 0; i2 < 2; ++i2) diff --git a/components/esm3/loadclas.hpp b/components/esm3/loadclas.hpp index ece90ff6d6..51b9cf1f27 100644 --- a/components/esm3/loadclas.hpp +++ b/components/esm3/loadclas.hpp @@ -14,9 +14,6 @@ namespace ESM /* * Character class definitions */ - - // These flags tells us which items should be auto-calculated for this - // class struct Class { constexpr static RecNameInts sRecordId = REC_CLAS; @@ -24,28 +21,6 @@ namespace ESM /// Return a string descriptor for this record type. Currently used for debugging / error logs only. static std::string_view getRecordType() { return "Class"; } - enum AutoCalc - { - Weapon = 0x00001, - Armor = 0x00002, - Clothing = 0x00004, - Books = 0x00008, - Ingredient = 0x00010, - Lockpick = 0x00020, - Probe = 0x00040, - Lights = 0x00080, - Apparatus = 0x00100, - Repair = 0x00200, - Misc = 0x00400, - Spells = 0x00800, - MagicItems = 0x01000, - Potions = 0x02000, - Training = 0x04000, - Spellmaking = 0x08000, - Enchanting = 0x10000, - RepairItem = 0x20000 - }; - enum Specialization { Combat = 0, @@ -62,9 +37,7 @@ namespace ESM int mSpecialization; // 0 = Combat, 1 = Magic, 2 = Stealth int mSkills[5][2]; // Minor and major skills. int mIsPlayable; // 0x0001 - Playable class - - // I have no idea how to autocalculate these items... - int mCalc; + int mServices; int& getSkill(int index, bool major); ///< Throws an exception for invalid values of \a index.