Don't wait endlessly for player or avatar requests to complete if the other side does not have the required data. Send notifications and react accordingly.
This commit is contained in:
@@ -87,11 +87,13 @@ protected:
|
|||||||
bool GetCachedPlayerInfo(unsigned id, PlayerInfo &info) const;
|
bool GetCachedPlayerInfo(unsigned id, PlayerInfo &info) const;
|
||||||
void RequestPlayerInfo(unsigned id);
|
void RequestPlayerInfo(unsigned id);
|
||||||
void SetPlayerInfo(unsigned id, const PlayerInfo &info, bool retrieveAvatar = true);
|
void SetPlayerInfo(unsigned id, const PlayerInfo &info, bool retrieveAvatar = true);
|
||||||
|
void SetUnknownPlayer(unsigned id);
|
||||||
void SetNewGameAdmin(unsigned id);
|
void SetNewGameAdmin(unsigned id);
|
||||||
|
|
||||||
void AddTempAvatarData(unsigned playerId, unsigned avatarSize, AvatarFileType type);
|
void AddTempAvatarData(unsigned playerId, unsigned avatarSize, AvatarFileType type);
|
||||||
void StoreInTempAvatarData(unsigned playerId, const std::vector<unsigned char> &data);
|
void StoreInTempAvatarData(unsigned playerId, const std::vector<unsigned char> &data);
|
||||||
void CompleteTempAvatarData(unsigned playerId);
|
void CompleteTempAvatarData(unsigned playerId);
|
||||||
|
void SetUnknownAvatar(unsigned playerId);
|
||||||
|
|
||||||
const ClientContext &GetContext() const;
|
const ClientContext &GetContext() const;
|
||||||
ClientContext &GetContext();
|
ClientContext &GetContext();
|
||||||
|
|||||||
@@ -396,6 +396,12 @@ AbstractClientStateReceiving::Process(ClientThread &client)
|
|||||||
tmpPacket->ToNetPacketPlayerInfo()->GetData(infoData);
|
tmpPacket->ToNetPacketPlayerInfo()->GetData(infoData);
|
||||||
client.SetPlayerInfo(infoData.playerId, infoData.playerInfo);
|
client.SetPlayerInfo(infoData.playerId, infoData.playerInfo);
|
||||||
}
|
}
|
||||||
|
else if (tmpPacket->ToNetPacketUnknownPlayerId())
|
||||||
|
{
|
||||||
|
NetPacketUnknownPlayerId::Data unknownIdData;
|
||||||
|
tmpPacket->ToNetPacketUnknownPlayerId()->GetData(unknownIdData);
|
||||||
|
client.SetUnknownPlayer(unknownIdData.playerId);
|
||||||
|
}
|
||||||
else if (tmpPacket->ToNetPacketRemovedFromGame())
|
else if (tmpPacket->ToNetPacketRemovedFromGame())
|
||||||
{
|
{
|
||||||
NetPacketRemovedFromGame::Data removedData;
|
NetPacketRemovedFromGame::Data removedData;
|
||||||
@@ -500,6 +506,12 @@ AbstractClientStateReceiving::Process(ClientThread &client)
|
|||||||
tmpPacket->ToNetPacketAvatarEnd()->GetData(endData);
|
tmpPacket->ToNetPacketAvatarEnd()->GetData(endData);
|
||||||
client.CompleteTempAvatarData(endData.requestId);
|
client.CompleteTempAvatarData(endData.requestId);
|
||||||
}
|
}
|
||||||
|
else if (tmpPacket->ToNetPacketUnknownAvatar())
|
||||||
|
{
|
||||||
|
NetPacketUnknownAvatar::Data unknownAvatarData;
|
||||||
|
tmpPacket->ToNetPacketUnknownAvatar()->GetData(unknownAvatarData);
|
||||||
|
client.SetUnknownAvatar(unknownAvatarData.requestId);
|
||||||
|
}
|
||||||
else if (tmpPacket->ToNetPacketError())
|
else if (tmpPacket->ToNetPacketError())
|
||||||
{
|
{
|
||||||
// Server reported an error.
|
// Server reported an error.
|
||||||
|
|||||||
@@ -418,7 +418,7 @@ ClientThread::SetPlayerInfo(unsigned id, const PlayerInfo &info, bool retrieveAv
|
|||||||
m_tempAvatarMap[id] = boost::shared_ptr<AvatarData>();
|
m_tempAvatarMap[id] = boost::shared_ptr<AvatarData>();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove from request list.
|
// Remove it from the request list.
|
||||||
m_playerInfoRequestList.remove(id);
|
m_playerInfoRequestList.remove(id);
|
||||||
|
|
||||||
// Notify GUI
|
// Notify GUI
|
||||||
@@ -426,6 +426,14 @@ ClientThread::SetPlayerInfo(unsigned id, const PlayerInfo &info, bool retrieveAv
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ClientThread::SetUnknownPlayer(unsigned id)
|
||||||
|
{
|
||||||
|
// Just remove it from the request list.
|
||||||
|
m_playerInfoRequestList.remove(id);
|
||||||
|
// TODO log error
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ClientThread::SetNewGameAdmin(unsigned id)
|
ClientThread::SetNewGameAdmin(unsigned id)
|
||||||
{
|
{
|
||||||
@@ -484,6 +492,13 @@ ClientThread::CompleteTempAvatarData(unsigned playerId)
|
|||||||
SetPlayerInfo(playerId, tmpPlayerInfo, false);
|
SetPlayerInfo(playerId, tmpPlayerInfo, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ClientThread::SetUnknownAvatar(unsigned playerId)
|
||||||
|
{
|
||||||
|
m_tempAvatarMap.erase(playerId);
|
||||||
|
// TODO log error
|
||||||
|
}
|
||||||
|
|
||||||
const ClientContext &
|
const ClientContext &
|
||||||
ClientThread::GetContext() const
|
ClientThread::GetContext() const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -308,6 +308,8 @@ ServerLobbyThread::ProcessLoop()
|
|||||||
HandleNetPacketInit(session, *packet->ToNetPacketInit());
|
HandleNetPacketInit(session, *packet->ToNetPacketInit());
|
||||||
else if (packet->ToNetPacketAvatarHeader())
|
else if (packet->ToNetPacketAvatarHeader())
|
||||||
HandleNetPacketAvatarHeader(session, *packet->ToNetPacketAvatarHeader());
|
HandleNetPacketAvatarHeader(session, *packet->ToNetPacketAvatarHeader());
|
||||||
|
else if (packet->ToNetPacketUnknownAvatar())
|
||||||
|
HandleNetPacketUnknownAvatar(session, *packet->ToNetPacketUnknownAvatar());
|
||||||
else
|
else
|
||||||
SessionError(session, ERR_SOCK_INVALID_STATE);
|
SessionError(session, ERR_SOCK_INVALID_STATE);
|
||||||
}
|
}
|
||||||
@@ -419,6 +421,18 @@ ServerLobbyThread::HandleNetPacketAvatarHeader(SessionWrapper session, const Net
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ServerLobbyThread::HandleNetPacketUnknownAvatar(SessionWrapper session, const NetPacketUnknownAvatar &/*tmpPacket*/)
|
||||||
|
{
|
||||||
|
if (session.playerData.get())
|
||||||
|
{
|
||||||
|
// Free memory (just in case).
|
||||||
|
session.playerData->SetNetAvatarData(boost::shared_ptr<AvatarData>());
|
||||||
|
// Start session.
|
||||||
|
EstablishSession(session);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ServerLobbyThread::HandleNetPacketAvatarFile(SessionWrapper session, const NetPacketAvatarFile &tmpPacket)
|
ServerLobbyThread::HandleNetPacketAvatarFile(SessionWrapper session, const NetPacketAvatarFile &tmpPacket)
|
||||||
{
|
{
|
||||||
@@ -492,12 +506,21 @@ ServerLobbyThread::HandleNetPacketRetrievePlayerInfo(SessionWrapper session, con
|
|||||||
static_cast<NetPacketPlayerInfo *>(info.get())->SetData(infoData);
|
static_cast<NetPacketPlayerInfo *>(info.get())->SetData(infoData);
|
||||||
GetSender().Send(session.sessionData->GetSocket(), info);
|
GetSender().Send(session.sessionData->GetSocket(), info);
|
||||||
}
|
}
|
||||||
// TODO: handle error
|
else
|
||||||
|
{
|
||||||
|
// Unknown player id - notify client.
|
||||||
|
boost::shared_ptr<NetPacket> unknown(new NetPacketUnknownPlayerId);
|
||||||
|
NetPacketUnknownPlayerId::Data unknownData;
|
||||||
|
unknownData.playerId = request.playerId;
|
||||||
|
static_cast<NetPacketUnknownPlayerId *>(unknown.get())->SetData(unknownData);
|
||||||
|
GetSender().Send(session.sessionData->GetSocket(), unknown);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ServerLobbyThread::HandleNetPacketRetrieveAvatar(SessionWrapper session, const NetPacketRetrieveAvatar &tmpPacket)
|
ServerLobbyThread::HandleNetPacketRetrieveAvatar(SessionWrapper session, const NetPacketRetrieveAvatar &tmpPacket)
|
||||||
{
|
{
|
||||||
|
bool avatarFound = false;
|
||||||
NetPacketRetrieveAvatar::Data request;
|
NetPacketRetrieveAvatar::Data request;
|
||||||
tmpPacket.GetData(request);
|
tmpPacket.GetData(request);
|
||||||
|
|
||||||
@@ -506,8 +529,21 @@ ServerLobbyThread::HandleNetPacketRetrieveAvatar(SessionWrapper session, const N
|
|||||||
{
|
{
|
||||||
NetPacketList tmpPackets;
|
NetPacketList tmpPackets;
|
||||||
if (GetAvatarManager().AvatarFileToNetPackets(tmpFile, request.requestId, tmpPackets))
|
if (GetAvatarManager().AvatarFileToNetPackets(tmpFile, request.requestId, tmpPackets))
|
||||||
|
{
|
||||||
|
avatarFound = true;
|
||||||
GetSender().SendLowPrio(session.sessionData->GetSocket(), tmpPackets);
|
GetSender().SendLowPrio(session.sessionData->GetSocket(), tmpPackets);
|
||||||
// TODO handle error
|
}
|
||||||
|
// TODO Log error
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!avatarFound)
|
||||||
|
{
|
||||||
|
// Notify client we didn't find the avatar.
|
||||||
|
boost::shared_ptr<NetPacket> unknown(new NetPacketUnknownAvatar);
|
||||||
|
NetPacketUnknownAvatar::Data unknownData;
|
||||||
|
unknownData.requestId = request.requestId;
|
||||||
|
static_cast<NetPacketUnknownAvatar *>(unknown.get())->SetData(unknownData);
|
||||||
|
GetSender().Send(session.sessionData->GetSocket(), unknown);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ protected:
|
|||||||
void ProcessLoop();
|
void ProcessLoop();
|
||||||
void HandleNetPacketInit(SessionWrapper session, const NetPacketInit &tmpPacket);
|
void HandleNetPacketInit(SessionWrapper session, const NetPacketInit &tmpPacket);
|
||||||
void HandleNetPacketAvatarHeader(SessionWrapper session, const NetPacketAvatarHeader &tmpPacket);
|
void HandleNetPacketAvatarHeader(SessionWrapper session, const NetPacketAvatarHeader &tmpPacket);
|
||||||
|
void HandleNetPacketUnknownAvatar(SessionWrapper session, const NetPacketUnknownAvatar &tmpPacket);
|
||||||
void HandleNetPacketAvatarFile(SessionWrapper session, const NetPacketAvatarFile &tmpPacket);
|
void HandleNetPacketAvatarFile(SessionWrapper session, const NetPacketAvatarFile &tmpPacket);
|
||||||
void HandleNetPacketAvatarEnd(SessionWrapper session, const NetPacketAvatarEnd &tmpPacket);
|
void HandleNetPacketAvatarEnd(SessionWrapper session, const NetPacketAvatarEnd &tmpPacket);
|
||||||
void HandleNetPacketRetrievePlayerInfo(SessionWrapper session, const NetPacketRetrievePlayerInfo &tmpPacket);
|
void HandleNetPacketRetrievePlayerInfo(SessionWrapper session, const NetPacketRetrievePlayerInfo &tmpPacket);
|
||||||
|
|||||||
Reference in New Issue
Block a user