diff --git a/apps/openmw/mwrender/npcanimation.cpp b/apps/openmw/mwrender/npcanimation.cpp index 24f77a512..5a794e743 100644 --- a/apps/openmw/mwrender/npcanimation.cpp +++ b/apps/openmw/mwrender/npcanimation.cpp @@ -9,6 +9,8 @@ #include "../mwworld/inventorystore.hpp" #include "../mwworld/class.hpp" +#include "../mwmechanics/npcstats.hpp" + #include "../mwbase/environment.hpp" #include "../mwbase/world.hpp" #include "../mwbase/mechanicsmanager.hpp" @@ -92,20 +94,32 @@ NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, Ogre::SceneNode* node, MWWor mPartPriorities[i] = 0; } - const MWWorld::ESMStore &store = - MWBase::Environment::get().getWorld()->getStore(); + const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore(); const ESM::Race *race = store.get().find(mNpc->mRace); + bool isWerewolf = MWWorld::Class::get(mPtr).getNpcStats(mPtr).isWerewolf(); - mHeadModel = "meshes\\" + store.get().find(mNpc->mHead)->mModel; - mHairModel = "meshes\\" + store.get().find(mNpc->mHair)->mModel; + if(!isWerewolf) + { + mHeadModel = "meshes\\" + store.get().find(mNpc->mHead)->mModel; + mHairModel = "meshes\\" + store.get().find(mNpc->mHair)->mModel; + } + else + { + mHeadModel = "meshes\\" + store.get().find("WerewolfHead")->mModel; + mHairModel = "meshes\\" + store.get().find("WerewolfHair")->mModel; + } mBodyPrefix = "b_n_" + mNpc->mRace; Misc::StringUtils::toLower(mBodyPrefix); bool isBeast = (race->mData.mFlags & ESM::Race::Beast) != 0; std::string smodel = (viewMode != VM_FirstPerson) ? - (!isBeast ? "meshes\\base_anim.nif" : "meshes\\base_animkna.nif") : - (!isBeast ? "meshes\\base_anim.1st.nif" : "meshes\\base_animkna.1st.nif") ; + (!isWerewolf ? (!isBeast ? "meshes\\base_anim.nif" + : "meshes\\base_animkna.nif") + : "meshes\\wolf\\skin.nif") : + (!isWerewolf ? (!isBeast ? "meshes\\base_anim.1st.nif" + : "meshes\\base_animkna.1st.nif") + : "meshes\\wolf\\skin.1st.nif"); setObjectRoot(smodel, true); if(mViewMode != VM_FirstPerson) @@ -142,33 +156,60 @@ void NpcAnimation::setViewMode(NpcAnimation::ViewMode viewMode) const MWWorld::ESMStore &store = MWBase::Environment::get().getWorld()->getStore(); const ESM::Race *race = store.get().find(mNpc->mRace); + bool isWerewolf = MWWorld::Class::get(mPtr).getNpcStats(mPtr).isWerewolf(); + + if(!isWerewolf) + { + mHeadModel = "meshes\\" + store.get().find(mNpc->mHead)->mModel; + mHairModel = "meshes\\" + store.get().find(mNpc->mHair)->mModel; + } + else + { + mHeadModel = "meshes\\" + store.get().find("WerewolfHead")->mModel; + mHairModel = "meshes\\" + store.get().find("WerewolfHair")->mModel; + } + + mBodyPrefix = "b_n_" + mNpc->mRace; + Misc::StringUtils::toLower(mBodyPrefix); bool isBeast = (race->mData.mFlags & ESM::Race::Beast) != 0; std::string smodel = (viewMode != VM_FirstPerson) ? - (!isBeast ? "meshes\\base_anim.nif" : "meshes\\base_animkna.nif") : - (!isBeast ? "meshes\\base_anim.1st.nif" : "meshes\\base_animkna.1st.nif") ; + (!isWerewolf ? !isBeast ? "meshes\\base_anim.nif" + : "meshes\\base_animkna.nif" + : "meshes\\wolf\\skin.nif") : + (!isWerewolf ? !isBeast ? "meshes\\base_anim.1st.nif" + : "meshes\\base_animkna.1st.nif" + : "meshes\\wolf\\skin.1st.nif"); setObjectRoot(smodel, true); if(mViewMode != VM_FirstPerson) { addAnimSource(smodel); - if(mBodyPrefix.find("argonian") != std::string::npos) - addAnimSource("meshes\\argonian_swimkna.nif"); - else if(!mNpc->isMale() && !isBeast) - addAnimSource("meshes\\base_anim_female.nif"); - if(mNpc->mModel.length() > 0) - addAnimSource("meshes\\"+mNpc->mModel); + if(!isWerewolf) + { + if(mBodyPrefix.find("argonian") != std::string::npos) + addAnimSource("meshes\\argonian_swimkna.nif"); + else if(!mNpc->isMale() && !isBeast) + addAnimSource("meshes\\base_anim_female.nif"); + if(mNpc->mModel.length() > 0) + addAnimSource("meshes\\"+mNpc->mModel); + } } else { - /* A bit counter-intuitive, but unlike third-person anims, it seems - * beast races get both base_anim.1st.nif and base_animkna.1st.nif. - */ - addAnimSource("meshes\\base_anim.1st.nif"); - if(isBeast) - addAnimSource("meshes\\base_animkna.1st.nif"); - if(!mNpc->isMale() && !isBeast) - addAnimSource("meshes\\base_anim_female.1st.nif"); + if(isWerewolf) + addAnimSource(smodel); + else + { + /* A bit counter-intuitive, but unlike third-person anims, it seems + * beast races get both base_anim.1st.nif and base_animkna.1st.nif. + */ + addAnimSource("meshes\\base_anim.1st.nif"); + if(isBeast) + addAnimSource("meshes\\base_animkna.1st.nif"); + if(!mNpc->isMale() && !isBeast) + addAnimSource("meshes\\base_anim_female.1st.nif"); + } } MWBase::Environment::get().getMechanicsManager()->forceStateUpdate(mPtr);