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 OnNetworkReceive(NetPeer peer, NetPacketReader reader, DeliveryMethod method) { byte[] data = reader.GetRemainingBytes(); Multiplayer.HandleReceive(new ByteReader(data), method == DeliveryMethod.ReliableOrdered); }
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; } } }