Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void Unit::UpdateSpeed(UnitMoveType mtype, bool forced, bool hardForced)
- {
- int32 main_speed_mod = 0;
- float stack_bonus = 1.0f;
- float non_stack_bonus = 1.0f;
- switch (mtype)
- {
- // Only apply debuffs
- case MOVE_FLIGHT_BACK:
- case MOVE_RUN_BACK:
- case MOVE_SWIM_BACK:
- break;
- case MOVE_WALK:
- case MOVE_RUN:
- {
- if (IsMounted()) // Use on mount auras
- {
- main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED);
- stack_bonus = GetTotalAuraMultiplier(SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS);
- non_stack_bonus += GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK) / 100.0f;
- }
- else
- {
- main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_SPEED);
- stack_bonus = GetTotalAuraMultiplier(SPELL_AURA_MOD_SPEED_ALWAYS);
- non_stack_bonus += GetMaxPositiveAuraModifier(SPELL_AURA_MOD_SPEED_NOT_STACK) / 100.0f;
- }
- break;
- }
- case MOVE_SWIM:
- {
- main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_SWIM_SPEED);
- break;
- }
- case MOVE_FLIGHT:
- {
- if (GetTypeId() == TYPEID_UNIT && IsControlledByPlayer()) // not sure if good for pet
- {
- main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED);
- stack_bonus = GetTotalAuraMultiplier(SPELL_AURA_MOD_VEHICLE_SPEED_ALWAYS);
- // for some spells this mod is applied on vehicle owner
- int32 owner_speed_mod = 0;
- if (Unit* owner = GetCharmer())
- owner_speed_mod = owner->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED);
- main_speed_mod = std::max(main_speed_mod, owner_speed_mod);
- }
- else if (IsMounted())
- {
- main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED);
- stack_bonus = GetTotalAuraMultiplier(SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS);
- }
- else // Use not mount (shapeshift for example) auras (should stack)
- main_speed_mod = GetTotalAuraModifier(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED) + GetTotalAuraModifier(SPELL_AURA_MOD_INCREASE_VEHICLE_FLIGHT_SPEED);
- non_stack_bonus += GetMaxPositiveAuraModifier(SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK) / 100.0f;
- // Update speed for vehicle if available
- if (GetTypeId() == TYPEID_PLAYER && GetVehicleBase())
- GetVehicleBase()->UpdateSpeed(MOVE_FLIGHT, true);
- break;
- }
- default:
- TC_LOG_ERROR("entities.unit", "Unit::UpdateSpeed: Unsupported move type (%d)", mtype);
- return;
- }
- // now we ready for speed calculation
- float speed = std::max(non_stack_bonus, stack_bonus);
- if (main_speed_mod)
- AddPct(speed, main_speed_mod);
- switch (mtype)
- {
- case MOVE_RUN:
- case MOVE_SWIM:
- case MOVE_FLIGHT:
- {
- if (GetTypeId() == TYPEID_PLAYER)
- {
- Guardian* pet = this->GetGuardianPet();
- if (pet)
- pet->UpdateSpeed(mtype, this->GetSpeed(mtype));
- }
- // Set creature speed rate
- if (GetTypeId() == TYPEID_UNIT)
- {
- Unit* pOwner = GetCharmerOrOwner();
- if ((isPet() || isGuardian()) && !isInCombat() && pOwner) // Must check for owner or crash on "Tame Beast"
- {
- // For every yard over 5, increase speed by 0.01
- // to help prevent pet from lagging behind and despawning
- float dist = GetDistance(pOwner);
- float base_rate = 1.00f; // base speed is 100% of owner speed
- if (dist < 5)
- dist = 5;
- float mult = base_rate + ((dist - 5) * 0.01f);
- speed *= mult;
- if (pOwner->GetSpeedRate(mtype) > speed)
- speed *= pOwner->GetSpeedRate(mtype); // pets derive speed from owner when not in combat
- }
- else
- speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
- break;
- }
- break;
- }
- case MOVE_WALK:
- {
- if (GetTypeId() == TYPEID_UNIT)
- speed *= ToCreature()->GetCreatureTemplate()->speed_walk; // at this point, MOVE_WALK is never reached
- break;
- }
- default:
- break;
- }
- // for creature case, we check explicit if mob searched for assistance
- if (GetTypeId() == TYPEID_UNIT)
- {
- 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".
- }
- // Apply strongest slow aura mod to speed
- int32 slow = GetMaxNegativeAuraModifier(SPELL_AURA_MOD_DECREASE_SPEED);
- if (slow)
- {
- AddPct(speed, slow);
- if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED))
- {
- float min_speed = minSpeedMod / 100.0f;
- if (speed < min_speed)
- speed = min_speed;
- }
- }
- // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
- // TODO: possible affect only on MOVE_RUN
- if (int32 normalization = GetMaxPositiveAuraModifier(SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED))
- {
- // Use speed from aura
- float max_speed = normalization / (IsControlledByPlayer() ? playerBaseMoveSpeed[mtype] : baseMoveSpeed[mtype]);
- if (speed > max_speed)
- speed = max_speed;
- }
- if (GetTypeId() == TYPEID_PLAYER)
- {
- Guardian* pet = this->GetGuardianPet();
- if (pet)
- pet->UpdateSpeed(mtype, speed);
- }
- if (Unit* owner = GetCharmerOrOwner())
- {
- float speed = owner->GetSpeedRate(mtype);
- speed = speed;
- }
- SetSpeed(mtype, speed, forced, hardForced);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement