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)
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

View File

@@ -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);
}
}