mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 07:56:38 +00:00 
			
		
		
		
	improved, added knockdown after falling
This commit is contained in:
		
							parent
							
								
									d6345bce91
								
							
						
					
					
						commit
						a8fb1ae51c
					
				
					 2 changed files with 14 additions and 14 deletions
				
			
		|  | @ -166,7 +166,6 @@ void CharacterController::refreshCurrentAnims(CharacterState idle, CharacterStat | ||||||
|          |          | ||||||
|         if(!mAnimation->isPlaying(mCurrentHit)) |         if(!mAnimation->isPlaying(mCurrentHit)) | ||||||
|         { |         { | ||||||
|             mAnimation->disable(mCurrentHit); |  | ||||||
|             if(mJumpState != JumpState_None && !MWBase::Environment::get().getWorld()->isFlying(mPtr)  |             if(mJumpState != JumpState_None && !MWBase::Environment::get().getWorld()->isFlying(mPtr)  | ||||||
|                     && !MWBase::Environment::get().getWorld()->isSwimming(mPtr) ) |                     && !MWBase::Environment::get().getWorld()->isSwimming(mPtr) ) | ||||||
|                 mCurrentHit = "knockdown"; |                 mCurrentHit = "knockdown"; | ||||||
|  | @ -175,20 +174,13 @@ void CharacterController::refreshCurrentAnims(CharacterState idle, CharacterStat | ||||||
|                 int iHit = rand() % sHitListSize; |                 int iHit = rand() % sHitListSize; | ||||||
|                 mCurrentHit = sHitList[iHit]; |                 mCurrentHit = sHitList[iHit]; | ||||||
|             } |             } | ||||||
|             mAnimation->play(mCurrentHit, Priority_Hit, MWRender::Animation::Group_All, false, 1, "start", "stop", 0.0f, 0); |             mAnimation->play(mCurrentHit, Priority_Hit, MWRender::Animation::Group_All, true, 1, "start", "stop", 0.0f, 0); | ||||||
|             if(mUpperBodyState == UpperCharState_WeapEquiped) |  | ||||||
|                 mUpdateAfterHit = false; |  | ||||||
|             else |  | ||||||
|                 mUpdateAfterHit = true; |  | ||||||
|         } |         } | ||||||
|         return; |  | ||||||
|     } |     } | ||||||
|     else if(!mAnimation->isPlaying(mCurrentHit)) |     else if(!mAnimation->isPlaying(mCurrentHit)) | ||||||
|     { |     { | ||||||
|         mAnimation->disable(mCurrentHit); |  | ||||||
|         mCurrentHit.erase(); |         mCurrentHit.erase(); | ||||||
|         mHitState = CharState_None; |         mHitState = CharState_None; | ||||||
|         mUpdateAfterHit = true; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const WeaponInfo *weap = std::find_if(sWeaponTypeList, sWeaponTypeListEnd, FindWeaponType(mWeaponType)); |     const WeaponInfo *weap = std::find_if(sWeaponTypeList, sWeaponTypeListEnd, FindWeaponType(mWeaponType)); | ||||||
|  | @ -405,7 +397,6 @@ CharacterController::CharacterController(const MWWorld::Ptr &ptr, MWRender::Anim | ||||||
|     , mMovementSpeed(0.0f) |     , mMovementSpeed(0.0f) | ||||||
|     , mDeathState(CharState_None) |     , mDeathState(CharState_None) | ||||||
|     , mHitState(CharState_None) |     , mHitState(CharState_None) | ||||||
|     , mUpdateAfterHit(true) |  | ||||||
|     , mUpperBodyState(UpperCharState_Nothing) |     , mUpperBodyState(UpperCharState_Nothing) | ||||||
|     , mJumpState(JumpState_None) |     , mJumpState(JumpState_None) | ||||||
|     , mWeaponType(WeapType_None) |     , mWeaponType(WeapType_None) | ||||||
|  | @ -554,7 +545,7 @@ bool CharacterController::updateNpcState(bool onground, bool inwater, bool isrun | ||||||
|     bool animPlaying; |     bool animPlaying; | ||||||
|     if(stats.getAttackingOrSpell()) |     if(stats.getAttackingOrSpell()) | ||||||
|     { |     { | ||||||
|         if(mUpperBodyState == UpperCharState_WeapEquiped) |         if(mUpperBodyState == UpperCharState_WeapEquiped && mHitState == CharState_None) | ||||||
|         { |         { | ||||||
|             MWBase::Environment::get().getWorld()->breakInvisibility(mPtr); |             MWBase::Environment::get().getWorld()->breakInvisibility(mPtr); | ||||||
|             mAttackType.clear(); |             mAttackType.clear(); | ||||||
|  | @ -718,7 +709,16 @@ bool CharacterController::updateNpcState(bool onground, bool inwater, bool isrun | ||||||
|         if(mUpperBodyState == UpperCharState_EquipingWeap || |         if(mUpperBodyState == UpperCharState_EquipingWeap || | ||||||
|            mUpperBodyState == UpperCharState_FollowStartToFollowStop || |            mUpperBodyState == UpperCharState_FollowStartToFollowStop || | ||||||
|            mUpperBodyState == UpperCharState_CastingSpell) |            mUpperBodyState == UpperCharState_CastingSpell) | ||||||
|  |         { | ||||||
|             mUpperBodyState = UpperCharState_WeapEquiped; |             mUpperBodyState = UpperCharState_WeapEquiped; | ||||||
|  |             //don't allow to continue playing hit animation after actor had attacked during it
 | ||||||
|  |             if(mHitState != CharState_None)  | ||||||
|  |             { | ||||||
|  |                 mAnimation->disable(mCurrentHit); | ||||||
|  |                 mCurrentHit.clear(); | ||||||
|  |                 mHitState = CharState_None; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|         else if(mUpperBodyState == UpperCharState_UnEquipingWeap) |         else if(mUpperBodyState == UpperCharState_UnEquipingWeap) | ||||||
|             mUpperBodyState = UpperCharState_Nothing;         |             mUpperBodyState = UpperCharState_Nothing;         | ||||||
|     } |     } | ||||||
|  | @ -938,6 +938,7 @@ void CharacterController::update(float duration) | ||||||
|                 int realHealthLost = healthLost * (1.0f - 0.25 * fatigueTerm); |                 int realHealthLost = healthLost * (1.0f - 0.25 * fatigueTerm); | ||||||
|                 health.setCurrent(health.getCurrent() - realHealthLost); |                 health.setCurrent(health.getCurrent() - realHealthLost); | ||||||
|                 cls.getCreatureStats(mPtr).setHealth(health); |                 cls.getCreatureStats(mPtr).setHealth(health); | ||||||
|  |                 cls.onHit(mPtr, realHealthLost, true, MWWorld::Ptr(), MWWorld::Ptr(), true); | ||||||
| 
 | 
 | ||||||
|                 // report acrobatics progression
 |                 // report acrobatics progression
 | ||||||
|                 if (mPtr.getRefData().getHandle() == "player") |                 if (mPtr.getRefData().getHandle() == "player") | ||||||
|  | @ -1008,7 +1009,7 @@ void CharacterController::update(float duration) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if(cls.isNpc() && mUpdateAfterHit) |         if(cls.isNpc()) | ||||||
|             forcestateupdate = updateNpcState(onground, inwater, isrunning, sneak) || forcestateupdate; |             forcestateupdate = updateNpcState(onground, inwater, isrunning, sneak) || forcestateupdate; | ||||||
| 
 | 
 | ||||||
|         refreshCurrentAnims(idlestate, movestate, forcestateupdate); |         refreshCurrentAnims(idlestate, movestate, forcestateupdate); | ||||||
|  |  | ||||||
|  | @ -147,7 +147,6 @@ class CharacterController | ||||||
| 
 | 
 | ||||||
|     CharacterState mHitState; |     CharacterState mHitState; | ||||||
|     std::string mCurrentHit; |     std::string mCurrentHit; | ||||||
|     bool mUpdateAfterHit;//don't allow attack if it hadn't been started before actor got hit
 |  | ||||||
| 
 | 
 | ||||||
|     UpperBodyCharacterState mUpperBodyState; |     UpperBodyCharacterState mUpperBodyState; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue