From 7f9e336fb5c86ea0123699cb0daff3ab56b13715 Mon Sep 17 00:00:00 2001 From: Yaki Khadafi Date: Sun, 7 Jan 2018 21:43:07 +0100 Subject: [PATCH] Implement battlefield handlers Signed-off-by: Xfurry --- src/game/Battlefield/BattlefieldHandler.cpp | 128 ++++++++++++++++++++ src/game/Server/Opcodes.cpp | 10 +- src/game/Server/WorldSession.h | 20 +++ 3 files changed, 153 insertions(+), 5 deletions(-) diff --git a/src/game/Battlefield/BattlefieldHandler.cpp b/src/game/Battlefield/BattlefieldHandler.cpp index 7a2ad73c25f..c15a7aa26b9 100644 --- a/src/game/Battlefield/BattlefieldHandler.cpp +++ b/src/game/Battlefield/BattlefieldHandler.cpp @@ -15,3 +15,131 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +#include "Common.h" +#include "Server/WorldSession.h" +#include "OutdoorPvP/OutdoorPvPMgr.h" +#include "Battlefield/Battlefield.h" + +/** +Invite a player to join and teleport to a battlefield + +@param battlefield id +@param zone id for the battlefield +@param time delay to accept the invitation +*/ +void WorldSession::SendBattlefieldWarInvite(uint32 battlefieldId, uint32 zoneId, uint32 acceptDelay) +{ + WorldPacket data(SMSG_BATTLEFIELD_MANAGER_ENTRY_INVITE, 12); + data << uint32(battlefieldId); + data << uint32(zoneId); + data << uint32(time(NULL) + acceptDelay); + + SendPacket(data); +} + +/** +Invite a player to queue for a battlefield (when entering zone or by battlemaster) + +@param battlefield id +*/ +void WorldSession::SendBattlefieldQueueInvite(uint32 battlefieldId) +{ + WorldPacket data(SMSG_BATTLEFIELD_MANAGER_QUEUE_INVITE, 5); + + data << uint32(battlefieldId); + data << uint8(1); // warmup ? used ? + + SendPacket(data); +} + +/** +Send response to player when he joins the battlefield queue + +@param battlefield id +@param zone id for the battlefield +@param if player is able to queue +@param if battlefield is full +*/ +void WorldSession::SendBattlefieldQueueResponse(uint32 battlefieldId, uint32 zoneId, bool canJoin, bool queueFull) +{ + WorldPacket data(SMSG_BATTLEFIELD_MANAGER_QUEUE_REQUEST_RESPONSE, 11); + data << uint32(battlefieldId); + data << uint32(zoneId); + data << uint8(canJoin ? 1 : 0); // Accepted // 0 cannot queue // 1 already in queue + data << uint8(queueFull ? 0 : 1); // Logging In // 0 queue full // 1 queue for upcoming battle + data << uint8(1); // Warmup + + SendPacket(data); +} + +/** +Send response when player accepts invitation to a battlefield + +@param battlefield id +*/ +void WorldSession::SendBattlefieldEnteredResponse(uint32 battlefieldId) +{ + WorldPacket data(SMSG_BATTLEFIELD_MANAGER_ENTERING, 7); + data << uint32(battlefieldId); + data << uint8(1); // unk + data << uint8(1); // unk + data << uint8(_player->isAFK() ? 1 : 0); // Clear AFK + + SendPacket(data); +} + +/** +Send response when player leaves a battlefield + +@param battlefield id +@param leave reason +*/ +void WorldSession::SendBattlefieldLeaveMessage(uint32 battlefieldId, BattlefieldLeaveReason reason) +{ + WorldPacket data(SMSG_BATTLEFIELD_MANAGER_EJECTED, 7); + data << uint32(battlefieldId); + data << uint8(reason); // byte Reason + data << uint8(2); // byte BattleStatus + data << uint8(0); // bool Relocated + + SendPacket(data); +} + +// Sent by client when player clicks accept / reject queue invitation +void WorldSession::HandleBattlefieldQueueResponse(WorldPacket& recv_data) +{ + uint32 battlefieldId; + uint8 accepted; + + recv_data >> battlefieldId >> accepted; + DEBUG_LOG("HandleBattlefieldQueueResponse: battlefieldId: %u accepted: %u", battlefieldId, accepted); + + if (Battlefield* battlefield = sOutdoorPvPMgr.GetBattlefieldById(battlefieldId)) + battlefield->HandleQueueInviteResponse(GetPlayer(), accepted); +} + +// Sent by client when player clicks accept / reject war invitation +void WorldSession::HandleBattlefieldWarResponse(WorldPacket& recv_data) +{ + uint32 battlefieldId; + uint8 accepted; + + recv_data >> battlefieldId >> accepted; + DEBUG_LOG("HandleBattlefieldWarResponse: battlefieldId: %u accepted: %u", battlefieldId, accepted); + + if (Battlefield* battlefield = sOutdoorPvPMgr.GetBattlefieldById(battlefieldId)) + battlefield->HandleWarInviteResponse(GetPlayer(), accepted); +} + +// Sent by client when player exits the battlefield +void WorldSession::HandleBattlefieldExitRequest(WorldPacket& recv_data) +{ + uint32 battlefieldId; + recv_data >> battlefieldId; + + DEBUG_LOG("HandleBattlefieldExitRequest: battlefieldId: %u", battlefieldId); + + if (Battlefield* battlefield = sOutdoorPvPMgr.GetBattlefieldById(battlefieldId)) + battlefield->HandleExitRequest(GetPlayer()); +} diff --git a/src/game/Server/Opcodes.cpp b/src/game/Server/Opcodes.cpp index 1f666d7b132..ca4a0ba4745 100644 --- a/src/game/Server/Opcodes.cpp +++ b/src/game/Server/Opcodes.cpp @@ -1273,18 +1273,18 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES] = /*0x4DC*/ { "SMSG_PVP_QUEUE_STATS", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL }, /*0x4DD*/ { "CMSG_SET_PAID_SERVICE_CHEAT", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL }, /*0x4DE*/ { "SMSG_BATTLEFIELD_MANAGER_ENTRY_INVITE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide }, - /*0x4DF*/ { "CMSG_BATTLEFIELD_MANAGER_ENTRY_INVITE_RESPONSE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL }, + /*0x4DF*/ { "CMSG_BATTLEFIELD_MANAGER_ENTRY_INVITE_RESPONSE", STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBattlefieldWarResponse }, /*0x4E0*/ { "SMSG_BATTLEFIELD_MANAGER_ENTERING", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide }, /*0x4E1*/ { "SMSG_BATTLEFIELD_MANAGER_QUEUE_INVITE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide }, - /*0x4E2*/ { "CMSG_BATTLEFIELD_MANAGER_QUEUE_INVITE_RESPONSE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL }, + /*0x4E2*/ { "CMSG_BATTLEFIELD_MANAGER_QUEUE_INVITE_RESPONSE", STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBattlefieldQueueResponse }, /*0x4E3*/ { "CMSG_BATTLEFIELD_MANAGER_QUEUE_REQUEST", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL }, - /*0x4E4*/ { "SMSG_BATTLEFIELD_MANAGER_QUEUE_REQUEST_RESPONSE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide }, + /*0x4E4*/ { "SMSG_BATTLEFIELD_MANAGER_QUEUE_REQUEST_RESPONSE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide }, /*0x4E5*/ { "SMSG_BATTLEFIELD_MANAGER_EJECT_PENDING", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide }, /*0x4E6*/ { "SMSG_BATTLEFIELD_MANAGER_EJECTED", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide }, - /*0x4E7*/ { "CMSG_BATTLEFIELD_MANAGER_EXIT_REQUEST", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL }, + /*0x4E7*/ { "CMSG_BATTLEFIELD_MANAGER_EXIT_REQUEST", STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBattlefieldExitRequest }, /*0x4E8*/ { "SMSG_BATTLEFIELD_MANAGER_STATE_CHANGED", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide }, /*0x4E9*/ { "CMSG_BATTLEFIELD_MANAGER_ADVANCE_STATE", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL }, - /*0x4EA*/ { "CMSG_BATTLEFIELD_MANAGER_SET_NEXT_TRANSITION_TIME", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL }, + /*0x4EA*/ { "CMSG_BATTLEFIELD_MANAGER_SET_NEXT_TRANSITION_TIME", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL }, /*0x4EB*/ { "MSG_SET_RAID_DIFFICULTY", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetRaidDifficultyOpcode }, /*0x4EC*/ { "CMSG_XPGAIN", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL }, /*0x4ED*/ { "SMSG_XPGAIN", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide }, diff --git a/src/game/Server/WorldSession.h b/src/game/Server/WorldSession.h index 9edea26744c..18266c3ac9f 100644 --- a/src/game/Server/WorldSession.h +++ b/src/game/Server/WorldSession.h @@ -103,6 +103,15 @@ enum PartyOperation PARTY_OP_SWAP = 4 }; +enum BattlefieldLeaveReason +{ + BATTLEFIELD_LEAVE_REASON_CLOSE = 0x00000001, + //BATTLEFIELD_LEAVE_REASON_UNK1 = 0x00000002, (not used) + //BATTLEFIELD_LEAVE_REASON_UNK2 = 0x00000004, (not used) + BATTLEFIELD_LEAVE_REASON_EXITED = 0x00000008, + BATTLEFIELD_LEAVE_REASON_LOW_LEVEL = 0x00000010 +}; + enum PartyResult { ERR_PARTY_RESULT_OK = 0, @@ -865,6 +874,17 @@ class WorldSession void HandleCalendarComplain(WorldPacket& recv_data); void HandleCalendarGetNumPending(WorldPacket& recv_data); + // Battlefield + void SendBattlefieldWarInvite(uint32 battlefieldId, uint32 zoneId, uint32 acceptDelay); + void SendBattlefieldQueueInvite(uint32 battlefieldId); + void SendBattlefieldQueueResponse(uint32 battlefieldId, uint32 zoneId, bool canJoin, bool queueFull); + void SendBattlefieldEnteredResponse(uint32 battlefieldId); + void SendBattlefieldLeaveMessage(uint32 battlefieldId, BattlefieldLeaveReason reason); + + void HandleBattlefieldQueueResponse(WorldPacket& recv_data); + void HandleBattlefieldWarResponse(WorldPacket& recv_data); + void HandleBattlefieldExitRequest(WorldPacket& recv_data); + void HandleSpellClick(WorldPacket& recv_data); void HandleGetMirrorimageData(WorldPacket& recv_data); void HandleUpdateMissileTrajectory(WorldPacket& recv_data);