From 0a34f2306b518dc7b5bee7b95f406f36d0bf5f5c Mon Sep 17 00:00:00 2001 From: killerwife Date: Sun, 17 Dec 2023 14:01:02 +0100 Subject: [PATCH] Spell: Add dyngo fake caster support Caster is dyngo, caster unit is dyngo owner in spell packet --- src/game/Spells/Scripts/SpellScript.h | 5 +++-- src/game/Spells/Spell.cpp | 2 +- src/game/Spells/Spell.h | 2 +- src/game/Spells/SpellAuras.cpp | 8 +++++--- src/game/Spells/SpellMgr.cpp | 2 +- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/game/Spells/Scripts/SpellScript.h b/src/game/Spells/Scripts/SpellScript.h index 87855a2462e..6959858f886 100644 --- a/src/game/Spells/Scripts/SpellScript.h +++ b/src/game/Spells/Scripts/SpellScript.h @@ -28,11 +28,12 @@ class DynamicObject; struct PeriodicTriggerData { + WorldObject* trueCaster; Unit* caster; Unit* target; WorldObject* targetObject; SpellEntry const* spellInfo; int32* basePoints; - PeriodicTriggerData(Unit* caster, Unit* target, WorldObject* targetObject, SpellEntry const* spellInfo, int32* basePoints) : - caster(caster), target(target), targetObject(targetObject), spellInfo(spellInfo), basePoints(basePoints) {} + PeriodicTriggerData(WorldObject* trueCaster, Unit* caster, Unit* target, WorldObject* targetObject, SpellEntry const* spellInfo, int32* basePoints) : + trueCaster(nullptr), caster(caster), target(target), targetObject(targetObject), spellInfo(spellInfo), basePoints(basePoints) {} }; struct SpellScript diff --git a/src/game/Spells/Spell.cpp b/src/game/Spells/Spell.cpp index f127ac1002e..a944e65f288 100644 --- a/src/game/Spells/Spell.cpp +++ b/src/game/Spells/Spell.cpp @@ -3327,7 +3327,7 @@ SpellCastResult Spell::SpellStart(SpellCastTargets const* targets, Aura* trigger m_spellEvent = new SpellEvent(this); m_trueCaster->m_events.AddEvent(m_spellEvent, m_trueCaster->m_events.CalculateTime(1)); - if (!m_trueCaster->IsGameObject()) // gameobjects dont have a sense of already casting a spell + if (m_trueCaster->IsUnit()) // gameobjects dont have a sense of already casting a spell { // Prevent casting at cast another spell (ServerSide check) if (m_caster->IsNonMeleeSpellCasted(false, true, true) && m_cast_count && !m_ignoreConcurrentCasts) diff --git a/src/game/Spells/Spell.h b/src/game/Spells/Spell.h index c7f306eb4e2..8cf7158e90f 100644 --- a/src/game/Spells/Spell.h +++ b/src/game/Spells/Spell.h @@ -887,7 +887,7 @@ class Spell static SpellCastResult CheckVehicle(Unit const* caster, SpellEntry const& spellInfo); // GO casting preparations - void SetFakeCaster(Unit* caster) { m_caster = caster; } + void SetFakeCaster(Unit* caster) { m_caster = caster; } // also used by dyngo caster emulation WorldObject* GetTrueCaster() const { return m_trueCaster; } Unit* GetAffectiveCasterOrOwner() const; diff --git a/src/game/Spells/SpellAuras.cpp b/src/game/Spells/SpellAuras.cpp index 2cd50b5d2ec..cf57ccfdc4b 100755 --- a/src/game/Spells/SpellAuras.cpp +++ b/src/game/Spells/SpellAuras.cpp @@ -1127,9 +1127,11 @@ void Aura::PickTargetsForSpellTrigger(Unit*& triggerCaster, Unit*& triggerTarget void Aura::CastTriggeredSpell(PeriodicTriggerData& data) { - Spell* spell = new Spell(data.caster, data.spellInfo, TRIGGERED_OLD_TRIGGERED, data.caster->GetObjectGuid(), GetSpellProto()); + Spell* spell = new Spell(data.trueCaster ? data.trueCaster : data.caster, data.spellInfo, TRIGGERED_OLD_TRIGGERED, data.trueCaster ? data.trueCaster->GetObjectGuid() : data.caster->GetObjectGuid(), GetSpellProto()); if (data.spellInfo->HasAttribute(SPELL_ATTR_EX2_RETAIN_ITEM_CAST)) // forward guid to at least spell go spell->SetForwardedCastItem(GetCastItemGuid()); + if (data.trueCaster && data.caster) + spell->SetFakeCaster(data.caster); SpellCastTargets targets; if (data.spellInfo->Targets & TARGET_FLAG_DEST_LOCATION) { @@ -2297,7 +2299,7 @@ void Aura::TriggerSpell() } } int32 basePoints[] = { 0,0,0 }; - PeriodicTriggerData data(triggerCaster, triggerTarget, triggerTargetObject, triggeredSpellInfo, basePoints); + PeriodicTriggerData data(nullptr, triggerCaster, triggerTarget, triggerTargetObject, triggeredSpellInfo, basePoints); OnPeriodicTrigger(data); // All ok cast by default case @@ -2344,7 +2346,7 @@ void Aura::TriggerSpellWithValue() WorldObject* triggerTargetObject = nullptr; PickTargetsForSpellTrigger(triggerCaster, triggerTarget, triggerTargetObject, triggeredSpellInfo); - PeriodicTriggerData data(triggerCaster, triggerTarget, triggerTargetObject, triggeredSpellInfo, basePoints); + PeriodicTriggerData data(nullptr, triggerCaster, triggerTarget, triggerTargetObject, triggeredSpellInfo, basePoints); OnPeriodicTrigger(data); if (data.spellInfo) diff --git a/src/game/Spells/SpellMgr.cpp b/src/game/Spells/SpellMgr.cpp index 01108d4b0fb..b11e6ba16ff 100644 --- a/src/game/Spells/SpellMgr.cpp +++ b/src/game/Spells/SpellMgr.cpp @@ -150,7 +150,7 @@ uint32 GetSpellCastTime(SpellEntry const* spellInfo, WorldObject* caster, Spell* if (!spellCastTimeEntry) return 0; - int32 spellRank = caster && caster->GetTypeId() != TYPEID_GAMEOBJECT ? static_cast(caster)->GetSpellRank(spellInfo) : 0; + int32 spellRank = caster && caster->IsUnit() ? static_cast(caster)->GetSpellRank(spellInfo) : 0; int32 castTime = spellCastTimeEntry->CastTime + spellCastTimeEntry->CastTimePerLevel * (spellRank / 5 - spellInfo->baseLevel); castTime = std::max(castTime, spellCastTimeEntry->MinCastTime);