The BepInEx console will not appear when launching like it does for other games on Thunderstore (you can turn it back on in your BepInEx.cfg file). If your PEAK crashes on startup, add -dx12 to your launch parameters.
Decompiled source of CrossversionEnabler v1.0.0
BepInEx/plugins/Crossversion.dll
Decompiled a week agousing System; using System.Collections; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using HarmonyLib; using Photon.Pun; using Photon.Realtime; using Steamworks; using UnityEngine; using Zorro.Core; using Zorro.UI.Modal; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("PeakCrossVersion")] [assembly: AssemblyDescription("Join your friend without having the same game version.")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Kirigiri")] [assembly: AssemblyProduct("PeakCrossVersion")] [assembly: AssemblyCopyright("Kirigiri © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("be8d4052-15e4-4cc0-8481-034b8dd0e20d")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace PeakCrossVersion; [BepInPlugin("kirigiri.peak.crossversion", "PeakCrossVersion", "1.0.0.0")] public class PeakCrossVersion : BaseUnityPlugin { [HarmonyPatch(typeof(SteamLobbyHandler), "OnLobbyCreated")] public class SteamLobbyHandler_OnLobbyCreated_Patch { private static readonly FieldRef<SteamLobbyHandler, bool> isHostingRef = AccessTools.FieldRefAccess<SteamLobbyHandler, bool>("m_isHosting"); private static readonly FieldRef<SteamLobbyHandler, CSteamID> currentLobbyRef = AccessTools.FieldRefAccess<SteamLobbyHandler, CSteamID>("m_currentLobby"); [HarmonyPrefix] public static bool Prefix(ref LobbyCreated_t param, SteamLobbyHandler __instance) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Invalid comparison between Unknown and I4 //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown //IL_006a: Expected O, but got Unknown Debug.Log((object)"[PeakCrossVersion] Intercepted OnLobbyCreated"); isHostingRef.Invoke(__instance) = true; if ((int)param.m_eResult != 1) { Modal.OpenModal((HeaderModalOption)new DefaultHeaderModalOption(LocalizedText.GetText("MODAL_CANTCREATELOBBY_TITLE", true), $"{param.m_eResult}"), (ModalContentOption)new ModalButtonsOption((Option[])(object)new Option[1] { new Option(LocalizedText.GetText("OK", true), (Action)null) }), (Action)null); return false; } Debug.Log((object)$"Lobby Created: {param.m_ulSteamIDLobby}"); currentLobbyRef.Invoke(__instance) = new CSteamID(param.m_ulSteamIDLobby); BuildVersion val = new BuildVersion("kirigiri.1.0.a"); string text = ((BuildVersion)(ref val)).ToMatchmaking(); if (!SteamMatchmaking.SetLobbyData(currentLobbyRef.Invoke(__instance), "PeakVersion", text)) { Debug.LogError((object)"[PeakCrossVersion] Failed to assign game version to lobby"); } HostState val2 = ((StateMachine<ConnectionState>)(object)GameHandler.GetService<ConnectionService>().StateMachine).SwitchState<HostState>(false); PropertyInfo property = ((object)val2).GetType().GetProperty("RoomName"); if (property != null && property.CanWrite) { property.SetValue(val2, Guid.NewGuid().ToString()); } LoadingScreenHandler instance = RetrievableResourceSingleton<LoadingScreenHandler>.Instance; MethodInfo methodInfo = AccessTools.Method(typeof(LoadingScreenHandler), "LoadSceneProcess", (Type[])null, (Type[])null); if (methodInfo == null) { Debug.LogError((object)"[PeakCrossVersion] Failed to find LoadSceneProcess method."); return false; } IEnumerator enumerator = (IEnumerator)methodInfo.Invoke(instance, new object[4] { "Airport", false, true, 3f }); instance.Load((LoadingScreenType)0, (Action)null, new IEnumerator[1] { enumerator }); return false; } } [HarmonyPatch(typeof(SteamLobbyHandler), "OnLobbyDataUpdate")] public class SteamLobbyHandler_OnLobbyDataUpdate_Patch { private static readonly FieldRef<SteamLobbyHandler, Optionable<CSteamID>> fetchingVersionRef = AccessTools.FieldRefAccess<SteamLobbyHandler, Optionable<CSteamID>>("m_currentlyFetchingGameVersion"); [HarmonyPrefix] public static bool Prefix(ref LobbyDataUpdate_t param, SteamLobbyHandler __instance) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Expected O, but got Unknown //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Expected O, but got Unknown //IL_0195: Expected O, but got Unknown //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Expected O, but got Unknown //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Expected O, but got Unknown //IL_0149: Expected O, but got Unknown //IL_00ba: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)"[PeakCrossVersion] Intercepted OnLobbyDataUpdate."); Optionable<CSteamID> val = fetchingVersionRef.Invoke(__instance); if (param.m_bSuccess == 1) { if (val.IsSome && val.Value.m_SteamID == param.m_ulSteamIDLobby) { string lobbyData = SteamMatchmaking.GetLobbyData(val.Value, "PeakVersion"); BuildVersion val2 = new BuildVersion("kirigiri.1.0.a"); string text = ((BuildVersion)(ref val2)).ToMatchmaking(); if (lobbyData == text) { if (PhotonNetwork.InRoom) { Debug.LogError((object)"[PeakCrossVersion] Already in a room. Not joining invite."); return false; } MethodInfo methodInfo = AccessTools.Method(typeof(SteamLobbyHandler), "JoinLobby", (Type[])null, (Type[])null); if (methodInfo != null) { methodInfo.Invoke(__instance, new object[1] { val.Value }); } else { Debug.LogError((object)"[PeakCrossVersion] Failed to find JoinLobby method via reflection."); } } else { Debug.LogError((object)("[PeakCrossVersion] Game version mismatch: " + lobbyData)); string text2 = LocalizedText.GetText("MODAL_MISMATCH_BODY", true).Replace("#", lobbyData).Replace("&", text); Modal.OpenModal((HeaderModalOption)new DefaultHeaderModalOption(LocalizedText.GetText("MODAL_MISMATCH_TITLE", true), text2), (ModalContentOption)new ModalButtonsOption((Option[])(object)new Option[1] { new Option(LocalizedText.GetText("OK", true), (Action)null) }), (Action)null); } } } else { Debug.LogError((object)"[PeakCrossVersion] Failed to fetch lobby data."); Modal.OpenModal((HeaderModalOption)new DefaultHeaderModalOption(LocalizedText.GetText("MODAL_CANTFINDLOBBY_TITLE", true), LocalizedText.GetText("MODAL_CANTFINDLOBBY_BODY", true)), (ModalContentOption)new ModalButtonsOption((Option[])(object)new Option[1] { new Option(LocalizedText.GetText("OK", true), (Action)null) }), (Action)null); } fetchingVersionRef.Invoke(__instance) = Optionable<CSteamID>.None; return false; } } [HarmonyPatch(typeof(NetworkConnector), "ConnectToPhoton")] public class NetworkConnectorPatch { [HarmonyPrefix] public static bool Prefix() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)"[PeakCrossVersion] Intercepted ConnectToPhoton."); BuildVersion version = new BuildVersion("kirigiri.1.0.a"); PhotonNetwork.AutomaticallySyncScene = true; PhotonNetwork.GameVersion = ((object)(BuildVersion)(ref version)).ToString(); PhotonNetwork.PhotonServerSettings.AppSettings.AppVersion = ((BuildVersion)(ref version)).ToMatchmaking(); MethodInfo method = typeof(NetworkConnector).GetMethod("PrepareSteamAuthTicket", BindingFlags.Static | BindingFlags.NonPublic); if (method == null) { Debug.LogError((object)"Failed to find PrepareSteamAuthTicket via reflection."); return false; } method.Invoke(null, new object[1] { (Action)delegate { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) PhotonNetwork.ConnectUsingSettings(); ClientState networkClientState = PhotonNetwork.NetworkClientState; Debug.Log((object)("Photon Start " + ((object)(ClientState)(ref networkClientState)).ToString() + " using app version: " + ((BuildVersion)(ref version)).ToMatchmaking())); } }); return false; } } private void Awake() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) ((BaseUnityPlugin)this).Logger.LogInfo((object)"PeakCrossVersion has loaded!"); new Harmony("kirigiri.peak.crossversion").PatchAll(); } }