The BepInEx console will not appear when launching like it does for other games on Thunderstore (you can turn it back on in your BepInEx.cfg file). If your PEAK crashes on startup, add -dx12 to your launch parameters.
Decompiled source of PEAK Item Randomizer v1.2.1
PEAKItemRandomizer.dll
Decompiled a month agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using HarmonyLib; using Photon.Pun; using UnityEngine; using Zorro.Core; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("PEAKItemRandomizer")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("PEAKItemRandomizer")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("c8b0ed46-e722-431e-9568-849c463bbf32")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace PEAKItemRandomizer; [BepInPlugin("com.peakmod.itemrandomizer", "PEAK Item Randomizer", "1.1.0")] public class PEAKItemRandomizerPlugin : BaseUnityPlugin { private static ManualLogSource Logger; private static Harmony harmony; public static readonly HashSet<string> ExcludedItemNames = new HashSet<string> { "GuidebookPage_0_Intro", "GuidebookPage_1_Mushrooms", "GuidebookPage_2_Campfire", "GuidebookPage_3_Revival", "GuidebookPage_4_BodyHeat Variant", "GuidebookPage_5_Sleepy Variant", "GuidebookPage_6_Awake Variant", "GuidebookPage_7_Crashout Variant", "GuidebookPage_8_FirstTeams" }; private void Awake() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown Logger = Logger.CreateLogSource("PEAK Item Randomizer"); Logger.LogInfo((object)"Plugin com.peakmod.itemrandomizer is loading..."); harmony = new Harmony("com.peakmod.itemrandomizer"); harmony.PatchAll(); Logger.LogInfo((object)"Plugin com.peakmod.itemrandomizer is loaded!"); } private void OnDestroy() { Harmony obj = harmony; if (obj != null) { obj.UnpatchSelf(); } ManualLogSource logger = Logger; if (logger != null) { logger.LogInfo((object)"Plugin com.peakmod.itemrandomizer is unloaded!"); } } } [HarmonyPatch(typeof(LootData), "GetRandomItem")] public static class LootData_GetRandomItem_Patch { private static bool Prefix(SpawnPool spawnPool, ref GameObject __result) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) Logger.CreateLogSource("PEAKItemRandomizer").LogInfo((object)"LootData.GetRandomItem PATCH PREFIX called!"); if (Ascents.canReviveDead && Character.PlayerIsDeadOrDown()) { return true; } Logger.CreateLogSource("PEAKItemRandomizer").LogInfo((object)$"LootData.GetRandomItem PATCHED! Pool: {spawnPool}"); Dictionary<ushort, Item> itemLookup = SingletonAsset<ItemDatabase>.Instance.itemLookup; if (itemLookup == null || itemLookup.Count == 0) { return true; } List<Item> list = new List<Item>(itemLookup.Values); list.RemoveAll((Item item) => PEAKItemRandomizerPlugin.ExcludedItemNames.Contains(((Object)item).name)); if (list.Count == 0) { return true; } Item val = list[Random.Range(0, list.Count)]; __result = ((Component)val).gameObject; return false; } } [HarmonyPatch(typeof(LootData), "GetRandomItems")] public static class LootData_GetRandomItems_Patch { private static bool Prefix(SpawnPool spawnPool, int count, bool canRepeat, ref List<GameObject> __result) { Logger.CreateLogSource("PEAKItemRandomizer").LogInfo((object)"LootData.GetRandomItems PATCH PREFIX called!"); if (Ascents.canReviveDead && Character.PlayerIsDeadOrDown()) { return true; } Dictionary<ushort, Item> itemLookup = SingletonAsset<ItemDatabase>.Instance.itemLookup; if (itemLookup == null || itemLookup.Count == 0) { return true; } List<Item> list = new List<Item>(itemLookup.Values); list.RemoveAll((Item item) => PEAKItemRandomizerPlugin.ExcludedItemNames.Contains(((Object)item).name)); if (list.Count == 0) { __result = new List<GameObject>(); return false; } List<GameObject> list2 = new List<GameObject>(); HashSet<int> hashSet = new HashSet<int>(); for (int i = 0; i < count; i++) { int num; if (canRepeat) { num = Random.Range(0, list.Count); } else { int num2 = 0; do { num = Random.Range(0, list.Count); num2++; } while (hashSet.Contains(num) && hashSet.Count < list.Count && num2 < 100); hashSet.Add(num); } list2.Add(((Component)list[num]).gameObject); } __result = list2; Logger.CreateLogSource("PEAKItemRandomizer").LogInfo((object)$"LootData.GetRandomItems PATCHED! Returned {list2.Count} random items."); return false; } } [HarmonyPatch(typeof(BerryBush), "SpawnItems")] public static class BerryBush_SpawnItems_Patch { private static bool Prefix(BerryBush __instance, List<Transform> spawnSpots, ref List<PhotonView> __result) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0214: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_026e: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) Logger.CreateLogSource("PEAKItemRandomizer").LogInfo((object)"BerryBush.SpawnItems PATCH PREFIX called!"); List<PhotonView> list = new List<PhotonView>(); if (!PhotonNetwork.IsMasterClient) { __result = list; return false; } List<Item> list2 = new List<Item>(); foreach (Transform spawnSpot in spawnSpots) { Collider[] array = Physics.OverlapSphere(spawnSpot.position, 1f); for (int i = 0; i < array.Length; i++) { Item component = ((Component)array[i]).GetComponent<Item>(); if ((Object)(object)component != (Object)null && !list2.Contains(component)) { list2.Add(component); } } } if (list2.Count > 0) { Logger.CreateLogSource("PEAKItemRandomizer").LogInfo((object)$"BerryBush.SpawnItems: Already has {list2.Count} items, skipping spawn."); __result = list; return false; } Dictionary<ushort, Item> itemLookup = SingletonAsset<ItemDatabase>.Instance.itemLookup; if (itemLookup == null || itemLookup.Count == 0) { __result = list; return false; } List<Item> list3 = new List<Item>(itemLookup.Values); list3.RemoveAll((Item item) => PEAKItemRandomizerPlugin.ExcludedItemNames.Contains(((Object)item).name)); if (list3.Count == 0) { __result = list; return false; } List<Transform> list4 = new List<Transform>(spawnSpots); float value = Random.value; value = Mathf.Pow(value, __instance.randomPow); int num = Mathf.RoundToInt(Mathf.Lerp(__instance.possibleBerries.x, __instance.possibleBerries.y, value)); for (int j = 0; j < spawnSpots.Count && j < num; j++) { int index = Random.Range(0, list4.Count); Item val = list3[Random.Range(0, list3.Count)]; if ((Object)(object)val != (Object)null) { Item component2 = PhotonNetwork.InstantiateItemRoom(((Object)((Component)val).gameObject).name, list4[index].position, Quaternion.identity).GetComponent<Item>(); list.Add(((Component)component2).GetComponent<PhotonView>()); if (Object.op_Implicit((Object)(object)((Spawner)__instance).spawnUpTowardsTarget)) { Transform transform = ((Component)component2).transform; Vector3 val2 = ((Spawner)__instance).spawnUpTowardsTarget.position - ((Component)component2).transform.position; transform.up = ((Vector3)(ref val2)).normalized; ((Component)component2).transform.Rotate(Vector3.up, Random.Range(0f, 360f), (Space)1); } if ((Object)(object)component2 != (Object)null) { ((Component)component2).GetComponent<PhotonView>().RPC("SetKinematicRPC", (RpcTarget)3, new object[3] { true, ((Component)component2).transform.position, ((Component)component2).transform.rotation }); } list4.RemoveAt(index); } } __result = list; Logger.CreateLogSource("PEAKItemRandomizer").LogInfo((object)$"BerryBush.SpawnItems PATCHED! Spawned {list.Count} random items."); return false; } } [HarmonyPatch(typeof(Spawner), "SpawnItems")] public static class Spawner_SpawnItems_Patch { private static bool Prefix(Spawner __instance, List<Transform> spawnSpots, ref List<PhotonView> __result) { //IL_0065: Unknown result type (might be due to invalid IL or missing references) Logger.CreateLogSource("PEAKItemRandomizer").LogInfo((object)("Spawner.SpawnItems PATCH PREFIX called! Instance type: " + ((object)__instance).GetType().FullName)); if (((object)__instance).GetType() == typeof(RespawnChest)) { return true; } List<PhotonView> list = new List<PhotonView>(); if (!PhotonNetwork.IsMasterClient) { __result = list; return false; } List<Item> list2 = new List<Item>(); foreach (Transform spawnSpot in spawnSpots) { Collider[] array = Physics.OverlapSphere(spawnSpot.position, 1f); for (int i = 0; i < array.Length; i++) { Item component = ((Component)array[i]).GetComponent<Item>(); if ((Object)(object)component != (Object)null && !list2.Contains(component)) { list2.Add(component); } } } if (list2.Count > 0) { Logger.CreateLogSource("PEAKItemRandomizer").LogInfo((object)$"Spawner.SpawnItems: Already has {list2.Count} items, skipping spawn."); __result = list; return false; } return true; } } [HarmonyPatch(typeof(Luggage), "<OpenLuggageRPC>g__SpawnItemRoutine|14_0")] public static class Luggage_SpawnItemRoutine_Patch { private static bool Prefix(Luggage __instance) { //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) Logger.CreateLogSource("PEAKItemRandomizer").LogInfo((object)"Luggage.<OpenLuggageRPC>g__SpawnItemRoutine|14_0 PATCH PREFIX called!"); if (!PhotonNetwork.IsMasterClient) { return true; } Dictionary<ushort, Item> itemLookup = SingletonAsset<ItemDatabase>.Instance.itemLookup; if (itemLookup == null || itemLookup.Count == 0) { return true; } List<Transform> list = (List<Transform>)typeof(Spawner).GetMethod("GetSpawnSpots", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Invoke(__instance, null); List<Item> list2 = new List<Item>(itemLookup.Values); list2.RemoveAll((Item item) => PEAKItemRandomizerPlugin.ExcludedItemNames.Contains(((Object)item).name)); if (list2.Count == 0) { return true; } foreach (Transform item in list) { Item val = list2[Random.Range(0, list2.Count)]; if ((Object)(object)val != (Object)null) { Item component = PhotonNetwork.InstantiateItemRoom(((Object)((Component)val).gameObject).name, item.position, item.rotation).GetComponent<Item>(); if ((Object)(object)component != (Object)null) { ((Component)component).GetComponent<PhotonView>().RPC("SetKinematicRPC", (RpcTarget)3, new object[3] { true, ((Component)component).transform.position, ((Component)component).transform.rotation }); } } } Logger.CreateLogSource("PEAKItemRandomizer").LogInfo((object)$"Luggage.<OpenLuggageRPC>g__SpawnItemRoutine|14_0 PATCHED! Spawned {list.Count} random items."); return false; } } [HarmonyPatch(typeof(Luggage), "Interact_CastFinished", new Type[] { typeof(Character) })] public static class Luggage_Interact_CastFinished_Patch { private static void Postfix(Luggage __instance, Character interactor) { //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_012e: 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) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) Logger.CreateLogSource("PEAKItemRandomizer").LogInfo((object)("Luggage.Interact_CastFinished PATCH POSTFIX called! Instance type: " + ((object)__instance).GetType().FullName)); if (((object)__instance).GetType() != typeof(RespawnChest) || !PhotonNetwork.IsMasterClient) { return; } Dictionary<ushort, Item> itemLookup = SingletonAsset<ItemDatabase>.Instance.itemLookup; if (itemLookup == null) { return; } Item val = null; foreach (Item value in itemLookup.Values) { if (((Object)value).name.ToLower().Contains("scouteffigy") || ((Object)((Component)value).gameObject).name.ToLower().Contains("scouteffigy")) { val = value; break; } } if ((Object)(object)val == (Object)null) { Logger.CreateLogSource("PEAKItemRandomizer").LogWarning((object)"Scout Effigy item not found!"); return; } Vector3 val2 = ((Component)__instance).transform.position + ((Component)__instance).transform.up * 2f; for (int i = 0; i < 3; i++) { Vector3 val3 = Quaternion.Euler(0f, (float)i * 120f, 0f) * ((Component)__instance).transform.right * 1.5f; Item component = PhotonNetwork.InstantiateItemRoom(((Object)((Component)val).gameObject).name, val2 + val3, Quaternion.identity).GetComponent<Item>(); if ((Object)(object)component != (Object)null) { ((Component)component).GetComponent<PhotonView>().RPC("SetKinematicRPC", (RpcTarget)3, new object[3] { true, ((Component)component).transform.position, ((Component)component).transform.rotation }); } } Logger.CreateLogSource("PEAKItemRandomizer").LogInfo((object)"Spawned 3 Scout Effigy items at Ancient Statue!"); } } [HarmonyPatch(typeof(Campfire), "Light_Rpc")] public static class Campfire_LightRpc_Patch { private static void Postfix(Campfire __instance) { //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) if (!PhotonNetwork.IsMasterClient) { return; } Dictionary<ushort, Item> itemLookup = SingletonAsset<ItemDatabase>.Instance.itemLookup; if (itemLookup == null) { return; } Item val = null; foreach (Item value in itemLookup.Values) { if (((Object)value).name.ToLower().Contains("scouteffigy") || ((Object)((Component)value).gameObject).name.ToLower().Contains("scouteffigy")) { val = value; break; } } if ((Object)(object)val == (Object)null) { Logger.CreateLogSource("PEAKItemRandomizer").LogWarning((object)"Scout Effigy item not found!"); return; } int num = 3; float num2 = 1f; for (int i = 0; i < num; i++) { float num3 = 360f / (float)num * (float)i; Vector3 val2 = Quaternion.Euler(0f, num3, 0f) * ((Component)__instance).transform.right * num2; Vector3 val3 = ((Component)__instance).transform.position + val2; Item component = PhotonNetwork.InstantiateItemRoom(((Object)((Component)val).gameObject).name, val3, Quaternion.identity).GetComponent<Item>(); if ((Object)(object)component != (Object)null) { ((Component)component).GetComponent<PhotonView>().RPC("SetKinematicRPC", (RpcTarget)3, new object[3] { true, ((Component)component).transform.position, ((Component)component).transform.rotation }); } } Logger.CreateLogSource("PEAKItemRandomizer").LogInfo((object)$"Spawned {num} Scout Effigy at Campfire!"); } } public static class PluginInfo { public const string PLUGIN_GUID = "com.peakmod.itemrandomizer"; public const string PLUGIN_NAME = "PEAK Item Randomizer"; public const string PLUGIN_VERSION = "1.1.0"; }