diff options
Diffstat (limited to 'src/core/gameserver.cc')
-rw-r--r-- | src/core/gameserver.cc | 37 |
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() |