From 80d8aa4030f771b48fc612c4716a0e891d5fe12a Mon Sep 17 00:00:00 2001 From: mrcheko Date: Thu, 30 Jan 2014 23:54:26 +0200 Subject: [PATCH 1/4] bug with sequence of knockouts; giving sense to some hit state code --- apps/openmw/mwmechanics/character.cpp | 1 + apps/openmw/mwmechanics/creaturestats.cpp | 3 +++ 2 files changed, 4 insertions(+) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index a54f2365d..252271d32 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -764,6 +764,7 @@ bool CharacterController::updateWeaponState() //commenting out following 2 lines will give a bit different combat dynamics(slower) mHitState = CharState_None; mCurrentHit.clear(); + mPtr.getClass().getCreatureStats(mPtr).setHitRecovery(false); } } else if(mUpperBodyState == UpperCharState_UnEquipingWeap) diff --git a/apps/openmw/mwmechanics/creaturestats.cpp b/apps/openmw/mwmechanics/creaturestats.cpp index 30db59311..943c13a18 100644 --- a/apps/openmw/mwmechanics/creaturestats.cpp +++ b/apps/openmw/mwmechanics/creaturestats.cpp @@ -209,7 +209,10 @@ namespace MWMechanics mDynamic[index] = value; if (index == 2 && value.getCurrent() < 0) + { setKnockedDown(true); + mDynamic[2].setCurrent(0); + } if (index==0 && mDynamic[index].getCurrent()<1) { From b85a4dd35e595ec0dd29f5354348ae95244ff2f9 Mon Sep 17 00:00:00 2001 From: mrcheko Date: Sun, 2 Feb 2014 15:01:49 +0200 Subject: [PATCH 2/4] pos accum without conformity with animation bug/creature speed --- apps/openmw/mwmechanics/character.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 252271d32..eff48ca08 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -301,8 +301,9 @@ void CharacterController::refreshCurrentAnims(CharacterState idle, CharacterStat if(!mCurrentMovement.empty()) { float vel, speedmult = 1.0f; - if(mMovementSpeed > 0.0f && (vel=mAnimation->getVelocity(mCurrentMovement)) > 1.0f) + if(mPtr.getClass().isNpc() && mMovementSpeed > 0.0f && (vel=mAnimation->getVelocity(mCurrentMovement)) > 1.0f) speedmult = mMovementSpeed / vel; + mAnimation->play(mCurrentMovement, Priority_Movement, movegroup, false, speedmult, ((mode!=2)?"start":"loop start"), "stop", 0.0f, ~0ul); } @@ -1120,7 +1121,13 @@ void CharacterController::update(float duration) else //avoid z-rotating for knockdown world->rotateObject(mPtr, rot.x, rot.y, 0.0f, true); - world->queueMovement(mPtr, vec); + // all actual movement in 3rd person controlled by animations, except for jump + // !mAnimation->hasAnimation("death1") identifies 1st person mode + if(mJumpState != JumpState_None || vec.z > 0 + || (mPtr.getRefData().getHandle() == "player" && !mAnimation->hasAnimation("death1"))) + { + world->queueMovement(mPtr, vec); + } } movement = vec; From 761f13d3cef95cf2dcdba32b0da3b047157e9aa2 Mon Sep 17 00:00:00 2001 From: mrcheko Date: Sun, 2 Feb 2014 16:29:51 +0200 Subject: [PATCH 3/4] activate whole-body attack animations --- apps/openmw/mwmechanics/character.cpp | 23 +++++++++++++++++++++++ apps/openmw/mwrender/animation.cpp | 5 ++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index eff48ca08..6c1a40249 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -781,6 +781,13 @@ bool CharacterController::updateWeaponState() stop = mAttackType+" max attack"; mUpperBodyState = UpperCharState_MinAttackToMaxAttack; break; + case UpperCharState_MinAttackToMaxAttack: + //hack to avoid body pos desync when jumping/sneaking in 'max attack' state + if(!mAnimation->isPlaying(mCurrentWeapon)) + mAnimation->play(mCurrentWeapon, Priority_Weapon, + MWRender::Animation::Group_UpperBody, false, + 0, mAttackType+" min attack", mAttackType+" max attack", 0.999f, 0); + break; case UpperCharState_MaxAttackToMinHit: if(mAttackType == "shoot") { @@ -830,6 +837,22 @@ bool CharacterController::updateWeaponState() } } + //if playing combat animation and lowerbody is not busy switch to whole body animation + if((weaptype != WeapType_None || UpperCharState_UnEquipingWeap) && animPlaying) + { + if( mMovementState != CharState_None || + mJumpState != JumpState_None || + mHitState != CharState_None || + MWBase::Environment::get().getWorld()->isSwimming(mPtr) || + cls.getCreatureStats(mPtr).getMovementFlag(CreatureStats::Flag_Sneak)) + { + mAnimation->changeGroups(mCurrentWeapon, MWRender::Animation::Group_UpperBody); + } + else + { + mAnimation->changeGroups(mCurrentWeapon, MWRender::Animation::Group_All); + } + } MWWorld::ContainerStoreIterator torch = inv.getSlot(MWWorld::InventoryStore::Slot_CarriedLeft); if(torch != inv.end() && torch->getTypeName() == typeid(ESM::Light).name() diff --git a/apps/openmw/mwrender/animation.cpp b/apps/openmw/mwrender/animation.cpp index 3f45ce769..c62515c8c 100644 --- a/apps/openmw/mwrender/animation.cpp +++ b/apps/openmw/mwrender/animation.cpp @@ -1050,9 +1050,8 @@ bool Animation::allowSwitchViewMode() const { for (AnimStateMap::const_iterator stateiter = mStates.begin(); stateiter != mStates.end(); ++stateiter) { - if(stateiter->second.mGroups == Group_UpperBody - || (stateiter->first.size()==4 && stateiter->first.find("hit") != std::string::npos) - || (stateiter->first.find("knock") != std::string::npos) ) + if(stateiter->second.mPriority > MWMechanics::Priority_Movement + && stateiter->second.mPriority < MWMechanics::Priority_Torch) return false; } return true; From 688f359a333420753dd5fc1a6341b55d8edb7519 Mon Sep 17 00:00:00 2001 From: mrcheko Date: Mon, 3 Feb 2014 23:09:26 +0200 Subject: [PATCH 4/4] discard creatures speed and negative fatique changes --- apps/openmw/mwmechanics/character.cpp | 2 +- apps/openmw/mwmechanics/creaturestats.cpp | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 6c1a40249..7647a940e 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -301,7 +301,7 @@ void CharacterController::refreshCurrentAnims(CharacterState idle, CharacterStat if(!mCurrentMovement.empty()) { float vel, speedmult = 1.0f; - if(mPtr.getClass().isNpc() && mMovementSpeed > 0.0f && (vel=mAnimation->getVelocity(mCurrentMovement)) > 1.0f) + if(mMovementSpeed > 0.0f && (vel=mAnimation->getVelocity(mCurrentMovement)) > 1.0f) speedmult = mMovementSpeed / vel; mAnimation->play(mCurrentMovement, Priority_Movement, movegroup, false, diff --git a/apps/openmw/mwmechanics/creaturestats.cpp b/apps/openmw/mwmechanics/creaturestats.cpp index 943c13a18..30db59311 100644 --- a/apps/openmw/mwmechanics/creaturestats.cpp +++ b/apps/openmw/mwmechanics/creaturestats.cpp @@ -209,10 +209,7 @@ namespace MWMechanics mDynamic[index] = value; if (index == 2 && value.getCurrent() < 0) - { setKnockedDown(true); - mDynamic[2].setCurrent(0); - } if (index==0 && mDynamic[index].getCurrent()<1) {