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-28 19:37:31 +0000
committerStijn Buys <ingar@osirion.org>2008-07-28 19:37:31 +0000
commitd389a31f9816b55d8c7685ec24b9ab814252d693 (patch)
tree9b2577692e543fa6c59fcda508f92c3eb839ac7a /src/core/netserver.cc
parent17408276791033e8122819185abf3bcb01740105 (diff)
zone support
Diffstat (limited to 'src/core/netserver.cc')
-rw-r--r--src/core/netserver.cc82
1 files changed, 47 insertions, 35 deletions
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<NetClient *>:: 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<NetClient *>:: 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<NetClient *>::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<NetClient *>::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<unsigned int, Entity *>::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<NetClient *>::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 <channel> <text>
* supported message channels are "info" "public" "rcon" and "snd"
* "snd" is a special channel to transmit sound events
+ * zone <id> <zone create/update data>
*/
// broadcast a "msg <channel>" 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<NetClient *>::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<NetClient *>::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<NetClient *>::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<NetClient *>::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<NetClient *>::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<NetClient *>::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;
}