From 3d609bfd240c4d99d3c526dd250eb5e037672deb Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Fri, 15 Apr 2022 17:16:02 +0200 Subject: [PATCH] fix(Core/Spells): Send proper caster's guid in SMSG_SPELL_START/SMSG_SPELL_GO packets in case of spells casted originally by gameobjects. (#11337) Added visual channeling when mind controlling Razorgore by player. Fixes #11275 --- src/server/game/Spells/Spell.cpp | 32 +++++++++-- .../BlackwingLair/boss_razorgore.cpp | 53 ++++++++++--------- 2 files changed, 56 insertions(+), 29 deletions(-) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index f67683d0a..316188025 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4495,13 +4495,25 @@ void Spell::SendSpellStart() if (m_spellInfo->RuneCostID && m_spellInfo->PowerType == POWER_RUNE) castFlags |= CAST_FLAG_NO_GCD; // not needed, but Blizzard sends it + PackedGuid realCasterGUID = m_caster->GetPackGUID(); + if (TempSummon const* tempSummon = m_caster->ToTempSummon()) + { + if (tempSummon->GetEntry() == WORLD_TRIGGER) + { + if (GameObject* casterGameobject = tempSummon->GetSummonerGameObject()) + { + realCasterGUID = casterGameobject->GetPackGUID(); + } + } + } + WorldPacket data(SMSG_SPELL_START, (8 + 8 + 4 + 4 + 2)); if (m_CastItem) data << m_CastItem->GetPackGUID(); else - data << m_caster->GetPackGUID(); + data << realCasterGUID; - data << m_caster->GetPackGUID(); + data << realCasterGUID; data << uint8(m_cast_count); // pending spell cast? data << uint32(m_spellInfo->Id); // spellId data << uint32(castFlags); // cast flags @@ -4581,14 +4593,26 @@ void Spell::SendSpellGo() if (!m_spellInfo->StartRecoveryTime) castFlags |= CAST_FLAG_NO_GCD; + PackedGuid realCasterGUID = m_caster->GetPackGUID(); + if (TempSummon const* tempSummon = m_caster->ToTempSummon()) + { + if (tempSummon->GetEntry() == WORLD_TRIGGER) + { + if (GameObject* casterGameobject = tempSummon->GetSummonerGameObject()) + { + realCasterGUID = casterGameobject->GetPackGUID(); + } + } + } + WorldPacket data(SMSG_SPELL_GO, 150); // guess size if (m_CastItem) data << m_CastItem->GetPackGUID(); else - data << m_caster->GetPackGUID(); + data << realCasterGUID; - data << m_caster->GetPackGUID(); + data << realCasterGUID; data << uint8(m_cast_count); // pending spell cast? data << uint32(m_spellInfo->Id); // spellId data << uint32(castFlags); // cast flags diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp index 500462488..25de4ec9d 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_razorgore.cpp @@ -23,48 +23,49 @@ enum Say { - SAY_EGGS_BROKEN1 = 0, - SAY_EGGS_BROKEN2 = 1, - SAY_EGGS_BROKEN3 = 2, - SAY_DEATH = 3, + SAY_EGGS_BROKEN1 = 0, + SAY_EGGS_BROKEN2 = 1, + SAY_EGGS_BROKEN3 = 2, + SAY_DEATH = 3, - EMOTE_TROOPS_RETREAT = 0 + EMOTE_TROOPS_RETREAT = 0 }; enum Spells { - SPELL_MINDCONTROL = 19832, - SPELL_EGG_DESTROY = 19873, - SPELL_MIND_EXHAUSTION = 23958, + SPELL_MINDCONTROL = 19832, + SPELL_MINDCONTROL_VISUAL = 45537, + SPELL_EGG_DESTROY = 19873, + SPELL_MIND_EXHAUSTION = 23958, - SPELL_CLEAVE = 19632, - SPELL_WARSTOMP = 24375, - SPELL_FIREBALLVOLLEY = 22425, - SPELL_CONFLAGRATION = 23023, + SPELL_CLEAVE = 19632, + SPELL_WARSTOMP = 24375, + SPELL_FIREBALLVOLLEY = 22425, + SPELL_CONFLAGRATION = 23023, - SPELL_EXPLODE_ORB = 20037, - SPELL_EXPLOSION = 20038, // Instakill everything. + SPELL_EXPLODE_ORB = 20037, + SPELL_EXPLOSION = 20038, // Instakill everything. - SPELL_WARMING_FLAMES = 23040, + SPELL_WARMING_FLAMES = 23040, }; enum Summons { - NPC_ELITE_DRACHKIN = 12422, - NPC_ELITE_WARRIOR = 12458, - NPC_WARRIOR = 12416, - NPC_MAGE = 12420, - NPC_WARLOCK = 12459, + NPC_ELITE_DRACHKIN = 12422, + NPC_ELITE_WARRIOR = 12458, + NPC_WARRIOR = 12416, + NPC_MAGE = 12420, + NPC_WARLOCK = 12459, - GO_EGG = 177807 + GO_EGG = 177807 }; enum EVENTS { - EVENT_CLEAVE = 1, - EVENT_STOMP = 2, - EVENT_FIREBALL = 3, - EVENT_CONFLAGRATION = 4 + EVENT_CLEAVE = 1, + EVENT_STOMP = 2, + EVENT_FIREBALL = 3, + EVENT_CONFLAGRATION = 4 }; class boss_razorgore : public CreatureScript @@ -161,12 +162,14 @@ public: if (Unit* charmer = ObjectAccessor::GetUnit(*me, _charmerGUID)) { charmer->CastSpell(charmer, SPELL_MIND_EXHAUSTION, true); + charmer->CastSpell(me, SPELL_MINDCONTROL_VISUAL, false); } } else { if (Unit* charmer = ObjectAccessor::GetUnit(*me, _charmerGUID)) { + charmer->RemoveAurasDueToSpell(SPELL_MINDCONTROL_VISUAL); me->TauntApply(charmer); } }