From d389a31f9816b55d8c7685ec24b9ab814252d693 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Mon, 28 Jul 2008 19:37:31 +0000 Subject: zone support --- src/core/netserver.cc | 82 +++++++++++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 35 deletions(-) (limited to 'src/core/netserver.cc') diff --git a/src/core/netserver.cc b/src/core/netserver.cc index 2e50efd..10fd554 100644 --- a/src/core/netserver.cc +++ b/src/core/netserver.cc @@ -29,6 +29,7 @@ #include "core/func.h" #include "core/core.h" #include "core/stats.h" +#include "core/zone.h" #ifdef _WIN32 typedef int socklen_t; @@ -53,15 +54,6 @@ NetServer::NetServer(std::string const host, unsigned int const port) return; } - /* - // set socket options - socklen_t yes = 1; - if (::setsockopt(netserver_fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(socklen_t)) == -1) { - con_error << "Network can't set socket options!" << std::endl; - //perror("setsockopt"); - return; - } - */ // Get the local adress to bind to netserver_addr.sin_family = AF_INET; @@ -103,7 +95,7 @@ NetServer::~NetServer() std::string netmsg("disconnect\n"); // delete all clients - std::list:: iterator it; + Clients:: iterator it; for (it = clients.begin(); it != clients.end(); it++) { // notify the game server @@ -133,7 +125,7 @@ void NetServer::abort() { // remove disconnected clients void NetServer::reap() { - for (std::list:: iterator it = clients.begin(); it != clients.end(); it++) { + for (Clients:: iterator it = clients.begin(); it != clients.end(); it++) { NetClient *client = *it; if (client->client_timeout + NETTIMEOUT < application()->time()) { @@ -169,7 +161,7 @@ void NetServer::reap() void NetServer::transmit() { - for (std::list::iterator it = clients.begin(); it != clients.end(); it++) { + for (Clients::iterator it = clients.begin(); it != clients.end(); it++) { (*it)->transmit(fd()); } } @@ -220,7 +212,7 @@ void NetServer::receive() // get messages from clients bool msg_received = false; - for (std::list::iterator it = clients.begin(); it != clients.end() && !msg_received; it++) { + for (Clients::iterator it = clients.begin(); it != clients.end() && !msg_received; it++) { NetClient *client = *it; if ((client->host() == client_host) && (client->port() == (int) client_port)) { @@ -282,25 +274,24 @@ NetClient * NetServer::client_connect(std::string const host, int const port) void NetServer::client_initialize(NetClient *client) { // send welcome message - std::ostringstream netmsg; - netmsg.str(""); - netmsg << "msg info ^B" << Cvar::sv_name->str() << "\n"; - client->send_raw(netmsg.str()); + std::string welcome("^B"); + welcome.append(Cvar::sv_name->str()); + send_message(client, "info", welcome); client->transmit(fd()); + // send zones + for (Zone::Registry::iterator it = Zone::registry().begin(); it != Zone::registry().end(); it++) { + send_zone_update(client, (*it).second); + } + // send entities - std::map::iterator it; - for (it=Entity::registry.begin(); it != Entity::registry.end(); it++) { - netmsg.str(""); - netmsg << "ent "; - (*it).second->serialize(netmsg); - netmsg << "\n"; - client->send_raw(netmsg.str()); + for (Entity::Registry::iterator it = Entity::registry().begin(); it != Entity::registry().end(); it++) { + send_entity_create(client, (*it).second); } // send connect completed - netmsg.str("connect\n"); - client->send_raw(netmsg.str()); + std::string connect("connect\n"); + client->send_raw(connect); client->transmit(fd()); // set client state to pending @@ -310,7 +301,7 @@ void NetServer::client_initialize(NetClient *client) { // find the client corresponding to a player NetClient *NetServer::find_client(Player const *player) { - for (std::list::iterator it = clients.begin(); it != clients.end(); it++) { + for (Clients::iterator it = clients.begin(); it != clients.end(); it++) { if ((*it)->player() == player) { return (*it); } @@ -331,6 +322,7 @@ NetClient *NetServer::find_client(Player const *player) * msg * supported message channels are "info" "public" "rcon" and "snd" * "snd" is a special channel to transmit sound events + * zone */ // broadcast a "msg " message to all clients @@ -345,7 +337,7 @@ void NetServer::broadcast_message(const char *channel, std::string const & messa msg.append(message); msg += '\n'; - for (std::list::iterator it = clients.begin(); it != clients.end(); it++) { + for (Clients::iterator it = clients.begin(); it != clients.end(); it++) { if (((*it)->player() && (*it)->player() != ignore_player) && ((*it)->state() == NetClient::Connected)) { (*it)->send_raw(msg); } @@ -382,7 +374,7 @@ 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++) { + for (Clients::iterator it = clients.begin(); it != clients.end(); it++) { if ((*it)->state() == NetClient::Connected) { (*it)->send_raw(msg.str()); } @@ -395,7 +387,7 @@ 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++) { + for (Clients::iterator it = clients.begin(); it != clients.end(); it++) { if ((*it)->state() == NetClient::Connected) { (*it)->send_raw(msg.str()); } @@ -410,13 +402,33 @@ void NetServer::broadcast_entity_create(Entity *entity) entity->serialize(msg); msg << '\n'; - for (std::list::iterator it = clients.begin(); it != clients.end(); it++) { + for (Clients::iterator it = clients.begin(); it != clients.end(); it++) { if ((*it)->state() == NetClient::Connected) { (*it)->send_raw(msg.str()); } } } +// send a "ent" create entity message to all clients +void NetServer::send_entity_create(NetClient *client, Entity *entity) +{ + std::ostringstream msg; + msg << "ent "; + entity->serialize(msg); + msg << '\n'; + client->send_raw(msg.str()); +} + +// send a "zone" update zone message to a client +void NetServer::send_zone_update(NetClient *client, Zone *zone) +{ + std::ostringstream msg; + msg << "zone "; + zone->serialize_server_update(msg); + msg << '\n'; + client->send_raw(msg.str()); +} + // broadcast a "sup" server update entity message to all clients void NetServer::broadcast_entity_update(Entity *entity) { @@ -425,7 +437,7 @@ void NetServer::broadcast_entity_update(Entity *entity) entity->serialize_server_update(msg); msg << '\n'; - for (std::list::iterator it = clients.begin(); it != clients.end(); it++) { + for (Clients::iterator it = clients.begin(); it != clients.end(); it++) { if ((*it)->state() == NetClient::Connected) { (*it)->send_raw(msg.str()); } @@ -435,7 +447,7 @@ void NetServer::broadcast_entity_update(Entity *entity) // broadcast a "pif" update player information if necessary void NetServer::broadcast_player_update() { - for (std::list::iterator it = clients.begin(); it != clients.end(); it++) { + for (Clients::iterator it = clients.begin(); it != clients.end(); it++) { NetClient *client = *it; if (client->player()->dirty()) { @@ -525,7 +537,7 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me // client connection is completed on the first pif if (command == "pif") { std::string oldname(client->player()->name()); - client->player()->recieve_client_update(msgstream); + client->player()->receive_client_update(msgstream); if (client->state() == NetClient::Pending) { @@ -582,7 +594,7 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me } entitycontrolable->entity_dirty = true; - entitycontrolable->recieve_client_update(msgstream); + entitycontrolable->receive_client_update(msgstream); } return; } -- cgit v1.2.3