diff --git a/src/karts/controller/local_player_controller.cpp b/src/karts/controller/local_player_controller.cpp index cbb4d8a5d..3bd93613c 100644 --- a/src/karts/controller/local_player_controller.cpp +++ b/src/karts/controller/local_player_controller.cpp @@ -155,8 +155,20 @@ bool LocalPlayerController::action(PlayerAction action, int value, } // action // ---------------------------------------------------------------------------- -void LocalPlayerController::handleBufferedActions() +void LocalPlayerController::handleBufferedActions(double time_spent) { + if (m_actions.empty()) + return; + + // There is 0.1 delay in server, if time_spent is more than ~0.1, than + // the timer will be incorrect, in this case ignore all actions + if (time_spent > 0.09 && NetworkConfig::get()->isNetworking()) + { + Log::warn("LocalPlayerController", "Update race is too slow to catch" + " up: %lf", time_spent); + m_actions.clear(); + return; + } for (auto& p : m_actions) { PlayerAction action = p.first; diff --git a/src/karts/controller/local_player_controller.hpp b/src/karts/controller/local_player_controller.hpp index 6ca13147b..f87e7b677 100644 --- a/src/karts/controller/local_player_controller.hpp +++ b/src/karts/controller/local_player_controller.hpp @@ -93,7 +93,7 @@ public: /** Returns the name of the player profile. */ core::stringw getName() const OVERRIDE; // ------------------------------------------------------------------------ - void handleBufferedActions(); + void handleBufferedActions(double time_spent); }; // LocalPlayerController diff --git a/src/main_loop.cpp b/src/main_loop.cpp index 8dbb84115..f4a73daf2 100644 --- a/src/main_loop.cpp +++ b/src/main_loop.cpp @@ -405,7 +405,8 @@ void MainLoop::run() } m_ticks_adjustment.unlock(); - for(int i=0; i (World::getWorld()->getKart(i)->getController()); if (lpc) - lpc->handleBufferedActions(); + lpc->handleBufferedActions(time_spent); } if (auto gp = GameProtocol::lock()) gp->sendAllActions();