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

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

View File

@@ -23,48 +23,49 @@
enum Say enum Say
{ {
SAY_EGGS_BROKEN1 = 0, SAY_EGGS_BROKEN1 = 0,
SAY_EGGS_BROKEN2 = 1, SAY_EGGS_BROKEN2 = 1,
SAY_EGGS_BROKEN3 = 2, SAY_EGGS_BROKEN3 = 2,
SAY_DEATH = 3, SAY_DEATH = 3,
EMOTE_TROOPS_RETREAT = 0 EMOTE_TROOPS_RETREAT = 0
}; };
enum Spells enum Spells
{ {
SPELL_MINDCONTROL = 19832, SPELL_MINDCONTROL = 19832,
SPELL_EGG_DESTROY = 19873, SPELL_MINDCONTROL_VISUAL = 45537,
SPELL_MIND_EXHAUSTION = 23958, SPELL_EGG_DESTROY = 19873,
SPELL_MIND_EXHAUSTION = 23958,
SPELL_CLEAVE = 19632, SPELL_CLEAVE = 19632,
SPELL_WARSTOMP = 24375, SPELL_WARSTOMP = 24375,
SPELL_FIREBALLVOLLEY = 22425, SPELL_FIREBALLVOLLEY = 22425,
SPELL_CONFLAGRATION = 23023, SPELL_CONFLAGRATION = 23023,
SPELL_EXPLODE_ORB = 20037, SPELL_EXPLODE_ORB = 20037,
SPELL_EXPLOSION = 20038, // Instakill everything. SPELL_EXPLOSION = 20038, // Instakill everything.
SPELL_WARMING_FLAMES = 23040, SPELL_WARMING_FLAMES = 23040,
}; };
enum Summons enum Summons
{ {
NPC_ELITE_DRACHKIN = 12422, NPC_ELITE_DRACHKIN = 12422,
NPC_ELITE_WARRIOR = 12458, NPC_ELITE_WARRIOR = 12458,
NPC_WARRIOR = 12416, NPC_WARRIOR = 12416,
NPC_MAGE = 12420, NPC_MAGE = 12420,
NPC_WARLOCK = 12459, NPC_WARLOCK = 12459,
GO_EGG = 177807 GO_EGG = 177807
}; };
enum EVENTS enum EVENTS
{ {
EVENT_CLEAVE = 1, EVENT_CLEAVE = 1,
EVENT_STOMP = 2, EVENT_STOMP = 2,
EVENT_FIREBALL = 3, EVENT_FIREBALL = 3,
EVENT_CONFLAGRATION = 4 EVENT_CONFLAGRATION = 4
}; };
class boss_razorgore : public CreatureScript class boss_razorgore : public CreatureScript
@@ -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);
} }
} }