Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/gameserver.cc')
-rw-r--r--src/core/gameserver.cc53
1 files changed, 49 insertions, 4 deletions
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<unsigned int, Entity *>::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<unsigned int, Entity *>::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<NetClient *>::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;
+ }
+ }
+ }
}