diff options
-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 | 10 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.h | 47 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 3 |
5 files changed, 58 insertions, 50 deletions
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 1b20822e195..7c9f6c5fd9d 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -65,6 +65,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 d0974fa2329..e9db7862247 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 300 @@ -793,44 +786,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 fead03168dd..5543b567555 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -464,10 +464,18 @@ Aura* Aura::Create(AuraCreateInfo& createInfo) return aura; } +SpellCastVisual AuraCreateInfo::CalcSpellVisual() const +{ + return _spellVisual.value_or<SpellCastVisual>({ + .SpellXSpellVisualID = Caster ? Caster->GetCastSpellXSpellVisualId(_spellInfo) : _spellInfo->GetSpellXSpellVisualId(), + .ScriptVisualID = 0 + }); +} + 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(), 0 }), +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 edfabcb67b8..ea0f6f0d73a 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 ad83794b62d..c613b124f67 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)) { |