diff options
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 15 | ||||
-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/Spells/Spell.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 1 |
6 files changed, 55 insertions, 2 deletions
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 1002ab50684..68ebcfa641c 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -6516,4 +6516,19 @@ enum class GameError : uint32 ERR_NOT_IN_PET_BATTLE = 1047, }; +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 +}; + #endif diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index bed65c17192..df65ce8d81f 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -960,3 +960,10 @@ WorldPacket const* WorldPackets::Spells::CustomLoadScreen::Write() _worldPacket << uint32(LoadingScreenID); 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 5d4544f3779..afef30bcb86 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -999,6 +999,16 @@ namespace WorldPackets uint32 TeleportSpellID; uint32 LoadingScreenID; }; + + 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 306144a1ac8..cd566b41876 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1465,7 +1465,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_PARTY_RANGE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOTD, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNT_EQUIPMENT_APPLY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_APPLY_MOVEMENT_FORCE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_COLLISION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_DOUBLE_JUMP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 779b0d0495c..a03788cdda5 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3952,6 +3952,23 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint32 sp caster->GetSession()->SendPacket(packet.Write()); } +void Spell::SendMountResult(MountResult result) +{ + if (result == MountResult::Ok) + return; + + if (!m_caster->IsPlayer()) + 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()) @@ -5712,7 +5729,10 @@ SpellCastResult Spell::CheckCast(bool strict, uint32* param1 /*= nullptr*/, uint return SPELL_FAILED_NO_MOUNTS_ALLOWED; if (m_caster->IsInDisallowedMountForm()) - return SPELL_FAILED_NOT_SHAPESHIFT; + { + SendMountResult(MountResult::Shapeshifted); // mount result gets sent before the cast result + return SPELL_FAILED_DONT_REPORT; + } break; } diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index f31c2b12bf5..b8b72b5dcfc 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -576,6 +576,7 @@ class TC_GAME_API Spell static void SendCastResult(Player* caster, SpellInfo const* spellInfo, uint32 spellVisual, ObjectGuid cast_count, 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, uint32* param1 = nullptr, uint32* param2 = nullptr) const; + void SendMountResult(MountResult result); void SendSpellStart(); void SendSpellGo(); void SendSpellCooldown(); |