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
This commit is contained in:
UltraNix
2022-04-15 17:16:02 +02:00
committed by GitHub
parent b7c8c09920
commit 3d609bfd24
2 changed files with 56 additions and 29 deletions
+28 -4
View File
@@ -4495,13 +4495,25 @@ void Spell::SendSpellStart()
if (m_spellInfo->RuneCostID && m_spellInfo->PowerType == POWER_RUNE) if (m_spellInfo->RuneCostID && m_spellInfo->PowerType == POWER_RUNE)
castFlags |= CAST_FLAG_NO_GCD; // not needed, but Blizzard sends it 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)); WorldPacket data(SMSG_SPELL_START, (8 + 8 + 4 + 4 + 2));
if (m_CastItem) if (m_CastItem)
data << m_CastItem->GetPackGUID(); data << m_CastItem->GetPackGUID();
else else
data << m_caster->GetPackGUID(); data << realCasterGUID;
data << m_caster->GetPackGUID(); data << realCasterGUID;
data << uint8(m_cast_count); // pending spell cast? data << uint8(m_cast_count); // pending spell cast?
data << uint32(m_spellInfo->Id); // spellId data << uint32(m_spellInfo->Id); // spellId
data << uint32(castFlags); // cast flags data << uint32(castFlags); // cast flags
@@ -4581,14 +4593,26 @@ void Spell::SendSpellGo()
if (!m_spellInfo->StartRecoveryTime) if (!m_spellInfo->StartRecoveryTime)
castFlags |= CAST_FLAG_NO_GCD; 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 WorldPacket data(SMSG_SPELL_GO, 150); // guess size
if (m_CastItem) if (m_CastItem)
data << m_CastItem->GetPackGUID(); data << m_CastItem->GetPackGUID();
else else
data << m_caster->GetPackGUID(); data << realCasterGUID;
data << m_caster->GetPackGUID(); data << realCasterGUID;
data << uint8(m_cast_count); // pending spell cast? data << uint8(m_cast_count); // pending spell cast?
data << uint32(m_spellInfo->Id); // spellId data << uint32(m_spellInfo->Id); // spellId
data << uint32(castFlags); // cast flags data << uint32(castFlags); // cast flags
@@ -34,6 +34,7 @@ enum Say
enum Spells enum Spells
{ {
SPELL_MINDCONTROL = 19832, SPELL_MINDCONTROL = 19832,
SPELL_MINDCONTROL_VISUAL = 45537,
SPELL_EGG_DESTROY = 19873, SPELL_EGG_DESTROY = 19873,
SPELL_MIND_EXHAUSTION = 23958, SPELL_MIND_EXHAUSTION = 23958,
@@ -161,12 +162,14 @@ public:
if (Unit* charmer = ObjectAccessor::GetUnit(*me, _charmerGUID)) if (Unit* charmer = ObjectAccessor::GetUnit(*me, _charmerGUID))
{ {
charmer->CastSpell(charmer, SPELL_MIND_EXHAUSTION, true); charmer->CastSpell(charmer, SPELL_MIND_EXHAUSTION, true);
charmer->CastSpell(me, SPELL_MINDCONTROL_VISUAL, false);
} }
} }
else else
{ {
if (Unit* charmer = ObjectAccessor::GetUnit(*me, _charmerGUID)) if (Unit* charmer = ObjectAccessor::GetUnit(*me, _charmerGUID))
{ {
charmer->RemoveAurasDueToSpell(SPELL_MINDCONTROL_VISUAL);
me->TauntApply(charmer); me->TauntApply(charmer);
} }
} }