Allow clients to get list of initial items from server

This commit is contained in:
Benau 2019-02-27 11:07:08 +08:00
parent 224c694dfd
commit fe4a9c5406
7 changed files with 36 additions and 26 deletions

View File

@ -83,21 +83,6 @@ void NetworkItemManager::reset()
ItemManager::reset();
} // reset
//-----------------------------------------------------------------------------
/** Initialize state at the start of a race.
*/
void NetworkItemManager::initClientConfirmState()
{
m_confirmed_state_time = 0;
m_confirmed_state.clear();
for(auto i : m_all_items)
{
ItemState *is = new ItemState(*i);
m_confirmed_state.push_back(is);
}
} // initClientConfirmState
//-----------------------------------------------------------------------------
/** Called when a kart collects an item. In network games only the server
* acts on this event.
@ -557,6 +542,7 @@ void NetworkItemManager::saveCompleteState(BareNetworkString* buffer) const
//-----------------------------------------------------------------------------
/** Restore all current items at current ticks in client for live join
* or at the start of a race.
*/
void NetworkItemManager::restoreCompleteState(const BareNetworkString& buffer)
{

View File

@ -75,10 +75,6 @@ public:
static void create();
virtual ~NetworkItemManager();
void sendItemUpdate();
void initClientConfirmState();
virtual void reset() OVERRIDE;
virtual void setItemConfirmationTime(std::weak_ptr<STKPeer> peer,
int ticks) OVERRIDE;

View File

@ -45,6 +45,10 @@ WorldStatus::WorldStatus()
m_prestart_sound = SFXManager::get()->createSoundSource("pre_start_race");
m_start_sound = SFXManager::get()->createSoundSource("start_race");
m_track_intro_sound = SFXManager::get()->createSoundSource("track_intro");
m_time = 0.0f;
m_time_ticks = 0;
m_auxiliary_ticks = 0;
m_count_up_ticks = 0;
m_play_track_intro_sound = UserConfigParams::m_music;
m_play_ready_set_go_sounds = true;

View File

@ -166,6 +166,7 @@ bool ClientLobby::notifyEvent(Event* event)
case LE_BAD_CONNECTION: handleBadConnection(); break;
case LE_LIVE_JOIN_ACK: liveJoinAcknowledged(event); break;
case LE_KART_INFO: handleKartInfo(event); break;
case LE_START_RACE: startGame(event); break;
default:
return false;
break;
@ -187,7 +188,6 @@ bool ClientLobby::notifyEventAsynchronous(Event* event)
message_type);
switch(message_type)
{
case LE_START_RACE: startGame(event); break;
default: break;
} // switch
@ -853,6 +853,12 @@ void ClientLobby::startGame(Event* event)
World::getWorld()->setPhase(WorldStatus::SERVER_READY_PHASE);
uint64_t start_time = event->data().getUInt64();
powerup_manager->setRandomSeed(start_time);
NetworkItemManager* nim =
dynamic_cast<NetworkItemManager*>(ItemManager::get());
assert(nim);
nim->restoreCompleteState(event->data());
joinStartGameThread();
m_start_game_thread = std::thread([start_time, this]()
{

View File

@ -137,6 +137,7 @@ ServerLobby::ServerLobby() : LobbyProtocol(NULL)
}
m_result_ns = getNetworkString();
m_result_ns->setSynchronous(true);
m_items_complete_state = new BareNetworkString();
m_waiting_for_reset = false;
m_server_id_online.store(0);
m_difficulty.store(ServerConfig::m_server_difficulty);
@ -155,6 +156,7 @@ ServerLobby::~ServerLobby()
unregisterServer(true/*now*/);
}
delete m_result_ns;
delete m_items_complete_state;
if (m_save_server_config)
ServerConfig::writeServerConfigToDisk();
delete m_default_vote;
@ -3028,7 +3030,9 @@ void ServerLobby::configPeersStartTime()
uint64_t start_time = STKHost::get()->getNetworkTimer() + (uint64_t)2500;
powerup_manager->setRandomSeed(start_time);
NetworkString* ns = getNetworkString(10);
ns->setSynchronous(true);
ns->addUInt8(LE_START_RACE).addUInt64(start_time);
*ns += *m_items_complete_state;
m_client_starting_time = start_time;
sendMessageToPeers(ns, /*reliable*/true);
@ -3552,3 +3556,14 @@ void ServerLobby::clientSelectingAssetsWantsToBackLobby(Event* event)
peer->sendPacket(server_info, /*reliable*/true);
delete server_info;
} // clientSelectingAssetsWantsToBackLobby
//-----------------------------------------------------------------------------
void ServerLobby::saveInitialItems()
{
m_items_complete_state->getBuffer().clear();
m_items_complete_state->reset();
NetworkItemManager* nim =
dynamic_cast<NetworkItemManager*>(ItemManager::get());
assert(nim);
nim->saveCompleteState(m_items_complete_state);
} // saveInitialItems

View File

@ -148,8 +148,12 @@ private:
/** Number of ranked races done for each current players */
std::map<uint32_t, unsigned> m_num_ranked_races;
/* Saved the last game result */
NetworkString* m_result_ns;
/* Used to make sure clients are having same item list at start */
BareNetworkString* m_items_complete_state;
std::atomic<uint32_t> m_server_id_online;
std::atomic<int> m_difficulty;
@ -315,6 +319,7 @@ public:
float getStartupBoostOrPenaltyForKart(uint32_t ping, unsigned kart_id);
int getDifficulty() const { return m_difficulty.load(); }
int getGameMode() const { return m_game_mode.load(); }
void saveInitialItems();
}; // class ServerLobby
#endif // SERVER_LOBBY_HPP

View File

@ -61,6 +61,7 @@
#include "modes/easter_egg_hunt.hpp"
#include "modes/profile_world.hpp"
#include "network/network_config.hpp"
#include "network/protocols/server_lobby.hpp"
#include "physics/physical_object.hpp"
#include "physics/physics.hpp"
#include "physics/triangle_mesh.hpp"
@ -2190,12 +2191,9 @@ void Track::loadTrackModel(bool reverse_track, unsigned int mode_id)
delete root;
main_loop->renderGUI(5800);
if (NetworkConfig::get()->isNetworking() &&
NetworkConfig::get()->isClient())
{
static_cast<NetworkItemManager*>(NetworkItemManager::get())
->initClientConfirmState();
}
if (auto sl = LobbyProtocol::get<ServerLobby>())
sl->saveInitialItems();
main_loop->renderGUI(5900);
if (UserConfigParams::m_track_debug && Graph::get() && !m_is_cutscene)