diff options
author | NoName <322016+Faq@users.noreply.github.com> | 2020-04-29 23:37:35 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-29 22:37:35 +0200 |
commit | c38a9d757d6eeceb1a8ede0f5b25b56df45b1096 (patch) | |
tree | ee4e5dbc00665267412d1d7ac81493982e7f440a | |
parent | f01e53f3f3a8bf77859b4956da56a91809607dfb (diff) |
Core/Spells: implement SMSG_MOUNT_RESULT and use it for transformed mounting cases (#24507)
cherry-pick from fb0d2ed2b96c314ea144b3524195ae96878e0079
Co-authored-by: Ovah <dreadkiller@gmx.de>
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 10 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 1 | ||||
-rw-r--r-- | src/server/shared/SharedDefines.h | 15 |
7 files changed, 56 insertions, 3 deletions
diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index c5ce5c8f412..fa74294b13e 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -191,3 +191,10 @@ WorldPacket const* WorldPackets::Spells::ResyncRunes::Write() } return &_worldPacket; } + +WorldPacket const* WorldPackets::Spells::MountResult::Write() +{ + _worldPacket << int32(Result); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 4e8282b12ae..1968274df79 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -196,6 +196,16 @@ namespace WorldPackets uint32 Count = 0; std::vector<ResyncRune> Runes; }; + + class MountResult final : public ServerPacket + { + public: + MountResult() : ServerPacket(SMSG_MOUNT_RESULT, 4) { } + + WorldPacket const* Write() override; + + uint32 Result = 0; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index a2ac0c42277..fbf2a232570 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -494,7 +494,7 @@ void OpcodeTable::Initialize() /*0x16B*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_WINNER, STATUS_NEVER); /*0x16C*/ DEFINE_HANDLER(CMSG_DUEL_ACCEPTED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDuelAcceptedOpcode ); /*0x16D*/ DEFINE_HANDLER(CMSG_DUEL_CANCELLED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDuelCancelledOpcode ); - /*0x16E*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNTRESULT, STATUS_NEVER); + /*0x16E*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNT_RESULT, STATUS_NEVER); /*0x16F*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNTRESULT, STATUS_NEVER); /*0x170*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVED_FROM_PVP_QUEUE, STATUS_NEVER); /*0x171*/ DEFINE_HANDLER(CMSG_MOUNTSPECIAL_ANIM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMountSpecialAnimOpcode ); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 585faf4f4c9..28edaa7d9a0 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -392,7 +392,7 @@ enum Opcodes : uint16 SMSG_DUEL_WINNER = 0x16B, CMSG_DUEL_ACCEPTED = 0x16C, CMSG_DUEL_CANCELLED = 0x16D, - SMSG_MOUNTRESULT = 0x16E, + SMSG_MOUNT_RESULT = 0x16E, SMSG_DISMOUNTRESULT = 0x16F, SMSG_REMOVED_FROM_PVP_QUEUE = 0x170, CMSG_MOUNTSPECIAL_ANIM = 0x171, diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index ad50ab6d184..b95ede0193e 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4091,6 +4091,23 @@ void Spell::SendPetCastResult(SpellCastResult result) player->SendDirectMessage(&data); } +void Spell::SendMountResult(MountResult result) +{ + if (result == MountResult::Ok) + return; + + if (m_caster->GetTypeId() != TYPEID_PLAYER) + return; + + Player* caster = m_caster->ToPlayer(); + if (caster->IsLoading()) // don't send mount results at loading time + return; + + WorldPackets::Spells::MountResult packet; + packet.Result = AsUnderlyingType(result); + caster->SendDirectMessage(packet.Write()); +} + void Spell::SendSpellStart() { if (!IsNeedSendToClient()) @@ -5893,7 +5910,10 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint return SPELL_FAILED_NO_MOUNTS_ALLOWED; if (unitCaster->IsInDisallowedMountForm()) - return SPELL_FAILED_NOT_SHAPESHIFT; + { + SendMountResult(MountResult::Shapeshifted); // mount result gets sent before the cast result + return SPELL_FAILED_DONT_REPORT; + } break; } case SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS: diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 840dec69b0f..cf5b34dee19 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -471,6 +471,7 @@ class TC_GAME_API Spell static void SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError = SPELL_CUSTOM_ERROR_NONE, uint32* param1 = nullptr, uint32* param2 = nullptr); void SendCastResult(SpellCastResult result, uint32* param1 = nullptr, uint32* param2 = nullptr) const; void SendPetCastResult(SpellCastResult result); + void SendMountResult(MountResult result); void SendSpellStart(); void SendSpellGo(); void SendSpellCooldown(); diff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h index 56e25b9bb70..d5ba8e3cdf9 100644 --- a/src/server/shared/SharedDefines.h +++ b/src/server/shared/SharedDefines.h @@ -3801,6 +3801,21 @@ enum ServerProcessTypes NUM_SERVER_PROCESS_TYPES }; +enum class MountResult : uint32 +{ + InvalidMountee = 0, + TooFarAway = 1, + AlreadyMounted = 2, + NotMountable = 3, + NotYourPet = 4, + Other = 5, + Looting = 6, + RaceCantMount = 7, + Shapeshifted = 8, + ForcedDismount = 9, + Ok = 10 // never sent +}; + namespace Trinity { namespace Impl |