diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index d44965baa..dc7b8f5ba 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1805,7 +1805,6 @@ void Creature::setDeathState(DeathState s, bool despawn) if (HasSearchedAssistance()) { SetNoSearchAssistance(false); - UpdateSpeed(MOVE_RUN, false); } //Dismiss group if is leader diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index d0a387240..d33c1c040 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -9773,7 +9773,6 @@ bool Unit::AttackStop() if (creature->HasSearchedAssistance()) { creature->SetNoSearchAssistance(false); - UpdateSpeed(MOVE_RUN, false); } } @@ -13496,11 +13495,23 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) break; } - // for creature case, we check explicit if mob searched for assistance - if (GetTypeId() == TYPEID_UNIT) + int32 slowFromHealth = 0; + Creature* creature = ToCreature(); + // ignore pets, player owned vehicles, and mobs immune to snare + if (creature + && !IsPet() + && !(IsControlledByPlayer() && IsVehicle()) + && !(creature->HasMechanicTemplateImmunity(MECHANIC_SNARE)) + && !(creature->IsDungeonBoss())) { - if (ToCreature()->HasSearchedAssistance()) - speed *= 0.66f; // best guessed value, so this will be 33% reduction. Based off initial speed, mob can then "run", "walk fast" or "walk". + // 1.6% for each % under 30. + // use min(0, health-30) so that we don't boost mobs above 30. + slowFromHealth = (int32) std::min(0.0f, (1.66f * (GetHealthPct() - 30.0f))); + } + + if (slowFromHealth) + { + AddPct(speed, slowFromHealth); } // Apply strongest slow aura mod to speed @@ -14566,8 +14577,16 @@ void Unit::SetHealth(uint32 val) val = maxHealth; } + float prevHealthPct = GetHealthPct(); + SetUInt32Value(UNIT_FIELD_HEALTH, val); + // mobs that are now or were below 30% need to update their speed + if (GetTypeId() == TYPEID_UNIT && (prevHealthPct < 30.0 || HealthBelowPct(30))) + { + UpdateSpeed(MOVE_RUN, false); + } + // group update if (GetTypeId() == TYPEID_PLAYER) { diff --git a/src/server/game/Movement/Spline/MoveSplineInit.cpp b/src/server/game/Movement/Spline/MoveSplineInit.cpp index 1f722f2cb..d73c097bc 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.cpp +++ b/src/server/game/Movement/Spline/MoveSplineInit.cpp @@ -115,9 +115,6 @@ namespace Movement moveFlagsForSpeed &= ~MOVEMENTFLAG_WALKING; args.velocity = unit->GetSpeed(SelectSpeedType(moveFlagsForSpeed)); - if (Creature* creature = unit->ToCreature()) - if (creature->HasSearchedAssistance()) - args.velocity *= 0.66f; } // limit the speed in the same way the client does