From 44500292f5a964036e9d915a38a2773bf5aa765d Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sat, 10 Jan 2009 15:35:45 +0000 Subject: preliminary player ping support --- src/core/gameinterface.cc | 2 +- src/core/netconnection.cc | 13 +++++++++++++ src/core/netconnection.h | 3 +++ src/core/netserver.cc | 9 ++++++++- src/core/player.cc | 7 +++++++ src/core/player.h | 7 +++++++ 6 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/core/gameinterface.cc b/src/core/gameinterface.cc index 9551176..c566e41 100644 --- a/src/core/gameinterface.cc +++ b/src/core/gameinterface.cc @@ -128,7 +128,7 @@ void GameInterface::list_players() for (Players::iterator it = game_players.begin(); it != game_players.end(); it++) { msgstr.str(""); - con_print << setw(3) << (*it)->id() << aux::pad_left((*it)->name(), 24) << std::endl; + con_print << setw(3) << (*it)->id() << setw(5) << (*it)->ping() << aux::pad_left((*it)->name(), 24) << std::endl; count++; } diff --git a/src/core/netconnection.cc b/src/core/netconnection.cc index 7e12ce7..267ff8f 100644 --- a/src/core/netconnection.cc +++ b/src/core/netconnection.cc @@ -400,6 +400,14 @@ void NetConnection::send_private_message(std::string const &text) this->send_raw(msg); } +// send a ping reply +void NetConnection::send_ping_reply() +{ + std::ostringstream msg; + msg << "ping " << timestamp() << '\n'; + this->send_raw(msg.str()); +} + // parse incoming client messages /** * The following incoming messages are parsed; @@ -466,11 +474,16 @@ void NetConnection::parse_incoming_message(const std::string & message) abort(); } else if (command == "ping") { + unsigned long timestamp; + if ((msgstream >> timestamp)) { + + } } else if (command == "frame") { unsigned long timestamp; if ((msgstream >> timestamp)) { connection_timestamp = timestamp; + send_ping_reply(); } } else if (command == "die") { diff --git a/src/core/netconnection.h b/src/core/netconnection.h index e6e31f7..371ab04 100644 --- a/src/core/netconnection.h +++ b/src/core/netconnection.h @@ -100,6 +100,9 @@ public: inline unsigned long timestamp() const { return connection_timestamp; } protected: + /// send a ping reply + void send_ping_reply(); + /// add a raw network message to the send queue void send_raw(std::string const &msg); diff --git a/src/core/netserver.cc b/src/core/netserver.cc index b61ae1f..e6e85f8 100644 --- a/src/core/netserver.cc +++ b/src/core/netserver.cc @@ -398,8 +398,9 @@ void NetServer::frame(unsigned long timestamp) * frame * ent * die + * ping * sup - + * * msg * supported message channels are "info" "public" "rcon" and "snd" * "snd" is a special channel to transmit sound events @@ -590,6 +591,12 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me } if (command == "ping") { + unsigned long timestamp; + if (msgstream >> timestamp) { + client->player()->set_ping(server()->timestamp() - timestamp); + } else { + client->player()->set_ping(-1); + } return; } diff --git a/src/core/player.cc b/src/core/player.cc index b499003..c09cb6d 100644 --- a/src/core/player.cc +++ b/src/core/player.cc @@ -39,6 +39,8 @@ void Player::clear() clear_assets(); player_control = 0; + + player_ping = 0; } @@ -103,6 +105,11 @@ void Player::add_credits(long amount) player_credits += amount; } +void Player::set_ping(long ping) +{ + player_ping = ping; +} + void Player::update_info() { Cvar *cl_name = Cvar::find("cl_name"); diff --git a/src/core/player.h b/src/core/player.h index dccd8e6..f0c4996 100644 --- a/src/core/player.h +++ b/src/core/player.h @@ -79,6 +79,9 @@ public: /// credits inline long credits() const { return player_credits; } + /// network ping + inline long ping() const { return player_ping; } + /// returns true of the player has enough credits to pay amount inline bool has_credits(const long amount) const { return (player_credits >= amount); } @@ -130,6 +133,8 @@ public: void add_credits(long amount); + void set_ping(long ping); + inline void set_dirty() { player_dirty = true; } @@ -171,7 +176,9 @@ private: Zone *player_zone; long player_credits; + long player_ping; std::string player_rconpassword; + }; } -- cgit v1.2.3