Decompiled source of PickMore v0.5.0

PickMore.dll

Decompiled 13 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Photon.Pun;
using SettingsUI;
using TMPro;
using UnboundLib;
using UnboundLib.GameModes;
using UnboundLib.Networking;
using UnboundLib.Utils.UI;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("PickMore")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.5.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("PickMore")]
[assembly: AssemblyTitle("PickMore")]
[assembly: AssemblyVersion("0.5.0.0")]
namespace PickMore;

[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.sauceproducer.rounds.pickmore", "PickMore", "0.5.0")]
[BepInProcess("Rounds.exe")]
public class PickMorePlugin : BaseUnityPlugin
{
	[HarmonyPatch(typeof(CardChoice), "DoPick")]
	[HarmonyPriority(800)]
	private class CardChoiceDoPickPatch
	{
		private static void Postfix(int picketIDToSet)
		{
			if (!extraPicksInProgress)
			{
				lastPickedPlayer = picketIDToSet;
			}
		}
	}

	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static UnityAction <>9__16_0;

		public static Func<IGameModeHandler, IEnumerator> <>9__16_1;

		internal void <Start>b__16_0()
		{
		}

		internal IEnumerator <Start>b__16_1(IGameModeHandler gm)
		{
			return ResetState();
		}
	}

	[CompilerGenerated]
	private sealed class <OnPlayerPickEnd>d__22 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		private int <player>5__2;

		private int <max>5__3;

		private int <picksDone>5__4;

		private bool <stoppedEarly>5__5;

		private int <i>5__6;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <OnPlayerPickEnd>d__22(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			int num = <>1__state;
			if (num == -3 || (uint)(num - 1) <= 2u)
			{
				try
				{
				}
				finally
				{
					<>m__Finally1();
				}
			}
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_0261: Unknown result type (might be due to invalid IL or missing references)
			//IL_026b: Expected O, but got Unknown
			try
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					if (extraPicksInProgress)
					{
						return false;
					}
					<player>5__2 = lastPickedPlayer;
					if (<player>5__2 < 0)
					{
						if ((Object)(object)Instance != (Object)null)
						{
							((BaseUnityPlugin)Instance).Logger.LogInfo((object)"[PickMore] no lastPickedPlayer - skipping extras");
						}
						return false;
					}
					<max>5__3 = Mathf.Clamp(MaxPicks, 1, 30);
					if (<max>5__3 <= 1)
					{
						return false;
					}
					extraPicksInProgress = true;
					DoneRequested = false;
					if ((Object)(object)Instance != (Object)null)
					{
						((BaseUnityPlugin)Instance).Logger.LogInfo((object)("[PickMore] -> Player " + <player>5__2 + " continues (picks 2-" + <max>5__3 + ")"));
					}
					<picksDone>5__4 = 0;
					<stoppedEarly>5__5 = false;
					<>1__state = -3;
					<i>5__6 = 0;
					break;
				case 1:
					<>1__state = -3;
					if ((Object)(object)CardChoiceVisuals.instance != (Object)null)
					{
						CardChoiceVisuals.instance.Show(<player>5__2, true);
					}
					<>2__current = CardChoice.instance.DoPick(<player>5__2, <player>5__2, (PickerType)1);
					<>1__state = 2;
					return true;
				case 2:
					<>1__state = -3;
					<>2__current = (object)new WaitForSecondsRealtime(0.15f);
					<>1__state = 3;
					return true;
				case 3:
					<>1__state = -3;
					<picksDone>5__4 = <i>5__6 + 1;
					<i>5__6++;
					break;
				}
				if (<i>5__6 < <max>5__3 - 1)
				{
					if (!DoneRequested)
					{
						currentPickNumber = <i>5__6 + 2;
						if ((Object)(object)Instance != (Object)null)
						{
							((BaseUnityPlugin)Instance).Logger.LogInfo((object)("[PickMore]    pick " + currentPickNumber + "/" + <max>5__3 + " for player " + <player>5__2));
						}
						<>2__current = GameModeManager.TriggerHook("PlayerPickStart");
						<>1__state = 1;
						return true;
					}
					<stoppedEarly>5__5 = true;
					if ((Object)(object)Instance != (Object)null)
					{
						((BaseUnityPlugin)Instance).Logger.LogInfo((object)("[PickMore] Continue clicked - stopping at " + (<i>5__6 + 1) + " extras"));
					}
				}
				<>m__Finally1();
				return false;
			}
			catch
			{
				//try-fault
				((IDisposable)this).Dispose();
				throw;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		private void <>m__Finally1()
		{
			<>1__state = -1;
			if ((Object)(object)CardChoiceVisuals.instance != (Object)null)
			{
				CardChoiceVisuals.instance.Hide();
			}
			extraPicksInProgress = false;
			currentPickNumber = 1;
			lastPickedPlayer = -1;
			if ((Object)(object)Instance != (Object)null)
			{
				((BaseUnityPlugin)Instance).Logger.LogInfo((object)("[PickMore] <- Player " + <player>5__2 + " finished after " + <picksDone>5__4 + " extra picks" + (<stoppedEarly>5__5 ? " (continue clicked)." : ".")));
			}
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	[CompilerGenerated]
	private sealed class <ResetState>d__21 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <ResetState>d__21(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			if (<>1__state != 0)
			{
				return false;
			}
			<>1__state = -1;
			if (!extraPicksInProgress)
			{
				lastPickedPlayer = -1;
				DoneRequested = false;
				currentPickNumber = 1;
				if ((Object)(object)Instance != (Object)null)
				{
					((BaseUnityPlugin)Instance).Logger.LogInfo((object)("[PickMore] === Pick phase START (max=" + MaxPicks + ") ==="));
				}
			}
			return false;
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	public const string ModId = "com.sauceproducer.rounds.pickmore";

	public const string ModName = "PickMore";

	public const string Version = "0.5.0";

	public const int HardMaxPicks = 30;

	public static ConfigEntry<int> MaxPicksConfig;

	internal static bool extraPicksInProgress = false;

	internal static bool DoneRequested = false;

	internal static int lastPickedPlayer = -1;

	internal static int currentPickNumber = 1;

	public static PickMorePlugin Instance { get; private set; }

	public static int MaxPicks
	{
		get
		{
			if (MaxPicksConfig != null)
			{
				return MaxPicksConfig.Value;
			}
			return 5;
		}
	}

	private void Awake()
	{
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		Instance = this;
		MaxPicksConfig = ((BaseUnityPlugin)this).Config.Bind<int>("PickMore", "MaxPicks", 5, "How many cards each player picks per pick phase. Host's value is authoritative in multiplayer. Range 1-" + 30 + ".");
		new Harmony("com.sauceproducer.rounds.pickmore").PatchAll();
		((BaseUnityPlugin)this).Logger.LogInfo((object)("[PickMore] v0.5.0 loaded. MaxPicks=" + MaxPicks));
	}

	private void Start()
	{
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Expected O, but got Unknown
		object obj = <>c.<>9__16_0;
		if (obj == null)
		{
			UnityAction val = delegate
			{
			};
			<>c.<>9__16_0 = val;
			obj = (object)val;
		}
		Unbound.RegisterMenu("PickMore", (UnityAction)obj, (Action<GameObject>)BuildMenu, (GameObject)null, false);
		Unbound.RegisterHandshake("com.sauceproducer.rounds.pickmore", (Action)OnHandshakeCompleted);
		GameModeManager.AddHook("PickStart", (Func<IGameModeHandler, IEnumerator>)((IGameModeHandler gm) => ResetState()), 800);
		GameModeManager.AddHook("PlayerPickEnd", (Func<IGameModeHandler, IEnumerator>)OnPlayerPickEnd, 800);
		((BaseUnityPlugin)this).Logger.LogInfo((object)"[PickMore] hooks registered.");
	}

	private static void OnHandshakeCompleted()
	{
		if (PhotonNetwork.IsMasterClient)
		{
			NetworkingManager.RPC_Others(typeof(PickMorePlugin), "SyncMaxPicks", new object[1] { MaxPicks });
		}
	}

	[UnboundRPC]
	private static void SyncMaxPicks(int hostValue)
	{
		int value = Mathf.Clamp(hostValue, 1, 30);
		if (MaxPicksConfig != null)
		{
			MaxPicksConfig.Value = value;
		}
		if ((Object)(object)Instance != (Object)null)
		{
			((BaseUnityPlugin)Instance).Logger.LogInfo((object)("[PickMore] Host set MaxPicks=" + value));
		}
	}

	[UnboundRPC]
	private static void SyncDone()
	{
		DoneRequested = true;
		if ((Object)(object)Instance != (Object)null)
		{
			((BaseUnityPlugin)Instance).Logger.LogInfo((object)"[PickMore] Done broadcast received.");
		}
	}

	private static void BroadcastDoneIfHost()
	{
		DoneRequested = true;
		NetworkingManager.RPC_Others(typeof(PickMorePlugin), "SyncDone", new object[0]);
	}

	[IteratorStateMachine(typeof(<ResetState>d__21))]
	private static IEnumerator ResetState()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <ResetState>d__21(0);
	}

	[IteratorStateMachine(typeof(<OnPlayerPickEnd>d__22))]
	private static IEnumerator OnPlayerPickEnd(IGameModeHandler gm)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <OnPlayerPickEnd>d__22(0);
	}

	internal void BuildMenu(GameObject menu)
	{
		try
		{
			TextMeshProUGUI val = default(TextMeshProUGUI);
			MenuHandler.CreateText("PickMore", menu, ref val, 60, true, (Color?)null, (TMP_FontAsset)null, (Material)null, (TextAlignmentOptions?)null);
			MenuHandler.CreateText(" ", menu, ref val, 30, true, (Color?)null, (TMP_FontAsset)null, (Material)null, (TextAlignmentOptions?)null);
			MenuHandler.CreateText("Each picking player takes N cards in one sitting. Click on-screen Continue to stop early. In a lobby, only the host can change this.", menu, ref val, 24, true, (Color?)null, (TMP_FontAsset)null, (Material)null, (TextAlignmentOptions?)null);
			MenuHandler.CreateText(" ", menu, ref val, 30, true, (Color?)null, (TMP_FontAsset)null, (Material)null, (TextAlignmentOptions?)null);
			int num = ((MaxPicksConfig == null) ? 5 : MaxPicksConfig.Value);
			UnityAction<float> val2 = delegate(float v)
			{
				try
				{
					int num2 = Mathf.Clamp(Mathf.RoundToInt(v), 1, 30);
					if (MaxPicksConfig != null)
					{
						MaxPicksConfig.Value = num2;
					}
					if (PhotonNetwork.IsMasterClient && !PhotonNetwork.OfflineMode)
					{
						NetworkingManager.RPC_Others(typeof(PickMorePlugin), "SyncMaxPicks", new object[1] { num2 });
					}
				}
				catch (Exception ex2)
				{
					((BaseUnityPlugin)this).Logger.LogError((object)("[PickMore] slider onChange threw: " + ex2));
				}
			};
			Slider val3 = default(Slider);
			MenuHandler.CreateSlider("Max cards per pick phase", menu, 30, 1f, 30f, (float)num, val2, ref val3, true, (Color?)null, (Direction)0, true, (Color?)null, (TMP_FontAsset)null, (Material)null, (TextAlignmentOptions?)null);
			MenuHandler.CreateText(" ", menu, ref val, 30, true, (Color?)null, (TMP_FontAsset)null, (Material)null, (TextAlignmentOptions?)null);
		}
		catch (Exception ex)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)("[PickMore] BuildMenu threw: " + ex));
		}
	}

	private void OnGUI()
	{
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		if (!extraPicksInProgress || DoneRequested)
		{
			return;
		}
		int num = Mathf.Clamp(MaxPicks, 1, 30);
		string text = "Continue (" + currentPickNumber + "/" + num + ")";
		int num2 = 260;
		int num3 = 64;
		int num4 = (Screen.width - num2) / 2;
		int num5 = Screen.height - num3 - 30;
		if (GUI.Button(new Rect((float)num4, (float)num5, (float)num2, (float)num3), text))
		{
			if ((Object)(object)Instance != (Object)null)
			{
				((BaseUnityPlugin)Instance).Logger.LogInfo((object)"[PickMore] Continue clicked.");
			}
			BroadcastDoneIfHost();
		}
	}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.sauceproducer.rounds.pickmore.rwfcompat", "PickMore RWF Compatibility", "0.5.0")]
