using System;
using System.Collections;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Unity.Netcode;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("ShipLobby")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyProduct("ShipLobby")]
[assembly: AssemblyCopyright("Copyright © tinyhoot 2023")]
[assembly: ComVisible(false)]
[assembly: AssemblyFileVersion("1.0.2")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.2.0")]
[module: UnverifiableCode]
namespace ShipLobby
{
[BepInPlugin("com.github.tinyhoot.ShipLobby", "ShipLobby", "1.0.2")]
internal class ShipLobby : BaseUnityPlugin
{
public const string GUID = "com.github.tinyhoot.ShipLobby";
public const string NAME = "ShipLobby";
public const string VERSION = "1.0.2";
internal static ManualLogSource Log;
private void Awake()
{
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
Log = ((BaseUnityPlugin)this).Logger;
new Harmony("com.github.tinyhoot.ShipLobby").PatchAll(Assembly.GetExecutingAssembly());
}
}
}
namespace ShipLobby.Patches
{
[HarmonyPatch]
internal class GameNetworkManagerPatcher
{
private static QuickMenuManager _quickMenuManager;
[HarmonyPostfix]
[HarmonyPatch(typeof(GameNetworkManager), "Singleton_OnClientConnectedCallback")]
private static void LogConnect()
{
ShipLobby.Log.LogDebug((object)"Player connected.");
}
[HarmonyPostfix]
[HarmonyPatch(typeof(GameNetworkManager), "Singleton_OnClientDisconnectCallback")]
private static void LogDisconnect()
{
ShipLobby.Log.LogDebug((object)"Player disconnected.");
}
[HarmonyPostfix]
[HarmonyPatch(typeof(GameNetworkManager), "ConnectionApproval")]
private static void FixConnectionApproval(GameNetworkManager __instance, ConnectionApprovalResponse response)
{
if (!response.Approved && !(response.Reason != "Game has already started!") && __instance.gameHasStarted && StartOfRound.Instance.inShipPhase)
{
ShipLobby.Log.LogDebug((object)"Approving incoming late connection.");
response.Reason = "";
response.Approved = true;
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(QuickMenuManager), "InviteFriendsButton")]
private static void FixFriendInviteButton()
{
if (GameNetworkManager.Instance.gameHasStarted && StartOfRound.Instance.inShipPhase)
{
GameNetworkManager.Instance.InviteFriendsUI();
}
}
[HarmonyPrefix]
[HarmonyPatch(typeof(GameNetworkManager), "LeaveLobbyAtGameStart")]
private static bool PreventSteamLobbyLeaving(GameNetworkManager __instance)
{
ShipLobby.Log.LogDebug((object)"Preventing the closing of Steam lobby.");
return false;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(StartOfRound), "StartGame")]
private static void CloseSteamLobby(StartOfRound __instance)
{
if (((NetworkBehaviour)__instance).IsServer && __instance.inShipPhase)
{
ShipLobby.Log.LogDebug((object)"Setting lobby to not joinable.");
GameNetworkManager.Instance.SetLobbyJoinable(false);
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(StartOfRound), "EndOfGame")]
private static IEnumerator ReopenSteamLobby(IEnumerator coroutine, StartOfRound __instance)
{
while (coroutine.MoveNext())
{
yield return coroutine.Current;
}
if (!((NetworkBehaviour)__instance).IsServer)
{
yield break;
}
yield return (object)new WaitForSeconds(0.5f);
yield return (object)new WaitUntil((Func<bool>)(() => !__instance.firingPlayersCutsceneRunning));
ShipLobby.Log.LogDebug((object)"Reopening lobby, setting to joinable.");
GameNetworkManager instance = GameNetworkManager.Instance;
if (instance.currentLobby.HasValue)
{
instance.SetLobbyJoinable(true);
if ((Object)(object)_quickMenuManager == (Object)null)
{
_quickMenuManager = Object.FindObjectOfType<QuickMenuManager>();
}
_quickMenuManager.inviteFriendsTextAlpha.alpha = 1f;
}
}
}
}