SMSG_SPELL_FAILURE: a more correct usage

This commit is contained in:
Olion 2017-07-09 23:46:19 +03:00 committed by Antz
parent 901bdcad53
commit 351b6f2349
3 changed files with 25 additions and 18 deletions

View File

@ -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 */ /*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); /*[-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); /*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); /*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); /*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); /*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); /*[-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); /*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); /*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); /*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 */ /*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); /*[-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 */ /*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 */ /*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 */ /*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 */ /*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 */ /*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); /*[-ZERO] Need check */ /*0x2A9*/ StoreOpcode(SMSG_CHAT_PLAYER_NOT_FOUND, "SMSG_CHAT_PLAYER_NOT_FOUND", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide);

View File

@ -2632,7 +2632,7 @@ void Spell::cancel()
//(no break) //(no break)
case SPELL_STATE_DELAYED: case SPELL_STATE_DELAYED:
{ {
SendInterrupted(0); SendInterrupted(SPELL_FAILED_INTERRUPTED);
if (sendInterrupt) if (sendInterrupt)
{ SendCastResult(SPELL_FAILED_INTERRUPTED); } { SendCastResult(SPELL_FAILED_INTERRUPTED); }
@ -2651,7 +2651,7 @@ void Spell::cancel()
} }
SendChannelUpdate(0); SendChannelUpdate(0);
SendInterrupted(0); SendInterrupted(SPELL_FAILED_INTERRUPTED);
if (sendInterrupt) if (sendInterrupt)
{ SendCastResult(SPELL_FAILED_INTERRUPTED); } { SendCastResult(SPELL_FAILED_INTERRUPTED); }
@ -3274,10 +3274,9 @@ void Spell::SendCastResult(SpellCastResult result)
// Reseting emote state for case not handled by the client. // Reseting emote state for case not handled by the client.
if (result == SPELL_FAILED_CHEST_IN_USE) if (result == SPELL_FAILED_CHEST_IN_USE)
{ {
SendInterrupted(0); SendInterrupted(result);
} }
SendCastResult((Player*)m_caster, m_spellInfo, result); SendCastResult((Player*)m_caster, m_spellInfo, result);
} }
@ -3587,18 +3586,26 @@ void Spell::SendLogExecute()
m_caster->SendMessageToSet(&data, true); m_caster->SendMessageToSet(&data, true);
} }
void Spell::SendInterrupted(uint8 result) void Spell::SendInterrupted(SpellCastResult result)
{ {
WorldPacket data(SMSG_SPELL_FAILURE, (8 + 4 + 1)); Player *casterPlayer = m_caster->ToPlayer();
data << m_caster->GetPackGUID();
data << m_spellInfo->Id;
data << result;
m_caster->SendMessageToSet(&data, true);
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_caster->GetObjectGuid();
data << m_spellInfo->Id; 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) void Spell::SendChannelUpdate(uint32 time)
@ -4458,14 +4465,14 @@ SpellCastResult Spell::CheckCast(bool strict)
// Must be behind the target. // 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)) 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; return SPELL_FAILED_NOT_BEHIND;
} }
// Target must be facing you. // 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)) 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; return SPELL_FAILED_NOT_INFRONT;
} }

View File

@ -367,7 +367,7 @@ class Spell
void SendSpellGo(); void SendSpellGo();
void SendSpellCooldown(); void SendSpellCooldown();
void SendLogExecute(); void SendLogExecute();
void SendInterrupted(uint8 result); void SendInterrupted(SpellCastResult result);
void SendChannelUpdate(uint32 time); void SendChannelUpdate(uint32 time);
void SendChannelStart(uint32 duration); void SendChannelStart(uint32 duration);
void SendResurrectRequest(Player* target); void SendResurrectRequest(Player* target);