Allow clients to get list of initial items from server
This commit is contained in:
parent
224c694dfd
commit
fe4a9c5406
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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]()
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user