From 94e26af71d2176cf2e48b6dbe7f3aeee4a326550 Mon Sep 17 00:00:00 2001 From: Dramacydal Date: Mon, 17 Jun 2013 11:02:41 +0100 Subject: [PATCH] [c12646] Fix client movement freeze after map change --- src/game/Level1.cpp | 16 ++++++++-------- src/game/Player.cpp | 4 ++++ src/game/Unit.cpp | 18 +++++++++--------- src/game/Unit.h | 4 ++-- src/shared/revision_nr.h | 2 +- 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp index e9617d72c..da29764e5 100644 --- a/src/game/Level1.cpp +++ b/src/game/Level1.cpp @@ -1073,11 +1073,11 @@ bool ChatHandler::HandleModifyASpeedCommand(char* args) if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_ASPEED_CHANGED, GetNameLink().c_str(), modSpeed); - chr->UpdateSpeed(MOVE_WALK, true, modSpeed); - chr->UpdateSpeed(MOVE_RUN, true, modSpeed); - chr->UpdateSpeed(MOVE_SWIM, true, modSpeed); + chr->UpdateSpeed(MOVE_WALK, true, modSpeed, true); + chr->UpdateSpeed(MOVE_RUN, true, modSpeed, true); + chr->UpdateSpeed(MOVE_SWIM, true, modSpeed, true); // chr->UpdateSpeed(MOVE_TURN, true, modSpeed); - chr->UpdateSpeed(MOVE_FLIGHT, true, modSpeed); + chr->UpdateSpeed(MOVE_FLIGHT, true, modSpeed, true); return true; } @@ -1121,7 +1121,7 @@ bool ChatHandler::HandleModifySpeedCommand(char* args) if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_SPEED_CHANGED, GetNameLink().c_str(), modSpeed); - chr->UpdateSpeed(MOVE_RUN, true, modSpeed); + chr->UpdateSpeed(MOVE_RUN, true, modSpeed, true); return true; } @@ -1166,7 +1166,7 @@ bool ChatHandler::HandleModifySwimCommand(char* args) if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_SWIM_SPEED_CHANGED, GetNameLink().c_str(), modSpeed); - chr->UpdateSpeed(MOVE_SWIM, true, modSpeed); + chr->UpdateSpeed(MOVE_SWIM, true, modSpeed, true); return true; } @@ -1211,7 +1211,7 @@ bool ChatHandler::HandleModifyBWalkCommand(char* args) if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_BACK_SPEED_CHANGED, GetNameLink().c_str(), modSpeed); - chr->UpdateSpeed(MOVE_RUN_BACK, true, modSpeed); + chr->UpdateSpeed(MOVE_RUN_BACK, true, modSpeed, true); return true; } @@ -1247,7 +1247,7 @@ bool ChatHandler::HandleModifyFlyCommand(char* args) if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_FLY_SPEED_CHANGED, GetNameLink().c_str(), modSpeed); - chr->UpdateSpeed(MOVE_FLIGHT, true, modSpeed); + chr->UpdateSpeed(MOVE_FLIGHT, true, modSpeed, true); return true; } diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 351b433b2..1cd3361e2 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -20434,6 +20434,10 @@ void Player::SendInitialPacketsAfterAddToMap() SendAurasForTarget(this); SendEnchantmentDurations(); // must be after add to map SendItemDurations(); // must be after add to map + + UpdateSpeed(MOVE_RUN, true, 1.0f, true); + UpdateSpeed(MOVE_SWIM, true, 1.0f, true); + UpdateSpeed(MOVE_FLIGHT, true, 1.0f, true); } void Player::SendUpdateToOutOfRangeGroupMembers() diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index fb170d59d..b228033e3 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -8650,7 +8650,7 @@ bool Unit::canDetectInvisibilityOf(Unit const* u) const return false; } -void Unit::UpdateSpeed(UnitMoveType mtype, bool forced, float ratio) +void Unit::UpdateSpeed(UnitMoveType mtype, bool forced, float ratio, bool ignoreChange) { // not in combat pet have same speed as owner switch (mtype) @@ -8662,7 +8662,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced, float ratio) { if (Unit* owner = GetOwner()) { - SetSpeedRate(mtype, owner->GetSpeedRate(mtype), forced); + SetSpeedRate(mtype, owner->GetSpeedRate(mtype), forced, ignoreChange); return; } } @@ -8790,7 +8790,7 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced, float ratio) } } - SetSpeedRate(mtype, speed * ratio, forced); + SetSpeedRate(mtype, speed * ratio, forced, ignoreChange); } float Unit::GetSpeed(UnitMoveType mtype) const @@ -8800,19 +8800,19 @@ float Unit::GetSpeed(UnitMoveType mtype) const struct SetSpeedRateHelper { - explicit SetSpeedRateHelper(UnitMoveType _mtype, bool _forced) : mtype(_mtype), forced(_forced) {} - void operator()(Unit* unit) const { unit->UpdateSpeed(mtype, forced); } + explicit SetSpeedRateHelper(UnitMoveType _mtype, bool _forced, bool _ignoreChange) : mtype(_mtype), forced(_forced), ignoreChange(_ignoreChange) {} + void operator()(Unit* unit) const { unit->UpdateSpeed(mtype, forced, 1.0f, ignoreChange); } UnitMoveType mtype; - bool forced; + bool forced, ignoreChange; }; -void Unit::SetSpeedRate(UnitMoveType mtype, float rate, bool forced) +void Unit::SetSpeedRate(UnitMoveType mtype, float rate, bool forced, bool ignoreChange) { if (rate < 0) rate = 0.0f; // Update speed only on change - if (m_speed_rate[mtype] != rate) + if (m_speed_rate[mtype] != rate || ignoreChange) { m_speed_rate[mtype] = rate; propagateSpeedChange(); @@ -9023,7 +9023,7 @@ void Unit::SetSpeedRate(UnitMoveType mtype, float rate, bool forced) SendMessageToSet(&data, false); } - CallForAllControlledUnits(SetSpeedRateHelper(mtype, forced), CONTROLLED_PET | CONTROLLED_GUARDIANS | CONTROLLED_CHARM | CONTROLLED_MINIPET); + CallForAllControlledUnits(SetSpeedRateHelper(mtype, forced, ignoreChange), CONTROLLED_PET | CONTROLLED_GUARDIANS | CONTROLLED_CHARM | CONTROLLED_MINIPET); } void Unit::SetDeathState(DeathState s) diff --git a/src/game/Unit.h b/src/game/Unit.h index 7f48f7879..e8e449be0 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1896,10 +1896,10 @@ class MANGOS_DLL_SPEC Unit : public WorldObject void CalculateAbsorbResistBlock(Unit* pCaster, SpellNonMeleeDamage* damageInfo, SpellEntry const* spellProto, WeaponAttackType attType = BASE_ATTACK); void CalculateHealAbsorb(uint32 heal, uint32* absorb); - void UpdateSpeed(UnitMoveType mtype, bool forced, float ratio = 1.0f); + void UpdateSpeed(UnitMoveType mtype, bool forced, float ratio = 1.0f, bool ignoreChange = false); float GetSpeed(UnitMoveType mtype) const; float GetSpeedRate(UnitMoveType mtype) const { return m_speed_rate[mtype]; } - void SetSpeedRate(UnitMoveType mtype, float rate, bool forced = false); + void SetSpeedRate(UnitMoveType mtype, float rate, bool forced = false, bool ignoreChange = false); void KnockBackFrom(Unit* target, float horizontalSpeed, float verticalSpeed); void KnockBackWithAngle(float angle, float horizontalSpeed, float verticalSpeed); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index aca03eda4..9535492a1 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "12645" + #define REVISION_NR "12646" #endif // __REVISION_NR_H__