using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("RandomizerTrinket")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("RandomizerTrinket")] [assembly: AssemblyTitle("RandomizerTrinket")] [assembly: AssemblyVersion("1.0.0.0")] namespace RandomizerTrinket; [BepInPlugin("com.yourname.RandomizerTrinket", "Randomizer Trinket", "1.0.0")] public class RandomizerTrinketPlugin : BaseUnityPlugin { public static ConfigEntry PerkIdsConfig; public static ConfigEntry MinPerks; public static ConfigEntry MaxPerks; public static ConfigEntry AllowDuplicatePerks; public static ConfigEntry ReplaceTrinketTitle; public const string TrinketName = "Randomizer"; public static bool trinketReplaced; private void Awake() { //IL_00ad: Unknown result type (might be due to invalid IL or missing references) PerkIdsConfig = ((BaseUnityPlugin)this).Config.Bind("General", "PerkIds", "perk_adrenalinepumps,perk_armoredplating,perk_backstrengtheners,perk_deeppockets,perk_latissimusoptimization,perk_portablebank,perk_regenerativepads,perk_somaticpainkillers,perk_steadiedstance,perk_tissuerestoratives,perk_velocityaugments,perk_heavystrike,perk_ligamentrestructure,perk_metabolicstasis,perk_pheromoneglands,perk_profitmotive,perk_rabbitdna,perk_systemreorganization,perk_elasticlimbs,perk_autotomousskeleton,perk_anomalousbonds,perk_consumptivereflex,perk_musclerelaxants,perk_pulseorgan,perk_adhesiveperspiration,perk_carnalbloodlust,perk_metacarpalrefinement,perk_motherlyinstinct", "English: List of perk IDs separated by commas. Full list available in README.\nРусский: Список ID перков через запятую. Полный список в README."); MinPerks = ((BaseUnityPlugin)this).Config.Bind("General", "MinPerks", 1, "English: Minimum number of perks to give.\nРусский: Минимальное количество выдаваемых перков."); MaxPerks = ((BaseUnityPlugin)this).Config.Bind("General", "MaxPerks", 3, "English: Maximum number of perks to give.\nРусский: Максимальное количество выдаваемых перков."); AllowDuplicatePerks = ((BaseUnityPlugin)this).Config.Bind("General", "AllowDuplicatePerks", false, "English: Allow duplicate perks (if false, all perks will be unique).\nРусский: Разрешать дубликаты (если false, все перки будут уникальны)."); ReplaceTrinketTitle = ((BaseUnityPlugin)this).Config.Bind("General", "ReplaceTrinketTitle", "Head Lamp", "English: Name of the trinket to replace with Randomizer. Must exactly match the displayed name in-game (case-sensitive). See README for list of available names.\nРусский: Название безделушки, которую заменить на Randomizer. Должно точно совпадать с отображаемым названием в игре (с учётом регистра). Список доступных названий см. в README."); new Harmony("com.yourname.RandomizerTrinket").PatchAll(); Debug.Log((object)"RandomizerTrinket mod loaded."); } public static void ApplyRandomPerks() { ENT_Player player = ENT_Player.GetPlayer(); if ((Object)(object)player == (Object)null) { Debug.LogWarning((object)"Player not found, cannot apply perks."); return; } string[] array = (from s in PerkIdsConfig.Value.Split(',') select s.Trim()).ToArray(); if (array.Length == 0) { Debug.LogWarning((object)"No perk IDs specified in config."); return; } int num = Random.Range(MinPerks.Value, MaxPerks.Value + 1); List list = new List(); List list2 = new List(array); for (int num2 = 0; num2 < num; num2++) { if (list2.Count == 0) { break; } int index = Random.Range(0, list2.Count); string item = list2[index]; list.Add(item); if (!AllowDuplicatePerks.Value) { list2.RemoveAt(index); } } foreach (string item2 in list) { Perk perkAsset = CL_AssetManager.GetPerkAsset(item2, ""); if ((Object)(object)perkAsset != (Object)null) { player.AddPerk(perkAsset, 1, true); Debug.Log((object)("Randomizer added perk: " + item2)); } else { Debug.LogWarning((object)("Perk with ID '" + item2 + "' not found.")); } } Debug.Log((object)$"Randomizer applied {list.Count} perks."); } } [HarmonyPatch(typeof(UI_TrinketPicker), "Initialize")] public static class UI_TrinketPicker_Initialize_Patch { private static void Postfix(UI_TrinketPicker __instance) { if (RandomizerTrinketPlugin.trinketReplaced) { return; } try { FieldInfo field = typeof(UI_TrinketPicker).GetField("currentGamemode", BindingFlags.Instance | BindingFlags.NonPublic); if (field == null) { return; } object? value = field.GetValue(__instance); M_Gamemode val = (M_Gamemode)((value is M_Gamemode) ? value : null); if ((Object)(object)val == (Object)null) { return; } FieldInfo field2 = typeof(M_Gamemode).GetField("availableTrinkets", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field2 == null) { return; } object value2 = field2.GetValue(val); if (value2 == null) { return; } FieldInfo field3 = value2.GetType().GetField("trinkets", BindingFlags.Instance | BindingFlags.Public); if (field3 == null || !(field3.GetValue(value2) is List { Count: not 0 } list)) { return; } string value3 = RandomizerTrinketPlugin.ReplaceTrinketTitle.Value; Trinket val2 = null; foreach (Trinket item in list) { if (!item.isBinding && item.title == value3 && item.title != "Randomizer") { val2 = item; break; } } if ((Object)(object)val2 == (Object)null) { Debug.LogWarning((object)("Trinket with title '" + value3 + "' not found or is already Randomizer. No replacement performed.")); return; } val2.title = "Randomizer"; val2.description = "Gives random perks at the start!"; val2.flavorText = "What will you get?"; val2.isBinding = false; val2.cost = 1; val2.itemsToGrant.Clear(); val2.perksToGrant.Clear(); RandomizerTrinketPlugin.trinketReplaced = true; Debug.Log((object)("Randomizer trinket successfully replaced '" + value3 + "'.")); } catch (Exception ex) { Debug.LogError((object)("Error replacing trinket: " + ex.Message + "\n" + ex.StackTrace)); } } } [HarmonyPatch(typeof(Trinket), "Activate")] public static class Trinket_Activate_Patch { private static bool Prefix(Trinket __instance) { if (__instance.title == "Randomizer") { Debug.Log((object)"Activating Randomizer trinket."); RandomizerTrinketPlugin.ApplyRandomPerks(); return false; } return true; } }