From eb075660e7cb61b138c2da337115c59857f89e17 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Wed, 16 Jul 2008 22:55:07 +0000 Subject: network protocol cleanup, radar test (doesn't work) --- src/core/netserver.cc | 145 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 132 insertions(+), 13 deletions(-) (limited to 'src/core/netserver.cc') diff --git a/src/core/netserver.cc b/src/core/netserver.cc index fe6e45b..ac24f33 100644 --- a/src/core/netserver.cc +++ b/src/core/netserver.cc @@ -310,34 +310,153 @@ void NetServer::client_initialize(NetClient *client) { client->client_state = NetClient::Pending; } -void NetServer::send(NetClient * client, std::string const & message) +// find the client corresponding to a player +NetClient *NetServer::find_client(Player const *player) { - client->send(message); + for (std::list::iterator it = clients.begin(); it != clients.end(); it++) { + if ((*it)->player() == player) { + return (*it); + } + } + return 0; } -// send a message to all clients -void NetServer::broadcast(std::string const & message, Player *ignore_player) +// send outgoing messages to clients + +/** + * The followig messages can be send to a client + * + * frame + * ent + * die + * sup + + * msg + * supported message channels are "info" "public" "rcon" and "snd" + * "snd" is a special channel to transmit sound events + */ + +// broadcast a "msg " message to all clients +void NetServer::broadcast_message(const char *channel, std::string const & message, Player *ignore_player) { - //std::cout << "NetServer: " << osstream.str(); + if (!channel) + return; + + std::string msg("msg "); + msg.append(channel); + msg += ' '; + msg.append(message); + msg += '\n'; + for (std::list::iterator it = clients.begin(); it != clients.end(); it++) { - NetClient *client = *it; - if (!client->error() && (client->state() == NetClient::Connected) && client->player() != ignore_player) - client->send(message); + if (((*it)->player() && (*it)->player() != ignore_player) && ((*it)->state() == NetClient::Connected)) { + (*it)->send(msg); + } } } -// find the client corresponding to a player -NetClient *NetServer::find_client(Player const *player) +// send a "msg " message to one client +void NetServer::send_message(NetClient *client, const char *channel, std::string const & message) +{ + if (!channel) + return; + + std::string msg("msg "); + msg.append(channel); + msg += ' '; + msg.append(message); + msg += '\n'; + + client->send(msg); +} + +// broadcast a "frame" message to all clients +void NetServer::broadcast_frame(float timestamp, float previoustimestamp) { + std::ostringstream msg(""); + msg << "frame " << timestamp << " " << previoustimestamp << "\n"; + for (std::list::iterator it = clients.begin(); it != clients.end(); it++) { - if ((*it)->player() == player) { - return (*it); + if ((*it)->state() == NetClient::Connected) { + (*it)->send(msg.str()); + } + } +} + +// broadcast a "die" delete entity message to all clients +void NetServer::broadcast_entity_delete(Entity *entity) +{ + std::ostringstream msg(""); + msg << "die " << entity->id() << '\n'; + + for (std::list::iterator it = clients.begin(); it != clients.end(); it++) { + if ((*it)->state() == NetClient::Connected) { + (*it)->send(msg.str()); + } + } +} + +// broadcast a "ent" create entity message to all clients +void NetServer::broadcast_entity_create(Entity *entity) +{ + std::ostringstream msg; + msg << "ent "; + entity->serialize(msg); + msg << '\n'; + + for (std::list::iterator it = clients.begin(); it != clients.end(); it++) { + if ((*it)->state() == NetClient::Connected) { + (*it)->send(msg.str()); + } + } +} + +// broadcast a "sup" server update entity message to all clients +void NetServer::broadcast_entity_update(Entity *entity) +{ + std::ostringstream msg; + msg << "sup " << entity->id() << " "; + entity->serialize_server_update(msg); + msg << '\n'; + + for (std::list::iterator it = clients.begin(); it != clients.end(); it++) { + if ((*it)->state() == NetClient::Connected) { + (*it)->send(msg.str()); + } + } +} + +// broadcast a "pif" update player information if necessary +void NetServer::broadcast_player_update() +{ + for (std::list::iterator it = clients.begin(); it != clients.end(); it++) { + NetClient *client = *it; + + if (client->player()->dirty()) { + // send player data + std::ostringstream msg; + msg << "pif "; + client->player()->serialize_server_update(msg); + msg << '\n'; + client->send(msg.str()); + + client->player()->player_dirty = false; } } - return 0; +} + +// send a "pif" update player information to a single player +void NetServer::send_player_update(NetClient *client) +{ + std::ostringstream msg; + msg << "pif "; + client->player()->serialize_server_update(msg); + msg << '\n'; + client->send(msg.str()); } // parse incoming client messages + /** * The following incoming protocol messages are parsed; * -- cgit v1.2.3