[Pets] A bit better decoupling of the movement speeds of pet and its master.
This commit is contained in:
parent
33289aca91
commit
db7da781a2
@ -2056,3 +2056,77 @@ void Pet::ApplyModeFlags(PetModeFlags mode, bool apply)
|
|||||||
data << uint32(m_petModeFlags);
|
data << uint32(m_petModeFlags);
|
||||||
((Player*)owner)->GetSession()->SendPacket(&data);
|
((Player*)owner)->GetSession()->SendPacket(&data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Pet::UpdateSpeed(UnitMoveType mtype, bool forced, float ratio)
|
||||||
|
{
|
||||||
|
Unit* unitOwner = GetOwner();
|
||||||
|
Player *owner = unitOwner ? unitOwner->ToPlayer() : NULL;
|
||||||
|
if (!owner)
|
||||||
|
return Unit::UpdateSpeed(mtype, forced, ratio); // NPC pets are usual creatures
|
||||||
|
|
||||||
|
int32 main_speed_mod = 0;
|
||||||
|
float stack_bonus = 1.0f;
|
||||||
|
float non_stack_bonus = 1.0f;
|
||||||
|
|
||||||
|
switch (mtype)
|
||||||
|
{
|
||||||
|
case MOVE_WALK:
|
||||||
|
break;
|
||||||
|
case MOVE_RUN:
|
||||||
|
{
|
||||||
|
main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_SPEED);
|
||||||
|
stack_bonus = GetTotalAuraMultiplier(SPELL_AURA_MOD_SPEED_ALWAYS);
|
||||||
|
non_stack_bonus = (100.0f + GetMaxPositiveAuraModifier(SPELL_AURA_MOD_SPEED_NOT_STACK)) / 100.0f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MOVE_RUN_BACK:
|
||||||
|
return;
|
||||||
|
case MOVE_SWIM:
|
||||||
|
{
|
||||||
|
main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_SWIM_SPEED);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case MOVE_SWIM_BACK:
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
sLog.outError("Pet::UpdateSpeed: Unsupported move type (%d)", mtype);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float bonus = non_stack_bonus > stack_bonus ? non_stack_bonus : stack_bonus;
|
||||||
|
if (owner->IsMounted())
|
||||||
|
bonus = owner->GetSpeedRate(mtype); //for mounted player, base speed of pet is the same
|
||||||
|
|
||||||
|
// now we ready for speed calculation
|
||||||
|
float speed = main_speed_mod ? bonus * (100.0f + main_speed_mod) / 100.0f : bonus;
|
||||||
|
|
||||||
|
switch (mtype)
|
||||||
|
{
|
||||||
|
case MOVE_RUN:
|
||||||
|
case MOVE_SWIM:
|
||||||
|
{
|
||||||
|
// 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 / baseMoveSpeed[mtype];
|
||||||
|
if (speed > max_speed)
|
||||||
|
{ speed = max_speed; }
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply strongest slow aura mod to speed
|
||||||
|
int32 slow = GetMaxNegativeAuraModifier(SPELL_AURA_MOD_DECREASE_SPEED);
|
||||||
|
if (slow)
|
||||||
|
{ speed *= (100.0f + slow) / 100.0f; }
|
||||||
|
|
||||||
|
if (mtype == MOVE_RUN)
|
||||||
|
speed *= 1.14286f;
|
||||||
|
|
||||||
|
SetSpeedRate(mtype, speed * ratio, forced);
|
||||||
|
}
|
||||||
|
@ -228,6 +228,7 @@ class Pet : public Creature
|
|||||||
void UpdateMaxPower(Powers power) override;
|
void UpdateMaxPower(Powers power) override;
|
||||||
void UpdateAttackPowerAndDamage(bool ranged = false) override;
|
void UpdateAttackPowerAndDamage(bool ranged = false) override;
|
||||||
void UpdateDamagePhysical(WeaponAttackType attType) override;
|
void UpdateDamagePhysical(WeaponAttackType attType) override;
|
||||||
|
void UpdateSpeed(UnitMoveType mtype, bool forced, float ratio = 1.0f) override;
|
||||||
|
|
||||||
bool CanTakeMoreActiveSpells(uint32 SpellIconID);
|
bool CanTakeMoreActiveSpells(uint32 SpellIconID);
|
||||||
void ToggleAutocast(uint32 spellid, bool apply);
|
void ToggleAutocast(uint32 spellid, bool apply);
|
||||||
|
@ -6873,25 +6873,6 @@ bool Unit::CanDetectInvisibilityOf(Unit const* u) const
|
|||||||
|
|
||||||
void Unit::UpdateSpeed(UnitMoveType mtype, bool forced, float ratio)
|
void Unit::UpdateSpeed(UnitMoveType mtype, bool forced, float ratio)
|
||||||
{
|
{
|
||||||
// not in combat pet have same speed as owner
|
|
||||||
//switch (mtype)
|
|
||||||
//{
|
|
||||||
// case MOVE_RUN:
|
|
||||||
// case MOVE_WALK:
|
|
||||||
// case MOVE_SWIM:
|
|
||||||
// if (GetTypeId() == TYPEID_UNIT && ((Creature*)this)->IsPet() && hasUnitState(UNIT_STAT_FOLLOW))
|
|
||||||
// {
|
|
||||||
// if (Unit* owner = GetOwner())
|
|
||||||
// {
|
|
||||||
// SetSpeedRate(mtype, owner->GetSpeedRate(mtype), forced);
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// break;
|
|
||||||
//}
|
|
||||||
|
|
||||||
int32 main_speed_mod = 0;
|
int32 main_speed_mod = 0;
|
||||||
float stack_bonus = 1.0f;
|
float stack_bonus = 1.0f;
|
||||||
float non_stack_bonus = 1.0f;
|
float non_stack_bonus = 1.0f;
|
||||||
@ -6901,7 +6882,6 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced, float ratio)
|
|||||||
case MOVE_WALK:
|
case MOVE_WALK:
|
||||||
break;
|
break;
|
||||||
case MOVE_RUN:
|
case MOVE_RUN:
|
||||||
{
|
|
||||||
if (IsMounted()) // Use on mount auras
|
if (IsMounted()) // Use on mount auras
|
||||||
{
|
{
|
||||||
main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED);
|
main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED);
|
||||||
@ -6915,14 +6895,11 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced, float ratio)
|
|||||||
non_stack_bonus = (100.0f + GetMaxPositiveAuraModifier(SPELL_AURA_MOD_SPEED_NOT_STACK)) / 100.0f;
|
non_stack_bonus = (100.0f + GetMaxPositiveAuraModifier(SPELL_AURA_MOD_SPEED_NOT_STACK)) / 100.0f;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case MOVE_RUN_BACK:
|
case MOVE_RUN_BACK:
|
||||||
return;
|
return;
|
||||||
case MOVE_SWIM:
|
case MOVE_SWIM:
|
||||||
{
|
|
||||||
main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_SWIM_SPEED);
|
main_speed_mod = GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_SWIM_SPEED);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case MOVE_SWIM_BACK:
|
case MOVE_SWIM_BACK:
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
@ -6938,7 +6915,6 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced, float ratio)
|
|||||||
{
|
{
|
||||||
case MOVE_RUN:
|
case MOVE_RUN:
|
||||||
case MOVE_SWIM:
|
case MOVE_SWIM:
|
||||||
{
|
|
||||||
// Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
|
// Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
|
||||||
// TODO: possible affect only on MOVE_RUN
|
// TODO: possible affect only on MOVE_RUN
|
||||||
if (int32 normalization = GetMaxPositiveAuraModifier(SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED))
|
if (int32 normalization = GetMaxPositiveAuraModifier(SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED))
|
||||||
@ -6949,7 +6925,6 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced, float ratio)
|
|||||||
{ speed = max_speed; }
|
{ speed = max_speed; }
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -3596,7 +3596,7 @@ class Unit : public WorldObject
|
|||||||
void CalculateDamageAbsorbAndResist(Unit* pCaster, SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32* absorb, uint32* resist, bool canReflect = false);
|
void CalculateDamageAbsorbAndResist(Unit* pCaster, SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32* absorb, uint32* resist, bool canReflect = false);
|
||||||
void CalculateAbsorbResistBlock(Unit* pCaster, SpellNonMeleeDamage* damageInfo, SpellEntry const* spellProto, WeaponAttackType attType = BASE_ATTACK);
|
void CalculateAbsorbResistBlock(Unit* pCaster, SpellNonMeleeDamage* damageInfo, SpellEntry const* spellProto, WeaponAttackType attType = BASE_ATTACK);
|
||||||
|
|
||||||
void UpdateSpeed(UnitMoveType mtype, bool forced, float ratio = 1.0f);
|
virtual void UpdateSpeed(UnitMoveType mtype, bool forced, float ratio = 1.0f);
|
||||||
float GetSpeed(UnitMoveType mtype) const;
|
float GetSpeed(UnitMoveType mtype) const;
|
||||||
float GetSpeedRate(UnitMoveType mtype) const { return m_speed_rate[mtype]; }
|
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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user