aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h15
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp7
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h10
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Spells/Spell.cpp22
-rw-r--r--src/server/game/Spells/Spell.h1
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();