From 513bfb8d9cf3c246dd15cf67b8a5ff9c7a6f9afe Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sun, 8 Jun 2008 16:02:52 +0000 Subject: enable client prediction --- src/core/gameinterface.cc | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) (limited to 'src/core/gameinterface.cc') 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::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) -- cgit v1.2.3