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/gameinterface.cc')
-rw-r--r--src/core/gameinterface.cc48
1 files changed, 47 insertions, 1 deletions
diff --git a/src/core/gameinterface.cc b/src/core/gameinterface.cc
index 5789592..8d351a0 100644
--- a/src/core/gameinterface.cc
+++ b/src/core/gameinterface.cc
@@ -91,7 +91,53 @@ void GameInterface::clear()
// remove all models
model::Model::clear();
+
+ game_previousframetime = 0;
+ game_serverframetime = 0;
+ game_clientframetime = 0;
+ game_timestep = 0;
+ game_frames = 0;
}
+void GameInterface::reset_clientstate(float servertime)
+{
+ game_timestep = (servertime - game_serverframetime);
+
+ if (game_timestep < 0)
+ game_timestep = 0;
+
+ game_previousframetime = game_serverframetime;
+ game_serverframetime = servertime;
+ game_clientframetime = game_previousframetime;
+
+ std::map<unsigned int, core::Entity *>::iterator it;
+ for (it=core::Entity::registry.begin(); it != core::Entity::registry.end(); it++) {
+
+ core::Entity *entity = (*it).second;
+
+ if (entity->state() && !(entity->flags() & Entity::Static))
+ entity->state()->assign(entity);
+ }
+
+ game_frames = 0;
+}
-} // namespace core
+void GameInterface::update_clientstate()
+{
+ game_frames++;
+ game_clientframetime += game_timestep;
+
+ if (game_clientframetime > game_serverframetime)
+ game_clientframetime = game_serverframetime;
+}
+
+float GameInterface::timeoffset() {
+ float d = game_serverframetime - game_previousframetime;
+ if (d < 0)
+ d = 1;
+ float t = game_serverframetime - game_clientframetime;
+
+ return t/d;
+}
+
+}