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";
}
}