From f94619725986494285c1bffe9cc80a604f3db630 Mon Sep 17 00:00:00 2001 From: Schmoozerd Date: Mon, 16 Jul 2012 18:30:41 +0200 Subject: [PATCH] [12049] Let PossessedSummons despawn on Channeled-Aura interrupt Maybe this mechanic should also be used for normal possessed mobs, but then their special handling must be removed Also not entirely sure if this a great place for this code to be - but I didn't catch a better suiting one --- src/game/Spell.cpp | 32 +++++++++++++++++++++++++++++++- src/shared/revision_nr.h | 2 +- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 9cdfa48f8..a00d01d72 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4358,8 +4358,38 @@ void Spell::SendInterrupted(uint8 result) void Spell::SendChannelUpdate(uint32 time) { - if(time == 0) + if (time == 0) { + // Reset farsight for some possessing auras of possessed summoned (as they might work with different aura types) + if (m_spellInfo->HasAttribute(SPELL_ATTR_EX_FARSIGHT) && m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->GetCharmGuid() + && !IsSpellHaveAura(m_spellInfo, SPELL_AURA_MOD_POSSESS) && !IsSpellHaveAura(m_spellInfo, SPELL_AURA_MOD_POSSESS_PET)) + { + Player* player = (Player*)m_caster; + // These Auras are applied to self, so get the possessed first + Unit* possessed = player->GetCharm(); + + player->SetCharm(NULL); + if (possessed) + player->SetClientControl(possessed, 0); + player->SetMover(NULL); + player->GetCamera().ResetView(); + player->RemovePetActionBar(); + + if (possessed) + { + possessed->clearUnitState(UNIT_STAT_CONTROLLED); + possessed->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); + possessed->SetCharmerGuid(ObjectGuid()); + // TODO - Requires more specials for target? + + // Some possessed might want to despawn? + if (possessed->GetUInt32Value(UNIT_CREATED_BY_SPELL) == m_spellInfo->Id && possessed->GetTypeId() == TYPEID_UNIT) + ((Creature*)possessed)->ForcedDespawn(); + } + } + + + m_caster->RemoveAurasByCasterSpell(m_spellInfo->Id, m_caster->GetObjectGuid()); ObjectGuid target_guid = m_caster->GetChannelObjectGuid(); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 77a4ab984..20eda06a0 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "12048" + #define REVISION_NR "12049" #endif // __REVISION_NR_H__