[BepInProcess("Rounds.exe")]
internal class PickMoreRWFCompat : CompatibilityHandler
{
	public override string MenuName => "PickMore";

	public override bool HostOnly => true;

	public override void Start()
	{
		Debug.Log("[PickMore] RWF compat Start() running, calling base to register menu...");
		try
		{
			((CompatibilityHandler)this).Start();
			Debug.Log("[PickMore] RWF compat Start() finished. PickMorePlugin.Instance=" + (((Object)(object)PickMorePlugin.Instance != (Object)null) ? "ok" : "NULL!"));
		}
		catch (Exception ex)
		{
			Debug.LogError("[PickMore] RWF compat Start() threw: " + ex);
		}
	}

	public override void GUI(GameObject menu)
	{
		Debug.Log("[PickMore] RWF compat GUI() invoked. PickMorePlugin.Instance=" + (((Object)(object)PickMorePlugin.Instance != (Object)null) ? "ok" : "NULL!") + ", menu=" + (((Object)(object)menu != (Object)null) ? "ok" : "NULL"));
		try
		{
			if ((Object)(object)PickMorePlugin.Instance != (Object)null)
			{
				PickMorePlugin.Instance.BuildMenu(menu);
			}
			else
			{
				Debug.LogError("[PickMore] RWF compat: PickMorePlugin.Instance is null - cannot build menu!");
			}
		}
		catch (Exception ex)
		{
			Debug.LogError("[PickMore] RWF compat GUI() threw: " + ex);
		}
	}
}