49     Ogre::ColourValue(0.0,            0.8,            0.0),
 
   50     Ogre::ColourValue(0.0,            0.4,            0.701960784314),
 
   51     Ogre::ColourValue(1.0,            0.501960784314, 0.0),
 
   52     Ogre::ColourValue(1.0,            0.8,            0.0),
 
   55     Ogre::ColourValue(0.8,            1.0,            0.0),
 
   56     Ogre::ColourValue(1.0,            0.0,            0.0),
 
   57     Ogre::ColourValue(0.501960784314, 0.501960784314, 0.501960784314),
 
   58     Ogre::ColourValue(0.0,            0.560784313725, 0.0),
 
   60     Ogre::ColourValue(0.701960784314, 0.352941176471, 0.0),
 
   61     Ogre::ColourValue(0.701960784314, 0.560784313725, 0.0),
 
   63     Ogre::ColourValue(0.560784313725, 0.701960784314, 0.0),
 
   64     Ogre::ColourValue(0.701960784314, 0.0,            0.0),
 
   65     Ogre::ColourValue(0.745098039216, 0.745098039216, 0.745098039216),
 
   66     Ogre::ColourValue(0.501960784314, 1.0,            0.501960784314),
 
   67     Ogre::ColourValue(0.501960784314, 0.788235294118, 1.0),
 
   68     Ogre::ColourValue(1.0,            0.752941176471, 0.501960784314),
 
   69     Ogre::ColourValue(1.0,            0.901960784314, 0.501960784314),
 
   70     Ogre::ColourValue(0.666666666667, 0.501960784314, 1.0),
 
   71     Ogre::ColourValue(0.933333333333, 0.0,            0.8),
 
   72     Ogre::ColourValue(1.0,            0.501960784314, 0.501960784314),
 
   73     Ogre::ColourValue(0.4,            0.4,            0.0),
 
   74     Ogre::ColourValue(1.0,            0.749019607843, 1.0),
 
   75     Ogre::ColourValue(0.0,            1.0,            0.8),
 
   76     Ogre::ColourValue(0.8,            0.4,            0.6),
 
   77     Ogre::ColourValue(0.6,            0.6,            0.0),
 
   84 #define LOG_THREAD(_MSG_) { std::stringstream s; s << _MSG_ << " (Thread ID: " << std::this_thread::get_id() << ")"; LOG(s.str()); } 
   85 #define LOGSTREAM         Ogre::LogManager().getSingleton().stream() 
   96     int numColours = 
sizeof(
MP_COLORS) / 
sizeof(Ogre::ColourValue);
 
   97     if (color_num < 0 || color_num >= numColours)
 
   98         return Ogre::ColourValue::White;
 
  106     std::stringstream msg;
 
  107     msg << 
"++ " << name << 
": " << header->
source << 
", " << header->
streamid 
  114     m_net_quality = quality;
 
  119     return m_net_quality;
 
  129     SWBaseSocket::SWBaseError error;
 
  131     if (m_socket.fsend(buffer, msgsize, &error) < msgsize)
 
  133         LOG(
"NET send error: " + error.get_error());
 
  160     return SendMessageRaw(buffer, msgsize);
 
  169     std::lock_guard<std::mutex> lock(m_recv_packetqueue_mutex);
 
  170     m_recv_packet_buffer.push_back(packet);
 
  175     SWBaseSocket::SWBaseError error;
 
  178     LOG_THREAD(
"[RoR|Networking] ReceiveMessage() waiting...");
 
  183         LOG(
"NET receive error 1: " + error.get_error());
 
  188     LOG_THREAD(
"[RoR|Networking] ReceiveMessage() header received");
 
  191     if (head->size > uint32_t(bufferlen))
 
  199         std::memset(content, 0, bufferlen);
 
  200         if (m_socket.frecv(content, head->size, &error) < 
static_cast<int>(head->size))
 
  202             LOG_THREAD(
"NET receive error 2: "+ error.get_error());
 
  208     LOG_THREAD(
"[RoR|Networking] ReceiveMessage() body received");
 
  216     LOG(
"[RoR|Networking] SendThread started");
 
  221             std::unique_lock<std::mutex> queue_lock(m_send_packetqueue_mutex);
 
  222             while (m_send_packet_buffer.empty() && !m_shutdown)
 
  224                 m_send_packet_available_cv.wait(queue_lock);
 
  230             packet = m_send_packet_buffer.front();
 
  231             m_send_packet_buffer.pop_front();
 
  235     LOG(
"[RoR|Networking] SendThread stopped");
 
  240     LOG_THREAD(
"[RoR|Networking] RecvThread starting...");
 
  252             LOG_THREAD(
"[RoR|Networking] RecvThread: Error while receiving data: " + 
TOSTRING(err));
 
  260             if (header.
source == m_uid)
 
  282             if (header.
size != 
sizeof(
int))
 
  286             int quality = *(
int *)buffer;
 
  287             SetNetQuality(quality);
 
  292             if (header.
source == m_uid)
 
  296                 std::stringstream msg;
 
  297                 msg << 
