using 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";
}