diff --git a/src/game/Object/Player.cpp b/src/game/Object/Player.cpp index 2d0a0803..241cc3cd 100644 --- a/src/game/Object/Player.cpp +++ b/src/game/Object/Player.cpp @@ -17242,6 +17242,20 @@ void Player::Unmount(bool from_aura) } } +void Player::SendMountResult(PlayerMountResult result) +{ + WorldPacket data(SMSG_MOUNTRESULT, 4); + data << uint32(result); + GetSession()->SendPacket(&data); +} + +void Player::SendDismountResult(PlayerDismountResult result) +{ + WorldPacket data(SMSG_DISMOUNTRESULT, 4); + data << uint32(result); + GetSession()->SendPacket(&data); +} + void Player::ProhibitSpellSchool(SpellSchoolMask idSchoolMask, uint32 unTimeMs) { // last check 1.12 diff --git a/src/game/Object/Player.h b/src/game/Object/Player.h index a9566300..ab2afe9d 100644 --- a/src/game/Object/Player.h +++ b/src/game/Object/Player.h @@ -725,6 +725,29 @@ enum PlayerRestState REST_STATE_RAF_LINKED = 0x04 // Exact use unknown }; +enum PlayerMountResult +{ + MOUNTRESULT_INVALIDMOUNTEE = 0, // You can't mount that unit! + MOUNTRESULT_TOOFARAWAY = 1, // That mount is too far away! + MOUNTRESULT_ALREADYMOUNTED = 2, // You're already mounted! + MOUNTRESULT_NOTMOUNTABLE = 3, // That unit can't be mounted! + MOUNTRESULT_NOTYOURPET = 4, // That mount isn't your pet! + MOUNTRESULT_OTHER = 5, // internal + MOUNTRESULT_LOOTING = 6, // You can't mount while looting! + MOUNTRESULT_RACECANTMOUNT = 7, // You can't mount because of your race! + MOUNTRESULT_SHAPESHIFTED = 8, // You can't mount while shapeshifted! + MOUNTRESULT_FORCEDDISMOUNT = 9, // You dismount before continuing. + MOUNTRESULT_OK = 10 // no error +}; + +enum PlayerDismountResult +{ + DISMOUNTRESULT_NOPET = 0, // internal + DISMOUNTRESULT_NOTMOUNTED = 1, // You're not mounted! + DISMOUNTRESULT_NOTYOURPET = 2, // internal + DISMOUNTRESULT_OK = 3 // no error +}; + class PlayerTaxi { public: @@ -994,6 +1017,8 @@ class Player : public Unit void ContinueTaxiFlight(); void Mount(uint32 mount, uint32 spellId = 0) override; void Unmount(bool from_aura = false) override; + void SendMountResult(PlayerMountResult result); + void SendDismountResult(PlayerDismountResult result); bool isAcceptTickets() const { return GetSession()->GetSecurity() >= SEC_GAMEMASTER && (m_ExtraFlags & PLAYER_EXTRA_GM_ACCEPT_TICKETS); } void SetAcceptTicket(bool on) { if (on) { m_ExtraFlags |= PLAYER_EXTRA_GM_ACCEPT_TICKETS; } else { m_ExtraFlags &= ~PLAYER_EXTRA_GM_ACCEPT_TICKETS; } } bool isAcceptWhispers() const { return m_ExtraFlags & PLAYER_EXTRA_ACCEPT_WHISPERS; } diff --git a/src/game/Server/Opcodes.cpp b/src/game/Server/Opcodes.cpp index a37e6dd0..2f003907 100644 --- a/src/game/Server/Opcodes.cpp +++ b/src/game/Server/Opcodes.cpp @@ -426,8 +426,8 @@ void Opcodes::BuildOpcodeList() /*[-ZERO] Need check */ /*0x16B*/ StoreOpcode(SMSG_DUEL_WINNER, "SMSG_DUEL_WINNER", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x16C*/ StoreOpcode(CMSG_DUEL_ACCEPTED, "CMSG_DUEL_ACCEPTED", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDuelAcceptedOpcode); /*[-ZERO] Need check */ /*0x16D*/ StoreOpcode(CMSG_DUEL_CANCELLED, "CMSG_DUEL_CANCELLED", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDuelCancelledOpcode); - /*[-ZERO] Need check */ /*0x16E*/ StoreOpcode(SMSG_MOUNTRESULT, "SMSG_MOUNTRESULT", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); - /*[-ZERO] Need check */ /*0x16F*/ StoreOpcode(SMSG_DISMOUNTRESULT, "SMSG_DISMOUNTRESULT", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); + /*0x16E*/ StoreOpcode(SMSG_MOUNTRESULT, "SMSG_MOUNTRESULT", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); + /*0x16F*/ StoreOpcode(SMSG_DISMOUNTRESULT, "SMSG_DISMOUNTRESULT", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x170*/ StoreOpcode(SMSG_PUREMOUNT_CANCELLED_OBSOLETE, "SMSG_PUREMOUNT_CANCELLED_OBSOLETE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*[-ZERO] Need check */ /*0x171*/ StoreOpcode(CMSG_MOUNTSPECIAL_ANIM, "CMSG_MOUNTSPECIAL_ANIM", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMountSpecialAnimOpcode); /*[-ZERO] Need check */ /*0x172*/ StoreOpcode(SMSG_MOUNTSPECIAL_ANIM, "SMSG_MOUNTSPECIAL_ANIM", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide);