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;
|
||||
void RequestPlayerInfo(unsigned id);
|
||||
void SetPlayerInfo(unsigned id, const PlayerInfo &info, bool retrieveAvatar = true);
|
||||
void SetUnknownPlayer(unsigned id);
|
||||
void SetNewGameAdmin(unsigned id);
|
||||
|
||||
void AddTempAvatarData(unsigned playerId, unsigned avatarSize, AvatarFileType type);
|
||||
void StoreInTempAvatarData(unsigned playerId, const std::vector<unsigned char> &data);
|
||||
void CompleteTempAvatarData(unsigned playerId);
|
||||
void SetUnknownAvatar(unsigned playerId);
|
||||
|
||||
const ClientContext &GetContext() const;
|
||||
ClientContext &GetContext();
|
||||
|
||||
@@ -396,6 +396,12 @@ AbstractClientStateReceiving::Process(ClientThread &client)
|
||||
tmpPacket->ToNetPacketPlayerInfo()->GetData(infoData);
|
||||
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())
|
||||
{
|
||||
NetPacketRemovedFromGame::Data removedData;
|
||||
@@ -500,6 +506,12 @@ AbstractClientStateReceiving::Process(ClientThread &client)
|
||||
tmpPacket->ToNetPacketAvatarEnd()->GetData(endData);
|
||||
client.CompleteTempAvatarData(endData.requestId);
|
||||
}
|
||||
else if (tmpPacket->ToNetPacketUnknownAvatar())
|
||||
{
|
||||
NetPacketUnknownAvatar::Data unknownAvatarData;
|
||||
tmpPacket->ToNetPacketUnknownAvatar()->GetData(unknownAvatarData);
|
||||
client.SetUnknownAvatar(unknownAvatarData.requestId);
|
||||
}
|
||||
else if (tmpPacket->ToNetPacketError())
|
||||
{
|
||||
// Server reported an error.
|
||||
|
||||
@@ -418,7 +418,7 @@ ClientThread::SetPlayerInfo(unsigned id, const PlayerInfo &info, bool retrieveAv
|
||||
m_tempAvatarMap[id] = boost::shared_ptr<AvatarData>();
|
||||
}
|
||||
|
||||
// Remove from request list.
|
||||
// Remove it from the request list.
|
||||
m_playerInfoRequestList.remove(id);
|
||||
|
||||
// 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
|
||||
ClientThread::SetNewGameAdmin(unsigned id)
|
||||
{
|
||||
@@ -484,6 +492,13 @@ ClientThread::CompleteTempAvatarData(unsigned playerId)
|
||||
SetPlayerInfo(playerId, tmpPlayerInfo, false);
|
||||
}
|
||||
|
||||
void
|
||||
ClientThread::SetUnknownAvatar(unsigned playerId)
|
||||
{
|
||||
m_tempAvatarMap.erase(playerId);
|
||||
// TODO log error
|
||||
}
|
||||
|
||||
const ClientContext &
|
||||
ClientThread::GetContext() const
|
||||
{
|
||||
|
||||
@@ -308,6 +308,8 @@ ServerLobbyThread::ProcessLoop()
|
||||
HandleNetPacketInit(session, *packet->ToNetPacketInit());
|
||||
else if (packet->ToNetPacketAvatarHeader())
|
||||
HandleNetPacketAvatarHeader(session, *packet->ToNetPacketAvatarHeader());
|
||||
else if (packet->ToNetPacketUnknownAvatar())
|
||||
HandleNetPacketUnknownAvatar(session, *packet->ToNetPacketUnknownAvatar());
|
||||
else
|
||||
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
|
||||
ServerLobbyThread::HandleNetPacketAvatarFile(SessionWrapper session, const NetPacketAvatarFile &tmpPacket)
|
||||
{
|
||||
@@ -492,12 +506,21 @@ ServerLobbyThread::HandleNetPacketRetrievePlayerInfo(SessionWrapper session, con
|
||||
static_cast<NetPacketPlayerInfo *>(info.get())->SetData(infoData);
|
||||
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
|
||||
ServerLobbyThread::HandleNetPacketRetrieveAvatar(SessionWrapper session, const NetPacketRetrieveAvatar &tmpPacket)
|
||||
{
|
||||
bool avatarFound = false;
|
||||
NetPacketRetrieveAvatar::Data request;
|
||||
tmpPacket.GetData(request);
|
||||
|
||||
@@ -506,8 +529,21 @@ ServerLobbyThread::HandleNetPacketRetrieveAvatar(SessionWrapper session, const N
|
||||
{
|
||||
NetPacketList tmpPackets;
|
||||
if (GetAvatarManager().AvatarFileToNetPackets(tmpFile, request.requestId, tmpPackets))
|
||||
{
|
||||
avatarFound = true;
|
||||
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 HandleNetPacketInit(SessionWrapper session, const NetPacketInit &tmpPacket);
|
||||
void HandleNetPacketAvatarHeader(SessionWrapper session, const NetPacketAvatarHeader &tmpPacket);
|
||||
void HandleNetPacketUnknownAvatar(SessionWrapper session, const NetPacketUnknownAvatar &tmpPacket);
|
||||
void HandleNetPacketAvatarFile(SessionWrapper session, const NetPacketAvatarFile &tmpPacket);
|
||||
void HandleNetPacketAvatarEnd(SessionWrapper session, const NetPacketAvatarEnd &tmpPacket);
|
||||
void HandleNetPacketRetrievePlayerInfo(SessionWrapper session, const NetPacketRetrievePlayerInfo &tmpPacket);
|
||||
|
||||
Reference in New Issue
Block a user