diff --git a/Source/Game/Entities/Unit/Unit.cs b/Source/Game/Entities/Unit/Unit.cs index c99d60911..7157eef8f 100644 --- a/Source/Game/Entities/Unit/Unit.cs +++ b/Source/Game/Entities/Unit/Unit.cs @@ -181,6 +181,7 @@ namespace Game.Entities UpdateSplineMovement(diff); GetMotionMaster().UpdateMotion(diff); + UpdateUnderwaterState(GetMap(), GetPositionX(), GetPositionY(), GetPositionZ()); } void _UpdateSpells(uint diff) { diff --git a/Source/Game/Movement/MotionMaster.cs b/Source/Game/Movement/MotionMaster.cs index 536b50d08..627ed9b75 100644 --- a/Source/Game/Movement/MotionMaster.cs +++ b/Source/Game/Movement/MotionMaster.cs @@ -81,35 +81,14 @@ namespace Game.Movement Contract.Assert(!empty()); _cleanFlag |= MMCleanFlag.Update; - if (!top().Update(_owner, diff)) - { - _cleanFlag &= ~MMCleanFlag.Update; + bool isMoveGenUpdateSuccess = top().Update(_owner, diff); + _cleanFlag &= ~MMCleanFlag.Update; + + if (!isMoveGenUpdateSuccess) MovementExpired(); - } - else - _cleanFlag &= ~MMCleanFlag.Update; if (_expireList != null) - { - for (int i = 0; i < _expireList.Count; ++i) - { - IMovementGenerator mg = _expireList[i]; - DirectDelete(mg); - } - - _expireList = null; - - if (empty()) - Initialize(); - else if (NeedInitTop()) - InitTop(); - else if (Convert.ToBoolean(_cleanFlag & MMCleanFlag.Reset)) - top().Reset(_owner); - - _cleanFlag &= ~MMCleanFlag.Reset; - } - - _owner.UpdateUnderwaterState(_owner.GetMap(), _owner.GetPositionX(), _owner.GetPositionY(), _owner.GetPositionZ()); + ClearExpireList(); } public void Clear(bool reset = true) @@ -126,6 +105,26 @@ namespace Game.Movement DirectClean(reset); } + void ClearExpireList() + { + for (int i = 0; i < _expireList.Count; ++i) + { + IMovementGenerator mg = _expireList[i]; + DirectDelete(mg); + } + + _expireList = null; + + if (empty()) + Initialize(); + else if (NeedInitTop()) + InitTop(); + else if (Convert.ToBoolean(_cleanFlag & MMCleanFlag.Reset)) + top().Reset(_owner); + + _cleanFlag &= ~MMCleanFlag.Reset; + } + public void MovementExpired(bool reset = true) { if (Convert.ToBoolean(_cleanFlag & MMCleanFlag.Update))