// called from ---GUI--- thread bool NetPlayServer::StartGame(const std::string &path) { std::lock_guard<std::recursive_mutex> lkg(m_crit.game); m_current_game = Common::Timer::GetTimeMs(); // no change, just update with clients AdjustPadBufferSize(m_target_buffer_size); // tell clients to start game sf::Packet spac; spac << (MessageId)NP_MSG_START_GAME; spac << m_current_game; spac << m_settings.m_CPUthread; spac << m_settings.m_CPUcore; spac << m_settings.m_DSPEnableJIT; spac << m_settings.m_DSPHLE; spac << m_settings.m_WriteToMemcard; spac << m_settings.m_EXIDevice[0]; spac << m_settings.m_EXIDevice[1]; std::lock_guard<std::recursive_mutex> lkp(m_crit.players); std::lock_guard<std::recursive_mutex> lks(m_crit.send); SendToClients(spac); m_is_running = true; return true; }
void NetPlayServer::SetHostInputAuthority(const bool enable) { std::lock_guard<std::recursive_mutex> lkg(m_crit.game); m_host_input_authority = enable; // tell clients about the new value sf::Packet spac; spac << static_cast<MessageId>(NP_MSG_HOST_INPUT_AUTHORITY); spac << m_host_input_authority; SendAsyncToClients(std::move(spac)); // resend pad buffer to clients when disabled if (!m_host_input_authority) AdjustPadBufferSize(m_target_buffer_size); }
// called from multiple threads bool NetPlayServer::StartGame() { m_timebase_by_frame.clear(); m_desync_detected = false; std::lock_guard<std::recursive_mutex> lkg(m_crit.game); m_current_game = Common::Timer::GetTimeMs(); // no change, just update with clients if (!m_host_input_authority) AdjustPadBufferSize(m_target_buffer_size); m_first_pad_status_received.fill(false); const sf::Uint64 initial_rtc = GetInitialNetPlayRTC(); const std::string region = SConfig::GetDirectoryForRegion( SConfig::ToGameCubeRegion(m_dialog->FindGameFile(m_selected_game)->GetRegion())); // tell clients to start game sf::Packet spac; spac << static_cast<MessageId>(NP_MSG_START_GAME); spac << m_current_game; spac << m_settings.m_CPUthread; spac << static_cast<std::underlying_type_t<PowerPC::CPUCore>>(m_settings.m_CPUcore); spac << m_settings.m_EnableCheats; spac << m_settings.m_SelectedLanguage; spac << m_settings.m_OverrideGCLanguage; spac << m_settings.m_ProgressiveScan; spac << m_settings.m_PAL60; spac << m_settings.m_DSPEnableJIT; spac << m_settings.m_DSPHLE; spac << m_settings.m_WriteToMemcard; spac << m_settings.m_CopyWiiSave; spac << m_settings.m_OCEnable; spac << m_settings.m_OCFactor; spac << m_settings.m_ReducePollingRate; spac << m_settings.m_EXIDevice[0]; spac << m_settings.m_EXIDevice[1]; spac << m_settings.m_EFBAccessEnable; spac << m_settings.m_BBoxEnable; spac << m_settings.m_ForceProgressive; spac << m_settings.m_EFBToTextureEnable; spac << m_settings.m_XFBToTextureEnable; spac << m_settings.m_DisableCopyToVRAM; spac << m_settings.m_ImmediateXFBEnable; spac << m_settings.m_EFBEmulateFormatChanges; spac << m_settings.m_SafeTextureCacheColorSamples; spac << m_settings.m_PerfQueriesEnable; spac << m_settings.m_FPRF; spac << m_settings.m_AccurateNaNs; spac << m_settings.m_SyncOnSkipIdle; spac << m_settings.m_SyncGPU; spac << m_settings.m_SyncGpuMaxDistance; spac << m_settings.m_SyncGpuMinDistance; spac << m_settings.m_SyncGpuOverclock; spac << m_settings.m_JITFollowBranch; spac << m_settings.m_FastDiscSpeed; spac << m_settings.m_MMU; spac << m_settings.m_Fastmem; spac << m_settings.m_SkipIPL; spac << m_settings.m_LoadIPLDump; spac << m_settings.m_VertexRounding; spac << m_settings.m_InternalResolution; spac << m_settings.m_EFBScaledCopy; spac << m_settings.m_FastDepthCalc; spac << m_settings.m_EnablePixelLighting; spac << m_settings.m_WidescreenHack; spac << m_settings.m_ForceFiltering; spac << m_settings.m_MaxAnisotropy; spac << m_settings.m_ForceTrueColor; spac << m_settings.m_DisableCopyFilter; spac << m_settings.m_DisableFog; spac << m_settings.m_ArbitraryMipmapDetection; spac << m_settings.m_ArbitraryMipmapDetectionThreshold; spac << m_settings.m_EnableGPUTextureDecoding; spac << m_settings.m_StrictSettingsSync; spac << initial_rtc; spac << m_settings.m_SyncSaveData; spac << region; SendAsyncToClients(std::move(spac)); m_start_pending = false; m_is_running = true; return true; }