aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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/Server/Protocol/Opcodes.h2
-rw-r--r--src/server/game/Spells/Spell.cpp22
-rw-r--r--src/server/game/Spells/Spell.h1
-rw-r--r--src/server/shared/SharedDefines.h15
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