Decompiled source of Park Host Switcher v1.0.0

Mods/Park_Host_Switcher.dll

Decompiled 5 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using HarmonyLib;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppPhoton.Pun;
using Il2CppPhoton.Realtime;
using Il2CppRUMBLE.Environment;
using Il2CppRUMBLE.Interactions.InteractionBase;
using Il2CppRUMBLE.Managers;
using Il2CppRUMBLE.Players;
using Il2CppRUMBLE.Utilities;
using Il2CppSystem;
using Il2CppSystem.Collections.Generic;
using MelonLoader;
using MelonLoader.Preferences;
using Microsoft.CodeAnalysis;
using Park_Host_Switcher;
using RumbleModdingAPI.RMAPI;
using UIFramework;
using UIFramework.UiExtensions;
using UnityEngine;
using UnityEngine.Events;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(Core), "Park_Host_Switcher", "1.0.24", "OmniGooberPB", null)]
[assembly: MelonAdditionalDependencies(new string[] { "UIFramework", "RUMBLEModdingAPI" })]
[assembly: MelonGame("Buckethead Entertainment", "RUMBLE")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("Park_Host_Switcher")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("Park_Host_Switcher")]
[assembly: AssemblyTitle("Park_Host_Switcher")]
[assembly: NeutralResourcesLanguage("en-US")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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 Park_Host_Switcher
{
	public class PHSPreferences
	{
		internal static MelonPreferences_Category playerTarget;

		private static List<DropdownItem> playerList = new List<DropdownItem>();

		internal static MelonPreferences_Entry<int> playerDropdown;

		public static void InitPrefs()
		{
			playerTarget = MelonPreferences.CreateCategory("Selection", "Park Host Switcher");
			playerDropdown = playerTarget.CreateEntry<int>("Player Dropdown", 0, "Player Dropdown", "Dynamic Player Selection. Allows you to choose who to change Host with.", false, false, (ValueValidator)(object)Core.DropdownDescriptor.WithDropdownItemList(playerList));
			((MelonEventBase<LemonAction<int, int>>)(object)playerDropdown.OnEntryValueChanged).Subscribe((LemonAction<int, int>)Core.ItemSelectionChanged, 0, false);
		}
	}
	public class Core : MelonMod
	{
		private GameObject ddolButton;

		private GameObject switchHostButton;

		private SceneManager sceneManager;

		private bool isSwitching = false;

		public static DynamicDropdownDescriptor DropdownDescriptor = new DynamicDropdownDescriptor();

		internal static string SettingsToString()
		{
			return "playerIndex = " + DropdownDescriptor.GetDropdownItems()[PHSPreferences.playerDropdown.Value].DisplayName;
		}

		public override void OnInitializeMelon()
		{
			((MelonBase)this).LoggerInstance.Msg("Initialized.");
			PHSPreferences.InitPrefs();
			UI.RegisterMelon((MelonBase)(object)this, (MelonPreferences_Category[])(object)new MelonPreferences_Category[1] { PHSPreferences.playerTarget });
			Actions.onMapInitialized += ButtonSpawner;
			Actions.onPlayerSpawned += addPlayers;
		}

		internal static void ItemSelectionChanged(int old, int neew)
		{
			Debug.Log(Object.op_Implicit($"Selected Item: {neew}"));
			PHSPreferences.playerDropdown.Value = neew;
		}

		public void addPlayers(Player player)
		{
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Expected O, but got Unknown
			List<Player> allPlayers = Singleton<PlayerManager>.instance.AllPlayers;
			DropdownDescriptor.GetDropdownItems().Clear();
			for (int i = 0; i < allPlayers.Count; i++)
			{
				string publicUsername = allPlayers[i].Data.GeneralData.PublicUsername;
				int count = DropdownDescriptor.GetDropdownItems().Count;
				DropdownDescriptor.AddDropdownItem(new DropdownItem(publicUsername, (object)count));
			}
		}

		public void ButtonSpawner(string mapName)
		{
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			if (mapName != "Park" && PhotonNetwork.CurrentRoom.IsVisible)
			{
				return;
			}
			((MelonBase)this).LoggerInstance.Msg(PhotonNetwork.CurrentRoom.Name);
			sceneManager = Singleton<SceneManager>.instance;
			ddolButton = Create.NewButton();
			ddolButton.SetActive(false);
			Object.DontDestroyOnLoad((Object)(object)ddolButton);
			List<Player> players = Singleton<PlayerManager>.instance.AllPlayers;
			switchHostButton = Object.Instantiate<GameObject>(ddolButton);
			((Object)switchHostButton).name = "Host Switch Button";
			switchHostButton.transform.position = new Vector3(-23.1f, -1.6982f, -15.8728f);
			switchHostButton.transform.rotation = Quaternion.Euler(-0f, 26.5004f, 90f);
			switchHostButton.SetActive(true);
			((Component)switchHostButton.transform.GetChild(0)).gameObject.GetComponent<InteractionButton>().onPressed.AddListener(UnityAction.op_Implicit((Action)delegate
			{
				if (PhotonNetwork.IsMasterClient)
				{
					((MelonBase)this).LoggerInstance.Msg("Switching host to " + players[PHSPreferences.playerDropdown.Value].Data.GeneralData.PublicUsername);
					MelonCoroutines.Start(SwitchHost(PHSPreferences.playerDropdown.Value));
					isSwitching = false;
				}
				else
				{
					((MelonBase)this).LoggerInstance.Msg("You are not the host, you cannot switch hosts.");
				}
			}));
			((MelonBase)this).LoggerInstance.Msg("Host Button Created");
		}

		public IEnumerator SwitchHost(int playerIndex)
		{
			if (!isSwitching)
			{
				isSwitching = true;
				List<Player> players = Singleton<PlayerManager>.instance.AllPlayers;
				((RoomInfo)PhotonNetwork.CurrentRoom).name = players[PHSPreferences.playerDropdown.Value].Data.GeneralData.PlayFabMasterId + "|" + players[PHSPreferences.playerDropdown.Value].Data.GeneralData.PublicUsername + "|Anything Goes";
				PhotonNetwork.SetMasterClient(((Component)Singleton<PlayerManager>.instance.AllPlayers[PHSPreferences.playerDropdown.Value].Controller).gameObject.GetComponent<PhotonView>().Owner);
				yield return (object)new WaitForSeconds(0.2f);
				resetPark();
			}
		}

		public void resetPark()
		{
			PhotonView component = ((Component)ParkInstance.instance).gameObject.GetComponent<PhotonView>();
			component.RPC("RPC_CleanScene", (RpcTarget)0, (Il2CppReferenceArray<Object>)null);
		}
	}
	[HarmonyPatch(typeof(ParkInstance), "OnMasterClientSwitched")]
	public class Patch
	{
		public static bool Prefix()
		{
			return false;
		}
	}
}