Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of RandomCharacterSelection v1.5.0
plugins/RandomCharacterSelection/RandomCharacterSelection.dll
Decompiled 2 years agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using InLobbyConfig; using InLobbyConfig.Fields; using On.RoR2.UI; using RoR2; using RoR2.UI; using RoR2.UI.SkinControllers; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] namespace RandomCharacterSelection; public static class AssetBundleHelper { public static AssetBundle MainAssetBundle { get; private set; } internal static void LoadAssetBundle() { MainAssetBundle = AssetBundle.LoadFromFile(GetBundlePath("kingenderbrine_randomcharacterselection")); } private static string GetBundlePath(string bundleName) { return Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)RandomCharacterSelectionPlugin.Instance).Info.Location), bundleName); } } public static class ConfigHelper { public static ConfigEntry<bool> CanSelectSameCharacter { get; private set; } public static void InitConfig(ConfigFile config) { CanSelectSameCharacter = config.Bind<bool>("Main", "CanSelectSameCharacter", false, (ConfigDescription)null); if (RandomCharacterSelectionPlugin.InLobbyConfigLoaded) { InitInLobbyConfig(config); } } [MethodImpl(MethodImplOptions.NoInlining)] private static void InitInLobbyConfig(ConfigFile config) { ModConfigCatalog.Add(ConfigFieldUtilities.CreateFromBepInExConfigFile(config, "Random Character Selection")); } } public class DelayedInputHGGamepadInputEvent : HGGamepadInputEvent { public void Update() { bool flag = ((HGGamepadInputEvent)this).CanAcceptInput(); if (base.couldAcceptInput != flag) { GameObject[] enabledObjectsIfActive = base.enabledObjectsIfActive; for (int i = 0; i < enabledObjectsIfActive.Length; i++) { enabledObjectsIfActive[i].SetActive(flag); } } if (base.couldAcceptInput && flag && ((HGGamepadInputEvent)this).eventSystem.player.GetButtonDown(base.actionName)) { base.actionEvent.Invoke(); } base.couldAcceptInput = flag; } } public class EventHolder : MonoBehaviour { public string customName; public UnityEvent unityEvent; } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.KingEnderBrine.RandomCharacterSelection", "Random Character Selection", "1.5.0")] public class RandomCharacterSelectionPlugin : BaseUnityPlugin { internal static RandomCharacterSelectionPlugin Instance { get; private set; } internal static ManualLogSource InstanceLogger { get { RandomCharacterSelectionPlugin instance = Instance; if (instance == null) { return null; } return ((BaseUnityPlugin)instance).Logger; } } internal static bool InLobbyConfigLoaded { get; private set; } private void Start() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown Instance = this; InLobbyConfigLoaded = Chainloader.PluginInfos.ContainsKey("com.KingEnderBrine.InLobbyConfig"); AssetBundleHelper.LoadAssetBundle(); ConfigHelper.InitConfig(((BaseUnityPlugin)this).Config); CharacterSelectController.Awake += new hook_Awake(RandomizePanelController.CharacterSelectControllerAwake); } } public class RandomizePanelController : MonoBehaviour { public GameObject randomizeCharacterButton; public GameObject randomizeLoadoutButton; private CharacterSelectController characterSelectController; private CharacterSelectBarController characterSelectBarController; public static GameObject CachedPrefab { get; private set; } private bool isEclipseRun { get { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)PreGameController.instance)) { return PreGameController.instance.gameModeIndex == GameModeCatalog.FindGameModeIndex("EclipseRun"); } return false; } } public void Start() { characterSelectController = ((Component)this).GetComponentInParent<CharacterSelectController>(); characterSelectBarController = ((Component)characterSelectController).GetComponentInChildren<CharacterSelectBarController>(); } public void RandomizeCharacter() { //IL_0032: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)PreGameController.instance) && PreGameController.instance.IsCharacterSwitchingCurrentlyAllowed() && Object.op_Implicit((Object)(object)characterSelectController)) { LocalUser localUser = ((MPEventSystem)EventSystem.current).localUser; SurvivorDef currentSurvivor = characterSelectController.currentSurvivorDef; bool canSelectSameCharacter = ConfigHelper.CanSelectSameCharacter.Value; IEnumerable<SurvivorDef> source = SurvivorCatalog.orderedSurvivorDefs.Where((SurvivorDef survivorDef) => (canSelectSameCharacter || (Object)(object)currentSurvivor != (Object)(object)survivorDef) && !survivorDef.hidden && SurvivorCatalog.SurvivorIsUnlockedOnThisClient(survivorDef.survivorIndex) && survivorDef.CheckRequiredExpansionEnabled((NetworkUser)null) && survivorDef.CheckUserHasRequiredEntitlement(localUser)); SurvivorDef val = source.ElementAt(Random.Range(0, source.Count())); if (Object.op_Implicit((Object)(object)characterSelectController)) { characterSelectBarController.PickIconBySurvivorDef(val); characterSelectController.SetSurvivorInfoPanelActive(true); } } } public void RandomizeLoadout() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)PreGameController.instance) || !Object.op_Implicit((Object)(object)characterSelectController)) { return; } BodyIndex bodyIndexFromSurvivorIndex = SurvivorCatalog.GetBodyIndexFromSurvivorIndex(characterSelectController.currentSurvivorDef.survivorIndex); GenericSkill[] bodyPrefabSkillSlots = BodyCatalog.GetBodyPrefabSkillSlots(bodyIndexFromSurvivorIndex); SkinDef[] bodySkins = BodyCatalog.GetBodySkins(bodyIndexFromSurvivorIndex); LocalUser localUser = ((MPEventSystem)EventSystem.current).localUser; Loadout val = new Loadout(); localUser.userProfile.CopyLoadout(val); for (int i = 0; i < bodyPrefabSkillSlots.Length; i++) { GenericSkill val2 = bodyPrefabSkillSlots[i]; List<uint> list = new List<uint>(); for (uint num = 0u; num < val2.skillFamily.variants.Length; num++) { if (localUser.userProfile.HasUnlockable(val2.skillFamily.variants[num].unlockableDef)) { list.Add(num); } } val.bodyLoadoutManager.SetSkillVariant(bodyIndexFromSurvivorIndex, i, list[Random.Range(0, list.Count)]); } List<uint> list2 = new List<uint>(); for (uint num2 = 0u; num2 < bodySkins.Length; num2++) { if (localUser.userProfile.HasUnlockable(bodySkins[num2].unlockableDef)) { list2.Add(num2); } } val.bodyLoadoutManager.SetSkinIndex(bodyIndexFromSurvivorIndex, list2[Random.Range(0, list2.Count)]); localUser.userProfile.SetLoadout(val); } internal static void CharacterSelectControllerAwake(orig_Awake orig, CharacterSelectController self) { orig.Invoke(self); ((MonoBehaviour)self).StartCoroutine(RandomizePanel(self)); } private static IEnumerator RandomizePanel(CharacterSelectController self) { yield return (object)new WaitForFixedUpdate(); yield return (object)new WaitForFixedUpdate(); Transform val = ((Component)self).transform.Find("SafeArea/LeftHandPanel (Layer: Main)"); if (!Object.op_Implicit((Object)(object)CachedPrefab)) { CachePrefabFromSurvivorGrid(val, "SurvivorChoiceGrid, Panel"); } GameObject val2 = Object.Instantiate<GameObject>(CachedPrefab, ((Component)self).transform.Find("SafeArea"), false); HGGamepadInputEvent[] components = ((Component)self).GetComponents<HGGamepadInputEvent>(); HGGamepadInputEvent val3; HGGamepadInputEvent val4; if (RandomCharacterSelectionPlugin.InLobbyConfigLoaded) { IEnumerable<HGGamepadInputEvent> source = components.Where((HGGamepadInputEvent el) => el.actionName == "UIPageRight"); val3 = source.ElementAt(0); val4 = source.ElementAt(1); } else { val3 = components.First((HGGamepadInputEvent el) => el.actionName == "UIPageRight"); val3.requiredTopLayer = ((Component)val).GetComponent<UILayerKey>(); val4 = ((Component)self).gameObject.AddComponent<HGGamepadInputEvent>(); val4.actionName = val3.actionName; val4.actionEvent = val3.actionEvent; val4.requiredTopLayer = ((Component)val.Find("SurvivorInfoPanel, Active (Layer: Secondary)")).GetComponent<UILayerKey>(); val4.enabledObjectsIfActive = Array.Empty<GameObject>(); } HGGamepadInputEvent val5 = val2.GetComponents<HGGamepadInputEvent>().First((HGGamepadInputEvent input) => input.actionName == "UIPageRight"); DelayedInputHGGamepadInputEvent delayedInputHGGamepadInputEvent = ((Component)self).gameObject.AddComponent<DelayedInputHGGamepadInputEvent>(); ((HGGamepadInputEvent)delayedInputHGGamepadInputEvent).actionName = "UIPageLeft"; ((HGGamepadInputEvent)delayedInputHGGamepadInputEvent).actionEvent = val2.GetComponent<EventHolder>().unityEvent; ((HGGamepadInputEvent)delayedInputHGGamepadInputEvent).requiredTopLayer = val3.requiredTopLayer; ((HGGamepadInputEvent)delayedInputHGGamepadInputEvent).enabledObjectsIfActive = Array.Empty<GameObject>(); DelayedInputHGGamepadInputEvent delayedInputHGGamepadInputEvent2 = ((Component)self).gameObject.AddComponent<DelayedInputHGGamepadInputEvent>(); ((HGGamepadInputEvent)delayedInputHGGamepadInputEvent2).actionName = ((HGGamepadInputEvent)delayedInputHGGamepadInputEvent).actionName; ((HGGamepadInputEvent)delayedInputHGGamepadInputEvent2).actionEvent = ((HGGamepadInputEvent)delayedInputHGGamepadInputEvent).actionEvent; ((HGGamepadInputEvent)delayedInputHGGamepadInputEvent2).requiredTopLayer = val4.requiredTopLayer; ((HGGamepadInputEvent)delayedInputHGGamepadInputEvent2).enabledObjectsIfActive = Array.Empty<GameObject>(); HGGamepadInputEvent obj = val2.AddComponent<HGGamepadInputEvent>(); obj.actionName = "UICancel"; obj.actionEvent = val5.actionEvent; obj.requiredTopLayer = val5.requiredTopLayer; obj.enabledObjectsIfActive = val5.enabledObjectsIfActive; } private static void CachePrefabFromSurvivorGrid(Transform panel, string survivorGridName) { //IL_009d: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)CachedPrefab)) { Transform obj = panel.Find(survivorGridName); CachedPrefab = AssetBundleHelper.MainAssetBundle.LoadAsset<GameObject>("Assets/Resources/RandomizePanel.prefab"); CachedPrefab.GetComponent<Image>().sprite = ((Component)panel.Find("BorderImage")).GetComponent<Image>().sprite; Sprite sprite = ((Component)obj.Find("SurvivorIconPrefab/BaseOutline")).GetComponent<Image>().sprite; Sprite sprite2 = ((Component)obj.Find("SurvivorIconPrefab/HoverOutline")).GetComponent<Image>().sprite; UISkinData val = Object.Instantiate<UISkinData>(((BaseSkinController)((Component)obj.Find("WIPClassButtonPrefab")).GetComponent<ButtonSkinController>()).skinData); ((ColorBlock)(ref val.buttonStyle.colors)).normalColor = Color.white; HGButton[] componentsInChildren = CachedPrefab.GetComponentsInChildren<HGButton>(); foreach (HGButton obj2 in componentsInChildren) { ((BaseSkinController)((Component)obj2).GetComponent<ButtonSkinController>()).skinData = val; ((Component)((Component)obj2).transform.Find("BaseOutline")).GetComponent<Image>().sprite = sprite; ((Component)((Component)obj2).transform.Find("HoverOutline")).GetComponent<Image>().sprite = sprite2; } } } }