Decompiled source of More Park Friends v2.4.2

Mods/MoreParkFriends.dll

Decompiled 4 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using HarmonyLib;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppPhoton.Pun;
using Il2CppRUMBLE.Environment;
using Il2CppRUMBLE.Interactions.InteractionBase;
using Il2CppRUMBLE.Managers;
using Il2CppRUMBLE.Players;
using Il2CppRUMBLE.Social;
using Il2CppRUMBLE.Social.Phone;
using Il2CppRUMBLE.Utilities;
using Il2CppTMPro;
using MelonLoader;
using MelonLoader.Preferences;
using MoreParkFriends;
using RumbleModdingAPI.RMAPI;
using UIFramework;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(Main), "More Park Friends", "2.4.2", "UlvakSkillz", null)]
[assembly: MelonGame("Buckethead Entertainment", "RUMBLE")]
[assembly: MelonColor(255, 195, 0, 255)]
[assembly: MelonAuthorColor(255, 195, 0, 255)]
[assembly: VerifyLoaderVersion(0, 7, 2, true)]
[assembly: MelonAdditionalDependencies(new string[] { "UIFramework" })]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("MoreParkFriends")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+1728fb657132527f96c3bc417ab5c051dd333df3")]
[assembly: AssemblyProduct("MoreParkFriends")]
[assembly: AssemblyTitle("MoreParkFriends")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace MoreParkFriends;

public static class BuildInfo
{
	public const string ModName = "More Park Friends";

	public const string ModVersion = "2.4.2";

	public const string Author = "UlvakSkillz";
}
public class Main : MelonMod
{
	internal static int playerCap = 1;

	internal static int additionsMade = 6;

	private static string currentScene = "Loader";

	public override void OnInitializeMelon()
	{
		Preferences.InitPrefs();
		((ModelModItem)UI.Register((MelonBase)(object)this, (MelonPreferences_Category[])(object)new MelonPreferences_Category[1] { Preferences.MoreParkFriendsCategory })).OnModSaved += Save;
	}

	public override void OnSceneWasLoaded(int buildIndex, string sceneName)
	{
		currentScene = sceneName;
		additionsMade = 6;
		if (currentScene == "Gym")
		{
			UpdateGymText();
		}
	}

	private void Save()
	{
		if (Preferences.IsPrefChanged((MelonPreferences_Entry)(object)Preferences.PrefMultiplier) && currentScene == "Gym")
		{
			UpdateGymText();
		}
		if (Preferences.IsPrefChanged((MelonPreferences_Entry)(object)Preferences.PrefShowExpandedPlayers) && currentScene == "Park")
		{
			ScaleBoard(null, Singleton<PlayerManager>.instance.AllPlayers.Count);
		}
		Preferences.StoreLastSavedPrefs();
	}

	private static void UpdateGymText()
	{
		GameObject gameObject = TextandIcons.GetGameObject();
		for (int i = 1; i <= 5; i++)
		{
			((TMP_Text)((Component)gameObject.transform.GetChild(i)).GetComponent<TextMeshPro>()).text = ((1 + i) * Preferences.PrefMultiplier.Value).ToString();
		}
	}

	internal static void UpdateParkBoardPlayerTags(ParkBoardParkVariant __instance)
	{
		//IL_0145: Unknown result type (might be due to invalid IL or missing references)
		//IL_0150: Expected O, but got Unknown
		//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b3: Expected O, but got Unknown
		float num = Singleton<PlayerManager>.instance.AllPlayers.Count;
		if ((Object)(object)__instance == (Object)null)
		{
			try
			{
				__instance = ParkboardPark.GetGameObject().GetComponent<ParkBoardParkVariant>();
			}
			catch
			{
				return;
			}
			if ((Object)(object)__instance == (Object)null)
			{
				return;
			}
		}
		for (int i = 6; i < playerCap; i++)
		{
			if ((float)i < num)
			{
				GeneralData generalData = Singleton<PlayerManager>.instance.AllPlayers[i].Data.GeneralData;
				PlayerTag obj2 = ((Il2CppArrayBase<PlayerTag>)(object)__instance.parkBoardPlayerTags)[i];
				if (obj2 != null)
				{
					obj2.Initialize(new UserData(generalData.PlayFabMasterId, generalData.PlayFabTitleId, generalData.PublicUsername, generalData.BattlePoints), false);
				}
				GameObject obj3 = ((Il2CppArrayBase<GameObject>)(object)__instance.hostIcons)[i];
				if (obj3 != null)
				{
					((Component)obj3.transform.parent.GetChild(1)).gameObject.SetActive(Preferences.PrefShowExpandedPlayers.Value && PhotonNetwork.IsMasterClient);
				}
				PlayerTag obj4 = ((Il2CppArrayBase<PlayerTag>)(object)__instance.parkBoardPlayerTags)[i];
				if (obj4 != null)
				{
					((Component)obj4).gameObject.SetActive(Preferences.PrefShowExpandedPlayers.Value);
				}
				continue;
			}
			PlayerTag obj5 = ((Il2CppArrayBase<PlayerTag>)(object)__instance.parkBoardPlayerTags)[i];
			if (obj5 != null)
			{
				obj5.Initialize(new UserData("", "", "Name", 0), false);
			}
			GameObject obj6 = ((Il2CppArrayBase<GameObject>)(object)__instance.hostIcons)[i];
			if (obj6 != null)
			{
				((Component)obj6.transform.parent.GetChild(0)).gameObject.SetActive(false);
			}
			GameObject obj7 = ((Il2CppArrayBase<GameObject>)(object)__instance.hostIcons)[i];
			if (obj7 != null)
			{
				((Component)obj7.transform.parent.GetChild(1)).gameObject.SetActive(false);
			}
			PlayerTag obj8 = ((Il2CppArrayBase<PlayerTag>)(object)__instance.parkBoardPlayerTags)[i];
			if (obj8 != null)
			{
				((Component)obj8).gameObject.SetActive(false);
			}
		}
		ScaleBoard(__instance, Singleton<PlayerManager>.instance.AllPlayers.Count);
	}

	private static void ScaleBoard(ParkBoardParkVariant __instance, float playerCount)
	{
		//IL_0150: Unknown result type (might be due to invalid IL or missing references)
		//IL_0176: Unknown result type (might be due to invalid IL or missing references)
		//IL_0197: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0123: Unknown result type (might be due to invalid IL or missing references)
		if (Preferences.PrefShowExpandedPlayers.Value)
		{
			float num = 11f / 30f * (float)Math.Sqrt(Math.Max(0f, playerCount - 6f) / 12f);
			Melon<Main>.Logger.Msg("Clamped: " + num);
			((Il2CppArrayBase<GameObject>)(object)__instance.hostIcons)[0].transform.parent.parent.localPosition = new Vector3(0f, num, 0f);
			((Il2CppArrayBase<GameObject>)(object)__instance.hostIcons)[0].transform.parent.parent.localScale = new Vector3(1f, Math.Min(1f, 6f / playerCount), 1f);
			((Component)((Il2CppArrayBase<PlayerTag>)(object)__instance.parkBoardPlayerTags)[0]).transform.parent.localPosition = new Vector3(0f, num, 0f);
			((Component)((Il2CppArrayBase<PlayerTag>)(object)__instance.parkBoardPlayerTags)[0]).transform.parent.localScale = new Vector3(1f, Math.Min(1f, 6f / playerCount), 1f);
		}
		else
		{
			((Il2CppArrayBase<GameObject>)(object)__instance.hostIcons)[0].transform.parent.parent.localPosition = Vector3.zero;
			((Il2CppArrayBase<GameObject>)(object)__instance.hostIcons)[0].transform.parent.parent.localScale = Vector3.one;
			((Component)((Il2CppArrayBase<PlayerTag>)(object)__instance.parkBoardPlayerTags)[0]).transform.parent.localPosition = Vector3.zero;
			((Component)((Il2CppArrayBase<PlayerTag>)(object)__instance.parkBoardPlayerTags)[0]).transform.parent.localScale = Vector3.one;
		}
	}
}
[HarmonyPatch(typeof(ParkBoardGymVariant), "OnPlayerEnteredTrigger", new Type[] { })]
public static class OnPlayerEnteredTriggerPatch
{
	private static void Prefix(ref ParkBoardGymVariant __instance)
	{
		ParkBoardGymVariant obj = __instance;
		obj.hostPlayerCapacity *= Preferences.PrefMultiplier.Value;
	}
}
[HarmonyPatch(typeof(ParkBoardParkVariant), "UpdatePlayerList", new Type[] { })]
public static class UpdatePlayerListPatch
{
	private static void Postfix(ref ParkBoardParkVariant __instance)
	{
		Main.UpdateParkBoardPlayerTags(__instance);
	}
}
[HarmonyPatch(typeof(ParkBoardParkVariant), "Initialize", new Type[] { typeof(ParkBoard) })]
public static class InitializePatch
{
	private static void Postfix(ref ParkBoardParkVariant __instance, ParkBoard owner)
	{
		//IL_0107: Unknown result type (might be due to invalid IL or missing references)
		//IL_0119: Unknown result type (might be due to invalid IL or missing references)
		//IL_0141: Unknown result type (might be due to invalid IL or missing references)
		//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_0213: Unknown result type (might be due to invalid IL or missing references)
		//IL_0239: Unknown result type (might be due to invalid IL or missing references)
		//IL_0244: Expected O, but got Unknown
		List<GameObject> list = ListConverter(Il2CppArrayBase<GameObject>.op_Implicit((Il2CppArrayBase<GameObject>)(object)__instance.hostIcons));
		List<InteractionButton> list2 = ListConverter(Il2CppArrayBase<InteractionButton>.op_Implicit((Il2CppArrayBase<InteractionButton>)(object)__instance.kickButtons));
		List<PlayerTag> list3 = ListConverter(Il2CppArrayBase<PlayerTag>.op_Implicit((Il2CppArrayBase<PlayerTag>)(object)__instance.parkBoardPlayerTags));
		int num = Main.additionsMade;
		float num2 = -1.1f;
		float num3 = -0.649f;
		float num4 = -0.18f;
		Main.playerCap = int.Parse(((TMP_Text)__instance.currentParkPlayerCapText).text.Split('/')[1]);
		while (num < Main.playerCap)
		{
			GameObject val = Object.Instantiate<GameObject>(((Component)list[0].transform.parent).gameObject);
			((Object)val).name = $"Addition ({num})";
			val.transform.SetParent(list[0].transform.parent.parent);
			val.transform.localPosition = new Vector3(0f, num2, 0f);
			val.transform.localRotation = Quaternion.identity;
			val.transform.localScale = ((Component)list[0].transform.parent).transform.localScale;
			GameObject val2 = Object.Instantiate<GameObject>(((Component)((Il2CppArrayBase<PlayerTag>)(object)__instance.parkBoardPlayerTags)[0]).gameObject);
			((Object)val2).name = $"Player Tag 2.0 ({num})";
			val2.transform.SetParent(((Component)((Il2CppArrayBase<PlayerTag>)(object)__instance.parkBoardPlayerTags)[0]).gameObject.transform.parent);
			val2.transform.localPosition = new Vector3(-0.06f, num3, -0.053f);
			val2.transform.localRotation = Quaternion.identity;
			val2.transform.localScale = ((Component)((Il2CppArrayBase<PlayerTag>)(object)__instance.parkBoardPlayerTags)[0]).transform.localScale;
			PlayerTag component = val2.GetComponent<PlayerTag>();
			component.Initialize(new UserData("", "", "Name", 0), false);
			list.Add(((Component)val.transform.GetChild(0)).gameObject);
			list2.Add(((Component)val.transform.GetChild(1)).GetComponent<InteractionButton>());
			list3.Add(component);
			num++;
			num2 += num4;
			num3 += num4;
		}
		__instance.hostIcons = Il2CppReferenceArray<GameObject>.op_Implicit(ListConverter(list));
		__instance.kickButtons = Il2CppReferenceArray<InteractionButton>.op_Implicit(ListConverter(list2));
		__instance.parkBoardPlayerTags = Il2CppReferenceArray<PlayerTag>.op_Implicit(ListConverter(list3));
		Main.UpdateParkBoardPlayerTags(__instance);
	}

	private static List<T> ListConverter<T>(T[] list)
	{
		List<T> list2 = new List<T>();
		foreach (T item in list)
		{
			list2.Add(item);
		}
		return list2;
	}

	private static T[] ListConverter<T>(List<T> list)
	{
		T[] array = new T[list.Count];
		for (int i = 0; i < list.Count; i++)
		{
			array[i] = list[i];
		}
		return array;
	}
}
public class Preferences
{
	private const string CONFIG_FILE = "config.cfg";

	private const string USER_DATA = "UserData/MoreParkFriends/";

	internal static Dictionary<MelonPreferences_Entry, object> LastSavedValues = new Dictionary<MelonPreferences_Entry, object>();

	internal static MelonPreferences_Category MoreParkFriendsCategory;

	internal static MelonPreferences_Entry<int> PrefMultiplier;

	internal static MelonPreferences_Entry<bool> PrefShowExpandedPlayers;

	internal static void InitPrefs()
	{
		if (!Directory.Exists("UserData/MoreParkFriends/"))
		{
			Directory.CreateDirectory("UserData/MoreParkFriends/");
		}
		MoreParkFriendsCategory = MelonPreferences.CreateCategory("MoreParkFriends", "Settings");
		MoreParkFriendsCategory.SetFilePath(Path.Combine("UserData/MoreParkFriends/", "config.cfg"));
		PrefMultiplier = MoreParkFriendsCategory.CreateEntry<int>("Multiplier", 2, "Multiplier", "Changes the Park Board Player Count Values to Default*Multiplier (Limit: 1-3)", false, false, (ValueValidator)(object)new ValueRange<int>(1, 3), (string)null);
		PrefShowExpandedPlayers = MoreParkFriendsCategory.CreateEntry<bool>("ShowExpandedPlayers", true, "Show Expanded Players", "Scales the Player Tags on the Park Board to Show Every Player in the Park", false, false, (ValueValidator)null, (string)null);
		StoreLastSavedPrefs();
	}

	internal static void StoreLastSavedPrefs()
	{
		List<MelonPreferences_Entry> list = new List<MelonPreferences_Entry>();
		list.AddRange(MoreParkFriendsCategory.Entries);
		foreach (MelonPreferences_Entry item in list)
		{
			LastSavedValues[item] = item.BoxedValue;
		}
	}

	public static bool AnyPrefsChanged()
	{
		foreach (KeyValuePair<MelonPreferences_Entry, object> lastSavedValue in LastSavedValues)
		{
			if (!lastSavedValue.Key.BoxedValue.Equals(lastSavedValue.Value))
			{
				return true;
			}
		}
		return false;
	}

	public static bool IsPrefChanged(MelonPreferences_Entry entry)
	{
		if (LastSavedValues.TryGetValue(entry, out var value))
		{
			return !entry.BoxedValue.Equals(value);
		}
		return false;
	}
}