diff --git a/src/game/Server/Opcodes.cpp b/src/game/Server/Opcodes.cpp index a32a0895..0fab50e3 100644 --- a/src/game/Server/Opcodes.cpp +++ b/src/game/Server/Opcodes.cpp @@ -349,7 +349,7 @@ void Opcodes::BuildOpcodeList() /*[-ZERO] Need check */ /*0x11E*/ StoreOpcode(CMSG_CLEAR_TRADE_ITEM, "CMSG_CLEAR_TRADE_ITEM", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleClearTradeItemOpcode); /*[-ZERO] Need check */ /*0x11F*/ StoreOpcode(CMSG_SET_TRADE_GOLD, "CMSG_SET_TRADE_GOLD", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTradeGoldOpcode); /*0x120*/ StoreOpcode(SMSG_TRADE_STATUS, "SMSG_TRADE_STATUS", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); - /*[-ZERO] Need check */ /*0x121*/ StoreOpcode(SMSG_TRADE_STATUS_EXTENDED, "SMSG_TRADE_STATUS_EXTENDED", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); + /*0x121*/ StoreOpcode(SMSG_TRADE_STATUS_EXTENDED, "SMSG_TRADE_STATUS_EXTENDED", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*0x122*/ StoreOpcode(SMSG_INITIALIZE_FACTIONS, "SMSG_INITIALIZE_FACTIONS", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*0x123*/ StoreOpcode(SMSG_SET_FACTION_VISIBLE, "SMSG_SET_FACTION_VISIBLE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*0x124*/ StoreOpcode(SMSG_SET_FACTION_STANDING, "SMSG_SET_FACTION_STANDING", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); @@ -367,7 +367,7 @@ void Opcodes::BuildOpcodeList() /*[-ZERO] Need check */ /*0x130*/ StoreOpcode(SMSG_CAST_FAILED, "SMSG_CAST_FAILED", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*0x131*/ StoreOpcode(SMSG_SPELL_START, "SMSG_SPELL_START", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*0x132*/ StoreOpcode(SMSG_SPELL_GO, "SMSG_SPELL_GO", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); - /*[-ZERO] Need check */ /*0x133*/ StoreOpcode(SMSG_SPELL_FAILURE, "SMSG_SPELL_FAILURE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); + /*0x133*/ StoreOpcode(SMSG_SPELL_FAILURE, "SMSG_SPELL_FAILURE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*0x134*/ StoreOpcode(SMSG_SPELL_COOLDOWN, "SMSG_SPELL_COOLDOWN", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x135*/ StoreOpcode(SMSG_COOLDOWN_EVENT, "SMSG_COOLDOWN_EVENT", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x136*/ StoreOpcode(CMSG_CANCEL_AURA, "CMSG_CANCEL_AURA", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelAuraOpcode); @@ -736,7 +736,7 @@ void Opcodes::BuildOpcodeList() /*[-ZERO] Need check */ /*0x2A3*/ StoreOpcode(CMSG_LOOT_MASTER_GIVE, "CMSG_LOOT_MASTER_GIVE", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMasterGiveOpcode); /*[-ZERO] Need check */ /*0x2A4*/ StoreOpcode(SMSG_LOOT_MASTER_LIST, "SMSG_LOOT_MASTER_LIST", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x2A5*/ StoreOpcode(SMSG_SET_FORCED_REACTIONS, "SMSG_SET_FORCED_REACTIONS", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); - /*[-ZERO] Need check */ /*0x2A6*/ StoreOpcode(SMSG_SPELL_FAILED_OTHER, "SMSG_SPELL_FAILED_OTHER", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); + /*0x2A6*/ StoreOpcode(SMSG_SPELL_FAILED_OTHER, "SMSG_SPELL_FAILED_OTHER", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x2A7*/ StoreOpcode(SMSG_GAMEOBJECT_RESET_STATE, "SMSG_GAMEOBJECT_RESET_STATE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x2A8*/ StoreOpcode(CMSG_REPAIR_ITEM, "CMSG_REPAIR_ITEM", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRepairItemOpcode); /*[-ZERO] Need check */ /*0x2A9*/ StoreOpcode(SMSG_CHAT_PLAYER_NOT_FOUND, "SMSG_CHAT_PLAYER_NOT_FOUND", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); diff --git a/src/game/WorldHandlers/Spell.cpp b/src/game/WorldHandlers/Spell.cpp index eca8d8e6..85c73269 100644 --- a/src/game/WorldHandlers/Spell.cpp +++ b/src/game/WorldHandlers/Spell.cpp @@ -2632,7 +2632,7 @@ void Spell::cancel() //(no break) case SPELL_STATE_DELAYED: { - SendInterrupted(0); + SendInterrupted(SPELL_FAILED_INTERRUPTED); if (sendInterrupt) { SendCastResult(SPELL_FAILED_INTERRUPTED); } @@ -2651,7 +2651,7 @@ void Spell::cancel() } SendChannelUpdate(0); - SendInterrupted(0); + SendInterrupted(SPELL_FAILED_INTERRUPTED); if (sendInterrupt) { SendCastResult(SPELL_FAILED_INTERRUPTED); } @@ -3274,10 +3274,9 @@ void Spell::SendCastResult(SpellCastResult result) // Reseting emote state for case not handled by the client. if (result == SPELL_FAILED_CHEST_IN_USE) { - SendInterrupted(0); + SendInterrupted(result); } - SendCastResult((Player*)m_caster, m_spellInfo, result); } @@ -3587,18 +3586,26 @@ void Spell::SendLogExecute() m_caster->SendMessageToSet(&data, true); } -void Spell::SendInterrupted(uint8 result) +void Spell::SendInterrupted(SpellCastResult result) { - WorldPacket data(SMSG_SPELL_FAILURE, (8 + 4 + 1)); - data << m_caster->GetPackGUID(); - data << m_spellInfo->Id; - data << result; - m_caster->SendMessageToSet(&data, true); + Player *casterPlayer = m_caster->ToPlayer(); - data.Initialize(SMSG_SPELL_FAILED_OTHER, (8 + 4)); + if (casterPlayer) + { + WorldPacket data(SMSG_SPELL_FAILURE, (8 + 4 + 1)); + data << m_caster->GetObjectGuid(); + data << m_spellInfo->Id; + data << uint8(result); + casterPlayer->SendDirectMessage(&data); + } + + WorldPacket data(SMSG_SPELL_FAILED_OTHER, (8 + 4)); data << m_caster->GetObjectGuid(); data << m_spellInfo->Id; - m_caster->SendMessageToSet(&data, true); + if (casterPlayer) + casterPlayer->SendMessageToSetExcept(&data, casterPlayer); + else + m_caster->SendMessageToSet(&data, true); } void Spell::SendChannelUpdate(uint32 time) @@ -4458,14 +4465,14 @@ SpellCastResult Spell::CheckCast(bool strict) // Must be behind the target. if (m_spellInfo->AttributesEx2 == SPELL_ATTR_EX2_UNK20 && m_spellInfo->HasAttribute(SPELL_ATTR_EX_UNK9) && target->HasInArc(M_PI_F, m_caster)) { - SendInterrupted(2); + SendInterrupted(SPELL_FAILED_NOT_BEHIND); return SPELL_FAILED_NOT_BEHIND; } // Target must be facing you. if ((m_spellInfo->Attributes == (SPELL_ATTR_UNK4 | SPELL_ATTR_NOT_SHAPESHIFT | SPELL_ATTR_UNK18 | SPELL_ATTR_STOP_ATTACK_TARGET)) && !target->HasInArc(M_PI_F, m_caster)) { - SendInterrupted(2); + SendInterrupted(SPELL_FAILED_NOT_INFRONT); return SPELL_FAILED_NOT_INFRONT; } diff --git a/src/game/WorldHandlers/Spell.h b/src/game/WorldHandlers/Spell.h index e6640044..a3e53283 100644 --- a/src/game/WorldHandlers/Spell.h +++ b/src/game/WorldHandlers/Spell.h @@ -367,7 +367,7 @@ class Spell void SendSpellGo(); void SendSpellCooldown(); void SendLogExecute(); - void SendInterrupted(uint8 result); + void SendInterrupted(SpellCastResult result); void SendChannelUpdate(uint32 time); void SendChannelStart(uint32 duration); void SendResurrectRequest(Player* target);