Core/PacketIO: Fixed server queue display

Closes #18218
This commit is contained in:
Shauren
2016-11-27 12:29:31 +01:00
parent 90070d59ea
commit e12e5f88ec
4 changed files with 59 additions and 28 deletions

View File

@@ -27,12 +27,7 @@ void WorldSession::SendAuthResponse(uint32 code, bool queued, uint32 queuePos)
WorldPackets::Auth::AuthResponse response;
response.Result = code;
if (queued)
{
response.WaitInfo = boost::in_place();
response.WaitInfo->WaitCount = queuePos;
}
else if (code == ERROR_OK)
if (code == ERROR_OK)
{
response.SuccessInfo = boost::in_place();
@@ -53,21 +48,27 @@ void WorldSession::SendAuthResponse(uint32 code, bool queued, uint32 queuePos)
response.SuccessInfo->AvailableRaces = &sObjectMgr->GetRaceExpansionRequirements();
}
if (queued)
{
response.WaitInfo = boost::in_place();
response.WaitInfo->WaitCount = queuePos;
}
SendPacket(response.Write());
}
void WorldSession::SendAuthWaitQue(uint32 position)
{
WorldPackets::Auth::AuthResponse response;
response.Result = ERROR_OK;
if (position)
{
response.WaitInfo = boost::in_place();
response.WaitInfo->WaitCount = position;
WorldPackets::Auth::WaitQueueUpdate waitQueueUpdate;
waitQueueUpdate.WaitInfo.WaitCount = position;
waitQueueUpdate.WaitInfo.WaitTime = 0;
waitQueueUpdate.WaitInfo.HasFCM = false;
SendPacket(waitQueueUpdate.Write());
}
SendPacket(response.Write());
else
SendPacket(WorldPackets::Auth::WaitQueueFinish().Write());
}
void WorldSession::SendClientCacheVersion(uint32 version)

View File

@@ -73,6 +73,16 @@ void WorldPackets::Auth::AuthSession::Read()
}
}
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Auth::AuthWaitInfo const& waitInfo)
{
data << uint32(waitInfo.WaitCount);
data << uint32(waitInfo.WaitTime);
data.WriteBit(waitInfo.HasFCM);
data.FlushBits();
return data;
}
WorldPackets::Auth::AuthResponse::AuthResponse()
: ServerPacket(SMSG_AUTH_RESPONSE, 132)
{
@@ -166,12 +176,14 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write()
}
if (WaitInfo)
{
_worldPacket << uint32(WaitInfo->WaitCount);
_worldPacket << uint32(WaitInfo->WaitTime);
_worldPacket.WriteBit(WaitInfo->HasFCM);
_worldPacket.FlushBits();
}
_worldPacket << *WaitInfo;
return &_worldPacket;
}
WorldPacket const* WorldPackets::Auth::WaitQueueUpdate::Write()
{
_worldPacket << WaitInfo;
return &_worldPacket;
}

View File

@@ -99,6 +99,13 @@ namespace WorldPackets
void Read() override;
};
struct AuthWaitInfo
{
uint32 WaitCount = 0; ///< position of the account in the login queue
uint32 WaitTime = 0; ///< Wait time in login queue in minutes, if sent queued and this value is 0 client displays "unknown time"
bool HasFCM = false; ///< true if the account has a forced character migration pending. @todo implement
};
class AuthResponse final : public ServerPacket
{
public:
@@ -146,13 +153,6 @@ namespace WorldPackets
Optional<uint16> NumPlayersAlliance; ///< number of alliance players in this realm. @todo implement
};
struct AuthWaitInfo
{
uint32 WaitCount = 0; ///< position of the account in the login queue
uint32 WaitTime = 0; ///< Wait time in login queue in minutes, if sent queued and this value is 0 client displays "unknown time"
bool HasFCM = false; ///< true if the account has a forced character migration pending. @todo implement
};
AuthResponse();
WorldPacket const* Write() override;
@@ -162,6 +162,24 @@ namespace WorldPackets
uint32 Result = 0; ///< the result of the authentication process, possible values are @ref BattlenetRpcErrorCode
};
class WaitQueueUpdate final : public ServerPacket
{
public:
WaitQueueUpdate() : ServerPacket(SMSG_WAIT_QUEUE_UPDATE, 4 + 4 + 1) { }
WorldPacket const* Write() override;
AuthWaitInfo WaitInfo;
};
class WaitQueueFinish final : public ServerPacket
{
public:
WaitQueueFinish() : ServerPacket(SMSG_WAIT_QUEUE_FINISH, 0) { }
WorldPacket const* Write() override { return &_worldPacket; }
};
enum class ConnectToSerial : uint32
{
None = 0,

View File

@@ -1764,8 +1764,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_TRANSFER_CHANGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_TRANSFER_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WAIT_QUEUE_FINISH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WAIT_QUEUE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WAIT_QUEUE_FINISH, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WAIT_QUEUE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WARDEN_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEATHER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);