diff --git a/src/karts/kart_rewinder.cpp b/src/karts/kart_rewinder.cpp index 55239c2e8..3b4daa723 100644 --- a/src/karts/kart_rewinder.cpp +++ b/src/karts/kart_rewinder.cpp @@ -61,6 +61,7 @@ void KartRewinder::reset() SmoothNetworkBody::setEnable(true); SmoothNetworkBody::setSmoothRotation(true); SmoothNetworkBody::setAdjustVerticalOffset(true); + m_has_server_state = false; } // reset // ---------------------------------------------------------------------------- @@ -78,6 +79,7 @@ void KartRewinder::saveTransform() } m_prev_steering = getSteerPercent(); + m_has_server_state = false; } // saveTransform // ---------------------------------------------------------------------------- @@ -100,6 +102,16 @@ void KartRewinder::computeError() } else m_steering_smoothing_dt = -1.0f; + + if (!m_has_server_state && !isEliminated()) + { + const int kartid = getWorldKartId(); + Log::debug("KartRewinder", "Kart id %d disconnected", kartid); + World::getWorld()->eliminateKart(kartid, + false/*notify_of_elimination*/); + setPosition(World::getWorld()->getCurrentNumKarts() + 1); + finishedRace(World::getWorld()->getTime(), true/*from_server*/); + } } // computeError // ---------------------------------------------------------------------------- @@ -195,6 +207,7 @@ BareNetworkString* KartRewinder::saveState(std::vector* ru) */ void KartRewinder::restoreState(BareNetworkString *buffer, int count) { + m_has_server_state = true; // 1) Firing and related handling // ----------- diff --git a/src/karts/kart_rewinder.hpp b/src/karts/kart_rewinder.hpp index c3cbefd22..93cdd83b8 100644 --- a/src/karts/kart_rewinder.hpp +++ b/src/karts/kart_rewinder.hpp @@ -34,6 +34,7 @@ private: float m_prev_steering, m_steering_smoothing_dt, m_steering_smoothing_time; int m_last_animation_end_ticks; + bool m_has_server_state; public: KartRewinder(const std::string& ident, unsigned int world_kart_id, int position, const btTransform& init_transform, diff --git a/src/network/game_setup.cpp b/src/network/game_setup.cpp index 6633347e3..9f8b28ea7 100644 --- a/src/network/game_setup.cpp +++ b/src/network/game_setup.cpp @@ -25,7 +25,6 @@ #include "network/network_config.hpp" #include "network/network_player_profile.hpp" #include "network/peer_vote.hpp" -#include "network/protocols/game_events_protocol.hpp" #include "network/protocols/server_lobby.hpp" #include "network/server_config.hpp" #include "network/stk_host.hpp" @@ -126,10 +125,6 @@ void GameSetup::update(bool remove_disconnected_players) k->setPosition( World::getWorld()->getCurrentNumKarts() + 1); k->finishedRace(World::getWorld()->getTime(), true/*from_server*/); - NetworkString p(PROTOCOL_GAME_EVENTS); - p.setSynchronous(true); - p.addUInt8(GameEventsProtocol::GE_PLAYER_DISCONNECT).addUInt8(i); - STKHost::get()->sendPacketToAllPeers(&p, true); } } m_connected_players_count.store(total); diff --git a/src/network/protocols/game_events_protocol.cpp b/src/network/protocols/game_events_protocol.cpp index b204884de..aa1c0c574 100644 --- a/src/network/protocols/game_events_protocol.cpp +++ b/src/network/protocols/game_events_protocol.cpp @@ -56,8 +56,6 @@ bool GameEventsProtocol::notifyEvent(Event* event) { case GE_KART_FINISHED_RACE: kartFinishedRace(data); break; - case GE_PLAYER_DISCONNECT: - eliminatePlayer(data); break; case GE_RESET_BALL: { if (!sw) @@ -132,22 +130,6 @@ bool GameEventsProtocol::notifyEvent(Event* event) return true; } // notifyEvent -// ---------------------------------------------------------------------------- -void GameEventsProtocol::eliminatePlayer(const NetworkString &data) -{ - assert(NetworkConfig::get()->isClient()); - if (data.size() < 1) - { - Log::warn("GameEventsProtocol", "eliminatePlayer: Too short message."); - } - int kartid = data.getUInt8(); - World::getWorld()->eliminateKart(kartid, false/*notify_of_elimination*/); - World::getWorld()->getKart(kartid)->setPosition( - World::getWorld()->getCurrentNumKarts() + 1); - World::getWorld()->getKart(kartid)->finishedRace( - World::getWorld()->getTime(), true/*from_server*/); -} // eliminatePlayer - // ---------------------------------------------------------------------------- /** This function is called from the server when a kart finishes a race. It * sends a notification to all clients about this event. diff --git a/src/network/protocols/game_events_protocol.hpp b/src/network/protocols/game_events_protocol.hpp index 522d0d691..a5e6038d9 100644 --- a/src/network/protocols/game_events_protocol.hpp +++ b/src/network/protocols/game_events_protocol.hpp @@ -12,12 +12,11 @@ public: enum GameEventType : uint8_t { GE_KART_FINISHED_RACE = 1, - GE_PLAYER_DISCONNECT = 2, - GE_RESET_BALL = 3, - GE_PLAYER_GOAL = 4, - GE_BATTLE_KART_SCORE = 5, - GE_CTF_SCORED = 6, - GE_STARTUP_BOOST = 7, + GE_STARTUP_BOOST = 2, + GE_CTF_SCORED = 3, + GE_RESET_BALL = 4, + GE_PLAYER_GOAL = 5, + GE_BATTLE_KART_SCORE = 6, }; // GameEventType private: int m_last_finished_position;