_L(
"disconnected: remote side closed the connection");
 
  301                 bool was_kick = (std::strstr(buffer, 
"disconnected on request") == 
nullptr); 
 
  309                 std::lock_guard<std::mutex> lock(m_users_mutex);
 
  310                 auto user = std::find_if(m_users.begin(), m_users.end(), [header](
const RoRnet::UserInfo& u) { return static_cast<int>(u.uniqueid) == header.source; });
 
  311                 if (user != m_users.end())
 
  315                     text << 
_L(
"left the game");
 
  321                     int peeropt_offset = (int)std::distance(m_users.begin(), user);
 
  322                     auto peeropt_itor = m_users_peeropts.begin() + peeropt_offset;
 
  323                     m_users_peeropts.erase(peeropt_itor);
 
  325                     m_disconnected_users.push_back(*user); 
 
  332             if (header.
source == m_uid)
 
  334                 std::lock_guard<std::mutex> lock(m_userdata_mutex);
 
  336                 m_authlevel = m_userdata.authstatus;
 
  337                 m_username = std::string(m_userdata.username);
 
  344                 if (!GetUserInfo(header.
source, user_info)) 
 
  350                         text << 
"(" << UserAuthToStringShort(user_info) << 
") ";
 
  352                     text << 
_L(
"joined the game");
 
  359                     std::lock_guard<std::mutex> lock(m_users_mutex);
 
  360                     m_users.push_back(user_info);
 
  361                     m_users_peeropts.push_back(
BitMask_t(0));
 
  368 #ifdef USE_ANGELSCRIPT 
  370 #endif // USE_ANGELSCRIPT 
  378     LOG_THREAD(
"[RoR|Networking] RecvThread stopped");
 
  384     RoR::LogFormat(
"[RoR|Networking] Failed to connect to server [%s:%d], message: %s", m_net_host.c_str(), m_net_port, msg.c_str());
 
  389         m_socket.set_timeout(1, 0);
 
  390         m_socket.disconnect();
 
  410     catch (std::exception& e)
 
  414         RoR::LogFormat(
"[RoR|Networking] Failed to launch connection thread, message: %s", e.what());
 
  423     if (m_connect_thread.joinable())
 
  424         m_connect_thread.join(); 
 
  429     RoR::LogFormat(
"[RoR|Networking] Trying to join server '%s' on port '%d' ...", m_net_host.c_str(), m_net_port);
 
  431     SWBaseSocket::SWBaseError error;
 
  434     m_socket = SWInetSocket();
 
  435     m_socket.set_timeout(10, 0);
 
  436     m_socket.connect(m_net_port, m_net_host, &error);
 
  437     if (error != SWBaseSocket::ok)
 
  439         CouldNotConnect(
_L(
"Could not create connection"), 
false);
 
  446         CouldNotConnect(
_L(
"Establishing network session: error sending hello"));
 
  456         CouldNotConnect(
_L(
"Establishing network session: error getting server version"));
 
  463         std::string format_str = 
_L(
"Establishing network session: wrong server version, you are using version '%s' and the server is using '%s'");
 
  470         CouldNotConnect(
_L(
"server uses a different protocol version"));
 
  475         CouldNotConnect(
_L(
"Establishing network session: error getting server hello"));
 
  484         std::string formatstr = 
_L(
"Establishing network session: wrong server version, you are using version '%s' and the server is using '%s'");
 
  492     m_socket.set_timeout(0, 0);
 
  505     strncpy(c.
language, (language + std::string(
"_") + country).c_str(), 5);
 
  509         CouldNotConnect(
_L(
"Establishing network session: error sending user info"));
 
  516         CouldNotConnect(
_L(
"Establishing network session: error getting server authorization"));
 
  522         CouldNotConnect(
_L(
"Establishing network session: sorry, server has too many players"));
 
  528         CouldNotConnect(
_L(
"Establishing network session: sorry, you are banned!"), 
false);
 
  533         CouldNotConnect(
_L(
"Establishing network session: sorry, wrong password!"));
 
  538         CouldNotConnect(
_L(
"Establishing network session: sorry, wrong protocol version!"));
 
  544         CouldNotConnect(
_L(
"Establishing network session: sorry, unknown server response"));
 
  557     LOG(
"[RoR|Networking] Connect(): Creating Send/Recv threads");
 
  567     LOG(
"[RoR|Networking] Disconnect() disconnecting...");
 
  568     bool is_clean_disconnect = !m_shutdown; 
 
  572     m_send_packet_available_cv.notify_one();
 
  574     m_send_thread.join();
 
  575     LOG(
"[RoR|Networking] Disconnect() sender thread cleaned up");
 
  577     m_socket.set_timeout(1, 0);
 
  579     if (is_clean_disconnect)
 
  584     m_recv_thread.join();
 
  585     LOG(
"[RoR|Networking] Disconnect() receiver thread cleaned up");
 
  587     if (is_clean_disconnect)
 
  589         m_socket.disconnect();
 
  598     m_disconnected_users.clear();
 
  599     m_recv_packet_buffer.clear();
 
  600     m_send_packet_buffer.clear();
 
  606     LOG(
"[RoR|Networking] Disconnect() done");
 
  614         LOGSTREAM << 
