diff options
author | Stijn Buys <ingar@osirion.org> | 2008-06-08 16:02:52 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2008-06-08 16:02:52 +0000 |
commit | 513bfb8d9cf3c246dd15cf67b8a5ff9c7a6f9afe (patch) | |
tree | d3df60466c9ba4d577cd833223ba9147cfd268d4 /src/core/gameinterface.cc | |
parent | 6582edea98876b8f5797429e76f8fc253f83747a (diff) |
enable client prediction
Diffstat (limited to 'src/core/gameinterface.cc')
-rw-r--r-- | src/core/gameinterface.cc | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/src/core/gameinterface.cc b/src/core/gameinterface.cc index f50c1cc..cfa557b 100644 --- a/src/core/gameinterface.cc +++ b/src/core/gameinterface.cc @@ -128,17 +128,23 @@ void GameInterface::update_entity_clientstate(Entity *entity) entity->entity_clientstate->assign(entity); } - if (!(entity->flags() & core::Entity::Static)) + if(Cvar::cl_prediction->value() == 0) { + + entity->state()->state_axis.assign(entity->axis()); + entity->state()->state_location.assign(entity->location()); return; + } + + if (!(entity->flags() & core::Entity::Static)) { - if (game_clientframetime < game_serverframetime) { + // clientstate location + entity->state()->state_location = entity->state()->previouslocation() + + (entity->location() - entity->state()->previouslocation()) * timeoffset(); + + if (game_clientframetime < game_serverframetime) { - if (!(entity->flags() & core::Entity::Static)) { - - // clientstate location - entity->state()->state_location = entity->state()->previouslocation() + - (entity->location() - entity->state()->previouslocation()) * timeoffset(); - + //FIXME this is hopelessly broken + // http://local.wasp.uwa.edu.au/~pbourke/geometry/planeline/ float cosangle; float angle; @@ -164,7 +170,7 @@ void GameInterface::update_entity_clientstate(Entity *entity) l = p.length(); if ((fabs(side) - MIN_DELTA > 0)) { - cosangle = math::dotproduct(p, entity->state()->axis().up()); + cosangle = math::dotproduct(p, entity->state()->axis().up()); if (fabs(cosangle) + MIN_DELTA < 1 ) { angle = acos(cosangle) * 180.0f / M_PI; angle = math::sgnf(side) * angle * timeoffset(); @@ -216,15 +222,20 @@ void GameInterface::update_entity_clientstate(Entity *entity) } } + } else { + entity->state()->state_axis.assign(entity->axis()); } } else { + entity->state()->assign(entity); } } void GameInterface::update_clientstate(float seconds) { + game_clientframetime += seconds; + std::map<unsigned int, core::Entity *>::iterator it; for (it=core::Entity::registry.begin(); it != core::Entity::registry.end(); it++) { update_entity_clientstate((*it).second); @@ -233,8 +244,8 @@ void GameInterface::update_clientstate(float seconds) float GameInterface::timeoffset() { - if (game_clientframetime > game_serverframetime) - return 1; + //if (game_clientframetime > game_serverframetime) + // return 1; float d = game_serverframetime - game_previousframetime; if (d <= 0) |