using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("RandomStartWK")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("RandomStartWK Description")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+99b52f50818a91cbfe0b7eab0b4650a046a411ae")] [assembly: AssemblyProduct("RandomStartWK")] [assembly: AssemblyTitle("RandomStartWK")] [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 RandomStartWK { [BepInPlugin("Slayer6409.RandomStartWK", "RandomStartWK", "0.0.2")] public class Plugin : BaseUnityPlugin { public static ManualLogSource Log; private readonly Harmony harmony = new Harmony("Slayer6409.RandomStartWK"); public static ConfigFile BepInExConfig; public static ConfigEntry minTrinketsGiven; public static ConfigEntry maxTrinketsGiven; public static ConfigEntry trinketAsJustPerk; public static ConfigEntry perksOutnumberBindings; public static ConfigEntry minBindingsGiven; public static ConfigEntry maxBindingsGiven; public static Dictionary> enabledTrinkets = new Dictionary>(); public static Dictionary> enabledBindings = new Dictionary>(); private void Awake() { Log = ((BaseUnityPlugin)this).Logger; BepInExConfig = ((BaseUnityPlugin)this).Config; doNormalConfig(); harmony.PatchAll(); Log.LogInfo((object)"Plugin RandomStartWK is loaded!"); } public void doNormalConfig() { minTrinketsGiven = BepInExConfig.Bind("Trinkets", "MinTrinkets", 0, "The minimum amount of trinkets"); maxTrinketsGiven = BepInExConfig.Bind("Trinkets", "MaxTrinkets", 3, "The maximum amount of trinkets"); trinketAsJustPerk = BepInExConfig.Bind("Trinkets", "JustPerk", false, "Makes the trinkets it gives you just the perk and not the item"); perksOutnumberBindings = BepInExConfig.Bind("Trinkets", "Trinket binding Rule", true, "Limits random trinkets using the normal starting rule: 1 trinket is free, and each binding allows 1 additional trinket."); minBindingsGiven = BepInExConfig.Bind("Bindings", "MinBindings", 0, "The minimum amount of Bindings"); maxBindingsGiven = BepInExConfig.Bind("Bindings", "MaxBindings", 3, "The maximum amount of Bindings"); } } public class RandomStartGamemode : GamemodeSetting { public RandomStartGamemode() { //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) base.id = "RandomStart"; base.title = "Random Start"; base.description = "Randmizes perks and bindings"; base.color = Color.magenta; base.exclusiveSettings = new List { "competetive" }; base.nameAppend = ""; base.leaderboardAppendID = ""; base.allowDownstream = false; base.downstreamId = ""; } public void Initialize() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) base.id = "RandomStart"; base.title = "Random Start"; base.description = "Randomizes perks and bindings"; base.color = Color.magenta; base.exclusiveSettings = new List { "competetive" }; base.nameAppend = ""; base.leaderboardAppendID = ""; base.allowDownstream = false; base.downstreamId = ""; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "RandomStartWK"; public const string PLUGIN_NAME = "RandomStartWK"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace RandomStartWK.Patches { [HarmonyPatch(typeof(CL_GameManager), "Start")] internal static class GameManagerStartPatch { private static bool configSetup; private static void Postfix(CL_GameManager __instance) { M_Gamemode baseGamemode = CL_GameManager.GetBaseGamemode(); doConfigStuff(); if (!((Object)(object)baseGamemode == (Object)null) && baseGamemode.HasActiveSetting("RandomStart") && !CL_SaveManager.IsInSavedRun()) { doStartStuff(); } } public static void doConfigStuff() { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Invalid comparison between Unknown and I4 //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Invalid comparison between Unknown and I4 //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Invalid comparison between Unknown and I4 if (configSetup) { return; } foreach (Perk perkAsset in CL_AssetManager.GetFullCombinedAssetDatabase().perkAssets) { if ((Object)(object)perkAsset == (Object)null) { continue; } PerkType perkType = perkAsset.perkType; if (perkType - 8 <= 1) { ConfigEntry value = Plugin.BepInExConfig.Bind(((int)perkAsset.perkType == 9) ? "Bindings" : "Trinkets", perkAsset.id, true, $"If the {perkAsset.perkType}: {perkAsset.title} should be in the random pool"); if ((int)perkAsset.perkType == 8) { Plugin.enabledTrinkets.Add(perkAsset, value); } else { Plugin.enabledBindings.Add(perkAsset, value); } } } configSetup = true; Plugin.BepInExConfig.Save(); } private static void doStartStuff() { ENT_Player player = ENT_Player.GetPlayer(); Inventory inventory = ENT_Player.GetInventory(); if (!((Object)(object)inventory == (Object)null) && !((Object)(object)player == (Object)null)) { int num = Random.Range(Plugin.minTrinketsGiven.Value, Plugin.maxTrinketsGiven.Value + 1); int num2 = Random.Range(Plugin.minBindingsGiven.Value, Plugin.maxBindingsGiven.Value + 1); if (Plugin.perksOutnumberBindings.Value) { int num3 = num2 + 1; num = Mathf.Min(num, num3); } for (int i = 0; i < num; i++) { giveRandomTrinket(inventory, player); } for (int j = 0; j < num2; j++) { giveRandomBinding(player); } } } public static void giveRandomTrinket(Inventory inv, ENT_Player player) { //IL_01e2: Unknown result type (might be due to invalid IL or missing references) List list = (from x in Plugin.enabledTrinkets where x.Value.Value select x.Key).ToList(); Perk perk = list[Random.Range(0, list.Count)]; if (Plugin.trinketAsJustPerk.Value) { player.AddPerk(perk, 1, true); } else { Item_Object val = null; WKAssetDatabase fullCombinedAssetDatabase = CL_AssetManager.GetFullCombinedAssetDatabase(); foreach (GameObject itemPrefab in fullCombinedAssetDatabase.itemPrefabs) { if ((Object)(object)itemPrefab == (Object)null) { continue; } Item_Object component = itemPrefab.GetComponent(); if ((Object)(object)component == (Object)null || component.itemData == null || component.itemData.executionModules == null) { continue; } foreach (ItemExecutionModule executionModule in component.itemData.executionModules) { ItemExecutionModule_PerkAdder val2 = (ItemExecutionModule_PerkAdder)(object)((executionModule is ItemExecutionModule_PerkAdder) ? executionModule : null); if (val2 != null && val2.GetPerks != null && val2.GetPerks.Any((Perk p) => (Object)(object)p != (Object)null && p.id == perk.id)) { val = component; } } } if ((Object)(object)val == (Object)null) { return; } inv.AddItemToInventoryScreen(Vector3.zero, val.itemData.GetClone((Item)null, false), false, false, true); } Plugin.Log.LogInfo((object)("Giving trinket: " + perk.title)); } public static void giveRandomBinding(ENT_Player player) { List list = (from x in Plugin.enabledBindings where x.Value.Value select x.Key).ToList(); Perk val = list[Random.Range(0, list.Count)]; player.AddPerk(val, 1, true); Plugin.Log.LogInfo((object)("Giving trinket: " + val.title)); } } [HarmonyPatch(typeof(UI_GamemodeScreen_Panel), "FillSettings")] public class FillSettings { private static RandomStartGamemode randomizeSetting; private static void Prefix(UI_GamemodeScreen_Panel __instance) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)randomizeSetting == (Object)null) { randomizeSetting = ScriptableObject.CreateInstance(); ((GamemodeSetting)randomizeSetting).id = "RandomStart"; ((GamemodeSetting)randomizeSetting).title = "Random Start"; ((GamemodeSetting)randomizeSetting).description = "Randomizes perks and bindings"; ((GamemodeSetting)randomizeSetting).color = Color.magenta; ((GamemodeSetting)randomizeSetting).exclusiveSettings = new List { "competetive" }; ((GamemodeSetting)randomizeSetting).nameAppend = ""; ((GamemodeSetting)randomizeSetting).leaderboardAppendID = ""; ((GamemodeSetting)randomizeSetting).allowDownstream = false; ((GamemodeSetting)randomizeSetting).downstreamId = ""; ((GamemodeSetting)randomizeSetting).unlock = ScriptableObject.CreateInstance(); ((GamemodeSetting)randomizeSetting).unlock.unlockRequirements = new List(); } if ((Object)(object)randomizeSetting == (Object)null) { throw new Exception("Failed to create Random Start setting"); } M_Gamemode gamemode = __instance.GetGamemode(); if (!((Object)(object)gamemode == (Object)null) && !gamemode.gamemodeSettings.Contains((GamemodeSetting)(object)randomizeSetting)) { gamemode.gamemodeSettings.Add((GamemodeSetting)(object)randomizeSetting); } } } [HarmonyPatch(typeof(UI_TrinketPicker), "PopulateTrinkets")] internal static class RandomStartDisablePickerPatch { private static bool Prefix(UI_TrinketPicker __instance, List trinketsToPopulate, Transform root, bool allowInIronKnuckle) { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown M_Gamemode val = (((Object)(object)__instance.parentPanel != (Object)null) ? __instance.parentPanel.GetGamemode() : CL_GameManager.GetBaseGamemode()); if ((Object)(object)val == (Object)null) { return true; } if (!val.HasActiveSetting("RandomStart")) { return true; } foreach (Transform item in root) { Transform val2 = item; Object.Destroy((Object)(object)((Component)val2).gameObject); } return false; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }