Translate network message in main thread
This commit is contained in:
parent
95f3dfc01a
commit
3e95feeb0b
@ -75,6 +75,11 @@ ClientLobby::ClientLobby(const TransportAddress& a, std::shared_ptr<Server> s)
|
||||
m_server_address = a;
|
||||
m_server = s;
|
||||
setHandleDisconnections(true);
|
||||
m_disconnected_msg[PDI_TIMEOUT] = _("Server connection timed out.");
|
||||
m_disconnected_msg[PDI_NORMAL] = _("Server has been shut down.");
|
||||
m_disconnected_msg[PDI_KICK] = _("You were kicked from the server.");
|
||||
m_disconnected_msg[PDI_BAD_CONNECTION] =
|
||||
_("Bad network connection is detected.");
|
||||
} // ClientLobby
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -140,6 +145,12 @@ bool ClientLobby::notifyEvent(Event* event)
|
||||
case LE_CHAT: handleChat(event); break;
|
||||
case LE_CONNECTION_ACCEPTED: connectionAccepted(event); break;
|
||||
case LE_SERVER_INFO: handleServerInfo(event); break;
|
||||
case LE_PLAYER_DISCONNECTED : disconnectedPlayer(event); break;
|
||||
case LE_CONNECTION_REFUSED: connectionRefused(event); break;
|
||||
case LE_VOTE: displayPlayerVote(event); break;
|
||||
case LE_SERVER_OWNERSHIP: becomingServerOwner(); break;
|
||||
case LE_BAD_TEAM: handleBadTeam(); break;
|
||||
case LE_BAD_CONNECTION: handleBadConnection(); break;
|
||||
default:
|
||||
return false;
|
||||
break;
|
||||
@ -161,13 +172,7 @@ bool ClientLobby::notifyEventAsynchronous(Event* event)
|
||||
message_type);
|
||||
switch(message_type)
|
||||
{
|
||||
case LE_PLAYER_DISCONNECTED : disconnectedPlayer(event); break;
|
||||
case LE_START_RACE: startGame(event); break;
|
||||
case LE_CONNECTION_REFUSED: connectionRefused(event); break;
|
||||
case LE_VOTE: displayPlayerVote(event); break;
|
||||
case LE_SERVER_OWNERSHIP: becomingServerOwner(); break;
|
||||
case LE_BAD_TEAM: handleBadTeam(); break;
|
||||
case LE_BAD_CONNECTION: handleBadConnection(); break;
|
||||
default: break;
|
||||
} // switch
|
||||
|
||||
@ -182,25 +187,8 @@ bool ClientLobby::notifyEventAsynchronous(Event* event)
|
||||
// So only signal that STKHost should exit, which will be tested
|
||||
// from the main thread.
|
||||
STKHost::get()->disconnectAllPeers(false/*timeout_waiting*/);
|
||||
switch(event->getPeerDisconnectInfo())
|
||||
{
|
||||
case PDI_TIMEOUT:
|
||||
STKHost::get()->setErrorMessage(
|
||||
_("Server connection timed out."));
|
||||
break;
|
||||
case PDI_NORMAL:
|
||||
STKHost::get()->setErrorMessage(
|
||||
_("Server has been shut down."));
|
||||
break;
|
||||
case PDI_KICK:
|
||||
STKHost::get()->setErrorMessage(
|
||||
_("You were kicked from the server."));
|
||||
break;
|
||||
case PDI_BAD_CONNECTION:
|
||||
STKHost::get()->setErrorMessage(
|
||||
_("Bad network connection is detected."));
|
||||
break;
|
||||
} // switch
|
||||
STKHost::get()->setErrorMessage(
|
||||
m_disconnected_msg.at(event->getPeerDisconnectInfo()));
|
||||
STKHost::get()->requestShutdown();
|
||||
return true;
|
||||
} // disconnection
|
||||
|
@ -24,9 +24,12 @@
|
||||
#include "utils/cpp2011.hpp"
|
||||
|
||||
#include <atomic>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <set>
|
||||
|
||||
enum PeerDisconnectInfo : unsigned int;
|
||||
|
||||
class BareNetworkString;
|
||||
class Server;
|
||||
|
||||
@ -80,6 +83,8 @@ private:
|
||||
void finalizeConnectionRequest(NetworkString* header,
|
||||
BareNetworkString* rest, bool encrypt);
|
||||
|
||||
std::map<PeerDisconnectInfo, irr::core::stringw> m_disconnected_msg;
|
||||
|
||||
public:
|
||||
ClientLobby(const TransportAddress& a, std::shared_ptr<Server> s);
|
||||
virtual ~ClientLobby();
|
||||
|
@ -532,6 +532,7 @@ void ServerLobby::sendBadConnectionMessageToPeer(std::shared_ptr<STKPeer> p)
|
||||
" started at %lf.", p->getAddress().toString().c_str(), max_ping,
|
||||
StkTime::getRealTime());
|
||||
NetworkString* msg = getNetworkString();
|
||||
msg->setSynchronous(true);
|
||||
msg->addUInt8(LE_BAD_CONNECTION);
|
||||
p->sendPacket(msg, /*reliable*/true);
|
||||
delete msg;
|
||||
@ -815,6 +816,7 @@ void ServerLobby::startSelection(const Event *event)
|
||||
{
|
||||
Log::warn("ServerLobby", "Bad team choosing.");
|
||||
NetworkString* bt = getNetworkString();
|
||||
bt->setSynchronous(true);
|
||||
bt->addUInt8(LE_BAD_TEAM);
|
||||
sendMessageToPeers(bt, true/*reliable*/);
|
||||
delete bt;
|
||||
@ -1251,6 +1253,7 @@ void ServerLobby::clientDisconnected(Event* event)
|
||||
return;
|
||||
|
||||
NetworkString* msg = getNetworkString(2);
|
||||
msg->setSynchronous(true);
|
||||
msg->addUInt8(LE_PLAYER_DISCONNECTED);
|
||||
msg->addUInt8((uint8_t)players_on_peer.size());
|
||||
for (auto p : players_on_peer)
|
||||
@ -1299,6 +1302,7 @@ void ServerLobby::connectionRequested(Event* event)
|
||||
m_game_setup->isGrandPrixStarted())
|
||||
{
|
||||
NetworkString *message = getNetworkString(2);
|
||||
message->setSynchronous(true);
|
||||
message->addUInt8(LE_CONNECTION_REFUSED).addUInt8(RR_BUSY);
|
||||
// send only to the peer that made the request and disconect it now
|
||||
peer->sendPacket(message, true/*reliable*/, false/*encrypted*/);
|
||||
@ -1314,6 +1318,7 @@ void ServerLobby::connectionRequested(Event* event)
|
||||
version > stk_config->m_max_server_version)
|
||||
{
|
||||
NetworkString *message = getNetworkString(2);
|
||||
message->setSynchronous(true);
|
||||
message->addUInt8(LE_CONNECTION_REFUSED)
|
||||
.addUInt8(RR_INCOMPATIBLE_DATA);
|
||||
peer->sendPacket(message, true/*reliable*/, false/*encrypted*/);
|
||||
@ -1361,6 +1366,7 @@ void ServerLobby::connectionRequested(Event* event)
|
||||
tracks_erase.size() == m_available_kts.second.size())
|
||||
{
|
||||
NetworkString *message = getNetworkString(2);
|
||||
message->setSynchronous(true);
|
||||
message->addUInt8(LE_CONNECTION_REFUSED)
|
||||
.addUInt8(RR_INCOMPATIBLE_DATA);
|
||||
peer->cleanPlayerProfiles();
|
||||
@ -1395,6 +1401,7 @@ void ServerLobby::connectionRequested(Event* event)
|
||||
if (is_banned)
|
||||
{
|
||||
NetworkString *message = getNetworkString(2);
|
||||
message->setSynchronous(true);
|
||||
message->addUInt8(LE_CONNECTION_REFUSED).addUInt8(RR_BANNED);
|
||||
peer->cleanPlayerProfiles();
|
||||
peer->sendPacket(message, true/*reliable*/, false/*encrypted*/);
|
||||
@ -1408,6 +1415,7 @@ void ServerLobby::connectionRequested(Event* event)
|
||||
NetworkConfig::get()->getMaxPlayers())
|
||||
{
|
||||
NetworkString *message = getNetworkString(2);
|
||||
message->setSynchronous(true);
|
||||
message->addUInt8(LE_CONNECTION_REFUSED).addUInt8(RR_TOO_MANY_PLAYERS);
|
||||
peer->sendPacket(message, true/*reliable*/, false/*encrypted*/);
|
||||
peer->reset();
|
||||
@ -1428,6 +1436,7 @@ void ServerLobby::connectionRequested(Event* event)
|
||||
NetworkConfig::get()->isRankedServer()))
|
||||
{
|
||||
NetworkString* message = getNetworkString(2);
|
||||
message->setSynchronous(true);
|
||||
message->addUInt8(LE_CONNECTION_REFUSED).addUInt8(RR_INVALID_PLAYER);
|
||||
peer->sendPacket(message, true/*reliable*/, false/*encrypted*/);
|
||||
peer->reset();
|
||||
@ -1463,6 +1472,7 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr<STKPeer> peer,
|
||||
if (password != NetworkConfig::get()->getPassword())
|
||||
{
|
||||
NetworkString *message = getNetworkString(2);
|
||||
message->setSynchronous(true);
|
||||
message->addUInt8(LE_CONNECTION_REFUSED)
|
||||
.addUInt8(RR_INCORRECT_PASSWORD);
|
||||
peer->sendPacket(message, true/*reliable*/, false/*encrypted*/);
|
||||
@ -1477,6 +1487,7 @@ void ServerLobby::handleUnencryptedConnection(std::shared_ptr<STKPeer> peer,
|
||||
NetworkConfig::get()->isRankedServer())
|
||||
{
|
||||
NetworkString* message = getNetworkString(2);
|
||||
message->setSynchronous(true);
|
||||
message->addUInt8(LE_CONNECTION_REFUSED).addUInt8(RR_INVALID_PLAYER);
|
||||
peer->sendPacket(message, true/*reliable*/, false/*encrypted*/);
|
||||
peer->reset();
|
||||
@ -1601,6 +1612,7 @@ void ServerLobby::updateServerOwner()
|
||||
if (owner)
|
||||
{
|
||||
NetworkString* ns = getNetworkString();
|
||||
ns->setSynchronous(true);
|
||||
ns->addUInt8(LE_SERVER_OWNERSHIP);
|
||||
owner->sendPacket(ns);
|
||||
delete ns;
|
||||
@ -1678,6 +1690,7 @@ void ServerLobby::playerVote(Event* event)
|
||||
NetworkString other = NetworkString(PROTOCOL_LOBBY_ROOM);
|
||||
std::string name = StringUtils::wideToUtf8(event->getPeer()
|
||||
->getPlayerProfiles()[0]->getName());
|
||||
other.setSynchronous(true);
|
||||
other.addUInt8(LE_VOTE).addFloat(UserConfigParams::m_voting_timeout)
|
||||
.encodeString(name).addUInt32(event->getPeer()->getHostId());
|
||||
other += data;
|
||||
|
@ -454,8 +454,7 @@ void TracksScreen::onUpdate(float dt)
|
||||
message += L"\n";
|
||||
unsigned height = GUIEngine::getFont()->getDimension(L"X").Height;
|
||||
const unsigned total_height = m_votes->getDimension().Height;
|
||||
m_vote_messages.lock();
|
||||
for (auto& p : m_vote_messages.getData())
|
||||
for (auto& p : m_vote_messages)
|
||||
{
|
||||
height += GUIEngine::getFont()->getDimension(L"X").Height * 2;
|
||||
if (height > total_height)
|
||||
@ -463,7 +462,6 @@ void TracksScreen::onUpdate(float dt)
|
||||
message += p.second;
|
||||
message += L"\n";
|
||||
}
|
||||
m_vote_messages.unlock();
|
||||
m_votes->setText(message, true);
|
||||
|
||||
} // onUpdate
|
||||
|
@ -60,7 +60,7 @@ private:
|
||||
|
||||
float m_vote_timeout = -1.0f;
|
||||
|
||||
Synchronised<std::map<std::string, core::stringw> > m_vote_messages;
|
||||
std::map<std::string, core::stringw> m_vote_messages;
|
||||
|
||||
std::deque<std::string> m_random_track_list;
|
||||
|
||||
@ -100,9 +100,7 @@ public:
|
||||
|
||||
void resetVote()
|
||||
{
|
||||
m_vote_messages.lock();
|
||||
m_vote_messages.getData().clear();
|
||||
m_vote_messages.unlock();
|
||||
m_vote_messages.clear();
|
||||
m_vote_timeout = -1.0f;
|
||||
}
|
||||
|
||||
@ -111,9 +109,7 @@ public:
|
||||
void addVoteMessage(const std::string& user,
|
||||
const irr::core::stringw& message)
|
||||
{
|
||||
m_vote_messages.lock();
|
||||
m_vote_messages.getData()[user] = message;
|
||||
m_vote_messages.unlock();
|
||||
m_vote_messages[user] = message;
|
||||
}
|
||||
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user