private static bool HandleMessage(InnerNetClient __instance, [HarmonyArgument(0)] MessageReader reader) { if (reader.Tag != 8 || __instance.GameId != reader.ReadInt32() || __instance.GameState == InnerNetClient.GameStates.Ended) { return(true); } __instance.GameState = InnerNetClient.GameStates.Ended; lock (__instance.allClients) { __instance.allClients.Clear(); } var reason = (GameOverReason)reader.ReadSByte(); bool showAd = reader.ReadBoolean(); if (reason.IsCustom()) { CustomGameOverReasonManager.EndReason = CustomGameOverReason.Deserialize(reader); } lock (__instance.Dispatcher) { __instance.Dispatcher.Add((Action)(() => __instance.OnGameEnd(reason, showAd))); return(false); } }
public static bool Prefix(InnerNetClient __instance, [HarmonyArgument(0)] MessageReader reader) { // If i am host, respond to handshake if (__instance.AmHost && reader.BytesRemaining > 3) { var handshakeReader = MessageReader.Get(reader).ReadMessageAsNewBuffer(); if (handshakeReader.Tag == TOU_ROOT_HANDSHAKE_TAG) { PluginSingleton <TownOfUs> .Instance.Log.LogMessage($"InnerNetClient.HandleMessage.Prefix - Host recieved TOU handshake"); var clientId = handshakeReader.ReadInt32(); var touVersion = handshakeReader.ReadString(); // List<int> HandshakedClients - exists to disconnect legacy clients that don't send handshake PluginSingleton <TownOfUs> .Instance.Log.LogMessage($"InnerNetClient.HandleMessage.Prefix - Adding {clientId} with TOU version {touVersion} to List<int>HandshakedClients"); HandshakedClients.Add(clientId); if (!TownOfUs.GetVersion().Equals(touVersion)) { PluginSingleton <TownOfUs> .Instance.Log.LogMessage($"InnerNetClient.HandleMessage.Prefix - ClientId {clientId} has mismatched TOU version {touVersion}. (Ours is {TownOfUs.GetVersion()})"); __instance.SendCustomDisconnect(clientId); } return(false); } } return(true); }
private static void SendCustomDisconnect(this InnerNetClient innerNetClient, int clientId) { var messageWriter = MessageWriter.Get(SendOption.Reliable); messageWriter.StartMessage(11); messageWriter.Write(innerNetClient.GameId); messageWriter.WritePacked(clientId); messageWriter.Write(false); messageWriter.Write(8); messageWriter.Write($"The host has a different version of Town Of Us ({TownOfUs.GetVersion()})"); messageWriter.EndMessage(); innerNetClient.SendOrDisconnect(messageWriter); messageWriter.Recycle(); }
public static bool Prefix(InnerNetClient __instance, [HarmonyArgument(0)] MessageReader reader, [HarmonyArgument(1)] SendOption sendOption) { if (reader.Tag == byte.MaxValue) { var serverBrand = reader.ReadString(); __instance.connection.State = ConnectionState.Connected; PluginSingleton <ReactorPlugin> .Instance.Log.LogDebug($"Connected to modded server ({serverBrand})"); return(false); } return(true); }
public static void Postfix(InnerNetClient __instance, MessageReader ALMCIJKELCP, SendOption GLLMNHCBIOC) { MessageReader reader = ALMCIJKELCP; if (reader.Tag != 2) { return; } int playersLeft = PlayerControl.AllPlayerControls.ToArray().Count(pc => !pc.Data.IsDead && !pc.Data.Disconnected); udpateBools(playersLeft); }
private static void DisconnectPlayer(InnerNetClient _this, int clientId) { if (!_this.AmHost) { return; } MessageWriter messageWriter = MessageWriter.Get(SendOption.Reliable); messageWriter.StartMessage(4); messageWriter.Write(_this.GameId); messageWriter.WritePacked(clientId); messageWriter.Write((byte)DisconnectReasons.GameFull); messageWriter.EndMessage(); _this.SendOrDisconnect(messageWriter); messageWriter.Recycle(); }
public static bool Prefix(string EMFDKKLLHCL, ushort JOBBGKDMALK, ref InnerNetClient __instance) { var customServer = customServers.FirstOrDefault(x => x.ToString() == EMFDKKLLHCL); if (customServer != default) { CustomServersPlugin.Logger.LogDebug($"Setting IP and port for custom server \"{customServer.name}\"!"); __instance.HECFEPIMCOE = customServer.ip; __instance.DNGDMFHEJBA = customServer.port; } else { __instance.HECFEPIMCOE = EMFDKKLLHCL; __instance.DNGDMFHEJBA = JOBBGKDMALK; } return(false); }
private static IEnumerator WaitForHandshake(InnerNetClient innerNetClient, int clientId) { PluginSingleton <TownOfUs> .Instance.Log.LogMessage($"WaitForHandshake(innerNetClient, clientId = {clientId})"); yield return(new WaitForSeconds(5f)); PluginSingleton <TownOfUs> .Instance.Log.LogMessage($"WaitForHandshake() - Waited 5 seconds"); if (!HandshakedClients.Contains(clientId)) { PluginSingleton <TownOfUs> .Instance.Log.LogMessage($"WaitForHandshake() - HandshakedClients did not contain clientId {clientId}"); if (innerNetClient.allClients.ToArray().Any(x => x.Id == clientId)) { innerNetClient.SendCustomDisconnect(clientId); } } else { PluginSingleton <TownOfUs> .Instance.Log.LogMessage($"WaitForHandshake() - HandshakedClients contained clientId {clientId}"); } }
public static bool Prefix(InnerNetClient __instance, [HarmonyArgument(0)] MessageReader reader) { if (reader.Tag == byte.MaxValue) { var flag = (ReactorMessageFlags)reader.ReadByte(); switch (flag) { case ReactorMessageFlags.Handshake: { ModdedHandshakeS2C.Deserialize(reader, out var serverName, out var serverVersion, out var pluginCount); Logger <ReactorPlugin> .Info($"Connected to a modded server ({serverName} {serverVersion}, {pluginCount} plugins), sending mod declarations"); var mods = ModList.Current; var writer = MessageWriter.Get(SendOption.Reliable); var expected = 0; var got = 0; void Send() { expected++; __instance.connection.Send(writer, () => { got++; if (got >= expected) { Logger <ReactorPlugin> .Debug("Received all acks"); __instance.connection.State = ConnectionState.Connected; } }); writer.Recycle(); } foreach (var mod in mods) { ModDeclaration.Serialize(writer, mod); if (writer.Length >= 500) { writer.CancelMessage(); Send(); writer = MessageWriter.Get(SendOption.Reliable); ModDeclaration.Serialize(writer, mod); } writer.EndMessage(); } Send(); break; } case ReactorMessageFlags.PluginDeclaration: { // TODO break; } default: throw new ArgumentOutOfRangeException(); } return(false); } return(true); }
public static void Postfix(out bool __result, InnerNetClient __instance) { __result = __instance.AmHost; }