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 playerList = new List(); internal static MelonPreferences_Entry playerDropdown; public static void InitPrefs() { playerTarget = MelonPreferences.CreateCategory("Selection", "Park Host Switcher"); playerDropdown = playerTarget.CreateEntry("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>)(object)playerDropdown.OnEntryValueChanged).Subscribe((LemonAction)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 allPlayers = Singleton.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.instance; ddolButton = Create.NewButton(); ddolButton.SetActive(false); Object.DontDestroyOnLoad((Object)(object)ddolButton); List players = Singleton.instance.AllPlayers; switchHostButton = Object.Instantiate(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().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 players = Singleton.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.instance.AllPlayers[PHSPreferences.playerDropdown.Value].Controller).gameObject.GetComponent().Owner); yield return (object)new WaitForSeconds(0.2f); resetPark(); } } public void resetPark() { PhotonView component = ((Component)ParkInstance.instance).gameObject.GetComponent(); component.RPC("RPC_CleanScene", (RpcTarget)0, (Il2CppReferenceArray)null); } } [HarmonyPatch(typeof(ParkInstance), "OnMasterClientSwitched")] public class Patch { public static bool Prefix() { return false; } } }