Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2008-07-16 22:55:07 +0000
committerStijn Buys <ingar@osirion.org>2008-07-16 22:55:07 +0000
commiteb075660e7cb61b138c2da337115c59857f89e17 (patch)
tree0fe031a8f3562b22f61d0f95b740fe5f2326fd7b /src/core/netserver.cc
parentfecc54ad8c5a108831c2bc268f9dd7e16b511b7e (diff)
network protocol cleanup, radar test (doesn't work)
Diffstat (limited to 'src/core/netserver.cc')
-rw-r--r--src/core/netserver.cc145
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;
*