aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-05-17 19:42:02 +0200
committerOvahlord <dreadkiller@gmx.de>2025-05-26 20:49:48 +0200
commitc73c7117ed820a69cbb3de64ffb1b9427a639455 (patch)
treed028d4724ce6811fd6b5c6f66b882e627d51d9e0
parentb644a3ca1c80ecf013daa3c024fa339672105924 (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.h1
-rw-r--r--src/server/game/Spells/Auras/SpellAuraDefines.h47
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp9
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h47
-rw-r--r--src/server/game/Spells/Spell.cpp3
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))
{