diff options
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Pet/Pet.cpp | 33 | ||||
-rw-r--r-- | src/server/game/Entities/Pet/Pet.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 8 |
7 files changed, 40 insertions, 20 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 34cf8a528c7..cbb84b3684c 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -568,7 +568,7 @@ bool Creature::InitEntry(uint32 entry, CreatureData const* data /*= nullptr*/) SetSpeedRate(MOVE_FLIGHT, 1.0f); // using 1.0 rate // Will set UNIT_FIELD_BOUNDINGRADIUS, UNIT_FIELD_COMBATREACH and UNIT_FIELD_DISPLAYSCALE - SetObjectScale(cinfo->scale); + SetObjectScale(GetNativeObjectScale()); SetHoverHeight(cinfo->HoverHeight); @@ -3144,6 +3144,11 @@ Unit* Creature::SelectNearestHostileUnitInAggroRange(bool useLOS, bool ignoreCiv return target; } +float Creature::GetNativeObjectScale() const +{ + return GetCreatureTemplate()->scale; +} + void Creature::SetObjectScale(float scale) { Unit::SetObjectScale(scale); diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index f3b084d52dd..292ecd2196f 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -73,6 +73,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma void AddToWorld() override; void RemoveFromWorld() override; + float GetNativeObjectScale() const override; void SetObjectScale(float scale) override; void SetDisplayId(uint32 displayId, float displayScale = 1.f) override; void SetDisplayFromModel(uint32 modelIdx); diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 9fd8e9eb258..25029227159 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -806,19 +806,7 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) SetBaseAttackTime(RANGED_ATTACK, BASE_ATTACK_TIME); //scale - CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cinfo->family); - if (cFamily && cFamily->MinScale > 0.0f && petType == HUNTER_PET) - { - float scale; - if (GetLevel() >= cFamily->MaxScaleLevel) - scale = cFamily->MaxScale; - else if (GetLevel() <= cFamily->MinScaleLevel) - scale = cFamily->MinScale; - else - scale = cFamily->MinScale + float(GetLevel() - cFamily->MinScaleLevel) / cFamily->MaxScaleLevel * (cFamily->MaxScale - cFamily->MinScale); - - SetObjectScale(scale); - } + SetObjectScale(GetNativeObjectScale()); // Resistance // Hunters pet should not inherit resistances from creature_template, they have separate auras for that @@ -1765,6 +1753,25 @@ Player* Pet::GetOwner() const return Minion::GetOwner()->ToPlayer(); } +float Pet::GetNativeObjectScale() const +{ + CreatureFamilyEntry const* creatureFamily = sCreatureFamilyStore.LookupEntry(GetCreatureTemplate()->family); + if (creatureFamily && creatureFamily->MinScale > 0.0f && getPetType() == HUNTER_PET) + { + float scale; + if (GetLevel() >= creatureFamily->MaxScaleLevel) + scale = creatureFamily->MaxScale; + else if (GetLevel() <= creatureFamily->MinScaleLevel) + scale = creatureFamily->MinScale; + else + scale = creatureFamily->MinScale + float(GetLevel() - creatureFamily->MinScaleLevel) / creatureFamily->MaxScaleLevel * (creatureFamily->MaxScale - creatureFamily->MinScale); + + return scale; + } + + return Guardian::GetNativeObjectScale(); +} + void Pet::SetDisplayId(uint32 modelId, float displayScale /*= 1.f*/) { Guardian::SetDisplayId(modelId, displayScale); diff --git a/src/server/game/Entities/Pet/Pet.h b/src/server/game/Entities/Pet/Pet.h index 8a6f6571105..88880884ed6 100644 --- a/src/server/game/Entities/Pet/Pet.h +++ b/src/server/game/Entities/Pet/Pet.h @@ -51,6 +51,7 @@ class TC_GAME_API Pet : public Guardian void AddToWorld() override; void RemoveFromWorld() override; + float GetNativeObjectScale() const override; void SetDisplayId(uint32 modelId, float displayScale = 1.f) override; PetType getPetType() const { return m_petType; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 9902e97bbe8..158b9d05e1f 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -9929,6 +9929,14 @@ bool Unit::IsPolymorphed() const return spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_MAGE_POLYMORPH; } +void Unit::RecalculateObjectScale() +{ + int32 scaleAuras = GetTotalAuraModifier(SPELL_AURA_MOD_SCALE) + GetTotalAuraModifier(SPELL_AURA_MOD_SCALE_2); + float scale = GetNativeObjectScale() + CalculatePct(1.0f, scaleAuras); + float scaleMin = GetTypeId() == TYPEID_PLAYER ? 0.1 : 0.01; + SetObjectScale(std::max(scale, scaleMin)); +} + void Unit::SetDisplayId(uint32 modelId, float displayScale /*= 1.f*/) { SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::DisplayID), modelId); diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 778de3299a2..d2c60b1086d 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1622,6 +1622,8 @@ class TC_GAME_API Unit : public WorldObject } void UpdateInterruptMask(); + virtual float GetNativeObjectScale() const { return 1.0f; } + virtual void RecalculateObjectScale(); uint32 GetDisplayId() const { return m_unitData->DisplayID; } virtual void SetDisplayId(uint32 modelId, float displayScale = 1.f); uint32 GetNativeDisplayId() const { return m_unitData->NativeDisplayID; } diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 1db54def277..b04f6ca4a54 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2042,16 +2042,12 @@ void AuraEffect::HandleAuraTransform(AuraApplication const* aurApp, uint8 mode, } } -void AuraEffect::HandleAuraModScale(AuraApplication const* aurApp, uint8 mode, bool apply) const +void AuraEffect::HandleAuraModScale(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const { if (!(mode & AURA_EFFECT_HANDLE_CHANGE_AMOUNT_SEND_FOR_CLIENT_MASK)) return; - Unit* target = aurApp->GetTarget(); - - float scale = target->GetObjectScale(); - scale += CalculatePct(1.0f, apply ? GetAmount() : -GetAmount()); - target->SetObjectScale(scale); + aurApp->GetTarget()->RecalculateObjectScale(); } void AuraEffect::HandleAuraCloneCaster(AuraApplication const* aurApp, uint8 mode, bool apply) const |