static void Convert() { LongEventHandler.QueueLongEvent(() => { try { const string suffix = "-preconvert"; var saveName = $"{GenFile.SanitizedFileName(Multiplayer.session.gameName)}{suffix}"; new FileInfo(Path.Combine(Multiplayer.ReplaysDir, saveName + ".zip")).Delete(); Replay.ForSaving(saveName).WriteCurrentData(); } catch (Exception e) { Log.Warning($"Convert to singleplayer failed to write pre-convert file: {e}"); } Find.GameInfo.permadeathMode = false; HostUtil.SetAllUniqueIds(Multiplayer.GlobalIdBlock.Current); Multiplayer.StopMultiplayer(); var doc = SaveLoad.SaveGameToDoc(); MemoryUtility.ClearAllMapsAndWorld(); Current.Game = new Game(); Current.Game.InitData = new GameInitData(); Current.Game.InitData.gameToLoad = "play"; LoadPatch.gameToLoad = new TempGameData(doc, new byte[0]); }, "Play", "MpConvertingToSp", true, null); }
public static void HandleReceive(ByteReader data, bool reliable) { try { Multiplayer.Client.HandleReceive(data, reliable); } catch (Exception e) { Log.Error($"Exception handling packet by {Multiplayer.Client}: {e}"); Multiplayer.session.disconnectInfo.titleTranslated = "MpPacketErrorLocal".Translate(); ConnectionStatusListeners.TryNotifyAll_Disconnected(); Multiplayer.StopMultiplayer(); } }
public void HandleJoinData(ByteReader data) { Multiplayer.session.gameName = data.ReadString(); Multiplayer.session.playerId = data.ReadInt32(); var remoteInfo = new RemoteData { remoteRwVersion = data.ReadString(), remoteMpVersion = data.ReadString(), remoteAddress = Multiplayer.session.address, remotePort = Multiplayer.session.port, remoteSteamHost = Multiplayer.session.steamHost }; var defDiff = false; var defsData = new ByteReader(data.ReadPrefixedBytes()); foreach (var local in MultiplayerData.localDefInfos) { var status = (DefCheckStatus)defsData.ReadByte(); local.Value.status = status; if (status != DefCheckStatus.Ok) { defDiff = true; } } JoinData.ReadServerData(data.ReadPrefixedBytes(), remoteInfo); OnMainThread.Schedule(Complete, 0.3f); void Complete() { if (JoinData.CompareToLocal(remoteInfo) && !defDiff) { StartDownloading(); return; } if (defDiff) { Multiplayer.StopMultiplayer(); } var connectingWindow = Find.WindowStack.WindowOfType <BaseConnectingWindow>(); MpUI.ClearWindowStack(); var defDiffStr = "\n\n" + MultiplayerData.localDefInfos .Where(kv => kv.Value.status != DefCheckStatus.Ok) .Take(10) .Join(kv => $"{kv.Key}: {kv.Value.status}", "\n"); Find.WindowStack.Add(new JoinDataWindow(remoteInfo) { connectAnywayDisabled = defDiff ? "MpMismatchDefsDiff".Translate() + defDiffStr : null, connectAnywayCallback = () => { Find.WindowStack.Add(connectingWindow); StartDownloading(); } }); void StartDownloading() { connection.Send(Packets.Client_WorldRequest); subState = JoiningState.Waiting; } } }