From ea78e904a9c880fa322ec4a13bf5b1d9915ab454 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Tue, 9 Aug 2022 14:00:16 +0300 Subject: [PATCH] Merge inventory blocks in updateWeaponState --- apps/openmw/mwmechanics/character.cpp | 76 +++++++++++++-------------- 1 file changed, 36 insertions(+), 40 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index e1c71209ca..f7987db767 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -1132,6 +1132,8 @@ bool CharacterController::updateWeaponState() std::string upSoundId; std::string downSoundId; bool weaponChanged = false; + bool ammunition = true; + float weapSpeed = 1.f; if (cls.hasInventoryStore(mPtr)) { MWWorld::InventoryStore &inv = cls.getInventoryStore(mPtr); @@ -1156,6 +1158,40 @@ bool CharacterController::updateWeaponState() mWeapon = newWeapon; weaponChanged = true; } + + if (stats.getDrawState() == DrawState::Weapon && !mWeapon.isEmpty() && mWeapon.getType() == ESM::Weapon::sRecordId) + { + weapSpeed = mWeapon.get()->mBase->mData.mSpeed; + MWWorld::ConstContainerStoreIterator ammo = inv.getSlot(MWWorld::InventoryStore::Slot_Ammunition); + int ammotype = getWeaponType(mWeapon.get()->mBase->mData.mType)->mAmmoType; + if (ammotype != ESM::Weapon::None) + ammunition = ammo != inv.end() && ammo->get()->mBase->mData.mType == ammotype; + } + + // Cancel attack if we no longer have ammunition + if (!ammunition) + { + if (mUpperBodyState == UpperBodyState::AttackPreWindUp || mUpperBodyState == UpperBodyState::AttackWindUp) + { + mAnimation->disable(mCurrentWeapon); + mUpperBodyState = UpperBodyState::WeaponEquipped; + } + setAttackingOrSpell(false); + } + + MWWorld::ConstContainerStoreIterator torch = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); + if (torch != inv.end() && torch->getType() == ESM::Light::sRecordId && updateCarriedLeftVisible(mWeaponType)) + { + if (mAnimation->isPlaying("shield")) + mAnimation->disable("shield"); + + mAnimation->play("torch", Priority_Torch, MWRender::Animation::BlendMask_LeftArm, + false, 1.0f, "start", "stop", 0.0f, std::numeric_limits::max(), true); + } + else if (mAnimation->isPlaying("torch")) + { + mAnimation->disable("torch"); + } } // For biped actors, blend weapon animations with lower body animations with higher priority @@ -1314,46 +1350,6 @@ bool CharacterController::updateWeaponState() sndMgr->stopSound3D(mPtr, "WolfRun"); } - bool ammunition = true; - float weapSpeed = 1.f; - if (cls.hasInventoryStore(mPtr)) - { - MWWorld::InventoryStore &inv = cls.getInventoryStore(mPtr); - if (stats.getDrawState() == DrawState::Weapon && !mWeapon.isEmpty() && mWeapon.getType() == ESM::Weapon::sRecordId) - { - weapSpeed = mWeapon.get()->mBase->mData.mSpeed; - MWWorld::ConstContainerStoreIterator ammo = inv.getSlot(MWWorld::InventoryStore::Slot_Ammunition); - int ammotype = getWeaponType(mWeapon.get()->mBase->mData.mType)->mAmmoType; - if (ammotype != ESM::Weapon::None) - ammunition = ammo != inv.end() && ammo->get()->mBase->mData.mType == ammotype; - } - - // Cancel attack if we no longer have ammunition - if (!ammunition) - { - if (mUpperBodyState == UpperBodyState::AttackPreWindUp || mUpperBodyState == UpperBodyState::AttackWindUp) - { - mAnimation->disable(mCurrentWeapon); - mUpperBodyState = UpperBodyState::WeaponEquipped; - } - setAttackingOrSpell(false); - } - - MWWorld::ConstContainerStoreIterator torch = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); - if (torch != inv.end() && torch->getType() == ESM::Light::sRecordId && updateCarriedLeftVisible(mWeaponType)) - { - if (mAnimation->isPlaying("shield")) - mAnimation->disable("shield"); - - mAnimation->play("torch", Priority_Torch, MWRender::Animation::BlendMask_LeftArm, - false, 1.0f, "start", "stop", 0.0f, std::numeric_limits::max(), true); - } - else if (mAnimation->isPlaying("torch")) - { - mAnimation->disable("torch"); - } - } - // Combat for actors with persistent animations obviously will be buggy if (isPersistentAnimPlaying()) return forcestateupdate;