diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-05-17 19:42:02 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2025-05-26 20:49:48 +0200 |
commit | c73c7117ed820a69cbb3de64ffb1b9427a639455 (patch) | |
tree | d028d4724ce6811fd6b5c6f66b882e627d51d9e0 | |
parent | b644a3ca1c80ecf013daa3c024fa339672105924 (diff) |
Core/Auras: Initialize aura spell visual from spell that created it instead of recalculating it
(cherry picked from commit 616c5094e0c75c9f8e0c89510f9b7f2f69c70ac7)
# Conflicts:
# src/server/game/Spells/Auras/SpellAuras.cpp
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraDefines.h | 47 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.h | 47 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 3 |
5 files changed, 57 insertions, 50 deletions
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index f579d8e9b8e..3c83af61cce 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -63,6 +63,7 @@ enum InventorySlot }; struct AbstractFollower; +struct AuraCreateInfo; struct CharmInfo; struct FactionTemplateEntry; struct LiquidData; diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 5b1e006178a..216e6da4ce9 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -18,13 +18,6 @@ #define TRINITY_SPELLAURADEFINES_H #include "Define.h" -#include "ObjectGuid.h" - -class Item; -class SpellInfo; -class Unit; -class WorldObject; -enum Difficulty : uint8; #define MAX_AURAS 255 @@ -775,44 +768,4 @@ enum ShapeshiftForm FORM_FORGEBORNE_REVERIES = 42 }; -struct TC_GAME_API AuraCreateInfo -{ - friend class Aura; - friend class UnitAura; - friend class DynObjAura; - - AuraCreateInfo(ObjectGuid castId, SpellInfo const* spellInfo, Difficulty castDifficulty, uint32 auraEffMask, WorldObject* owner); - - AuraCreateInfo& SetCasterGUID(ObjectGuid const& guid) { CasterGUID = guid; return *this; } - AuraCreateInfo& SetCaster(Unit* caster) { Caster = caster; return *this; } - AuraCreateInfo& SetBaseAmount(int32 const* bp) { BaseAmount = bp; return *this; } - AuraCreateInfo& SetCastItem(ObjectGuid const& guid, uint32 itemId, int32 itemLevel) { CastItemGUID = guid; CastItemId = itemId; CastItemLevel = itemLevel; return *this; } - AuraCreateInfo& SetPeriodicReset(bool reset) { ResetPeriodicTimer = reset; return *this; } - AuraCreateInfo& SetIsRefresh(bool* isRefresh) { IsRefresh = isRefresh; return *this; } - AuraCreateInfo& SetStackAmount(int32 stackAmount) { StackAmount = stackAmount > 0 ? stackAmount : 1; return *this; } - AuraCreateInfo& SetOwnerEffectMask(uint32 effMask) { _targetEffectMask = effMask; return *this; } - - SpellInfo const* GetSpellInfo() const { return _spellInfo; } - uint32 GetAuraEffectMask() const { return _auraEffectMask; } - - ObjectGuid CasterGUID; - Unit* Caster = nullptr; - int32 const* BaseAmount = nullptr; - ObjectGuid CastItemGUID; - uint32 CastItemId = 0; - int32 CastItemLevel = -1; - bool* IsRefresh = nullptr; - int32 StackAmount = 1; - bool ResetPeriodicTimer = true; - -private: - ObjectGuid _castId; - SpellInfo const* _spellInfo = nullptr; - Difficulty _castDifficulty = Difficulty(0); - uint32 _auraEffectMask = 0; - WorldObject* _owner = nullptr; - - uint32 _targetEffectMask = 0; -}; - #endif diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index ce981ac68ec..a17f8d17819 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -471,10 +471,17 @@ Aura* Aura::Create(AuraCreateInfo& createInfo) return aura; } +SpellCastVisual AuraCreateInfo::CalcSpellVisual() const +{ + return _spellVisual.value_or<SpellCastVisual>({ + .SpellXSpellVisualID = Caster ? Caster->GetCastSpellXSpellVisualId(_spellInfo) : _spellInfo->GetSpellXSpellVisualId() + }); +} + Aura::Aura(AuraCreateInfo const& createInfo) : m_spellInfo(createInfo._spellInfo), m_castDifficulty(createInfo._castDifficulty), m_castId(createInfo._castId), m_casterGuid(createInfo.CasterGUID), m_castItemGuid(createInfo.CastItemGUID), m_castItemId(createInfo.CastItemId), -m_castItemLevel(createInfo.CastItemLevel), m_spellVisual({ createInfo.Caster ? createInfo.Caster->GetCastSpellXSpellVisualId(createInfo._spellInfo) : createInfo._spellInfo->GetSpellXSpellVisualId() }), +m_castItemLevel(createInfo.CastItemLevel), m_spellVisual(createInfo.CalcSpellVisual()), m_applyTime(GameTime::GetGameTime()), m_owner(createInfo._owner), m_timeCla(0), m_updateTargetMapInterval(0), m_casterLevel(createInfo.Caster ? createInfo.Caster->GetLevel() : m_spellInfo->SpellLevel), m_procCharges(0), m_stackAmount(createInfo.StackAmount), m_isRemoved(false), m_isSingleTarget(false), m_isUsingCharges(false), m_dropEvent(nullptr), diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index f75afb2d4f4..c30e2bcdc29 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -48,9 +48,11 @@ class DynObjAura; class ChargeDropEvent; class DynamicObject; class HealInfo; +class Item; class ProcEventInfo; class Unit; class UnitAura; +class WorldObject; // update aura target map every 500 ms instead of every update - reduce amount of grid searcher calls #define UPDATE_TARGET_MAP_INTERVAL 500 @@ -101,6 +103,50 @@ class TC_GAME_API AuraApplication std::string GetDebugInfo() const; }; +struct TC_GAME_API AuraCreateInfo +{ + friend class Aura; + friend class UnitAura; + friend class DynObjAura; + + AuraCreateInfo(ObjectGuid castId, SpellInfo const* spellInfo, Difficulty castDifficulty, uint32 auraEffMask, WorldObject* owner); + + AuraCreateInfo& SetCasterGUID(ObjectGuid const& guid) { CasterGUID = guid; return *this; } + AuraCreateInfo& SetCaster(Unit* caster) { Caster = caster; return *this; } + AuraCreateInfo& SetBaseAmount(int32 const* bp) { BaseAmount = bp; return *this; } + AuraCreateInfo& SetCastItem(ObjectGuid const& guid, uint32 itemId, int32 itemLevel) { CastItemGUID = guid; CastItemId = itemId; CastItemLevel = itemLevel; return *this; } + AuraCreateInfo& SetPeriodicReset(bool reset) { ResetPeriodicTimer = reset; return *this; } + AuraCreateInfo& SetIsRefresh(bool* isRefresh) { IsRefresh = isRefresh; return *this; } + AuraCreateInfo& SetStackAmount(int32 stackAmount) { StackAmount = stackAmount > 0 ? stackAmount : 1; return *this; } + AuraCreateInfo& SetOwnerEffectMask(uint32 effMask) { _targetEffectMask = effMask; return *this; } + AuraCreateInfo& SetSpellVisual(SpellCastVisual const& spellVisual) { _spellVisual = spellVisual; return *this; } + + SpellInfo const* GetSpellInfo() const { return _spellInfo; } + uint32 GetAuraEffectMask() const { return _auraEffectMask; } + + ObjectGuid CasterGUID; + Unit* Caster = nullptr; + int32 const* BaseAmount = nullptr; + ObjectGuid CastItemGUID; + uint32 CastItemId = 0; + int32 CastItemLevel = -1; + bool* IsRefresh = nullptr; + int32 StackAmount = 1; + bool ResetPeriodicTimer = true; + +private: + ObjectGuid _castId; + SpellInfo const* _spellInfo = nullptr; + Difficulty _castDifficulty = Difficulty(0); + uint32 _auraEffectMask = 0; + WorldObject* _owner = nullptr; + Optional<SpellCastVisual> _spellVisual; + + uint32 _targetEffectMask = 0; + + SpellCastVisual CalcSpellVisual() const; +}; + // Structure representing database aura primary key fields struct AuraKey { @@ -131,7 +177,6 @@ class TC_GAME_API Aura static Aura* Create(AuraCreateInfo& createInfo); explicit Aura(AuraCreateInfo const& createInfo); void _InitEffects(uint32 effMask, Unit* caster, int32 const* baseAmount); - void SaveCasterInfo(Unit* caster); virtual ~Aura(); SpellInfo const* GetSpellInfo() const { return m_spellInfo; } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 3e54ed9cd3e..2f870eb2cee 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3236,7 +3236,8 @@ void Spell::DoSpellEffectHit(Unit* unit, SpellEffectInfo const& spellEffectInfo, .SetPeriodicReset(resetPeriodicTimer) .SetOwnerEffectMask(aura_effmask) .SetIsRefresh(&refresh) - .SetStackAmount(m_spellValue->AuraStackAmount); + .SetStackAmount(m_spellValue->AuraStackAmount) + .SetSpellVisual(m_SpellVisual); if (Aura* aura = Aura::TryRefreshStackOrCreate(createInfo, false)) { |