From 8aa04fc836116a58f8ffd1e0c3539b9ea8a94ddf Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Thu, 21 Feb 2008 19:06:15 +0000 Subject: dedicated server, entity transfer --- src/core/gameserver.cc | 53 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) (limited to 'src/core/gameserver.cc') diff --git a/src/core/gameserver.cc b/src/core/gameserver.cc index e5795ad..8ddd824 100644 --- a/src/core/gameserver.cc +++ b/src/core/gameserver.cc @@ -168,7 +168,7 @@ void GameServer::exec(Player *player, std::string const & cmdline) std::string message("Unknown command '"); message.append(command); - message.append("'\n"); + message.append("'"); send(player, message); } @@ -178,8 +178,6 @@ void GameServer::player_connect(Player *player) message.append(" connects."); broadcast(message, player->id()); - // TODO transferplayer info, transfer entities - // notify the game module server_module->player_connect(player); } @@ -208,15 +206,17 @@ void GameServer::frame(float seconds) } } - // update entities + // run a time frame on each entity std::map::iterator it; for (it=Entity::registry.begin(); it != Entity::registry.end(); it++) { Entity *entity = (*it).second; + if ((entity->type() == Entity::Controlable) || (entity->type() == Entity::Dynamic)) { entity->frame(seconds); } } + // run a frame on the module if (server_module) { server_module->frame(seconds); if (server_module->error()) { @@ -224,6 +224,51 @@ void GameServer::frame(float seconds) return; } } + + // send updates + if (server_network) { + std::map::iterator it; + for (it=Entity::registry.begin(); it != Entity::registry.end(); it++) { + Entity *entity = (*it).second; + if (entity->entity_destroyed) { + if (!entity->entity_created) { + std::ostringstream netmsg; + netmsg << "die " << entity->id() << "\n"; + server_network->broadcast(netmsg.str()); + } + core::Entity::remove(entity->id()); + } else if (entity->entity_created) { + std::ostringstream netmsg; + netmsg << "ent "; + entity->serialize(netmsg); + netmsg << "\n"; + server_network->broadcast(netmsg.str()); + entity->entity_created = false; + + } else if (entity->dirty()) { + std::ostringstream netmsg; + netmsg << "sup " << entity->id() << " "; + entity->serialize_server_update(netmsg); + netmsg << "\n"; + server_network->broadcast(netmsg.str()); + } + entity->entity_dirty = false; + } + + for (std::list::iterator it = server_network->clients.begin(); it != server_network->clients.end(); it++) { + NetClient *client = *it; + if (client->player()->dirty()) { + // send player data + std::ostringstream netmsg; + netmsg.str(""); + netmsg << "pif "; + client->player()->serialize_server_update(netmsg); + netmsg << "\n"; + client->send(netmsg.str()); + client->player()->player_dirty = false; + } + } + } } -- cgit v1.2.3