Skip to content

Commit

Permalink
Implement battlefield handlers
Browse files Browse the repository at this point in the history
Signed-off-by: Xfurry <xfurry.cmangos@outlook.com>
  • Loading branch information
Zakamurite authored and xfurry committed Jan 7, 2018
1 parent 7f25dd2 commit 7f9e336
Show file tree
Hide file tree
Showing 3 changed files with 153 additions and 5 deletions.
128 changes: 128 additions & 0 deletions src/game/Battlefield/BattlefieldHandler.cpp
Expand Up @@ -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());
}
10 changes: 5 additions & 5 deletions src/game/Server/Opcodes.cpp
Expand Up @@ -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 },
Expand Down
20 changes: 20 additions & 0 deletions src/game/Server/WorldSession.h
Expand Up @@ -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,
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 7f9e336

Please sign in to comment.