Decompiled source of PlayableGiants v1.0.0

Mods/PlayableGiants.dll

Decompiled a week ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using HarmonyLib;
using Il2CppCoreNet.Contexts;
using Il2CppCoreNet.Messaging;
using Il2CppCoreNet.Messaging.Messages;
using Il2CppCoreNet.Objects;
using Il2CppCoreNet.Utils;
using Il2CppCostumes;
using Il2CppGB.Game;
using Il2CppGB.Networking.Objects;
using Il2CppGB.Networking.Utils;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem;
using Il2CppSystem.Collections.Generic;
using MelonLoader;
using MelonLoader.Preferences;
using Microsoft.CodeAnalysis;
using PlayableGiants;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: MelonInfo(typeof(Mod), "PlayableGiants", "1.0.0", "TheUltimateNuke", null)]
[assembly: MelonGame("Boneloaf", "Gang Beasts")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("PlayableGiants")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+1efc5729b6079432c97e1c34392632a271d50723")]
[assembly: AssemblyProduct("PlayableGiants")]
[assembly: AssemblyTitle("PlayableGiants")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace PlayableGiants
{
	[HarmonyPatch]
	internal static class InstantiateServerPlayerPatch
	{
		[CompilerGenerated]
		private sealed class <TargetMethods>d__0 : IEnumerable<MethodBase>, IEnumerable, IEnumerator<MethodBase>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private MethodBase <>2__current;

			private int <>l__initialThreadId;

			private IEnumerator<MethodInfo> <>7__wrap1;

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

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

			[DebuggerHidden]
			public <TargetMethods>d__0(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

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

			private bool MoveNext()
			{
				try
				{
					switch (<>1__state)
					{
					default:
						return false;
					case 0:
					{
						<>1__state = -1;
						IEnumerable<MethodInfo> enumerable = from m in typeof(NetUtils).GetMethods(AccessTools.all)
							where m.Name == "InstantiateServerPlayer" && m.IsGenericMethodDefinition
							select m;
						<>7__wrap1 = enumerable.GetEnumerator();
						<>1__state = -3;
						break;
					}
					case 1:
						<>1__state = -3;
						break;
					}
					while (<>7__wrap1.MoveNext())
					{
						MethodInfo current = <>7__wrap1.Current;
						ParameterInfo[] parameters = current.GetParameters();
						if (parameters.Length == 4 && parameters[0].ParameterType.IsGenericParameter && parameters[1].ParameterType == typeof(GameObject) && parameters[2].IsOut && parameters[3].ParameterType == typeof(SpawnParams))
						{
							<>2__current = current.MakeGenericMethod(typeof(NetMember));
							<>1__state = 1;
							return true;
						}
					}
					<>m__Finally1();
					<>7__wrap1 = null;
					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 (<>7__wrap1 != null)
				{
					<>7__wrap1.Dispose();
				}
			}

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

			[DebuggerHidden]
			IEnumerator<MethodBase> IEnumerable<MethodBase>.GetEnumerator()
			{
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					return this;
				}
				return new <TargetMethods>d__0(0);
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<MethodBase>)this).GetEnumerator();
			}
		}

		[IteratorStateMachine(typeof(<TargetMethods>d__0))]
		private static IEnumerable<MethodBase> TargetMethods()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <TargetMethods>d__0(-2);
		}

		private static void Prefix(ref GameObject playerPrefab)
		{
			switch (Mod.EveryoneSpawnsAsType)
			{
			case 1:
				playerPrefab = CostumePool.I.BeastResources.GetData<GameObject>("Big");
				break;
			case 2:
				playerPrefab = CostumePool.I.BeastResources.GetData<GameObject>("Tiny");
				break;
			}
		}
	}
	public class Mod : MelonMod
	{
		private static MelonPreferences_Category _category = MelonPreferences.CreateCategory("PlayableGiants", "PlayableGiants");

		private static MelonPreferences_Entry<bool> _showUi = _category.CreateEntry<bool>("ShowUI", true, "Show UI", "Whether to show the mid-game buttons used to transform.", false, false, (ValueValidator)null, (string)null);

		private static MelonPreferences_Entry<int> _everyoneSpawnsAsType = _category.CreateEntry<int>("EveryoneSpawnsAsType", 0, "Everyone spawns as Type", "Whether to spawn every player as this type all the time. (0 = Normal, 1 = Big, 2 = Tiny", false, false, (ValueValidator)null, (string)null);

		public static Instance Logger => Melon<Mod>.Logger;

		public static bool ShowUI
		{
			get
			{
				return _showUi.Value;
			}
			set
			{
				_showUi.Value = value;
			}
		}

		public static int EveryoneSpawnsAsType
		{
			get
			{
				return _everyoneSpawnsAsType.Value;
			}
			set
			{
				_everyoneSpawnsAsType.Value = value;
			}
		}

		public override void OnInitializeMelon()
		{
			((MelonBase)this).LoggerInstance.Msg(ConsoleColor.Green, "Mod PlayableGiants initialized!");
			NetworkManager.OnNetworkSceneLoaded += Action.op_Implicit((Action)OnNetworkSceneLoaded);
		}

		public override void OnUpdate()
		{
			if (((ButtonControl)Keyboard.current.bKey).wasPressedThisFrame)
			{
				ShowUI = !ShowUI;
			}
		}

		public override void OnGUI()
		{
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)GameManagerNew.Instance) && ShowUI)
			{
				GUILayout.BeginArea(new Rect((float)((Screen.width - 200) / 2), 50f, 200f, 100f));
				GUILayout.BeginVertical((Il2CppReferenceArray<GUILayoutOption>)null);
				if (GUILayout.Button("Bigify Local Players", (Il2CppReferenceArray<GUILayoutOption>)null))
				{
					NetMessenger.SendAsServer((short)1701, (MessageBase)(object)new NetPlayersMessage<NetBeast>
					{
						Players = GBNetUtils.GetBeastsForPlatform(GBNetUtils.GetLocalPlatform()).ToArray()
					}, false);
				}
				if (GUILayout.Button("Revert Local Players", (Il2CppReferenceArray<GUILayoutOption>)null))
				{
					NetMessenger.SendAsServer((short)1703, (MessageBase)(object)new NetPlayersMessage<NetBeast>
					{
						Players = GBNetUtils.GetBeastsForPlatform(GBNetUtils.GetLocalPlatform()).ToArray()
					}, false);
				}
				if (GUILayout.Button("Smallify Local Players", (Il2CppReferenceArray<GUILayoutOption>)null))
				{
					NetMessenger.SendAsServer((short)1702, (MessageBase)(object)new NetPlayersMessage<NetBeast>
					{
						Players = GBNetUtils.GetBeastsForPlatform(GBNetUtils.GetLocalPlatform()).ToArray()
					}, false);
				}
				GUILayout.EndVertical();
				GUILayout.Label("(Toggle UI with B key)", (Il2CppReferenceArray<GUILayoutOption>)null);
				GUILayout.EndArea();
			}
		}

		private void OnNetworkSceneLoaded()
		{
			NetMessenger.RegisterFromServerHandler<NetPlayersMessage<NetBeast>>((short)1701, MessageCallback<NetPlayersMessage<NetBeast>>.op_Implicit((Action<NetPlayersMessage<NetBeast>, NetworkConnection>)OnBigifyMessage));
			NetMessenger.RegisterFromServerHandler<NetPlayersMessage<NetBeast>>((short)1703, MessageCallback<NetPlayersMessage<NetBeast>>.op_Implicit((Action<NetPlayersMessage<NetBeast>, NetworkConnection>)OnRevertifyMessage));
			NetMessenger.RegisterFromServerHandler<NetPlayersMessage<NetBeast>>((short)1702, MessageCallback<NetPlayersMessage<NetBeast>>.op_Implicit((Action<NetPlayersMessage<NetBeast>, NetworkConnection>)OnSmallifyMessage));
		}

		private void OnSmallifyMessage(NetPlayersMessage<NetBeast> message, NetworkConnection conn)
		{
			if (((!NetworkServer.active || NetworkClient.active) && !NetworkServer.localClientActive && !NetMemberContext.LocalHostedGame) || (Object)(object)GameManagerNew.Instance == (Object)null || GameManagerNew.Instance.ActiveGameMode == null)
			{
				return;
			}
			List<NetBeast> val = new List<NetBeast>();
			CoreNetSpawnPosition val2 = default(CoreNetSpawnPosition);
			foreach (NetBeast player in message.Players)
			{
				if ((Object)(object)((Component)GBNetUtils.GetActor(((NetConnectionAssociation)player).ConnectionId)).gameObject != (Object)null)
				{
					Object.Destroy((Object)(object)((Component)GBNetUtils.GetActor(((NetConnectionAssociation)player).ConnectionId)).gameObject);
				}
				NetUtils.RespawnPlayer<NetBeast>(player, CostumePool.I.BeastResources.GetData<GameObject>("Tiny"), ref val2, GameManagerNew.Instance.ActiveGameMode.SetupGameModeSpawnParams(player));
				val.Add(player);
			}
		}

		private void OnRevertifyMessage(NetPlayersMessage<NetBeast> message, NetworkConnection conn)
		{
			if (((!NetworkServer.active || NetworkClient.active) && !NetworkServer.localClientActive && !NetMemberContext.LocalHostedGame) || (Object)(object)GameManagerNew.Instance == (Object)null || GameManagerNew.Instance.ActiveGameMode == null)
			{
				return;
			}
			List<NetBeast> val = new List<NetBeast>();
			CoreNetSpawnPosition val2 = default(CoreNetSpawnPosition);
			foreach (NetBeast player in message.Players)
			{
				if ((Object)(object)((Component)GBNetUtils.GetActor(((NetConnectionAssociation)player).ConnectionId)).gameObject != (Object)null)
				{
					Object.Destroy((Object)(object)((Component)GBNetUtils.GetActor(((NetConnectionAssociation)player).ConnectionId)).gameObject);
				}
				NetUtils.RespawnPlayer<NetBeast>(player, CostumePool.I.BeastResources.GetData<GameObject>("Player"), ref val2, GameManagerNew.Instance.ActiveGameMode.SetupGameModeSpawnParams(player));
				val.Add(player);
			}
		}

		private void OnBigifyMessage(NetPlayersMessage<NetBeast> message, NetworkConnection conn)
		{
			if (((!NetworkServer.active || NetworkClient.active) && !NetworkServer.localClientActive && !NetMemberContext.LocalHostedGame) || (Object)(object)GameManagerNew.Instance == (Object)null || GameManagerNew.Instance.ActiveGameMode == null)
			{
				return;
			}
			List<NetBeast> val = new List<NetBeast>();
			CoreNetSpawnPosition val2 = default(CoreNetSpawnPosition);
			foreach (NetBeast player in message.Players)
			{
				if ((Object)(object)((Component)GBNetUtils.GetActor(((NetConnectionAssociation)player).ConnectionId)).gameObject != (Object)null)
				{
					Object.Destroy((Object)(object)((Component)GBNetUtils.GetActor(((NetConnectionAssociation)player).ConnectionId)).gameObject);
				}
				NetUtils.RespawnPlayer<NetBeast>(player, CostumePool.I.BeastResources.GetData<GameObject>("Big"), ref val2, GameManagerNew.Instance.ActiveGameMode.SetupGameModeSpawnParams(player));
				val.Add(player);
			}
		}
	}
	internal static class MyModInfo
	{
		public const string Author = "TheUltimateNuke";

		public const string Name = "PlayableGiants";

		public const string Version = "1.0.0";
	}
}