diff --git a/CHANGELOG.md b/CHANGELOG.md index 749d62ad6e..82624d1203 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Bug #5714: Touch spells cast using ExplodeSpell don't always explode Bug #5977: Fatigueless NPCs' corpse underwater changes animation on game load Bug #6427: Enemy health bar disappears before damaging effect ends + Bug #6645: Enemy block sounds align with animation instead of blocked hits Bug #6661: Saved games that have no preview screenshot cause issues or crashes Bug #6939: OpenMW-CS: ID columns are too short Bug #6949: Sun Damage effect doesn't work in quasi exteriors diff --git a/apps/openmw/mwclass/creature.cpp b/apps/openmw/mwclass/creature.cpp index c53276443a..4927328335 100644 --- a/apps/openmw/mwclass/creature.cpp +++ b/apps/openmw/mwclass/creature.cpp @@ -355,7 +355,10 @@ namespace MWClass MWMechanics::applyElementalShields(ptr, victim); if (MWMechanics::blockMeleeAttack(ptr, victim, weapon, damage, attackStrength)) + { damage = 0; + block(ptr); + } MWMechanics::diseaseContact(victim, ptr); diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index bfb64d974d..dd6272ec2f 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -700,7 +700,10 @@ namespace MWClass MWMechanics::applyElementalShields(ptr, victim); if (MWMechanics::blockMeleeAttack(ptr, victim, weapon, damage, attackStrength)) + { damage = 0; + block(ptr); + } if (victim == MWMechanics::getPlayer() && MWBase::Environment::get().getWorld()->getGodModeState()) damage = 0; diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 14fb583238..ba178c77d5 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -385,9 +385,17 @@ namespace MWMechanics bool knockout = stats.getFatigue().getCurrent() < 0 || stats.getFatigue().getBase() == 0; bool recovery = stats.getHitRecovery(); bool knockdown = stats.getKnockedDown(); - bool block = stats.getBlock(); + bool block = stats.getBlock() && !knockout && !recovery && !knockdown; bool isSwimming = world->isSwimming(mPtr); + stats.setBlock(false); + + if (mPtr == getPlayer() && mHitState == CharState_Block && block) + { + mHitState = CharState_None; + resetCurrentIdleState(); + } + if (mHitState != CharState_None) { if (!mAnimation->isPlaying(mCurrentHit)) @@ -396,7 +404,6 @@ namespace MWMechanics mCurrentHit.clear(); stats.setKnockedDown(false); stats.setHitRecovery(false); - stats.setBlock(false); resetCurrentIdleState(); } else if (isKnockedOut()) @@ -451,7 +458,6 @@ namespace MWMechanics mCurrentHit.clear(); stats.setKnockedDown(false); stats.setHitRecovery(false); - stats.setBlock(false); resetCurrentIdleState(); return; } @@ -1145,8 +1151,6 @@ namespace MWMechanics mCastingManualSpell = false; mCanCast = false; } - else if (groupname == "shield" && action == "block hit") - charClass.block(mPtr); else if (groupname == "containeropen" && action == "loot") MWBase::Environment::get().getWindowManager()->pushGuiMode(MWGui::GM_Container, mPtr); }