diff options
author | Stijn Buys <ingar@osirion.org> | 2008-07-16 22:55:07 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2008-07-16 22:55:07 +0000 |
commit | eb075660e7cb61b138c2da337115c59857f89e17 (patch) | |
tree | 0fe031a8f3562b22f61d0f95b740fe5f2326fd7b /src/core/netserver.cc | |
parent | fecc54ad8c5a108831c2bc268f9dd7e16b511b7e (diff) |
network protocol cleanup, radar test (doesn't work)
Diffstat (limited to 'src/core/netserver.cc')
-rw-r--r-- | src/core/netserver.cc | 145 |
1 files changed, 132 insertions, 13 deletions
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<NetClient *>::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 <timestamp> <previous timestamp> + * ent <id> <entity create data> + * die <id> <entity data> + * sup <entity update data> + + * msg <channel> <text> + * supported message channels are "info" "public" "rcon" and "snd" + * "snd" is a special channel to transmit sound events + */ + +// broadcast a "msg <channel>" 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<NetClient *>::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 <channel>" 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<NetClient *>::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<NetClient *>::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<NetClient *>::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<NetClient *>::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<NetClient *>::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; * |