using System;
using System.Collections.Generic;
using System.Diagnostics;
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;
using UnityEngine.SceneManagement;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.1", FrameworkDisplayName = ".NET Framework 4.7.1")]
[assembly: AssemblyCompany("WhiteKnuckleRandomizer")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("White Knuckle Randomizer")]
[assembly: AssemblyTitle("WhiteKnuckleRandomizer")]
[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 WhiteKnuckleRandomizer
{
public class ExcludeFromSwap : MonoBehaviour
{
}
[BepInPlugin("whiteknucklerandomizermod", "White Knuckle Randomizer", "1.0.5")]
public class Plugin : BaseUnityPlugin
{
[HarmonyPatch(typeof(UI_GamemodeScreen_Panel), "FillSettings")]
private static class InjectSetting
{
private static RandomizeSetting gamemodeSetting;
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)gamemodeSetting == (Object)null)
{
gamemodeSetting = ScriptableObject.CreateInstance<RandomizeSetting>();
((GamemodeSetting)gamemodeSetting).id = "rndm";
((GamemodeSetting)gamemodeSetting).title = "Randomizer";
((GamemodeSetting)gamemodeSetting).description = "Randomizes items and denizens";
((GamemodeSetting)gamemodeSetting).color = Color.blue;
((GamemodeSetting)gamemodeSetting).exclusiveSettings = new List<string>();
((GamemodeSetting)gamemodeSetting).nameAppend = "";
((GamemodeSetting)gamemodeSetting).leaderboardAppendID = "";
((GamemodeSetting)gamemodeSetting).allowDownstream = false;
((GamemodeSetting)gamemodeSetting).downstreamId = "";
((GamemodeSetting)gamemodeSetting).unlock = ScriptableObject.CreateInstance<ProgressionUnlock>();
((GamemodeSetting)gamemodeSetting).unlock.unlockRequirements = new List<UnlockRequirement>();
}
if ((Object)(object)gamemodeSetting == (Object)null)
{
throw new Exception("We fucked up");
}
if (!__instance.GetGamemode().gamemodeSettings.Contains((GamemodeSetting)(object)gamemodeSetting))
{
__instance.GetGamemode().gamemodeSettings.Add((GamemodeSetting)(object)gamemodeSetting);
}
}
}
[HarmonyPatch(typeof(CL_GameManager), "Start")]
private static class GameStart
{
[HarmonyPostfix]
private static void Postfix()
{
if (Initialized)
{
if (StatManager.saveData.IsSettingActive(CL_GameManager.GetCurrentGamemode().gamemodeName, "rndm"))
{
Randomize = true;
}
else
{
Randomize = false;
}
Logger.LogMessage((object)("Randomization is " + (Randomize ? "On" : "Off")));
return;
}
try
{
prefabs = new List<GameObject>();
prefabs.AddRange(CL_AssetManager.baseDatabase.denizenPrefabs);
prefabs.AddRange(CL_AssetManager.baseDatabase.itemPrefabs);
foreach (Trinket trinketAsset in CL_AssetManager.baseDatabase.trinketAssets)
{
foreach (Item_Object item in trinketAsset.itemsToGrant)
{
((Component)item).gameObject.AddComponent<ExcludeFromSwap>();
}
}
if (removeMass.Value && !evilMode.Value)
{
List<GameObject> list = new List<GameObject>();
for (int i = 0; i < prefabs.Count; i++)
{
if (!((Object)prefabs[i]).name.Contains("Denizen_Hunter") || !((Object)prefabs[i]).name.Contains("Denizen_Face"))
{
list.Add(prefabs[i]);
}
}
prefabs = list;
}
else if (evilMode.Value)
{
GameObject val = null;
for (int j = 0; j < prefabs.Count; j++)
{
if (((Object)prefabs[j]).name.Contains("Hunter"))
{
val = prefabs[j];
}
}
if ((Object)(object)val == (Object)null)
{
Logger.LogWarning((object)"Couldnt find Hunter Denizen");
evilMode.Value = false;
Initialized = true;
return;
}
prefabs = new List<GameObject> { val, val, val };
}
Initialized = true;
}
catch (Exception ex)
{
Logger.LogFatal((object)ex);
}
}
}
[HarmonyPatch(typeof(HandItem_Food), "Initialize")]
private static class EatenItemFixer
{
[HarmonyPostfix]
private static void Postfix(HandItem_Food __instance)
{
((Component)__instance.usedObject).gameObject.AddComponent<ExcludeFromSwap>();
}
}
[HarmonyPatch(typeof(Item_Object), "Start")]
private static class ItemReplacer
{
[HarmonyPrefix]
private static bool Prepatch(Item_Object __instance)
{
return ReplacerLogic((MonoBehaviour)(object)__instance, isDenizen: false);
}
}
[HarmonyPatch(typeof(UI_TrinketPicker), "SelectTrinket")]
private static class check
{
private static void Postfix()
{
Logger.LogInfo((object)(StatManager.saveData.GetGamemodeTrinkets(CL_GameManager.GetGamemodeName(true, false)).Capacity + " Trinkets found"));
foreach (string gamemodeTrinket in StatManager.saveData.GetGamemodeTrinkets(CL_GameManager.GetGamemodeName(true, false)))
{
Logger.LogInfo((object)gamemodeTrinket);
}
}
}
[HarmonyPatch(typeof(UI_GamemodeScreen), "LoadGamemode")]
private static class check2
{
private static void Postfix(UI_GamemodeScreen __instance)
{
Logger.LogInfo((object)("Loading gamemode " + __instance.GetGamemode().gamemodeName));
foreach (string gamemodeTrinket in StatManager.saveData.GetGamemodeTrinkets(CL_GameManager.GetGamemodeName(true, false)))
{
Logger.LogInfo((object)gamemodeTrinket);
}
}
}
[HarmonyPatch(typeof(SaveData), "LoadDataIntoPlayer")]
private static class PreventInventoryItemChange
{
[HarmonyPostfix]
private static void Postfix(ref ENT_Player player, bool loadInventory = true)
{
if (loadInventory)
{
object? value = typeof(ENT_Player).GetField("inventory", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(player);
Inventory val = (Inventory)((value is Inventory) ? value : null);
Item_Object[] componentsInChildren = ((Component)val.itemRoot).GetComponentsInChildren<Item_Object>();
for (int i = 0; i < componentsInChildren.Length; i++)
{
((Component)componentsInChildren[i]).gameObject.AddComponent<ExcludeFromSwap>();
}
}
}
}
[HarmonyPatch(typeof(Denizen), "Start")]
private static class DenizenReplacer
{
[HarmonyPrefix]
private static bool Prepatch(Denizen __instance)
{
return ReplacerLogic((MonoBehaviour)(object)__instance, isDenizen: true);
}
}
internal static ManualLogSource Logger;
public static bool Randomize;
public static ConfigEntry<bool> limitMass;
public static ConfigEntry<bool> removeMass;
public static ConfigEntry<bool> rareTrinkets;
public static ConfigEntry<bool> evilMode;
public static List<GameObject> prefabs;
public static bool Initialized;
protected static Harmony harmony;
private static bool awoken;
private void SetupConfig()
{
limitMass = ((BaseUnityPlugin)this).Config.Bind<bool>("Random Spawning", "Limit mass spawns", true, "Limits mass replacements to abyss and beyond.");
removeMass = ((BaseUnityPlugin)this).Config.Bind<bool>("Random Spawning", "Remove all mass replacements", false, "Removes mass from the random denizen pool.");
rareTrinkets = ((BaseUnityPlugin)this).Config.Bind<bool>("Random Spawning", "Make trinkets rare", true, "Make trinkets and artifacts spawn less. This should balance the early game a bit more.");
evilMode = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Easy Mode", false, "");
}
private void Awake()
{
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: Expected O, but got Unknown
if (!awoken)
{
SetupConfig();
Logger = ((BaseUnityPlugin)this).Logger;
Logger.LogInfo((object)"Plugin whiteknucklerandomizermod is loaded!");
harmony = new Harmony("whiteknucklerandomizermod");
harmony.PatchAll(Assembly.GetExecutingAssembly());
Object.DontDestroyOnLoad((Object)(object)this);
awoken = true;
}
}
private void OnDestroy()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
Scene val = ((Component)this).gameObject.scene;
if (((Scene)(ref val)).isLoaded)
{
val = SceneManager.GetActiveScene();
Plugin plugin = ((Scene)(ref val)).GetRootGameObjects()[0].AddComponent<Plugin>();
if ((Object)(object)plugin == (Object)null)
{
Logger.LogFatal((object)"Plugin is being Destroyed");
harmony.UnpatchSelf();
}
}
}
private static GameObject EnsureNoRareItem()
{
GameObject val = null;
for (int i = 0; i < 300; i++)
{
val = prefabs[Random.Range(0, prefabs.Count)];
Component[] components = val.GetComponents(typeof(HandItem));
Item_Object component = val.gameObject.GetComponent<Item_Object>();
if ((Object)(object)component != (Object)null)
{
if (((Object)val).name.Contains("Trinket"))
{
continue;
}
bool flag = false;
for (int j = 0; j < component.itemData.executionModules.Count; j++)
{
if (((object)component.itemData.executionModules[j]).GetType() == typeof(ItemExecutionModule_PerkAdder))
{
flag = true;
}
}
if (flag)
{
continue;
}
Component[] array = components;
foreach (Component val2 in array)
{
Type type = ((object)val2).GetType();
if (!(type == typeof(HandItem_Rewind)) && !(type == typeof(HandItem_Glove)) && !(type == typeof(HandItem_Melee_Rapier)) && !(type == typeof(HandItem_BlinkEye)) && !(type == typeof(HandItem_GrapplingHook)))
{
return val;
}
}
continue;
}
return val;
}
if ((Object)(object)val == (Object)null)
{
Logger.LogFatal((object)"Somehow no valid object found");
return prefabs[Random.Range(0, prefabs.Count)];
}
return val;
}
private static bool ReplacerLogic(MonoBehaviour __instance, bool isDenizen)
{
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_03f4: Unknown result type (might be due to invalid IL or missing references)
//IL_03d9: Unknown result type (might be due to invalid IL or missing references)
try
{
if ((Object)(object)((Component)__instance).GetComponent<ExcludeFromSwap>() != (Object)null)
{
return true;
}
if (!Randomize)
{
return true;
}
if (__instance is Item_Object && !isDenizen && (Object)(object)((Item_Object)__instance).itemData.inventory != (Object)null)
{
return true;
}
if (((Object)__instance).name.Contains("Denizen_Hunter") || ((Object)__instance).name.Contains("Denizen_Face") || ((Object)__instance).name.Contains("Mother"))
{
((Component)__instance).gameObject.AddComponent<ExcludeFromSwap>();
return true;
}
GameObject val = Object.Instantiate<GameObject>(prefabs[Random.Range(0, prefabs.Count)]);
if (rareTrinkets.Value)
{
HandItem component = val.GetComponent<HandItem>();
bool flag = false;
Item_Object component2 = val.gameObject.GetComponent<Item_Object>();
if ((Object)(object)component2 != (Object)null)
{
if (((Object)val).name.Contains("Trinket"))
{
if (Random.Range(0, 10) <= 9)
{
Object.Destroy((Object)(object)val);
val = EnsureNoRareItem();
}
flag = true;
}
if (!flag)
{
for (int i = 0; i < component2.itemData.executionModules.Count; i++)
{
if (((object)component2.itemData.executionModules[i]).GetType() == typeof(ItemExecutionModule_PerkAdder))
{
if (Random.Range(0, 10) <= 9)
{
Object.Destroy((Object)(object)val);
val = EnsureNoRareItem();
}
flag = true;
break;
}
}
}
if (!flag && (Object)(object)component != (Object)null)
{
Type type = ((object)component).GetType();
if ((type == typeof(HandItem_Rewind) || type == typeof(HandItem_Glove) || type == typeof(HandItem_Melee_Rapier) || type == typeof(HandItem_BlinkEye) || type == typeof(HandItem_GrapplingHook)) && Random.Range(0, 10) <= 9)
{
Object.Destroy((Object)(object)val);
val = EnsureNoRareItem();
}
}
}
}
if ((((Object)val).name.Contains("Denizen_Hunter") || ((Object)val).name.Contains("Denizen_Face")) && !CL_EventManager.currentRegion.regionName.Contains("abyss") && !CL_EventManager.currentRegion.regionName.Contains("nest") && limitMass.Value && !evilMode.Value)
{
bool flag2 = false;
Object.Destroy((Object)(object)val);
val = Object.Instantiate<GameObject>(prefabs[Random.Range(0, prefabs.Count)]);
while (!flag2)
{
if (((Object)val).name.Contains("Denizen_Hunter") || ((Object)val).name.Contains("Denizen_Face"))
{
Object.Destroy((Object)(object)val);
val = Object.Instantiate<GameObject>(prefabs[Random.Range(0, prefabs.Count)]);
continue;
}
flag2 = true;
break;
}
}
val.AddComponent<ExcludeFromSwap>();
if ((Object)(object)val.GetComponent<Denizen>() != (Object)null)
{
Denizen component3 = val.GetComponent<Denizen>();
((GameEntity)component3).Teleport(((Component)__instance).transform.position);
}
else
{
val.transform.position = ((Component)__instance).transform.position;
}
((Object)val).name = ((Object)__instance).name;
val.transform.parent = ((Component)__instance).transform.parent;
Object.Destroy((Object)(object)((Component)__instance).gameObject);
return false;
}
catch (Exception ex)
{
Logger.LogError((object)ex);
Logger.LogError((object)ex.Source);
return true;
}
}
}
public class PluginInfo
{
public const string PLUGIN_GUID = "whiteknucklerandomizermod";
public const string PLUGIN_NAME = "White Knuckle Randomizer";
public const string PLUGIN_VERSION = "1.0.5";
}
public class RandomizeSetting : GamemodeSetting
{
public RandomizeSetting()
{
//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 = "rndm";
base.title = "Randomizer";
base.description = "Randomizes items and denizens";
base.color = Color.blue;
base.exclusiveSettings = new List<string>(1) { "competetive" };
base.nameAppend = "";
base.leaderboardAppendID = "";
base.allowDownstream = false;
base.downstreamId = "";
}
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "WhiteKnuckleRandomizer";
public const string PLUGIN_NAME = "White Knuckle Randomizer";
public const string PLUGIN_VERSION = "1.0.0";
}
}