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.cc37
1 files changed, 16 insertions, 21 deletions
diff --git a/src/core/gameserver.cc b/src/core/gameserver.cc
index e42d1b2..4fc3924 100644
--- a/src/core/gameserver.cc
+++ b/src/core/gameserver.cc
@@ -120,10 +120,10 @@ GameServer::GameServer() : GameInterface()
con_print << "^BInitializing game server...\n";
server_instance = this;
server_network = 0;
- server_time = 0;
+ server_timestamp = 0;
server_previoustime = 0;
- server_frametime = 0.0f;
server_maxplayerid = 1;
+ server_startup = application()->timestamp();
server_module = Module::current();
if (!server_module) {
@@ -558,14 +558,11 @@ void GameServer::player_disconnect(Player *player)
}
}
-void GameServer::frame(float seconds)
+void GameServer::frame(unsigned long timestamp)
{
if (error())
return;
- server_time += seconds;
- server_frametime += seconds;
-
// process incoming network messages
if (server_network) {
server_network->receive();
@@ -580,24 +577,25 @@ void GameServer::frame(float seconds)
localplayer()->update_info();
if (!Cvar::sv_dedicated->value()) {
- update_clientstate(seconds);
+ update_clientstate();
}
if ((Cvar::sv_dedicated->value() || Cvar::sv_private->value())) {
if (core::Cvar::sv_framerate->value()) {
- float f = 1.0f / core::Cvar::sv_framerate->value();
- if (server_frametime < f) {
+ float f = 1000.0f / core::Cvar::sv_framerate->value();
+ if (server_startup + server_timestamp + f > timestamp) {
return;
}
}
- }
+ }
+
+ server_previoustime = server_timestamp;
+ server_timestamp = timestamp - server_startup;
+ float elapsed = (float) (server_timestamp - server_previoustime) / 1000.0f;
// copy the previous entity state to the client state
if (!Cvar::sv_dedicated->value()) {
- reset_clientstate(server_time, server_previoustime);
- } else {
- game_serverframetime = server_time;
- game_previousframetime = server_previoustime;
+ reset_clientstate();
}
// run a time frame on each entity
@@ -605,13 +603,13 @@ void GameServer::frame(float seconds)
Entity *entity = (*it).second;
if ((entity->type() == Entity::Controlable) || (entity->type() == Entity::Dynamic)) {
- entity->frame(server_frametime);
+ entity->frame(elapsed);
}
}
// run a frame on the module
if (server_module) {
- server_module->frame(server_frametime);
+ server_module->frame(elapsed);
if (server_module->error()) {
abort();
return;
@@ -620,7 +618,7 @@ void GameServer::frame(float seconds)
if (server_network) {
// send network updates
- server_network->frame(server_time, server_previoustime);
+ server_network->frame(server_timestamp);
}
// mark all entities as updated
@@ -643,11 +641,8 @@ void GameServer::frame(float seconds)
}
if (!Cvar::sv_dedicated->value()) {
- update_clientstate(0);
+ update_clientstate();
}
-
- server_frametime = 0;
- server_previoustime = server_time;
}
void GameServer::save_config()