"[RoR|Networking] Discarding network packet (StreamID: " 
  615             <<streamid<<
", Type: "<<type<<
"), length is " << len << 
", max is " << max_len;
 
  622     char *buffer = (
char*)(packet.
buffer);
 
  632     memcpy(bufferContent, content, len);
 
  638         std::lock_guard<std::mutex> lock(m_send_packetqueue_mutex);
 
  646             auto search = std::find_if(m_send_packet_buffer.begin(), m_send_packet_buffer.end(),
 
  647                     [&](
const NetSendPacket& p) { return !memcmp(packet.buffer, p.buffer, sizeof(RoRnet::Header)); });
 
  648             if (search != m_send_packet_buffer.end())
 
  652                 m_send_packet_available_cv.notify_one();
 
  657         m_send_packet_buffer.push_back(packet);
 
  660     m_send_packet_available_cv.notify_one();
 
  677     std::lock_guard<std::mutex> lock(m_recv_packetqueue_mutex);
 
  678     std::vector<NetRecvPacket> buf_copy = m_recv_packet_buffer;
 
  679     m_recv_packet_buffer.clear();
 
  685     return m_server_settings.terrain;
 
  690     std::lock_guard<std::mutex> lock(m_userdata_mutex);
 
  691     return m_userdata.colournum;
 
  696     std::lock_guard<std::mutex> lock(m_userdata_mutex);
 
  702     std::lock_guard<std::mutex> lock(m_userdata_mutex);
 
  708     std::lock_guard<std::mutex> lock(m_users_mutex);
 
  714     std::lock_guard<std::mutex> lock(m_users_mutex);
 
  715     return m_users_peeropts;
 
  720     std::lock_guard<std::mutex> lock(m_users_mutex);
 
  723         if ((
int)user.uniqueid == uid)
 
  734     std::lock_guard<std::mutex> lock(m_users_mutex);
 
  735     for (
size_t i = 0; i < m_users.size(); i++)
 
  737         if (
static_cast<int>(m_users[i].uniqueid) == uid)
 
  739             result = m_users_peeropts[i];
 
  748     std::lock_guard<std::mutex> lock(m_users_mutex);
 
  751         if ((
int)user.uniqueid == uid)
 
  765     if (GetUserInfo(uid, tmp))
 
  772     tmp = GetLocalUserData();
 
  784     std::lock_guard<std::mutex> lock(m_users_mutex);
 
  787         if (user.username == username)
 
  799     std::lock_guard<std::mutex> lock(m_users_mutex);
 
  801     const bool peeropts_sane = m_users.size() == m_users_peeropts.size();
 
  803     if (!peeropts_sane) 
return;
 
  805     for (
size_t i = 0; i < m_users.size(); i++)
 
  807         if (
static_cast<int>(m_users[i].uniqueid) == rq->
por_uid)
 
  816     std::lock_guard<std::mutex> lock(m_users_mutex);
 
  818     const bool peeropts_sane = m_users.size() == m_users_peeropts.size();
 
  820     if (!peeropts_sane) 
return;
 
  822     for (
size_t i = 0; i < m_users.size(); i++)
 
  824         if (
static_cast<int>(m_users[i].uniqueid) == rq->
por_uid)
 
  840     size_t payload_len = 0;
 
  844     payload_len += 
sizeof(user.
uniqueid);
 
  847     std::strncpy(payload + payload_len, msg, 
sizeof(payload) - payload_len);
 
  848     payload_len += std::strlen(msg);
 
  861     else                                      { 
return _LC(
"NetUserAuth", 
"Guest");  }
 
  871     else                                      { 
return _LC(
"NetUserAuth",
"Guest");                  }
 
  874 #endif // USE_SOCKETW